diff options
| author | Michal Idziorek <m.i@gmx.at> | 2014-08-29 15:20:17 +0200 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2014-08-29 15:20:17 +0200 |
| commit | 659f1f1ae057c82a154a1fd32cc9dca040979daa (patch) | |
| tree | 41afd3afb1b3e29ea6bf8445e1a7b284e7043368 /boot/check_a20_16.asm | |
| parent | 1cb4a8a202023958589d563ad132d701e27c008a (diff) | |
experimenting with a20 gate
Diffstat (limited to 'boot/check_a20_16.asm')
| -rw-r--r-- | boot/check_a20_16.asm | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/boot/check_a20_16.asm b/boot/check_a20_16.asm new file mode 100644 index 0000000..43da6e3 --- /dev/null +++ b/boot/check_a20_16.asm @@ -0,0 +1,61 @@ +; The following code is public domain licensed + +[bits 16] + +; Function: check_a20 +; +; Purpose: to check the status of the a20 line in a completely self-contained state-preserving way. +; The function can be modified as necessary by removing push's at the beginning and their +; respective pop's at the end if complete self-containment is not required. +; +; Returns: 0 in ax if the a20 line is disabled (memory wraps around) +; 1 in ax if the a20 line is enabled (memory does not wrap around) + +check_a20: + pushf + push ds + push es + push di + push si + + cli + + xor ax, ax ; ax = 0 + mov es, ax + + not ax ; ax = 0xFFFF + mov ds, ax + + mov di, 0x0500 + mov si, 0x0510 + + mov al, byte [es:di] + push ax + + mov al, byte [ds:si] + push ax + + mov byte [es:di], 0x00 + mov byte [ds:si], 0xFF + + cmp byte [es:di], 0xFF + + pop ax + mov byte [ds:si], al + + pop ax + mov byte [es:di], al + + mov ax, 0 + je check_a20__exit + + mov ax, 1 + +check_a20__exit: + pop si + pop di + pop es + pop ds + popf + + ret |
