僅限 Turbo C / Borland C++ / DOSBox 環境。現代開發請用 SDL2, SFML, OpenGL, Cairo。
void bar(int left, int top, int right, int bottom);
// 繪製並填充矩形,使用當前填充模式 setfillstyle
void bar3d(int left, int top, int right, int bottom, int depth, int topflag);
// 3D 效果:depth 立體深度,topflag=1 繪製頂面
// 範例:繪製不同填充模式的 3D 長條圖
直接呼叫 INT 21h 等中斷。現代保護模式 OS (Linux/Windows) **不可用**。
int bdos(int dosfun, unsigned dosdx, unsigned dosal);
// dosfun: 功能號 (AH), dosdx: DX, dosal: AL
// 返回 AX
int bdosptr(int dosfun, void *arg, unsigned dosal);
// arg 指向結構體 (DX:SI 或 DS:DX)
// 範例:獲取當前磁碟機 (功能 0x19)
char cur_drive() { return 'A' + bdos(0x19, 0, 0); }
// 範例:改變目錄 (功能 0x3B)
bdosptr(0x3B, "C:\\PATH", 0);
直接操作硬體端口/中斷 (INT 10h 顯示, 13h 磁碟, 14h 序列埠, 16h 鍵盤, 17h 並列埠)。**極度依賴硬體/實模式**,現代 OS 禁止用戶態直接訪問。
int bioscom(int cmd, char byte, int port);
// cmd: 0=初始化(設置波特率/校驗/停止位), 1=發送字元, 2=接收字元, 3=狀態
// port: 0=COM1, 1=COM2...
// byte: 初始化時為參數組合 (波特率|校驗|停止位|數據位)
// 返回: 狀態字 (位域: 逾時, 發送暫存器空, 幀錯誤, 奇偶錯誤, 過載, 數據就緒...)
// 範例:簡易終端機程式
int biosdisk(int cmd, int drive, int head, int track, int sector, int nsects, void *buf);
// cmd: 0=復位, 1=狀態, 2=讀扇區, 3=寫扇區, 4=驗證, 5=格式化磁道...
// drive: 0=A:, 1=B:, 0x80=C: (硬碟), 0x81=D:...
// head, track, sector: CHS 定址 (傳統 BIOS)
// 返回: 狀態碼 (0=成功, 1=錯誤命令, 2=地址標記未找到, 4=記錄未找到, 0x20=控制器失效, 0x40=尋道失敗, 0x80=逾時, 0xBB=未定義, 0xFF=失敗)
// 現代系統請用檔案系統 API (fread/fwrite, ReadFile/WriteFile)
int biosequip(void);
// 返回位域編碼設備資訊:
// Bit 15-14: 印表機數, Bit 12: Game I/O, Bit 11-9: RS232 數
// Bit 7-6: 軟碟機數 (00=1, 01=2, 10=3, 11=4)
// Bit 5: 初始化, Bit 4-3: 顯示模式 (00=無, 01=40x25 CGA, 10=80x25 CGA, 11=80x25 MDA)
// Bit 2: 數學協處理器, Bit 1-0: 記憶體大小 (00=16K, 01=32K, 10=48K, 11=64K) ... 早期 PC 限制
int bioskey(int cmd);
// cmd=0: 讀按鍵 (阻塞)。返回: 低位 ASCII, 高位 掃描碼。擴展鍵低位=0。
// cmd=1: 檢查鍵盤緩衝區。返回 0=無鍵, 非0=有鍵 (不取出)。
// cmd=2: 返回移位鍵狀態位域。
// Bit 7: Insert, 6: CapsLock, 5: NumLock, 4: ScrollLock, 3: Alt, 2: Ctrl, 1: Left Shift, 0: Right Shift
int biosmemory(void);
// 返回常規記憶體大小 (KB),最大 640K (實模式限制)
int biosprint(int cmd, int byte, int port);
// cmd: 0=列印字元, 1=初始化, 2=狀態
// port: 0=LPT1, 1=LPT2...
// 返回狀態位: 0=逾時, 3=I/O錯誤, 4=選中, 5=缺紙, 6=確認, 7=不忙碌
long biostime(int cmd, long newtime);
// cmd=0: 讀取滴答計數 (自午夜 0:00,約 18.2 Hz)
// cmd=1: 設置計數器
// CLK_TCK 常數定義每秒滴答數
int brk(void *endds); // 設定資料段結束地址
void *sbrk(intptr_t incr); // 增加/減少資料段 (malloc 底層實現)
// 現代系統 malloc 使用 mmap/VirtualAlloc,brk/sbrk 僅用於小塊分配器
void *bsearch(const void *key, const void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
// 前提:base 必須**已排序** (升序)
// 比較函數返回 <0, 0, >0
// 返回找到元素指針 / NULL
// 範例:有序陣列查找整數
| 舊函數 (B開頭) | 所屬庫/環境 | 現代替代方案 |
|---|---|---|
| `bar`, `bar3d` | BGI (`graphics.h`) | SDL2 `SDL_RenderFillRect`, Cairo, OpenGL, Qt, GTK |
| `bdos`, `bdosptr` | DOS (`dos.h`) | POSIX `open/read/write/ioctl`, Win32 `CreateFile/DeviceIoControl` |
| `bioscom` | BIOS (`bios.h`) | POSIX `termios` (tcsetattr/read/write), Win32 `CreateFile/SetCommState` |
| `biosdisk` | BIOS (`bios.h`) | 檔案系統 API (`fread/fwrite`), 原始裝置 `open("/dev/sda", ...)` (需 root) |
| `biosequip` | BIOS | `sysconf`, `getconf`, `/proc/cpuinfo`, WMI, `GetSystemInfo` |
| `bioskey` | BIOS | 終端 `termios`/`ncurses`, 圖形庫事件循環, Win32 `GetAsyncKeyState`/`RawInput` |
| `biosmemory` | BIOS | `sysconf(_SC_PHYS_PAGES)`, `GlobalMemoryStatusEx`, `/proc/meminfo` |
| `biosprint` | BIOS | CUPS/打印系統 API, Win32 `StartDoc/WritePrinter` |
| `biostime` | BIOS | `time()`, `clock_gettime()`, `QueryPerformanceCounter` |
| `brk`/`sbrk` | Unix `unistd.h` | `malloc`/`free` (應用層), `mmap`/`VirtualAlloc` (分配器開發) |
| `bsearch` | C 標準庫 `stdlib.h` | **仍在廣泛使用** (有序陣列 O(log n) 查找),C++ `std::binary_search` |