Various changes to FDC emulation.
Support for multiple disc image formats. Added preliminary FDI support.
This commit is contained in:
parent
37fe4a56be
commit
a8159f8c09
20 changed files with 3797 additions and 393 deletions
|
|
@ -17,8 +17,8 @@ pcem_LDADD = $(allegro_LIBS) -lopenal -lalut
|
||||||
pcem_SOURCES = 386.c 808x.c acer386sx.c ali1429.c allegro-gui.c allegro-gui-configure.c \
|
pcem_SOURCES = 386.c 808x.c acer386sx.c ali1429.c allegro-gui.c allegro-gui-configure.c \
|
||||||
allegro-gui-hdconf.c allegro-joystick.c allegro-keyboard.c allegro-main.c \
|
allegro-gui-hdconf.c allegro-joystick.c allegro-keyboard.c allegro-main.c \
|
||||||
allegro-midi.c allegro-mouse.c allegro-video.c amstrad.c cdrom-ioctl-linux.c cdrom-null.c \
|
allegro-midi.c allegro-mouse.c allegro-video.c amstrad.c cdrom-ioctl-linux.c cdrom-null.c \
|
||||||
config.c cpu.c dac.c device.c dma.c fdc.c gameport.c headland.c i430lx.c i430fx.c i430vx.c \
|
config.c cpu.c dac.c device.c disc.c disc_fdi.c disc_img.c dma.c fdc.c fdi2raw.c gameport.c \
|
||||||
ide.c intel.c intel_flash.c io.c jim.c \
|
headland.c i430lx.c i430fx.c i430vx.c ide.c intel.c intel_flash.c io.c jim.c \
|
||||||
keyboard.c keyboard_amstrad.c keyboard_at.c keyboard_olim24.c keyboard_pcjr.c keyboard_xt.c \
|
keyboard.c keyboard_amstrad.c keyboard_at.c keyboard_olim24.c keyboard_pcjr.c keyboard_xt.c \
|
||||||
linux-time.c lpt.c mcr.c mem.c model.c mouse.c mouse_ps2.c mouse_serial.c neat.c nmi.c nvr.c \
|
linux-time.c lpt.c mcr.c mem.c model.c mouse.c mouse_ps2.c mouse_serial.c neat.c nmi.c nvr.c \
|
||||||
olivetti_m24.c opti.c pc.c pci.c pic.c piix.c pit.c ppi.c rom.c serial.c sis496.c sound.c \
|
olivetti_m24.c opti.c pc.c pci.c pic.c piix.c pit.c ppi.c rom.c serial.c sis496.c sound.c \
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,9 @@ am_pcem_OBJECTS = pcem-386.$(OBJEXT) pcem-808x.$(OBJEXT) \
|
||||||
pcem-allegro-video.$(OBJEXT) pcem-amstrad.$(OBJEXT) \
|
pcem-allegro-video.$(OBJEXT) pcem-amstrad.$(OBJEXT) \
|
||||||
pcem-cdrom-ioctl-linux.$(OBJEXT) pcem-cdrom-null.$(OBJEXT) \
|
pcem-cdrom-ioctl-linux.$(OBJEXT) pcem-cdrom-null.$(OBJEXT) \
|
||||||
pcem-config.$(OBJEXT) pcem-cpu.$(OBJEXT) pcem-dac.$(OBJEXT) \
|
pcem-config.$(OBJEXT) pcem-cpu.$(OBJEXT) pcem-dac.$(OBJEXT) \
|
||||||
pcem-device.$(OBJEXT) pcem-dma.$(OBJEXT) pcem-fdc.$(OBJEXT) \
|
pcem-device.$(OBJEXT) pcem-disc.$(OBJEXT) \
|
||||||
|
pcem-disc_fdi.$(OBJEXT) pcem-disc_img.$(OBJEXT) \
|
||||||
|
pcem-dma.$(OBJEXT) pcem-fdc.$(OBJEXT) pcem-fdi2raw.$(OBJEXT) \
|
||||||
pcem-gameport.$(OBJEXT) pcem-headland.$(OBJEXT) \
|
pcem-gameport.$(OBJEXT) pcem-headland.$(OBJEXT) \
|
||||||
pcem-i430lx.$(OBJEXT) pcem-i430fx.$(OBJEXT) \
|
pcem-i430lx.$(OBJEXT) pcem-i430fx.$(OBJEXT) \
|
||||||
pcem-i430vx.$(OBJEXT) pcem-ide.$(OBJEXT) pcem-intel.$(OBJEXT) \
|
pcem-i430vx.$(OBJEXT) pcem-ide.$(OBJEXT) pcem-intel.$(OBJEXT) \
|
||||||
|
|
@ -231,8 +233,8 @@ pcem_LDADD = $(allegro_LIBS) -lopenal -lalut
|
||||||
pcem_SOURCES = 386.c 808x.c acer386sx.c ali1429.c allegro-gui.c allegro-gui-configure.c \
|
pcem_SOURCES = 386.c 808x.c acer386sx.c ali1429.c allegro-gui.c allegro-gui-configure.c \
|
||||||
allegro-gui-hdconf.c allegro-joystick.c allegro-keyboard.c allegro-main.c \
|
allegro-gui-hdconf.c allegro-joystick.c allegro-keyboard.c allegro-main.c \
|
||||||
allegro-midi.c allegro-mouse.c allegro-video.c amstrad.c cdrom-ioctl-linux.c cdrom-null.c \
|
allegro-midi.c allegro-mouse.c allegro-video.c amstrad.c cdrom-ioctl-linux.c cdrom-null.c \
|
||||||
config.c cpu.c dac.c device.c dma.c fdc.c gameport.c headland.c i430lx.c i430fx.c i430vx.c \
|
config.c cpu.c dac.c device.c disc.c disc_fdi.c disc_img.c dma.c fdc.c fdi2raw.c gameport.c \
|
||||||
ide.c intel.c intel_flash.c io.c jim.c \
|
headland.c i430lx.c i430fx.c i430vx.c ide.c intel.c intel_flash.c io.c jim.c \
|
||||||
keyboard.c keyboard_amstrad.c keyboard_at.c keyboard_olim24.c keyboard_pcjr.c keyboard_xt.c \
|
keyboard.c keyboard_amstrad.c keyboard_at.c keyboard_olim24.c keyboard_pcjr.c keyboard_xt.c \
|
||||||
linux-time.c lpt.c mcr.c mem.c model.c mouse.c mouse_ps2.c mouse_serial.c neat.c nmi.c nvr.c \
|
linux-time.c lpt.c mcr.c mem.c model.c mouse.c mouse_ps2.c mouse_serial.c neat.c nmi.c nvr.c \
|
||||||
olivetti_m24.c opti.c pc.c pci.c pic.c piix.c pit.c ppi.c rom.c serial.c sis496.c sound.c \
|
olivetti_m24.c opti.c pc.c pci.c pic.c piix.c pit.c ppi.c rom.c serial.c sis496.c sound.c \
|
||||||
|
|
@ -360,8 +362,12 @@ distclean-compile:
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcem-cpu.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcem-cpu.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcem-dac.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcem-dac.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcem-device.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcem-device.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcem-disc.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcem-disc_fdi.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcem-disc_img.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcem-dma.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcem-dma.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcem-fdc.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcem-fdc.Po@am__quote@
|
||||||
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcem-fdi2raw.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcem-gameport.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcem-gameport.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcem-headland.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcem-headland.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcem-i430fx.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcem-i430fx.Po@am__quote@
|
||||||
|
|
@ -769,6 +775,48 @@ pcem-device.obj: device.c
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcem_CFLAGS) $(CFLAGS) -c -o pcem-device.obj `if test -f 'device.c'; then $(CYGPATH_W) 'device.c'; else $(CYGPATH_W) '$(srcdir)/device.c'; fi`
|
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcem_CFLAGS) $(CFLAGS) -c -o pcem-device.obj `if test -f 'device.c'; then $(CYGPATH_W) 'device.c'; else $(CYGPATH_W) '$(srcdir)/device.c'; fi`
|
||||||
|
|
||||||
|
pcem-disc.o: disc.c
|
||||||
|
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcem_CFLAGS) $(CFLAGS) -MT pcem-disc.o -MD -MP -MF $(DEPDIR)/pcem-disc.Tpo -c -o pcem-disc.o `test -f 'disc.c' || echo '$(srcdir)/'`disc.c
|
||||||
|
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pcem-disc.Tpo $(DEPDIR)/pcem-disc.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='disc.c' object='pcem-disc.o' libtool=no @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcem_CFLAGS) $(CFLAGS) -c -o pcem-disc.o `test -f 'disc.c' || echo '$(srcdir)/'`disc.c
|
||||||
|
|
||||||
|
pcem-disc.obj: disc.c
|
||||||
|
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcem_CFLAGS) $(CFLAGS) -MT pcem-disc.obj -MD -MP -MF $(DEPDIR)/pcem-disc.Tpo -c -o pcem-disc.obj `if test -f 'disc.c'; then $(CYGPATH_W) 'disc.c'; else $(CYGPATH_W) '$(srcdir)/disc.c'; fi`
|
||||||
|
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pcem-disc.Tpo $(DEPDIR)/pcem-disc.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='disc.c' object='pcem-disc.obj' libtool=no @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcem_CFLAGS) $(CFLAGS) -c -o pcem-disc.obj `if test -f 'disc.c'; then $(CYGPATH_W) 'disc.c'; else $(CYGPATH_W) '$(srcdir)/disc.c'; fi`
|
||||||
|
|
||||||
|
pcem-disc_fdi.o: disc_fdi.c
|
||||||
|
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcem_CFLAGS) $(CFLAGS) -MT pcem-disc_fdi.o -MD -MP -MF $(DEPDIR)/pcem-disc_fdi.Tpo -c -o pcem-disc_fdi.o `test -f 'disc_fdi.c' || echo '$(srcdir)/'`disc_fdi.c
|
||||||
|
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pcem-disc_fdi.Tpo $(DEPDIR)/pcem-disc_fdi.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='disc_fdi.c' object='pcem-disc_fdi.o' libtool=no @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcem_CFLAGS) $(CFLAGS) -c -o pcem-disc_fdi.o `test -f 'disc_fdi.c' || echo '$(srcdir)/'`disc_fdi.c
|
||||||
|
|
||||||
|
pcem-disc_fdi.obj: disc_fdi.c
|
||||||
|
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcem_CFLAGS) $(CFLAGS) -MT pcem-disc_fdi.obj -MD -MP -MF $(DEPDIR)/pcem-disc_fdi.Tpo -c -o pcem-disc_fdi.obj `if test -f 'disc_fdi.c'; then $(CYGPATH_W) 'disc_fdi.c'; else $(CYGPATH_W) '$(srcdir)/disc_fdi.c'; fi`
|
||||||
|
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pcem-disc_fdi.Tpo $(DEPDIR)/pcem-disc_fdi.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='disc_fdi.c' object='pcem-disc_fdi.obj' libtool=no @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcem_CFLAGS) $(CFLAGS) -c -o pcem-disc_fdi.obj `if test -f 'disc_fdi.c'; then $(CYGPATH_W) 'disc_fdi.c'; else $(CYGPATH_W) '$(srcdir)/disc_fdi.c'; fi`
|
||||||
|
|
||||||
|
pcem-disc_img.o: disc_img.c
|
||||||
|
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcem_CFLAGS) $(CFLAGS) -MT pcem-disc_img.o -MD -MP -MF $(DEPDIR)/pcem-disc_img.Tpo -c -o pcem-disc_img.o `test -f 'disc_img.c' || echo '$(srcdir)/'`disc_img.c
|
||||||
|
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pcem-disc_img.Tpo $(DEPDIR)/pcem-disc_img.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='disc_img.c' object='pcem-disc_img.o' libtool=no @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcem_CFLAGS) $(CFLAGS) -c -o pcem-disc_img.o `test -f 'disc_img.c' || echo '$(srcdir)/'`disc_img.c
|
||||||
|
|
||||||
|
pcem-disc_img.obj: disc_img.c
|
||||||
|
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcem_CFLAGS) $(CFLAGS) -MT pcem-disc_img.obj -MD -MP -MF $(DEPDIR)/pcem-disc_img.Tpo -c -o pcem-disc_img.obj `if test -f 'disc_img.c'; then $(CYGPATH_W) 'disc_img.c'; else $(CYGPATH_W) '$(srcdir)/disc_img.c'; fi`
|
||||||
|
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pcem-disc_img.Tpo $(DEPDIR)/pcem-disc_img.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='disc_img.c' object='pcem-disc_img.obj' libtool=no @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcem_CFLAGS) $(CFLAGS) -c -o pcem-disc_img.obj `if test -f 'disc_img.c'; then $(CYGPATH_W) 'disc_img.c'; else $(CYGPATH_W) '$(srcdir)/disc_img.c'; fi`
|
||||||
|
|
||||||
pcem-dma.o: dma.c
|
pcem-dma.o: dma.c
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcem_CFLAGS) $(CFLAGS) -MT pcem-dma.o -MD -MP -MF $(DEPDIR)/pcem-dma.Tpo -c -o pcem-dma.o `test -f 'dma.c' || echo '$(srcdir)/'`dma.c
|
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcem_CFLAGS) $(CFLAGS) -MT pcem-dma.o -MD -MP -MF $(DEPDIR)/pcem-dma.Tpo -c -o pcem-dma.o `test -f 'dma.c' || echo '$(srcdir)/'`dma.c
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pcem-dma.Tpo $(DEPDIR)/pcem-dma.Po
|
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pcem-dma.Tpo $(DEPDIR)/pcem-dma.Po
|
||||||
|
|
@ -797,6 +845,20 @@ pcem-fdc.obj: fdc.c
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcem_CFLAGS) $(CFLAGS) -c -o pcem-fdc.obj `if test -f 'fdc.c'; then $(CYGPATH_W) 'fdc.c'; else $(CYGPATH_W) '$(srcdir)/fdc.c'; fi`
|
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcem_CFLAGS) $(CFLAGS) -c -o pcem-fdc.obj `if test -f 'fdc.c'; then $(CYGPATH_W) 'fdc.c'; else $(CYGPATH_W) '$(srcdir)/fdc.c'; fi`
|
||||||
|
|
||||||
|
pcem-fdi2raw.o: fdi2raw.c
|
||||||
|
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcem_CFLAGS) $(CFLAGS) -MT pcem-fdi2raw.o -MD -MP -MF $(DEPDIR)/pcem-fdi2raw.Tpo -c -o pcem-fdi2raw.o `test -f 'fdi2raw.c' || echo '$(srcdir)/'`fdi2raw.c
|
||||||
|
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pcem-fdi2raw.Tpo $(DEPDIR)/pcem-fdi2raw.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fdi2raw.c' object='pcem-fdi2raw.o' libtool=no @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcem_CFLAGS) $(CFLAGS) -c -o pcem-fdi2raw.o `test -f 'fdi2raw.c' || echo '$(srcdir)/'`fdi2raw.c
|
||||||
|
|
||||||
|
pcem-fdi2raw.obj: fdi2raw.c
|
||||||
|
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcem_CFLAGS) $(CFLAGS) -MT pcem-fdi2raw.obj -MD -MP -MF $(DEPDIR)/pcem-fdi2raw.Tpo -c -o pcem-fdi2raw.obj `if test -f 'fdi2raw.c'; then $(CYGPATH_W) 'fdi2raw.c'; else $(CYGPATH_W) '$(srcdir)/fdi2raw.c'; fi`
|
||||||
|
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pcem-fdi2raw.Tpo $(DEPDIR)/pcem-fdi2raw.Po
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fdi2raw.c' object='pcem-fdi2raw.obj' libtool=no @AMDEPBACKSLASH@
|
||||||
|
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
|
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcem_CFLAGS) $(CFLAGS) -c -o pcem-fdi2raw.obj `if test -f 'fdi2raw.c'; then $(CYGPATH_W) 'fdi2raw.c'; else $(CYGPATH_W) '$(srcdir)/fdi2raw.c'; fi`
|
||||||
|
|
||||||
pcem-gameport.o: gameport.c
|
pcem-gameport.o: gameport.c
|
||||||
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcem_CFLAGS) $(CFLAGS) -MT pcem-gameport.o -MD -MP -MF $(DEPDIR)/pcem-gameport.Tpo -c -o pcem-gameport.o `test -f 'gameport.c' || echo '$(srcdir)/'`gameport.c
|
@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pcem_CFLAGS) $(CFLAGS) -MT pcem-gameport.o -MD -MP -MF $(DEPDIR)/pcem-gameport.Tpo -c -o pcem-gameport.o `test -f 'gameport.c' || echo '$(srcdir)/'`gameport.c
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pcem-gameport.Tpo $(DEPDIR)/pcem-gameport.Po
|
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/pcem-gameport.Tpo $(DEPDIR)/pcem-gameport.Po
|
||||||
|
|
|
||||||
|
|
@ -5,11 +5,11 @@ WINDRES = windres.exe
|
||||||
CFLAGS = -O3 -march=i686 -fomit-frame-pointer
|
CFLAGS = -O3 -march=i686 -fomit-frame-pointer
|
||||||
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad.o cdrom-ioctl.o \
|
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad.o cdrom-ioctl.o \
|
||||||
codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_pentium.o codegen_x86.o config.o cpu.o dac.o \
|
codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_pentium.o codegen_x86.o config.o cpu.o dac.o \
|
||||||
device.o dma.o fdc.o gameport.o headland.o i430lx.o i430fx.o i430vx.o ide.o intel.o \
|
device.o disc.o disc_fdi.o disc_img.o dma.o fdc.o fdi2raw.o gameport.o headland.o i430lx.o i430fx.o \
|
||||||
intel_flash.o io.o jim.o keyboard.o keyboard_amstrad.o keyboard_at.o keyboard_olim24.o \
|
i430vx.o ide.o intel.o intel_flash.o io.o jim.o keyboard.o keyboard_amstrad.o keyboard_at.o \
|
||||||
keyboard_pcjr.o keyboard_xt.o lpt.o mcr.o mem.o model.o mouse.o mouse_ps2.o mouse_serial.o \
|
keyboard_olim24.o keyboard_pcjr.o keyboard_xt.o lpt.o mcr.o mem.o model.o mouse.o mouse_ps2.o \
|
||||||
neat.o nmi.o nvr.o olivetti_m24.o opti.o pc.o pci.o pic.o piix.o pit.o ppi.o rom.o serial.o \
|
mouse_serial.o neat.o nmi.o nvr.o olivetti_m24.o opti.o pc.o pci.o pic.o piix.o pit.o ppi.o rom.o \
|
||||||
sis496.o sound.o sound_ad1848.o sound_adlib.o sound_adlibgold.o sound_cms.o sound_dbopl.o \
|
serial.o sis496.o sound.o sound_ad1848.o sound_adlib.o sound_adlibgold.o sound_cms.o sound_dbopl.o \
|
||||||
sound_emu8k.o sound_gus.o sound_mpu401_uart.o sound_opl.o sound_pas16.o sound_resid.o \
|
sound_emu8k.o sound_gus.o sound_mpu401_uart.o sound_opl.o sound_pas16.o sound_resid.o \
|
||||||
sound_sb.o sound_sb_dsp.o sound_sn76489.o sound_speaker.o sound_ssi2001.o sound_wss.o \
|
sound_sb.o sound_sb_dsp.o sound_sn76489.o sound_speaker.o sound_ssi2001.o sound_wss.o \
|
||||||
soundopenal.o timer.o um8881f.o um8669f.o vid_ati_eeprom.o vid_ati_mach64.o vid_ati18800.o \
|
soundopenal.o timer.o um8881f.o um8669f.o vid_ati_eeprom.o vid_ati_mach64.o vid_ati18800.o \
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
#include "allegro-main.h"
|
#include "allegro-main.h"
|
||||||
#include "allegro-gui.h"
|
#include "allegro-gui.h"
|
||||||
#include "device.h"
|
#include "device.h"
|
||||||
|
#include "disc.h"
|
||||||
#include "ide.h"
|
#include "ide.h"
|
||||||
|
|
||||||
static int file_return(void)
|
static int file_return(void)
|
||||||
|
|
@ -35,11 +36,11 @@ static int disc_load_a()
|
||||||
int ret;
|
int ret;
|
||||||
int xsize = SCREEN_W - 32, ysize = SCREEN_H - 64;
|
int xsize = SCREEN_W - 32, ysize = SCREEN_H - 64;
|
||||||
strcpy(fn, discfns[0]);
|
strcpy(fn, discfns[0]);
|
||||||
ret = file_select_ex("Please choose a disc image", fn, "IMG;IMA", 260, xsize, ysize);
|
ret = file_select_ex("Please choose a disc image", fn, "IMG;IMA;FDI", 260, xsize, ysize);
|
||||||
if (ret)
|
if (ret)
|
||||||
{
|
{
|
||||||
savedisc(0);
|
disc_close(0);
|
||||||
loaddisc(0, fn);
|
disc_load(0, fn);
|
||||||
saveconfig();
|
saveconfig();
|
||||||
}
|
}
|
||||||
return D_O_K;
|
return D_O_K;
|
||||||
|
|
@ -51,11 +52,11 @@ static int disc_load_b()
|
||||||
int ret;
|
int ret;
|
||||||
int xsize = SCREEN_W - 32, ysize = SCREEN_H - 64;
|
int xsize = SCREEN_W - 32, ysize = SCREEN_H - 64;
|
||||||
strcpy(fn, discfns[1]);
|
strcpy(fn, discfns[1]);
|
||||||
ret = file_select_ex("Please choose a disc image", fn, "IMG;IMA", 260, xsize, ysize);
|
ret = file_select_ex("Please choose a disc image", fn, "IMG;IMA;FDI", 260, xsize, ysize);
|
||||||
if (ret)
|
if (ret)
|
||||||
{
|
{
|
||||||
savedisc(1);
|
disc_close(1);
|
||||||
loaddisc(1, fn);
|
disc_load(1, fn);
|
||||||
saveconfig();
|
saveconfig();
|
||||||
}
|
}
|
||||||
return D_O_K;
|
return D_O_K;
|
||||||
|
|
@ -63,8 +64,7 @@ static int disc_load_b()
|
||||||
|
|
||||||
static int disc_eject_a()
|
static int disc_eject_a()
|
||||||
{
|
{
|
||||||
savedisc(0);
|
disc_close(0);
|
||||||
ejectdisc(0);
|
|
||||||
saveconfig();
|
saveconfig();
|
||||||
|
|
||||||
return D_O_K;
|
return D_O_K;
|
||||||
|
|
@ -72,8 +72,7 @@ static int disc_eject_a()
|
||||||
|
|
||||||
static int disc_eject_b()
|
static int disc_eject_b()
|
||||||
{
|
{
|
||||||
savedisc(1);
|
disc_close(1);
|
||||||
ejectdisc(1);
|
|
||||||
saveconfig();
|
saveconfig();
|
||||||
|
|
||||||
return D_O_K;
|
return D_O_K;
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
#define get_filename allegro_get_filename
|
#define get_filename allegro_get_filename
|
||||||
#define append_filename allegro_append_filename
|
#define append_filename allegro_append_filename
|
||||||
#define put_backslash allegro_put_backslash
|
#define put_backslash allegro_put_backslash
|
||||||
|
#define get_extension allegro_get_extension
|
||||||
#define GFX_VGA allegro_GFX_VGA
|
#define GFX_VGA allegro_GFX_VGA
|
||||||
|
|
||||||
#include <allegro.h>
|
#include <allegro.h>
|
||||||
|
|
@ -13,3 +14,4 @@
|
||||||
#undef get_filename
|
#undef get_filename
|
||||||
#undef append_filename
|
#undef append_filename
|
||||||
#undef put_backslash
|
#undef put_backslash
|
||||||
|
#undef get_extension
|
||||||
|
|
|
||||||
16
src/config.c
16
src/config.c
|
|
@ -354,6 +354,22 @@ void put_backslash(char *s)
|
||||||
s[c] = '/';
|
s[c] = '/';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *get_extension(char *s)
|
||||||
|
{
|
||||||
|
int c = strlen(s) - 1;
|
||||||
|
|
||||||
|
if (c <= 0)
|
||||||
|
return s;
|
||||||
|
|
||||||
|
while (c && s[c] != '.')
|
||||||
|
c--;
|
||||||
|
|
||||||
|
if (!c)
|
||||||
|
return &s[strlen(s)];
|
||||||
|
|
||||||
|
return &s[c+1];
|
||||||
|
}
|
||||||
|
|
||||||
void config_save(char *fn)
|
void config_save(char *fn)
|
||||||
{
|
{
|
||||||
FILE *f = fopen(fn, "wt");
|
FILE *f = fopen(fn, "wt");
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ void config_set_string(char *head, char *name, char *val);
|
||||||
char *get_filename(char *s);
|
char *get_filename(char *s);
|
||||||
void append_filename(char *dest, char *s1, char *s2, int size);
|
void append_filename(char *dest, char *s1, char *s2, int size);
|
||||||
void put_backslash(char *s);
|
void put_backslash(char *s);
|
||||||
|
char *get_extension(char *s);
|
||||||
|
|
||||||
void config_load(char *fn);
|
void config_load(char *fn);
|
||||||
void config_save(char *fn);
|
void config_save(char *fn);
|
||||||
|
|
|
||||||
203
src/disc.c
Normal file
203
src/disc.c
Normal file
|
|
@ -0,0 +1,203 @@
|
||||||
|
#include "ibm.h"
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "disc.h"
|
||||||
|
#include "disc_fdi.h"
|
||||||
|
#include "disc_img.h"
|
||||||
|
#include "fdc.h"
|
||||||
|
#include "timer.h"
|
||||||
|
|
||||||
|
int disc_drivesel = 0;
|
||||||
|
int disc_poll_time = 16;
|
||||||
|
|
||||||
|
int disc_track[2];
|
||||||
|
int writeprot[2], fwriteprot[2];
|
||||||
|
|
||||||
|
DRIVE drives[2];
|
||||||
|
|
||||||
|
int curdrive = 0;
|
||||||
|
|
||||||
|
//char discfns[2][260] = {"", ""};
|
||||||
|
int defaultwriteprot = 0;
|
||||||
|
|
||||||
|
int fdc_time;
|
||||||
|
int disc_time;
|
||||||
|
|
||||||
|
int fdc_ready;
|
||||||
|
|
||||||
|
int drive_empty[2] = {1, 1};
|
||||||
|
int disc_changed[2];
|
||||||
|
|
||||||
|
int motorspin;
|
||||||
|
int motoron;
|
||||||
|
|
||||||
|
int fdc_indexcount = 52;
|
||||||
|
|
||||||
|
/*void (*fdc_callback)();
|
||||||
|
void (*fdc_data)(uint8_t dat);
|
||||||
|
void (*fdc_spindown)();
|
||||||
|
void (*fdc_finishread)();
|
||||||
|
void (*fdc_notfound)();
|
||||||
|
void (*fdc_datacrcerror)();
|
||||||
|
void (*fdc_headercrcerror)();
|
||||||
|
void (*fdc_writeprotect)();
|
||||||
|
int (*fdc_getdata)(int last);
|
||||||
|
void (*fdc_sectorid)(uint8_t track, uint8_t side, uint8_t sector, uint8_t size, uint8_t crc1, uint8_t crc2);
|
||||||
|
void (*fdc_indexpulse)();*/
|
||||||
|
|
||||||
|
static struct
|
||||||
|
{
|
||||||
|
char *ext;
|
||||||
|
void (*load)(int drive, char *fn);
|
||||||
|
void (*close)(int drive);
|
||||||
|
int size;
|
||||||
|
}
|
||||||
|
loaders[]=
|
||||||
|
{
|
||||||
|
{"IMG", img_load, img_close, -1},
|
||||||
|
{"IMA", img_load, img_close, -1},
|
||||||
|
{"FDI", fdi_load, fdi_close, -1},
|
||||||
|
{0,0,0}
|
||||||
|
};
|
||||||
|
|
||||||
|
static int driveloaders[4];
|
||||||
|
|
||||||
|
void disc_load(int drive, char *fn)
|
||||||
|
{
|
||||||
|
int c = 0, size;
|
||||||
|
char *p;
|
||||||
|
FILE *f;
|
||||||
|
// pclog("disc_load %i %s\n", drive, fn);
|
||||||
|
// setejecttext(drive, "");
|
||||||
|
if (!fn) return;
|
||||||
|
p = get_extension(fn);
|
||||||
|
if (!p) return;
|
||||||
|
// setejecttext(drive, fn);
|
||||||
|
pclog("Loading :%i %s %s\n", drive, fn,p);
|
||||||
|
f = fopen(fn, "rb");
|
||||||
|
if (!f) return;
|
||||||
|
fseek(f, -1, SEEK_END);
|
||||||
|
size = ftell(f) + 1;
|
||||||
|
fclose(f);
|
||||||
|
while (loaders[c].ext)
|
||||||
|
{
|
||||||
|
if (!strcasecmp(p, loaders[c].ext) && (size == loaders[c].size || loaders[c].size == -1))
|
||||||
|
{
|
||||||
|
pclog("Loading as %s\n", p);
|
||||||
|
driveloaders[drive] = c;
|
||||||
|
loaders[c].load(drive, fn);
|
||||||
|
drive_empty[drive] = 0;
|
||||||
|
disc_changed[drive] = 1;
|
||||||
|
strcpy(discfns[drive], fn);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
c++;
|
||||||
|
}
|
||||||
|
pclog("Couldn't load %s %s\n",fn,p);
|
||||||
|
drive_empty[drive] = 1;
|
||||||
|
discfns[drive][0] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void disc_close(int drive)
|
||||||
|
{
|
||||||
|
// pclog("disc_close %i\n", drive);
|
||||||
|
if (loaders[driveloaders[drive]].close) loaders[driveloaders[drive]].close(drive);
|
||||||
|
drive_empty[drive] = 1;
|
||||||
|
discfns[drive][0] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int disc_notfound=0;
|
||||||
|
static int disc_period = 32;
|
||||||
|
|
||||||
|
void disc_poll()
|
||||||
|
{
|
||||||
|
disc_poll_time += disc_period * TIMER_USEC;
|
||||||
|
|
||||||
|
if (drives[disc_drivesel].poll)
|
||||||
|
drives[disc_drivesel].poll();
|
||||||
|
|
||||||
|
if (disc_notfound)
|
||||||
|
{
|
||||||
|
disc_notfound--;
|
||||||
|
if (!disc_notfound)
|
||||||
|
fdc_notfound();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void disc_set_rate(int rate)
|
||||||
|
{
|
||||||
|
switch (rate)
|
||||||
|
{
|
||||||
|
case 0: /*High density*/
|
||||||
|
case 1: /*High density (360 rpm)*/
|
||||||
|
disc_period = 16;
|
||||||
|
break;
|
||||||
|
case 2: /*Double density*/
|
||||||
|
disc_period = 32;
|
||||||
|
break;
|
||||||
|
case 3: /*Extended density*/
|
||||||
|
disc_period = 8;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void disc_init()
|
||||||
|
{
|
||||||
|
// pclog("disc_init %p\n", drives);
|
||||||
|
drives[0].poll = drives[1].poll = 0;
|
||||||
|
drives[0].seek = drives[1].seek = 0;
|
||||||
|
drives[0].readsector = drives[1].readsector = 0;
|
||||||
|
curdrive = 0;
|
||||||
|
disc_period = 32;
|
||||||
|
timer_add(disc_poll, &disc_poll_time, &motoron, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
int oldtrack[2] = {0, 0};
|
||||||
|
void disc_seek(int drive, int track)
|
||||||
|
{
|
||||||
|
if (drives[drive].seek)
|
||||||
|
drives[drive].seek(drive, track);
|
||||||
|
// if (track != oldtrack[drive])
|
||||||
|
fdc_discchange_clear(drive);
|
||||||
|
// ddnoise_seek(track - oldtrack[drive]);
|
||||||
|
oldtrack[drive] = track;
|
||||||
|
disctime = 5000;
|
||||||
|
}
|
||||||
|
|
||||||
|
void disc_readsector(int drive, int sector, int track, int side, int density)
|
||||||
|
{
|
||||||
|
if (drives[drive].readsector)
|
||||||
|
drives[drive].readsector(drive, sector, track, side, density);
|
||||||
|
else
|
||||||
|
disc_notfound = 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
void disc_writesector(int drive, int sector, int track, int side, int density)
|
||||||
|
{
|
||||||
|
if (drives[drive].writesector)
|
||||||
|
drives[drive].writesector(drive, sector, track, side, density);
|
||||||
|
else
|
||||||
|
disc_notfound = 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
void disc_readaddress(int drive, int track, int side, int density)
|
||||||
|
{
|
||||||
|
if (drives[drive].readaddress)
|
||||||
|
drives[drive].readaddress(drive, track, side, density);
|
||||||
|
else
|
||||||
|
disc_notfound = 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
void disc_format(int drive, int track, int side, int density)
|
||||||
|
{
|
||||||
|
if (drives[drive].format)
|
||||||
|
drives[drive].format(drive, track, side, density);
|
||||||
|
else
|
||||||
|
disc_notfound = 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
void disc_stop(int drive)
|
||||||
|
{
|
||||||
|
if (drives[drive].stop)
|
||||||
|
drives[drive].stop(drive);
|
||||||
|
}
|
||||||
57
src/disc.h
Normal file
57
src/disc.h
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
void (*seek)(int drive, int track);
|
||||||
|
void (*readsector)(int drive, int sector, int track, int side, int density);
|
||||||
|
void (*writesector)(int drive, int sector, int track, int side, int density);
|
||||||
|
void (*readaddress)(int drive, int track, int side, int density);
|
||||||
|
void (*format)(int drive, int track, int side, int density);
|
||||||
|
void (*stop)();
|
||||||
|
void (*poll)();
|
||||||
|
} DRIVE;
|
||||||
|
|
||||||
|
extern DRIVE drives[2];
|
||||||
|
|
||||||
|
extern int curdrive;
|
||||||
|
|
||||||
|
void disc_load(int drive, char *fn);
|
||||||
|
void disc_new(int drive, char *fn);
|
||||||
|
void disc_close(int drive);
|
||||||
|
void disc_init();
|
||||||
|
void disc_poll();
|
||||||
|
void disc_seek(int drive, int track);
|
||||||
|
void disc_readsector(int drive, int sector, int track, int side, int density);
|
||||||
|
void disc_writesector(int drive, int sector, int track, int side, int density);
|
||||||
|
void disc_readaddress(int drive, int track, int side, int density);
|
||||||
|
void disc_format(int drive, int track, int side, int density);
|
||||||
|
void disc_stop(int drive);
|
||||||
|
int disc_empty(int drive);
|
||||||
|
void disc_set_rate(int rate);
|
||||||
|
extern int disc_time;
|
||||||
|
extern int disc_poll_time;
|
||||||
|
extern int disc_drivesel;
|
||||||
|
|
||||||
|
void fdc_callback();
|
||||||
|
int fdc_data(uint8_t dat);
|
||||||
|
void fdc_spindown();
|
||||||
|
void fdc_finishread();
|
||||||
|
void fdc_notfound();
|
||||||
|
void fdc_datacrcerror();
|
||||||
|
void fdc_headercrcerror();
|
||||||
|
void fdc_writeprotect();
|
||||||
|
int fdc_getdata(int last);
|
||||||
|
void fdc_sectorid(uint8_t track, uint8_t side, uint8_t sector, uint8_t size, uint8_t crc1, uint8_t crc2);
|
||||||
|
void fdc_indexpulse();
|
||||||
|
/*extern int fdc_time;
|
||||||
|
extern int fdc_ready;
|
||||||
|
extern int fdc_indexcount;*/
|
||||||
|
|
||||||
|
extern int motorspin;
|
||||||
|
extern int motoron;
|
||||||
|
|
||||||
|
extern int defaultwriteprot;
|
||||||
|
//extern char discfns[4][260];
|
||||||
|
|
||||||
|
extern int writeprot[2], fwriteprot[2];
|
||||||
|
extern int disc_track[2];
|
||||||
|
extern int disc_changed[2];
|
||||||
|
extern int drive_empty[2];
|
||||||
463
src/disc_fdi.c
Normal file
463
src/disc_fdi.c
Normal file
|
|
@ -0,0 +1,463 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "ibm.h"
|
||||||
|
#include "disc.h"
|
||||||
|
#include "disc_fdi.h"
|
||||||
|
#include "fdi2raw.h"
|
||||||
|
|
||||||
|
static struct
|
||||||
|
{
|
||||||
|
FILE *f;
|
||||||
|
FDI *h;
|
||||||
|
uint8_t track_data[2][4][256*1024];
|
||||||
|
|
||||||
|
int sides;
|
||||||
|
int tracklen[2][4];
|
||||||
|
int trackindex[2][4];
|
||||||
|
|
||||||
|
int lasttrack;
|
||||||
|
} fdi[2];
|
||||||
|
|
||||||
|
static uint8_t fdi_timing[256*1024];
|
||||||
|
static int fdi_pos;
|
||||||
|
static int fdi_revs;
|
||||||
|
|
||||||
|
static int fdi_sector, fdi_track, fdi_side, fdi_drive, fdi_density;
|
||||||
|
static int fdi_inread, fdi_inwrite, fdi_readpos, fdi_inreadaddr;
|
||||||
|
|
||||||
|
static uint16_t CRCTable[256];
|
||||||
|
|
||||||
|
static int pollbytesleft=0,pollbitsleft=0;
|
||||||
|
|
||||||
|
static void fdi_setupcrc(uint16_t poly, uint16_t rvalue)
|
||||||
|
{
|
||||||
|
int c = 256, bc;
|
||||||
|
uint16_t crctemp;
|
||||||
|
|
||||||
|
while(c--)
|
||||||
|
{
|
||||||
|
crctemp = c << 8;
|
||||||
|
bc = 8;
|
||||||
|
|
||||||
|
while(bc--)
|
||||||
|
{
|
||||||
|
if(crctemp & 0x8000)
|
||||||
|
{
|
||||||
|
crctemp = (crctemp << 1) ^ poly;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
crctemp <<= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CRCTable[c] = crctemp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void fdi_init()
|
||||||
|
{
|
||||||
|
// printf("FDI reset\n");
|
||||||
|
memset(&fdi, 0, sizeof(fdi));
|
||||||
|
fdi_setupcrc(0x1021, 0xcdb4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void fdi_load(int drive, char *fn)
|
||||||
|
{
|
||||||
|
writeprot[drive] = fwriteprot[drive] = 1;
|
||||||
|
fdi[drive].f = fopen(fn, "rb");
|
||||||
|
if (!fdi[drive].f) return;
|
||||||
|
fdi[drive].h = fdi2raw_header(fdi[drive].f);
|
||||||
|
// if (!fdih[drive]) printf("Failed to load!\n");
|
||||||
|
fdi[drive].lasttrack = fdi2raw_get_last_track(fdi[drive].h);
|
||||||
|
fdi[drive].sides = (fdi[drive].lasttrack > 83) ? 2 : 1;
|
||||||
|
// printf("Last track %i\n",fdilasttrack[drive]);
|
||||||
|
drives[drive].seek = fdi_seek;
|
||||||
|
drives[drive].readsector = fdi_readsector;
|
||||||
|
drives[drive].writesector = fdi_writesector;
|
||||||
|
drives[drive].readaddress = fdi_readaddress;
|
||||||
|
drives[drive].poll = fdi_poll;
|
||||||
|
drives[drive].format = fdi_format;
|
||||||
|
drives[drive].stop = fdi_stop;
|
||||||
|
// pclog("Loaded as FDI\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void fdi_close(int drive)
|
||||||
|
{
|
||||||
|
if (fdi[drive].h)
|
||||||
|
fdi2raw_header_free(fdi[drive].h);
|
||||||
|
if (fdi[drive].f)
|
||||||
|
fclose(fdi[drive].f);
|
||||||
|
fdi[drive].f = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void fdi_seek(int drive, int track)
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
int density;
|
||||||
|
|
||||||
|
if (!fdi[drive].f)
|
||||||
|
return;
|
||||||
|
// printf("Track start %i\n",track);
|
||||||
|
if (track < 0)
|
||||||
|
track = 0;
|
||||||
|
if (track > fdi[drive].lasttrack)
|
||||||
|
track = fdi[drive].lasttrack - 1;
|
||||||
|
|
||||||
|
for (density = 0; density < 4; density++)
|
||||||
|
{
|
||||||
|
int c = fdi2raw_loadtrack(fdi[drive].h, (uint16_t *)fdi[drive].track_data[0][density],
|
||||||
|
(uint16_t *)fdi_timing,
|
||||||
|
track * fdi[drive].sides,
|
||||||
|
&fdi[drive].tracklen[0][density],
|
||||||
|
&fdi[drive].trackindex[0][density], NULL, density);
|
||||||
|
if (!c)
|
||||||
|
memset(fdi[drive].track_data[0][density], 0, fdi[drive].tracklen[0][density]);
|
||||||
|
|
||||||
|
if (fdi[drive].sides == 2)
|
||||||
|
{
|
||||||
|
c = fdi2raw_loadtrack(fdi[drive].h, (uint16_t *)fdi[drive].track_data[1][density],
|
||||||
|
(uint16_t *)fdi_timing,
|
||||||
|
(track * fdi[drive].sides) + 1,
|
||||||
|
&fdi[drive].tracklen[1][density],
|
||||||
|
&fdi[drive].trackindex[1][density], NULL, density);
|
||||||
|
if (!c)
|
||||||
|
memset(fdi[drive].track_data[1][density], 0, fdi[drive].tracklen[1][density]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memset(fdi[drive].track_data[1][density], 0, 65536);
|
||||||
|
fdi[drive].tracklen[1][density] = fdi[drive].tracklen[1][density] = 10000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void fdi_writeback(int drive, int track)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void fdi_readsector(int drive, int sector, int track, int side, int rate)
|
||||||
|
{
|
||||||
|
fdi_revs = 0;
|
||||||
|
fdi_sector = sector;
|
||||||
|
fdi_track = track;
|
||||||
|
fdi_side = side;
|
||||||
|
fdi_drive = drive;
|
||||||
|
if (rate == 2)
|
||||||
|
fdi_density = 1;
|
||||||
|
if (rate == 0)
|
||||||
|
fdi_density = 2;
|
||||||
|
if (rate == 3)
|
||||||
|
fdi_density = 3;
|
||||||
|
|
||||||
|
// pclog("FDI Read sector %i %i %i %i %i\n",drive,side,track,sector, fdi_density);
|
||||||
|
// if (pollbytesleft)
|
||||||
|
// pclog("In the middle of a sector!\n");
|
||||||
|
|
||||||
|
fdi_inread = 1;
|
||||||
|
fdi_inwrite = 0;
|
||||||
|
fdi_inreadaddr = 0;
|
||||||
|
fdi_readpos = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void fdi_writesector(int drive, int sector, int track, int side, int rate)
|
||||||
|
{
|
||||||
|
fdi_revs = 0;
|
||||||
|
fdi_sector = sector;
|
||||||
|
fdi_track = track;
|
||||||
|
fdi_side = side;
|
||||||
|
fdi_drive = drive;
|
||||||
|
if (rate == 2)
|
||||||
|
fdi_density = 1;
|
||||||
|
if (rate == 0)
|
||||||
|
fdi_density = 2;
|
||||||
|
if (rate == 3)
|
||||||
|
fdi_density = 3;
|
||||||
|
// pclog("Write sector %i %i %i %i\n",drive,side,track,sector);
|
||||||
|
|
||||||
|
fdi_inread = 0;
|
||||||
|
fdi_inwrite = 1;
|
||||||
|
fdi_inreadaddr = 0;
|
||||||
|
fdi_readpos = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void fdi_readaddress(int drive, int track, int side, int rate)
|
||||||
|
{
|
||||||
|
fdi_revs = 0;
|
||||||
|
fdi_track = track;
|
||||||
|
fdi_side = side;
|
||||||
|
fdi_drive = drive;
|
||||||
|
if (rate == 2)
|
||||||
|
fdi_density = 1;
|
||||||
|
if (rate == 0)
|
||||||
|
fdi_density = 2;
|
||||||
|
if (rate == 3)
|
||||||
|
fdi_density = 3;
|
||||||
|
// pclog("Read address %i %i %i %i %i %p\n",drive,side,track, rate, fdi_density, &fdi_inreadaddr);
|
||||||
|
|
||||||
|
fdi_inread = 0;
|
||||||
|
fdi_inwrite = 0;
|
||||||
|
fdi_inreadaddr = 1;
|
||||||
|
fdi_readpos = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void fdi_format(int drive, int track, int side, int rate)
|
||||||
|
{
|
||||||
|
fdi_revs = 0;
|
||||||
|
fdi_track = track;
|
||||||
|
fdi_side = side;
|
||||||
|
fdi_drive = drive;
|
||||||
|
if (rate == 2)
|
||||||
|
fdi_density = 1;
|
||||||
|
if (rate == 0)
|
||||||
|
fdi_density = 2;
|
||||||
|
if (rate == 3)
|
||||||
|
fdi_density = 3;
|
||||||
|
// pclog("Format %i %i %i\n",drive,side,track);
|
||||||
|
|
||||||
|
fdi_inread = 0;
|
||||||
|
fdi_inwrite = 1;
|
||||||
|
fdi_inreadaddr = 0;
|
||||||
|
fdi_readpos = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint16_t fdi_buffer;
|
||||||
|
static int readidpoll=0,readdatapoll=0,fdi_nextsector=0,inreadop=0;
|
||||||
|
static uint8_t fdi_sectordat[1026];
|
||||||
|
static int lastfdidat[2],sectorcrc[2];
|
||||||
|
static int sectorsize,fdc_sectorsize;
|
||||||
|
static int ddidbitsleft=0;
|
||||||
|
|
||||||
|
static uint8_t decodefm(uint16_t dat)
|
||||||
|
{
|
||||||
|
uint8_t temp;
|
||||||
|
temp = 0;
|
||||||
|
if (dat & 0x0001) temp |= 1;
|
||||||
|
if (dat & 0x0004) temp |= 2;
|
||||||
|
if (dat & 0x0010) temp |= 4;
|
||||||
|
if (dat & 0x0040) temp |= 8;
|
||||||
|
if (dat & 0x0100) temp |= 16;
|
||||||
|
if (dat & 0x0400) temp |= 32;
|
||||||
|
if (dat & 0x1000) temp |= 64;
|
||||||
|
if (dat & 0x4000) temp |= 128;
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
void fdi_stop()
|
||||||
|
{
|
||||||
|
// pclog("fdi_stop\n");
|
||||||
|
fdi_inread = fdi_inwrite = fdi_inreadaddr = 0;
|
||||||
|
fdi_nextsector = ddidbitsleft = pollbitsleft = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint16_t crc;
|
||||||
|
|
||||||
|
static void calccrc(uint8_t byte)
|
||||||
|
{
|
||||||
|
crc = (crc << 8) ^ CRCTable[(crc >> 8)^byte];
|
||||||
|
}
|
||||||
|
|
||||||
|
static int fdi_indextime_blank = 6250 * 8;
|
||||||
|
void fdi_poll()
|
||||||
|
{
|
||||||
|
int tempi, c;
|
||||||
|
int bitcount;
|
||||||
|
|
||||||
|
for (bitcount = 0; bitcount < 16; bitcount++)
|
||||||
|
{
|
||||||
|
if (fdi_pos >= fdi[fdi_drive].tracklen[fdi_side][fdi_density])
|
||||||
|
{
|
||||||
|
fdi_pos = 0;
|
||||||
|
if (fdi[fdi_drive].tracklen[fdi_side][fdi_density])
|
||||||
|
fdc_indexpulse();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fdi_indextime_blank--;
|
||||||
|
if (!fdi_indextime_blank)
|
||||||
|
{
|
||||||
|
fdi_indextime_blank = 6250 * 8;
|
||||||
|
fdc_indexpulse();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tempi = fdi[fdi_drive].track_data[fdi_side][fdi_density][((fdi_pos >> 3) & 0xFFFF) ^ 1] & (1 << (7 - (fdi_pos & 7)));
|
||||||
|
fdi_pos++;
|
||||||
|
fdi_buffer <<= 1;
|
||||||
|
fdi_buffer |= (tempi ? 1 : 0);
|
||||||
|
if (fdi_inwrite)
|
||||||
|
{
|
||||||
|
fdi_inwrite = 0;
|
||||||
|
fdc_writeprotect();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!fdi_inread && !fdi_inreadaddr)
|
||||||
|
return;
|
||||||
|
if (fdi_pos == fdi[fdi_drive].trackindex[fdi_side][fdi_density])
|
||||||
|
{
|
||||||
|
fdi_revs++;
|
||||||
|
if (fdi_revs == 3)
|
||||||
|
{
|
||||||
|
// pclog("Not found!\n");
|
||||||
|
fdc_notfound();
|
||||||
|
fdi_inread = fdi_inreadaddr = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (pollbitsleft)
|
||||||
|
{
|
||||||
|
pollbitsleft--;
|
||||||
|
if (!pollbitsleft)
|
||||||
|
{
|
||||||
|
pollbytesleft--;
|
||||||
|
if (pollbytesleft) pollbitsleft = 16; /*Set up another word if we need it*/
|
||||||
|
if (readidpoll)
|
||||||
|
{
|
||||||
|
fdi_sectordat[5 - pollbytesleft] = decodefm(fdi_buffer);
|
||||||
|
if (fdi_inreadaddr && !fdc_sectorid)// && pollbytesleft > 1)
|
||||||
|
{
|
||||||
|
// rpclog("inreadaddr - %02X\n", fdi_sectordat[5 - pollbytesleft]);
|
||||||
|
fdc_data(fdi_sectordat[5 - pollbytesleft]);
|
||||||
|
}
|
||||||
|
if (!pollbytesleft)
|
||||||
|
{
|
||||||
|
// pclog("Header over %i,%i %i,%i\n", fdi_sectordat[0], fdi_sectordat[2], fdi_track, fdi_sector);
|
||||||
|
if ((fdi_sectordat[0] == fdi_track && fdi_sectordat[2] == fdi_sector) || fdi_inreadaddr)
|
||||||
|
{
|
||||||
|
crc = (fdi_density) ? 0xcdb4 : 0xffff;
|
||||||
|
calccrc(0xFE);
|
||||||
|
for (c = 0; c < 4; c++)
|
||||||
|
calccrc(fdi_sectordat[c]);
|
||||||
|
|
||||||
|
if ((crc >> 8) != fdi_sectordat[4] || (crc & 0xFF) != fdi_sectordat[5])
|
||||||
|
{
|
||||||
|
// pclog("Header CRC error : %02X %02X %02X %02X\n",crc>>8,crc&0xFF,fdi_sectordat[4],fdi_sectordat[5]);
|
||||||
|
// dumpregs();
|
||||||
|
// exit(-1);
|
||||||
|
inreadop = 0;
|
||||||
|
if (fdi_inreadaddr)
|
||||||
|
{
|
||||||
|
// rpclog("inreadaddr - %02X\n", fdi_sector);
|
||||||
|
// fdc_data(fdi_sector);
|
||||||
|
if (fdc_sectorid)
|
||||||
|
fdc_sectorid(fdi_sectordat[0], fdi_sectordat[1], fdi_sectordat[2], fdi_sectordat[3], fdi_sectordat[4], fdi_sectordat[5]);
|
||||||
|
else
|
||||||
|
fdc_finishread();
|
||||||
|
}
|
||||||
|
else fdc_headercrcerror();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// pclog("Sector %i,%i %i,%i\n", fdi_sectordat[0], fdi_sectordat[2], fdi_track, fdi_sector);
|
||||||
|
if (fdi_sectordat[0] == fdi_track && fdi_sectordat[2] == fdi_sector && fdi_inread && !fdi_inreadaddr)
|
||||||
|
{
|
||||||
|
fdi_nextsector = 1;
|
||||||
|
readidpoll = 0;
|
||||||
|
sectorsize = (1 << (fdi_sectordat[3] + 7)) + 2;
|
||||||
|
fdc_sectorsize = fdi_sectordat[3];
|
||||||
|
}
|
||||||
|
if (fdi_inreadaddr)
|
||||||
|
{
|
||||||
|
if (fdc_sectorid)
|
||||||
|
fdc_sectorid(fdi_sectordat[0], fdi_sectordat[1], fdi_sectordat[2], fdi_sectordat[3], fdi_sectordat[4], fdi_sectordat[5]);
|
||||||
|
else
|
||||||
|
fdc_finishread();
|
||||||
|
fdi_inreadaddr = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (readdatapoll)
|
||||||
|
{
|
||||||
|
// pclog("readdatapoll %i %02x\n", pollbytesleft, decodefm(fdi_buffer));
|
||||||
|
if (pollbytesleft > 1)
|
||||||
|
{
|
||||||
|
calccrc(decodefm(fdi_buffer));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
sectorcrc[1 - pollbytesleft] = decodefm(fdi_buffer);
|
||||||
|
if (!pollbytesleft)
|
||||||
|
{
|
||||||
|
fdi_inread = 0;
|
||||||
|
//#if 0
|
||||||
|
if ((crc >> 8) != sectorcrc[0] || (crc & 0xFF) != sectorcrc[1])// || (fditrack==79 && fdisect==4 && fdc_side&1))
|
||||||
|
{
|
||||||
|
// pclog("Data CRC error : %02X %02X %02X %02X %i %04X %02X%02X\n",crc>>8,crc&0xFF,sectorcrc[0],sectorcrc[1],fdi_pos,crc,sectorcrc[0],sectorcrc[1]);
|
||||||
|
inreadop = 0;
|
||||||
|
fdc_data(decodefm(lastfdidat[1]));
|
||||||
|
fdc_finishread();
|
||||||
|
fdc_datacrcerror();
|
||||||
|
readdatapoll = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//#endif
|
||||||
|
// pclog("End of FDI read %02X %02X %02X %02X\n",crc>>8,crc&0xFF,sectorcrc[0],sectorcrc[1]);
|
||||||
|
fdc_data(decodefm(lastfdidat[1]));
|
||||||
|
fdc_finishread();
|
||||||
|
}
|
||||||
|
else if (lastfdidat[1] != 0)
|
||||||
|
fdc_data(decodefm(lastfdidat[1]));
|
||||||
|
lastfdidat[1] = lastfdidat[0];
|
||||||
|
lastfdidat[0] = fdi_buffer;
|
||||||
|
if (!pollbytesleft)
|
||||||
|
readdatapoll = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (fdi_buffer == 0x4489 && fdi_density)
|
||||||
|
{
|
||||||
|
// rpclog("Found sync\n");
|
||||||
|
ddidbitsleft = 17;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fdi_buffer == 0xF57E && !fdi_density)
|
||||||
|
{
|
||||||
|
pollbytesleft = 6;
|
||||||
|
pollbitsleft = 16;
|
||||||
|
readidpoll = 1;
|
||||||
|
}
|
||||||
|
if ((fdi_buffer == 0xF56F || fdi_buffer == 0xF56A) && !fdi_density)
|
||||||
|
{
|
||||||
|
if (fdi_nextsector)
|
||||||
|
{
|
||||||
|
pollbytesleft = sectorsize;
|
||||||
|
pollbitsleft = 16;
|
||||||
|
readdatapoll = 1;
|
||||||
|
fdi_nextsector = 0;
|
||||||
|
crc = 0xffff;
|
||||||
|
if (fdi_buffer == 0xF56A) calccrc(0xF8);
|
||||||
|
else calccrc(0xFB);
|
||||||
|
lastfdidat[0] = lastfdidat[1] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ddidbitsleft)
|
||||||
|
{
|
||||||
|
ddidbitsleft--;
|
||||||
|
if (!ddidbitsleft && !readdatapoll)
|
||||||
|
{
|
||||||
|
// printf("ID bits over %04X %02X %i\n",fdibuffer,decodefm(fdibuffer),fdipos);
|
||||||
|
if (decodefm(fdi_buffer) == 0xFE)
|
||||||
|
{
|
||||||
|
// printf("Sector header %i %i\n", fdi_inread, fdi_inreadaddr);
|
||||||
|
pollbytesleft = 6;
|
||||||
|
pollbitsleft = 16;
|
||||||
|
readidpoll = 1;
|
||||||
|
}
|
||||||
|
else if (decodefm(fdi_buffer) == 0xFB)
|
||||||
|
{
|
||||||
|
// printf("Data header %i %i\n", fdi_inread, fdi_inreadaddr);
|
||||||
|
if (fdi_nextsector)
|
||||||
|
{
|
||||||
|
pollbytesleft = sectorsize;
|
||||||
|
pollbitsleft = 16;
|
||||||
|
readdatapoll = 1;
|
||||||
|
fdi_nextsector = 0;
|
||||||
|
crc = 0xcdb4;
|
||||||
|
if (fdi_buffer == 0xF56A) calccrc(0xF8);
|
||||||
|
else calccrc(0xFB);
|
||||||
|
lastfdidat[0] = lastfdidat[1] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
10
src/disc_fdi.h
Normal file
10
src/disc_fdi.h
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
void fdi_init();
|
||||||
|
void fdi_load(int drive, char *fn);
|
||||||
|
void fdi_close(int drive);
|
||||||
|
void fdi_seek(int drive, int track);
|
||||||
|
void fdi_readsector(int drive, int sector, int track, int side, int density);
|
||||||
|
void fdi_writesector(int drive, int sector, int track, int side, int density);
|
||||||
|
void fdi_readaddress(int drive, int sector, int side, int density);
|
||||||
|
void fdi_format(int drive, int sector, int side, int density);
|
||||||
|
void fdi_stop();
|
||||||
|
void fdi_poll();
|
||||||
307
src/disc_img.c
Normal file
307
src/disc_img.c
Normal file
|
|
@ -0,0 +1,307 @@
|
||||||
|
#include "ibm.h"
|
||||||
|
#include "disc.h"
|
||||||
|
#include "disc_img.h"
|
||||||
|
|
||||||
|
static struct
|
||||||
|
{
|
||||||
|
FILE *f;
|
||||||
|
uint8_t track_data[2][20*1024];
|
||||||
|
int sectors, tracks, sides;
|
||||||
|
int sector_size;
|
||||||
|
int rate;
|
||||||
|
} img[2];
|
||||||
|
|
||||||
|
//static FILE *img_f[2];
|
||||||
|
//static uint8_t trackinfoa[2][2][20*1024];
|
||||||
|
//static int img_dblside[2];
|
||||||
|
//static int img_sectors[2], img_size[2], img_trackc[2];
|
||||||
|
//static int img_dblstep[2];
|
||||||
|
//static int img_density[2];
|
||||||
|
|
||||||
|
static int img_sector, img_track, img_side, img_drive;
|
||||||
|
static int img_inread, img_readpos, img_inwrite, img_inreadaddr;
|
||||||
|
static int img_notfound;
|
||||||
|
static int img_rsector=0;
|
||||||
|
static int img_informat=0;
|
||||||
|
|
||||||
|
static int img_pause = 0;
|
||||||
|
static int img_index = 6250;
|
||||||
|
|
||||||
|
void img_init()
|
||||||
|
{
|
||||||
|
memset(img, 0, sizeof(img));
|
||||||
|
// adl[0] = adl[1] = 0;
|
||||||
|
img_notfound = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void img_load(int drive, char *fn)
|
||||||
|
{
|
||||||
|
int size;
|
||||||
|
|
||||||
|
writeprot[drive] = 0;
|
||||||
|
img[drive].f = fopen(fn, "rb+");
|
||||||
|
if (!img[drive].f)
|
||||||
|
{
|
||||||
|
img[drive].f = fopen(fn, "rb");
|
||||||
|
if (!img[drive].f)
|
||||||
|
return;
|
||||||
|
writeprot[drive] = 1;
|
||||||
|
}
|
||||||
|
fwriteprot[drive] = writeprot[drive];
|
||||||
|
fseek(img[drive].f, -1, SEEK_END);
|
||||||
|
size = ftell(img[drive].f) + 1;
|
||||||
|
|
||||||
|
img[drive].sides = 2;
|
||||||
|
img[drive].sector_size = 512;
|
||||||
|
if (size <= (160*1024)) { img[drive].sectors = 8; img[drive].tracks = 40; img[drive].sides = 1; img[drive].rate = 2; }
|
||||||
|
else if (size <= (180*1024)) { img[drive].sectors = 9; img[drive].tracks = 40; img[drive].sides = 1; img[drive].rate = 2; }
|
||||||
|
else if (size <= (320*1024)) { img[drive].sectors = 8; img[drive].tracks = 40; img[drive].rate = 2; }
|
||||||
|
else if (size <= (360*1024)) { img[drive].sectors = 9; img[drive].tracks = 40; img[drive].rate = 2; } /*Double density*/
|
||||||
|
else if (size < (1024*1024)) { img[drive].sectors = 9; img[drive].tracks = 80; img[drive].rate = 2; } /*Double density*/
|
||||||
|
else if (size <= 1228800) { img[drive].sectors = 15; img[drive].tracks = 80; img[drive].rate = 0; } /*High density 1.2MB*/
|
||||||
|
else if (size <= (0x1A4000-1)) { img[drive].sectors = 18; img[drive].tracks = 80; img[drive].rate = 0; } /*High density (not supported by Tandy 1000)*/
|
||||||
|
else if (size == 1884160) { img[drive].sectors = 23; img[drive].tracks = 80; img[drive].rate = 0; } /*XDF format - used by OS/2 Warp*/
|
||||||
|
else if (size == 1763328) { img[drive].sectors = 21; img[drive].tracks = 82; img[drive].rate = 0; } /*XDF format - used by OS/2 Warp*/
|
||||||
|
else if (size < (2048*1024)) { img[drive].sectors = 21; img[drive].tracks = 80; img[drive].rate = 0; } /*DMF format - used by Windows 95*/
|
||||||
|
else { img[drive].sectors = 36; img[drive].tracks = 80; img[drive].rate = 3; } /*E density*/
|
||||||
|
|
||||||
|
drives[drive].seek = img_seek;
|
||||||
|
drives[drive].readsector = img_readsector;
|
||||||
|
drives[drive].writesector = img_writesector;
|
||||||
|
drives[drive].readaddress = img_readaddress;
|
||||||
|
drives[drive].poll = img_poll;
|
||||||
|
drives[drive].format = img_format;
|
||||||
|
// pclog("img_load %d %p sectors=%i tracks=%i sides=%i sector_size=%i\n", drive, drives, img[drive].sectors, img[drive].tracks, img[drive].sides, img[drive].sector_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void img_close(int drive)
|
||||||
|
{
|
||||||
|
if (img[drive].f)
|
||||||
|
fclose(img[drive].f);
|
||||||
|
img[drive].f = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void img_seek(int drive, int track)
|
||||||
|
{
|
||||||
|
if (!img[drive].f)
|
||||||
|
return;
|
||||||
|
// pclog("Seek drive=%i track=%i sectors=%i sector_size=%i sides=%i\n", drive, track, img[drive].sectors,img[drive].sector_size, img[drive].sides);
|
||||||
|
disc_track[drive] = track;
|
||||||
|
if (img[drive].sides == 2)
|
||||||
|
{
|
||||||
|
fseek(img[drive].f, track * img[drive].sectors * img[drive].sector_size * 2, SEEK_SET);
|
||||||
|
fread(img[drive].track_data[0], img[drive].sectors * img[drive].sector_size, 1, img[drive].f);
|
||||||
|
fread(img[drive].track_data[1], img[drive].sectors * img[drive].sector_size, 1, img[drive].f);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fseek(img[drive].f, track * img[drive].sectors * img[drive].sector_size, SEEK_SET);
|
||||||
|
fread(img[drive].track_data[0], img[drive].sectors * img[drive].sector_size, 1, img[drive].f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void img_writeback(int drive, int track)
|
||||||
|
{
|
||||||
|
if (!img[drive].f)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (img[drive].sides == 2)
|
||||||
|
{
|
||||||
|
fseek(img[drive].f, track * img[drive].sectors * img[drive].sector_size * 2, SEEK_SET);
|
||||||
|
fwrite(img[drive].track_data[0], img[drive].sectors * img[drive].sector_size, 1, img[drive].f);
|
||||||
|
fwrite(img[drive].track_data[1], img[drive].sectors * img[drive].sector_size, 1, img[drive].f);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fseek(img[drive].f, track * img[drive].sectors * img[drive].sector_size, SEEK_SET);
|
||||||
|
fwrite(img[drive].track_data[0], img[drive].sectors * img[drive].sector_size, 1, img[drive].f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void img_readsector(int drive, int sector, int track, int side, int rate)
|
||||||
|
{
|
||||||
|
img_sector = sector - 1;
|
||||||
|
img_track = track;
|
||||||
|
img_side = side;
|
||||||
|
img_drive = drive;
|
||||||
|
// pclog("imgS Read sector drive=%i side=%i track=%i sector=%i rate=%i\n",drive,side,track,sector, rate);
|
||||||
|
|
||||||
|
if (!img[drive].f || (side && img[drive].sides == 1) ||
|
||||||
|
(rate != img[drive].rate) || (track != disc_track[drive]))
|
||||||
|
{
|
||||||
|
// pclog("Sector not found rate %i,%i track %i,%i\n", rate, img[drive].rate, track, disc_track[drive]);
|
||||||
|
img_notfound=500;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// printf("Found\n");
|
||||||
|
img_inread = 1;
|
||||||
|
img_readpos = 0;
|
||||||
|
img_pause = 32;
|
||||||
|
}
|
||||||
|
|
||||||
|
void img_writesector(int drive, int sector, int track, int side, int rate)
|
||||||
|
{
|
||||||
|
// if (imgdblstep[drive]) track/=2;
|
||||||
|
img_sector = sector - 1;
|
||||||
|
img_track = track;
|
||||||
|
img_side = side;
|
||||||
|
img_drive = drive;
|
||||||
|
// printf("imgS Write sector %i %i %i %i\n",drive,side,track,sector);
|
||||||
|
|
||||||
|
if (!img[drive].f || (side && img[drive].sides == 1) ||
|
||||||
|
(rate != img[drive].rate) || (track != disc_track[drive]))
|
||||||
|
{
|
||||||
|
img_notfound = 500;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
img_inwrite = 1;
|
||||||
|
img_readpos = 0;
|
||||||
|
img_pause = 32;
|
||||||
|
}
|
||||||
|
|
||||||
|
void img_readaddress(int drive, int track, int side, int rate)
|
||||||
|
{
|
||||||
|
img_drive = drive;
|
||||||
|
img_track = track;
|
||||||
|
img_side = side;
|
||||||
|
// pclog("Read address %i %i %i %i\n",drive,side,track, rate);
|
||||||
|
|
||||||
|
if (!img[drive].f || (side && img[drive].sides == 1) ||
|
||||||
|
(rate != img[drive].rate) || (track != disc_track[drive]))
|
||||||
|
{
|
||||||
|
// pclog("Address not found rate %i,%i track %i,%i\n", rate, img[drive].rate, track, disc_track[drive]);
|
||||||
|
img_notfound=500;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
img_inreadaddr = 1;
|
||||||
|
img_readpos = 0;
|
||||||
|
img_pause = 100;//500;
|
||||||
|
img_pause = 32;
|
||||||
|
}
|
||||||
|
|
||||||
|
void img_format(int drive, int track, int side, int rate)
|
||||||
|
{
|
||||||
|
img_drive = drive;
|
||||||
|
img_track = track;
|
||||||
|
img_side = side;
|
||||||
|
|
||||||
|
if (!img[drive].f || (side && img[drive].sides == 1) ||
|
||||||
|
(rate != img[drive].rate) || (track != disc_track[drive]))
|
||||||
|
{
|
||||||
|
img_notfound = 500;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
img_sector = 0;
|
||||||
|
img_readpos = 0;
|
||||||
|
img_informat = 1;
|
||||||
|
img_pause = 32;
|
||||||
|
}
|
||||||
|
|
||||||
|
void img_stop()
|
||||||
|
{
|
||||||
|
img_pause = img_notfound = img_inread = img_inwrite = img_inreadaddr = img_informat = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void img_poll()
|
||||||
|
{
|
||||||
|
// pclog("img_poll %i %i %p\n", img_inread, img_readpos, img[img_drive].f);
|
||||||
|
img_index--;
|
||||||
|
if (!img_index)
|
||||||
|
{
|
||||||
|
img_index = 6250;
|
||||||
|
fdc_indexpulse();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (img_pause)
|
||||||
|
{
|
||||||
|
img_pause--;
|
||||||
|
if (img_pause)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (img_notfound)
|
||||||
|
{
|
||||||
|
img_notfound--;
|
||||||
|
if (!img_notfound)
|
||||||
|
{
|
||||||
|
// pclog("Not found!\n");
|
||||||
|
fdc_notfound();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (img_inread && img[img_drive].f)
|
||||||
|
{
|
||||||
|
// pclog("Read pos %i\n", img_readpos);
|
||||||
|
// if (!imgreadpos) pclog("%i\n",imgsector*imgsize[imgdrive]);
|
||||||
|
if (fdc_data(img[img_drive].track_data[img_side][(img_sector * img[img_drive].sector_size) + img_readpos]))
|
||||||
|
return;
|
||||||
|
|
||||||
|
img_readpos++;
|
||||||
|
if (img_readpos == img[img_drive].sector_size)
|
||||||
|
{
|
||||||
|
// pclog("Read %i bytes\n",img_readpos);
|
||||||
|
img_inread = 0;
|
||||||
|
fdc_finishread();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (img_inwrite && img[img_drive].f)
|
||||||
|
{
|
||||||
|
int data;
|
||||||
|
|
||||||
|
if (writeprot[img_drive])
|
||||||
|
{
|
||||||
|
// pclog("writeprotect\n");
|
||||||
|
fdc_writeprotect();
|
||||||
|
img_inwrite = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// pclog("Write data %i\n",img_readpos);
|
||||||
|
data = fdc_getdata(img_readpos == (img[img_drive].sector_size - 1));
|
||||||
|
if (data == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
img[img_drive].track_data[img_side][(img_sector * img[img_drive].sector_size) + img_readpos] = data;
|
||||||
|
img_readpos++;
|
||||||
|
if (img_readpos == img[img_drive].sector_size)
|
||||||
|
{
|
||||||
|
// pclog("write over\n");
|
||||||
|
img_inwrite = 0;
|
||||||
|
fdc_finishread();
|
||||||
|
img_writeback(img_drive, img_track);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (img_inreadaddr && img[img_drive].f)
|
||||||
|
{
|
||||||
|
// pclog("img_inreadaddr %08X\n", fdc_sectorid);
|
||||||
|
fdc_sectorid(img_track, img_side,
|
||||||
|
img_rsector + ((img[img_drive].sector_size == 512) ? 1 : 0), (img[img_drive].sector_size == 256) ? 1 : ((img[img_drive].sector_size == 512) ? 2 : 3), 0, 0);
|
||||||
|
img_inreadaddr = 0;
|
||||||
|
img_rsector++;
|
||||||
|
if (img_rsector == img[img_drive].sectors)
|
||||||
|
{
|
||||||
|
img_rsector=0;
|
||||||
|
// pclog("img_rsector reset\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (img_informat && img[img_drive].f)
|
||||||
|
{
|
||||||
|
if (writeprot[img_drive])
|
||||||
|
{
|
||||||
|
fdc_writeprotect();
|
||||||
|
img_informat = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
img[img_drive].track_data[img_side][(img_sector * img[img_drive].sector_size) + img_readpos] = 0;
|
||||||
|
img_readpos++;
|
||||||
|
if (img_readpos == img[img_drive].sector_size)
|
||||||
|
{
|
||||||
|
img_readpos = 0;
|
||||||
|
img_sector++;
|
||||||
|
if (img_sector == img[img_drive].sectors)
|
||||||
|
{
|
||||||
|
img_informat = 0;
|
||||||
|
fdc_finishread();
|
||||||
|
img_writeback(img_drive, img_track);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
10
src/disc_img.h
Normal file
10
src/disc_img.h
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
void img_init();
|
||||||
|
void img_load(int drive, char *fn);
|
||||||
|
void img_close(int drive);
|
||||||
|
void img_seek(int drive, int track);
|
||||||
|
void img_readsector(int drive, int sector, int track, int side, int density);
|
||||||
|
void img_writesector(int drive, int sector, int track, int side, int density);
|
||||||
|
void img_readaddress(int drive, int sector, int side, int density);
|
||||||
|
void img_format(int drive, int sector, int side, int density);
|
||||||
|
void img_stop();
|
||||||
|
void img_poll();
|
||||||
|
|
@ -5,3 +5,4 @@ void fdc_remove();
|
||||||
void fdc_reset();
|
void fdc_reset();
|
||||||
void fdc_poll();
|
void fdc_poll();
|
||||||
void fdc_abort();
|
void fdc_abort();
|
||||||
|
void fdc_discchange_clear(int drive);
|
||||||
|
|
|
||||||
2190
src/fdi2raw.c
Normal file
2190
src/fdi2raw.c
Normal file
File diff suppressed because it is too large
Load diff
34
src/fdi2raw.h
Normal file
34
src/fdi2raw.h
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
#ifndef __FDI2RAW_H
|
||||||
|
#define __FDI2RAW_H
|
||||||
|
|
||||||
|
#define uae_u8 uint8_t
|
||||||
|
#define uae_u16 uint16_t
|
||||||
|
#define uae_u32 uint32_t
|
||||||
|
|
||||||
|
//#include "types.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
typedef struct fdi FDI;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern int fdi2raw_loadtrack (FDI*, uae_u16 *mfmbuf, uae_u16 *tracktiming, int track, int *tracklength, int *indexoffset, int *multirev, int mfm);
|
||||||
|
|
||||||
|
extern int fdi2raw_loadrevolution (FDI*, uae_u16 *mfmbuf, uae_u16 *tracktiming, int track, int *tracklength, int mfm);
|
||||||
|
|
||||||
|
extern FDI *fdi2raw_header(FILE *f);
|
||||||
|
extern void fdi2raw_header_free (FDI *);
|
||||||
|
extern int fdi2raw_get_last_track(FDI *);
|
||||||
|
extern int fdi2raw_get_num_sector (FDI *);
|
||||||
|
extern int fdi2raw_get_last_head(FDI *);
|
||||||
|
extern int fdi2raw_get_type (FDI *);
|
||||||
|
extern int fdi2raw_get_bit_rate (FDI *);
|
||||||
|
extern int fdi2raw_get_rotation (FDI *);
|
||||||
|
extern int fdi2raw_get_write_protect (FDI *);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
#include "device.h"
|
#include "device.h"
|
||||||
#include "io.h"
|
#include "io.h"
|
||||||
#include "mem.h"
|
#include "mem.h"
|
||||||
|
#include "nmi.h"
|
||||||
#include "pic.h"
|
#include "pic.h"
|
||||||
#include "sound.h"
|
#include "sound.h"
|
||||||
#include "sound_sn76489.h"
|
#include "sound_sn76489.h"
|
||||||
|
|
@ -24,7 +25,6 @@ struct
|
||||||
{
|
{
|
||||||
int latched;
|
int latched;
|
||||||
int data;
|
int data;
|
||||||
int nmi_enabled;
|
|
||||||
|
|
||||||
int serial_data[44];
|
int serial_data[44];
|
||||||
int serial_pos;
|
int serial_pos;
|
||||||
|
|
@ -142,7 +142,7 @@ void keyboard_pcjr_write(uint16_t port, uint8_t val, void *priv)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0xa0:
|
case 0xa0:
|
||||||
keyboard_pcjr.nmi_enabled = val & 0x80;
|
nmi_mask = val & 0x80;
|
||||||
pit_set_using_timer(1, !(val & 0x20));
|
pit_set_using_timer(1, !(val & 0x20));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
20
src/pc.c
20
src/pc.c
|
|
@ -221,12 +221,15 @@ void initpc()
|
||||||
loadbios();
|
loadbios();
|
||||||
mem_add_bios();
|
mem_add_bios();
|
||||||
|
|
||||||
loaddisc(0,discfns[0]);
|
disc_load(0, discfns[0]);
|
||||||
loaddisc(1,discfns[1]);
|
disc_load(1, discfns[1]);
|
||||||
|
|
||||||
timer_reset();
|
timer_reset();
|
||||||
sound_reset();
|
sound_reset();
|
||||||
fdc_init();
|
fdc_init();
|
||||||
|
disc_init();
|
||||||
|
fdi_init();
|
||||||
|
img_init();
|
||||||
|
|
||||||
//loadfont();
|
//loadfont();
|
||||||
loadnvr();
|
loadnvr();
|
||||||
|
|
@ -283,6 +286,15 @@ void resetpchard()
|
||||||
sound_reset();
|
sound_reset();
|
||||||
mem_resize();
|
mem_resize();
|
||||||
fdc_init();
|
fdc_init();
|
||||||
|
disc_init();
|
||||||
|
fdi_init();
|
||||||
|
img_init();
|
||||||
|
|
||||||
|
disc_close(0);
|
||||||
|
disc_close(1);
|
||||||
|
disc_load(0, discfns[0]);
|
||||||
|
disc_load(1, discfns[1]);
|
||||||
|
|
||||||
model_init();
|
model_init();
|
||||||
video_init();
|
video_init();
|
||||||
speaker_init();
|
speaker_init();
|
||||||
|
|
@ -447,8 +459,8 @@ void closepc()
|
||||||
// output=7;
|
// output=7;
|
||||||
// setpitclock(clocks[0][0][0]);
|
// setpitclock(clocks[0][0][0]);
|
||||||
// while (1) runpc();
|
// while (1) runpc();
|
||||||
savedisc(0);
|
disc_close(0);
|
||||||
savedisc(1);
|
disc_close(1);
|
||||||
dumpregs();
|
dumpregs();
|
||||||
closevideo();
|
closevideo();
|
||||||
device_close_all();
|
device_close_all();
|
||||||
|
|
|
||||||
19
src/win.c
19
src/win.c
|
|
@ -23,6 +23,7 @@
|
||||||
#include "nvr.h"
|
#include "nvr.h"
|
||||||
#include "sound.h"
|
#include "sound.h"
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
|
#include "disc.h"
|
||||||
|
|
||||||
#include "plat-midi.h"
|
#include "plat-midi.h"
|
||||||
#include "plat-keyboard.h"
|
#include "plat-keyboard.h"
|
||||||
|
|
@ -774,29 +775,27 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
|
||||||
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
|
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
|
||||||
break;
|
break;
|
||||||
case IDM_DISC_A:
|
case IDM_DISC_A:
|
||||||
if (!getfile(hwnd,"Disc image (*.IMG;*.IMA)\0*.IMG;*.IMA\0All files (*.*)\0*.*\0",discfns[0]))
|
if (!getfile(hwnd,"Disc image (*.IMG;*.IMA;*.FDI)\0*.IMG;*.IMA;*.FDI\0All files (*.*)\0*.*\0",discfns[0]))
|
||||||
{
|
{
|
||||||
savedisc(0);
|
disc_close(0);
|
||||||
loaddisc(0,openfilestring);
|
disc_load(0, openfilestring);
|
||||||
saveconfig();
|
saveconfig();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case IDM_DISC_B:
|
case IDM_DISC_B:
|
||||||
if (!getfile(hwnd,"Disc image (*.IMG;*.IMA)\0*.IMG;*.IMA\0All files (*.*)\0*.*\0",discfns[1]))
|
if (!getfile(hwnd,"Disc image (*.IMG;*.IMA;*.FDI)\0*.IMG;*.IMA;*.FDI\0All files (*.*)\0*.*\0",discfns[1]))
|
||||||
{
|
{
|
||||||
savedisc(1);
|
disc_close(1);
|
||||||
loaddisc(1,openfilestring);
|
disc_load(1, openfilestring);
|
||||||
saveconfig();
|
saveconfig();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case IDM_EJECT_A:
|
case IDM_EJECT_A:
|
||||||
savedisc(0);
|
disc_close(0);
|
||||||
ejectdisc(0);
|
|
||||||
saveconfig();
|
saveconfig();
|
||||||
break;
|
break;
|
||||||
case IDM_EJECT_B:
|
case IDM_EJECT_B:
|
||||||
savedisc(1);
|
disc_close(1);
|
||||||
ejectdisc(1);
|
|
||||||
saveconfig();
|
saveconfig();
|
||||||
break;
|
break;
|
||||||
case IDM_HDCONF:
|
case IDM_HDCONF:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue