OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_008 / chnos / asmhead.nas
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_008/chnos/asmhead.nas b/CHNOSProject/chnos/tolset_chn_000/chnos_008/chnos/asmhead.nas
new file mode 100644 (file)
index 0000000..6483b9b
--- /dev/null
@@ -0,0 +1,649 @@
+\r
+[INSTRSET "i486p"]\r
+VBEMODE equ             0x0115  ;0x0115\r
+;Graphic Modes\r
+;0x0100                640x400         256\r
+;0x0101                640x480         256\r
+;0x0102                800x600         16\r
+;0x0103                800x600         256\r
+;0x0104                1024x768        16\r
+;0x0105                1024x768        256\r
+;0x0106                1280x1024       16\r
+;0x0107                1280x1024       256\r
+;0x010D                320x200         32768           (1:5:5:5)\r
+;0x010E                320x200         65536           (0:5:6:5)\r
+;0x010F                320x200         16777216        (8:8:8:8)\r
+;0x0110                640x480         32768           (1:5:5:5)\r
+;0x0111                640x480         65536           (0:5:6:5)\r
+;0x0112                640x480         16777216        (8:8:8:8)\r
+;0x0113                800x600         32768           (1:5:5:5)\r
+;0x0114                800x600         65536           (0:5:6:5)\r
+;0x0115                800x600         16777216        (8:8:8:8)\r
+;0x0116                1024x768        32768           (1:5:5:5)\r
+;0x0117                1024x768        65536           (0:5:6:5)\r
+;0x0118                1024x768        16777216        (8:8:8:8)\r
+;0x0119                1280x1024       32768           (1:5:5:5)\r
+;0x011A                1280x1024       65536           (0:5:6:5) \r
+;0x011B                1280x1024       16777216        (8:8:8:8) \r
+\r
+\r
+BOTPAK  equ             0x00280000\r
+DSKCAC  equ             0x00100000\r
+DSKCAC0 equ             0x00008000\r
+\r
+; BOOT_INFO\r
+CYLS    equ             0x0ff0\r
+LEDS    equ             0x0ff1\r
+VMODE   equ             0x0ff2\r
+SCRNX   equ             0x0ff4\r
+SCRNY   equ             0x0ff6\r
+VRAM    equ             0x0ff8\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
+        call    backc\r
+\r
+        lea     esi, [msg001]\r
+        mov     edi, 0\r
+        call    printf\r
+\r
+        call    a20_try_loop\r
+\r
+        lea     esi, [msg002]\r
+        mov     edi, 80*2\r
+        call    printf\r
+\r
+        call    vbecheck\r
+        call    keyled\r
+        call    pmode\r
+\r
+\r
+;\83T\83u\83\8b\81[\83`\83\93\r
+\r
+halthalt:\r
+        lea     esi, [msg005]\r
+        mov     ax, 0xB800\r
+        mov     es, ax\r
+        mov     edi, 80*2*2*2*2\r
+        call    printf\r
+        call    entkeywait\r
+        call    shutdown\r
+\r
+printf:\r
+        push    eax\r
+        mov     ax, 0xB800\r
+        mov     es, ax\r
+printf_loop:\r
+        mov     al, byte [esi]\r
+        mov     byte [es:edi], al\r
+        or      al, al\r
+        jz      printf_end\r
+        inc     edi\r
+        mov     byte [es:edi], 0x03\r
+        inc     esi\r
+        inc     edi\r
+        jmp     printf_loop\r
+printf_end:\r
+        pop     eax\r
+        ret\r
+\r
+backc:\r
+        mov     ax,0xb800\r
+        mov     es,ax\r
+        mov     di,0\r
+        mov     ax,word[backcc]\r
+        mov     cx,0x7ff\r
+\r
+paint:\r
+        mov     word[es:di],ax\r
+        add     di,2\r
+        dec     cx\r
+        jnz     paint\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
+\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
+\r
+a20_die:\r
+        lea     esi, [msg003]    \r
+        mov     edi, 80*2          \r
+        call    printf\r
+        jmp     halthalt\r
+\r
+a20_tries:\r
+        db      A20_ENABLE_LOOPS\r
+\r
+a20_done:\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
+        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
+getc:\r
+        mov     ah,0x00\r
+        int     0x16\r
+        ret\r
+\r
+vbecheck:\r
+        lea     esi, [msg007]\r
+        mov     edi, 80*2*3             \r
+        call    printf\r
+\r
+        lea     esi, [msg008]\r
+        mov     edi, 80*2*4\r
+        call    printf\r
+\r
+        lea     esi, [msg009]\r
+        mov     edi, 80*2*5\r
+        call    printf\r
+\r
+        lea     esi, [msg010]\r
+        mov     edi, 80*2*6\r
+        call    printf\r
+\r
+        lea     esi, [msg011]\r
+        mov     edi, 80*2*7\r
+        call    printf\r
+\r
+        lea     esi, [msg012]\r
+        mov     edi, 80*2*8\r
+        call    printf\r
+\r
+        call    getc\r
+\r
+        cmp     ah,0x01\r
+        je      vbe00\r
+\r
+        cmp     ah,0x02\r
+        je      vbe01\r
+        cmp     ah,0x03\r
+        je      vbe02\r
+        cmp     ah,0x04\r
+        je      vbe03\r
+        cmp     ah,0x05\r
+        je      vbe04\r
+        cmp     ah,0x06\r
+        je      vbe05\r
+        cmp     ah,0x07\r
+        je      vbe06\r
+        cmp     ah,0x08\r
+        je      vbe07\r
+        cmp     ah,0x09\r
+        je      vbe08\r
+        cmp     ah,0x0a\r
+        je      vbe09\r
+\r
+        cmp     ah,0x1e\r
+        je      vbe0a\r
+        cmp     ah,0x30\r
+        je      vbe0b\r
+        cmp     ah,0x2e\r
+        je      vbe0c\r
+        cmp     ah,0x20\r
+        je      vbe0d\r
+        cmp     ah,0x12\r
+        je      vbe0e\r
+        cmp     ah,0x21\r
+        je      vbe0f\r
+        cmp     ah,0x22\r
+        je      vbe0g\r
+        cmp     ah,0x23\r
+        je      vbe0h\r
+        cmp     ah,0x17\r
+        je      vbe0i\r
+\r
+        cmp     ah,0x2d\r
+        je      vbetext\r
+\r
+        jmp     vbecheck\r
+\r
+vbe00:\r
+        mov     al,0x13\r
+        mov     ah,0x00\r
+        int     0x10\r
+        mov     ax,0xe0\r
+        mov     es,ax\r
+        mov     di,0\r
+        mov     word[es:di+0x12],320\r
+        mov     word[es:di+0x14],200\r
+        mov     byte[es:di+0x19],8\r
+        mov     dword[es:di+0x28],0x000a0000\r
+        mov     byte[VMODE],8\r
+        mov     word[SCRNX],320\r
+        mov     word[SCRNY],200\r
+        mov     dword[VRAM],0x000a0000\r
+        ret\r
+\r
+vbe01:\r
+        mov     word[videomode],0x010f\r
+        jmp     vbesub\r
+vbe02:\r
+        mov     word[videomode],0x0112\r
+        jmp     vbesub\r
+vbe03:\r
+        mov     word[videomode],0x0115\r
+        jmp     vbesub\r
+vbe04:\r
+        mov     word[videomode],0x0118\r
+        jmp     vbesub\r
+vbe05:\r
+        mov     word[videomode],0x011b\r
+        jmp     vbesub\r
+vbe06:\r
+        mov     word[videomode],0x011f\r
+        jmp     vbesub\r
+vbe07:\r
+        mov     word[videomode],0x010e\r
+        jmp     vbesub\r
+vbe08:\r
+        mov     word[videomode],0x0111\r
+        jmp     vbesub\r
+vbe09:\r
+        mov     word[videomode],0x0114\r
+        jmp     vbesub\r
+vbe0a:\r
+        mov     word[videomode],0x0117\r
+        jmp     vbesub\r
+vbe0b:\r
+        mov     word[videomode],0x011a\r
+        jmp     vbesub\r
+vbe0c:\r
+        mov     word[videomode],0x011e\r
+        jmp     vbesub\r
+vbe0d:\r
+        mov     word[videomode],0x0100\r
+        jmp     vbesub\r
+vbe0e:\r
+        mov     word[videomode],0x0101\r
+        jmp     vbesub\r
+vbe0f:\r
+        mov     word[videomode],0x0103\r
+        jmp     vbesub\r
+vbe0g:\r
+        mov     word[videomode],0x0105\r
+        jmp     vbesub\r
+vbe0h:\r
+        mov     word[videomode],0x0107\r
+        jmp     vbesub\r
+vbe0i:\r
+        mov     word[videomode],0x011c\r
+        jmp     vbesub\r
+\r
+vbesub:\r
+        mov     ax,0xe0\r
+        mov     es,ax\r
+        mov     di,0\r
+        mov     cx,[videomode]\r
+        mov     ax,0x4f01\r
+        int     0x10\r
+\r
+        mov     ax,0x9000\r
+        mov     es,ax\r
+        mov     di,0\r
+        mov     ax,0x4f00\r
+        int     0x10\r
+        cmp     ax,0x004f\r
+        jne     scrn320\r
+        mov     ax,[es:di+4]\r
+        cmp     ax,0x0200\r
+        jb      scrn320\r
+        mov     cx,[videomode]\r
+        mov     ax,0x4f01\r
+        int     0x10\r
+        cmp     ax,0x004f\r
+        jne     scrn320\r
+\r
+        mov     bx,[videomode]\r
+        add     bx,0x4000\r
+        mov     ax,0x4f02\r
+        int     0x10\r
+        mov     byte[VMODE],16\r
+        mov     ax,[es:di+0x12]\r
+        mov     [SCRNX],ax\r
+        mov     ax,[es:di+0x14]\r
+        mov     [SCRNY],ax\r
+        mov     eax,[es:di+0x28]\r
+        mov     [VRAM],eax\r
+        ret\r
+\r
+vbetext:\r
+        mov     byte[VMODE],0\r
+        mov     word[SCRNX],80\r
+        mov     word[SCRNY],25\r
+        mov     dword[VRAM],0xb8000\r
+        ret\r
+\r
+scrn320:\r
+\r
+        lea     esi, [msg004]            \r
+        mov     edi, 80*2*2*2       \r
+        call    printf\r
+       call    entkeywait\r
+        jmp     vbecheck\r
+\r
+keyled:\r
+        mov     ah,0x02\r
+        int     0x16\r
+        mov     [LEDS],al\r
+        ret\r
+\r
+pmode:\r
+        mov     al,0xff\r
+        out     0x21,al\r
+        nop\r
+        out     0xa1,al\r
+        cli\r
+\r
+        lgdt    [GDTR0]\r
+        mov     eax,cr0\r
+        and     eax,0x7fffffff\r
+        or      eax,0x00000001\r
+        mov     cr0,eax\r
+        jmp     pipelineflush\r
+pipelineflush:\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
+        mov     esi,bootpack    \r
+        mov     edi,BOTPAK      \r
+        mov     ecx,512*1024/4\r
+        call    memcpy\r
+        mov     esi,0x7c00\r
+        mov     edi,DSKCAC\r
+        mov     ecx,512/4\r
+\r
+        call    memcpy\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
+skip:\r
+        mov     esp,[ebx+12]\r
+        jmp     dword 2*8:0x0000001b\r
+\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
+entkeywait:\r
+        mov     ah,0\r
+        int     0x16\r
+        cmp     ah,0x1c\r
+        jne     entkeywait\r
+        ret\r
+\r
+shutdown:\r
+        mov     ax,0x5300\r
+        mov     bx,0\r
+        int     0x15\r
+        jc      thend\r
+        mov     ax,0x5301\r
+        mov     bx,0\r
+        int     0x15\r
+        mov     ax,0x530e\r
+        mov     bx,0\r
+        mov     cx,0x0101\r
+        int     0x15\r
+        jc      thend\r
+        mov     ax,0x530f\r
+        mov     bx,0x0001\r
+        mov     cx,0x0001\r
+        int     0x15\r
+        jc      thend\r
+        mov     ax,0x5308\r
+        mov     bx,0x0001\r
+        mov     cx,0x0001\r
+        int     0x15\r
+        jc      thend\r
+        mov     ax,0x5307\r
+        mov     bx,0x0001\r
+        mov     cx,0x0003\r
+        int     0x15\r
+        hlt\r
+\r
+thend:\r
+        lea     esi, [msg006]\r
+        mov     ax, 0xB800\r
+        mov     es, ax\r
+        mov     edi, 80*2*2*2*2\r
+        call    printf\r
+thend2:\r
+        hlt\r
+        jmp     thend2\r
+\r
+;data\r
+\r
+msg001: db      "Welcome to chnos project .",0\r
+msg002: db      "A20GATE on .",0\r
+msg003: db      "A20GATE filed .",0\r
+msg004: db      "Video mode is not supported or invalid.",0\r
+msg005: db      "Press the Enter key to shut down ...",0\r
+msg006: db      "Sorry . Shutdown filed . Press power button .",0\r
+msg007: db      "Video Mode List. Please select the mode number.",0\r
+msg008: db      "32bit--1:320x200--2:640x480--3:800x600--4:1024x768--5:1280x1024--6:1600x1200",0\r
+msg009: db      "16bit--7:320x200--8:640x480--9:800x600--a:1024x768--b:1280x1024--c:1600x1200",0\r
+msg010: db      " 8bit--d:640x400--e:640x480--f:800x600--g:1024x768--h:1280x1024--i:1600x1200",0\r
+msg011: db      "Press ESC to start in VGA mode.",0\r
+msg012: db      "Press X to start in TEXT mode.",0\r
+backcc: db      ".",0x03\r
+\r
+videomode:      dw 0\r
+\r
+                alignb  16\r
+GDT0:\r
+                resb    8                               ; \83k\83\8b\83Z\83\8c\83N\83^\r
+                dw              0xffff,0x0000,0x9200,0x00cf     ; \93Ç\82Ý\8f\91\82«\89Â\94\\83Z\83O\83\81\83\93\83g32bit\r
+                dw              0xffff,0x0000,0x9a28,0x0047     ; \8eÀ\8ds\89Â\94\\83Z\83O\83\81\83\93\83g32bit\81ibootpack\97p\81j\r
+\r
+                dw              0\r
+GDTR0:\r
+                dw              8*3-1\r
+                dd              GDT0\r
+\r
+                alignb  16\r
+bootpack:\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r