OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_010 / chnos / asmhead.nas
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_010/chnos/asmhead.nas b/CHNOSProject/chnos/tolset_chn_000/chnos_010/chnos/asmhead.nas
new file mode 100644 (file)
index 0000000..edb5417
--- /dev/null
@@ -0,0 +1,489 @@
+\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