+++ /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