Changed version number to 1.01;
IMG floppy image handler now fills the remaining bytes with 0xF6 if it has read less bytes than expected - fixes handling of truncated IMG's with a valid BPB; HDI files are now written with the correct header; FDC DUMP REGISTERS command is now implemented correctly, fixes FDC error on AMI 486 clone and AMI WinBIOS 486; Commented out the Acer 386SX and the Phoenix 386 clone; WinPCap code is now delayed loading (thanks to Rai-chan), the emulator should now be able to run without WinPCap installed if not using PCap; The IBM PS/2 Model 30 NVR file is now saved in the same directly as the other NVR files; Applied all the latest mainline PCem Voodoo commits.
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
/* Copyright holders: Tenshi
|
/* Copyright holders: Tenshi
|
||||||
see COPYING for more details
|
see COPYING for more details
|
||||||
*/
|
*/
|
||||||
#define emulator_version "1.10"
|
#define emulator_version "1.01"
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ CFLAGS = -O3 -march=native -mtune=native -fbranch-probabilities -fvpt -fpeel-loo
|
|||||||
DFLAGS = -O3 -march=i686 -fomit-frame-pointer -msse2 -mstackrealign
|
DFLAGS = -O3 -march=i686 -fomit-frame-pointer -msse2 -mstackrealign
|
||||||
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o acerm3a.o ali1429.o amstrad.o buslogic.o cdrom.o cdrom-ioctl.o cdrom-iso.o \
|
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o acerm3a.o ali1429.o amstrad.o buslogic.o cdrom.o cdrom-ioctl.o cdrom-iso.o \
|
||||||
cdrom-null.o codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_686.o codegen_timing_pentium.o codegen_timing_winchip.o codegen_x86.o compaq.o config.o cpu.o dac.o \
|
cdrom-null.o codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_686.o codegen_timing_pentium.o codegen_timing_winchip.o codegen_x86.o compaq.o config.o cpu.o dac.o \
|
||||||
device.o disc.o disc_86f.o disc_fdi.o disc_imd.o disc_img.o disc_random.o disc_td0.o dma.o fdc.o fdc37c665.o fdc37c932fr.o fdd.o fdi2raw.o gameport.o headland.o i82335.o i430hx.o i430lx.o i430fx.o \
|
device.o disc.o disc_86f.o disc_fdi.o disc_imd.o disc_img.o disc_random.o disc_td0.o dma.o fdc.o fdc37c665.o fdc37c932fr.o fdd.o fdi2raw.o gameport.o headland.o i430hx.o i430lx.o i430fx.o \
|
||||||
i430nx.o i430vx.o i440fx.o ide.o intel.o intel_flash.o io.o jim.o joystick_ch_flightstick_pro.o joystick_standard.o joystick_sw_pad.o joystick_tm_fcs.o keyboard.o keyboard_amstrad.o keyboard_at.o \
|
i430nx.o i430vx.o i440fx.o ide.o intel.o intel_flash.o io.o jim.o joystick_ch_flightstick_pro.o joystick_standard.o joystick_sw_pad.o joystick_tm_fcs.o keyboard.o keyboard_amstrad.o keyboard_at.o \
|
||||||
keyboard_olim24.o keyboard_pcjr.o keyboard_xt.o lpt.o mcr.o mem.o memregs.o model.o mouse.o mouse_ps2.o \
|
keyboard_olim24.o keyboard_pcjr.o keyboard_xt.o lpt.o mcr.o mem.o memregs.o model.o mouse.o mouse_ps2.o \
|
||||||
mouse_serial.o ne2000.o neat.o nethandler.o nmi.o nvr.o olivetti_m24.o opti495.o pc.o pc87306.o pci.o pic.o piix.o pit.o ppi.o ps1.o ps2.o rom.o rtc.o \
|
mouse_serial.o ne2000.o neat.o nethandler.o nmi.o nvr.o olivetti_m24.o opti495.o pc.o pc87306.o pci.o pic.o piix.o pit.o ppi.o ps1.o ps2.o rom.o rtc.o \
|
||||||
@@ -28,7 +28,7 @@ SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voi
|
|||||||
SLIRPOBJ = bootp.o ip_icmp.o misc.o socket.o tcp_timer.o cksum.o ip_input.o queue.o tcp_input.o tftp.o debug.o ip_output.o sbuf.o tcp_output.o udp.o if.o mbuf.o slirp.o tcp_subr.o
|
SLIRPOBJ = bootp.o ip_icmp.o misc.o socket.o tcp_timer.o cksum.o ip_input.o queue.o tcp_input.o tftp.o debug.o ip_output.o sbuf.o tcp_output.o udp.o if.o mbuf.o slirp.o tcp_subr.o
|
||||||
|
|
||||||
|
|
||||||
LIBS = -mwindows -lwinmm -lopenal.dll -lopenal -lddraw -ldinput8 -ldxguid -ld3d9 -ld3dx9 -lwsock32 -liphlpapi -lstdc++ -lpsapi -static-libstdc++ -static-libgcc -static -lwpcap
|
LIBS = -mwindows -lwinmm -lopenal.dll -lopenal -lddraw -ldinput8 -ldxguid -ld3d9 -ld3dx9 -lwsock32 -liphlpapi -lstdc++ -lpsapi -static-libstdc++ -static-libgcc -static -lwpcapdelay
|
||||||
|
|
||||||
86Box.exe: $(OBJ) $(DBOBJ) $(LZFOBJ) $(SIDOBJ) $(SLIRPOBJ)
|
86Box.exe: $(OBJ) $(DBOBJ) $(LZFOBJ) $(SIDOBJ) $(SLIRPOBJ)
|
||||||
$(CC) $(OBJ) $(DBOBJ) $(LZFOBJ) $(SIDOBJ) $(SLIRPOBJ) -o "86Box.exe" $(LIBS)
|
$(CC) $(OBJ) $(DBOBJ) $(LZFOBJ) $(SIDOBJ) $(SLIRPOBJ) -o "86Box.exe" $(LIBS)
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ CFLAGS = -O3 -march=native -mtune=native -fbranch-probabilities -fvpt -fpeel-loo
|
|||||||
DFLAGS = -O3 -fomit-frame-pointer -msse2 -mstackrealign
|
DFLAGS = -O3 -fomit-frame-pointer -msse2 -mstackrealign
|
||||||
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o acerm3a.o ali1429.o amstrad.o buslogic.o cdrom.o cdrom-ioctl.o cdrom-iso.o \
|
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o acerm3a.o ali1429.o amstrad.o buslogic.o cdrom.o cdrom-ioctl.o cdrom-iso.o \
|
||||||
cdrom-null.o codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_686.o codegen_timing_pentium.o codegen_timing_winchip.o codegen_x86-64.o compaq.o config.o cpu.o dac.o \
|
cdrom-null.o codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_686.o codegen_timing_pentium.o codegen_timing_winchip.o codegen_x86-64.o compaq.o config.o cpu.o dac.o \
|
||||||
device.o disc.o disc_86f.o disc_fdi.o disc_imd.o disc_img.o disc_random.o disc_td0.o dma.o fdc.o fdc37c665.o fdc37c932fr.o fdd.o fdi2raw.o gameport.o headland.o i82335.o i430hx.o i430lx.o i430fx.o \
|
device.o disc.o disc_86f.o disc_fdi.o disc_imd.o disc_img.o disc_random.o disc_td0.o dma.o fdc.o fdc37c665.o fdc37c932fr.o fdd.o fdi2raw.o gameport.o headland.o i430hx.o i430lx.o i430fx.o \
|
||||||
i430nx.o i430vx.o i440fx.o ide.o intel.o intel_flash.o io.o jim.o joystick_ch_flightstick_pro.o joystick_standard.o joystick_sw_pad.o joystick_tm_fcs.o keyboard.o keyboard_amstrad.o keyboard_at.o \
|
i430nx.o i430vx.o i440fx.o ide.o intel.o intel_flash.o io.o jim.o joystick_ch_flightstick_pro.o joystick_standard.o joystick_sw_pad.o joystick_tm_fcs.o keyboard.o keyboard_amstrad.o keyboard_at.o \
|
||||||
keyboard_olim24.o keyboard_pcjr.o keyboard_xt.o lpt.o mcr.o mem.o memregs.o model.o mouse.o mouse_ps2.o \
|
keyboard_olim24.o keyboard_pcjr.o keyboard_xt.o lpt.o mcr.o mem.o memregs.o model.o mouse.o mouse_ps2.o \
|
||||||
mouse_serial.o ne2000.o neat.o nethandler.o nmi.o nvr.o olivetti_m24.o opti495.o pc.o pc87306.o pci.o pic.o piix.o pit.o ppi.o ps1.o ps2.o rom.o rtc.o \
|
mouse_serial.o ne2000.o neat.o nethandler.o nmi.o nvr.o olivetti_m24.o opti495.o pc.o pc87306.o pci.o pic.o piix.o pit.o ppi.o ps1.o ps2.o rom.o rtc.o \
|
||||||
@@ -28,7 +28,7 @@ SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voi
|
|||||||
SLIRPOBJ = bootp.o ip_icmp.o misc.o socket.o tcp_timer.o cksum.o ip_input.o queue.o tcp_input.o tftp.o debug.o ip_output.o sbuf.o tcp_output.o udp.o if.o mbuf.o slirp.o tcp_subr.o
|
SLIRPOBJ = bootp.o ip_icmp.o misc.o socket.o tcp_timer.o cksum.o ip_input.o queue.o tcp_input.o tftp.o debug.o ip_output.o sbuf.o tcp_output.o udp.o if.o mbuf.o slirp.o tcp_subr.o
|
||||||
|
|
||||||
|
|
||||||
LIBS = -mwindows -lwinmm -lopenal -lddraw -ldinput8 -ldxguid -ld3d9 -ld3dx9 -lwsock32 -liphlpapi -lstdc++ -lpsapi -static-libstdc++ -static-libgcc -static -lopenal.dll -lgcov -lPacket -lwpcap
|
LIBS = -mwindows -lwinmm -lopenal -lddraw -ldinput8 -ldxguid -ld3d9 -ld3dx9 -lwsock32 -liphlpapi -lstdc++ -lpsapi -static-libstdc++ -static-libgcc -static -lopenal.dll -lgcov -lPacket -lwpcapdelay
|
||||||
|
|
||||||
86Box64.exe: $(OBJ) $(DBOBJ) $(LZFOBJ) $(SIDOBJ) $(SLIRPOBJ)
|
86Box64.exe: $(OBJ) $(DBOBJ) $(LZFOBJ) $(SIDOBJ) $(SLIRPOBJ)
|
||||||
$(CC) $(OBJ) $(DBOBJ) $(LZFOBJ) $(SIDOBJ) $(SLIRPOBJ) -o "86Box64.exe" $(LIBS)
|
$(CC) $(OBJ) $(DBOBJ) $(LZFOBJ) $(SIDOBJ) $(SLIRPOBJ) -o "86Box64.exe" $(LIBS)
|
||||||
|
|||||||
@@ -583,6 +583,8 @@ void img_seek(int drive, int track)
|
|||||||
int side;
|
int side;
|
||||||
int current_xdft = img[drive].xdf_type - 1;
|
int current_xdft = img[drive].xdf_type - 1;
|
||||||
|
|
||||||
|
int read_bytes = 0;
|
||||||
|
|
||||||
uint8_t id[4] = { 0, 0, 0, 0 };
|
uint8_t id[4] = { 0, 0, 0, 0 };
|
||||||
|
|
||||||
int is_t0, sector, current_pos, img_pos, sr, sside, total, array_sector, buf_side, buf_pos;
|
int is_t0, sector, current_pos, img_pos, sr, sside, total, array_sector, buf_side, buf_pos;
|
||||||
@@ -616,7 +618,11 @@ void img_seek(int drive, int track)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fread(img[drive].track_data[side], img[drive].sectors * ssize, 1, img[drive].f);
|
read_bytes = fread(img[drive].track_data[side], img[drive].sectors * ssize, 1, img[drive].f);
|
||||||
|
if (read_bytes < (img[drive].sectors * ssize))
|
||||||
|
{
|
||||||
|
memset(img[drive].track_data[side] + read_bytes, 0xf6, (img[drive].sectors * ssize) - read_bytes);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
29
src/fdc.c
29
src/fdc.c
@@ -1793,24 +1793,17 @@ void fdc_callback()
|
|||||||
return;
|
return;
|
||||||
case 0x0e: /*Dump registers*/
|
case 0x0e: /*Dump registers*/
|
||||||
fdc.stat = (fdc.stat & 0xf) | 0xd0;
|
fdc.stat = (fdc.stat & 0xf) | 0xd0;
|
||||||
fdc.res[3] = fdc.pcn[0];
|
fdc.res[1] = fdc.pcn[0];
|
||||||
fdc.res[4] = fdc.pcn[1];
|
fdc.res[2] = fdc.pcn[1];
|
||||||
fdc.res[5] = fdc.pcn[2];
|
fdc.res[3] = fdc.pcn[2];
|
||||||
fdc.res[6] = fdc.pcn[3];
|
fdc.res[4] = fdc.pcn[3];
|
||||||
fdc.res[7] = fdc.specify[0];
|
fdc.res[5] = fdc.specify[0];
|
||||||
fdc.res[8] = fdc.specify[1];
|
fdc.res[6] = fdc.specify[1];
|
||||||
fdc.res[9] = fdc.eot[fdc.drive];
|
fdc.res[7] = fdc.eot[fdc.drive];
|
||||||
fdc.res[10] = (fdc.perp & 0x7f) | ((fdc.lock) ? 0x80 : 0);
|
fdc.res[8] = (fdc.perp & 0x7f) | ((fdc.lock) ? 0x80 : 0);
|
||||||
if (AT)
|
fdc.res[9] = fdc.config;
|
||||||
{
|
fdc.res[10] = fdc.pretrk;
|
||||||
fdc.res[11] = fdc.config;
|
paramstogo = 10;
|
||||||
fdc.res[12] = fdc.pretrk;
|
|
||||||
paramstogo=12;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
paramstogo=10;
|
|
||||||
}
|
|
||||||
discint=0;
|
discint=0;
|
||||||
disctime = 0;
|
disctime = 0;
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -405,6 +405,7 @@ int loadbios()
|
|||||||
fclose(f);
|
fclose(f);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
#if 0
|
||||||
case ROM_ACER386:
|
case ROM_ACER386:
|
||||||
f=romfopen("roms/acer386/acer386.bin","rb");
|
f=romfopen("roms/acer386/acer386.bin","rb");
|
||||||
if (!f) break;
|
if (!f) break;
|
||||||
@@ -416,6 +417,7 @@ int loadbios()
|
|||||||
if (!f) break;
|
if (!f) break;
|
||||||
fclose(f);
|
fclose(f);
|
||||||
return 1;
|
return 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
case ROM_AMI286:
|
case ROM_AMI286:
|
||||||
f=romfopen("roms/ami286/amic206.bin","rb");
|
f=romfopen("roms/ami286/amic206.bin","rb");
|
||||||
@@ -506,6 +508,7 @@ int loadbios()
|
|||||||
//is486=1;
|
//is486=1;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
#if 0
|
||||||
case ROM_PCI486:
|
case ROM_PCI486:
|
||||||
f=romfopen("roms/hot-433/hot-433.ami","rb");
|
f=romfopen("roms/hot-433/hot-433.ami","rb");
|
||||||
if (!f) break;
|
if (!f) break;
|
||||||
@@ -514,6 +517,7 @@ int loadbios()
|
|||||||
biosmask = 0x1ffff;
|
biosmask = 0x1ffff;
|
||||||
//is486=1;
|
//is486=1;
|
||||||
return 1;
|
return 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
case ROM_SIS496:
|
case ROM_SIS496:
|
||||||
f = romfopen("roms/sis496/SIS496-1.AWA", "rb");
|
f = romfopen("roms/sis496/SIS496-1.AWA", "rb");
|
||||||
@@ -663,6 +667,7 @@ int loadbios()
|
|||||||
fclose(f);
|
fclose(f);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
#if 0
|
||||||
case ROM_PX386: /*Phoenix 80386 BIOS*/
|
case ROM_PX386: /*Phoenix 80386 BIOS*/
|
||||||
f=romfopen("roms/px386/3iip001l.bin","rb");
|
f=romfopen("roms/px386/3iip001l.bin","rb");
|
||||||
ff=romfopen("roms/px386/3iip001h.bin","rb");
|
ff=romfopen("roms/px386/3iip001h.bin","rb");
|
||||||
@@ -675,6 +680,7 @@ int loadbios()
|
|||||||
fclose(ff);
|
fclose(ff);
|
||||||
fclose(f);
|
fclose(f);
|
||||||
return 1;
|
return 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
case ROM_DTK386: /*Uses NEAT chipset*/
|
case ROM_DTK386: /*Uses NEAT chipset*/
|
||||||
f = romfopen("roms/dtk386/3cto001.bin", "rb");
|
f = romfopen("roms/dtk386/3cto001.bin", "rb");
|
||||||
|
|||||||
14
src/model.c
14
src/model.c
@@ -13,7 +13,7 @@
|
|||||||
#include "io.h"
|
#include "io.h"
|
||||||
#include "rom.h"
|
#include "rom.h"
|
||||||
|
|
||||||
#include "acer386sx.h"
|
// #include "acer386sx.h"
|
||||||
#include "acerm3a.h"
|
#include "acerm3a.h"
|
||||||
#include "ali1429.h"
|
#include "ali1429.h"
|
||||||
#include "amstrad.h"
|
#include "amstrad.h"
|
||||||
@@ -88,8 +88,8 @@ void ps1_m2121_init();
|
|||||||
void ps2_m30_286_init();
|
void ps2_m30_286_init();
|
||||||
void at_neat_init();
|
void at_neat_init();
|
||||||
void at_scat_init();
|
void at_scat_init();
|
||||||
void at_acer386sx_init();
|
// void at_acer386sx_init();
|
||||||
void at_82335_init();
|
// void at_82335_init();
|
||||||
void at_wd76c10_init();
|
void at_wd76c10_init();
|
||||||
void at_ali1429_init();
|
void at_ali1429_init();
|
||||||
void at_headland_init();
|
void at_headland_init();
|
||||||
@@ -157,9 +157,9 @@ MODEL models[] =
|
|||||||
{"IBM PS/1 m.2121+ISA", ROM_IBMPS1_2121_ISA, { "Intel", cpus_i386DX, "AMD", cpus_Am386DX, "Cyrix", cpus_486DLC}, 1, MODEL_AT|MODEL_PS2, 1, 16, 1, ps1_m2121_init, NULL},
|
{"IBM PS/1 m.2121+ISA", ROM_IBMPS1_2121_ISA, { "Intel", cpus_i386DX, "AMD", cpus_Am386DX, "Cyrix", cpus_486DLC}, 1, MODEL_AT|MODEL_PS2, 1, 16, 1, ps1_m2121_init, NULL},
|
||||||
{"IBM PS/2 Model 30-286", ROM_IBMPS2_M30_286, { "", cpus_ps2_m30_286, "", NULL, "", NULL}, 0, MODEL_AT|MODEL_PS2, 1, 16, 1, ps2_m30_286_init, NULL},
|
{"IBM PS/2 Model 30-286", ROM_IBMPS2_M30_286, { "", cpus_ps2_m30_286, "", NULL, "", NULL}, 0, MODEL_AT|MODEL_PS2, 1, 16, 1, ps2_m30_286_init, NULL},
|
||||||
{"Compaq Deskpro 386", ROM_DESKPRO_386, { "Intel", cpus_i386DX, "AMD", cpus_Am386DX, "Cyrix", cpus_486DLC}, 0, MODEL_AT, 1, 15, 1, deskpro386_init, NULL},
|
{"Compaq Deskpro 386", ROM_DESKPRO_386, { "Intel", cpus_i386DX, "AMD", cpus_Am386DX, "Cyrix", cpus_486DLC}, 0, MODEL_AT, 1, 15, 1, deskpro386_init, NULL},
|
||||||
{"Acer 386SX25/N", ROM_ACER386, { "Intel", cpus_acer, "", NULL, "", NULL}, 1, MODEL_AT|MODEL_PS2, 1, 16, 1, at_acer386sx_init, NULL},
|
/* {"Acer 386SX25/N", ROM_ACER386, { "Intel", cpus_acer, "", NULL, "", NULL}, 1, MODEL_AT|MODEL_PS2, 1, 16, 1, at_acer386sx_init, NULL}, */
|
||||||
{"DTK 386SX clone", ROM_DTK386, { "Intel", cpus_i386SX, "AMD", cpus_Am386SX, "Cyrix", cpus_486SLC}, 0, MODEL_AT, 1, 16, 1, at_neat_init, NULL},
|
{"DTK 386SX clone", ROM_DTK386, { "Intel", cpus_i386SX, "AMD", cpus_Am386SX, "Cyrix", cpus_486SLC}, 0, MODEL_AT, 1, 16, 1, at_neat_init, NULL},
|
||||||
{"Phoenix 386 clone", ROM_PX386, { "Intel", cpus_i386SX, "AMD", cpus_Am386SX, "Cyrix", cpus_486SLC}, 0, MODEL_AT, 1, 16, 1, at_82335_init, NULL},
|
/* {"Phoenix 386 clone", ROM_PX386, { "Intel", cpus_i386SX, "AMD", cpus_Am386SX, "Cyrix", cpus_486SLC}, 0, MODEL_AT, 1, 16, 1, at_82335_init, NULL}, */
|
||||||
{"Amstrad MegaPC", ROM_MEGAPC, { "Intel", cpus_i386SX, "AMD", cpus_Am386SX, "Cyrix", cpus_486SLC}, 1, MODEL_AT|MODEL_PS2, 1, 16, 1, at_wd76c10_init, NULL},
|
{"Amstrad MegaPC", ROM_MEGAPC, { "Intel", cpus_i386SX, "AMD", cpus_Am386SX, "Cyrix", cpus_486SLC}, 1, MODEL_AT|MODEL_PS2, 1, 16, 1, at_wd76c10_init, NULL},
|
||||||
/* The MegaPC manual says 386DX model of the Amstrad PC70386 exists, but Sarah Walker just *had* to remove 386DX CPU's from some boards. */
|
/* The MegaPC manual says 386DX model of the Amstrad PC70386 exists, but Sarah Walker just *had* to remove 386DX CPU's from some boards. */
|
||||||
{"Amstrad MegaPC 386DX",ROM_MEGAPCDX, { "Intel", cpus_i386DX, "AMD", cpus_Am386DX, "Cyrix", cpus_486DLC}, 1, MODEL_AT|MODEL_PS2, 1, 16, 1, at_wd76c10_init, NULL},
|
{"Amstrad MegaPC 386DX",ROM_MEGAPCDX, { "Intel", cpus_i386DX, "AMD", cpus_Am386DX, "Cyrix", cpus_486DLC}, 1, MODEL_AT|MODEL_PS2, 1, 16, 1, at_wd76c10_init, NULL},
|
||||||
@@ -411,7 +411,7 @@ void at_scat_init()
|
|||||||
scat_init();
|
scat_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
void at_acer386sx_init()
|
/* void at_acer386sx_init()
|
||||||
{
|
{
|
||||||
at_init();
|
at_init();
|
||||||
acer386sx_init();
|
acer386sx_init();
|
||||||
@@ -421,7 +421,7 @@ void at_82335_init()
|
|||||||
{
|
{
|
||||||
at_init();
|
at_init();
|
||||||
i82335_init();
|
i82335_init();
|
||||||
}
|
} */
|
||||||
|
|
||||||
void at_wd76c10_init()
|
void at_wd76c10_init()
|
||||||
{
|
{
|
||||||
|
|||||||
12
src/nvr.c
12
src/nvr.c
@@ -209,7 +209,7 @@ void loadnvr()
|
|||||||
case ROM_IBMPS1_2011: f = romfopen(nvr_concat("ibmps1_2011.nvr"), "rb"); /*nvrmask = 127; */break;
|
case ROM_IBMPS1_2011: f = romfopen(nvr_concat("ibmps1_2011.nvr"), "rb"); /*nvrmask = 127; */break;
|
||||||
case ROM_IBMPS1_2121: f = romfopen(nvr_concat("ibmps1_2121.nvr"), "rb"); nvrmask = 127; break;
|
case ROM_IBMPS1_2121: f = romfopen(nvr_concat("ibmps1_2121.nvr"), "rb"); nvrmask = 127; break;
|
||||||
case ROM_IBMPS1_2121_ISA: f = romfopen(nvr_concat("ibmps1_2121_isa.nvr"), "rb"); nvrmask = 127; break;
|
case ROM_IBMPS1_2121_ISA: f = romfopen(nvr_concat("ibmps1_2121_isa.nvr"), "rb"); nvrmask = 127; break;
|
||||||
case ROM_IBMPS2_M30_286: f = romfopen("nvr/ibmps2_m30_286.nvr", "rb"); /*nvrmask = 127; */break;
|
case ROM_IBMPS2_M30_286: f = romfopen(nvr_concat("ibmps2_m30_286.nvr"), "rb"); /*nvrmask = 127; */break;
|
||||||
case ROM_CMDPC30: f = romfopen(nvr_concat("cmdpc30.nvr"), "rb"); nvrmask = 127; break;
|
case ROM_CMDPC30: f = romfopen(nvr_concat("cmdpc30.nvr"), "rb"); nvrmask = 127; break;
|
||||||
case ROM_AMI286: f = romfopen(nvr_concat("ami286.nvr"), "rb"); nvrmask = 127; break;
|
case ROM_AMI286: f = romfopen(nvr_concat("ami286.nvr"), "rb"); nvrmask = 127; break;
|
||||||
case ROM_AWARD286: f = romfopen(nvr_concat("award286.nvr"), "rb"); nvrmask = 127; break;
|
case ROM_AWARD286: f = romfopen(nvr_concat("award286.nvr"), "rb"); nvrmask = 127; break;
|
||||||
@@ -218,7 +218,7 @@ void loadnvr()
|
|||||||
case ROM_SPC4200P: f = romfopen(nvr_concat("spc4200p.nvr"), "rb"); nvrmask = 127; break;
|
case ROM_SPC4200P: f = romfopen(nvr_concat("spc4200p.nvr"), "rb"); nvrmask = 127; break;
|
||||||
case ROM_IBMAT386: f = romfopen(nvr_concat("at386.nvr"), "rb"); nvrmask = 127; break;
|
case ROM_IBMAT386: f = romfopen(nvr_concat("at386.nvr"), "rb"); nvrmask = 127; break;
|
||||||
case ROM_DESKPRO_386: f = romfopen(nvr_concat("deskpro386.nvr"), "rb"); break;
|
case ROM_DESKPRO_386: f = romfopen(nvr_concat("deskpro386.nvr"), "rb"); break;
|
||||||
case ROM_ACER386: f = romfopen(nvr_concat("acer386.nvr"), "rb"); nvrmask = 127; break;
|
/* case ROM_ACER386: f = romfopen(nvr_concat("acer386.nvr"), "rb"); nvrmask = 127; break; */
|
||||||
case ROM_MEGAPC: f = romfopen(nvr_concat("megapc.nvr"), "rb"); nvrmask = 127; break;
|
case ROM_MEGAPC: f = romfopen(nvr_concat("megapc.nvr"), "rb"); nvrmask = 127; break;
|
||||||
case ROM_MEGAPCDX: f = romfopen(nvr_concat("megapcdx.nvr"), "rb"); nvrmask = 127; break;
|
case ROM_MEGAPCDX: f = romfopen(nvr_concat("megapcdx.nvr"), "rb"); nvrmask = 127; break;
|
||||||
case ROM_AMI386SX: f = romfopen(nvr_concat("ami386.nvr"), "rb"); nvrmask = 127; break;
|
case ROM_AMI386SX: f = romfopen(nvr_concat("ami386.nvr"), "rb"); nvrmask = 127; break;
|
||||||
@@ -229,7 +229,7 @@ void loadnvr()
|
|||||||
case ROM_430VX: f = romfopen(nvr_concat("430vx.nvr"), "rb"); nvrmask = 127; break;
|
case ROM_430VX: f = romfopen(nvr_concat("430vx.nvr"), "rb"); nvrmask = 127; break;
|
||||||
case ROM_REVENGE: f = romfopen(nvr_concat("revenge.nvr"), "rb"); nvrmask = 127; break;
|
case ROM_REVENGE: f = romfopen(nvr_concat("revenge.nvr"), "rb"); nvrmask = 127; break;
|
||||||
case ROM_ENDEAVOR: f = romfopen(nvr_concat("endeavor.nvr"), "rb"); nvrmask = 127; break;
|
case ROM_ENDEAVOR: f = romfopen(nvr_concat("endeavor.nvr"), "rb"); nvrmask = 127; break;
|
||||||
case ROM_PX386: f = romfopen(nvr_concat("px386.nvr"), "rb"); nvrmask = 127; break;
|
/* case ROM_PX386: f = romfopen(nvr_concat("px386.nvr"), "rb"); nvrmask = 127; break; */
|
||||||
case ROM_DTK386: f = romfopen(nvr_concat("dtk386.nvr"), "rb"); nvrmask = 127; break;
|
case ROM_DTK386: f = romfopen(nvr_concat("dtk386.nvr"), "rb"); nvrmask = 127; break;
|
||||||
case ROM_MR386DX_OPTI495: f = romfopen(nvr_concat("mr386dx_opti495.nvr"), "rb"); nvrmask = 127; break;
|
case ROM_MR386DX_OPTI495: f = romfopen(nvr_concat("mr386dx_opti495.nvr"), "rb"); nvrmask = 127; break;
|
||||||
case ROM_AMI386DX_OPTI495: f = romfopen(nvr_concat("ami386dx_opti495.nvr"), "rb"); nvrmask = 127; break;
|
case ROM_AMI386DX_OPTI495: f = romfopen(nvr_concat("ami386dx_opti495.nvr"), "rb"); nvrmask = 127; break;
|
||||||
@@ -293,7 +293,7 @@ void savenvr()
|
|||||||
case ROM_IBMPS1_2011: f = romfopen(nvr_concat("ibmps1_2011.nvr"), "wb"); break;
|
case ROM_IBMPS1_2011: f = romfopen(nvr_concat("ibmps1_2011.nvr"), "wb"); break;
|
||||||
case ROM_IBMPS1_2121: f = romfopen(nvr_concat("ibmps1_2121.nvr"), "wb"); break;
|
case ROM_IBMPS1_2121: f = romfopen(nvr_concat("ibmps1_2121.nvr"), "wb"); break;
|
||||||
case ROM_IBMPS1_2121_ISA: f = romfopen(nvr_concat("ibmps1_2121_isa.nvr"), "wb"); break;
|
case ROM_IBMPS1_2121_ISA: f = romfopen(nvr_concat("ibmps1_2121_isa.nvr"), "wb"); break;
|
||||||
case ROM_IBMPS2_M30_286: f = romfopen("nvr/ibmps2_m30_286.nvr", "wb"); break;
|
case ROM_IBMPS2_M30_286: f = romfopen(nvr_concat("ibmps2_m30_286.nvr"), "wb"); break;
|
||||||
case ROM_CMDPC30: f = romfopen(nvr_concat("cmdpc30.nvr"), "wb"); break;
|
case ROM_CMDPC30: f = romfopen(nvr_concat("cmdpc30.nvr"), "wb"); break;
|
||||||
case ROM_AMI286: f = romfopen(nvr_concat("ami286.nvr"), "wb"); break;
|
case ROM_AMI286: f = romfopen(nvr_concat("ami286.nvr"), "wb"); break;
|
||||||
case ROM_AWARD286: f = romfopen(nvr_concat("award286.nvr"), "wb"); break;
|
case ROM_AWARD286: f = romfopen(nvr_concat("award286.nvr"), "wb"); break;
|
||||||
@@ -302,7 +302,7 @@ void savenvr()
|
|||||||
case ROM_SPC4200P: f = romfopen(nvr_concat("spc4200p.nvr"), "wb"); break;
|
case ROM_SPC4200P: f = romfopen(nvr_concat("spc4200p.nvr"), "wb"); break;
|
||||||
case ROM_IBMAT386: f = romfopen(nvr_concat("at386.nvr"), "wb"); break;
|
case ROM_IBMAT386: f = romfopen(nvr_concat("at386.nvr"), "wb"); break;
|
||||||
case ROM_DESKPRO_386: f = romfopen(nvr_concat("deskpro386.nvr"), "wb"); break;
|
case ROM_DESKPRO_386: f = romfopen(nvr_concat("deskpro386.nvr"), "wb"); break;
|
||||||
case ROM_ACER386: f = romfopen(nvr_concat("acer386.nvr"), "wb"); break;
|
/* case ROM_ACER386: f = romfopen(nvr_concat("acer386.nvr"), "wb"); break; */
|
||||||
case ROM_MEGAPC: f = romfopen(nvr_concat("megapc.nvr"), "wb"); break;
|
case ROM_MEGAPC: f = romfopen(nvr_concat("megapc.nvr"), "wb"); break;
|
||||||
case ROM_MEGAPCDX: f = romfopen(nvr_concat("megapcdx.nvr"), "wb"); break;
|
case ROM_MEGAPCDX: f = romfopen(nvr_concat("megapcdx.nvr"), "wb"); break;
|
||||||
case ROM_AMI386SX: f = romfopen(nvr_concat("ami386.nvr"), "wb"); break;
|
case ROM_AMI386SX: f = romfopen(nvr_concat("ami386.nvr"), "wb"); break;
|
||||||
@@ -313,7 +313,7 @@ void savenvr()
|
|||||||
case ROM_430VX: f = romfopen(nvr_concat("430vx.nvr"), "wb"); break;
|
case ROM_430VX: f = romfopen(nvr_concat("430vx.nvr"), "wb"); break;
|
||||||
case ROM_REVENGE: f = romfopen(nvr_concat("revenge.nvr"), "wb"); break;
|
case ROM_REVENGE: f = romfopen(nvr_concat("revenge.nvr"), "wb"); break;
|
||||||
case ROM_ENDEAVOR: f = romfopen(nvr_concat("endeavor.nvr"), "wb"); break;
|
case ROM_ENDEAVOR: f = romfopen(nvr_concat("endeavor.nvr"), "wb"); break;
|
||||||
case ROM_PX386: f = romfopen(nvr_concat("px386.nvr"), "wb"); break;
|
/* case ROM_PX386: f = romfopen(nvr_concat("px386.nvr"), "wb"); break; */
|
||||||
case ROM_DTK386: f = romfopen(nvr_concat("dtk386.nvr"), "wb"); break;
|
case ROM_DTK386: f = romfopen(nvr_concat("dtk386.nvr"), "wb"); break;
|
||||||
case ROM_MR386DX_OPTI495: f = romfopen(nvr_concat("mr386dx_opti495.nvr"), "wb"); break;
|
case ROM_MR386DX_OPTI495: f = romfopen(nvr_concat("mr386dx_opti495.nvr"), "wb"); break;
|
||||||
case ROM_AMI386DX_OPTI495: f = romfopen(nvr_concat("ami386dx_opti495.nvr"), "wb"); break;
|
case ROM_AMI386DX_OPTI495: f = romfopen(nvr_concat("ami386dx_opti495.nvr"), "wb"); break;
|
||||||
|
|||||||
364
src/vid_voodoo.c
364
src/vid_voodoo.c
@@ -181,6 +181,8 @@ typedef struct voodoo_params_t
|
|||||||
uint32_t front_offset;
|
uint32_t front_offset;
|
||||||
|
|
||||||
uint32_t swapbufferCMD;
|
uint32_t swapbufferCMD;
|
||||||
|
|
||||||
|
uint32_t stipple;
|
||||||
} voodoo_params_t;
|
} voodoo_params_t;
|
||||||
|
|
||||||
typedef struct texture_t
|
typedef struct texture_t
|
||||||
@@ -383,7 +385,7 @@ typedef struct voodoo_t
|
|||||||
uint8_t thefilterb[256][256]; // for blue
|
uint8_t thefilterb[256][256]; // for blue
|
||||||
|
|
||||||
/* the voodoo adds purple lines for some reason */
|
/* the voodoo adds purple lines for some reason */
|
||||||
uint16_t purpleline[1024];
|
uint16_t purpleline[256][3];
|
||||||
|
|
||||||
texture_t texture_cache[2][TEX_CACHE_MAX];
|
texture_t texture_cache[2][TEX_CACHE_MAX];
|
||||||
uint8_t texture_present[2][4096];
|
uint8_t texture_present[2][4096];
|
||||||
@@ -494,7 +496,7 @@ enum
|
|||||||
SST_chromaKey = 0x134,
|
SST_chromaKey = 0x134,
|
||||||
|
|
||||||
SST_userIntrCMD = 0x13c,
|
SST_userIntrCMD = 0x13c,
|
||||||
|
SST_stipple = 0x140,
|
||||||
SST_color0 = 0x144,
|
SST_color0 = 0x144,
|
||||||
SST_color1 = 0x148,
|
SST_color1 = 0x148,
|
||||||
|
|
||||||
@@ -4508,7 +4510,9 @@ static void voodoo_reg_writel(uint32_t addr, uint32_t val, void *p)
|
|||||||
voodoo->params.chromaKey_b = val & 0xff;
|
voodoo->params.chromaKey_b = val & 0xff;
|
||||||
voodoo->params.chromaKey = val & 0xffffff;
|
voodoo->params.chromaKey = val & 0xffffff;
|
||||||
break;
|
break;
|
||||||
|
case SST_stipple:
|
||||||
|
voodoo->params.stipple = val;
|
||||||
|
break;
|
||||||
case SST_color0:
|
case SST_color0:
|
||||||
voodoo->params.color0 = val;
|
voodoo->params.color0 = val;
|
||||||
break;
|
break;
|
||||||
@@ -5630,6 +5634,18 @@ static uint16_t voodoo_readw(uint32_t addr, void *p)
|
|||||||
return 0xffff;
|
return 0xffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void voodoo_flush(voodoo_t *voodoo)
|
||||||
|
{
|
||||||
|
voodoo->flush = 1;
|
||||||
|
while (!FIFO_EMPTY)
|
||||||
|
{
|
||||||
|
wake_fifo_thread_now(voodoo);
|
||||||
|
thread_wait_event(voodoo->fifo_not_full_event, 1);
|
||||||
|
}
|
||||||
|
wait_for_render_thread_idle(voodoo);
|
||||||
|
voodoo->flush = 0;
|
||||||
|
}
|
||||||
|
|
||||||
static uint32_t voodoo_readl(uint32_t addr, void *p)
|
static uint32_t voodoo_readl(uint32_t addr, void *p)
|
||||||
{
|
{
|
||||||
voodoo_t *voodoo = (voodoo_t *)p;
|
voodoo_t *voodoo = (voodoo_t *)p;
|
||||||
@@ -5676,18 +5692,47 @@ static uint32_t voodoo_readl(uint32_t addr, void *p)
|
|||||||
wake_fifo_thread(voodoo);
|
wake_fifo_thread(voodoo);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case SST_fbzColorPath:
|
||||||
|
voodoo_flush(voodoo);
|
||||||
|
temp = voodoo->params.fbzColorPath;
|
||||||
|
break;
|
||||||
|
case SST_fogMode:
|
||||||
|
voodoo_flush(voodoo);
|
||||||
|
temp = voodoo->params.fogMode;
|
||||||
|
break;
|
||||||
|
case SST_alphaMode:
|
||||||
|
voodoo_flush(voodoo);
|
||||||
|
temp = voodoo->params.alphaMode;
|
||||||
|
break;
|
||||||
|
case SST_fbzMode:
|
||||||
|
voodoo_flush(voodoo);
|
||||||
|
temp = voodoo->params.fbzMode;
|
||||||
|
break;
|
||||||
case SST_lfbMode:
|
case SST_lfbMode:
|
||||||
voodoo->flush = 1;
|
voodoo_flush(voodoo);
|
||||||
while (!FIFO_EMPTY)
|
|
||||||
{
|
|
||||||
wake_fifo_thread_now(voodoo);
|
|
||||||
thread_wait_event(voodoo->fifo_not_full_event, 1);
|
|
||||||
}
|
|
||||||
wait_for_render_thread_idle(voodoo);
|
|
||||||
voodoo->flush = 0;
|
|
||||||
|
|
||||||
temp = voodoo->lfbMode;
|
temp = voodoo->lfbMode;
|
||||||
break;
|
break;
|
||||||
|
case SST_clipLeftRight:
|
||||||
|
voodoo_flush(voodoo);
|
||||||
|
temp = voodoo->params.clipRight | (voodoo->params.clipLeft << 16);
|
||||||
|
break;
|
||||||
|
case SST_clipLowYHighY:
|
||||||
|
voodoo_flush(voodoo);
|
||||||
|
temp = voodoo->params.clipHighY | (voodoo->params.clipLowY << 16);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SST_stipple:
|
||||||
|
voodoo_flush(voodoo);
|
||||||
|
temp = voodoo->params.stipple;
|
||||||
|
break;
|
||||||
|
case SST_color0:
|
||||||
|
voodoo_flush(voodoo);
|
||||||
|
temp = voodoo->params.color0;
|
||||||
|
break;
|
||||||
|
case SST_color1:
|
||||||
|
voodoo_flush(voodoo);
|
||||||
|
temp = voodoo->params.color1;
|
||||||
|
break;
|
||||||
|
|
||||||
case SST_fbiPixelsIn:
|
case SST_fbiPixelsIn:
|
||||||
temp = voodoo->fbiPixelsIn & 0xffffff;
|
temp = voodoo->fbiPixelsIn & 0xffffff;
|
||||||
@@ -6470,11 +6515,16 @@ static void voodoo_calc_clutData(voodoo_t *voodoo)
|
|||||||
|
|
||||||
static int FILTCAP, FILTCAPG, FILTCAPB = 0; /* color filter threshold values */
|
static int FILTCAP, FILTCAPG, FILTCAPB = 0; /* color filter threshold values */
|
||||||
|
|
||||||
static void voodoo_generate_filter(voodoo_t *voodoo)
|
static void voodoo_generate_filter_v1(voodoo_t *voodoo)
|
||||||
{
|
{
|
||||||
int g, h;
|
int g, h;
|
||||||
float difference, diffg, diffb;
|
float difference, diffg, diffb;
|
||||||
float thiscol, thiscolg, thiscolb, lined;
|
float thiscol, thiscolg, thiscolb, lined;
|
||||||
|
float fcr, fcg, fcb;
|
||||||
|
|
||||||
|
fcr = FILTCAP * 5;
|
||||||
|
fcg = FILTCAPG * 6;
|
||||||
|
fcb = FILTCAPB * 5;
|
||||||
|
|
||||||
for (g=0;g<FILTDIV;g++) // pixel 1
|
for (g=0;g<FILTDIV;g++) // pixel 1
|
||||||
{
|
{
|
||||||
@@ -6484,6 +6534,8 @@ static void voodoo_generate_filter(voodoo_t *voodoo)
|
|||||||
diffg = difference;
|
diffg = difference;
|
||||||
diffb = difference;
|
diffb = difference;
|
||||||
|
|
||||||
|
thiscol = thiscolg = thiscolb = g;
|
||||||
|
|
||||||
if (difference > FILTCAP)
|
if (difference > FILTCAP)
|
||||||
difference = FILTCAP;
|
difference = FILTCAP;
|
||||||
if (difference < -FILTCAP)
|
if (difference < -FILTCAP)
|
||||||
@@ -6499,9 +6551,17 @@ static void voodoo_generate_filter(voodoo_t *voodoo)
|
|||||||
if (diffb < -FILTCAPB)
|
if (diffb < -FILTCAPB)
|
||||||
diffb = -FILTCAPB;
|
diffb = -FILTCAPB;
|
||||||
|
|
||||||
thiscol = g + (difference / 2);
|
// hack - to make it not bleed onto black
|
||||||
thiscolg = g + (diffg / 2); /* need these divides so we can actually undither! */
|
//if (g == 0){
|
||||||
thiscolb = g + (diffb / 2);
|
//difference = diffg = diffb = 0;
|
||||||
|
//}
|
||||||
|
|
||||||
|
if ((difference < fcr) || (-difference > -fcr))
|
||||||
|
thiscol = g + (difference / 2);
|
||||||
|
if ((diffg < fcg) || (-diffg > -fcg))
|
||||||
|
thiscolg = g + (diffg / 2); /* need these divides so we can actually undither! */
|
||||||
|
if ((diffb < fcb) || (-diffb > -fcb))
|
||||||
|
thiscolb = g + (diffb / 2);
|
||||||
|
|
||||||
if (thiscol < 0)
|
if (thiscol < 0)
|
||||||
thiscol = 0;
|
thiscol = 0;
|
||||||
@@ -6523,10 +6583,115 @@ static void voodoo_generate_filter(voodoo_t *voodoo)
|
|||||||
voodoo->thefilterb[g][h] = thiscolb;
|
voodoo->thefilterb[g][h] = thiscolb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lined = g + 4;
|
||||||
|
if (lined > 255)
|
||||||
|
lined = 255;
|
||||||
|
voodoo->purpleline[g][0] = lined;
|
||||||
|
voodoo->purpleline[g][2] = lined;
|
||||||
|
|
||||||
|
lined = g + 0;
|
||||||
|
if (lined > 255)
|
||||||
|
lined = 255;
|
||||||
|
voodoo->purpleline[g][1] = lined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void voodoo_generate_filter_v2(voodoo_t *voodoo)
|
||||||
|
{
|
||||||
|
int g, h;
|
||||||
|
float difference;
|
||||||
|
float thiscol, thiscolg, thiscolb, lined;
|
||||||
|
float clr, clg, clb = 0;
|
||||||
|
float fcr, fcg, fcb = 0;
|
||||||
|
|
||||||
|
// pre-clamping
|
||||||
|
|
||||||
|
fcr = FILTCAP;
|
||||||
|
fcg = FILTCAPG;
|
||||||
|
fcb = FILTCAPB;
|
||||||
|
|
||||||
|
if (fcr > 32) fcr = 32;
|
||||||
|
if (fcg > 32) fcg = 32;
|
||||||
|
if (fcb > 32) fcb = 32;
|
||||||
|
|
||||||
|
for (g=0;g<256;g++) // pixel 1 - our target pixel we want to bleed into
|
||||||
|
{
|
||||||
|
for (h=0;h<256;h++) // pixel 2 - our main pixel
|
||||||
|
{
|
||||||
|
float avg;
|
||||||
|
float avgdiff;
|
||||||
|
|
||||||
|
difference = (float)(g - h);
|
||||||
|
avg = (float)((g + g + g + g + h) / 5);
|
||||||
|
avgdiff = avg - (float)((g + h + h + h + h) / 5);
|
||||||
|
if (avgdiff < 0) avgdiff *= -1;
|
||||||
|
if (difference < 0) difference *= -1;
|
||||||
|
|
||||||
|
thiscol = thiscolg = thiscolb = g;
|
||||||
|
|
||||||
|
// try lighten
|
||||||
|
if (h > g)
|
||||||
|
{
|
||||||
|
clr = clg = clb = avgdiff;
|
||||||
|
|
||||||
|
if (clr>fcr) clr=fcr;
|
||||||
|
if (clg>fcg) clg=fcg;
|
||||||
|
if (clb>fcb) clb=fcb;
|
||||||
|
|
||||||
|
|
||||||
|
thiscol = g + clr;
|
||||||
|
thiscolg = g + clg;
|
||||||
|
thiscolb = g + clb;
|
||||||
|
|
||||||
|
if (thiscol>g+FILTCAP)
|
||||||
|
thiscol=g+FILTCAP;
|
||||||
|
if (thiscolg>g+FILTCAPG)
|
||||||
|
thiscolg=g+FILTCAPG;
|
||||||
|
if (thiscolb>g+FILTCAPB)
|
||||||
|
thiscolb=g+FILTCAPB;
|
||||||
|
|
||||||
|
|
||||||
|
if (thiscol>g+avgdiff)
|
||||||
|
thiscol=g+avgdiff;
|
||||||
|
if (thiscolg>g+avgdiff)
|
||||||
|
thiscolg=g+avgdiff;
|
||||||
|
if (thiscolb>g+avgdiff)
|
||||||
|
thiscolb=g+avgdiff;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (difference > FILTCAP)
|
||||||
|
thiscol = g;
|
||||||
|
if (difference > FILTCAPG)
|
||||||
|
thiscolg = g;
|
||||||
|
if (difference > FILTCAPB)
|
||||||
|
thiscolb = g;
|
||||||
|
|
||||||
|
// clamp
|
||||||
|
if (thiscol < 0) thiscol = 0;
|
||||||
|
if (thiscolg < 0) thiscolg = 0;
|
||||||
|
if (thiscolb < 0) thiscolb = 0;
|
||||||
|
|
||||||
|
if (thiscol > 255) thiscol = 255;
|
||||||
|
if (thiscolg > 255) thiscolg = 255;
|
||||||
|
if (thiscolb > 255) thiscolb = 255;
|
||||||
|
|
||||||
|
// add to the table
|
||||||
|
voodoo->thefilter[g][h] = (thiscol);
|
||||||
|
voodoo->thefilterg[g][h] = (thiscolg);
|
||||||
|
voodoo->thefilterb[g][h] = (thiscolb);
|
||||||
|
|
||||||
|
// debug the ones that don't give us much of a difference
|
||||||
|
//if (difference < FILTCAP)
|
||||||
|
//pclog("Voodoofilter: %ix%i - %f difference, %f average difference, R=%f, G=%f, B=%f\n", g, h, difference, avgdiff, thiscol, thiscolg, thiscolb);
|
||||||
|
}
|
||||||
|
|
||||||
lined = g + 3;
|
lined = g + 3;
|
||||||
if (lined > 255)
|
if (lined > 255)
|
||||||
lined = 255;
|
lined = 255;
|
||||||
voodoo->purpleline[g] = lined;
|
voodoo->purpleline[g][0] = lined;
|
||||||
|
voodoo->purpleline[g][1] = 0;
|
||||||
|
voodoo->purpleline[g][2] = lined;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6551,51 +6716,32 @@ static void voodoo_threshold_check(voodoo_t *voodoo)
|
|||||||
pclog("Voodoo Filter Threshold Check: %06x - RED %i GREEN %i BLUE %i\n", voodoo->scrfilterThreshold, r, g, b);
|
pclog("Voodoo Filter Threshold Check: %06x - RED %i GREEN %i BLUE %i\n", voodoo->scrfilterThreshold, r, g, b);
|
||||||
|
|
||||||
voodoo->scrfilterThresholdOld = voodoo->scrfilterThreshold;
|
voodoo->scrfilterThresholdOld = voodoo->scrfilterThreshold;
|
||||||
voodoo_generate_filter(voodoo);
|
|
||||||
|
if (voodoo->type == VOODOO_2)
|
||||||
|
voodoo_generate_filter_v2(voodoo);
|
||||||
|
else
|
||||||
|
voodoo_generate_filter_v1(voodoo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void voodoo_filterline(voodoo_t *voodoo, uint16_t *fil, int column, uint16_t *src, int line)
|
static void voodoo_filterline_v1(voodoo_t *voodoo, uint8_t *fil, int column, uint16_t *src, int line)
|
||||||
{
|
{
|
||||||
int x;
|
int x;
|
||||||
|
|
||||||
|
// Scratchpad for avoiding feedback streaks
|
||||||
|
uint8_t fil3[(voodoo->h_disp) * 3];
|
||||||
|
|
||||||
/* 16 to 32-bit */
|
/* 16 to 32-bit */
|
||||||
for (x=0; x<column;x++)
|
for (x=0; x<column;x++)
|
||||||
{
|
{
|
||||||
fil[x*3] = ((src[x] & 31) << 3);
|
fil[x*3] = ((src[x] & 31) << 3);
|
||||||
fil[x*3+1] = (((src[x] >> 5) & 63) << 2); /* Shift to 32-bit */
|
fil[x*3+1] = (((src[x] >> 5) & 63) << 2);
|
||||||
fil[x*3+2] = (((src[x] >> 11) & 31) << 3);
|
fil[x*3+2] = (((src[x] >> 11) & 31) << 3);
|
||||||
}
|
|
||||||
|
|
||||||
fil[x*3] = 0;
|
// Copy to our scratchpads
|
||||||
fil[x*3+1] = 0; /* Keep the compiler happy */
|
fil3[x*3+0] = fil[x*3+0];
|
||||||
fil[x*3+2] = 0;
|
fil3[x*3+1] = fil[x*3+1];
|
||||||
|
fil3[x*3+2] = fil[x*3+2];
|
||||||
/* filtering time */
|
|
||||||
|
|
||||||
for (x=1; x<column;x++)
|
|
||||||
{
|
|
||||||
fil[(x-1)*3] = voodoo->thefilterb[fil[x*3]][fil[ (x-1) *3]];
|
|
||||||
fil[(x-1)*3+1] = voodoo->thefilterg[fil[x*3+1]][fil[ (x-1) *3+1]];
|
|
||||||
fil[(x-1)*3+2] = voodoo->thefilter[fil[x*3+2]][fil[ (x-1) *3+2]];
|
|
||||||
}
|
|
||||||
for (x=0; x<column-1;x++)
|
|
||||||
{
|
|
||||||
fil[(x)*3] = voodoo->thefilterb[fil[x*3]][fil[ (x+1) *3]];
|
|
||||||
fil[(x)*3+1] = voodoo->thefilterg[fil[x*3+1]][fil[ (x+1) *3+1]];
|
|
||||||
fil[(x)*3+2] = voodoo->thefilter[fil[x*3+2]][fil[ (x+1) *3+2]];
|
|
||||||
}
|
|
||||||
for (x=1; x<column-1;x++)
|
|
||||||
{
|
|
||||||
fil[(x-1)*3] = voodoo->thefilterb[fil[x*3]][fil[ (x-1) *3]];
|
|
||||||
fil[(x-1)*3+1] = voodoo->thefilterg[fil[x*3+1]][fil[ (x-1) *3+1]];
|
|
||||||
fil[(x-1)*3+2] = voodoo->thefilter[fil[x*3+2]][fil[ (x-1) *3+2]];
|
|
||||||
}
|
|
||||||
for (x=1; x<column;x++)
|
|
||||||
{
|
|
||||||
fil[(x-1)*3] = voodoo->thefilterb[fil[x*3]][fil[ (x-1) *3]];
|
|
||||||
fil[(x-1)*3+1] = voodoo->thefilterg[fil[x*3+1]][fil[ (x-1) *3+1]];
|
|
||||||
fil[(x-1)*3+2] = voodoo->thefilter[fil[x*3+2]][fil[ (x-1) *3+2]];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -6605,12 +6751,110 @@ static void voodoo_filterline(voodoo_t *voodoo, uint16_t *fil, int column, uint1
|
|||||||
{
|
{
|
||||||
for (x=0; x<column;x++)
|
for (x=0; x<column;x++)
|
||||||
{
|
{
|
||||||
fil[x*3] = voodoo->purpleline[fil[x*3]];
|
fil[x*3] = voodoo->purpleline[fil[x*3]][0];
|
||||||
fil[x*3+2] = voodoo->purpleline[fil[x*3+2]];
|
fil[x*3+1] = voodoo->purpleline[fil[x*3+1]][1];
|
||||||
|
fil[x*3+2] = voodoo->purpleline[fil[x*3+2]][2];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* filtering time */
|
||||||
|
|
||||||
|
for (x=1; x<column;x++)
|
||||||
|
{
|
||||||
|
fil3[(x)*3] = voodoo->thefilterb[fil[x*3]][fil[ (x-1) *3]];
|
||||||
|
fil3[(x)*3+1] = voodoo->thefilterg[fil[x*3+1]][fil[ (x-1) *3+1]];
|
||||||
|
fil3[(x)*3+2] = voodoo->thefilter[fil[x*3+2]][fil[ (x-1) *3+2]];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (x=1; x<column;x++)
|
||||||
|
{
|
||||||
|
fil[(x)*3] = voodoo->thefilterb[fil3[x*3]][fil3[ (x-1) *3]];
|
||||||
|
fil[(x)*3+1] = voodoo->thefilterg[fil3[x*3+1]][fil3[ (x-1) *3+1]];
|
||||||
|
fil[(x)*3+2] = voodoo->thefilter[fil3[x*3+2]][fil3[ (x-1) *3+2]];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (x=1; x<column;x++)
|
||||||
|
{
|
||||||
|
fil3[(x)*3] = voodoo->thefilterb[fil[x*3]][fil[ (x-1) *3]];
|
||||||
|
fil3[(x)*3+1] = voodoo->thefilterg[fil[x*3+1]][fil[ (x-1) *3+1]];
|
||||||
|
fil3[(x)*3+2] = voodoo->thefilter[fil[x*3+2]][fil[ (x-1) *3+2]];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (x=0; x<column-1;x++)
|
||||||
|
{
|
||||||
|
fil[(x)*3] = voodoo->thefilterb[fil3[x*3]][fil3[ (x+1) *3]];
|
||||||
|
fil[(x)*3+1] = voodoo->thefilterg[fil3[x*3+1]][fil3[ (x+1) *3+1]];
|
||||||
|
fil[(x)*3+2] = voodoo->thefilter[fil3[x*3+2]][fil3[ (x+1) *3+2]];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void voodoo_filterline_v2(voodoo_t *voodoo, uint8_t *fil, int column, uint16_t *src, int line)
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
|
||||||
|
// Scratchpad for blending filter
|
||||||
|
uint8_t fil3[(voodoo->h_disp) * 3];
|
||||||
|
|
||||||
|
/* 16 to 32-bit */
|
||||||
|
for (x=0; x<column;x++)
|
||||||
|
{
|
||||||
|
// Blank scratchpads
|
||||||
|
fil3[x*3+0] = fil[x*3+0] = ((src[x] & 31) << 3);
|
||||||
|
fil3[x*3+1] = fil[x*3+1] = (((src[x] >> 5) & 63) << 2);
|
||||||
|
fil3[x*3+2] = fil[x*3+2] = (((src[x] >> 11) & 31) << 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* filtering time */
|
||||||
|
|
||||||
|
for (x=1; x<column-3;x++)
|
||||||
|
{
|
||||||
|
fil3[(x+3)*3] = voodoo->thefilterb [((src[x+3] & 31) << 3)] [((src[x] & 31) << 3)];
|
||||||
|
fil3[(x+3)*3+1] = voodoo->thefilterg [(((src[x+3] >> 5) & 63) << 2)] [(((src[x] >> 5) & 63) << 2)];
|
||||||
|
fil3[(x+3)*3+2] = voodoo->thefilter [(((src[x+3] >> 11) & 31) << 3)] [(((src[x] >> 11) & 31) << 3)];
|
||||||
|
|
||||||
|
fil[(x+2)*3] = voodoo->thefilterb [fil3[(x+2)*3]][((src[x] & 31) << 3)];
|
||||||
|
fil[(x+2)*3+1] = voodoo->thefilterg [fil3[(x+2)*3+1]][(((src[x] >> 5) & 63) << 2)];
|
||||||
|
fil[(x+2)*3+2] = voodoo->thefilter [fil3[(x+2)*3+2]][(((src[x] >> 11) & 31) << 3)];
|
||||||
|
|
||||||
|
fil3[(x+1)*3] = voodoo->thefilterb [fil[(x+1)*3]][((src[x] & 31) << 3)];
|
||||||
|
fil3[(x+1)*3+1] = voodoo->thefilterg [fil[(x+1)*3+1]][(((src[x] >> 5) & 63) << 2)];
|
||||||
|
fil3[(x+1)*3+2] = voodoo->thefilter [fil[(x+1)*3+2]][(((src[x] >> 11) & 31) << 3)];
|
||||||
|
|
||||||
|
fil[(x-1)*3] = voodoo->thefilterb [fil3[(x-1)*3]][((src[x] & 31) << 3)];
|
||||||
|
fil[(x-1)*3+1] = voodoo->thefilterg [fil3[(x-1)*3+1]][(((src[x] >> 5) & 63) << 2)];
|
||||||
|
fil[(x-1)*3+2] = voodoo->thefilter [fil3[(x-1)*3+2]][(((src[x] >> 11) & 31) << 3)];
|
||||||
|
}
|
||||||
|
|
||||||
|
// unroll for edge cases
|
||||||
|
|
||||||
|
fil3[(column-3)*3] = voodoo->thefilterb [((src[column-3] & 31) << 3)] [((src[column] & 31) << 3)];
|
||||||
|
fil3[(column-3)*3+1] = voodoo->thefilterg [(((src[column-3] >> 5) & 63) << 2)] [(((src[column] >> 5) & 63) << 2)];
|
||||||
|
fil3[(column-3)*3+2] = voodoo->thefilter [(((src[column-3] >> 11) & 31) << 3)] [(((src[column] >> 11) & 31) << 3)];
|
||||||
|
|
||||||
|
fil3[(column-2)*3] = voodoo->thefilterb [((src[column-2] & 31) << 3)] [((src[column] & 31) << 3)];
|
||||||
|
fil3[(column-2)*3+1] = voodoo->thefilterg [(((src[column-2] >> 5) & 63) << 2)] [(((src[column] >> 5) & 63) << 2)];
|
||||||
|
fil3[(column-2)*3+2] = voodoo->thefilter [(((src[column-2] >> 11) & 31) << 3)] [(((src[column] >> 11) & 31) << 3)];
|
||||||
|
|
||||||
|
fil3[(column-1)*3] = voodoo->thefilterb [((src[column-1] & 31) << 3)] [((src[column] & 31) << 3)];
|
||||||
|
fil3[(column-1)*3+1] = voodoo->thefilterg [(((src[column-1] >> 5) & 63) << 2)] [(((src[column] >> 5) & 63) << 2)];
|
||||||
|
fil3[(column-1)*3+2] = voodoo->thefilter [(((src[column-1] >> 11) & 31) << 3)] [(((src[column] >> 11) & 31) << 3)];
|
||||||
|
|
||||||
|
fil[(column-2)*3] = voodoo->thefilterb [fil3[(column-2)*3]][((src[column] & 31) << 3)];
|
||||||
|
fil[(column-2)*3+1] = voodoo->thefilterg [fil3[(column-2)*3+1]][(((src[column] >> 5) & 63) << 2)];
|
||||||
|
fil[(column-2)*3+2] = voodoo->thefilter [fil3[(column-2)*3+2]][(((src[column] >> 11) & 31) << 3)];
|
||||||
|
|
||||||
|
fil[(column-1)*3] = voodoo->thefilterb [fil3[(column-1)*3]][((src[column] & 31) << 3)];
|
||||||
|
fil[(column-1)*3+1] = voodoo->thefilterg [fil3[(column-1)*3+1]][(((src[column] >> 5) & 63) << 2)];
|
||||||
|
fil[(column-1)*3+2] = voodoo->thefilter [fil3[(column-1)*3+2]][(((src[column] >> 11) & 31) << 3)];
|
||||||
|
|
||||||
|
fil3[(column-1)*3] = voodoo->thefilterb [fil[(column-1)*3]][((src[column] & 31) << 3)];
|
||||||
|
fil3[(column-1)*3+1] = voodoo->thefilterg [fil[(column-1)*3+1]][(((src[column] >> 5) & 63) << 2)];
|
||||||
|
fil3[(column-1)*3+2] = voodoo->thefilter [fil[(column-1)*3+2]][(((src[column] >> 11) & 31) << 3)];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void voodoo_callback(void *p)
|
void voodoo_callback(void *p)
|
||||||
{
|
{
|
||||||
voodoo_t *voodoo = (voodoo_t *)p;
|
voodoo_t *voodoo = (voodoo_t *)p;
|
||||||
@@ -6640,9 +6884,12 @@ void voodoo_callback(void *p)
|
|||||||
if (voodoo->scrfilter && voodoo->scrfilterEnabled)
|
if (voodoo->scrfilter && voodoo->scrfilterEnabled)
|
||||||
{
|
{
|
||||||
int j, offset;
|
int j, offset;
|
||||||
uint16_t fil[(voodoo->h_disp + 1) * 3]; /* interleaved 24-bit RGB */
|
uint8_t fil[(voodoo->h_disp) * 3]; /* interleaved 24-bit RGB */
|
||||||
|
|
||||||
voodoo_filterline(voodoo, fil, voodoo->h_disp, src, voodoo->line);
|
if (voodoo->type == VOODOO_2)
|
||||||
|
voodoo_filterline_v2(voodoo, fil, voodoo->h_disp, src, voodoo->line);
|
||||||
|
else
|
||||||
|
voodoo_filterline_v1(voodoo, fil, voodoo->h_disp, src, voodoo->line);
|
||||||
|
|
||||||
for (x = 0; x < voodoo->h_disp; x++)
|
for (x = 0; x < voodoo->h_disp; x++)
|
||||||
{
|
{
|
||||||
@@ -6790,7 +7037,10 @@ void *voodoo_init()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
voodoo_generate_filter(voodoo); /*generate filter lookup tables*/
|
if (voodoo->type == VOODOO_2) /*generate filter lookup tables*/
|
||||||
|
voodoo_generate_filter_v2(voodoo);
|
||||||
|
else
|
||||||
|
voodoo_generate_filter_v1(voodoo);
|
||||||
|
|
||||||
pci_add(voodoo_pci_read, voodoo_pci_write, voodoo);
|
pci_add(voodoo_pci_read, voodoo_pci_write, voodoo);
|
||||||
|
|
||||||
|
|||||||
@@ -309,7 +309,7 @@ BOOL CALLBACK hdconf_common_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPAR
|
|||||||
fwrite(&zero, 1, 4, f); /* 00000000: Zero/unknown */
|
fwrite(&zero, 1, 4, f); /* 00000000: Zero/unknown */
|
||||||
fwrite(&zero, 1, 4, f); /* 00000004: Zero/unknown */
|
fwrite(&zero, 1, 4, f); /* 00000004: Zero/unknown */
|
||||||
fwrite(&base, 1, 4, f); /* 00000008: Offset at which data starts */
|
fwrite(&base, 1, 4, f); /* 00000008: Offset at which data starts */
|
||||||
fwrite(&full_size_bytes, 1, 8, f); /* 0000000C: Full size of the data (32-bit) */
|
fwrite(&full_size_bytes, 1, 4, f); /* 0000000C: Full size of the data (32-bit) */
|
||||||
fwrite(§or_size, 1, 4, f); /* 00000010: Sector size in bytes */
|
fwrite(§or_size, 1, 4, f); /* 00000010: Sector size in bytes */
|
||||||
fwrite(&hd_new_spt, 1, 4, f); /* 00000014: Sectors per cylinder */
|
fwrite(&hd_new_spt, 1, 4, f); /* 00000014: Sectors per cylinder */
|
||||||
fwrite(&hd_new_hpc, 1, 4, f); /* 00000018: Heads per cylinder */
|
fwrite(&hd_new_hpc, 1, 4, f); /* 00000018: Heads per cylinder */
|
||||||
|
|||||||
Reference in New Issue
Block a user