--- /dev/null
+[FORMAT "WCOFF"]\r
+[INSTRSET "i486p"]\r
+[BITS 32]\r
+[FILE "nasfunc0.nas"]\r
+ GLOBAL _IO_HLT\r
+ GLOBAL _IO_CLI, _IO_STI, _IO_STIHLT\r
+ GLOBAL _IO_In8, _IO_Out8\r
+ GLOBAL _IO_In16, _IO_Out16\r
+ GLOBAL _IO_In32, _IO_Out32\r
+ GLOBAL _IO_Load_EFlags, _IO_Store_EFlags\r
+ GLOBAL _Load_CR0, _Store_CR0\r
+ GLOBAL _Load_CR2, _Store_CR2\r
+ GLOBAL _Load_CR3, _Store_CR3\r
+ GLOBAL _Load_CR4, _Store_CR4\r
+ GLOBAL _Load_DR0, _Store_DR0\r
+ GLOBAL _Load_DR1, _Store_DR1\r
+ GLOBAL _Load_DR2, _Store_DR2\r
+ GLOBAL _Load_DR3, _Store_DR3\r
+ GLOBAL _Load_DR6, _Store_DR6\r
+ GLOBAL _Load_DR7, _Store_DR7\r
+ GLOBAL _Load_GDTR\r
+ GLOBAL _Load_IDTR\r
+ GLOBAL _Load_TR\r
+ GLOBAL _FarJMP\r
+ GLOBAL _FarCall\r
+ GLOBAL _CLTS\r
+ GLOBAL _FNSave, _FRStore\r
+ GLOBAL _PIT_Beep_On, _PIT_Beep_Off, _PIT_Beep_Set\r
+ GLOBAL _CPUID, _CPUID2\r
+ GLOBAL _TSC_Read\r
+ GLOBAL _Memory_Test_Sub\r
+ GLOBAL _INT_3\r
+ GLOBAL _DIV_64_32, _MOD_64_32\r
+ GLOBAL _MOVSD_ZeroFill\r
+\r
+[SECTION .text]\r
+\r
+_IO_HLT:\r
+ hlt\r
+ ret\r
+\r
+_IO_CLI:\r
+ cli\r
+ ret\r
+\r
+_IO_STI:\r
+ sti\r
+ ret\r
+\r
+_IO_STIHLT:\r
+ sti\r
+ hlt\r
+ ret\r
+\r
+_IO_In8:\r
+ mov edx,[esp+4]\r
+ mov eax,0\r
+ in al,dx\r
+ ret\r
+\r
+_IO_Out8:\r
+ mov edx,[esp+4]\r
+ mov al,[esp+8]\r
+ out dx,al\r
+ ret\r
+\r
+_IO_In16:\r
+ mov edx,[esp+4]\r
+ mov eax,0\r
+ in ax,dx\r
+ ret\r
+\r
+_IO_Out16:\r
+ mov edx,[esp+4]\r
+ mov ax,[esp+8]\r
+ out dx,ax\r
+ ret\r
+\r
+_IO_In32:\r
+ mov edx,[esp+4]\r
+ in eax,dx\r
+ ret\r
+\r
+_IO_Out32:\r
+ mov edx,[esp+4]\r
+ mov eax,[esp+8]\r
+ out dx,eax\r
+ ret\r
+\r
+_IO_Load_EFlags:\r
+ pushfd\r
+ pop eax\r
+ ret\r
+\r
+_IO_Store_EFlags:\r
+ mov eax,[esp+4]\r
+ push eax\r
+ popfd\r
+ ret\r
+\r
+_Load_CR0:\r
+ mov eax,cr0\r
+ ret\r
+\r
+_Store_CR0:\r
+ mov eax,[esp+4]\r
+ mov cr0,eax\r
+ ret\r
+\r
+_Load_CR2:\r
+ mov eax,cr2\r
+ ret\r
+\r
+_Store_CR2:\r
+ mov eax,[esp+4]\r
+ mov cr2,eax\r
+ ret\r
+\r
+_Load_CR3:\r
+ mov eax,cr3\r
+ ret\r
+\r
+_Store_CR3:\r
+ mov eax,[esp+4]\r
+ mov cr3,eax\r
+ ret\r
+\r
+_Load_CR4:\r
+ mov eax,cr3\r
+ ret\r
+\r
+_Store_CR4:\r
+ mov eax,[esp+4]\r
+ mov cr4,eax\r
+ ret\r
+\r
+_Load_DR0:\r
+ mov eax,dr0\r
+ ret\r
+\r
+_Store_DR0:\r
+ mov eax,[esp+4]\r
+ mov dr0,eax\r
+ ret\r
+\r
+_Load_DR1:\r
+ mov eax,dr1\r
+ ret\r
+\r
+_Store_DR1:\r
+ mov eax,[esp+4]\r
+ mov dr1,eax\r
+ ret\r
+\r
+_Load_DR2:\r
+ mov eax,dr2\r
+ ret\r
+\r
+_Store_DR2:\r
+ mov eax,[esp+4]\r
+ mov dr2,eax\r
+ ret\r
+\r
+_Load_DR3:\r
+ mov eax,dr3\r
+ ret\r
+\r
+_Store_DR3:\r
+ mov eax,[esp+4]\r
+ mov dr3,eax\r
+ ret\r
+\r
+_Load_DR6:\r
+ mov eax,dr6\r
+ ret\r
+\r
+_Store_DR6:\r
+ mov eax,[esp+4]\r
+ mov dr6,eax\r
+ ret\r
+\r
+_Load_DR7:\r
+ mov eax,dr7\r
+ ret\r
+\r
+_Store_DR7:\r
+ mov eax,[esp+4]\r
+ mov dr7,eax\r
+ ret\r
+\r
+_Load_GDTR:\r
+ mov ax,[esp+4]\r
+ mov [esp+6],ax\r
+ lgdt [esp+6]\r
+ ret\r
+\r
+_Load_IDTR:\r
+ mov ax,[esp+4]\r
+ mov [esp+6],ax\r
+ lidt [esp+6]\r
+ ret\r
+\r
+_Load_TR:\r
+ ltr [esp+4]\r
+ ret\r
+\r
+_FarJMP:\r
+ jmp far [esp+4]\r
+ ret\r
+\r
+_FarCall:\r
+ call far [esp+4]\r
+ ret\r
+\r
+_CLTS:\r
+ clts\r
+ ret\r
+\r
+_FNSave:\r
+ mov eax,[esp+4] ; addr\r
+ fnsave [eax]\r
+ ret\r
+\r
+_FRStore:\r
+ mov eax,[esp+4] ; addr\r
+ frstor [eax]\r
+ ret\r
+\r
+_PIT_Beep_On:\r
+ in al,0x61\r
+ or al,0x03\r
+ and al,0x0f\r
+ out 0x61,al\r
+ ret\r
+\r
+_PIT_Beep_Off:\r
+ in al,0x61\r
+ and al,0xd\r
+ out 0x61,al\r
+ ret\r
+\r
+_PIT_Beep_Set:\r
+ mov eax,1193180\r
+ mov edx,0x00000000\r
+ mov ecx,[esp+4]\r
+ div ecx\r
+ mov edx,eax\r
+ mov al,0xb6\r
+ out 0x43,al\r
+ mov eax,edx\r
+ out 0x42,al\r
+ shr eax,8\r
+ out 0x42,al\r
+ ret\r
+\r
+_CPUID:\r
+ pushad\r
+ mov esi,[esp+36]\r
+ mov eax,[esp+40]\r
+ db 0x0f,0xa2\r
+ mov [esi ],eax\r
+ mov [esi+ 4],ebx\r
+ mov [esi+ 8],edx\r
+ mov [esi+12],ecx\r
+ popad\r
+ ret\r
+\r
+_CPUID2:\r
+ pushad\r
+ mov esi,[esp+36]\r
+ mov eax,[esp+40]\r
+ db 0x0f,0xa2\r
+ mov [esi ],eax\r
+ mov [esi+ 4],ebx\r
+ mov [esi+ 8],ecx\r
+ mov [esi+12],edx\r
+ popad\r
+ ret\r
+\r
+_TSC_Read:\r
+ pushad\r
+ mov ebx,[esp+36]\r
+ db 0x0f,0x31\r
+ mov [ebx],edx\r
+ mov [ebx+4],eax\r
+ popad\r
+ ret\r
+\r
+_Memory_Test_Sub:\r
+ push edi\r
+ push esi\r
+ push ebx\r
+ mov esi,0xaa55aa55\r
+ mov edi,0x55aa55aa\r
+ mov eax,[esp+12+4]\r
+mts_loop:\r
+ mov ebx,eax\r
+ add ebx,0xffc\r
+ mov edx,[ebx]\r
+ mov [ebx],esi\r
+ xor dword [ebx],0xffffffff\r
+ cmp edi,[ebx]\r
+ jne mts_fin\r
+ xor dword [ebx],0xffffffff\r
+ cmp esi,[ebx]\r
+ jne mts_fin\r
+ mov [ebx],edx\r
+ add eax,0x1000\r
+ cmp eax,[esp+12+8]\r
+ jbe mts_loop\r
+ pop ebx\r
+ pop esi\r
+ pop edi\r
+ ret\r
+mts_fin:\r
+ mov [ebx],edx\r
+ pop ebx\r
+ pop esi\r
+ pop edi\r
+ ret\r
+\r
+_INT_3:\r
+ int 3\r
+ ret\r
+\r
+_DIV_64_32:\r
+ mov eax,[esp+4]\r
+ mov edx,[esp+8]\r
+ div dword[esp+12]\r
+ ret\r
+\r
+_MOD_64_32:\r
+ mov eax,[esp+4]\r
+ mov edx,[esp+8]\r
+ div dword[esp+12]\r
+ mov eax,edx\r
+ ret\r
+\r
+_MOVSD_ZeroFill:\r
+ cld\r
+ push esi\r
+ push edi\r
+ mov ax, ds\r
+ mov es, ax\r
+ mov eax, 0x00000000\r
+ mov edi, [esp+8+4]\r
+ mov ecx, [esp+8+8]\r
+ shr ecx, 2\r
+ rep stosd\r
+ pop edi\r
+ pop esi\r
+ ret\r
+\r