--- /dev/null
+\r
+[INSTRSET "i486p"]\r
+BOTPAK equ 0x00280000\r
+DSKCAC equ 0x00100000\r
+DSKCAC0 equ 0x00008000\r
+\r
+; BOOT_INFO_ADDR\r
+CYLS equ 0x0ff0 ; uchar\r
+LEDS equ 0x0ff1 ; uchar\r
+VMODE equ 0x0ff2 ; uchar\r
+ ; uchar Padding\r
+SCRNX equ 0x0ff4 ; ushort\r
+SCRNY equ 0x0ff6 ; ushort\r
+VRAM equ 0x0ff8 ; uchar*\r
+VESAVER equ 0x0ffc ; ushort\r
+APMVER equ 0x0ffe ; ushort\r
+ACPI_MEMMAPS equ 0x1000 ; uint\r
+ACPI_MEMMAP equ 0x1004 ; 0x18(24)*16=0x180(384)bytes\r
+APM_FLAGS equ 0x1184 ; ushort\r
+\r
+; INFO_ADDR\r
+ADR_VESA_BIOS_INFO equ 0x0d00 ;0x0d00-0x0dff\r
+ADR_VESA_MODE_INFO equ 0x0e00 ;0x0e00-0x0eff\r
+\r
+XRESOLUTION equ 0x12\r
+YRESOLUTION equ 0x14\r
+BITSPERPIXEL equ 0x19\r
+PHYSBASEPTR equ 0x28\r
+\r
+[BITS 16]\r
+\r
+ org 0xc200\r
+asmhead:\r
+ mov ax, 0\r
+ mov ss, ax\r
+ mov sp, 0xc200\r
+ mov ds, ax\r
+ mov es, ax\r
+\r
+ mov ah, 0x00\r
+ mov al, 0x03\r
+ int 0x10\r
+\r
+ lea di, [msg000]\r
+ call text_putstr\r
+\r
+ call a20_try_loop\r
+\r
+ call chk_acpi_memmap\r
+\r
+ call chk_apm\r
+\r
+ call chk_keyled\r
+\r
+ call pmode\r
+\r
+halt_loop:\r
+ hlt\r
+ jmp halt_loop\r
+\r
+; \83T\83u\83\8b\81[\83`\83\93\r
+\r
+chk_acpi_memmap:\r
+ pushad\r
+ mov edi, ACPI_MEMMAP\r
+ mov ebx, 0\r
+chk_acpi_memmap_loop:\r
+ mov eax, 0xe820\r
+ mov ecx, 24\r
+ mov edx, 0x534d4150 ; edx="SMAP"\r
+ int 0x15\r
+ jc chk_acpi_memmap_err\r
+ add edi, 24\r
+ or ebx, ebx\r
+ jnz chk_acpi_memmap_loop\r
+ sub edi, ACPI_MEMMAP\r
+ mov eax, edi\r
+ xor edx, edx\r
+ mov ecx, 24\r
+ div ecx\r
+ mov [ACPI_MEMMAPS], eax\r
+ lea di, [msg017]\r
+ call text_putstr\r
+ call text_newline\r
+ jmp chk_acpi_memmap_end\r
+\r
+chk_acpi_memmap_err:\r
+ lea di, [msg016]\r
+ call text_putstr\r
+ call text_newline\r
+ mov dword [ACPI_MEMMAPS], 0\r
+\r
+chk_acpi_memmap_end:\r
+ popad\r
+ ret\r
+\r
+chk_keyled:\r
+ mov ah, 0x02\r
+ int 0x16\r
+ mov [LEDS], al\r
+ ret\r
+\r
+A20_TEST_LOOPS equ 32\r
+A20_ENABLE_LOOPS equ 255\r
+A20_TEST_ADDR equ 4*0x80\r
+\r
+\r
+a20_try_loop:\r
+a20_none:\r
+ call a20_test\r
+ jnz a20_done\r
+a20_bios:\r
+ mov ax, 0x2401\r
+ pushfd\r
+ int 0x15\r
+ popfd\r
+ call a20_test\r
+ jnz a20_done\r
+a20_kbc:\r
+ call empty_8042\r
+ call a20_test\r
+ jnz a20_done\r
+ mov al, 0xD1\r
+ out 0x64, al\r
+ call empty_8042\r
+ mov al, 0xDF\r
+ out 0x60, al\r
+ call empty_8042\r
+a20_kbc_wait:\r
+ xor cx, cx\r
+a20_kbc_wait_loop:\r
+ call a20_test\r
+ jnz a20_done\r
+ loop a20_kbc_wait_loop\r
+a20_fast:\r
+ in al, 0x92\r
+ or al, 0x02\r
+\r
+ and al, 0xFE\r
+ out 0x92, al\r
+a20_fast_wait:\r
+ xor cx, cx\r
+a20_fast_wait_loop:\r
+ call a20_test\r
+ jnz a20_done\r
+ loop a20_fast_wait_loop\r
+ dec byte [a20_tries]\r
+ jnz a20_try_loop\r
+a20_die:\r
+ lea di, [msg014]\r
+ call text_putstr\r
+ jmp halt_loop\r
+\r
+a20_tries:\r
+ db A20_ENABLE_LOOPS\r
+\r
+a20_done:\r
+ lea di, [msg015]\r
+ call text_putstr\r
+ ret\r
+\r
+a20_test:\r
+ push cx\r
+ push ax\r
+ xor cx, cx\r
+ mov fs, cx\r
+ dec cx\r
+ mov gs, cx\r
+ mov cx, A20_TEST_LOOPS\r
+ mov ax, word [fs:A20_TEST_ADDR]\r
+ push ax\r
+a20_test_wait:\r
+ inc ax\r
+ mov word [fs:A20_TEST_ADDR], ax\r
+ call delay\r
+ cmp ax, word [gs:A20_TEST_ADDR + 0x10]\r
+ loop a20_test_wait\r
+\r
+ pop word [fs:A20_TEST_ADDR]\r
+ pop ax\r
+ pop cx\r
+ ret\r
+\r
+empty_8042:\r
+ push ecx\r
+ mov ecx, 100000\r
+\r
+empty_8042_loop:\r
+ dec ecx\r
+ jz empty_8042_end_loop\r
+\r
+ call delay\r
+\r
+ in al, 0x64\r
+ test al, 1 \r
+ jz no_output\r
+\r
+ call delay\r
+; in al, 0x60\r
+\r
+ jmp empty_8042_loop\r
+\r
+no_output:\r
+ test al, 2\r
+ jnz empty_8042_loop\r
+\r
+empty_8042_end_loop:\r
+ pop ecx\r
+ ret\r
+\r
+delay:\r
+ out 0x80, al\r
+ ret\r
+\r
+chk_apm:\r
+ pusha\r
+ lea di, [msg006]\r
+ call text_putstr\r
+ lea di, [msg002]\r
+ call text_putstr\r
+ mov ax, 0x5300\r
+ mov bx, 0x0000\r
+ pusha\r
+ int 0x15\r
+ jc chk_apm_err_nosup\r
+ mov [APMVER], ax\r
+ mov [APM_FLAGS], cx\r
+ popa\r
+\r
+ lea di, [msg004]\r
+ call text_putstr\r
+ mov ax, [APMVER]\r
+ shr ax, 8\r
+ call text_puthex_char\r
+ mov al, '.'\r
+ mov ah, 0x0e\r
+ int 0x10\r
+ mov ax, [APMVER]\r
+ shr ax, 4\r
+ call text_puthex_char\r
+ mov ax, [APMVER]\r
+ call text_puthex_char\r
+ jmp chk_apm_end\r
+\r
+chk_apm_err_nosup:\r
+ mov word [APMVER], 0x0000\r
+ mov word [APM_FLAGS], 0x0000\r
+ popa\r
+ lea di, [msg006]\r
+ call text_putstr\r
+ lea di, [msg003]\r
+ call text_putstr\r
+chk_apm_end:\r
+ popa\r
+ ret\r
+\r
+hex2bcd_16: ;ax\82ðBCD\82É\95Ï\8a·\81B\8dÅ\91å9999\82Ü\82Å\81Bcx\82É\90Vax\82ð\95Û\91¶\r
+ push cx\r
+ push bx\r
+ push dx\r
+ and eax, 0x0000ffff\r
+ mov cx, 0x000000\r
+\r
+ mov dx, 0x0000\r
+ mov bx, 1000\r
+ div bx\r
+ shl ax, 12\r
+ or cx, ax\r
+\r
+ mov ax, dx\r
+ mov dx, 0x0000\r
+ mov bx, 100\r
+ div bx\r
+ shl ax, 8\r
+ or cx, ax\r
+\r
+ mov ax, dx\r
+ mov dx, 0x0000\r
+ mov bx, 10\r
+ div bx\r
+ shl ax, 4\r
+ or cx, ax\r
+\r
+ or cx, dx\r
+\r
+ mov ax, cx\r
+\r
+ pop dx\r
+ pop bx\r
+ pop cx\r
+ ret\r
+\r
+text_puthex_str_16: ; ax\82ð\8fo\97Í\81B0x\82Ì\95t\89Á\82 \82è\81B\r
+ push ax\r
+ push cx\r
+ mov cx, ax\r
+ mov ah, 0x0e\r
+ mov al, '0'\r
+ int 0x10\r
+ mov al, 'x'\r
+ int 0x10\r
+ mov ax, cx\r
+ shr ax, 12\r
+ call text_puthex_char\r
+ mov ax, cx\r
+ shr ax, 8\r
+ call text_puthex_char\r
+ mov ax, cx\r
+ shr ax, 4\r
+ call text_puthex_char\r
+ mov ax, cx\r
+ call text_puthex_char\r
+ pop cx\r
+ pop ax\r
+ ret\r
+\r
+text_puthex_str_16_no_0x: ; ax\82ð\8fo\97Í\81B0x\82Ì\95t\89Á\82È\82µ\81BBCD\95\\8e¦\97p\r
+ push ax\r
+ push cx\r
+ mov cx, ax\r
+ shr ax, 12\r
+ call text_puthex_char\r
+ mov ax, cx\r
+ shr ax, 8\r
+ call text_puthex_char\r
+ mov ax, cx\r
+ shr ax, 4\r
+ call text_puthex_char\r
+ mov ax, cx\r
+ call text_puthex_char\r
+ pop cx\r
+ pop ax\r
+ ret\r
+\r
+text_puthex_str_08_no_0x: ; al\82ð\8fo\97Í\81B0x\82Ì\95t\89Á\82È\82µ\81BBCD\95\\8e¦\97p\r
+ push ax\r
+ push cx\r
+ mov cx, ax\r
+ shr al, 4\r
+ call text_puthex_char\r
+ mov ax, cx\r
+ call text_puthex_char\r
+ pop cx\r
+ pop ax\r
+ ret\r
+\r
+text_puthex_char: ; al\82Ì\89º\88Ê4bit\95ª\8fo\97Í\81B0x\82Ì\95t\89Á\82Í\82È\82µ\81B\r
+ pusha\r
+ and al, 0x0f\r
+ cmp al, 9\r
+ ja text_puthex_char_alphabet\r
+ add al, 0x30\r
+ jmp text_puthex_char_end\r
+text_puthex_char_alphabet:\r
+ add al, 0x37\r
+text_puthex_char_end:\r
+ mov ah, 0x0e\r
+ int 0x10\r
+ popa\r
+ ret\r
+\r
+text_putstr: ; di=char*\r
+ pusha\r
+ mov cx, 0\r
+ mov ah, 0x0e\r
+text_putstr_loop:\r
+ mov al, [es:di]\r
+ cmp al, 0\r
+ je text_putstr_end\r
+ inc di\r
+ int 0x10\r
+ jmp text_putstr_loop\r
+text_putstr_end:\r
+ popa\r
+ ret\r
+\r
+text_newline:\r
+ pusha\r
+ mov ah, 0x0e\r
+ mov al, 0x0d\r
+ int 0x10\r
+ mov al, 0x0a\r
+ int 0x10\r
+ popa\r
+ ret\r
+\r
+; \88È\89º\81A\83v\83\8d\83e\83N\83g\83\82\81[\83h\88Ú\8ds\81Abootpack\8eÀ\8ds\8aÖ\90\94\8cQ\r
+\r
+pmode:\r
+ mov al, 0xff\r
+ out 0x21, al ; pic0-imr = 11111111\r
+ nop\r
+ out 0xa1, al ; pic1-imr = 11111111\r
+ cli\r
+\r
+ lgdt [GDTR0]\r
+\r
+ mov eax, cr0\r
+ and eax, 0x7fffffff ; PG = 0\r
+ or eax, 0x00000001 ; PE = 1\r
+ mov cr0, eax\r
+\r
+ jmp pipelineflush\r
+pipelineflush:\r
+\r
+ mov ax, 1 * 8\r
+ mov ds, ax\r
+ mov es, ax\r
+ mov fs, ax\r
+ mov gs, ax\r
+ mov ss, ax\r
+\r
+ mov esi, bootpack\r
+ mov edi, BOTPAK\r
+ mov ecx, 512 * 1024 / 4\r
+ call memcpy\r
+\r
+ mov esi, 0x7c00\r
+ mov edi, DSKCAC\r
+ mov ecx, 512 / 4\r
+ call memcpy\r
+\r
+ mov esi, DSKCAC0 + 512\r
+ mov edi, DSKCAC + 512\r
+ mov ecx, 0\r
+ mov cl, byte[CYLS]\r
+ imul ecx, 512 * 18 * 2 / 4\r
+ sub ecx, 512 / 4\r
+ call memcpy\r
+\r
+ mov ebx, BOTPAK\r
+ mov ecx, [ebx + 16]\r
+ add ecx, 3\r
+ shr ecx, 2\r
+ jz skip\r
+ mov esi, [ebx + 20]\r
+ add esi, ebx\r
+ mov edi, [ebx + 12]\r
+ call memcpy\r
+\r
+skip:\r
+ mov esp, [ebx + 12]\r
+ jmp dword 2 * 8:0x0000001b\r
+\r
+memcpy:\r
+ mov eax,[esi]\r
+ add esi,4\r
+ mov [edi],eax\r
+ add edi,4\r
+ sub ecx,1\r
+ jnz memcpy\r
+ ret\r
+\r
+; \83f\81[\83^\r
+\r
+msg000: db "Welcome to CHNOS Project.", 0x0d, 0x0a, 0x00\r
+msg001: db "VESA BIOS Extention ", 0x00\r
+msg002: db "Checking...", 0x0d, 0x0a, 0x00\r
+msg003: db "is not supported by this computer.", 0x0d, 0x0a, 0x00\r
+msg004: db "Version:", 0x00\r
+msg005: db "Video Mode Numbers...", 0x0d, 0x0a, 0x00\r
+msg006: db "Advanced Power Management BIOS ", 0x00\r
+msg007: db "Please select the Video Mode Number.", 0x0d, 0x0a, 0x00\r
+msg008: db "VGA mode is 0x0000.", 0x0d, 0x0a, 0x00\r
+msg009: db ">0x", 0x00\r
+msg010: db "ModeInfo:", 0x00\r
+msg011: db "Function Error...", 0x0d, 0x0a, 0x00\r
+msg012: db "bpp:", 0x00\r
+msg013: db "Do you want to start in this screen mode?[Y/N]", 0x0d, 0x0a, ">", 0x00\r
+msg014: db "A20GateLine Failed.", 0x0d, 0x0a, 0x00\r
+msg015: db "A20GateLine Passed.", 0x0d, 0x0a, 0x00\r
+msg016: db "ACPI 0xe820 Failed.", 0x0d, 0x0a, 0x00\r
+msg017: db "ACPI 0xe820 Passed.", 0x0d, 0x0a, 0x00\r
+\r
+GDTR0:\r
+ dw 8 * 3 - 1 ; GDT\83\8a\83~\83b\83g = 8 * \83Z\83\8c\83N\83^\90\94 - 1\r
+ dd GDT0 ; GDT\8aJ\8en\83A\83h\83\8c\83X\r
+\r
+ alignb 16\r
+\r
+GDT0: ; \89¼GDT\r
+ resb 8 ; \83k\83\8b\81E\83Z\83\8c\83N\83^\81[\r
+ dw 0xffff, 0x0000, 0x9200, 0x00cf ; \93Ç\82Ý\8f\91\82«\89Â\94\32\83r\83b\83g\r
+ dw 0xffff, 0x0000, 0x9a28, 0x0047 ; \8eÀ\8ds\89Â\94\32\83r\83b\83g\r
+ dw 0\r
+\r
+ alignb 16\r
+\r
+bootpack:\r