diff --git a/doc/bda.txt b/doc/bda.txt new file mode 100644 index 0000000..da7adcb --- /dev/null +++ b/doc/bda.txt @@ -0,0 +1,83 @@ +The actual layout of the BDA is specific to the actual BIOS firmware running. +This lists is focused on what a developer can reasonably rely on. + +0000 256 Interrupt vectors +0300 256 bytes used as stack during POST +0400 word: COM1 base I/O port +0402 word: COM2 +0404 word: COM3 +0406 word: COM4 +0408 word: LPT1 base I/O port +040A word: LPT2 +040C word: LPT3 +040E word: segment addr of the EBDA (rarely LPT4) +0410 byte: equipment list flags (INT 11h, AL) + bit 0: IPL diskette installed + bit 1: math coprocessor present + bits 4-5: default VDU mode + bits 6-7: number of floppies minus one, 0 if none +0411 byte: equipment list flags (INT 11h, AH) + bit 0: dma controller present + bits 1-3: number of serial ports + bit 4: game adapter present + bit 6-7: number of printer ports +0413 word: memory size in kilobytes (INT 12h, AX) +0417 byte: key toggle states + bit 0: right shift + bit 1: left shift + bit 2: ctrl + bit 3: alt + bit 4: scroll lock + bit 5: num lock + bit 6: caps lock + but 7: insert +0418 byte: key pressed state (1 if currently held down) + bit 0: left ctrl key + bit 1: left alt key + bit 2: system key + bit 3: suspend key + bit 4: scroll lock + bit 5: num lock + bit 6: caps lock + bit 7: insert +0419 byte: when typing a character by pressing the alt key and typing its code + into the numpad, this byte holds the current numeric value +041A word: offset into the key ringbuffer, reading end +041B word: offset into the key ringbuffer, writing end +041E 16 words: key ringbuffer, holds place for 16 keypresses +043E byte: drive restore flag +043F byte: drive motor flag +0440 byte: drive motor timeout counter in 1/18th seconds +0441 byte: status of last disk operation +0442 7 bytes: status buffer for FDC +0449 byte: current VDU mode +044A byte: number of visible display columns +044C word: VDU display buffer size +044E word: offset of current VDU page in buffer +0450 8 words: 8 cursor positions for each VDU page (MSB=row, LSB=column) +0460 byte: bottom scan line for cursor (dont write) +0461 byte: top scan line for cursor (dont write) +0462 byte: active display page number +0463 word: VDU I/O address +0465 byte: VDU mode control register +0466 byte: VDU color select register +0467 dword CS:IP for 80286 return from protected mode +046C dword: time of the day in 1/18th second ticks +0470 byte: rollover flag if above surpassed 24h (FFh = rollover) +0471 byte: bit 7 is set on ctrl+numlock to indicate break condition +0472 word: soft reset flag (set and JMP 0xFFFF:0) + 1234: bypas memory tests and VDU setup + 4321: preserve memory + 5678: system suspend + 9ABC: POST loop (on IBM convertible) +0474 dword: reserved for hard disk bios +0478 byte: LPT1 timeout in half seconds +0479 byte: LPT2 +047A byte: LPT3 +047C byte: COM1 timeout in half seconds +0480 word: key ringbuffer start (from 0x400) +0482 word: key ringbuffer +0500 byte: status of INT 5: print screen + 00: no screen print in progress + 01: in progress + FF: printer failure