From e1e1e6b60d5b1808fc4ac80784118287a0437f2d Mon Sep 17 00:00:00 2001 From: sparky4 Date: Wed, 4 Jan 2017 11:50:43 -0600 Subject: [PATCH] FPU detection added --- 16.upx | 0 db.exe | Bin 9473 -> 13186 bytes makefile | 52 +++++++------ src/16.c | 10 +-- src/16.h | 2 +- src/lib/16_timer.c | 2 +- src/lib/16_timer.h | 2 +- src/lib/scroll16.h | 2 +- src/lib/wcpu/16_wcpu.c | 164 +++++++++++++++++++++++++++++++++++++++++ src/lib/wcpu/16_wcpu.h | 38 ++++++++++ src/lib/wcpu/wcpu.c | 67 ++++------------- src/lib/wcpu/wcpu.h | 6 +- src/scroll.c | 11 +-- src/util/cputype.asm | 147 ++++++++++++++++++++++++++++++++++++ src/zcroll.c | 11 +-- wcpu.exe | Bin 0 -> 85732 bytes 16 files changed, 406 insertions(+), 108 deletions(-) delete mode 100755 16.upx create mode 100755 src/lib/wcpu/16_wcpu.c create mode 100755 src/lib/wcpu/16_wcpu.h create mode 100755 src/util/cputype.asm create mode 100755 wcpu.exe diff --git a/16.upx b/16.upx deleted file mode 100755 index e69de29b..00000000 diff --git a/db.exe b/db.exe index 5616e4ae70b7558d756e2e11cc89b439b9a78ab9..af80cac81c36b2b54df02442584b23793f3cadcb 100755 GIT binary patch literal 13186 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 literal 9473 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 VCk$He1&}vGK>qLPJQb|g{{!+_FslFn diff --git a/makefile b/makefile index d754f957..2c8cde33 100755 --- a/makefile +++ b/makefile @@ -63,21 +63,22 @@ BUILD_ROOT=$+$(%__CWD__)$- DATADIR=data$(DIRSEP) SPRI=$(DATADIR)/spri SRC=src -SRCLIB=src/lib -JSMNLIB=src/lib/jsmn -NYANLIB=src/lib/nyan -EXMMLIB=src/lib/exmm -MODEXLIB16=src/lib/16_vl -MODEXLIB=src/lib/modex -VGMSNDLIB=src/lib/vgmsnd -DOSLIB=src/lib/doslib -WCPULIB=src/lib/wcpu - -DOSLIB_CPU=src/lib/doslib/hw/cpu -DOSLIB_DOS=src/lib/doslib/hw/dos -DOSLIB_VGA=src/lib/doslib/hw/vga -DOSLIB_8250=src/lib/doslib/hw/8250 -DOSLIB_JOYSTICK=src/lib/doslib/hw/joystick +UTIL=$(SRC)/util +SRCLIB=$(SRC)/lib +JSMNLIB=$(SRCLIB)/jsmn +NYANLIB=$(SRCLIB)/nyan +EXMMLIB=$(SRCLIB)/exmm +MODEXLIB16=$(SRCLIB)/16_vl +MODEXLIB=$(SRCLIB)/modex +VGMSNDLIB=$(SRCLIB)/vgmsnd +DOSLIB=$(SRCLIB)/doslib +WCPULIB=$(SRCLIB)/wcpu + +DOSLIB_CPU=$(DOSLIB)/hw/cpu +DOSLIB_DOS=$(DOSLIB)/hw/dos +DOSLIB_VGA=$(DOSLIB)/hw/vga +DOSLIB_8250=$(DOSLIB)/hw/8250 +DOSLIB_JOYSTICK=$(DOSLIB)/hw/joystick DOSLIB_MEMMODE=dos86$(MEMORYMODE) # @@ -110,7 +111,7 @@ LIBFLAGS=$(WLIBQ) -b -n VGMSNDOBJ = vgmSnd.$(OBJ) 16_snd.$(OBJ) OLDLIBOBJS=bitmap.$(OBJ) 16render.$(OBJ) GFXLIBOBJS = 16_vl.$(OBJ) 16text.$(OBJ) bakapee.$(OBJ) scroll16.$(OBJ) 16_vrs.$(OBJ) 16_sprit.$(OBJ) $(OLDLIBOBJS) -16LIBOBJS = 16_mm.$(OBJ) 16_pm.$(OBJ) 16_ca.$(OBJ) 16_tail.$(OBJ) 16_in.$(OBJ) 16_head.$(OBJ) 16_dbg.$(OBJ) kitten.$(OBJ) 16_hc.$(OBJ) wcpu.$(OBJ) 16_timer.$(OBJ) jsmn.$(OBJ) 16_map.$(OBJ) 16text.$(OBJ) +16LIBOBJS = 16_mm.$(OBJ) 16_pm.$(OBJ) 16_ca.$(OBJ) 16_tail.$(OBJ) 16_in.$(OBJ) 16_head.$(OBJ) 16_dbg.$(OBJ) kitten.$(OBJ) 16_hc.$(OBJ) 16_wcpu.$(OBJ) 16_timer.$(OBJ) jsmn.$(OBJ) 16_map.$(OBJ) 16text.$(OBJ) #16planar.$(OBJ) planar.$(OBJ) mapread.$(OBJ) DOSLIBOBJ = adlib.$(OBJ) 8254.$(OBJ) 8259.$(OBJ) dos.$(OBJ) cpu.$(OBJ) !ifeq DEBUGSERIAL 1 @@ -129,9 +130,9 @@ DOSLIBLIBS += $(DOSLIB_8250)/$(DOSLIB_MEMMODE)/8250.lib # # Files locations # -.c : $(SRC);$(SRCLIB);$(MODEXLIB16);$(JSMNLIB);$(NYANLIB);$(VGMSNDLIB);$(WCPULIB) +.c : $(SRC);$(SRCLIB);$(MODEXLIB16);$(JSMNLIB);$(NYANLIB);$(VGMSNDLIB);$(WCPULIB);$(UTIL) -.asm : $(MODEXLIB) +.asm : $(MODEXLIB);$(UTIL) .lib : .;$(DOSLIB_CPU)/$(DOSLIB_MEMMODE);$(DOSLIB_DOS)/$(DOSLIB_MEMMODE);$(DOSLIB_VGA)/$(DOSLIB_MEMMODE);$(DOSLIB_8250)/$(DOSLIB_MEMMODE) @@ -156,6 +157,10 @@ DOSLIBLIBS += $(DOSLIB_8250)/$(DOSLIB_MEMMODE)/8250.lib # # List of executables to build # +EXTERNTESTEXEC = & + joytest.exe & + wcpu.exe & + db.exe TESTEXEC = & tesuto.exe & 0.exe & @@ -174,7 +179,7 @@ TESTEXEC2 = & test0.exe & pcxtest.exe & pcxtest2.exe & - db.exe + $(EXTERNTESTEXEC) UTILEXEC = & palettel.exe & palettec.exe @@ -184,8 +189,8 @@ EXEC = & $(UTILEXEC) & $(TESTEXEC) -all: $(EXEC) joytest.exe -testexec: $(EXEC) joytest.exe $(TESTEXEC2) +all: $(EXEC) $(EXTERNTESTEXEC) +testexec: $(EXEC) $(TESTEXEC2) # # game and bakapi executables @@ -224,6 +229,7 @@ fmemtest.exe: fmemtest.$(OBJ) exmmtest.exe: exmmtest.$(OBJ) $(16LIB) $(DOSLIBLIBS) vgmtest.exe: vgmtest.$(OBJ) vgmsnd.lib $(16LIB) $(DOSLIBLIBS) db.exe: db.$(OBJ) +wcpu.exe: wcpu.$(OBJ) $(16LIB) $(DOSLIBLIBS) # # executable's objects @@ -255,7 +261,7 @@ inputest.$(OBJ):$(SRC)/inputest.c #tsthimem.$(OBJ): $(SRC)/tsthimem.c exmmtest.$(OBJ):$(SRC)/exmmtest.c vgmtest.$(OBJ):$(SRC)/vgmtest.c -db.$(OBJ):$(SRC)/util/db.c +db.$(OBJ): $(UTIL)/db.c # # non executable objects libraries @@ -311,7 +317,7 @@ midi.$(OBJ): $(SRCLIB)/midi.c $(SRCLIB)/midi.h jsmn.$(OBJ): $(JSMNLIB)/jsmn.c $(JSMNLIB)/jsmn.h kitten.$(OBJ): $(NYANLIB)/kitten.c $(NYANLIB)/kitten.h vgmSnd.$(OBJ): $(VGMSNDLIB)/vgmSnd.c $(VGMSNDLIB)/vgmSnd.h -wcpu.$(OBJ): $(WCPULIB)/wcpu.c $(WCPULIB)/wcpu.h +16_wcpu.$(OBJ): $(WCPULIB)/16_wcpu.c $(WCPULIB)/16_wcpu.h #memory.$(OBJ):$(EXMMLIB)/memory.c $(EXMMLIB)/memory.h c_utils.$(OBJ):$(MODEXLIB)/c_utils.asm modex.$(OBJ): $(MODEXLIB)/modex.asm diff --git a/src/16.c b/src/16.c index 8ef4d904..b3fa0673 100755 --- a/src/16.c +++ b/src/16.c @@ -23,7 +23,6 @@ #include "src/16.h" engi_stat_t engi_stat; -const char *cpus; byte *dpal, *gpal; player_t player[MaxPlayers]; @@ -53,17 +52,10 @@ main(int argc, char *argv[]) shinku(&gvar); _DEBUGF("Serial debug output printf test %u %u %u\n",1U,2U,3U); } - switch(detectcpu()) - { - case 0: cpus = "8086/8088 or 186/88"; break; - case 1: cpus = "286"; break; - case 2: cpus = "386 or newer"; break; - default: cpus = "internal error"; break; - } Shutdown16(&gvar); VGAmodeX(0, 1, &gvar); printf("Project 16 16.exe. This is supposed to be the actual finished game executable!\n"); printf("version %s\n", VERSION); - printf("detected CPU type: %s\n", cpus); + WCPU_cpufpumesg(); modexFadeOn(4, dpal); } diff --git a/src/16.h b/src/16.h index 253cd9e9..c39155d2 100755 --- a/src/16.h +++ b/src/16.h @@ -26,7 +26,7 @@ #include "src/lib/16_head.h" #include "src/lib/16_tail.h" #include "src/lib/16_vl.h" -#include "src/lib/wcpu/wcpu.h" +#include "src/lib/wcpu/16_wcpu.h" #include "src/lib/scroll16.h" #include "src/lib/16_timer.h" #include "src/lib/16_dbg.h" diff --git a/src/lib/16_timer.c b/src/lib/16_timer.c index 5cb216c1..e05232a0 100755 --- a/src/lib/16_timer.c +++ b/src/lib/16_timer.c @@ -33,7 +33,7 @@ clock_t start_timer(global_game_variables_t *gv) //gv->kurokku.frames_per_second = 60; //turn this off if XT - switch(detectcpu()) + switch(WCPU_detectcpu()) { case 0: gv->kurokku.fpscap=0; diff --git a/src/lib/16_timer.h b/src/lib/16_timer.h index d6e491db..fb2335ce 100755 --- a/src/lib/16_timer.h +++ b/src/lib/16_timer.h @@ -23,7 +23,7 @@ #ifndef _TIMER_H_ #define _TIMER_H_ #include "src/lib/16_head.h" -#include "src/lib/wcpu/wcpu.h" +#include "src/lib/wcpu/16_wcpu.h" clock_t start_timer(global_game_variables_t *gv); double elapsed_timer(global_game_variables_t *gv); diff --git a/src/lib/scroll16.h b/src/lib/scroll16.h index 9dc7b4a5..c8ccab49 100755 --- a/src/lib/scroll16.h +++ b/src/lib/scroll16.h @@ -33,7 +33,7 @@ #include "src/lib/16render.h" //#include "src/lib/16_map.h" //new map stuff #include "src/lib/16_timer.h" -#include "src/lib/wcpu/wcpu.h" +#include "src/lib/wcpu/16_wcpu.h" #include #include diff --git a/src/lib/wcpu/16_wcpu.c b/src/lib/wcpu/16_wcpu.c new file mode 100755 index 00000000..41de0e12 --- /dev/null +++ b/src/lib/wcpu/16_wcpu.c @@ -0,0 +1,164 @@ +/* Project 16 Source Code~ + * Copyright (C) 2012-2016 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover + * + * This file is part of Project 16. + * + * Project 16 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Project 16 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see , or + * write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301 USA. + * + */ +/* tab size = 8 */ + +#include "src/lib/wcpu/16_wcpu.h" + +//#define USECPUPROBE + +byte WCPU_detectfpu() +{ + byte fputype=0; + word funk=0; + boolean errflag=0; + __asm { + PUSHF ; we gonna modify flags, so back them up +.8087 fninit ; Initialize FPU +// mov [WORD PTR funk], 55AAh ; Set junk value +// fnstsw funk ; Store status word +// cmp [BYTE PTR funk], 0 ; If it's not 0, no FPU + mov funk, 55AAh ; Set junk value + fnstsw funk ; Store status word + cmp funk, 0 ; If it's not 0, no FPU +// jne short _done + jne short _err + jmp _fpu + _err: + mov errflag, 1 + _fpu: +/* } + if(!errflag){ + printf("."); + __asm {*/ + fnstcw funk ; Store control word + mov ax, funk ; If the bits are not the way + and ax, 103Fh ; they should be, no FPU + cmp ax, 3Fh +// jne short _done + je short __err + jmp __fpu + __err: + mov errflag, 1 + __fpu: + /*}} + if(!errflag){ + printf("."); + __asm {*/ +// and [WORD PTR funk], 0FF7Fh ; Clear interrupt bit + and funk, 0FF7Fh ; Clear interrupt bit + fldcw funk ; Load control word + fdisi ; Disable interrupts + fstcw funk ; Store control word +// test [BYTE PTR funk], 80h ; If it changed, it's an 8087 + test funk, 80h ; If it changed, it's an 8087 + mov fputype, 1 + + _done: + POPF ; restore flags we backed up earlier + }//} + //printf("WCPU_detectfpu():\n fputype=%u\n funk=%u errflag=%u\n", fputype, funk, errflag); +#ifdef USECPUPROBE + if (cpu_flags & CPU_FLAG_FPU) printf(" - With FPU\n"); +#endif + return fputype; +} + +byte WCPU_detectcpu() +{ + byte cputype=0; + __asm { + PUSHF ; we gonna modify flags, so back them up + ; first check if its 8086/8088 or 80186/80188 + PUSHF ; FLAGS -> STACK + POP AX ; STACK -> AX + AND AX, 00FFFh ; clear 12-15 bits (they are always 1 on 8086/8088 and 80186/80188) + PUSH AX ; AX -> STACK + POPF ; STACK -> FLAGS + ; this is where magic happen + PUSHF ; FLAGS -> STACK + POP AX ; STACK -> AX + AND AX, 0F000h ; 0-11 bits aren't important to us + CMP AX, 0F000h ; check if all 12-15 bits are set (simple comparision) + JNE _286p ; if no, 286+ CPU + MOV cputype, 0 ; if yes, we are done, set cputype to 0 and end this + JMP _done + _286p: + ; now check if its 286 or newer + PUSHF ; FLAGS -> STACK + POP AX ; STACK -> AX + OR AX, 07000h ; set 12-14 bits (they are always cleared by 286 if its real mode) + PUSH AX ; AX -> STACK + POPF ; STACK -> FLAGS + ; this is where magic happen + PUSHF ; FLAGS -> STACK + POP AX ; STACK -> AX + TEST AX, 07000h ; check if at least 1 bit in 12-14 bits range is set (15th won't be set anyway) + JNZ _386p ; not all bits clear, its 386+ + MOV cputype, 1 ; all bits clear, its 286, we are done + JMP _done + _386p: + MOV cputype, 2 ; its 386 or newer, but we don't care if its newer at this point + _done: + POPF ; restore flags we backed up earlier + } + return cputype; +} + +const char *WCPU_cpudetectmesg() +{ + const char *cpus; + unsigned char cput; + + cput = WCPU_detectcpu(); + switch(cput) + { + case 0: cpus = "8086/8088 or 186/88"; break; + case 1: cpus = "286"; break; + case 2: cpus = "386 or newer"; break; + default: cpus = "internal error"; break; + } + return cpus; +} + +const char *WCPU_fpudetectmesg() +{ + const char *fpus; + unsigned char fput; + + fput = WCPU_detectfpu(); + switch(fput) + { + case 0: fpus = "none"; break; + case 1: fpus = "8087"; break; + default: fpus = "internal error"; break; + } + return fpus; +} + +void WCPU_cpufpumesg() +{ +#ifdef USECPUPROBE + cpu_probe(); +#endif + printf("detected CPU type: %s\n", WCPU_cpudetectmesg()); + printf("detected FPU type: %s\n", WCPU_fpudetectmesg()); +} diff --git a/src/lib/wcpu/16_wcpu.h b/src/lib/wcpu/16_wcpu.h new file mode 100755 index 00000000..93f97e0f --- /dev/null +++ b/src/lib/wcpu/16_wcpu.h @@ -0,0 +1,38 @@ +/* Project 16 Source Code~ + * Copyright (C) 2012-2016 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover + * + * This file is part of Project 16. + * + * Project 16 is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Project 16 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see , or + * write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301 USA. + * + */ + +#ifndef _WCPU_H_ +#define _WCPU_H_ +#include +#include "src/lib/16_t.h" + +#ifdef __WATCOMC__ +#include +#endif + +byte WCPU_detectfpu(void); +byte WCPU_detectcpu(void); +const char *WCPU_cpudetectmesg(); +const char *WCPU_fpudetectmesg(); +void WCPU_cpufpumesg(); + +#endif/*_WCPU_H_*/ diff --git a/src/lib/wcpu/wcpu.c b/src/lib/wcpu/wcpu.c index 92b91919..c72cca70 100755 --- a/src/lib/wcpu/wcpu.c +++ b/src/lib/wcpu/wcpu.c @@ -21,57 +21,15 @@ */ /* tab size = 8 */ -#include "src/lib/wcpu/wcpu.h" +#include "src/lib/wcpu/16_wcpu.h" -byte detectcpu() +void main(int argc, char **argv) { - byte cputype=0; - __asm - { - PUSHF ; we gonna modify flags, so back them up - ; first check if its 8086/8088 or 80186/80188 - PUSHF ; FLAGS -> STACK - POP AX ; STACK -> AX - AND AX, 00FFFh ; clear 12-15 bits (they are always 1 on 8086/8088 and 80186/80188) - PUSH AX ; AX -> STACK - POPF ; STACK -> FLAGS - ; this is where magic happen - PUSHF ; FLAGS -> STACK - POP AX ; STACK -> AX - AND AX, 0F000h ; 0-11 bits aren't important to us - CMP AX, 0F000h ; check if all 12-15 bits are set (simple comparision) - JNE _286p ; if no, 286+ CPU - MOV cputype, 0 ; if yes, we are done, set cputype to 0 and end this - JMP _done - _286p: - ; now check if its 286 or newer - PUSHF ; FLAGS -> STACK - POP AX ; STACK -> AX - OR AX, 07000h ; set 12-14 bits (they are always cleared by 286 if its real mode) - PUSH AX ; AX -> STACK - POPF ; STACK -> FLAGS - ; this is where magic happen - PUSHF ; FLAGS -> STACK - POP AX ; STACK -> AX - TEST AX, 07000h ; check if at least 1 bit in 12-14 bits range is set (15th won't be set anyway) - JNZ _386p ; not all bits clear, its 386+ - MOV cputype, 1 ; all bits clear, its 286, we are done - JMP _done - _386p: - MOV cputype, 2 ; its 386 or newer, but we don't care if its newer at this point - _done: - POPF ; restore flags we backed up earlier - } - return cputype; -} - -#ifdef TEST -int main(int argc, char **argv) -{ - const char *cpus; - unsigned char cput; + /*const char *cpus, *fpus; + unsigned char cput, fput; - cput = detectcpu(); + cput = WCPU_detectcpu(); + fput = WCPU_detectfpu(); switch(cput) { case 0: cpus = "8086/8088 or 186/88"; break; @@ -79,8 +37,15 @@ int main(int argc, char **argv) case 2: cpus = "386 or newer"; break; default: cpus = "internal error"; break; } + + switch(fput) + { + case 0: fpus = "none"; break; + case 1: fpus = "8087"; break; + default: fpus = "internal error"; break; + } printf("detected CPU type: %s\n", cpus); - return 0; + printf("detected FPU type: %s\n", fpus);*/ + WCPU_cpufpumesg(); + //if (cpu_flags & CPU_FLAG_FPU) printf(" - With FPU\n"); } -#endif - diff --git a/src/lib/wcpu/wcpu.h b/src/lib/wcpu/wcpu.h index c72f5d0f..43aced89 100755 --- a/src/lib/wcpu/wcpu.h +++ b/src/lib/wcpu/wcpu.h @@ -27,6 +27,10 @@ //#define TEST -byte detectcpu(void); +byte WCPU_detectfpu(void); +byte WCPU_detectcpu(void); +const char *WCPU_cpudetectmesg(); +const char *WCPU_fpudetectmesg(); +void WCPU_cpufpumesg(); #endif/*_WCPU_H_*/ diff --git a/src/scroll.c b/src/scroll.c index 131b0435..f14ec0cd 100755 --- a/src/scroll.c +++ b/src/scroll.c @@ -22,7 +22,6 @@ #include "src/lib/scroll16.h" #include "src/lib/16_timer.h" -#include "src/lib/wcpu/wcpu.h" #include "src/lib/16_dbg.h" //#define FADE @@ -39,7 +38,6 @@ pan_t pan; boolean panswitch=0;//1 //extern boolean pageflipflop=1; unsigned int i; - const char *cpus; //static int persist_aniframe = 0; /* gonna be increased to 1 before being used, so 0 is ok for default */ //map_view_db_t pgid[4]; @@ -287,14 +285,7 @@ void main(int argc, char *argv[]) printf("\nProject 16 scroll.exe. This is just a test file!\n"); printf("version %s\n", VERSION); SCROLLEXITMESG; - switch(detectcpu()) - { - case 0: cpus = "8086/8088 or 186/88"; break; - case 1: cpus = "286"; break; - case 2: cpus = "386 or newer"; break; - default: cpus = "internal error"; break; - } - printf("detected CPU type: %s\n", cpus); + WCPU_cpufpumesg(); #ifdef MODEX #ifdef FADE modexFadeOn(4, dpal); diff --git a/src/util/cputype.asm b/src/util/cputype.asm new file mode 100755 index 00000000..f4540acd --- /dev/null +++ b/src/util/cputype.asm @@ -0,0 +1,147 @@ +; To assemble the code using MASM 5.10: +; MASM cputype; +; LINK cputype; +; EXE2COM cputype; +; Version: 1.00b + +; Author: Ben Lunt (Forever Young Software) + +; Date: 20 Nov 1997 + +; If you need an EXE to COM converter, you can get one here +; +; The following code won't assemble with NBASM yet, since +; I have not added all the FPU instructions. I hope to get to them soon. +; Until then, you will have to use a different assembler. Sorry. +; + +CodeSeg segment + assume cs:CodeSeg, ds:CodeSeg, es:CodeSeg +.186 + org 100h +start: mov ax,cs ; free unused part of Mem Block + mov es,ax ; for .COM file format + mov bx,4096 ; + mov ah,4Ah ; + int 21h ; + + mov cx,0121h ; If CH can be shifted by 21h, + shl ch,cl ; then it's an 8086, because + jz short p1_8086 ; a 186+ limits shift counts. + push sp ; If SP is pushed as its + pop ax ; original value, then + cmp ax,sp ; it's a 286+. + jne short p1_186 + mov ax,7000h ; if bits 12,13,14 are still set + push ax ; after pushing/poping to/from + popf ; the flags register then we have + pushf ; a 386+ + pop ax + and ax,7000h + cmp ax,7000h + jne short p1_286 ; it's a 386+ +.386 + push bp ; Align stack to dword + mov bp,sp + and sp,0FFFCh + pushfd ; Save eflags + cli ; No interrupts + pushfd ; EAX = eflags + pop eax + mov ebx,eax ; EBX = eflags + xor eax,40000h ; Toggle AC bit + push eax ; Eflags = EAX + popfd + pushfd ; EAX = eflags + pop eax + popfd ; Restore eflags + mov sp,bp ; Restore stack + pop bp + cmp eax,ebx ; If the bit was not + je short p1_386 ; reset, it's a 486+ + pushfd ; Save eflags + cli ; No interrupts + pushfd ; EAX = eflags + pop eax + xor eax,200000h ; Toggle ID bit + push eax ; Eflags = EAX + popfd + pushfd ; EBX = eflags + pop ebx + popfd ; Restore eflags + cmp eax,ebx ; If the bit was not + jne short p1_486 ; reset, it's a 586+ + mov dx,offset CPUType5 ; 586+ + jmp short cpudone +p1_486: mov dx,offset CPUType4 ; 486 + jmp short cpudone +p1_386: mov dx,offset CPUType3 ; 386 + jmp short cpudone +p1_286: mov dx,offset CPUType2 ; 286 + jmp short cpudone +p1_186: mov dx,offset CPUType1 ; 186 + jmp short cpudone +p1_8086: mov dx,offset CPUType0 ; 8086 +cpudone: mov ah,09 + int 21h +.186 ; make sure we set proc back to 186 +.8087 fninit ; Initialize FPU + mov _Junk,55AAh ; Set junk value + fnstsw _Junk ; Store status word + cmp _Junk,0 ; If it's not 0, no FPU + jne short p2_nofpu + fnstcw _Junk ; Store control word + mov ax,_Junk ; If the bits are not the way + and ax,103Fh ; they should be, no FPU + cmp ax,3Fh + jne short p2_nofpu + + and _Junk,0FF7Fh ; Clear interrupt bit + fldcw _Junk ; Load control word + fdisi ; Disable interrupts + fstcw _Junk ; Store control word + test _Junk,80h ; If it changed, it's an 8087 + jnz short p2_8087 +.286 ; allowes .287 also + finit ; Re-initialize + fld1 ; Divide 1 by 0 to get + fldz ; a positive infinity + fdiv + fld st ; Get a negative infinity + fchs + fcompp ; Compare them + fstsw ax ; Store status word + sahf ; If the FPU thought that they + je short p2_287 ; were equal, it's a 287 + mov dx,offset FPUType3 ; 387 + finit ; Init processor + jmp short fputypeD +p2_287: mov dx,offset FPUType2 ; 287 + finit ; Init processor + jmp short fputypeD +p2_8087: mov dx,offset FPUType0 ; 8087 + finit ; Init processor + jmp short fputypeD +p2_nofpu: mov dx,offset FPUType +fputypeD: mov ah,09 + int 21h +.186 +.8087 + ret + + +_Junk dw 00h +CPUType0 db 13,10,'You have an 8086/88 processor.$' +CPUType1 db 13,10,'You have an 186/88 processor.$' +CPUType2 db 13,10,'You have an 286 processor.$' +CPUType3 db 13,10,'You have an 386 processor.$' +CPUType4 db 13,10,'You have an 486 processor.$' +CPUType5 db 13,10,'You have an 586 or better processor.$' + +FPUType db 13,10,"You don't have a math coprocessor.$" +FPUType0 db 13,10,'You have an 8087 math coprocessor.$' +FPUType2 db 13,10,'You have an 287 math coprocessor.$' +FPUType3 db 13,10,'You have an 387 or better math coprocessor.$' + +CodeSeg ends + end start diff --git a/src/zcroll.c b/src/zcroll.c index 29f329c8..16736543 100755 --- a/src/zcroll.c +++ b/src/zcroll.c @@ -22,7 +22,6 @@ #include "src/lib/scroll16.h" #include "src/lib/16_timer.h" -#include "src/lib/wcpu/wcpu.h" #include "src/lib/16render.h" #include "src/lib/16_dbg.h" @@ -38,7 +37,6 @@ pan_t pan; boolean panswitch=0,baka=0; //extern boolean pageflipflop=1; unsigned int i; -const char *cpus; //static int persist_aniframe = 0; /* gonna be increased to 1 before being used, so 0 is ok for default */ //map_view_db_t pgid[4]; @@ -241,14 +239,7 @@ void main(int argc, char *argv[]) printf("\nProject 16 zcroll.exe. This is just a test file!\n"); printf("version %s\n", VERSION); SCROLLEXITMESG; - switch(detectcpu()) - { - case 0: cpus = "8086/8088 or 186/88"; break; - case 1: cpus = "286"; break; - case 2: cpus = "386 or newer"; break; - default: cpus = "internal error"; break; - } - printf("detected CPU type: %s\n", cpus); + WCPU_cpufpumesg(); #ifdef FADE modexFadeOn(4, dpal); #endif diff --git a/wcpu.exe b/wcpu.exe new file mode 100755 index 0000000000000000000000000000000000000000..b2b745cb307e39aa3e6be85594680a87983938e2 GIT binary patch literal 85732 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 Bpez6Y literal 0 HcmV?d00001 -- 2.39.5