--- /dev/null
+\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