clear bss and move on
[com32] / src / loader.asm
index 4cdb702..ea0de70 100644 (file)
@@ -238,6 +238,13 @@ detect_memory:
        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
@@ -249,9 +256,10 @@ detect_memory:
 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:
@@ -387,6 +395,32 @@ detect_mem_88:
 .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