summaryrefslogtreecommitdiff
path: root/boot/check_a20_16.asm
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-08-29 15:20:17 +0200
committerMichal Idziorek <m.i@gmx.at>2014-08-29 15:20:17 +0200
commit659f1f1ae057c82a154a1fd32cc9dca040979daa (patch)
tree41afd3afb1b3e29ea6bf8445e1a7b284e7043368 /boot/check_a20_16.asm
parent1cb4a8a202023958589d563ad132d701e27c008a (diff)
experimenting with a20 gate
Diffstat (limited to 'boot/check_a20_16.asm')
-rw-r--r--boot/check_a20_16.asm61
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