mov esi, str_fail
call printstr
+ mov esi, memdet_cmos_msg
+ call printstr
+ call detect_mem_cmos
+ jnc .done
+ mov esi, str_fail
+ call printstr
+
mov si, memdet_fail_msg
call printstr
jmp exit
str_ok db 'OK',10,0
str_fail db 'failed',10,0
memdet_fail_msg db 'Failed to detect available memory!',10,0
-memdet_e820_msg db "Detecting RAM (BIOS 15h/0xe820)... ",0
-memdet_e801_msg db "Detecting RAM (BIOS 15h/0xe801)... ",0
-memdet_88_msg db "Detecting RAM (BIOS 15h/0x88, max 64mb)... ",0
+memdet_e820_msg db 'Detecting RAM (BIOS 15h/0xe820)... ',0
+memdet_e801_msg db 'Detecting RAM (BIOS 15h/0xe801)... ',0
+memdet_88_msg db 'Detecting RAM (BIOS 15h/0x88, max 64mb)... ',0
+memdet_cmos_msg db 'Detecting RAM (CMOS)...',0
; detect extended memory using BIOS call 15h/e820
detect_mem_e820:
.fail: stc
ret
+detect_mem_cmos:
+ mov al, 31h
+ out 70h, al
+ in al, 71h
+ mov ah, al
+ mov al, 30h
+ out 70h, al
+ in al, 71h
+
+ test ax, ax
+ jz .fail
+
+ ; ax has size in KB, convert to bytes in eax
+ and eax, 0xffff
+ shl eax, 10
+
+ mov esi, mem_map
+ mov dword [si], 100000h
+ mov [si + 4], eax
+ mov dword [mem_map_size], 1
+ clc
+ ret
+.fail: stc
+ ret
+
+
align 4
mem_map_size dd 0
mem_map times 128 db 0