--- /dev/null
+[FORMAT "WCOFF"]\r
+[INSTRSET "i486p"]\r
+[BITS 32]\r
+[FILE "naskfunc.nas"]\r
+\r
+ GLOBAL _io_hlt, _io_cli, _io_sti, _io_stihlt\r
+ GLOBAL _io_in8, _io_in16, _io_in32\r
+ GLOBAL _io_out8, _io_out16, _io_out32\r
+ GLOBAL _io_load_eflags, _io_store_eflags\r
+ GLOBAL _load_gdtr, _load_idtr\r
+ GLOBAL _load_cr0, _store_cr0\r
+ GLOBAL _load_cr1, _store_cr1\r
+ GLOBAL _load_cr2, _store_cr2\r
+ GLOBAL _load_cr3, _store_cr3\r
+ GLOBAL _load_tr\r
+ GLOBAL _asm_end_app\r
+ GLOBAL _memtest_sub\r
+ GLOBAL _farjmp, _farcall\r
+ GLOBAL _start_app\r
+ GLOBAL _asm_osselect_third\r
+ GLOBAL _clts, _fnsave, _frstor\r
+ GLOBAL _pit_beep_on, _pit_beep_off\r
+ GLOBAL _pipelineflush\r
+ GLOBAL _read_tsc\r
+ GLOBAL _cpuid\r
+\r
+ GLOBAL _asm_inthandler00, _asm_inthandler01, _asm_inthandler02, _asm_inthandler03, _asm_inthandler04, _asm_inthandler05, _asm_inthandler06, _asm_inthandler07, _asm_inthandler08, _asm_inthandler09, _asm_inthandler0a, _asm_inthandler0b, _asm_inthandler0c, _asm_inthandler0d, _asm_inthandler0e, _asm_inthandler0f, _asm_inthandler10, _asm_inthandler11, _asm_inthandler12, _asm_inthandler13, _asm_inthandler14, _asm_inthandler15, _asm_inthandler16, _asm_inthandler17, _asm_inthandler18, _asm_inthandler19, _asm_inthandler1a, _asm_inthandler1b, _asm_inthandler1c, _asm_inthandler1d, _asm_inthandler1e, _asm_inthandler1f\r
+ EXTERN _inthandler00, _inthandler01, _inthandler02, _inthandler03, _inthandler04, _inthandler05, _inthandler06, _inthandler07, _inthandler08, _inthandler09, _inthandler0a, _inthandler0b, _inthandler0c, _inthandler0d, _inthandler0e, _inthandler0f, _inthandler10, _inthandler11, _inthandler12, _inthandler13, _inthandler14, _inthandler15, _inthandler16, _inthandler17, _inthandler18, _inthandler19, _inthandler1a, _inthandler1b, _inthandler1c, _inthandler1d, _inthandler1e, _inthandler1f\r
+\r
+ GLOBAL _asm_inthandler27\r
+ EXTERN _inthandler27\r
+\r
+ GLOBAL _asm_inthandler20\r
+ EXTERN _inthandler20\r
+\r
+ GLOBAL _asm_inthandler21\r
+ EXTERN _inthandler21\r
+\r
+ GLOBAL _asm_inthandler2c\r
+ EXTERN _inthandler2c\r
+\r
+ GLOBAL _asm_hrb_api\r
+ EXTERN _hrb_api\r
+\r
+[SECTION .text]\r
+\r
+_asm_hrb_api:\r
+ sti\r
+ push ds\r
+ push es\r
+ pushad\r
+ pushad\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _hrb_api\r
+ cmp eax,0\r
+ jne _asm_end_app\r
+ add esp,32\r
+ popad\r
+ pop es\r
+ pop ds\r
+ iretd\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
+_read_tsc:\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
+_asm_inthandler2c:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler2c\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler21:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler21\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler20:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler20\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_pipelineflush:\r
+ jmp flush\r
+flush:\r
+ ret\r
+\r
+\r
+_asm_inthandler00:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler00\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler01:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler01\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler02:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler02\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler03:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler03\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler04:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler04\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler05:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler05\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler06:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler06\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler07:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler07\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler08:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler08\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler09:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler09\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler0a:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler0a\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler0b:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler0b\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler0c:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler0c\r
+ cmp eax,0\r
+ jne _asm_end_app\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler0d:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler0d\r
+ cmp eax,0\r
+ jne _asm_end_app\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler0e:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler0e\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler0f:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler0f\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler10:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler10\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler11:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler11\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler12:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler12\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler13:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler13\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler14:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler14\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler15:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler15\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler16:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler16\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler17:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler17\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler18:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler18\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler19:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler19\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler1a:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler1a\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler1b:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler1b\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler1c:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler1c\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler1d:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler1d\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler1e:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler1e\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler1f:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler1f\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\r
+\r
+_asm_inthandler27:\r
+ push es\r
+ push ds\r
+ pushad\r
+ mov eax,esp\r
+ push eax\r
+ mov ax,ss\r
+ mov ds,ax\r
+ mov es,ax\r
+ call _inthandler27\r
+ pop eax\r
+ popad\r
+ pop ds\r
+ pop es\r
+ iretd\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
+_asm_osselect_third:\r
+ mov ax,ss\r
+ mov fs,ax\r
+ mov gs,ax\r
+ mov esp,[esp+4]\r
+ jmp 2*8:0x0000001b\r
+\r
+_clts:\r
+ clts\r
+ ret\r
+\r
+_fnsave:\r
+ mov eax,[esp+4] ; addr\r
+ fnsave [eax]\r
+ ret\r
+\r
+_frstor:\r
+ mov eax,[esp+4] ; addr\r
+ frstor [eax]\r
+ ret\r
+\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_in16:\r
+ mov edx,[esp+4]\r
+ mov eax,0\r
+ in ax,dx\r
+ ret\r
+\r
+_io_in32:\r
+ mov edx,[esp+4]\r
+ in eax,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_out16:\r
+ mov edx,[esp+4]\r
+ mov eax,[esp+8]\r
+ out dx,ax\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_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_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_cr1:\r
+ mov eax,cr1\r
+ ret\r
+\r
+_store_cr1:\r
+ mov eax,[esp+4]\r
+ mov cr1,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_tr:\r
+ ltr [esp+4]\r
+ ret\r
+\r
+_memtest_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
+_farjmp:\r
+ jmp far [esp+4]\r
+ ret\r
+\r
+_farcall:\r
+ call far [esp+4]\r
+ ret\r
+\r
+\r
+_asm_end_app:\r
+ mov esp,[eax]\r
+ mov dword [eax+4],0\r
+ popad\r
+ ret\r
+\r
+_start_app:\r
+ pushad\r
+ mov eax,[esp+36]\r
+ mov ecx,[esp+40]\r
+ mov edx,[esp+44]\r
+ mov ebx,[esp+48]\r
+ mov ebp,[esp+52]\r
+ mov [ebp ],esp\r
+ mov [ebp+4],ss\r
+ mov es,bx\r
+ mov ds,bx\r
+ mov fs,bx\r
+ mov gs,bx\r
+\r
+ or ecx,3\r
+ or ebx,3\r
+ push ebx\r
+ push edx\r
+ push ecx\r
+ push eax\r
+ retf\r
+\r