Unify ATAPI and SCSI CD-ROM code.
This commit is contained in:
parent
bc690b3d2f
commit
6ecdd2efd0
19 changed files with 761 additions and 1509 deletions
|
|
@ -16,7 +16,7 @@ amrefresh:
|
||||||
pcem_SOURCES = 386.c 386_dynarec.c 386_dynarec_ops.c 808x.c acer386sx.c ali1429.c amstrad.c cbm_io.c cdrom-image.cc cdrom-null.c \
|
pcem_SOURCES = 386.c 386_dynarec.c 386_dynarec_ops.c 808x.c acer386sx.c ali1429.c amstrad.c cbm_io.c cdrom-image.cc cdrom-null.c \
|
||||||
codegen.c codegen_ops.c codegen_timing_486.c codegen_timing_686.c codegen_timing_common.c codegen_timing_pentium.c codegen_timing_winchip.c compaq.c config.c cpu.c \
|
codegen.c codegen_ops.c codegen_timing_486.c codegen_timing_686.c codegen_timing_common.c codegen_timing_pentium.c codegen_timing_winchip.c compaq.c config.c cpu.c \
|
||||||
dells200.c device.c disc.c disc_fdi.c disc_img.c disc_sector.c dma.c esdi_at.c fdc.c fdc37c665.c fdd.c fdi2raw.c gameport.c \
|
dells200.c device.c disc.c disc_fdi.c disc_img.c disc_sector.c dma.c esdi_at.c fdc.c fdc37c665.c fdd.c fdi2raw.c gameport.c \
|
||||||
hdd.c hdd_esdi.c hdd_file.c headland.c i430lx.c i430fx.c i430vx.c ide.c intel.c intel_flash.c io.c jim.c joystick_ch_flightstick_pro.c joystick_standard.c joystick_sw_pad.c \
|
hdd.c hdd_esdi.c hdd_file.c headland.c i430lx.c i430fx.c i430vx.c ide.c ide_atapi.c intel.c intel_flash.c io.c jim.c joystick_ch_flightstick_pro.c joystick_standard.c joystick_sw_pad.c \
|
||||||
joystick_tm_fcs.c keyboard.c keyboard_amstrad.c keyboard_at.c keyboard_olim24.c keyboard_pcjr.c keyboard_xt.c \
|
joystick_tm_fcs.c keyboard.c keyboard_amstrad.c keyboard_at.c keyboard_olim24.c keyboard_pcjr.c keyboard_xt.c \
|
||||||
laserxt.c lpt.c lpt_dac.c lpt_dss.c mca.c mcr.c mem.c mfm_at.c mfm_xebec.c model.c mouse.c mouse_msystems.c mouse_ps2.c mouse_serial.c neat.c nmi.c nvr.c olivetti_m24.c \
|
laserxt.c lpt.c lpt_dac.c lpt_dss.c mca.c mcr.c mem.c mfm_at.c mfm_xebec.c model.c mouse.c mouse_msystems.c mouse_ps2.c mouse_serial.c neat.c nmi.c nvr.c olivetti_m24.c \
|
||||||
opti495.c paths.c pc.c pci.c pic.c piix.c pit.c ppi.c ps1.c ps2.c ps2_mca.c ps2_nvr.c nvr_tc8521.c rom.c rtc.c rtc_tc8521.c scat.c scsi.c scsi_53c400.c scsi_aha1540.c scsi_cd.c scsi_hd.c \
|
opti495.c paths.c pc.c pci.c pic.c piix.c pit.c ppi.c ps1.c ps2.c ps2_mca.c ps2_nvr.c nvr_tc8521.c rom.c rtc.c rtc_tc8521.c scat.c scsi.c scsi_53c400.c scsi_aha1540.c scsi_cd.c scsi_hd.c \
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ CXXFLAGS = $(CFLAGS)
|
||||||
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad.o cbm_io.o cdrom-ioctl-linux.o cdrom-image.o cdrom-null.o \
|
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad.o cbm_io.o cdrom-ioctl-linux.o cdrom-image.o cdrom-null.o \
|
||||||
codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_686.o codegen_timing_common.o codegen_timing_pentium.o codegen_timing_winchip.o codegen_x86.c compaq.o config.o cpu.o \
|
codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_686.o codegen_timing_common.o codegen_timing_pentium.o codegen_timing_winchip.o codegen_x86.c compaq.o config.o cpu.o \
|
||||||
dells200.o device.o disc.o disc_fdi.o disc_img.o disc_sector.o dma.o esdi_at.o fdc.o fdc37c665.o fdd.o fdi2raw.o gameport.o \
|
dells200.o device.o disc.o disc_fdi.o disc_img.o disc_sector.o dma.o esdi_at.o fdc.o fdc37c665.o fdd.o fdi2raw.o gameport.o \
|
||||||
hdd.o hdd_esdi.o hdd_file.o headland.o i430lx.o i430fx.o i430vx.o ide.o intel.o intel_flash.o io.o jim.o joystick_ch_flightstick_pro.o joystick_standard.o joystick_sw_pad.o \
|
hdd.o hdd_esdi.o hdd_file.o headland.o i430lx.o i430fx.o i430vx.o ide.o ide_atapi.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 \
|
joystick_tm_fcs.o keyboard.o keyboard_amstrad.o keyboard_at.o keyboard_olim24.o keyboard_pcjr.o keyboard_xt.o \
|
||||||
laserxt.o lpt.o lpt_dac.o lpt_dss.o mca.o mcr.o mem.o mfm_at.o mfm_xebec.o model.o mouse.o mouse_msystems.o mouse_ps2.o mouse_serial.o neat.o nmi.o nvr.o nvr_tc8521.o olivetti_m24.o \
|
laserxt.o lpt.o lpt_dac.o lpt_dss.o mca.o mcr.o mem.o mfm_at.o mfm_xebec.o model.o mouse.o mouse_msystems.o mouse_ps2.o mouse_serial.o neat.o nmi.o nvr.o nvr_tc8521.o olivetti_m24.o \
|
||||||
opti495.o paths.o pc.o pci.o pic.o piix.o pit.o ppi.o ps1.o ps2.o ps2_mca.o ps2_nvr.o rom.o rtc.o rtc_tc8521.o scat.o scsi.o scsi_53c400.o scsi_aha1540.o scsi_cd.o scsi_hd.o \
|
opti495.o paths.o pc.o pci.o pic.o piix.o pit.o ppi.o ps1.o ps2.o ps2_mca.o ps2_nvr.o rom.o rtc.o rtc_tc8521.o scat.o scsi.o scsi_53c400.o scsi_aha1540.o scsi_cd.o scsi_hd.o \
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ CXXFLAGS = $(CFLAGS)
|
||||||
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad.o cbm_io.o cdrom-ioctl-linux.o cdrom-image.o cdrom-null.o \
|
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad.o cbm_io.o cdrom-ioctl-linux.o cdrom-image.o cdrom-null.o \
|
||||||
codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_686.o codegen_timing_common.o codegen_timing_pentium.o codegen_timing_winchip.o codegen_x86-64.c compaq.o config.o cpu.o \
|
codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_686.o codegen_timing_common.o codegen_timing_pentium.o codegen_timing_winchip.o codegen_x86-64.c compaq.o config.o cpu.o \
|
||||||
dells200.o device.o disc.o disc_fdi.o disc_img.o disc_sector.o dma.o esdi_at.o fdc.o fdc37c665.o fdd.o fdi2raw.o gameport.o \
|
dells200.o device.o disc.o disc_fdi.o disc_img.o disc_sector.o dma.o esdi_at.o fdc.o fdc37c665.o fdd.o fdi2raw.o gameport.o \
|
||||||
hdd.o hdd_esdi.o hdd_file.o headland.o i430lx.o i430fx.o i430vx.o ide.o intel.o intel_flash.o io.o jim.o joystick_ch_flightstick_pro.o joystick_standard.o joystick_sw_pad.o \
|
hdd.o hdd_esdi.o hdd_file.o headland.o i430lx.o i430fx.o i430vx.o ide.o ide_atapi.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 \
|
joystick_tm_fcs.o keyboard.o keyboard_amstrad.o keyboard_at.o keyboard_olim24.o keyboard_pcjr.o keyboard_xt.o \
|
||||||
laserxt.o lpt.o lpt_dac.o lpt_dss.o mca.o mcr.o mem.o mfm_at.o mfm_xebec.o model.o mouse.o mouse_msystems.o mouse_ps2.o mouse_serial.o neat.o nmi.o nvr.o nvr_tc8521.o olivetti_m24.o \
|
laserxt.o lpt.o lpt_dac.o lpt_dss.o mca.o mcr.o mem.o mfm_at.o mfm_xebec.o model.o mouse.o mouse_msystems.o mouse_ps2.o mouse_serial.o neat.o nmi.o nvr.o nvr_tc8521.o olivetti_m24.o \
|
||||||
opti495.o paths.o pc.o pci.o pic.o piix.o pit.o ppi.o ps1.o ps2.o ps2_mca.o ps2_nvr.o rom.o rtc.o rtc_tc8521.o scat.o scsi.o scsi_53c400.o scsi_aha1540.o scsi_cd.o scsi_hd.o \
|
opti495.o paths.o pc.o pci.o pic.o piix.o pit.o ppi.o ps1.o ps2.o ps2_mca.o ps2_nvr.o rom.o rtc.o rtc_tc8521.o scat.o scsi.o scsi_53c400.o scsi_aha1540.o scsi_cd.o scsi_hd.o \
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ CFLAGS = -O3 -march=i686 -fomit-frame-pointer -msse2 -mstackrealign -Wall -Werro
|
||||||
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad.o cbm_io.o cdrom-ioctl.o cdrom-image.o \
|
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad.o cbm_io.o cdrom-ioctl.o cdrom-image.o \
|
||||||
codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_686.o codegen_timing_common.o codegen_timing_pentium.o codegen_timing_winchip.o codegen_x86.o compaq.o config.o cpu.o \
|
codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_686.o codegen_timing_common.o codegen_timing_pentium.o codegen_timing_winchip.o codegen_x86.o compaq.o config.o cpu.o \
|
||||||
dells200.o device.o disc.o disc_fdi.o disc_img.o disc_sector.o dma.o esdi_at.o fdc.o fdc37c665.o fdd.o fdi2raw.o gameport.o hdd.o hdd_esdi.o hdd_file.o headland.o i430lx.o i430fx.o \
|
dells200.o device.o disc.o disc_fdi.o disc_img.o disc_sector.o dma.o esdi_at.o fdc.o fdc37c665.o fdd.o fdi2raw.o gameport.o hdd.o hdd_esdi.o hdd_file.o headland.o i430lx.o i430fx.o \
|
||||||
i430vx.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 \
|
i430vx.o ide.o ide_atapi.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 laserxt.o lpt.o lpt_dac.o lpt_dss.o mca.o mcr.o mem.o mfm_at.o mfm_xebec.o model.o mouse.o mouse_msystems.o mouse_ps2.o \
|
keyboard_olim24.o keyboard_pcjr.o keyboard_xt.o laserxt.o lpt.o lpt_dac.o lpt_dss.o mca.o mcr.o mem.o mfm_at.o mfm_xebec.o model.o mouse.o mouse_msystems.o mouse_ps2.o \
|
||||||
mouse_serial.o neat.o nmi.o nvr.o nvr_tc8521.o olivetti_m24.o opti495.o paths.o pc.o pci.o pic.o piix.o pit.o ppi.o ps1.o ps2.o ps2_mca.o ps2_nvr.o rom.o rtc.o rtc_tc8521.o \
|
mouse_serial.o neat.o nmi.o nvr.o nvr_tc8521.o olivetti_m24.o opti495.o paths.o pc.o pci.o pic.o piix.o pit.o ppi.o ps1.o ps2.o ps2_mca.o ps2_nvr.o rom.o rtc.o rtc_tc8521.o \
|
||||||
scat.o scsi.o scsi_53c400.o scsi_aha1540.o scsi_cd.o scsi_hd.o serial.o sio.o sis496.o sound.o sound_ad1848.o sound_adlib.o sound_adlibgold.o sound_audiopci.o sound_cms.o sound_dbopl.o \
|
scat.o scsi.o scsi_53c400.o scsi_aha1540.o scsi_cd.o scsi_hd.o serial.o sio.o sis496.o sound.o sound_ad1848.o sound_adlib.o sound_adlibgold.o sound_audiopci.o sound_cms.o sound_dbopl.o \
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ CFLAGS = -O3 -march=i686 -fomit-frame-pointer -msse2 -mstackrealign -Wall -Werro
|
||||||
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad.o cbm_io.o cdrom-ioctl.o cdrom-image.o \
|
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad.o cbm_io.o cdrom-ioctl.o cdrom-image.o \
|
||||||
codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_686.o codegen_timing_common.o codegen_timing_pentium.o codegen_timing_winchip.o codegen_x86.o compaq.o config.o cpu.o \
|
codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_686.o codegen_timing_common.o codegen_timing_pentium.o codegen_timing_winchip.o codegen_x86.o compaq.o config.o cpu.o \
|
||||||
dells200.o device.o disc.o disc_fdi.o disc_img.o disc_sector.o dma.o esdi_at.o fdc.o fdc37c665.o fdd.o fdi2raw.o gameport.o hdd.o hdd_esdi.o hdd_file.o headland.o i430lx.o i430fx.o \
|
dells200.o device.o disc.o disc_fdi.o disc_img.o disc_sector.o dma.o esdi_at.o fdc.o fdc37c665.o fdd.o fdi2raw.o gameport.o hdd.o hdd_esdi.o hdd_file.o headland.o i430lx.o i430fx.o \
|
||||||
i430vx.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 \
|
i430vx.o ide.o ide_atapi.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 laserxt.o lpt.o lpt_dac.o lpt_dss.o mca.o mcr.o mem.o mfm_at.o mfm_xebec.o model.o mouse.o mouse_msystems.o mouse_ps2.o \
|
keyboard_olim24.o keyboard_pcjr.o keyboard_xt.o laserxt.o lpt.o lpt_dac.o lpt_dss.o mca.o mcr.o mem.o mfm_at.o mfm_xebec.o model.o mouse.o mouse_msystems.o mouse_ps2.o \
|
||||||
mouse_serial.o neat.o nmi.o nvr.o nvr_tc8521.o olivetti_m24.o opti495.o paths.o pc.o pci.o pic.o piix.o pit.o ppi.o ps1.o ps2.o ps2_mca.o ps2_nvr.o rom.o rtc.o rtc_tc8521.o \
|
mouse_serial.o neat.o nmi.o nvr.o nvr_tc8521.o olivetti_m24.o opti495.o paths.o pc.o pci.o pic.o piix.o pit.o ppi.o ps1.o ps2.o ps2_mca.o ps2_nvr.o rom.o rtc.o rtc_tc8521.o \
|
||||||
scat.o scsi.o scsi_53c400.o scsi_aha1540.o scsi_cd.o scsi_hd.o serial.o sio.o sis496.o sound.o sound_ad1848.o sound_adlib.o sound_adlibgold.o sound_audiopci.o sound_cms.o sound_dbopl.o \
|
scat.o scsi.o scsi_53c400.o scsi_aha1540.o scsi_cd.o scsi_hd.o serial.o sio.o sis496.o sound.o sound_ad1848.o sound_adlib.o sound_adlibgold.o sound_audiopci.o sound_cms.o sound_dbopl.o \
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ CXXFLAGS = $(CFLAGS)
|
||||||
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad.o cbm_io.o cdrom-ioctl.o cdrom-image.o \
|
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad.o cbm_io.o cdrom-ioctl.o cdrom-image.o \
|
||||||
codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_686.o codegen_timing_common.o codegen_timing_pentium.o codegen_timing_winchip.o codegen_x86.o compaq.o config.o cpu.o \
|
codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_686.o codegen_timing_common.o codegen_timing_pentium.o codegen_timing_winchip.o codegen_x86.o compaq.o config.o cpu.o \
|
||||||
device.o dells200.o disc.o disc_fdi.o disc_img.o disc_sector.o dma.o esdi_at.o fdc.o fdc37c665.o fdd.o fdi2raw.o gameport.o hdd.o hdd_esdi.o hdd_file.o headland.o i430lx.o i430fx.o \
|
device.o dells200.o disc.o disc_fdi.o disc_img.o disc_sector.o dma.o esdi_at.o fdc.o fdc37c665.o fdd.o fdi2raw.o gameport.o hdd.o hdd_esdi.o hdd_file.o headland.o i430lx.o i430fx.o \
|
||||||
i430vx.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 \
|
i430vx.o ide.o ide_atapi.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 laserxt.o lpt.o lpt_dac.o lpt_dss.o mca.o mcr.o mem.o mfm_at.o mfm_xebec.o model.o mouse.o mouse_msystems.o mouse_ps2.o \
|
keyboard_olim24.o keyboard_pcjr.o keyboard_xt.o laserxt.o lpt.o lpt_dac.o lpt_dss.o mca.o mcr.o mem.o mfm_at.o mfm_xebec.o model.o mouse.o mouse_msystems.o mouse_ps2.o \
|
||||||
mouse_serial.o neat.o nmi.o nvr.o nvr_tc8521.o olivetti_m24.o opti495.o paths.o pc.o pci.o pic.o piix.o pit.o ppi.o ps1.o ps2.o ps2_mca.o ps2_nvr.o rom.o rtc.o rtc_tc8521.o \
|
mouse_serial.o neat.o nmi.o nvr.o nvr_tc8521.o olivetti_m24.o opti495.o paths.o pc.o pci.o pic.o piix.o pit.o ppi.o ps1.o ps2.o ps2_mca.o ps2_nvr.o rom.o rtc.o rtc_tc8521.o \
|
||||||
scat.o scsi.o scsi_53c400.o scsi_aha1540.o scsi_cd.o scsi_hd.o serial.o sio.o sis496.o sound.o sound_ad1848.o sound_adlib.o sound_adlibgold.o sound_audiopci.o sound_cms.o sound_dbopl.o \
|
scat.o scsi.o scsi_53c400.o scsi_aha1540.o scsi_cd.o scsi_hd.o serial.o sio.o sis496.o sound.o sound_ad1848.o sound_adlib.o sound_adlibgold.o sound_audiopci.o sound_cms.o sound_dbopl.o \
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ CXXFLAGS = $(CFLAGS)
|
||||||
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad.o cbm_io.o cdrom-ioctl.o cdrom-image.o \
|
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad.o cbm_io.o cdrom-ioctl.o cdrom-image.o \
|
||||||
codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_686.o codegen_timing_common.o codegen_timing_pentium.o codegen_timing_winchip.o codegen_x86.o compaq.o config.o cpu.o \
|
codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_686.o codegen_timing_common.o codegen_timing_pentium.o codegen_timing_winchip.o codegen_x86.o compaq.o config.o cpu.o \
|
||||||
device.o dells200.o disc.o disc_fdi.o disc_img.o disc_sector.o dma.o esdi_at.o fdc.o fdc37c665.o fdd.o fdi2raw.o gameport.o hdd.o hdd_esdi.o hdd_file.o headland.o i430lx.o i430fx.o \
|
device.o dells200.o disc.o disc_fdi.o disc_img.o disc_sector.o dma.o esdi_at.o fdc.o fdc37c665.o fdd.o fdi2raw.o gameport.o hdd.o hdd_esdi.o hdd_file.o headland.o i430lx.o i430fx.o \
|
||||||
i430vx.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 \
|
i430vx.o ide.o ide_atapi.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 laserxt.o lpt.o lpt_dac.o lpt_dss.o mca.o mcr.o mem.o mfm_at.o mfm_xebec.o model.o mouse.o mouse_msystems.o mouse_ps2.o \
|
keyboard_olim24.o keyboard_pcjr.o keyboard_xt.o laserxt.o lpt.o lpt_dac.o lpt_dss.o mca.o mcr.o mem.o mfm_at.o mfm_xebec.o model.o mouse.o mouse_msystems.o mouse_ps2.o \
|
||||||
mouse_serial.o neat.o nmi.o nvr.o nvr_tc8521.o olivetti_m24.o opti495.o paths.o pc.o pci.o pic.o piix.o pit.o ppi.o ps1.o ps2.o ps2_mca.o ps2_nvr.o rom.o rtc.o rtc_tc8521.o \
|
mouse_serial.o neat.o nmi.o nvr.o nvr_tc8521.o olivetti_m24.o opti495.o paths.o pc.o pci.o pic.o piix.o pit.o ppi.o ps1.o ps2.o ps2_mca.o ps2_nvr.o rom.o rtc.o rtc_tc8521.o \
|
||||||
scat.o scsi.o scsi_53c400.o scsi_aha1540.o scsi_cd.o scsi_hd.o serial.o sio.o sis496.o sound.o sound_ad1848.o sound_adlib.o sound_adlibgold.o sound_audiopci.o sound_cms.o sound_dbopl.o \
|
scat.o scsi.o scsi_53c400.o scsi_aha1540.o scsi_cd.o scsi_hd.o serial.o sio.o sis496.o sound.o sound_ad1848.o sound_adlib.o sound_adlibgold.o sound_audiopci.o sound_cms.o sound_dbopl.o \
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ CFLAGS = -O3 -fomit-frame-pointer -msse2 -Wall -Werror -fno-strict-aliasing
|
||||||
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad.o cbm_io.o cdrom-ioctl.o cdrom-image.o \
|
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad.o cbm_io.o cdrom-ioctl.o cdrom-image.o \
|
||||||
codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_686.o codegen_timing_common.o codegen_timing_pentium.o codegen_timing_winchip.o codegen_x86-64.o compaq.o config.o cpu.o \
|
codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_686.o codegen_timing_common.o codegen_timing_pentium.o codegen_timing_winchip.o codegen_x86-64.o compaq.o config.o cpu.o \
|
||||||
dells200.o device.o disc.o disc_fdi.o disc_img.o disc_sector.o dma.o esdi_at.o fdc.o fdc37c665.o fdd.o fdi2raw.o gameport.o hdd.o hdd_esdi.o hdd_file.o headland.o i430lx.o i430fx.o \
|
dells200.o device.o disc.o disc_fdi.o disc_img.o disc_sector.o dma.o esdi_at.o fdc.o fdc37c665.o fdd.o fdi2raw.o gameport.o hdd.o hdd_esdi.o hdd_file.o headland.o i430lx.o i430fx.o \
|
||||||
i430vx.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 \
|
i430vx.o ide.o ide_atapi.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 laserxt.o lpt.o lpt_dac.o lpt_dss.o mca.o mcr.o mem.o mfm_at.o mfm_xebec.o model.o mouse.o mouse_msystems.o mouse_ps2.o \
|
keyboard_olim24.o keyboard_pcjr.o keyboard_xt.o laserxt.o lpt.o lpt_dac.o lpt_dss.o mca.o mcr.o mem.o mfm_at.o mfm_xebec.o model.o mouse.o mouse_msystems.o mouse_ps2.o \
|
||||||
mouse_serial.o neat.o nmi.o nvr.o nvr_tc8521.o olivetti_m24.o opti495.o paths.o pc.o pci.o pic.o piix.o pit.o ppi.o ps1.o ps2.o ps2_mca.o ps2_nvr.o rom.o rtc.o rtc_tc8521.o \
|
mouse_serial.o neat.o nmi.o nvr.o nvr_tc8521.o olivetti_m24.o opti495.o paths.o pc.o pci.o pic.o piix.o pit.o ppi.o ps1.o ps2.o ps2_mca.o ps2_nvr.o rom.o rtc.o rtc_tc8521.o \
|
||||||
scat.o scsi.o scsi_53c400.o scsi_aha1540.o scsi_cd.o scsi_hd.o serial.o sio.o sis496.o sound.o sound_ad1848.o sound_adlib.o sound_adlibgold.o sound_audiopci.o sound_cms.o sound_dbopl.o \
|
scat.o scsi.o scsi_53c400.o scsi_aha1540.o scsi_cd.o scsi_hd.o serial.o sio.o sis496.o sound.o sound_ad1848.o sound_adlib.o sound_adlibgold.o sound_audiopci.o sound_cms.o sound_dbopl.o \
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ CFLAGS = -D__unix=1 -DPCEM_RENDER_WITH_TIMER -DPCEM_RENDER_TIMER_LOOP -Dfopen64=
|
||||||
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad.o cbm_io.o cdrom-ioctl-osx.o cdrom-image.o cdrom-null.o \
|
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad.o cbm_io.o cdrom-ioctl-osx.o cdrom-image.o cdrom-null.o \
|
||||||
codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_686.o codegen_timing_common.o codegen_timing_pentium.o codegen_timing_winchip.o codegen_x86-64.c compaq.o config.o cpu.o \
|
codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_686.o codegen_timing_common.o codegen_timing_pentium.o codegen_timing_winchip.o codegen_x86-64.c compaq.o config.o cpu.o \
|
||||||
device.o dells200.o disc.o disc_fdi.o disc_img.o disc_sector.o dma.o esdi_at.o fdc.o fdc37c665.o fdd.o fdi2raw.o gameport.o \
|
device.o dells200.o disc.o disc_fdi.o disc_img.o disc_sector.o dma.o esdi_at.o fdc.o fdc37c665.o fdd.o fdi2raw.o gameport.o \
|
||||||
hdd.o hdd_esdi.o hdd_file.o headland.o i430lx.o i430fx.o i430vx.o ide.o intel.o intel_flash.o io.o jim.o joystick_ch_flightstick_pro.o joystick_standard.o joystick_sw_pad.o \
|
hdd.o hdd_esdi.o hdd_file.o headland.o i430lx.o i430fx.o i430vx.o ide.o ide_atapi.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 \
|
joystick_tm_fcs.o keyboard.o keyboard_amstrad.o keyboard_at.o keyboard_olim24.o keyboard_pcjr.o keyboard_xt.o \
|
||||||
laserxt.o lpt.o lpt_dac.o lpt_dss.o mca.o mcr.o mem.o mfm_at.o mfm_xebec.o model.o mouse.o mouse_msystems.o mouse_ps2.o mouse_serial.o neat.o nmi.o nvr.o nvr_tc8521.o olivetti_m24.o \
|
laserxt.o lpt.o lpt_dac.o lpt_dss.o mca.o mcr.o mem.o mfm_at.o mfm_xebec.o model.o mouse.o mouse_msystems.o mouse_ps2.o mouse_serial.o neat.o nmi.o nvr.o nvr_tc8521.o olivetti_m24.o \
|
||||||
opti495.o paths.o pc.o pci.o pic.o piix.o pit.o ppi.o ps1.o ps2.o ps2_mca.o ps2_nvr.o rom.o rtc.o rtc_tc8521.o scat.o scsi.o scsi_53c400.o scsi_aha1540.o scsi_cd.o scsi_hd.o \
|
opti495.o paths.o pc.o pci.o pic.o piix.o pit.o ppi.o ps1.o ps2.o ps2_mca.o ps2_nvr.o rom.o rtc.o rtc_tc8521.o scat.o scsi.o scsi_53c400.o scsi_aha1540.o scsi_cd.o scsi_hd.o \
|
||||||
|
|
|
||||||
|
|
@ -600,3 +600,5 @@ void saveconfig_global_only();
|
||||||
#define UNUSED(x) (void)x
|
#define UNUSED(x) (void)x
|
||||||
|
|
||||||
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||||
|
|
||||||
|
void ide_padstr(char *str, const char *src, int len);
|
||||||
|
|
|
||||||
13
src/ide.h
13
src/ide.h
|
|
@ -16,6 +16,7 @@ extern void ide_sec_enable();
|
||||||
extern void ide_pri_disable();
|
extern void ide_pri_disable();
|
||||||
extern void ide_sec_disable();
|
extern void ide_sec_disable();
|
||||||
extern void ide_set_bus_master(int (*read_sector)(int channel, uint8_t *data), int (*write_sector)(int channel, uint8_t *data), void (*set_irq)(int channel));
|
extern void ide_set_bus_master(int (*read_sector)(int channel, uint8_t *data), int (*write_sector)(int channel, uint8_t *data), void (*set_irq)(int channel));
|
||||||
|
void ide_irq_raise(struct IDE *ide);
|
||||||
|
|
||||||
#include "ide_atapi.h"
|
#include "ide_atapi.h"
|
||||||
|
|
||||||
|
|
@ -34,4 +35,16 @@ uint32_t atapi_get_cd_volume(int channel);
|
||||||
|
|
||||||
extern device_t ide_device;
|
extern device_t ide_device;
|
||||||
|
|
||||||
|
/* Bits of 'atastat' */
|
||||||
|
#define ERR_STAT 0x01
|
||||||
|
#define DRQ_STAT 0x08 /* Data request */
|
||||||
|
#define DSC_STAT 0x10
|
||||||
|
#define SERVICE_STAT 0x10
|
||||||
|
#define READY_STAT 0x40
|
||||||
|
#define BUSY_STAT 0x80
|
||||||
|
|
||||||
|
/* Bits of 'error' */
|
||||||
|
#define ABRT_ERR 0x04 /* Command aborted */
|
||||||
|
#define MCR_ERR 0x08 /* Media change request */
|
||||||
|
|
||||||
#endif //__IDE__
|
#endif //__IDE__
|
||||||
|
|
|
||||||
469
src/ide_atapi.c
Normal file
469
src/ide_atapi.c
Normal file
|
|
@ -0,0 +1,469 @@
|
||||||
|
#include "ibm.h"
|
||||||
|
#include "ide.h"
|
||||||
|
#include "ide_atapi.h"
|
||||||
|
#include "scsi.h"
|
||||||
|
#include "timer.h"
|
||||||
|
|
||||||
|
#define IDE_TIME (5 * 100 * (1 << TIMER_SHIFT))
|
||||||
|
|
||||||
|
#define ATAPI_STATE_IDLE 0
|
||||||
|
#define ATAPI_STATE_COMMAND 1
|
||||||
|
#define ATAPI_STATE_GOT_COMMAND 2
|
||||||
|
#define ATAPI_STATE_NEXT_PHASE 3
|
||||||
|
#define ATAPI_STATE_READ_STATUS 4
|
||||||
|
#define ATAPI_STATE_READ_MESSAGE 5
|
||||||
|
#define ATAPI_STATE_END_PHASE 6
|
||||||
|
#define ATAPI_STATE_READ_DATA 7
|
||||||
|
#define ATAPI_STATE_READ_DATA_WAIT 8
|
||||||
|
#define ATAPI_STATE_WRITE_DATA 9
|
||||||
|
#define ATAPI_STATE_WRITE_DATA_WAIT 10
|
||||||
|
|
||||||
|
ATAPI *atapi;
|
||||||
|
|
||||||
|
void atapi_data_write(atapi_device_t *atapi_dev, uint16_t val)
|
||||||
|
{
|
||||||
|
switch (atapi_dev->state)
|
||||||
|
{
|
||||||
|
case ATAPI_STATE_COMMAND:
|
||||||
|
atapi_dev->command[atapi_dev->command_pos++] = val & 0xff;
|
||||||
|
atapi_dev->command[atapi_dev->command_pos++] = val >> 8;
|
||||||
|
if (atapi_dev->command_pos >= 12)
|
||||||
|
{
|
||||||
|
atapi_dev->state = ATAPI_STATE_GOT_COMMAND;
|
||||||
|
idecallback[atapi_dev->board] = 6 * IDE_TIME;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ATAPI_STATE_WRITE_DATA_WAIT:
|
||||||
|
atapi_dev->data[atapi_dev->data_write_pos++] = val & 0xff;
|
||||||
|
atapi_dev->data[atapi_dev->data_write_pos++] = val >> 8;
|
||||||
|
// pclog("Write ATAPI data %i %i %i\n", atapi_dev->data_write_pos, atapi_dev->data_read_pos, idecallback[atapi_dev->board]);
|
||||||
|
if (atapi_dev->data_write_pos >= atapi_dev->data_read_pos)
|
||||||
|
{
|
||||||
|
atapi_dev->bus_state = 0;
|
||||||
|
atapi_dev->state = ATAPI_STATE_WRITE_DATA;
|
||||||
|
idecallback[atapi_dev->board] = 6 * IDE_TIME;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t atapi_data_read(atapi_device_t *atapi_dev)
|
||||||
|
{
|
||||||
|
uint16_t temp = 0xffff;
|
||||||
|
|
||||||
|
switch (atapi_dev->state)
|
||||||
|
{
|
||||||
|
case ATAPI_STATE_READ_DATA_WAIT:
|
||||||
|
if (atapi_dev->data_read_pos >= atapi_dev->data_write_pos)
|
||||||
|
{
|
||||||
|
// pclog("ATAPI_STATE_READ_DATA_WAIT - out of data!\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
temp = atapi_dev->data[atapi_dev->data_read_pos++];
|
||||||
|
if (atapi_dev->data_read_pos < atapi_dev->data_write_pos)
|
||||||
|
temp |= (atapi_dev->data[atapi_dev->data_read_pos++] << 8);
|
||||||
|
// pclog("Read data %04x\n", temp);
|
||||||
|
if (atapi_dev->data_read_pos >= atapi_dev->data_write_pos)
|
||||||
|
{
|
||||||
|
atapi_dev->state = ATAPI_STATE_NEXT_PHASE;
|
||||||
|
idecallback[atapi_dev->board] = 6*IDE_TIME;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int wait_for_bus(scsi_bus_t *bus, int state, int req_needed)
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
|
||||||
|
for (c = 0; c < 20; c++)
|
||||||
|
{
|
||||||
|
int bus_state = scsi_bus_read(bus);
|
||||||
|
|
||||||
|
if ((bus_state & (BUS_IO | BUS_CD | BUS_MSG)) == state && (bus_state & BUS_BSY))
|
||||||
|
{
|
||||||
|
if (!req_needed || (bus_state & BUS_REQ))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void atapi_command_start(atapi_device_t *atapi)
|
||||||
|
{
|
||||||
|
scsi_bus_t *bus = &atapi->bus;
|
||||||
|
|
||||||
|
scsi_bus_update(bus, BUS_SEL | BUS_SETDATA(1 << 0));
|
||||||
|
if (!(scsi_bus_read(bus) & BUS_BSY))
|
||||||
|
fatal("STATE_SCSI_SELECT failed to select target\n");
|
||||||
|
|
||||||
|
scsi_bus_update(bus, 0);
|
||||||
|
if (!(scsi_bus_read(bus) & BUS_BSY))
|
||||||
|
fatal("STATE_SCSI_SELECT failed to select target 2\n");
|
||||||
|
|
||||||
|
/*Device should now be selected*/
|
||||||
|
if (!wait_for_bus(bus, BUS_CD, 1))
|
||||||
|
fatal("Device failed to request command\n");
|
||||||
|
|
||||||
|
atapi->state = ATAPI_STATE_COMMAND;
|
||||||
|
atapi->command_pos = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t atapi_read_iir(atapi_device_t *atapi_dev)
|
||||||
|
{
|
||||||
|
uint8_t val = 0;
|
||||||
|
int bus_status = atapi_dev->bus_state;//scsi_bus_read(&atapi_dev->bus);
|
||||||
|
|
||||||
|
if (bus_status & BUS_CD)
|
||||||
|
val |= 1;
|
||||||
|
if (bus_status & BUS_IO)
|
||||||
|
val |= 2;
|
||||||
|
|
||||||
|
// pclog("Read IIR %02X %02x\n", val, bus_status);
|
||||||
|
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t atapi_read_drq(atapi_device_t *atapi_dev)
|
||||||
|
{
|
||||||
|
return atapi_dev->bus_state & BUS_REQ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void atapi_process_packet(atapi_device_t *atapi_dev)
|
||||||
|
{
|
||||||
|
// pclog("atapi_process_packet: state=%i\n", atapi_dev->state);
|
||||||
|
switch (atapi_dev->state)
|
||||||
|
{
|
||||||
|
case ATAPI_STATE_COMMAND:
|
||||||
|
*atapi_dev->atastat = READY_STAT | (*atapi_dev->atastat & ERR_STAT);
|
||||||
|
atapi_dev->max_transfer_len = *atapi_dev->cylinder;
|
||||||
|
atapi_dev->bus_state = BUS_CD | BUS_REQ;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ATAPI_STATE_GOT_COMMAND:
|
||||||
|
{
|
||||||
|
int pos = 0;
|
||||||
|
int bus_state;
|
||||||
|
int c;
|
||||||
|
|
||||||
|
for (c = 0; c < 20; c++)
|
||||||
|
{
|
||||||
|
bus_state = scsi_bus_read(&atapi_dev->bus);
|
||||||
|
|
||||||
|
if (!(bus_state & BUS_BSY))
|
||||||
|
fatal("SEND_COMMAND - dropped BSY\n");
|
||||||
|
if ((bus_state & (BUS_IO | BUS_CD | BUS_MSG)) != BUS_CD)
|
||||||
|
fatal("SEND_COMMAND - bus phase incorrect\n");
|
||||||
|
if (bus_state & BUS_REQ)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (c == 20)
|
||||||
|
fatal("SEND_COMMAND timed out\n");
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
int bus_out;
|
||||||
|
|
||||||
|
for (c = 0; c < 20; c++)
|
||||||
|
{
|
||||||
|
int bus_state = scsi_bus_read(&atapi_dev->bus);
|
||||||
|
|
||||||
|
if (!(bus_state & BUS_BSY))
|
||||||
|
fatal("SEND_COMMAND - dropped BSY\n");
|
||||||
|
if ((bus_state & (BUS_IO | BUS_CD | BUS_MSG)) != BUS_CD)
|
||||||
|
break;
|
||||||
|
if (bus_state & BUS_REQ)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (c == 20)
|
||||||
|
{
|
||||||
|
// pclog("SEND_COMMAND timed out %x\n", scsi_bus_read(&atapi_dev->bus));
|
||||||
|
atapi_dev->state = ATAPI_STATE_NEXT_PHASE;
|
||||||
|
idecallback[atapi_dev->board] = 6 * IDE_TIME;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
bus_state = scsi_bus_read(&atapi_dev->bus);
|
||||||
|
|
||||||
|
if ((bus_state & (BUS_IO | BUS_CD | BUS_MSG | BUS_REQ)) != (BUS_CD | BUS_REQ))
|
||||||
|
{
|
||||||
|
// pclog("SEND_COMMAND - bus state changed %x\n", bus_state);
|
||||||
|
atapi_dev->state = ATAPI_STATE_NEXT_PHASE;
|
||||||
|
idecallback[atapi_dev->board] = 6 * IDE_TIME;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pos >= atapi_dev->command_pos)
|
||||||
|
bus_out = BUS_SETDATA(0); /*Pad out with zeroes*/
|
||||||
|
else
|
||||||
|
bus_out = BUS_SETDATA(atapi_dev->command[pos++]);
|
||||||
|
scsi_bus_update(&atapi_dev->bus, bus_out | BUS_ACK);
|
||||||
|
scsi_bus_update(&atapi_dev->bus, bus_out & ~BUS_ACK);
|
||||||
|
|
||||||
|
if (!(bus_state & BUS_BSY))
|
||||||
|
fatal("SEND_COMMAND - dropped BSY\n");
|
||||||
|
|
||||||
|
// if (pos >= atapi_dev->command_pos)
|
||||||
|
// fatal("Out of data!\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ATAPI_STATE_NEXT_PHASE:
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
|
||||||
|
for (c = 0; c < 20; c++)
|
||||||
|
{
|
||||||
|
int bus_state = scsi_bus_read(&atapi_dev->bus);
|
||||||
|
|
||||||
|
// if (!c)
|
||||||
|
// pclog("NEXT_PHASE - %x\n", bus_state);
|
||||||
|
if (!(bus_state & BUS_BSY))
|
||||||
|
fatal("NEXT_PHASE - dropped BSY waiting\n");
|
||||||
|
|
||||||
|
if (bus_state & BUS_REQ)
|
||||||
|
{
|
||||||
|
scsi_device_t *scsi_dev = atapi_dev->bus.devices[0];
|
||||||
|
void *scsi_data = atapi_dev->bus.device_data[0];
|
||||||
|
|
||||||
|
switch (bus_state & (BUS_IO | BUS_CD | BUS_MSG))
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
atapi_dev->state = ATAPI_STATE_WRITE_DATA_WAIT;
|
||||||
|
|
||||||
|
atapi_dev->data_read_pos = scsi_dev->get_bytes_required(scsi_data);
|
||||||
|
if (atapi_dev->data_read_pos > atapi_dev->max_transfer_len)
|
||||||
|
atapi_dev->data_read_pos = atapi_dev->max_transfer_len;
|
||||||
|
|
||||||
|
atapi_dev->data_write_pos = 0;
|
||||||
|
*atapi_dev->cylinder = atapi_dev->data_read_pos;
|
||||||
|
|
||||||
|
// pclog("WRITE_DATA: bytes=%i\n", *atapi_dev->cylinder);
|
||||||
|
*atapi_dev->atastat = READY_STAT | DRQ_STAT | (*atapi_dev->atastat & ERR_STAT);
|
||||||
|
atapi_dev->bus_state = BUS_REQ;
|
||||||
|
ide_irq_raise(atapi_dev->ide);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BUS_IO:
|
||||||
|
atapi_dev->state = ATAPI_STATE_READ_DATA;
|
||||||
|
atapi_dev->data_read_pos = atapi_dev->data_write_pos = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case (BUS_IO | BUS_CD):
|
||||||
|
atapi_dev->state = ATAPI_STATE_READ_STATUS;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case (BUS_CD | BUS_IO | BUS_MSG):
|
||||||
|
atapi_dev->state = ATAPI_STATE_READ_MESSAGE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
fatal("NEXT_PHASE - bus state changed %x\n", bus_state);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
idecallback[atapi_dev->board] = 6 * IDE_TIME;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ATAPI_STATE_READ_STATUS:
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
|
||||||
|
for (c = 0; c < 20; c++)
|
||||||
|
{
|
||||||
|
int bus_state = scsi_bus_read(&atapi_dev->bus);
|
||||||
|
|
||||||
|
if (!(bus_state & BUS_BSY))
|
||||||
|
fatal("READ_STATUS - dropped BSY waiting\n");
|
||||||
|
|
||||||
|
if ((bus_state & (BUS_IO | BUS_CD | BUS_MSG)) != (BUS_CD | BUS_IO))
|
||||||
|
fatal("READ_STATUS - changed phase\n");
|
||||||
|
|
||||||
|
if (bus_state & BUS_REQ)
|
||||||
|
{
|
||||||
|
// uint8_t status = BUS_GETDATA(bus_state);
|
||||||
|
int bus_out = 0;
|
||||||
|
|
||||||
|
// pclog("Read status %02x\n", status);
|
||||||
|
|
||||||
|
scsi_bus_update(&atapi_dev->bus, bus_out | BUS_ACK);
|
||||||
|
scsi_bus_update(&atapi_dev->bus, bus_out & ~BUS_ACK);
|
||||||
|
|
||||||
|
atapi_dev->state = ATAPI_STATE_NEXT_PHASE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
idecallback[atapi_dev->board] = 6 * IDE_TIME;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ATAPI_STATE_READ_MESSAGE:
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
|
||||||
|
for (c = 0; c < 20; c++)
|
||||||
|
{
|
||||||
|
int bus_state = scsi_bus_read(&atapi_dev->bus);
|
||||||
|
|
||||||
|
if (!(bus_state & BUS_BSY))
|
||||||
|
fatal("READ_MESSAGE - dropped BSY waiting\n");
|
||||||
|
|
||||||
|
if ((bus_state & (BUS_IO | BUS_CD | BUS_MSG)) != (BUS_CD | BUS_IO | BUS_MSG))
|
||||||
|
{
|
||||||
|
// pclog("READ_MESSAGE - changed phase\n");
|
||||||
|
atapi_dev->state = ATAPI_STATE_NEXT_PHASE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bus_state & BUS_REQ)
|
||||||
|
{
|
||||||
|
uint8_t msg = BUS_GETDATA(bus_state);
|
||||||
|
int bus_out = 0;
|
||||||
|
|
||||||
|
// pclog("Read message %02x\n", msg);
|
||||||
|
scsi_bus_update(&atapi_dev->bus, bus_out | BUS_ACK);
|
||||||
|
scsi_bus_update(&atapi_dev->bus, bus_out & ~BUS_ACK);
|
||||||
|
|
||||||
|
switch (msg)
|
||||||
|
{
|
||||||
|
case MSG_COMMAND_COMPLETE:
|
||||||
|
atapi_dev->state = ATAPI_STATE_END_PHASE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
fatal("READ_MESSAGE - unknown message %02x\n", msg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
idecallback[atapi_dev->board] = 6 * IDE_TIME;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ATAPI_STATE_READ_DATA:
|
||||||
|
{
|
||||||
|
while (atapi_dev->data_write_pos < atapi_dev->max_transfer_len)
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
|
||||||
|
for (c = 0; c < 20; c++)
|
||||||
|
{
|
||||||
|
int bus_state = scsi_bus_read(&atapi_dev->bus);
|
||||||
|
|
||||||
|
if (!(bus_state & BUS_BSY))
|
||||||
|
fatal("READ_DATA - dropped BSY waiting\n");
|
||||||
|
|
||||||
|
if ((bus_state & (BUS_IO | BUS_CD | BUS_MSG)) != BUS_IO)
|
||||||
|
{
|
||||||
|
// pclog("READ_DATA - changed phase\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bus_state & BUS_REQ)
|
||||||
|
{
|
||||||
|
uint8_t data = BUS_GETDATA(bus_state);
|
||||||
|
int bus_out = 0;
|
||||||
|
|
||||||
|
atapi_dev->data[atapi_dev->data_write_pos++] = data;
|
||||||
|
|
||||||
|
// pclog("Read data %02x %i\n", data, atapi_dev->data_write_pos);
|
||||||
|
scsi_bus_update(&atapi_dev->bus, bus_out | BUS_ACK);
|
||||||
|
scsi_bus_update(&atapi_dev->bus, bus_out & ~BUS_ACK);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((scsi_bus_read(&atapi_dev->bus) & (BUS_IO | BUS_CD | BUS_MSG)) != BUS_IO)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
atapi_dev->state = ATAPI_STATE_READ_DATA_WAIT;
|
||||||
|
*atapi_dev->atastat = READY_STAT | DRQ_STAT | (*atapi_dev->atastat & ERR_STAT);
|
||||||
|
*atapi_dev->cylinder = atapi_dev->data_write_pos;
|
||||||
|
// pclog("READ_DATA: bytes=%i\n", *atapi_dev->cylinder);
|
||||||
|
atapi_dev->bus_state = BUS_IO | BUS_REQ;
|
||||||
|
ide_irq_raise(atapi_dev->ide);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ATAPI_STATE_WRITE_DATA:
|
||||||
|
{
|
||||||
|
atapi_dev->data_read_pos = 0;
|
||||||
|
// pclog("ATAPI_STATE_WRITE_DATA - %i\n", atapi_dev->data_write_pos);
|
||||||
|
while (atapi_dev->data_read_pos < atapi_dev->data_write_pos)
|
||||||
|
{
|
||||||
|
int bus_state = scsi_bus_read(&atapi_dev->bus);
|
||||||
|
|
||||||
|
if (!(bus_state & BUS_BSY))
|
||||||
|
fatal("WRITE_DATA - dropped BSY waiting\n");
|
||||||
|
|
||||||
|
if ((bus_state & (BUS_IO | BUS_CD | BUS_MSG)) != 0)
|
||||||
|
{
|
||||||
|
// pclog("WRITE_DATA - changed phase\n");
|
||||||
|
atapi_dev->state = ATAPI_STATE_NEXT_PHASE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bus_state & BUS_REQ)
|
||||||
|
{
|
||||||
|
uint8_t data = atapi_dev->data[atapi_dev->data_read_pos++];
|
||||||
|
int bus_out;
|
||||||
|
|
||||||
|
// pclog("Write data %02x %i\n", data, atapi_dev->data_read_pos-1);
|
||||||
|
bus_out = BUS_SETDATA(data);
|
||||||
|
scsi_bus_update(&atapi_dev->bus, bus_out | BUS_ACK);
|
||||||
|
scsi_bus_update(&atapi_dev->bus, bus_out & ~BUS_ACK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
atapi_dev->state = ATAPI_STATE_NEXT_PHASE;
|
||||||
|
idecallback[atapi_dev->board] = 6 * IDE_TIME;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ATAPI_STATE_END_PHASE:
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
/*Wait for SCSI command to move to next phase*/
|
||||||
|
for (c = 0; c < 20; c++)
|
||||||
|
{
|
||||||
|
int bus_state = scsi_bus_read(&atapi_dev->bus);
|
||||||
|
|
||||||
|
if (!(bus_state & BUS_BSY))
|
||||||
|
{
|
||||||
|
// pclog("END_PHASE - dropped BSY waiting\n");
|
||||||
|
atapi_dev->state = ATAPI_STATE_IDLE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bus_state & BUS_REQ)
|
||||||
|
fatal("END_PHASE - unexpected REQ\n");
|
||||||
|
}
|
||||||
|
if (atapi_dev->state == ATAPI_STATE_IDLE)
|
||||||
|
{
|
||||||
|
scsi_device_t *scsi_dev = atapi_dev->bus.devices[0];
|
||||||
|
void *scsi_data = atapi_dev->bus.device_data[0];
|
||||||
|
|
||||||
|
*atapi_dev->atastat = READY_STAT;
|
||||||
|
atapi_dev->bus_state = BUS_IO | BUS_CD;
|
||||||
|
if (scsi_dev->get_status(scsi_data) != STATUS_GOOD)
|
||||||
|
{
|
||||||
|
*atapi_dev->error = (scsi_dev->get_sense_key(scsi_data) << 4) | ABRT_ERR;
|
||||||
|
if (scsi_dev->get_sense_key(scsi_data) == KEY_UNIT_ATTENTION)
|
||||||
|
*atapi_dev->error |= MCR_ERR;
|
||||||
|
*atapi_dev->atastat |= ERR_STAT;
|
||||||
|
}
|
||||||
|
ide_irq_raise(atapi_dev->ide);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
idecallback[atapi_dev->board] = 6 * IDE_TIME;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
#ifndef __IDE_ATAPI__
|
#ifndef __IDE_ATAPI__
|
||||||
#define __IDE_ATAPI__
|
#define __IDE_ATAPI__
|
||||||
|
|
||||||
|
#include "scsi.h"
|
||||||
|
|
||||||
/*ATAPI stuff*/
|
/*ATAPI stuff*/
|
||||||
typedef struct ATAPI
|
typedef struct ATAPI
|
||||||
{
|
{
|
||||||
|
|
@ -28,6 +30,36 @@ typedef struct ATAPI
|
||||||
extern ATAPI *atapi;
|
extern ATAPI *atapi;
|
||||||
|
|
||||||
void atapi_discchanged();
|
void atapi_discchanged();
|
||||||
void atapi_insert_cdrom();
|
|
||||||
|
typedef struct atapi_device_t
|
||||||
|
{
|
||||||
|
scsi_bus_t bus;
|
||||||
|
|
||||||
|
uint8_t command[12];
|
||||||
|
int command_pos;
|
||||||
|
|
||||||
|
int state;
|
||||||
|
|
||||||
|
int max_transfer_len;
|
||||||
|
|
||||||
|
uint8_t data[65536];
|
||||||
|
int data_read_pos, data_write_pos;
|
||||||
|
|
||||||
|
int bus_state;
|
||||||
|
|
||||||
|
struct IDE *ide;
|
||||||
|
|
||||||
|
int board;
|
||||||
|
uint8_t *atastat;
|
||||||
|
uint8_t *error;
|
||||||
|
int *cylinder;
|
||||||
|
} atapi_device_t;
|
||||||
|
|
||||||
|
void atapi_data_write(atapi_device_t *atapi_dev, uint16_t val);
|
||||||
|
uint16_t atapi_data_read(atapi_device_t *atapi_dev);
|
||||||
|
void atapi_command_start(atapi_device_t *atapi);
|
||||||
|
uint8_t atapi_read_iir(atapi_device_t *atapi_dev);
|
||||||
|
uint8_t atapi_read_drq(atapi_device_t *atapi_dev);
|
||||||
|
void atapi_process_packet(atapi_device_t *atapi_dev);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
37
src/scsi.c
37
src/scsi.c
|
|
@ -101,7 +101,7 @@ int scsi_bus_update(scsi_bus_t *bus, int bus_assert)
|
||||||
bus->new_state = bus->bus_out & (BUS_IO | BUS_CD | BUS_MSG);
|
bus->new_state = bus->bus_out & (BUS_IO | BUS_CD | BUS_MSG);
|
||||||
bus->bus_out &= ~BUS_REQ;
|
bus->bus_out &= ~BUS_REQ;
|
||||||
|
|
||||||
if (cmd_len[bus->command[0] >> 5] == bus->command_pos)
|
if (bus->command_pos == (bus->is_atapi ? 12 : cmd_len[bus->command[0] >> 5]))
|
||||||
{
|
{
|
||||||
int new_state;
|
int new_state;
|
||||||
|
|
||||||
|
|
@ -322,6 +322,19 @@ void scsi_bus_kick(scsi_bus_t *bus)
|
||||||
scsi_bus_update(bus, 0);
|
scsi_bus_update(bus, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void scsi_bus_atapi_init(scsi_bus_t *bus, scsi_device_t *device, int id)
|
||||||
|
{
|
||||||
|
memset(bus->devices, 0, sizeof(bus->devices));
|
||||||
|
memset(bus->device_data, 0, sizeof(bus->device_data));
|
||||||
|
|
||||||
|
bus->devices[0] = device;
|
||||||
|
bus->device_data[0] = bus->devices[0]->atapi_init(bus, id);
|
||||||
|
if (!bus->device_data[0])
|
||||||
|
bus->devices[0] = NULL;
|
||||||
|
|
||||||
|
bus->is_atapi = 1;
|
||||||
|
}
|
||||||
|
|
||||||
void scsi_bus_init(scsi_bus_t *bus)
|
void scsi_bus_init(scsi_bus_t *bus)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
|
|
@ -331,21 +344,17 @@ void scsi_bus_init(scsi_bus_t *bus)
|
||||||
|
|
||||||
for (c = 0; c < 4; c++)
|
for (c = 0; c < 4; c++)
|
||||||
{
|
{
|
||||||
if (cdrom_channel != c)
|
if (cdrom_channel == c)
|
||||||
{
|
|
||||||
bus->devices[c] = &scsi_hd;
|
|
||||||
bus->device_data[c] = bus->devices[c]->init(bus, c);
|
|
||||||
if (!bus->device_data[c])
|
|
||||||
bus->devices[c] = NULL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
bus->devices[c] = &scsi_cd;
|
bus->devices[c] = &scsi_cd;
|
||||||
bus->device_data[c] = bus->devices[c]->init(bus, c);
|
else
|
||||||
if (!bus->device_data[c])
|
bus->devices[c] = &scsi_hd;
|
||||||
bus->devices[c] = NULL;
|
|
||||||
}
|
bus->device_data[c] = bus->devices[c]->init(bus, c);
|
||||||
|
if (!bus->device_data[c])
|
||||||
|
bus->devices[c] = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bus->is_atapi = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void scsi_bus_close(scsi_bus_t *bus)
|
void scsi_bus_close(scsi_bus_t *bus)
|
||||||
|
|
|
||||||
35
src/scsi.h
35
src/scsi.h
|
|
@ -1,14 +1,22 @@
|
||||||
|
#ifndef _SCSI_H_
|
||||||
|
#define _SCSI_H_
|
||||||
|
|
||||||
struct scsi_bus_t;
|
struct scsi_bus_t;
|
||||||
|
|
||||||
typedef struct scsi_device_t
|
typedef struct scsi_device_t
|
||||||
{
|
{
|
||||||
void *(*init)(struct scsi_bus_t *bus, int id);
|
void *(*init)(struct scsi_bus_t *bus, int id);
|
||||||
|
void *(*atapi_init)(struct scsi_bus_t *bus, int id);
|
||||||
void (*close)(void *p);
|
void (*close)(void *p);
|
||||||
|
|
||||||
void (*start_command)(void *p);
|
void (*start_command)(void *p);
|
||||||
int (*command)(uint8_t *cdb, void *p);
|
int (*command)(uint8_t *cdb, void *p);
|
||||||
|
|
||||||
uint8_t (*get_status)(void *p);
|
uint8_t (*get_status)(void *p);
|
||||||
|
uint8_t (*get_sense_key)(void *p);
|
||||||
|
int (*get_bytes_required)(void *p);
|
||||||
|
|
||||||
|
void (*atapi_identify)(uint16_t *buffer, void *p);
|
||||||
|
|
||||||
uint8_t (*read)(void *p);
|
uint8_t (*read)(void *p);
|
||||||
void (*write)(uint8_t val, void *p);
|
void (*write)(uint8_t val, void *p);
|
||||||
|
|
@ -34,6 +42,8 @@ typedef struct scsi_bus_t
|
||||||
|
|
||||||
int change_state_delay;
|
int change_state_delay;
|
||||||
int new_req_delay;
|
int new_req_delay;
|
||||||
|
|
||||||
|
int is_atapi;
|
||||||
} scsi_bus_t;
|
} scsi_bus_t;
|
||||||
|
|
||||||
//int scsi_add_data(uint8_t val);
|
//int scsi_add_data(uint8_t val);
|
||||||
|
|
@ -59,6 +69,7 @@ void scsi_set_irq(uint8_t status);
|
||||||
#define SCSI_SEEK_10 0x2b
|
#define SCSI_SEEK_10 0x2b
|
||||||
#define SCSI_VERIFY_10 0x2f
|
#define SCSI_VERIFY_10 0x2f
|
||||||
#define SCSI_READ_BUFFER 0x3c
|
#define SCSI_READ_BUFFER 0x3c
|
||||||
|
#define SCSI_MODE_SENSE_10 0x5a
|
||||||
|
|
||||||
#define SCSI_RESERVE 0x16
|
#define SCSI_RESERVE 0x16
|
||||||
#define SCSI_RELEASE 0x17
|
#define SCSI_RELEASE 0x17
|
||||||
|
|
@ -92,10 +103,25 @@ int scsi_bus_match(scsi_bus_t *bus, int bus_assert);
|
||||||
void scsi_bus_kick(scsi_bus_t *bus);
|
void scsi_bus_kick(scsi_bus_t *bus);
|
||||||
void scsi_bus_init(scsi_bus_t *bus);
|
void scsi_bus_init(scsi_bus_t *bus);
|
||||||
void scsi_bus_close(scsi_bus_t *bus);
|
void scsi_bus_close(scsi_bus_t *bus);
|
||||||
|
void scsi_bus_atapi_init(scsi_bus_t *bus, scsi_device_t *device, int id);
|
||||||
|
|
||||||
#define KEY_ILLEGAL_REQ 5
|
#define KEY_NONE 0
|
||||||
|
#define KEY_NOT_READY 2
|
||||||
|
#define KEY_ILLEGAL_REQ 5
|
||||||
|
#define KEY_UNIT_ATTENTION 6
|
||||||
|
#define KEY_DATA_PROTECT 7
|
||||||
|
|
||||||
|
#define ASC_AUDIO_PLAY_OPERATION 0x00
|
||||||
|
#define ASC_ILLEGAL_OPCODE 0x20
|
||||||
|
#define ASC_LBA_OUT_OF_RANGE 0x21
|
||||||
|
#define ASC_INV_FIELD_IN_CMD_PACKET 0x24
|
||||||
|
#define ASC_INVALID_LUN 0x25
|
||||||
|
#define ASC_WRITE_PROTECT 0x27
|
||||||
|
#define ASC_MEDIUM_MAY_HAVE_CHANGED 0x28
|
||||||
|
#define ASC_MEDIUM_NOT_PRESENT 0x3a
|
||||||
|
#define ASC_DATA_PHASE_ERROR 0x4b
|
||||||
|
#define ASC_ILLEGAL_MODE_FOR_THIS_TRACK 0x64
|
||||||
|
|
||||||
#define ASC_INVALID_LUN 0x25
|
|
||||||
|
|
||||||
#define SCSI_PHASE_DATA_OUT 0
|
#define SCSI_PHASE_DATA_OUT 0
|
||||||
#define SCSI_PHASE_DATA_IN BUS_IO
|
#define SCSI_PHASE_DATA_IN BUS_IO
|
||||||
|
|
@ -103,3 +129,8 @@ void scsi_bus_close(scsi_bus_t *bus);
|
||||||
#define SCSI_PHASE_STATUS (BUS_CD | BUS_IO)
|
#define SCSI_PHASE_STATUS (BUS_CD | BUS_IO)
|
||||||
#define SCSI_PHASE_MESSAGE_OUT (BUS_MSG | BUS_CD)
|
#define SCSI_PHASE_MESSAGE_OUT (BUS_MSG | BUS_CD)
|
||||||
#define SCSI_PHASE_MESSAGE_IN (BUS_MSG | BUS_CD | BUS_IO)
|
#define SCSI_PHASE_MESSAGE_IN (BUS_MSG | BUS_CD | BUS_IO)
|
||||||
|
|
||||||
|
#define START_STOP_START 0x01
|
||||||
|
#define START_STOP_LOEJ 0x02
|
||||||
|
|
||||||
|
#endif /*_SCSI_H_*/
|
||||||
|
|
|
||||||
|
|
@ -65,16 +65,6 @@ enum
|
||||||
#define SENSE_ILLEGAL_REQUEST 5
|
#define SENSE_ILLEGAL_REQUEST 5
|
||||||
#define SENSE_UNIT_ATTENTION 6
|
#define SENSE_UNIT_ATTENTION 6
|
||||||
|
|
||||||
/* ATAPI Additional Sense Codes */
|
|
||||||
#define ASC_AUDIO_PLAY_OPERATION 0x00
|
|
||||||
#define ASC_ILLEGAL_OPCODE 0x20
|
|
||||||
#define ASC_LBA_OUT_OF_RANGE 0x21
|
|
||||||
#define ASC_INV_FIELD_IN_CMD_PACKET 0x24
|
|
||||||
#define ASC_MEDIUM_MAY_HAVE_CHANGED 0x28
|
|
||||||
#define ASC_MEDIUM_NOT_PRESENT 0x3a
|
|
||||||
#define ASC_DATA_PHASE_ERROR 0x4b
|
|
||||||
#define ASC_ILLEGAL_MODE_FOR_THIS_TRACK 0x64
|
|
||||||
|
|
||||||
#define ASCQ_AUDIO_PLAY_OPERATION_IN_PROGRESS 0x11
|
#define ASCQ_AUDIO_PLAY_OPERATION_IN_PROGRESS 0x11
|
||||||
#define ASCQ_AUDIO_PLAY_OPERATION_PAUSED 0x12
|
#define ASCQ_AUDIO_PLAY_OPERATION_PAUSED 0x12
|
||||||
#define ASCQ_AUDIO_PLAY_OPERATION_COMPLETED 0x13
|
#define ASCQ_AUDIO_PLAY_OPERATION_COMPLETED 0x13
|
||||||
|
|
@ -202,6 +192,7 @@ typedef struct scsi_cd_data_t
|
||||||
uint8_t prefix_len;
|
uint8_t prefix_len;
|
||||||
uint8_t page_current;
|
uint8_t page_current;
|
||||||
|
|
||||||
|
int is_atapi;
|
||||||
} scsi_cd_data_t;
|
} scsi_cd_data_t;
|
||||||
|
|
||||||
static void scsi_add_data(scsi_cd_data_t *data, uint8_t val)
|
static void scsi_add_data(scsi_cd_data_t *data, uint8_t val)
|
||||||
|
|
@ -292,6 +283,15 @@ static void *scsi_cd_init(scsi_bus_t *bus, int id)
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void *scsi_cd_atapi_init(scsi_bus_t *bus, int id)
|
||||||
|
{
|
||||||
|
scsi_cd_data_t *data = scsi_cd_init(bus, id);
|
||||||
|
|
||||||
|
data->is_atapi = 1;
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
static void scsi_cd_close(void *p)
|
static void scsi_cd_close(void *p)
|
||||||
{
|
{
|
||||||
scsi_cd_data_t *data = p;
|
scsi_cd_data_t *data = p;
|
||||||
|
|
@ -397,6 +397,15 @@ static uint32_t ide_atapi_mode_sense(scsi_cd_data_t *data, uint32_t pos, uint8_t
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t atapi_get_cd_channel(int channel)
|
||||||
|
{
|
||||||
|
return (page_flags[GPMODE_CDROM_AUDIO_PAGE] & PAGE_CHANGED) ? mode_pages_in[GPMODE_CDROM_AUDIO_PAGE][channel ? 8 : 6] : (channel + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t atapi_get_cd_volume(int channel)
|
||||||
|
{
|
||||||
|
return (page_flags[GPMODE_CDROM_AUDIO_PAGE] & PAGE_CHANGED) ? mode_pages_in[GPMODE_CDROM_AUDIO_PAGE][channel ? 9 : 7] : 0xFF;
|
||||||
|
}
|
||||||
static int scsi_cd_command(uint8_t *cdb, void *p)
|
static int scsi_cd_command(uint8_t *cdb, void *p)
|
||||||
{
|
{
|
||||||
scsi_cd_data_t *data = p;
|
scsi_cd_data_t *data = p;
|
||||||
|
|
@ -417,6 +426,7 @@ static int scsi_cd_command(uint8_t *cdb, void *p)
|
||||||
int temp_command;
|
int temp_command;
|
||||||
int alloc_length;
|
int alloc_length;
|
||||||
int completed;
|
int completed;
|
||||||
|
int changed;
|
||||||
|
|
||||||
if (!data->received_cdb)
|
if (!data->received_cdb)
|
||||||
memcpy(data->cdb, cdb, CDB_MAX_LEN);
|
memcpy(data->cdb, cdb, CDB_MAX_LEN);
|
||||||
|
|
@ -433,11 +443,8 @@ static int scsi_cd_command(uint8_t *cdb, void *p)
|
||||||
msf = cdb[1] & 2;
|
msf = cdb[1] & 2;
|
||||||
|
|
||||||
is_error = 0;
|
is_error = 0;
|
||||||
|
changed = atapi->medium_changed();
|
||||||
|
|
||||||
if (atapi->medium_changed())
|
|
||||||
{
|
|
||||||
atapi_insert_cdrom();
|
|
||||||
}
|
|
||||||
/*If UNIT_ATTENTION is set, error out with NOT_READY.
|
/*If UNIT_ATTENTION is set, error out with NOT_READY.
|
||||||
VIDE-CDD.SYS will then issue a READ_TOC, which can pass through UNIT_ATTENTION and will clear sense.
|
VIDE-CDD.SYS will then issue a READ_TOC, which can pass through UNIT_ATTENTION and will clear sense.
|
||||||
NT 3.1 / AZTIDECD.SYS will then issue a REQUEST_SENSE, which can also pass through UNIT_ATTENTION but will clear sense AFTER sending it back.
|
NT 3.1 / AZTIDECD.SYS will then issue a REQUEST_SENSE, which can also pass through UNIT_ATTENTION but will clear sense AFTER sending it back.
|
||||||
|
|
@ -469,6 +476,12 @@ static int scsi_cd_command(uint8_t *cdb, void *p)
|
||||||
atapi_cmd_error(data, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT, 0);
|
atapi_cmd_error(data, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT, 0);
|
||||||
return SCSI_PHASE_STATUS;
|
return SCSI_PHASE_STATUS;
|
||||||
}
|
}
|
||||||
|
if ((atapi_cmd_table[cdb[0]] & CHECK_READY) && changed)
|
||||||
|
{
|
||||||
|
pclog("Medium changed\n");
|
||||||
|
atapi_cmd_error(data, SENSE_UNIT_ATTENTION, ASC_MEDIUM_MAY_HAVE_CHANGED, 0);
|
||||||
|
return SCSI_PHASE_STATUS;
|
||||||
|
}
|
||||||
|
|
||||||
data->prev_status = data->cd_status;
|
data->prev_status = data->cd_status;
|
||||||
data->cd_status = atapi->status();
|
data->cd_status = atapi->status();
|
||||||
|
|
@ -526,8 +539,7 @@ static int scsi_cd_command(uint8_t *cdb, void *p)
|
||||||
data->data_in[13] = (data->cd_status == CD_STATUS_PLAYING) ? ASCQ_AUDIO_PLAY_OPERATION_IN_PROGRESS : ASCQ_AUDIO_PLAY_OPERATION_PAUSED;
|
data->data_in[13] = (data->cd_status == CD_STATUS_PLAYING) ? ASCQ_AUDIO_PLAY_OPERATION_IN_PROGRESS : ASCQ_AUDIO_PLAY_OPERATION_PAUSED;
|
||||||
}
|
}
|
||||||
|
|
||||||
//data->data_in[7] = 10;
|
data->data_in[7] = 0;
|
||||||
data->data_in[7] = 0;
|
|
||||||
|
|
||||||
/* Clear the sense stuff as per the spec. */
|
/* Clear the sense stuff as per the spec. */
|
||||||
atapi_sense_clear(data, temp_command, 0);
|
atapi_sense_clear(data, temp_command, 0);
|
||||||
|
|
@ -1002,8 +1014,16 @@ static int scsi_cd_command(uint8_t *cdb, void *p)
|
||||||
|
|
||||||
data->data_in[0] = 5; /*CD-ROM*/
|
data->data_in[0] = 5; /*CD-ROM*/
|
||||||
data->data_in[1] = 0x80; /*Removable*/
|
data->data_in[1] = 0x80; /*Removable*/
|
||||||
data->data_in[2] = 2; /*SCSI-2 compliant*/
|
if (data->is_atapi)
|
||||||
data->data_in[3] = 0x21;
|
{
|
||||||
|
data->data_in[2] = 0; /*Not ANSI compliant*/
|
||||||
|
data->data_in[3] = 0x21; /*ATAPI compliant*/
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
data->data_in[2] = 2; /*SCSI-2 compliant*/
|
||||||
|
data->data_in[3] = 0x02;
|
||||||
|
}
|
||||||
data->data_in[4] = 31;
|
data->data_in[4] = 31;
|
||||||
data->data_in[5] = 0;
|
data->data_in[5] = 0;
|
||||||
data->data_in[6] = 0;
|
data->data_in[6] = 0;
|
||||||
|
|
@ -1125,15 +1145,45 @@ static uint8_t scsi_cd_get_status(void *p)
|
||||||
return data->status;
|
return data->status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint8_t scsi_cd_get_sense_key(void *p)
|
||||||
|
{
|
||||||
|
scsi_cd_data_t *data = p;
|
||||||
|
|
||||||
|
return data->sense_key;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int scsi_cd_get_bytes_required(void *p)
|
||||||
|
{
|
||||||
|
scsi_cd_data_t *data = p;
|
||||||
|
|
||||||
|
return data->bytes_required - data->bytes_received;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void scsi_cd_atapi_identify(uint16_t *buffer, void *p)
|
||||||
|
{
|
||||||
|
memset(buffer, 0, 512);
|
||||||
|
|
||||||
|
buffer[0] = 0x8000 | (5<<8) | 0x80 | (2<<5); /* ATAPI device, CD-ROM drive, removable media, accelerated DRQ */
|
||||||
|
ide_padstr((char *)(buffer + 10), "", 20); /* Serial Number */
|
||||||
|
ide_padstr((char *)(buffer + 23), "v1.0", 8); /* Firmware */
|
||||||
|
ide_padstr((char *)(buffer + 27), "PCemCD", 40); /* Model */
|
||||||
|
buffer[49] = 0x200; /* LBA supported */
|
||||||
|
}
|
||||||
|
|
||||||
scsi_device_t scsi_cd =
|
scsi_device_t scsi_cd =
|
||||||
{
|
{
|
||||||
scsi_cd_init,
|
scsi_cd_init,
|
||||||
|
scsi_cd_atapi_init,
|
||||||
scsi_cd_close,
|
scsi_cd_close,
|
||||||
|
|
||||||
scsi_cd_start_command,
|
scsi_cd_start_command,
|
||||||
scsi_cd_command,
|
scsi_cd_command,
|
||||||
|
|
||||||
scsi_cd_get_status,
|
scsi_cd_get_status,
|
||||||
|
scsi_cd_get_sense_key,
|
||||||
|
scsi_cd_get_bytes_required,
|
||||||
|
|
||||||
|
scsi_cd_atapi_identify,
|
||||||
|
|
||||||
scsi_cd_read,
|
scsi_cd_read,
|
||||||
scsi_cd_write,
|
scsi_cd_write,
|
||||||
|
|
|
||||||
|
|
@ -418,6 +418,16 @@ static int scsi_hd_command(uint8_t *cdb, void *p)
|
||||||
for (; len >= 0; len--)
|
for (; len >= 0; len--)
|
||||||
add_data_len(0);
|
add_data_len(0);
|
||||||
|
|
||||||
|
len = data->data_pos_write;
|
||||||
|
if (cdb[0] == SCSI_MODE_SENSE_6)
|
||||||
|
{
|
||||||
|
data->data_in[0] = len - 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
data->data_in[0] = (len - 2) >> 8;
|
||||||
|
data->data_in[1] = (len - 2) & 255;
|
||||||
|
}
|
||||||
// scsi_illegal_field();
|
// scsi_illegal_field();
|
||||||
data->cmd_pos = CMD_POS_IDLE;
|
data->cmd_pos = CMD_POS_IDLE;
|
||||||
bus_state = BUS_IO;
|
bus_state = BUS_IO;
|
||||||
|
|
@ -789,15 +799,34 @@ static uint8_t scsi_hd_get_status(void *p)
|
||||||
return data->status;
|
return data->status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint8_t scsi_hd_get_sense_key(void *p)
|
||||||
|
{
|
||||||
|
scsi_hd_data *data = p;
|
||||||
|
|
||||||
|
return data->sense_key;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int scsi_hd_get_bytes_required(void *p)
|
||||||
|
{
|
||||||
|
scsi_hd_data *data = p;
|
||||||
|
|
||||||
|
return data->bytes_required - data->bytes_received;
|
||||||
|
}
|
||||||
|
|
||||||
scsi_device_t scsi_hd =
|
scsi_device_t scsi_hd =
|
||||||
{
|
{
|
||||||
scsi_hd_init,
|
scsi_hd_init,
|
||||||
|
NULL,
|
||||||
scsi_hd_close,
|
scsi_hd_close,
|
||||||
|
|
||||||
scsi_hd_start_command,
|
scsi_hd_start_command,
|
||||||
scsi_hd_command,
|
scsi_hd_command,
|
||||||
|
|
||||||
scsi_hd_get_status,
|
scsi_hd_get_status,
|
||||||
|
scsi_hd_get_sense_key,
|
||||||
|
scsi_hd_get_bytes_required,
|
||||||
|
|
||||||
|
NULL,
|
||||||
|
|
||||||
scsi_hd_read,
|
scsi_hd_read,
|
||||||
scsi_hd_write,
|
scsi_hd_write,
|
||||||
|
|
|
||||||
|
|
@ -1087,11 +1087,6 @@ int wx_handle_command(void* hwnd, int wParam, int checked)
|
||||||
atapi->exit();
|
atapi->exit();
|
||||||
atapi_close();
|
atapi_close();
|
||||||
ioctl_set_drive(0);
|
ioctl_set_drive(0);
|
||||||
if (cdrom_enabled)
|
|
||||||
{
|
|
||||||
/* Signal disc change to the emulated machine. */
|
|
||||||
atapi_insert_cdrom();
|
|
||||||
}
|
|
||||||
old_cdrom_drive = cdrom_drive;
|
old_cdrom_drive = cdrom_drive;
|
||||||
cdrom_drive = 0;
|
cdrom_drive = 0;
|
||||||
saveconfig(NULL);
|
saveconfig(NULL);
|
||||||
|
|
@ -1133,11 +1128,6 @@ int wx_handle_command(void* hwnd, int wParam, int checked)
|
||||||
atapi->exit();
|
atapi->exit();
|
||||||
atapi_close();
|
atapi_close();
|
||||||
image_open(temp_image_path);
|
image_open(temp_image_path);
|
||||||
if (cdrom_enabled)
|
|
||||||
{
|
|
||||||
/* Signal disc change to the emulated machine. */
|
|
||||||
atapi_insert_cdrom();
|
|
||||||
}
|
|
||||||
cdrom_drive = CDROM_IMAGE;
|
cdrom_drive = CDROM_IMAGE;
|
||||||
saveconfig(NULL);
|
saveconfig(NULL);
|
||||||
if (!cdrom_enabled)
|
if (!cdrom_enabled)
|
||||||
|
|
@ -1174,11 +1164,6 @@ int wx_handle_command(void* hwnd, int wParam, int checked)
|
||||||
atapi->exit();
|
atapi->exit();
|
||||||
atapi_close();
|
atapi_close();
|
||||||
ioctl_set_drive(new_cdrom_drive);
|
ioctl_set_drive(new_cdrom_drive);
|
||||||
if (cdrom_enabled)
|
|
||||||
{
|
|
||||||
/* Signal disc change to the emulated machine. */
|
|
||||||
atapi_insert_cdrom();
|
|
||||||
}
|
|
||||||
cdrom_drive = new_cdrom_drive;
|
cdrom_drive = new_cdrom_drive;
|
||||||
saveconfig(NULL);
|
saveconfig(NULL);
|
||||||
if (!cdrom_enabled)
|
if (!cdrom_enabled)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue