summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--3rdparty/bx/include/bx/simd256_avx.inl14
-rw-r--r--3rdparty/libjpeg/Makefile.am28
-rw-r--r--3rdparty/libjpeg/Makefile.in741
-rw-r--r--3rdparty/libjpeg/README149
-rw-r--r--3rdparty/libjpeg/aclocal.m43750
-rw-r--r--3rdparty/libjpeg/ansi2knr.136
-rw-r--r--3rdparty/libjpeg/ansi2knr.c739
-rw-r--r--3rdparty/libjpeg/ar-lib270
-rw-r--r--3rdparty/libjpeg/change.log106
-rw-r--r--3rdparty/libjpeg/cjpeg.172
-rw-r--r--3rdparty/libjpeg/cjpeg.c43
-rw-r--r--3rdparty/libjpeg/compile347
-rw-r--r--3rdparty/libjpeg/config.guess564
-rw-r--r--3rdparty/libjpeg/config.sub306
-rw-r--r--3rdparty/libjpeg/configure4741
-rw-r--r--3rdparty/libjpeg/configure.ac231
-rw-r--r--3rdparty/libjpeg/depcomp531
-rw-r--r--3rdparty/libjpeg/djpeg.125
-rw-r--r--3rdparty/libjpeg/djpeg.c11
-rw-r--r--3rdparty/libjpeg/filelist.txt6
-rw-r--r--3rdparty/libjpeg/install-sh385
-rw-r--r--3rdparty/libjpeg/install.txt95
-rw-r--r--3rdparty/libjpeg/jaricom.c10
-rw-r--r--3rdparty/libjpeg/jcapistd.c3
-rw-r--r--3rdparty/libjpeg/jcarith.c82
-rw-r--r--3rdparty/libjpeg/jccoefct.c15
-rw-r--r--3rdparty/libjpeg/jccolor.c249
-rw-r--r--3rdparty/libjpeg/jcdctmgr.c79
-rw-r--r--3rdparty/libjpeg/jchuff.c127
-rw-r--r--3rdparty/libjpeg/jcinit.c19
-rw-r--r--3rdparty/libjpeg/jcmainct.c110
-rw-r--r--3rdparty/libjpeg/jcmarker.c69
-rw-r--r--3rdparty/libjpeg/jcmaster.c36
-rw-r--r--3rdparty/libjpeg/jconfig.cfg8
-rw-r--r--3rdparty/libjpeg/jconfig.h33
-rw-r--r--3rdparty/libjpeg/jconfig.mc62
-rw-r--r--3rdparty/libjpeg/jconfig.txt9
-rw-r--r--3rdparty/libjpeg/jconfig.vc11
-rw-r--r--3rdparty/libjpeg/jcparam.c115
-rw-r--r--3rdparty/libjpeg/jctrans.c15
-rw-r--r--3rdparty/libjpeg/jdapimin.c43
-rw-r--r--3rdparty/libjpeg/jdapistd.c1
-rw-r--r--3rdparty/libjpeg/jdarith.c72
-rw-r--r--3rdparty/libjpeg/jdatadst.c9
-rw-r--r--3rdparty/libjpeg/jdatasrc.c13
-rw-r--r--3rdparty/libjpeg/jdcoefct.c9
-rw-r--r--3rdparty/libjpeg/jdcolor.c423
-rw-r--r--3rdparty/libjpeg/jdct.h32
-rw-r--r--3rdparty/libjpeg/jddctmgr.c4
-rw-r--r--3rdparty/libjpeg/jdhuff.c69
-rw-r--r--3rdparty/libjpeg/jdinput.c11
-rw-r--r--3rdparty/libjpeg/jdmainct.c129
-rw-r--r--3rdparty/libjpeg/jdmarker.c179
-rw-r--r--3rdparty/libjpeg/jdmaster.c80
-rw-r--r--3rdparty/libjpeg/jdmerge.c121
-rw-r--r--3rdparty/libjpeg/jdsample.c29
-rw-r--r--3rdparty/libjpeg/jerror.c11
-rw-r--r--3rdparty/libjpeg/jerror.h4
-rw-r--r--3rdparty/libjpeg/jfdctflt.c6
-rw-r--r--3rdparty/libjpeg/jfdctfst.c6
-rw-r--r--3rdparty/libjpeg/jfdctint.c715
-rw-r--r--3rdparty/libjpeg/jidctflt.c51
-rw-r--r--3rdparty/libjpeg/jidctfst.c89
-rw-r--r--3rdparty/libjpeg/jidctint.c588
-rw-r--r--3rdparty/libjpeg/jmemmgr.c7
-rw-r--r--3rdparty/libjpeg/jmorecfg.h107
-rw-r--r--3rdparty/libjpeg/jpegint.h41
-rw-r--r--3rdparty/libjpeg/jpeglib.h58
-rw-r--r--3rdparty/libjpeg/jpegtran.136
-rw-r--r--3rdparty/libjpeg/jpegtran.c31
-rw-r--r--3rdparty/libjpeg/jquant1.c11
-rw-r--r--3rdparty/libjpeg/jquant2.c7
-rw-r--r--3rdparty/libjpeg/jutils.c40
-rw-r--r--3rdparty/libjpeg/jversion.h6
-rw-r--r--3rdparty/libjpeg/libjpeg.map2
-rw-r--r--3rdparty/libjpeg/libjpeg.txt149
-rw-r--r--3rdparty/libjpeg/ltmain.sh5481
-rw-r--r--3rdparty/libjpeg/makefile.ansi28
-rw-r--r--3rdparty/libjpeg/makefile.b32243
-rw-r--r--3rdparty/libjpeg/makefile.bcc28
-rw-r--r--3rdparty/libjpeg/makefile.dj28
-rw-r--r--3rdparty/libjpeg/makefile.manx28
-rw-r--r--3rdparty/libjpeg/makefile.mc628
-rw-r--r--3rdparty/libjpeg/makefile.mms28
-rw-r--r--3rdparty/libjpeg/makefile.sas28
-rw-r--r--3rdparty/libjpeg/makefile.unix28
-rw-r--r--3rdparty/libjpeg/makefile.vc28
-rw-r--r--3rdparty/libjpeg/makefile.wat28
-rw-r--r--3rdparty/libjpeg/missing461
-rw-r--r--3rdparty/libjpeg/rdjpgcom.12
-rw-r--r--3rdparty/libjpeg/rdswitch.c6
-rw-r--r--3rdparty/libjpeg/structure.txt57
-rw-r--r--3rdparty/libjpeg/testimg.bmpbin35050 -> 35050 bytes
-rw-r--r--3rdparty/libjpeg/testimg.ppm2
-rw-r--r--3rdparty/libjpeg/transupp.c242
-rw-r--r--3rdparty/libjpeg/transupp.h37
-rw-r--r--3rdparty/libjpeg/usage.txt126
-rw-r--r--3rdparty/libjpeg/wrgif.c7
-rw-r--r--3rdparty/libjpeg/wrjpgcom.c16
-rw-r--r--3rdparty/libjpeg/wrtarga.c5
-rw-r--r--3rdparty/portaudio/src/hostapi/dsound/pa_win_ds.c5
-rw-r--r--3rdparty/portaudio/src/hostapi/wasapi/mingw-include/audioclient.h3
-rw-r--r--3rdparty/portaudio/src/hostapi/wdmks/pa_win_wdmks.c6
-rw-r--r--3rdparty/portaudio/src/hostapi/wmme/pa_win_wmme.c2
-rw-r--r--3rdparty/zlib/CMakeLists.txt2
-rw-r--r--3rdparty/zlib/ChangeLog11
-rw-r--r--3rdparty/zlib/Makefile.in9
-rw-r--r--3rdparty/zlib/README6
-rw-r--r--3rdparty/zlib/contrib/delphi/ZLib.pas2
-rw-r--r--3rdparty/zlib/contrib/dotzlib/DotZLib/UnitTests.cs2
-rw-r--r--3rdparty/zlib/contrib/infback9/inftree9.c6
-rw-r--r--3rdparty/zlib/contrib/minizip/configure.ac2
-rw-r--r--3rdparty/zlib/contrib/pascal/zlibpas.pas4
-rw-r--r--3rdparty/zlib/contrib/vstudio/readme.txt4
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc10/zlib.rc8
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc11/zlib.rc8
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc12/zlib.rc8
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc14/miniunz.vcxproj.user4
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc14/minizip.vcxproj.user4
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc14/testzlib.vcxproj.user4
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc14/testzlibdll.vcxproj.user4
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc14/zlib.rc8
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc14/zlibstat.vcxproj.user4
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc14/zlibvc.vcxproj.user4
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc9/zlib.rc8
-rw-r--r--3rdparty/zlib/deflate.c59
-rw-r--r--3rdparty/zlib/gzlib.c10
-rw-r--r--3rdparty/zlib/gzwrite.c3
-rw-r--r--3rdparty/zlib/inffast.c6
-rw-r--r--3rdparty/zlib/inftrees.c6
-rw-r--r--3rdparty/zlib/os400/README4002
-rw-r--r--3rdparty/zlib/os400/make.sh2
-rw-r--r--3rdparty/zlib/os400/zlib.inc8
-rw-r--r--3rdparty/zlib/qnx/package.qpg10
-rw-r--r--3rdparty/zlib/treebuild.xml4
-rw-r--r--3rdparty/zlib/trees.c4
-rw-r--r--3rdparty/zlib/win32/Makefile.msc2
-rw-r--r--3rdparty/zlib/win32/README-WIN32.txt6
-rw-r--r--3rdparty/zlib/win32/VisualC.txt2
-rw-r--r--3rdparty/zlib/win32/zlib1.rc2
-rw-r--r--3rdparty/zlib/zlib.36
-rw-r--r--3rdparty/zlib/zlib.3.pdfbin19422 -> 19318 bytes
-rw-r--r--3rdparty/zlib/zlib.h34
-rw-r--r--3rdparty/zlib/zutil.c4
-rw-r--r--README.md2
-rw-r--r--android-project/LICENSE2
-rw-r--r--android-project/app/src/main/AndroidManifest.xml4
-rw-r--r--benchmarks/LICENSE2
-rw-r--r--docs/source/conf.py2
-rw-r--r--docs/source/license.rst2
-rw-r--r--docs/source/whatis.rst2
-rw-r--r--hash/archimedes.xml2617
-rw-r--r--hash/atom_cass.xml55
-rw-r--r--hash/atom_flop.xml12
-rw-r--r--hash/atom_rom.xml2
-rw-r--r--hash/bbc_flop_65c102.xml2
-rw-r--r--hash/bbcb_cass.xml4
-rw-r--r--hash/c64_flop.xml13
-rw-r--r--hash/cpc_flop.xml14
-rw-r--r--hash/electron_flop.xml4
-rw-r--r--hash/ibm5150.xml225
-rw-r--r--hash/ibm5170.xml205
-rw-r--r--hash/ibmpcjr_cart.xml17
-rw-r--r--hash/ibmpcjr_flop.xml14
-rw-r--r--hash/megadriv.xml98
-rw-r--r--hash/neogeo.xml41
-rw-r--r--hash/pico.xml11
-rw-r--r--hash/snes.xml4
-rw-r--r--hash/sorcerer_cass.xml11
-rw-r--r--hash/vic1001_flop.xml13
-rw-r--r--hash/vsmile_cart.xml2804
-rw-r--r--hash/vsmileb_cart.xml148
-rw-r--r--hash/vsmilem_cart.xml164
-rw-r--r--hash/zx80_cass.xml87
-rw-r--r--hash/zx81_cass.xml8379
-rw-r--r--makefile13
-rw-r--r--nl_examples/congo_bongo.c15
-rw-r--r--plugins/hiscore/hiscore.dat2
-rw-r--r--plugins/hiscore/init.lua7
-rw-r--r--scripts/extlib.lua6
-rw-r--r--scripts/src/3rdparty.lua8
-rw-r--r--scripts/src/bus.lua44
-rw-r--r--scripts/src/cpu.lua22
-rw-r--r--scripts/src/emu.lua1
-rw-r--r--scripts/src/formats.lua12
-rw-r--r--scripts/src/lib.lua1
-rw-r--r--scripts/src/machine.lua4
-rw-r--r--scripts/src/netlist.lua41
-rw-r--r--scripts/src/osd/modules.lua4
-rw-r--r--scripts/src/osd/sdl.lua3
-rw-r--r--scripts/src/sound.lua20
-rw-r--r--scripts/src/video.lua37
-rw-r--r--scripts/target/mame/arcade.lua95
-rw-r--r--scripts/target/mame/mess.lua43
-rw-r--r--src/devices/bus/a2bus/a2alfam2.cpp1
-rw-r--r--src/devices/bus/a2bus/a2applicard.cpp1
-rw-r--r--src/devices/bus/a2bus/a2cffa.cpp1
-rw-r--r--src/devices/bus/a2bus/a2corvus.cpp1
-rw-r--r--src/devices/bus/a2bus/a2diskii.cpp1
-rw-r--r--src/devices/bus/a2bus/a2dx1.cpp1
-rw-r--r--src/devices/bus/a2bus/a2echoii.cpp1
-rw-r--r--src/devices/bus/a2bus/a2eext80col.cpp1
-rw-r--r--src/devices/bus/a2bus/a2eramworks3.cpp1
-rw-r--r--src/devices/bus/a2bus/a2estd80col.cpp1
-rw-r--r--src/devices/bus/a2bus/a2hsscsi.cpp1
-rw-r--r--src/devices/bus/a2bus/a2lang.cpp13
-rw-r--r--src/devices/bus/a2bus/a2mcms.cpp1
-rw-r--r--src/devices/bus/a2bus/a2memexp.cpp1
-rw-r--r--src/devices/bus/a2bus/a2sam.cpp1
-rw-r--r--src/devices/bus/a2bus/a2scsi.cpp1
-rw-r--r--src/devices/bus/a2bus/a2softcard.cpp1
-rw-r--r--src/devices/bus/a2bus/a2swyft.cpp1
-rw-r--r--src/devices/bus/a2bus/a2themill.cpp1
-rw-r--r--src/devices/bus/a2bus/a2ultraterm.cpp1
-rw-r--r--src/devices/bus/a2bus/a2videoterm.cpp1
-rw-r--r--src/devices/bus/a2bus/a2vulcan.cpp1
-rw-r--r--src/devices/bus/a2bus/a2zipdrive.cpp1
-rw-r--r--src/devices/bus/a2bus/laser128.cpp1
-rw-r--r--src/devices/bus/a2bus/mouse.cpp201
-rw-r--r--src/devices/bus/a2bus/mouse.h18
-rw-r--r--src/devices/bus/abcbus/abcbus.h40
-rw-r--r--src/devices/bus/amiga/keyboard/a1200.cpp170
-rw-r--r--src/devices/bus/amiga/keyboard/a1200.h66
-rw-r--r--src/devices/bus/amiga/keyboard/a500.cpp423
-rw-r--r--src/devices/bus/amiga/keyboard/a500.h150
-rw-r--r--src/devices/bus/amiga/keyboard/keyboard.cpp110
-rw-r--r--src/devices/bus/amiga/keyboard/keyboard.h108
-rw-r--r--src/devices/bus/amiga/keyboard/matrix.cpp318
-rw-r--r--src/devices/bus/amiga/keyboard/matrix.h21
-rw-r--r--src/devices/bus/c64/exp.cpp2
-rw-r--r--src/devices/bus/c64/speakeasy.cpp103
-rw-r--r--src/devices/bus/c64/speakeasy.h54
-rw-r--r--src/devices/bus/cbmiec/cbmiec.h20
-rw-r--r--src/devices/bus/coco/coco_dwsock.cpp1
-rw-r--r--src/devices/bus/coco/coco_fdc.cpp1
-rw-r--r--src/devices/bus/coco/coco_multi.cpp3
-rw-r--r--src/devices/bus/coco/coco_pak.cpp28
-rw-r--r--src/devices/bus/coco/coco_pak.h1
-rw-r--r--src/devices/bus/coco/coco_t4426.cpp33
-rw-r--r--src/devices/bus/coco/coco_t4426.h1
-rw-r--r--src/devices/bus/coco/dragon_fdc.cpp1
-rw-r--r--src/devices/bus/cpc/amdrum.cpp1
-rw-r--r--src/devices/bus/cpc/cpc_pds.cpp1
-rw-r--r--src/devices/bus/cpc/cpc_rom.cpp2
-rw-r--r--src/devices/bus/cpc/cpc_rs232.cpp3
-rw-r--r--src/devices/bus/cpc/cpc_ssa1.cpp2
-rw-r--r--src/devices/bus/cpc/ddi1.cpp2
-rw-r--r--src/devices/bus/cpc/doubler.cpp2
-rw-r--r--src/devices/bus/cpc/hd20.cpp3
-rw-r--r--src/devices/bus/cpc/magicsound.cpp3
-rw-r--r--src/devices/bus/cpc/mface2.cpp2
-rw-r--r--src/devices/bus/cpc/playcity.cpp2
-rw-r--r--src/devices/bus/cpc/smartwatch.cpp3
-rw-r--r--src/devices/bus/cpc/transtape.cpp2
-rw-r--r--src/devices/bus/ep64/exp.h2
-rw-r--r--src/devices/bus/epson_sio/epson_sio.h8
-rw-r--r--src/devices/bus/ieee488/hp9895.cpp702
-rw-r--r--src/devices/bus/ieee488/hp9895.h65
-rw-r--r--src/devices/bus/ieee488/ieee488.h32
-rw-r--r--src/devices/bus/isa/isa.h4
-rw-r--r--src/devices/bus/nes/ggenie.cpp3
-rw-r--r--src/devices/bus/nubus/nubus.cpp6
-rw-r--r--src/devices/bus/vic20/exp.cpp2
-rw-r--r--src/devices/bus/vic20/speakeasy.cpp104
-rw-r--r--src/devices/bus/vic20/speakeasy.h55
-rw-r--r--src/devices/bus/vme/vme.cpp118
-rw-r--r--src/devices/bus/vme/vme.h10
-rw-r--r--src/devices/bus/vme/vme_fccpu20.cpp663
-rw-r--r--src/devices/bus/vme/vme_fccpu20.h143
-rw-r--r--src/devices/bus/vme/vme_fcisio.cpp6
-rw-r--r--src/devices/bus/vme/vme_fcisio.h2
-rw-r--r--src/devices/bus/vme/vme_fcscsi.cpp8
-rw-r--r--src/devices/bus/vme/vme_fcscsi.h2
-rw-r--r--src/devices/bus/vme/vme_mvme350.cpp10
-rw-r--r--src/devices/bus/vme/vme_mvme350.h6
-rw-r--r--src/devices/bus/vme/vme_mzr8105.cpp6
-rw-r--r--src/devices/bus/vme/vme_mzr8300.cpp40
-rw-r--r--src/devices/bus/vme/vme_mzr8300.h6
-rw-r--r--src/devices/cpu/amis2000/amis2000.cpp8
-rw-r--r--src/devices/cpu/amis2000/amis2000.h92
-rw-r--r--src/devices/cpu/amis2000/amis2000d.cpp12
-rw-r--r--src/devices/cpu/amis2000/amis2000op.cpp50
-rw-r--r--src/devices/cpu/clipper/clipper.cpp1401
-rw-r--r--src/devices/cpu/clipper/clipper.h296
-rw-r--r--src/devices/cpu/clipper/clipperd.cpp351
-rw-r--r--src/devices/cpu/cop400/cop400.cpp495
-rw-r--r--src/devices/cpu/cop400/cop400.h150
-rw-r--r--src/devices/cpu/cop400/cop400op.hxx44
-rw-r--r--src/devices/cpu/cop400/cop410ds.cpp10
-rw-r--r--src/devices/cpu/cop400/cop420ds.cpp10
-rw-r--r--src/devices/cpu/cop400/cop424ds.cpp (renamed from src/devices/cpu/cop400/cop440ds.cpp)56
-rw-r--r--src/devices/cpu/cop400/cop444ds.cpp384
-rw-r--r--src/devices/cpu/cp1610/cp1610.h6
-rw-r--r--src/devices/cpu/drcbec.cpp2
-rw-r--r--src/devices/cpu/e0c6200/e0c6200.cpp2
-rw-r--r--src/devices/cpu/e0c6200/e0c6200.h92
-rw-r--r--src/devices/cpu/e0c6200/e0c6200d.cpp12
-rw-r--r--src/devices/cpu/e0c6200/e0c6200op.cpp52
-rw-r--r--src/devices/cpu/e0c6200/e0c6s46.cpp26
-rw-r--r--src/devices/cpu/e0c6200/e0c6s46.h72
-rw-r--r--src/devices/cpu/hcd62121/hcd62121.cpp1324
-rw-r--r--src/devices/cpu/hcd62121/hcd62121.h108
-rw-r--r--src/devices/cpu/hcd62121/hcd62121_ops.h1022
-rw-r--r--src/devices/cpu/hcd62121/hcd62121d.cpp597
-rw-r--r--src/devices/cpu/hmcs40/hmcs40.cpp54
-rw-r--r--src/devices/cpu/hmcs40/hmcs40.h138
-rw-r--r--src/devices/cpu/hmcs40/hmcs40d.cpp16
-rw-r--r--src/devices/cpu/hmcs40/hmcs40op.cpp28
-rw-r--r--src/devices/cpu/hphybrid/hphybrid.h2
-rw-r--r--src/devices/cpu/i386/i386.h2
-rw-r--r--src/devices/cpu/i8085/i8085.h8
-rw-r--r--src/devices/cpu/i8089/i8089.h8
-rw-r--r--src/devices/cpu/lh5801/lh5801.h2
-rw-r--r--src/devices/cpu/lr35902/lr35902.h4
-rw-r--r--src/devices/cpu/m6800/m6800.h4
-rw-r--r--src/devices/cpu/m6805/6805dasm.cpp376
-rw-r--r--src/devices/cpu/m6805/6805ops.hxx2024
-rw-r--r--src/devices/cpu/m6805/m6805.cpp900
-rw-r--r--src/devices/cpu/m6805/m6805.h376
-rw-r--r--src/devices/cpu/m6805/m6805defs.h224
-rw-r--r--src/devices/cpu/m6805/m68705.cpp364
-rw-r--r--src/devices/cpu/m6805/m68705.h107
-rw-r--r--src/devices/cpu/m6805/m68hc05.cpp961
-rw-r--r--src/devices/cpu/m6805/m68hc05.h298
-rw-r--r--src/devices/cpu/m6809/m6809.h2
-rw-r--r--src/devices/cpu/mb86233/mb86233.h12
-rw-r--r--src/devices/cpu/melps4/melps4.h20
-rw-r--r--src/devices/cpu/mn10200/mn10200.h4
-rw-r--r--src/devices/cpu/nanoprocessor/nanoprocessor.h4
-rw-r--r--src/devices/cpu/pic16c5x/pic16c5x.h14
-rw-r--r--src/devices/cpu/sh4/sh4.cpp287
-rw-r--r--src/devices/cpu/sm510/kb1013vk1-2.h4
-rw-r--r--src/devices/cpu/sm510/kb1013vk1-2core.cpp4
-rw-r--r--src/devices/cpu/sm510/sm500.h6
-rw-r--r--src/devices/cpu/sm510/sm500core.cpp6
-rw-r--r--src/devices/cpu/sm510/sm510.cpp16
-rw-r--r--src/devices/cpu/sm510/sm510.h96
-rw-r--r--src/devices/cpu/sm510/sm510core.cpp4
-rw-r--r--src/devices/cpu/sm510/sm510d.cpp38
-rw-r--r--src/devices/cpu/sm510/sm510op.cpp22
-rw-r--r--src/devices/cpu/sm510/sm511core.cpp8
-rw-r--r--src/devices/cpu/sm8500/sm8500.h4
-rw-r--r--src/devices/cpu/superfx/superfx.h2
-rw-r--r--src/devices/cpu/t11/t11.h2
-rw-r--r--src/devices/cpu/tlcs900/tlcs900.h48
-rw-r--r--src/devices/cpu/tms1000/tms0270.cpp6
-rw-r--r--src/devices/cpu/tms1000/tms0270.h30
-rw-r--r--src/devices/cpu/tms1000/tms0970.cpp28
-rw-r--r--src/devices/cpu/tms1000/tms0970.h10
-rw-r--r--src/devices/cpu/tms1000/tms0980.cpp42
-rw-r--r--src/devices/cpu/tms1000/tms0980.h24
-rw-r--r--src/devices/cpu/tms1000/tms1000.cpp26
-rw-r--r--src/devices/cpu/tms1000/tms1000.h16
-rw-r--r--src/devices/cpu/tms1000/tms1100.cpp12
-rw-r--r--src/devices/cpu/tms1000/tms1100.h12
-rw-r--r--src/devices/cpu/tms1000/tms1400.cpp12
-rw-r--r--src/devices/cpu/tms1000/tms1400.h12
-rw-r--r--src/devices/cpu/tms1000/tms1k_base.cpp8
-rw-r--r--src/devices/cpu/tms1000/tms1k_base.h134
-rw-r--r--src/devices/cpu/tms1000/tms1k_dasm.cpp24
-rw-r--r--src/devices/cpu/tms1000/tp0320.cpp14
-rw-r--r--src/devices/cpu/tms1000/tp0320.h8
-rw-r--r--src/devices/cpu/ucom4/ucom4.cpp20
-rw-r--r--src/devices/cpu/ucom4/ucom4.h106
-rw-r--r--src/devices/cpu/ucom4/ucom4d.cpp14
-rw-r--r--src/devices/cpu/ucom4/ucom4op.cpp34
-rw-r--r--src/devices/cpu/upd7810/upd7810.h26
-rw-r--r--src/devices/machine/40105.h12
-rw-r--r--src/devices/machine/6522via.cpp137
-rw-r--r--src/devices/machine/68153bim.cpp58
-rw-r--r--src/devices/machine/68153bim.h12
-rw-r--r--src/devices/machine/6821pia.cpp2
-rw-r--r--src/devices/machine/68230pit.cpp87
-rw-r--r--src/devices/machine/68230pit.h19
-rw-r--r--src/devices/machine/68561mpcc.cpp1388
-rw-r--r--src/devices/machine/68561mpcc.h513
-rw-r--r--src/devices/machine/8364_paula.cpp (renamed from src/devices/sound/amiga.cpp)152
-rw-r--r--src/devices/machine/8364_paula.h172
-rw-r--r--src/devices/machine/cs4031.h36
-rw-r--r--src/devices/machine/fdc_pll.cpp18
-rw-r--r--src/devices/machine/fdc_pll.h2
-rw-r--r--src/devices/machine/gen_latch.h2
-rw-r--r--src/devices/machine/i8251.cpp220
-rw-r--r--src/devices/machine/i8251.h28
-rw-r--r--src/devices/machine/ldv1000.h4
-rw-r--r--src/devices/machine/mc68681.cpp24
-rw-r--r--src/devices/machine/mc68681.h18
-rw-r--r--src/devices/machine/mpu401.h6
-rw-r--r--src/devices/machine/netlist.cpp488
-rw-r--r--src/devices/machine/netlist.h443
-rw-r--r--src/devices/machine/nscsi_cb.h30
-rw-r--r--src/devices/machine/phi.cpp292
-rw-r--r--src/devices/machine/phi.h83
-rw-r--r--src/devices/machine/tms1024.cpp6
-rw-r--r--src/devices/machine/tms1024.h14
-rw-r--r--src/devices/machine/tms6100.cpp14
-rw-r--r--src/devices/machine/tms6100.h32
-rw-r--r--src/devices/machine/upd765.h2
-rw-r--r--src/devices/machine/wd7600.h36
-rw-r--r--src/devices/machine/z80scc.cpp67
-rw-r--r--src/devices/sound/amiga.h65
-rw-r--r--src/devices/sound/asc.h6
-rw-r--r--src/devices/sound/dave.cpp (renamed from src/mame/audio/dave.cpp)0
-rw-r--r--src/devices/sound/dave.h (renamed from src/mame/audio/dave.h)0
-rw-r--r--src/devices/sound/es8712.cpp20
-rw-r--r--src/devices/sound/es8712.h3
-rw-r--r--src/devices/sound/msm5205.cpp21
-rw-r--r--src/devices/sound/saa1099.cpp8
-rw-r--r--src/devices/sound/saa1099.h4
-rw-r--r--src/devices/sound/t6721a.h16
-rw-r--r--src/devices/video/hlcd0515.cpp203
-rw-r--r--src/devices/video/hlcd0515.h115
-rw-r--r--src/devices/video/huc6261.cpp85
-rw-r--r--src/devices/video/huc6261.h16
-rw-r--r--src/devices/video/huc6271.cpp88
-rw-r--r--src/devices/video/huc6271.h63
-rw-r--r--src/devices/video/huc6272.cpp274
-rw-r--r--src/devices/video/huc6272.h70
-rw-r--r--src/devices/video/ppu2c0x.cpp (renamed from src/mame/video/ppu2c0x.cpp)0
-rw-r--r--src/devices/video/ppu2c0x.h (renamed from src/mame/video/ppu2c0x.h)0
-rw-r--r--src/devices/video/tms9927.cpp2
-rw-r--r--src/devices/video/v9938.h6
-rw-r--r--src/devices/video/zeus2.cpp100
-rw-r--r--src/devices/video/zeus2.h2
-rw-r--r--src/emu/debug/debugcmd.cpp61
-rw-r--r--src/emu/debug/debugcmd.h1
-rw-r--r--src/emu/debug/debugcpu.cpp26
-rw-r--r--src/emu/debug/debugcpu.h7
-rw-r--r--src/emu/debug/debughlp.cpp36
-rw-r--r--src/emu/debug/express.cpp32
-rw-r--r--src/emu/debug/express.h6
-rw-r--r--src/emu/distate.h1
-rw-r--r--src/emu/emuopts.cpp6
-rw-r--r--src/emu/emuopts.h2
-rw-r--r--src/emu/ioport.cpp4
-rw-r--r--src/emu/logmacro.h22
-rw-r--r--src/emu/machine.cpp4
-rw-r--r--src/emu/main.cpp10
-rw-r--r--src/emu/main.h2
-rw-r--r--src/emu/natkeyboard.cpp154
-rw-r--r--src/emu/natkeyboard.h16
-rw-r--r--src/frontend/mame/cheat.cpp593
-rw-r--r--src/frontend/mame/cheat.h162
-rw-r--r--src/frontend/mame/clifront.cpp12
-rw-r--r--src/frontend/mame/clifront.h1
-rw-r--r--src/frontend/mame/luaengine.cpp17
-rw-r--r--src/frontend/mame/luaengine.h1
-rw-r--r--src/lib/formats/apd_dsk.cpp145
-rw-r--r--src/lib/formats/apd_dsk.h31
-rw-r--r--src/lib/formats/tzx_cas.cpp77
-rw-r--r--src/lib/formats/tzx_cas.h2
-rw-r--r--src/lib/formats/zx81_p.cpp22
-rw-r--r--src/lib/formats/zx81_p.h1
-rw-r--r--src/lib/netlist/analog/nld_bjt.cpp255
-rw-r--r--src/lib/netlist/analog/nld_bjt.h248
-rw-r--r--src/lib/netlist/analog/nld_fourterm.h203
-rw-r--r--src/lib/netlist/analog/nld_opamps.cpp64
-rw-r--r--src/lib/netlist/analog/nld_opamps.h70
-rw-r--r--src/lib/netlist/analog/nld_switches.cpp5
-rw-r--r--src/lib/netlist/analog/nld_switches.h4
-rw-r--r--src/lib/netlist/analog/nld_twoterm.h424
-rw-r--r--src/lib/netlist/analog/nlid_fourterm.cpp (renamed from src/lib/netlist/analog/nld_fourterm.cpp)15
-rw-r--r--src/lib/netlist/analog/nlid_fourterm.h211
-rw-r--r--src/lib/netlist/analog/nlid_twoterm.cpp (renamed from src/lib/netlist/analog/nld_twoterm.cpp)70
-rw-r--r--src/lib/netlist/analog/nlid_twoterm.h448
-rw-r--r--src/lib/netlist/build/doxygen.conf514
-rw-r--r--src/lib/netlist/build/makefile9
-rw-r--r--src/lib/netlist/devices/net_lib.cpp55
-rw-r--r--src/lib/netlist/devices/net_lib.h29
-rw-r--r--src/lib/netlist/devices/nld_2102A.cpp1
-rw-r--r--src/lib/netlist/devices/nld_2716.cpp1
-rw-r--r--src/lib/netlist/devices/nld_4020.cpp2
-rw-r--r--src/lib/netlist/devices/nld_4066.cpp4
-rw-r--r--src/lib/netlist/devices/nld_4316.cpp4
-rw-r--r--src/lib/netlist/devices/nld_74107.cpp1
-rw-r--r--src/lib/netlist/devices/nld_74123.cpp6
-rw-r--r--src/lib/netlist/devices/nld_74153.cpp1
-rw-r--r--src/lib/netlist/devices/nld_74161.cpp1
-rw-r--r--src/lib/netlist/devices/nld_74165.cpp1
-rw-r--r--src/lib/netlist/devices/nld_74166.cpp3
-rw-r--r--src/lib/netlist/devices/nld_74174.cpp1
-rw-r--r--src/lib/netlist/devices/nld_74175.cpp1
-rw-r--r--src/lib/netlist/devices/nld_74192.cpp1
-rw-r--r--src/lib/netlist/devices/nld_74193.cpp5
-rw-r--r--src/lib/netlist/devices/nld_74194.cpp1
-rw-r--r--src/lib/netlist/devices/nld_74194.h22
-rw-r--r--src/lib/netlist/devices/nld_74279.cpp7
-rw-r--r--src/lib/netlist/devices/nld_74365.cpp1
-rw-r--r--src/lib/netlist/devices/nld_7448.cpp6
-rw-r--r--src/lib/netlist/devices/nld_7448.h6
-rw-r--r--src/lib/netlist/devices/nld_7450.cpp1
-rw-r--r--src/lib/netlist/devices/nld_7473.cpp1
-rw-r--r--src/lib/netlist/devices/nld_7474.cpp1
-rw-r--r--src/lib/netlist/devices/nld_7475.cpp1
-rw-r--r--src/lib/netlist/devices/nld_7483.cpp1
-rw-r--r--src/lib/netlist/devices/nld_7485.cpp1
-rw-r--r--src/lib/netlist/devices/nld_7490.cpp1
-rw-r--r--src/lib/netlist/devices/nld_7493.cpp8
-rw-r--r--src/lib/netlist/devices/nld_74ls629.cpp2
-rw-r--r--src/lib/netlist/devices/nld_82S115.cpp1
-rw-r--r--src/lib/netlist/devices/nld_82S115.h26
-rw-r--r--src/lib/netlist/devices/nld_82S123.cpp1
-rw-r--r--src/lib/netlist/devices/nld_82S126.cpp1
-rw-r--r--src/lib/netlist/devices/nld_82S16.cpp1
-rw-r--r--src/lib/netlist/devices/nld_9310.cpp30
-rw-r--r--src/lib/netlist/devices/nld_9312.cpp4
-rw-r--r--src/lib/netlist/devices/nld_9312.h26
-rw-r--r--src/lib/netlist/devices/nld_9316.cpp31
-rw-r--r--src/lib/netlist/devices/nld_9322.cpp1
-rw-r--r--src/lib/netlist/devices/nld_am2847.cpp1
-rw-r--r--src/lib/netlist/devices/nld_dm9334.cpp1
-rw-r--r--src/lib/netlist/devices/nld_legacy.cpp2
-rw-r--r--src/lib/netlist/devices/nld_log.cpp12
-rw-r--r--src/lib/netlist/devices/nld_mm5837.cpp8
-rw-r--r--src/lib/netlist/devices/nld_ne555.cpp4
-rw-r--r--src/lib/netlist/devices/nld_r2r_dac.cpp5
-rw-r--r--src/lib/netlist/devices/nld_system.cpp79
-rw-r--r--src/lib/netlist/devices/nld_system.h4
-rw-r--r--src/lib/netlist/devices/nld_tristate.cpp1
-rw-r--r--src/lib/netlist/devices/nlid_cmos.h1
-rw-r--r--src/lib/netlist/devices/nlid_proxy.cpp15
-rw-r--r--src/lib/netlist/devices/nlid_proxy.h8
-rw-r--r--src/lib/netlist/devices/nlid_system.h45
-rw-r--r--src/lib/netlist/devices/nlid_truthtable.cpp (renamed from src/lib/netlist/devices/nld_truthtable.cpp)55
-rw-r--r--src/lib/netlist/devices/nlid_truthtable.h (renamed from src/lib/netlist/devices/nld_truthtable.h)40
-rw-r--r--src/lib/netlist/documentation/mainpage.dox.h1
-rw-r--r--src/lib/netlist/macro/nlm_cd4xxx.cpp1
-rw-r--r--src/lib/netlist/macro/nlm_cd4xxx.h3
-rw-r--r--src/lib/netlist/macro/nlm_opamp.cpp4
-rw-r--r--src/lib/netlist/macro/nlm_opamp.h4
-rw-r--r--src/lib/netlist/macro/nlm_other.cpp1
-rw-r--r--src/lib/netlist/macro/nlm_other.h3
-rw-r--r--src/lib/netlist/macro/nlm_ttl74xx.cpp7
-rw-r--r--src/lib/netlist/macro/nlm_ttl74xx.h4
-rw-r--r--src/lib/netlist/netlist_types.h54
-rw-r--r--src/lib/netlist/nl_base.cpp239
-rw-r--r--src/lib/netlist/nl_base.h326
-rw-r--r--src/lib/netlist/nl_config.h88
-rw-r--r--src/lib/netlist/nl_dice_compat.h3
-rw-r--r--src/lib/netlist/nl_errstr.h92
-rw-r--r--src/lib/netlist/nl_factory.cpp25
-rw-r--r--src/lib/netlist/nl_factory.h78
-rw-r--r--src/lib/netlist/nl_lists.h75
-rw-r--r--src/lib/netlist/nl_parser.cpp51
-rw-r--r--src/lib/netlist/nl_parser.h11
-rw-r--r--src/lib/netlist/nl_setup.cpp272
-rw-r--r--src/lib/netlist/nl_setup.h68
-rw-r--r--src/lib/netlist/nl_time.h70
-rw-r--r--src/lib/netlist/plib/palloc.cpp2
-rw-r--r--src/lib/netlist/plib/palloc.h5
-rw-r--r--src/lib/netlist/plib/pchrono.h1
-rw-r--r--src/lib/netlist/plib/pconfig.h88
-rw-r--r--src/lib/netlist/plib/pdynlib.h4
-rw-r--r--src/lib/netlist/plib/pexception.cpp4
-rw-r--r--src/lib/netlist/plib/pexception.h1
-rw-r--r--src/lib/netlist/plib/pfmtlog.cpp19
-rw-r--r--src/lib/netlist/plib/pfmtlog.h57
-rw-r--r--src/lib/netlist/plib/pfunction.cpp212
-rw-r--r--src/lib/netlist/plib/pfunction.h87
-rw-r--r--src/lib/netlist/plib/plists.h4
-rw-r--r--src/lib/netlist/plib/poptions.cpp29
-rw-r--r--src/lib/netlist/plib/poptions.h38
-rw-r--r--src/lib/netlist/plib/pparser.cpp18
-rw-r--r--src/lib/netlist/plib/pparser.h31
-rw-r--r--src/lib/netlist/plib/ppmf.h198
-rw-r--r--src/lib/netlist/plib/pstate.h7
-rw-r--r--src/lib/netlist/plib/pstream.cpp58
-rw-r--r--src/lib/netlist/plib/pstream.h123
-rw-r--r--src/lib/netlist/plib/pstring.cpp80
-rw-r--r--src/lib/netlist/plib/pstring.h106
-rw-r--r--src/lib/netlist/plib/ptypes.h32
-rw-r--r--src/lib/netlist/plib/putil.cpp32
-rwxr-xr-x[-rw-r--r--]src/lib/netlist/plib/putil.h18
-rw-r--r--src/lib/netlist/prg/nltool.cpp117
-rw-r--r--src/lib/netlist/prg/nlwav.cpp170
-rw-r--r--src/lib/netlist/solver/mat_cr.h114
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver.cpp63
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver.h74
-rw-r--r--src/lib/netlist/solver/nld_ms_direct.h177
-rw-r--r--src/lib/netlist/solver/nld_ms_direct_lu.h9
-rw-r--r--src/lib/netlist/solver/nld_ms_gcr.h332
-rw-r--r--src/lib/netlist/solver/nld_ms_gmres.h97
-rw-r--r--src/lib/netlist/solver/nld_ms_sm.h64
-rw-r--r--src/lib/netlist/solver/nld_ms_sor.h42
-rw-r--r--src/lib/netlist/solver/nld_ms_sor_mat.h18
-rw-r--r--src/lib/netlist/solver/nld_ms_w.h63
-rw-r--r--src/lib/netlist/solver/nld_solver.cpp228
-rw-r--r--src/lib/netlist/solver/nld_solver.h19
-rwxr-xr-x[-rw-r--r--]src/lib/netlist/solver/vector_base.h41
-rw-r--r--src/lib/netlist/tools/nl_convert.cpp48
-rw-r--r--src/lib/netlist/tools/nl_convert.h14
-rw-r--r--src/lib/util/chd.cpp14
-rw-r--r--src/lib/util/hashing.h54
-rw-r--r--src/lib/util/path_to_regex.cpp4
-rw-r--r--src/lib/util/path_to_regex.hpp4
-rw-r--r--src/lib/util/server_ws.hpp4
-rw-r--r--src/lib/util/sha1.hpp232
-rw-r--r--src/lib/util/unicode.cpp10
-rw-r--r--src/mame/audio/nl_kidniki.h2
-rw-r--r--src/mame/audio/nl_mario.cpp4
-rw-r--r--src/mame/audio/polyplay.cpp2
-rw-r--r--src/mame/drivers/5clown.cpp2
-rw-r--r--src/mame/drivers/aa310.cpp4
-rw-r--r--src/mame/drivers/aerofgt.cpp58
-rw-r--r--src/mame/drivers/aleisttl.cpp2
-rw-r--r--src/mame/drivers/alg.cpp4
-rw-r--r--src/mame/drivers/amiga.cpp27
-rw-r--r--src/mame/drivers/aristmk5.cpp732
-rw-r--r--src/mame/drivers/armedf.cpp4
-rw-r--r--src/mame/drivers/arsystems.cpp4
-rw-r--r--src/mame/drivers/asteroid.cpp8
-rw-r--r--src/mame/drivers/astrof.cpp20
-rw-r--r--src/mame/drivers/asuka.cpp8
-rw-r--r--src/mame/drivers/atarittl.cpp33
-rw-r--r--src/mame/drivers/atlantis.cpp2
-rw-r--r--src/mame/drivers/atom.cpp38
-rw-r--r--src/mame/drivers/attache.cpp2
-rw-r--r--src/mame/drivers/atvtrack.cpp24
-rw-r--r--src/mame/drivers/avt.cpp99
-rw-r--r--src/mame/drivers/aztarac.cpp33
-rw-r--r--src/mame/drivers/bublbobl.cpp2
-rw-r--r--src/mame/drivers/bwidow.cpp6
-rw-r--r--src/mame/drivers/bzone.cpp2
-rw-r--r--src/mame/drivers/cc40.cpp36
-rw-r--r--src/mame/drivers/cclimber.cpp49
-rw-r--r--src/mame/drivers/cdi.cpp28
-rw-r--r--src/mame/drivers/cfx9850.cpp335
-rw-r--r--src/mame/drivers/coco12.cpp14
-rw-r--r--src/mame/drivers/coco3.cpp1
-rw-r--r--src/mame/drivers/cubo.cpp4
-rw-r--r--src/mame/drivers/d9final.cpp2
-rw-r--r--src/mame/drivers/dblcrown.cpp35
-rw-r--r--src/mame/drivers/dccons.cpp43
-rw-r--r--src/mame/drivers/ddragon.cpp116
-rw-r--r--src/mame/drivers/dec0.cpp90
-rw-r--r--src/mame/drivers/deco32.cpp6
-rw-r--r--src/mame/drivers/ep64.cpp2
-rw-r--r--src/mame/drivers/equites.cpp2
-rw-r--r--src/mame/drivers/esd16.cpp33
-rw-r--r--src/mame/drivers/exidy.cpp26
-rw-r--r--src/mame/drivers/fccpu20.cpp461
-rw-r--r--src/mame/drivers/fccpu30.cpp10
-rw-r--r--src/mame/drivers/fidel6502.cpp81
-rw-r--r--src/mame/drivers/fidel68k.cpp23
-rw-r--r--src/mame/drivers/fidelz80.cpp59
-rw-r--r--src/mame/drivers/firetrk.cpp4
-rw-r--r--src/mame/drivers/fromance.cpp6
-rw-r--r--src/mame/drivers/funkball.cpp8
-rw-r--r--src/mame/drivers/funworld.cpp161
-rw-r--r--src/mame/drivers/gcpinbal.cpp24
-rw-r--r--src/mame/drivers/gkigt.cpp8
-rw-r--r--src/mame/drivers/gladiatr.cpp55
-rw-r--r--src/mame/drivers/goldstar.cpp232
-rw-r--r--src/mame/drivers/gts80.cpp12
-rw-r--r--src/mame/drivers/gts80b.cpp644
-rw-r--r--src/mame/drivers/gundealr.cpp35
-rw-r--r--src/mame/drivers/hazeltin.cpp17
-rw-r--r--src/mame/drivers/hh_amis2k.cpp18
-rw-r--r--src/mame/drivers/hh_cop400.cpp538
-rw-r--r--src/mame/drivers/hh_hmcs40.cpp184
-rw-r--r--src/mame/drivers/hh_melps4.cpp44
-rw-r--r--src/mame/drivers/hh_pic16.cpp30
-rw-r--r--src/mame/drivers/hh_sm510.cpp14
-rw-r--r--src/mame/drivers/hh_tms1k.cpp541
-rw-r--r--src/mame/drivers/hh_ucom4.cpp83
-rw-r--r--src/mame/drivers/ibm6580.cpp106
-rw-r--r--src/mame/drivers/ibmpcjr.cpp3
-rw-r--r--src/mame/drivers/igs011.cpp56
-rw-r--r--src/mame/drivers/interpro.cpp348
-rw-r--r--src/mame/drivers/jollyjgr.cpp6
-rw-r--r--src/mame/drivers/k28.cpp42
-rw-r--r--src/mame/drivers/kangaroo.cpp24
-rw-r--r--src/mame/drivers/konamim2.cpp194
-rw-r--r--src/mame/drivers/kurukuru.cpp124
-rw-r--r--src/mame/drivers/laserbas.cpp404
-rw-r--r--src/mame/drivers/lastbank.cpp220
-rw-r--r--src/mame/drivers/lwriter.cpp304
-rw-r--r--src/mame/drivers/m6805evs.cpp68
-rw-r--r--src/mame/drivers/marineb.cpp17
-rw-r--r--src/mame/drivers/maxaflex.cpp245
-rw-r--r--src/mame/drivers/metro.cpp65
-rw-r--r--src/mame/drivers/micro20.cpp2
-rw-r--r--src/mame/drivers/microvsn.cpp4
-rw-r--r--src/mame/drivers/miniforce.cpp18
-rw-r--r--src/mame/drivers/missile.cpp210
-rw-r--r--src/mame/drivers/mmodular.cpp140
-rw-r--r--src/mame/drivers/model2.cpp2
-rw-r--r--src/mame/drivers/mquake.cpp4
-rw-r--r--src/mame/drivers/mvme147.cpp54
-rw-r--r--src/mame/drivers/mzr8105.cpp6
-rw-r--r--src/mame/drivers/namcos2.cpp4
-rw-r--r--src/mame/drivers/namcos21.cpp18
-rw-r--r--src/mame/drivers/naomi.cpp938
-rw-r--r--src/mame/drivers/neodriv.hxx53
-rw-r--r--src/mame/drivers/newbrain.cpp8
-rw-r--r--src/mame/drivers/nmk16.cpp54
-rw-r--r--src/mame/drivers/novag6502.cpp161
-rw-r--r--src/mame/drivers/novag68k.cpp316
-rw-r--r--src/mame/drivers/osborne1.cpp2
-rw-r--r--src/mame/drivers/pc.cpp134
-rw-r--r--src/mame/drivers/pc9801.cpp160
-rw-r--r--src/mame/drivers/pcfx.cpp121
-rw-r--r--src/mame/drivers/peyper.cpp6
-rw-r--r--src/mame/drivers/pipeline.cpp18
-rw-r--r--src/mame/drivers/pitnrun.cpp28
-rw-r--r--src/mame/drivers/polepos.cpp145
-rw-r--r--src/mame/drivers/polyplay.cpp109
-rw-r--r--src/mame/drivers/pse.cpp24
-rw-r--r--src/mame/drivers/qix.cpp8
-rw-r--r--src/mame/drivers/rainbow.cpp50
-rw-r--r--src/mame/drivers/retofinv.cpp84
-rw-r--r--src/mame/drivers/rm380z.cpp22
-rw-r--r--src/mame/drivers/s11c.cpp33
-rw-r--r--src/mame/drivers/sdk85.cpp53
-rw-r--r--src/mame/drivers/segae.cpp11
-rw-r--r--src/mame/drivers/segasp.cpp3
-rw-r--r--src/mame/drivers/slapfght.cpp2
-rw-r--r--src/mame/drivers/stadhero.cpp6
-rw-r--r--src/mame/drivers/starwars.cpp2
-rw-r--r--src/mame/drivers/stfight.cpp20
-rw-r--r--src/mame/drivers/stlforce.cpp2
-rw-r--r--src/mame/drivers/stv.cpp23
-rw-r--r--src/mame/drivers/suprnova.cpp72
-rw-r--r--src/mame/drivers/taito_f3.cpp4
-rw-r--r--src/mame/drivers/taito_l.cpp22
-rw-r--r--src/mame/drivers/taitosj.cpp4
-rw-r--r--src/mame/drivers/tb303.cpp6
-rw-r--r--src/mame/drivers/tempest.cpp2
-rw-r--r--src/mame/drivers/thayers.cpp194
-rw-r--r--src/mame/drivers/ti74.cpp14
-rw-r--r--src/mame/drivers/ticalc1x.cpp10
-rw-r--r--src/mame/drivers/tigeroad.cpp117
-rw-r--r--src/mame/drivers/tispeak.cpp18
-rw-r--r--src/mame/drivers/tispellb.cpp8
-rw-r--r--src/mame/drivers/toaplan2.cpp6
-rw-r--r--src/mame/drivers/upscope.cpp4
-rw-r--r--src/mame/drivers/vcs80.cpp2
-rw-r--r--src/mame/drivers/vd.cpp6
-rw-r--r--src/mame/drivers/vicdual.cpp41
-rw-r--r--src/mame/drivers/witch.cpp10
-rw-r--r--src/mame/drivers/x1.cpp4
-rw-r--r--src/mame/drivers/zn.cpp26
-rw-r--r--src/mame/drivers/zorba.cpp608
-rw-r--r--src/mame/drivers/zx.cpp24
-rw-r--r--src/mame/includes/aerofgt.h7
-rw-r--r--src/mame/includes/amiga.h11
-rw-r--r--src/mame/includes/cclimber.h1
-rw-r--r--src/mame/includes/changela.h12
-rw-r--r--src/mame/includes/coco.h2
-rw-r--r--src/mame/includes/dc.h8
-rw-r--r--src/mame/includes/dccons.h1
-rw-r--r--src/mame/includes/ddragon.h85
-rw-r--r--src/mame/includes/dec0.h14
-rw-r--r--src/mame/includes/deco32.h2
-rw-r--r--src/mame/includes/fidelbase.h70
-rw-r--r--src/mame/includes/fidelz80.h71
-rw-r--r--src/mame/includes/gcpinbal.h7
-rw-r--r--src/mame/includes/gladiatr.h8
-rw-r--r--src/mame/includes/gundealr.h2
-rw-r--r--src/mame/includes/hh_tms1k.h34
-rw-r--r--src/mame/includes/hh_ucom4.h30
-rw-r--r--src/mame/includes/interpro.h131
-rw-r--r--src/mame/includes/metro.h2
-rw-r--r--src/mame/includes/namcos2.h4
-rw-r--r--src/mame/includes/namcos21.h6
-rw-r--r--src/mame/includes/naomi.h74
-rw-r--r--src/mame/includes/novagbase.h63
-rw-r--r--src/mame/includes/osborne1.h2
-rw-r--r--src/mame/includes/polepos.h2
-rw-r--r--src/mame/includes/polyplay.h8
-rw-r--r--src/mame/includes/retofinv.h100
-rw-r--r--src/mame/includes/rm380z.h2
-rw-r--r--src/mame/includes/stfight.h86
-rw-r--r--src/mame/includes/superqix.h18
-rw-r--r--src/mame/includes/tigeroad.h71
-rw-r--r--src/mame/includes/vcs80.h6
-rw-r--r--src/mame/includes/xbox_nv2a.h2
-rw-r--r--src/mame/includes/zorba.h113
-rw-r--r--src/mame/includes/zx.h1
-rw-r--r--src/mame/layout/aristmk5.lay162
-rw-r--r--src/mame/layout/aristmk5_us.lay267
-rw-r--r--src/mame/layout/cnsector.lay12
-rw-r--r--src/mame/layout/einvader.lay81
-rw-r--r--src/mame/layout/einvaderc.lay81
-rw-r--r--src/mame/layout/f2pbball.lay328
-rw-r--r--src/mame/layout/hh_cop400_test.lay556
-rw-r--r--src/mame/layout/horseran.lay154
-rw-r--r--src/mame/layout/lchicken.lay133
-rw-r--r--src/mame/layout/mdallas.lay37
-rw-r--r--src/mame/layout/novag_diablo68k.lay435
-rw-r--r--src/mame/layout/polepos.lay4
-rw-r--r--src/mame/layout/polyplay.lay117
-rw-r--r--src/mame/machine/alpha8201.cpp6
-rw-r--r--src/mame/machine/alpha8201.h12
-rw-r--r--src/mame/machine/amiga.cpp28
-rw-r--r--src/mame/machine/amigakbd.cpp574
-rw-r--r--src/mame/machine/amigakbd.h143
-rw-r--r--src/mame/machine/archimds.cpp21
-rw-r--r--src/mame/machine/cammu.cpp181
-rw-r--r--src/mame/machine/cammu.h91
-rw-r--r--src/mame/machine/dc.cpp40
-rw-r--r--src/mame/machine/dec0.cpp70
-rw-r--r--src/mame/machine/egret.cpp2
-rw-r--r--src/mame/machine/harddriv.cpp2
-rw-r--r--src/mame/machine/ibm6580_fdc.cpp14
-rw-r--r--src/mame/machine/ibm6580_kbd.cpp8
-rw-r--r--src/mame/machine/interpro_ioga.cpp691
-rw-r--r--src/mame/machine/interpro_ioga.h255
-rw-r--r--src/mame/machine/interpro_mcga.cpp89
-rw-r--r--src/mame/machine/interpro_mcga.h45
-rw-r--r--src/mame/machine/interpro_sga.cpp88
-rw-r--r--src/mame/machine/interpro_sga.h71
-rw-r--r--src/mame/machine/namco_c139.cpp18
-rw-r--r--src/mame/machine/namco_c139.h4
-rw-r--r--src/mame/machine/namco_c148.cpp74
-rw-r--r--src/mame/machine/namco_c148.h24
-rw-r--r--src/mame/machine/namcoio_gearbox.cpp52
-rw-r--r--src/mame/machine/namcoio_gearbox.h2
-rw-r--r--src/mame/machine/namcos2.cpp8
-rw-r--r--src/mame/machine/naomi.cpp2
-rw-r--r--src/mame/machine/naomibd.cpp3
-rw-r--r--src/mame/machine/naomim2.cpp14
-rw-r--r--src/mame/machine/nl_hazelvid.h2
-rw-r--r--src/mame/machine/nl_pong.cpp8
-rw-r--r--src/mame/machine/nl_pongd.cpp1
-rw-r--r--src/mame/machine/nl_stuntcyc.cpp4
-rw-r--r--src/mame/machine/nl_stuntcyc.h2
-rw-r--r--src/mame/machine/osborne1.cpp12
-rw-r--r--src/mame/machine/pc9801_86.cpp4
-rw-r--r--src/mame/machine/pc9801_kbd.cpp2
-rw-r--r--src/mame/machine/retofinv.cpp133
-rw-r--r--src/mame/machine/rm380z.cpp20
-rw-r--r--src/mame/machine/stfight.cpp107
-rw-r--r--src/mame/machine/taito68705interface.cpp2
-rw-r--r--src/mame/machine/tigeroad.cpp114
-rw-r--r--src/mame/machine/zorbakbd.cpp315
-rw-r--r--src/mame/machine/zorbakbd.h43
-rw-r--r--src/mame/mame.lst106
-rw-r--r--src/mame/mess.flt2
-rw-r--r--src/mame/video/combatsc.cpp4
-rw-r--r--src/mame/video/deco16ic.cpp2
-rw-r--r--src/mame/video/goldstar.cpp4
-rw-r--r--src/mame/video/gundealr.cpp8
-rw-r--r--src/mame/video/n64.cpp1239
-rw-r--r--src/mame/video/n64.h87
-rw-r--r--src/mame/video/namcos21.cpp8
-rw-r--r--src/mame/video/newbrain.cpp6
-rw-r--r--src/mame/video/pin64.cpp506
-rw-r--r--src/mame/video/pin64.h180
-rw-r--r--src/mame/video/powervr2.cpp1
-rw-r--r--src/mame/video/taito_f3.cpp2
-rw-r--r--src/mame/video/ygv608.cpp84
-rw-r--r--src/mame/video/ygv608.h3
-rw-r--r--src/osd/asio.h2
-rw-r--r--src/osd/modules/debugger/debugosx.mm2
-rw-r--r--src/osd/modules/debugger/osx/debugconsole.mm3
-rw-r--r--src/osd/modules/debugger/osx/debugview.mm2
-rw-r--r--src/osd/modules/debugger/osx/deviceinfoviewer.mm1
-rw-r--r--src/osd/modules/debugger/osx/devicesviewer.mm1
-rw-r--r--src/osd/modules/debugger/osx/disassemblyviewer.mm1
-rw-r--r--src/osd/modules/debugger/osx/errorlogviewer.mm1
-rw-r--r--src/osd/modules/debugger/osx/memoryviewer.mm1
-rw-r--r--src/osd/modules/debugger/osx/pointsviewer.mm2
-rw-r--r--src/osd/modules/lib/osdobj_common.cpp2
-rw-r--r--src/osd/modules/render/bgfx/shaders/shader.mk2
-rw-r--r--src/osd/modules/sound/pa_sound.cpp97
-rw-r--r--src/tools/imgtool/charconv.cpp2
-rw-r--r--src/tools/imgtool/imgtool.cpp4
-rw-r--r--src/tools/imgtool/main.cpp2
-rw-r--r--src/tools/imgtool/modules/mac.cpp2
-rw-r--r--src/tools/imgtool/modules/rsdos.cpp2
-rw-r--r--src/tools/unidasm.cpp8
-rw-r--r--tests/LICENSE2
-rw-r--r--uismall.bdf2
-rw-r--r--web/LICENSE2
875 files changed, 62926 insertions, 30612 deletions
diff --git a/3rdparty/bx/include/bx/simd256_avx.inl b/3rdparty/bx/include/bx/simd256_avx.inl
index c8af735bfbf..2a31c83f5ae 100644
--- a/3rdparty/bx/include/bx/simd256_avx.inl
+++ b/3rdparty/bx/include/bx/simd256_avx.inl
@@ -38,34 +38,34 @@ namespace bx
}
template<>
- BX_SIMD_FORCE_INLINE simd256_avx_t_t simd_splat(float _a)
+ BX_SIMD_FORCE_INLINE simd256_avx_t simd_splat(float _a)
{
return _mm256_set1_ps(_a);
}
template<>
- BX_SIMD_FORCE_INLINE simd256_avx_t_t simd_isplat(uint32_t _a)
+ BX_SIMD_FORCE_INLINE simd256_avx_t simd_isplat(uint32_t _a)
{
const __m256i splat = _mm256_set1_epi32(_a);
- const simd256_avx_t_t result = _mm256_castsi256_ps(splat);
+ const simd256_avx_t result = _mm256_castsi256_ps(splat);
return result;
}
template<>
- BX_SIMD_FORCE_INLINE simd256_avx_t_t simd_itof(simd256_avx_t_t _a)
+ BX_SIMD_FORCE_INLINE simd256_avx_t simd_itof(simd256_avx_t _a)
{
const __m256i itof = _mm256_castps_si256(_a);
- const simd256_avx_t_t result = _mm256_cvtepi32_ps(itof);
+ const simd256_avx_t result = _mm256_cvtepi32_ps(itof);
return result;
}
template<>
- BX_SIMD_FORCE_INLINE simd256_avx_t_t simd_ftoi(simd256_avx_t_t _a)
+ BX_SIMD_FORCE_INLINE simd256_avx_t simd_ftoi(simd256_avx_t _a)
{
const __m256i ftoi = _mm256_cvtps_epi32(_a);
- const simd256_avx_t_t result = _mm256_castsi256_ps(ftoi);
+ const simd256_avx_t result = _mm256_castsi256_ps(ftoi);
return result;
}
diff --git a/3rdparty/libjpeg/Makefile.am b/3rdparty/libjpeg/Makefile.am
index 42cff57f7bc..d7e0bd229e7 100644
--- a/3rdparty/libjpeg/Makefile.am
+++ b/3rdparty/libjpeg/Makefile.am
@@ -33,17 +33,17 @@ DOCS= README install.txt usage.txt wizard.txt example.c libjpeg.txt \
structure.txt coderules.txt filelist.txt change.log
# Makefiles for various systems
-MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \
- makefile.mc6 makefile.dj makefile.wat makefile.vc makejdsw.vc6 \
- makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \
- makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \
- maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \
- makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \
- makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \
- makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \
- makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \
- makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \
- makefile.mms makefile.vms makvms.opt
+MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.b32 \
+ makefile.bcc makefile.mc6 makefile.dj makefile.wat makefile.vc \
+ makejdsw.vc6 makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 \
+ makecdep.vc6 makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 \
+ makedmak.vc6 maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 \
+ makerdsp.vc6 makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 \
+ makejsln.v10 makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 \
+ makecfil.v10 makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 \
+ makervcx.v10 makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac \
+ makcjpeg.st makdjpeg.st makljpeg.st maktjpeg.st makefile.manx \
+ makefile.sas makefile.mms makefile.vms makvms.opt
# Configuration files
CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \
@@ -51,11 +51,11 @@ CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \
jconfig.vms
# Support scripts for configure
-CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp missing
+CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp \
+ missing ar-lib
# Miscellaneous support files
-OTHERFILES= jconfig.txt ckconfig.c ansi2knr.c ansi2knr.1 jmemdosa.asm \
- libjpeg.map
+OTHERFILES= jconfig.txt ckconfig.c jmemdosa.asm libjpeg.map
# Test support files
TESTFILES= testorig.jpg testimg.ppm testimg.bmp testimg.jpg testprog.jpg \
diff --git a/3rdparty/libjpeg/Makefile.in b/3rdparty/libjpeg/Makefile.in
index 92033592eb6..7628676803b 100644
--- a/3rdparty/libjpeg/Makefile.in
+++ b/3rdparty/libjpeg/Makefile.in
@@ -1,9 +1,8 @@
-# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
-# Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -24,6 +23,61 @@
VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
pkgdatadir = $(datadir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
@@ -43,19 +97,16 @@ POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
-ANSI2KNR = @ANSI2KNR@
@HAVE_LD_VERSION_SCRIPT_TRUE@am__append_1 = -Wl,--version-script=$(srcdir)/libjpeg.map
bin_PROGRAMS = cjpeg$(EXEEXT) djpeg$(EXEEXT) jpegtran$(EXEEXT) \
rdjpgcom$(EXEEXT) wrjpgcom$(EXEEXT)
subdir = .
-DIST_COMMON = README $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
- $(top_srcdir)/configure $(am__configure_deps) \
- $(srcdir)/jconfig.cfg ansi2knr.c ansi2knr.1 depcomp \
- $(include_HEADERS) $(noinst_HEADERS)
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
+ $(am__configure_deps) $(include_HEADERS) $(noinst_HEADERS)
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
configure.lineno config.status.lineno
mkinstalldirs = $(install_sh) -d
@@ -83,51 +134,68 @@ am__nobase_list = $(am__nobase_strip_setup); \
am__base_list = \
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
"$(DESTDIR)$(man1dir)" "$(DESTDIR)$(includedir)"
LTLIBRARIES = $(lib_LTLIBRARIES)
libjpeg_la_LIBADD =
-am__objects_1 = jaricom$U.lo jcapimin$U.lo jcapistd$U.lo jcarith$U.lo \
- jccoefct$U.lo jccolor$U.lo jcdctmgr$U.lo jchuff$U.lo \
- jcinit$U.lo jcmainct$U.lo jcmarker$U.lo jcmaster$U.lo \
- jcomapi$U.lo jcparam$U.lo jcprepct$U.lo jcsample$U.lo \
- jctrans$U.lo jdapimin$U.lo jdapistd$U.lo jdarith$U.lo \
- jdatadst$U.lo jdatasrc$U.lo jdcoefct$U.lo jdcolor$U.lo \
- jddctmgr$U.lo jdhuff$U.lo jdinput$U.lo jdmainct$U.lo \
- jdmarker$U.lo jdmaster$U.lo jdmerge$U.lo jdpostct$U.lo \
- jdsample$U.lo jdtrans$U.lo jerror$U.lo jfdctflt$U.lo \
- jfdctfst$U.lo jfdctint$U.lo jidctflt$U.lo jidctfst$U.lo \
- jidctint$U.lo jquant1$U.lo jquant2$U.lo jutils$U.lo \
- jmemmgr$U.lo @MEMORYMGR@$U.lo
+am__objects_1 = jaricom.lo jcapimin.lo jcapistd.lo jcarith.lo \
+ jccoefct.lo jccolor.lo jcdctmgr.lo jchuff.lo jcinit.lo \
+ jcmainct.lo jcmarker.lo jcmaster.lo jcomapi.lo jcparam.lo \
+ jcprepct.lo jcsample.lo jctrans.lo jdapimin.lo jdapistd.lo \
+ jdarith.lo jdatadst.lo jdatasrc.lo jdcoefct.lo jdcolor.lo \
+ jddctmgr.lo jdhuff.lo jdinput.lo jdmainct.lo jdmarker.lo \
+ jdmaster.lo jdmerge.lo jdpostct.lo jdsample.lo jdtrans.lo \
+ jerror.lo jfdctflt.lo jfdctfst.lo jfdctint.lo jidctflt.lo \
+ jidctfst.lo jidctint.lo jquant1.lo jquant2.lo jutils.lo \
+ jmemmgr.lo @MEMORYMGR@.lo
am_libjpeg_la_OBJECTS = $(am__objects_1)
libjpeg_la_OBJECTS = $(am_libjpeg_la_OBJECTS)
-AM_V_lt = $(am__v_lt_$(V))
-am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
am__v_lt_0 = --silent
+am__v_lt_1 =
libjpeg_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(libjpeg_la_LDFLAGS) $(LDFLAGS) -o $@
PROGRAMS = $(bin_PROGRAMS)
-am_cjpeg_OBJECTS = cjpeg$U.$(OBJEXT) rdppm$U.$(OBJEXT) \
- rdgif$U.$(OBJEXT) rdtarga$U.$(OBJEXT) rdrle$U.$(OBJEXT) \
- rdbmp$U.$(OBJEXT) rdswitch$U.$(OBJEXT) cdjpeg$U.$(OBJEXT)
+am_cjpeg_OBJECTS = cjpeg.$(OBJEXT) rdppm.$(OBJEXT) rdgif.$(OBJEXT) \
+ rdtarga.$(OBJEXT) rdrle.$(OBJEXT) rdbmp.$(OBJEXT) \
+ rdswitch.$(OBJEXT) cdjpeg.$(OBJEXT)
cjpeg_OBJECTS = $(am_cjpeg_OBJECTS)
cjpeg_DEPENDENCIES = libjpeg.la
-am_djpeg_OBJECTS = djpeg$U.$(OBJEXT) wrppm$U.$(OBJEXT) \
- wrgif$U.$(OBJEXT) wrtarga$U.$(OBJEXT) wrrle$U.$(OBJEXT) \
- wrbmp$U.$(OBJEXT) rdcolmap$U.$(OBJEXT) cdjpeg$U.$(OBJEXT)
+am_djpeg_OBJECTS = djpeg.$(OBJEXT) wrppm.$(OBJEXT) wrgif.$(OBJEXT) \
+ wrtarga.$(OBJEXT) wrrle.$(OBJEXT) wrbmp.$(OBJEXT) \
+ rdcolmap.$(OBJEXT) cdjpeg.$(OBJEXT)
djpeg_OBJECTS = $(am_djpeg_OBJECTS)
djpeg_DEPENDENCIES = libjpeg.la
-am_jpegtran_OBJECTS = jpegtran$U.$(OBJEXT) rdswitch$U.$(OBJEXT) \
- cdjpeg$U.$(OBJEXT) transupp$U.$(OBJEXT)
+am_jpegtran_OBJECTS = jpegtran.$(OBJEXT) rdswitch.$(OBJEXT) \
+ cdjpeg.$(OBJEXT) transupp.$(OBJEXT)
jpegtran_OBJECTS = $(am_jpegtran_OBJECTS)
jpegtran_DEPENDENCIES = libjpeg.la
-am_rdjpgcom_OBJECTS = rdjpgcom$U.$(OBJEXT)
+am_rdjpgcom_OBJECTS = rdjpgcom.$(OBJEXT)
rdjpgcom_OBJECTS = $(am_rdjpgcom_OBJECTS)
rdjpgcom_LDADD = $(LDADD)
-am_wrjpgcom_OBJECTS = wrjpgcom$U.$(OBJEXT)
+am_wrjpgcom_OBJECTS = wrjpgcom.$(OBJEXT)
wrjpgcom_OBJECTS = $(am_wrjpgcom_OBJECTS)
wrjpgcom_LDADD = $(LDADD)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
DEFAULT_INCLUDES = -I.@am__isrc@
depcomp = $(SHELL) $(top_srcdir)/depcomp
am__depfiles_maybe = depfiles
@@ -138,30 +206,51 @@ LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
$(AM_CFLAGS) $(CFLAGS)
-AM_V_CC = $(am__v_CC_$(V))
-am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
-am__v_CC_0 = @echo " CC " $@;
-AM_V_at = $(am__v_at_$(V))
-am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
-am__v_at_0 = @
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo " CC " $@;
+am__v_CC_1 =
CCLD = $(CC)
LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CCLD = $(am__v_CCLD_$(V))
-am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
-am__v_CCLD_0 = @echo " CCLD " $@;
-AM_V_GEN = $(am__v_GEN_$(V))
-am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
-am__v_GEN_0 = @echo " GEN " $@;
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo " CCLD " $@;
+am__v_CCLD_1 =
SOURCES = $(libjpeg_la_SOURCES) $(cjpeg_SOURCES) $(djpeg_SOURCES) \
$(jpegtran_SOURCES) $(rdjpgcom_SOURCES) $(wrjpgcom_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
man1dir = $(mandir)/man1
NROFF = nroff
MANS = $(man_MANS)
HEADERS = $(include_HEADERS) $(noinst_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
+ $(LISP)jconfig.cfg
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
ETAGS = etags
CTAGS = ctags
+CSCOPE = cscope
+AM_RECURSIVE_TARGETS = cscope
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -203,6 +292,7 @@ LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
MAINT = @MAINT@
MAKEINFO = @MAKEINFO@
MANIFEST_TOOL = @MANIFEST_TOOL@
@@ -227,7 +317,6 @@ SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
-U = @U@
VERSION = @VERSION@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
@@ -317,17 +406,17 @@ DOCS = README install.txt usage.txt wizard.txt example.c libjpeg.txt \
# Makefiles for various systems
-MKFILES = configure Makefile.in makefile.ansi makefile.unix makefile.bcc \
- makefile.mc6 makefile.dj makefile.wat makefile.vc makejdsw.vc6 \
- makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \
- makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \
- maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \
- makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \
- makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \
- makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \
- makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \
- makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \
- makefile.mms makefile.vms makvms.opt
+MKFILES = configure Makefile.in makefile.ansi makefile.unix makefile.b32 \
+ makefile.bcc makefile.mc6 makefile.dj makefile.wat makefile.vc \
+ makejdsw.vc6 makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 \
+ makecdep.vc6 makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 \
+ makedmak.vc6 maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 \
+ makerdsp.vc6 makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 \
+ makejsln.v10 makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 \
+ makecfil.v10 makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 \
+ makervcx.v10 makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac \
+ makcjpeg.st makdjpeg.st makljpeg.st maktjpeg.st makefile.manx \
+ makefile.sas makefile.mms makefile.vms makvms.opt
# Configuration files
@@ -337,12 +426,12 @@ CONFIGFILES = jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \
# Support scripts for configure
-CONFIGUREFILES = config.guess config.sub install-sh ltmain.sh depcomp missing
+CONFIGUREFILES = config.guess config.sub install-sh ltmain.sh depcomp \
+ missing ar-lib
-# Miscellaneous support files
-OTHERFILES = jconfig.txt ckconfig.c ansi2knr.c ansi2knr.1 jmemdosa.asm \
- libjpeg.map
+# Miscellaneous support files
+OTHERFILES = jconfig.txt ckconfig.c jmemdosa.asm libjpeg.map
# Test support files
TESTFILES = testorig.jpg testimg.ppm testimg.bmp testimg.jpg testprog.jpg \
@@ -396,7 +485,7 @@ all: jconfig.h
.SUFFIXES:
.SUFFIXES: .c .lo .o .obj
-am--refresh:
+am--refresh: Makefile
@:
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
@@ -411,7 +500,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
$(am__cd) $(top_srcdir) && \
$(AUTOMAKE) --foreign Makefile
-.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
@@ -432,10 +520,8 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
$(am__aclocal_m4_deps):
jconfig.h: stamp-h1
- @if test ! -f $@; then \
- rm -f stamp-h1; \
- $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
- else :; fi
+ @test -f $@ || rm -f stamp-h1
+ @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
stamp-h1: $(srcdir)/jconfig.cfg $(top_builddir)/config.status
@rm -f stamp-h1
@@ -447,9 +533,9 @@ $(srcdir)/jconfig.cfg: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
distclean-hdr:
-rm -f jconfig.h stamp-h1
+
install-libLTLIBRARIES: $(lib_LTLIBRARIES)
@$(NORMAL_INSTALL)
- test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
list2=; for p in $$list; do \
if test -f $$p; then \
@@ -457,6 +543,8 @@ install-libLTLIBRARIES: $(lib_LTLIBRARIES)
else :; fi; \
done; \
test -z "$$list2" || { \
+ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
$(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
}
@@ -472,24 +560,32 @@ uninstall-libLTLIBRARIES:
clean-libLTLIBRARIES:
-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
- @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
- dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
- test "$$dir" != "$$p" || dir=.; \
- echo "rm -f \"$${dir}/so_locations\""; \
- rm -f "$${dir}/so_locations"; \
- done
-libjpeg.la: $(libjpeg_la_OBJECTS) $(libjpeg_la_DEPENDENCIES)
+ @list='$(lib_LTLIBRARIES)'; \
+ locs=`for p in $$list; do echo $$p; done | \
+ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+ sort -u`; \
+ test -z "$$locs" || { \
+ echo rm -f $${locs}; \
+ rm -f $${locs}; \
+ }
+
+libjpeg.la: $(libjpeg_la_OBJECTS) $(libjpeg_la_DEPENDENCIES) $(EXTRA_libjpeg_la_DEPENDENCIES)
$(AM_V_CCLD)$(libjpeg_la_LINK) -rpath $(libdir) $(libjpeg_la_OBJECTS) $(libjpeg_la_LIBADD) $(LIBS)
install-binPROGRAMS: $(bin_PROGRAMS)
@$(NORMAL_INSTALL)
- test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
for p in $$list; do echo "$$p $$p"; done | \
sed 's/$(EXEEXT)$$//' | \
- while read p p1; do if test -f $$p || test -f $$p1; \
- then echo "$$p"; echo "$$p"; else :; fi; \
+ while read p p1; do if test -f $$p \
+ || test -f $$p1 \
+ ; then echo "$$p"; echo "$$p"; else :; fi; \
done | \
- sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
+ sed -e 'p;s,.*/,,;n;h' \
+ -e 's|.*|.|' \
-e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
sed 'N;N;N;s,\n, ,g' | \
$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
@@ -510,7 +606,8 @@ uninstall-binPROGRAMS:
@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
files=`for p in $$list; do echo "$$p"; done | \
sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
- -e 's/$$/$(EXEEXT)/' `; \
+ -e 's/$$/$(EXEEXT)/' \
+ `; \
test -n "$$list" || exit 0; \
echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
cd "$(DESTDIR)$(bindir)" && rm -f $$files
@@ -523,19 +620,24 @@ clean-binPROGRAMS:
list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
echo " rm -f" $$list; \
rm -f $$list
-cjpeg$(EXEEXT): $(cjpeg_OBJECTS) $(cjpeg_DEPENDENCIES)
+
+cjpeg$(EXEEXT): $(cjpeg_OBJECTS) $(cjpeg_DEPENDENCIES) $(EXTRA_cjpeg_DEPENDENCIES)
@rm -f cjpeg$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(cjpeg_OBJECTS) $(cjpeg_LDADD) $(LIBS)
-djpeg$(EXEEXT): $(djpeg_OBJECTS) $(djpeg_DEPENDENCIES)
+
+djpeg$(EXEEXT): $(djpeg_OBJECTS) $(djpeg_DEPENDENCIES) $(EXTRA_djpeg_DEPENDENCIES)
@rm -f djpeg$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(djpeg_OBJECTS) $(djpeg_LDADD) $(LIBS)
-jpegtran$(EXEEXT): $(jpegtran_OBJECTS) $(jpegtran_DEPENDENCIES)
+
+jpegtran$(EXEEXT): $(jpegtran_OBJECTS) $(jpegtran_DEPENDENCIES) $(EXTRA_jpegtran_DEPENDENCIES)
@rm -f jpegtran$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(jpegtran_OBJECTS) $(jpegtran_LDADD) $(LIBS)
-rdjpgcom$(EXEEXT): $(rdjpgcom_OBJECTS) $(rdjpgcom_DEPENDENCIES)
+
+rdjpgcom$(EXEEXT): $(rdjpgcom_OBJECTS) $(rdjpgcom_DEPENDENCIES) $(EXTRA_rdjpgcom_DEPENDENCIES)
@rm -f rdjpgcom$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(rdjpgcom_OBJECTS) $(rdjpgcom_LDADD) $(LIBS)
-wrjpgcom$(EXEEXT): $(wrjpgcom_OBJECTS) $(wrjpgcom_DEPENDENCIES)
+
+wrjpgcom$(EXEEXT): $(wrjpgcom_OBJECTS) $(wrjpgcom_DEPENDENCIES) $(EXTRA_wrjpgcom_DEPENDENCIES)
@rm -f wrjpgcom$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(wrjpgcom_OBJECTS) $(wrjpgcom_LDADD) $(LIBS)
@@ -544,268 +646,93 @@ mostlyclean-compile:
distclean-compile:
-rm -f *.tab.c
-./ansi2knr: ansi2knr.$(OBJEXT)
- $(LINK) ansi2knr.$(OBJEXT) $(LIBS)
-ansi2knr.$(OBJEXT): $(CONFIG_HEADER)
-
-clean-krextra:
- -rm -f ansi2knr
-
-mostlyclean-kr:
- -test "$U" = "" || rm -f *_.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/@MEMORYMGR@$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdjpeg$U.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cjpeg$U.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/djpeg$U.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jaricom$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcapimin$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcapistd$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcarith$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jccoefct$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jccolor$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcdctmgr$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jchuff$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcinit$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcmainct$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcmarker$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcmaster$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcomapi$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcparam$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcprepct$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcsample$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jctrans$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdapimin$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdapistd$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdarith$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdatadst$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdatasrc$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdcoefct$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdcolor$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jddctmgr$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdhuff$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdinput$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdmainct$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdmarker$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdmaster$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdmerge$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdpostct$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdsample$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdtrans$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jerror$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jfdctflt$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jfdctfst$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jfdctint$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jidctflt$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jidctfst$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jidctint$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jmemmgr$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jpegtran$U.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jquant1$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jquant2$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jutils$U.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdbmp$U.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdcolmap$U.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdgif$U.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdjpgcom$U.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdppm$U.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdrle$U.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdswitch$U.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdtarga$U.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transupp$U.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wrbmp$U.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wrgif$U.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wrjpgcom$U.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wrppm$U.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wrrle$U.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wrtarga$U.Po@am__quote@
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/@MEMORYMGR@.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdjpeg.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cjpeg.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/djpeg.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jaricom.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcapimin.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcapistd.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcarith.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jccoefct.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jccolor.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcdctmgr.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jchuff.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcinit.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcmainct.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcmarker.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcmaster.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcomapi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcparam.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcprepct.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jcsample.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jctrans.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdapimin.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdapistd.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdarith.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdatadst.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdatasrc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdcoefct.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdcolor.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jddctmgr.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdhuff.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdinput.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdmainct.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdmarker.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdmaster.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdmerge.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdpostct.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdsample.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jdtrans.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jerror.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jfdctflt.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jfdctfst.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jfdctint.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jidctflt.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jidctfst.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jidctint.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jmemmgr.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jpegtran.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jquant1.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jquant2.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jutils.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdbmp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdcolmap.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdgif.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdjpgcom.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdppm.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdrle.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdswitch.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdtarga.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/transupp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wrbmp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wrgif.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wrjpgcom.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wrppm.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wrrle.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wrtarga.Po@am__quote@
.c.o:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
.c.obj:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
-@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
.c.lo:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
-@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
-@MEMORYMGR@_.c: @MEMORYMGR@.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/@MEMORYMGR@.c; then echo $(srcdir)/@MEMORYMGR@.c; else echo @MEMORYMGR@.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-cdjpeg_.c: cdjpeg.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/cdjpeg.c; then echo $(srcdir)/cdjpeg.c; else echo cdjpeg.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-cjpeg_.c: cjpeg.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/cjpeg.c; then echo $(srcdir)/cjpeg.c; else echo cjpeg.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-djpeg_.c: djpeg.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/djpeg.c; then echo $(srcdir)/djpeg.c; else echo djpeg.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jaricom_.c: jaricom.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jaricom.c; then echo $(srcdir)/jaricom.c; else echo jaricom.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jcapimin_.c: jcapimin.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcapimin.c; then echo $(srcdir)/jcapimin.c; else echo jcapimin.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jcapistd_.c: jcapistd.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcapistd.c; then echo $(srcdir)/jcapistd.c; else echo jcapistd.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jcarith_.c: jcarith.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcarith.c; then echo $(srcdir)/jcarith.c; else echo jcarith.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jccoefct_.c: jccoefct.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jccoefct.c; then echo $(srcdir)/jccoefct.c; else echo jccoefct.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jccolor_.c: jccolor.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jccolor.c; then echo $(srcdir)/jccolor.c; else echo jccolor.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jcdctmgr_.c: jcdctmgr.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcdctmgr.c; then echo $(srcdir)/jcdctmgr.c; else echo jcdctmgr.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jchuff_.c: jchuff.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jchuff.c; then echo $(srcdir)/jchuff.c; else echo jchuff.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jcinit_.c: jcinit.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcinit.c; then echo $(srcdir)/jcinit.c; else echo jcinit.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jcmainct_.c: jcmainct.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcmainct.c; then echo $(srcdir)/jcmainct.c; else echo jcmainct.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jcmarker_.c: jcmarker.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcmarker.c; then echo $(srcdir)/jcmarker.c; else echo jcmarker.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jcmaster_.c: jcmaster.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcmaster.c; then echo $(srcdir)/jcmaster.c; else echo jcmaster.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jcomapi_.c: jcomapi.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcomapi.c; then echo $(srcdir)/jcomapi.c; else echo jcomapi.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jcparam_.c: jcparam.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcparam.c; then echo $(srcdir)/jcparam.c; else echo jcparam.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jcprepct_.c: jcprepct.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcprepct.c; then echo $(srcdir)/jcprepct.c; else echo jcprepct.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jcsample_.c: jcsample.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jcsample.c; then echo $(srcdir)/jcsample.c; else echo jcsample.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jctrans_.c: jctrans.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jctrans.c; then echo $(srcdir)/jctrans.c; else echo jctrans.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jdapimin_.c: jdapimin.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdapimin.c; then echo $(srcdir)/jdapimin.c; else echo jdapimin.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jdapistd_.c: jdapistd.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdapistd.c; then echo $(srcdir)/jdapistd.c; else echo jdapistd.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jdarith_.c: jdarith.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdarith.c; then echo $(srcdir)/jdarith.c; else echo jdarith.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jdatadst_.c: jdatadst.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdatadst.c; then echo $(srcdir)/jdatadst.c; else echo jdatadst.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jdatasrc_.c: jdatasrc.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdatasrc.c; then echo $(srcdir)/jdatasrc.c; else echo jdatasrc.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jdcoefct_.c: jdcoefct.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdcoefct.c; then echo $(srcdir)/jdcoefct.c; else echo jdcoefct.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jdcolor_.c: jdcolor.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdcolor.c; then echo $(srcdir)/jdcolor.c; else echo jdcolor.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jddctmgr_.c: jddctmgr.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jddctmgr.c; then echo $(srcdir)/jddctmgr.c; else echo jddctmgr.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jdhuff_.c: jdhuff.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdhuff.c; then echo $(srcdir)/jdhuff.c; else echo jdhuff.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jdinput_.c: jdinput.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdinput.c; then echo $(srcdir)/jdinput.c; else echo jdinput.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jdmainct_.c: jdmainct.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdmainct.c; then echo $(srcdir)/jdmainct.c; else echo jdmainct.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jdmarker_.c: jdmarker.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdmarker.c; then echo $(srcdir)/jdmarker.c; else echo jdmarker.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jdmaster_.c: jdmaster.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdmaster.c; then echo $(srcdir)/jdmaster.c; else echo jdmaster.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jdmerge_.c: jdmerge.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdmerge.c; then echo $(srcdir)/jdmerge.c; else echo jdmerge.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jdpostct_.c: jdpostct.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdpostct.c; then echo $(srcdir)/jdpostct.c; else echo jdpostct.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jdsample_.c: jdsample.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdsample.c; then echo $(srcdir)/jdsample.c; else echo jdsample.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jdtrans_.c: jdtrans.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jdtrans.c; then echo $(srcdir)/jdtrans.c; else echo jdtrans.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jerror_.c: jerror.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jerror.c; then echo $(srcdir)/jerror.c; else echo jerror.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jfdctflt_.c: jfdctflt.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jfdctflt.c; then echo $(srcdir)/jfdctflt.c; else echo jfdctflt.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jfdctfst_.c: jfdctfst.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jfdctfst.c; then echo $(srcdir)/jfdctfst.c; else echo jfdctfst.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jfdctint_.c: jfdctint.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jfdctint.c; then echo $(srcdir)/jfdctint.c; else echo jfdctint.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jidctflt_.c: jidctflt.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jidctflt.c; then echo $(srcdir)/jidctflt.c; else echo jidctflt.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jidctfst_.c: jidctfst.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jidctfst.c; then echo $(srcdir)/jidctfst.c; else echo jidctfst.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jidctint_.c: jidctint.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jidctint.c; then echo $(srcdir)/jidctint.c; else echo jidctint.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jmemmgr_.c: jmemmgr.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jmemmgr.c; then echo $(srcdir)/jmemmgr.c; else echo jmemmgr.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jpegtran_.c: jpegtran.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jpegtran.c; then echo $(srcdir)/jpegtran.c; else echo jpegtran.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jquant1_.c: jquant1.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jquant1.c; then echo $(srcdir)/jquant1.c; else echo jquant1.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jquant2_.c: jquant2.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jquant2.c; then echo $(srcdir)/jquant2.c; else echo jquant2.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-jutils_.c: jutils.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/jutils.c; then echo $(srcdir)/jutils.c; else echo jutils.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-rdbmp_.c: rdbmp.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/rdbmp.c; then echo $(srcdir)/rdbmp.c; else echo rdbmp.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-rdcolmap_.c: rdcolmap.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/rdcolmap.c; then echo $(srcdir)/rdcolmap.c; else echo rdcolmap.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-rdgif_.c: rdgif.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/rdgif.c; then echo $(srcdir)/rdgif.c; else echo rdgif.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-rdjpgcom_.c: rdjpgcom.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/rdjpgcom.c; then echo $(srcdir)/rdjpgcom.c; else echo rdjpgcom.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-rdppm_.c: rdppm.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/rdppm.c; then echo $(srcdir)/rdppm.c; else echo rdppm.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-rdrle_.c: rdrle.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/rdrle.c; then echo $(srcdir)/rdrle.c; else echo rdrle.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-rdswitch_.c: rdswitch.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/rdswitch.c; then echo $(srcdir)/rdswitch.c; else echo rdswitch.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-rdtarga_.c: rdtarga.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/rdtarga.c; then echo $(srcdir)/rdtarga.c; else echo rdtarga.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-transupp_.c: transupp.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/transupp.c; then echo $(srcdir)/transupp.c; else echo transupp.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-wrbmp_.c: wrbmp.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/wrbmp.c; then echo $(srcdir)/wrbmp.c; else echo wrbmp.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-wrgif_.c: wrgif.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/wrgif.c; then echo $(srcdir)/wrgif.c; else echo wrgif.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-wrjpgcom_.c: wrjpgcom.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/wrjpgcom.c; then echo $(srcdir)/wrjpgcom.c; else echo wrjpgcom.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-wrppm_.c: wrppm.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/wrppm.c; then echo $(srcdir)/wrppm.c; else echo wrppm.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-wrrle_.c: wrrle.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/wrrle.c; then echo $(srcdir)/wrrle.c; else echo wrrle.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-wrtarga_.c: wrtarga.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/wrtarga.c; then echo $(srcdir)/wrtarga.c; else echo wrtarga.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-@MEMORYMGR@_.$(OBJEXT) @MEMORYMGR@_.lo cdjpeg_.$(OBJEXT) cdjpeg_.lo \
-cjpeg_.$(OBJEXT) cjpeg_.lo djpeg_.$(OBJEXT) djpeg_.lo \
-jaricom_.$(OBJEXT) jaricom_.lo jcapimin_.$(OBJEXT) jcapimin_.lo \
-jcapistd_.$(OBJEXT) jcapistd_.lo jcarith_.$(OBJEXT) jcarith_.lo \
-jccoefct_.$(OBJEXT) jccoefct_.lo jccolor_.$(OBJEXT) jccolor_.lo \
-jcdctmgr_.$(OBJEXT) jcdctmgr_.lo jchuff_.$(OBJEXT) jchuff_.lo \
-jcinit_.$(OBJEXT) jcinit_.lo jcmainct_.$(OBJEXT) jcmainct_.lo \
-jcmarker_.$(OBJEXT) jcmarker_.lo jcmaster_.$(OBJEXT) jcmaster_.lo \
-jcomapi_.$(OBJEXT) jcomapi_.lo jcparam_.$(OBJEXT) jcparam_.lo \
-jcprepct_.$(OBJEXT) jcprepct_.lo jcsample_.$(OBJEXT) jcsample_.lo \
-jctrans_.$(OBJEXT) jctrans_.lo jdapimin_.$(OBJEXT) jdapimin_.lo \
-jdapistd_.$(OBJEXT) jdapistd_.lo jdarith_.$(OBJEXT) jdarith_.lo \
-jdatadst_.$(OBJEXT) jdatadst_.lo jdatasrc_.$(OBJEXT) jdatasrc_.lo \
-jdcoefct_.$(OBJEXT) jdcoefct_.lo jdcolor_.$(OBJEXT) jdcolor_.lo \
-jddctmgr_.$(OBJEXT) jddctmgr_.lo jdhuff_.$(OBJEXT) jdhuff_.lo \
-jdinput_.$(OBJEXT) jdinput_.lo jdmainct_.$(OBJEXT) jdmainct_.lo \
-jdmarker_.$(OBJEXT) jdmarker_.lo jdmaster_.$(OBJEXT) jdmaster_.lo \
-jdmerge_.$(OBJEXT) jdmerge_.lo jdpostct_.$(OBJEXT) jdpostct_.lo \
-jdsample_.$(OBJEXT) jdsample_.lo jdtrans_.$(OBJEXT) jdtrans_.lo \
-jerror_.$(OBJEXT) jerror_.lo jfdctflt_.$(OBJEXT) jfdctflt_.lo \
-jfdctfst_.$(OBJEXT) jfdctfst_.lo jfdctint_.$(OBJEXT) jfdctint_.lo \
-jidctflt_.$(OBJEXT) jidctflt_.lo jidctfst_.$(OBJEXT) jidctfst_.lo \
-jidctint_.$(OBJEXT) jidctint_.lo jmemmgr_.$(OBJEXT) jmemmgr_.lo \
-jpegtran_.$(OBJEXT) jpegtran_.lo jquant1_.$(OBJEXT) jquant1_.lo \
-jquant2_.$(OBJEXT) jquant2_.lo jutils_.$(OBJEXT) jutils_.lo \
-rdbmp_.$(OBJEXT) rdbmp_.lo rdcolmap_.$(OBJEXT) rdcolmap_.lo \
-rdgif_.$(OBJEXT) rdgif_.lo rdjpgcom_.$(OBJEXT) rdjpgcom_.lo \
-rdppm_.$(OBJEXT) rdppm_.lo rdrle_.$(OBJEXT) rdrle_.lo \
-rdswitch_.$(OBJEXT) rdswitch_.lo rdtarga_.$(OBJEXT) rdtarga_.lo \
-transupp_.$(OBJEXT) transupp_.lo wrbmp_.$(OBJEXT) wrbmp_.lo \
-wrgif_.$(OBJEXT) wrgif_.lo wrjpgcom_.$(OBJEXT) wrjpgcom_.lo \
-wrppm_.$(OBJEXT) wrppm_.lo wrrle_.$(OBJEXT) wrrle_.lo \
-wrtarga_.$(OBJEXT) wrtarga_.lo : $(ANSI2KNR)
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
mostlyclean-libtool:
-rm -f *.lo
@@ -817,11 +744,18 @@ distclean-libtool:
-rm -f libtool config.lt
install-man1: $(man_MANS)
@$(NORMAL_INSTALL)
- test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)"
- @list=''; test -n "$(man1dir)" || exit 0; \
- { for i in $$list; do echo "$$i"; done; \
- l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
- sed -n '/\.1[a-z]*$$/p'; \
+ @list1=''; \
+ list2='$(man_MANS)'; \
+ test -n "$(man1dir)" \
+ && test -n "`echo $$list1$$list2`" \
+ || exit 0; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+ { for i in $$list1; do echo "$$i"; done; \
+ if test -n "$$list2"; then \
+ for i in $$list2; do echo "$$i"; done \
+ | sed -n '/\.1[a-z]*$$/p'; \
+ fi; \
} | while read p; do \
if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
echo "$$d$$p"; echo "$$p"; \
@@ -850,13 +784,14 @@ uninstall-man1:
sed -n '/\.1[a-z]*$$/p'; \
} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
- test -z "$$files" || { \
- echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \
- cd "$(DESTDIR)$(man1dir)" && rm -f $$files; }
+ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
install-includeHEADERS: $(include_HEADERS)
@$(NORMAL_INSTALL)
- test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)"
@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
+ fi; \
for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
echo "$$d$$p"; \
@@ -870,30 +805,17 @@ uninstall-includeHEADERS:
@$(NORMAL_UNINSTALL)
@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- test -n "$$files" || exit 0; \
- echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \
- cd "$(DESTDIR)$(includedir)" && rm -f $$files
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
- mkid -fID $$unique
-tags: TAGS
-
-TAGS: $(HEADERS) $(SOURCES) jconfig.cfg $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
+ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
set x; \
here=`pwd`; \
- list='$(SOURCES) $(HEADERS) jconfig.cfg $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
+ $(am__define_uniq_tagged_files); \
shift; \
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
@@ -905,15 +827,11 @@ TAGS: $(HEADERS) $(SOURCES) jconfig.cfg $(TAGS_DEPENDENCIES) \
$$unique; \
fi; \
fi
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) jconfig.cfg $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- list='$(SOURCES) $(HEADERS) jconfig.cfg $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
- END { if (nonempty) { for (i in files) print i; }; }'`; \
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
test -z "$(CTAGS_ARGS)$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$unique
@@ -922,14 +840,36 @@ GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
+cscope: cscope.files
+ test ! -s cscope.files \
+ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
+clean-cscope:
+ -rm -f cscope.files
+cscope.files: clean-cscope cscopelist
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+ -rm -f cscope.out cscope.in.out cscope.po.out cscope.files
check-am: all-am
$(MAKE) $(AM_MAKEFLAGS) check-local
check: check-am
-all-am: Makefile $(ANSI2KNR) $(LTLIBRARIES) $(PROGRAMS) $(MANS) \
- $(HEADERS) jconfig.h
+all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(MANS) $(HEADERS) \
+ jconfig.h
install-binPROGRAMS: install-libLTLIBRARIES
installdirs:
@@ -946,10 +886,15 @@ install-am: all-am
installcheck: installcheck-am
install-strip:
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- `test -z '$(STRIP)' || \
- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
mostlyclean-generic:
clean-generic:
@@ -964,8 +909,8 @@ maintainer-clean-generic:
@echo "it deletes files that may require special tools to rebuild."
clean: clean-am
-clean-am: clean-binPROGRAMS clean-generic clean-krextra \
- clean-libLTLIBRARIES clean-libtool mostlyclean-am
+clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \
+ clean-libtool mostlyclean-am
distclean: distclean-am
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
@@ -1023,7 +968,7 @@ maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-am
-mostlyclean-am: mostlyclean-compile mostlyclean-generic mostlyclean-kr \
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
mostlyclean-libtool
pdf: pdf-am
@@ -1041,25 +986,27 @@ uninstall-man: uninstall-man1
.MAKE: all check-am install-am install-strip
-.PHONY: CTAGS GTAGS all all-am am--refresh check check-am check-local \
- clean clean-binPROGRAMS clean-generic clean-krextra \
- clean-libLTLIBRARIES clean-libtool ctags distclean \
- distclean-compile distclean-generic distclean-hdr \
- distclean-libtool distclean-tags dvi dvi-am html html-am info \
- info-am install install-am install-binPROGRAMS install-data \
- install-data-am install-data-local install-dvi install-dvi-am \
- install-exec install-exec-am install-html install-html-am \
- install-includeHEADERS install-info install-info-am \
- install-libLTLIBRARIES install-man install-man1 install-pdf \
- install-pdf-am install-ps install-ps-am install-strip \
- installcheck installcheck-am installdirs maintainer-clean \
- maintainer-clean-generic mostlyclean mostlyclean-compile \
- mostlyclean-generic mostlyclean-kr mostlyclean-libtool pdf \
- pdf-am ps ps-am tags uninstall uninstall-am \
- uninstall-binPROGRAMS uninstall-includeHEADERS \
+.PHONY: CTAGS GTAGS TAGS all all-am am--refresh check check-am \
+ check-local clean clean-binPROGRAMS clean-cscope clean-generic \
+ clean-libLTLIBRARIES clean-libtool cscope cscopelist-am ctags \
+ ctags-am distclean distclean-compile distclean-generic \
+ distclean-hdr distclean-libtool distclean-tags dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-data-local install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-includeHEADERS install-info \
+ install-info-am install-libLTLIBRARIES install-man \
+ install-man1 install-pdf install-pdf-am install-ps \
+ install-ps-am install-strip installcheck installcheck-am \
+ installdirs maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
+ uninstall-am uninstall-binPROGRAMS uninstall-includeHEADERS \
uninstall-libLTLIBRARIES uninstall-local uninstall-man \
uninstall-man1
+.PRECIOUS: Makefile
+
# Install jconfig.h
install-data-local:
diff --git a/3rdparty/libjpeg/README b/3rdparty/libjpeg/README
index 451265d764a..4c8e82e9ba7 100644
--- a/3rdparty/libjpeg/README
+++ b/3rdparty/libjpeg/README
@@ -1,10 +1,10 @@
The Independent JPEG Group's JPEG software
==========================================
-README for release 8c of 16-Jan-2011
+README for release 9b of 17-Jan-2016
====================================
-This distribution contains the eighth public release of the Independent JPEG
+This distribution contains the ninth public release of the Independent JPEG
Group's free JPEG software. You are welcome to redistribute this software and
to use it for any purpose, subject to the conditions under LEGAL ISSUES, below.
@@ -13,7 +13,8 @@ Bill Allombert, Jim Boucher, Lee Crocker, Bob Friesenhahn, Ben Jackson,
Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi, Ge' Weijers,
and other members of the Independent JPEG Group.
-IJG is not affiliated with the official ISO JPEG standards committee.
+IJG is not affiliated with the ISO/IEC JTC1/SC29/WG1 standards committee
+(previously known as JPEG, together with ITU-T SG16).
DOCUMENTATION ROADMAP
@@ -59,7 +60,7 @@ OVERVIEW
This package contains C software to implement JPEG image encoding, decoding,
and transcoding. JPEG (pronounced "jay-peg") is a standardized compression
-method for full-color and gray-scale images.
+method for full-color and grayscale images.
This software implements JPEG baseline, extended-sequential, and progressive
compression processes. Provision is made for supporting all variants of these
@@ -114,7 +115,7 @@ with respect to this software, its quality, accuracy, merchantability, or
fitness for a particular purpose. This software is provided "AS IS", and you,
its user, assume the entire risk as to its quality and accuracy.
-This software is copyright (C) 1991-2011, Thomas G. Lane, Guido Vollbeding.
+This software is copyright (C) 1991-2016, Thomas G. Lane, Guido Vollbeding.
All Rights Reserved except as specified below.
Permission is hereby granted to use, copy, modify, and distribute this
@@ -145,15 +146,6 @@ commercial products, provided that all warranty or liability claims are
assumed by the product vendor.
-ansi2knr.c is included in this distribution by permission of L. Peter Deutsch,
-sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA.
-ansi2knr.c is NOT covered by the above copyright and conditions, but instead
-by the usual distribution terms of the Free Software Foundation; principally,
-that you must include source code if you redistribute it. (See the file
-ansi2knr.c for full details.) However, since ansi2knr.c is not needed as part
-of any program generated from the IJG code, this does not limit you more than
-the foregoing paragraphs do.
-
The Unix configuration script "configure" was produced with GNU Autoconf.
It is copyright by the Free Software Foundation but is freely distributable.
The same holds for its supporting scripts (config.guess, config.sub,
@@ -161,16 +153,11 @@ ltmain.sh). Another support script, install-sh, is copyright by X Consortium
but is also freely distributable.
The IJG distribution formerly included code to read and write GIF files.
-To avoid entanglement with the Unisys LZW patent, GIF reading support has
-been removed altogether, and the GIF writer has been simplified to produce
-"uncompressed GIFs". This technique does not use the LZW algorithm; the
-resulting GIF files are larger than usual, but are readable by all standard
-GIF decoders.
-
-We are required to state that
- "The Graphics Interchange Format(c) is the Copyright property of
- CompuServe Incorporated. GIF(sm) is a Service Mark property of
- CompuServe Incorporated."
+To avoid entanglement with the Unisys LZW patent (now expired), GIF reading
+support has been removed altogether, and the GIF writer has been simplified
+to produce "uncompressed GIFs". This technique does not use the LZW
+algorithm; the resulting GIF files are larger than usual, but are readable
+by all standard GIF decoders.
REFERENCES
@@ -184,8 +171,8 @@ The best short technical introduction to the JPEG compression algorithm is
Communications of the ACM, April 1991 (vol. 34 no. 4), pp. 30-44.
(Adjacent articles in that issue discuss MPEG motion picture compression,
applications of JPEG, and related topics.) If you don't have the CACM issue
-handy, a PostScript file containing a revised version of Wallace's article is
-available at http://www.ijg.org/files/wallace.ps.gz. The file (actually
+handy, a PDF file containing a revised version of Wallace's article is
+available at http://www.ijg.org/files/Wallace.JPEG.pdf. The file (actually
a preprint for an article that appeared in IEEE Trans. Consumer Electronics)
omits the sample images that appeared in CACM, but it includes corrections
and some added material. Note: the Wallace article is copyright ACM and IEEE,
@@ -221,20 +208,25 @@ Part 1: Requirements and guidelines" and has document numbers ISO/IEC IS
10918-1, ITU-T T.81. Part 2 is titled "Digital Compression and Coding of
Continuous-tone Still Images, Part 2: Compliance testing" and has document
numbers ISO/IEC IS 10918-2, ITU-T T.83.
-IJG JPEG 8 introduces an implementation of the JPEG SmartScale extension
-which is specified in a contributed document at ITU and ISO with title "ITU-T
-JPEG-Plus Proposal for Extending ITU-T T.81 for Advanced Image Coding", April
-2006, Geneva, Switzerland. The latest version of the document is Revision 3.
+IJG JPEG 8 introduced an implementation of the JPEG SmartScale extension
+which is specified in two documents: A contributed document at ITU and ISO
+with title "ITU-T JPEG-Plus Proposal for Extending ITU-T T.81 for Advanced
+Image Coding", April 2006, Geneva, Switzerland. The latest version of this
+document is Revision 3. And a contributed document ISO/IEC JTC1/SC29/WG1 N
+5799 with title "Evolution of JPEG", June/July 2011, Berlin, Germany.
+IJG JPEG 9 introduces a reversible color transform for improved lossless
+compression which is described in a contributed document ISO/IEC JTC1/SC29/
+WG1 N 6080 with title "JPEG 9 Lossless Coding", June/July 2012, Paris,
+France.
The JPEG standard does not specify all details of an interchangeable file
-format. For the omitted details we follow the "JFIF" conventions, revision
-1.02. JFIF 1.02 has been adopted as an Ecma International Technical Report
-and thus received a formal publication status. It is available as a free
-download in PDF format from
-http://www.ecma-international.org/publications/techreports/E-TR-098.htm.
-A PostScript version of the JFIF document is available at
-http://www.ijg.org/files/jfif.ps.gz. There is also a plain text version at
-http://www.ijg.org/files/jfif.txt.gz, but it is missing the figures.
+format. For the omitted details we follow the "JFIF" conventions, version 2.
+JFIF version 1 has been adopted as Recommendation ITU-T T.871 (05/2011) :
+Information technology - Digital compression and coding of continuous-tone
+still images: JPEG File Interchange Format (JFIF). It is available as a
+free download in PDF file format from http://www.itu.int/rec/T-REC-T.871.
+A PDF file of the older JFIF document is available at
+http://www.w3.org/Graphics/JPEG/jfif3.pdf.
The TIFF 6.0 file format specification can be obtained by FTP from
ftp://ftp.sgi.com/graphics/tiff/TIFF6.ps.gz. The JPEG incorporation scheme
@@ -254,8 +246,8 @@ ARCHIVE LOCATIONS
The "official" archive site for this software is www.ijg.org.
The most recent released version can always be found there in
directory "files". This particular version will be archived as
-http://www.ijg.org/files/jpegsrc.v8c.tar.gz, and in Windows-compatible
-"zip" archive format as http://www.ijg.org/files/jpegsr8c.zip.
+http://www.ijg.org/files/jpegsrc.v9b.tar.gz, and in Windows-compatible
+"zip" archive format as http://www.ijg.org/files/jpegsr9b.zip.
The JPEG FAQ (Frequently Asked Questions) article is a source of some
general information about JPEG.
@@ -281,6 +273,10 @@ ITU JPEG (Study Group 16) meeting in Geneva, Switzerland.
Thank to Thomas Wiegand and Gary Sullivan for inviting me to the
Joint Video Team (MPEG & ITU) meeting in Geneva, Switzerland.
+Thank to Thomas Richter and Daniel Lee for inviting me to the
+ISO/IEC JTC1/SC29/WG1 (previously known as JPEG, together with ITU-T SG16)
+meeting in Berlin, Germany.
+
Thank to John Korejwa and Massimo Ballerini for inviting me to
fruitful consultations in Boston, MA and Milan, Italy.
@@ -304,23 +300,76 @@ design and development of this singular software package.
FILE FORMAT WARS
================
-The ISO JPEG standards committee actually promotes different formats like
-"JPEG 2000" or "JPEG XR" which are incompatible with original DCT-based
-JPEG and which are based on faulty technologies. IJG therefore does not
-and will not support such momentary mistakes (see REFERENCES).
-We have little or no sympathy for the promotion of these formats. Indeed,
-one of the original reasons for developing this free software was to help
-force convergence on common, interoperable format standards for JPEG files.
+The ISO/IEC JTC1/SC29/WG1 standards committee (previously known as JPEG,
+together with ITU-T SG16) currently promotes different formats containing
+the name "JPEG" which is misleading because these formats are incompatible
+with original DCT-based JPEG and are based on faulty technologies.
+IJG therefore does not and will not support such momentary mistakes
+(see REFERENCES).
+There exist also distributions under the name "OpenJPEG" promoting such
+kind of formats which is misleading because they don't support original
+JPEG images.
+We have no sympathy for the promotion of inferior formats. Indeed, one of
+the original reasons for developing this free software was to help force
+convergence on common, interoperable format standards for JPEG files.
Don't use an incompatible file format!
(In any case, our decoder will remain capable of reading existing JPEG
image files indefinitely.)
+The ISO committee pretends to be "responsible for the popular JPEG" in their
+public reports which is not true because they don't respond to actual
+requirements for the maintenance of the original JPEG specification.
+Furthermore, the ISO committee pretends to "ensure interoperability" with
+their standards which is not true because their "standards" support only
+application-specific and proprietary use cases and contain mathematically
+incorrect code.
+
+There are currently different distributions in circulation containing the
+name "libjpeg" which is misleading because they don't have the features and
+are incompatible with formats supported by actual IJG libjpeg distributions.
+One of those fakes is released by members of the ISO committee and just uses
+the name of libjpeg for misdirection of people, similar to the abuse of the
+name JPEG as described above, while having nothing in common with actual IJG
+libjpeg distributions and containing mathematically incorrect code.
+The other one claims to be a "derivative" or "fork" of the original libjpeg,
+but violates the license conditions as described under LEGAL ISSUES above
+and violates basic C programming properties.
+We have no sympathy for the release of misleading, incorrect and illegal
+distributions derived from obsolete code bases.
+Don't use an obsolete code base!
+
+According to the UCC (Uniform Commercial Code) law, IJG has the lawful and
+legal right to foreclose on certain standardization bodies and other
+institutions or corporations that knowingly perform substantial and
+systematic deceptive acts and practices, fraud, theft, and damaging of the
+value of the people of this planet without their knowing, willing and
+intentional consent.
+The titles, ownership, and rights of these institutions and all their assets
+are now duly secured and held in trust for the free people of this planet.
+People of the planet, on every country, may have a financial interest in
+the assets of these former principals, agents, and beneficiaries of the
+foreclosed institutions and corporations.
+IJG asserts what is: that each man, woman, and child has unalienable value
+and rights granted and deposited in them by the Creator and not any one of
+the people is subordinate to any artificial principality, corporate fiction
+or the special interest of another without their appropriate knowing,
+willing and intentional consent made by contract or accommodation agreement.
+IJG expresses that which already was.
+The people have already determined and demanded that public administration
+entities, national governments, and their supporting judicial systems must
+be fully transparent, accountable, and liable.
+IJG has secured the value for all concerned free people of the planet.
+
+A partial list of foreclosed institutions and corporations ("Hall of Shame")
+is currently prepared and will be published later.
+
TO DO
=====
-Version 8 is the first release of a new generation JPEG standard
-to overcome the limitations of the original JPEG specification.
+Version 9 is the second release of a new generation JPEG standard
+to overcome the limitations of the original JPEG specification,
+and is the first true source reference JPEG codec.
More features are being prepared for coming releases...
-Please send bug reports, offers of help, etc. to jpeg-info@uc.ag.
+Please send bug reports, offers of help, etc. to jpeg-info@jpegclub.org.
diff --git a/3rdparty/libjpeg/aclocal.m4 b/3rdparty/libjpeg/aclocal.m4
index de31b7f428d..2329dd171cf 100644
--- a/3rdparty/libjpeg/aclocal.m4
+++ b/3rdparty/libjpeg/aclocal.m4
@@ -1,7 +1,7 @@
-# generated automatically by aclocal 1.11.1 -*- Autoconf -*-
+# generated automatically by aclocal 1.15 -*- Autoconf -*-
+
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
@@ -11,19 +11,18 @@
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
+m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
-[m4_warning([this file was generated for autoconf 2.68.
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
+[m4_warning([this file was generated for autoconf 2.69.
You have another version of autoconf. It may work, but is not guaranteed to.
If you have problems, you may need to regenerate the build system entirely.
-To do so, use the procedure documented by the package, typically `autoreconf'.])])
+To do so, use the procedure documented by the package, typically 'autoreconf'.])])
# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
#
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-# 2006, 2007, 2008, 2009, 2010 Free Software Foundation,
-# Inc.
+# Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc.
# Written by Gordon Matzigkeit, 1996
#
# This file is free software; the Free Software Foundation gives
@@ -31,36 +30,30 @@ To do so, use the procedure documented by the package, typically `autoreconf'.])
# modifications, as long as this notice is preserved.
m4_define([_LT_COPYING], [dnl
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-# 2006, 2007, 2008, 2009, 2010 Free Software Foundation,
-# Inc.
-# Written by Gordon Matzigkeit, 1996
-#
-# This file is part of GNU Libtool.
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions. There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the same
+# distribution terms that you use for the rest of that program.
#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING. If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
])
-# serial 57 LT_INIT
+# serial 58 LT_INIT
# LT_PREREQ(VERSION)
@@ -88,7 +81,7 @@ esac
# LT_INIT([OPTIONS])
# ------------------
AC_DEFUN([LT_INIT],
-[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
+[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK
AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
AC_BEFORE([$0], [LT_LANG])dnl
AC_BEFORE([$0], [LT_OUTPUT])dnl
@@ -112,7 +105,7 @@ dnl Parse OPTIONS
_LT_SET_OPTIONS([$0], [$1])
# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
+LIBTOOL_DEPS=$ltmain
# Always use our own libtool.
LIBTOOL='$(SHELL) $(top_builddir)/libtool'
@@ -132,26 +125,43 @@ dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
+# _LT_PREPARE_CC_BASENAME
+# -----------------------
+m4_defun([_LT_PREPARE_CC_BASENAME], [
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+ for cc_temp in @S|@*""; do
+ case $cc_temp in
+ compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+ distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+ done
+ func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+])# _LT_PREPARE_CC_BASENAME
+
+
# _LT_CC_BASENAME(CC)
# -------------------
-# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME,
+# but that macro is also expanded into generated libtool script, which
+# arranges for $SED and $ECHO to be set by different means.
m4_defun([_LT_CC_BASENAME],
-[for cc_temp in $1""; do
- case $cc_temp in
- compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
- distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
- \-*) ;;
- *) break;;
- esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+[m4_require([_LT_PREPARE_CC_BASENAME])dnl
+AC_REQUIRE([_LT_DECL_SED])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+func_cc_basename $1
+cc_basename=$func_cc_basename_result
])
# _LT_FILEUTILS_DEFAULTS
# ----------------------
# It is okay to use these file commands and assume they have been set
-# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
+# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'.
m4_defun([_LT_FILEUTILS_DEFAULTS],
[: ${CP="cp -f"}
: ${MV="mv -f"}
@@ -167,6 +177,8 @@ AC_REQUIRE([AC_CANONICAL_BUILD])dnl
AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl
+dnl
_LT_DECL([], [host_alias], [0], [The host system])dnl
_LT_DECL([], [host], [0])dnl
_LT_DECL([], [host_os], [0])dnl
@@ -196,15 +208,16 @@ m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
m4_require([_LT_CMD_OLD_ARCHIVE])dnl
m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
m4_require([_LT_WITH_SYSROOT])dnl
+m4_require([_LT_CMD_TRUNCATE])dnl
_LT_CONFIG_LIBTOOL_INIT([
-# See if we are running on zsh, and set the options which allow our
+# See if we are running on zsh, and set the options that allow our
# commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
+if test -n "\${ZSH_VERSION+set}"; then
setopt NO_GLOB_SUBST
fi
])
-if test -n "${ZSH_VERSION+set}" ; then
+if test -n "${ZSH_VERSION+set}"; then
setopt NO_GLOB_SUBST
fi
@@ -217,7 +230,7 @@ aix3*)
# AIX sometimes has problems with the GCC collect2 program. For some
# reason, if we set the COLLECT_NAMES environment variable, the problems
# vanish in a puff of smoke.
- if test "X${COLLECT_NAMES+set}" != Xset; then
+ if test set != "${COLLECT_NAMES+set}"; then
COLLECT_NAMES=
export COLLECT_NAMES
fi
@@ -228,14 +241,14 @@ esac
ofile=libtool
can_build_shared=yes
-# All known linkers require a `.a' archive for static linking (except MSVC,
+# All known linkers require a '.a' archive for static linking (except MSVC,
# which needs '.lib').
libext=a
-with_gnu_ld="$lt_cv_prog_gnu_ld"
+with_gnu_ld=$lt_cv_prog_gnu_ld
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
+old_CC=$CC
+old_CFLAGS=$CFLAGS
# Set sane defaults for various variables
test -z "$CC" && CC=cc
@@ -288,21 +301,21 @@ no_glob_subst='s/\*/\\\*/g'
# _LT_PROG_LTMAIN
# ---------------
-# Note that this code is called both from `configure', and `config.status'
+# Note that this code is called both from 'configure', and 'config.status'
# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably,
-# `config.status' has no value for ac_aux_dir unless we are using Automake,
+# 'config.status' has no value for ac_aux_dir unless we are using Automake,
# so we pass a copy along to make sure it has a sensible value anyway.
m4_defun([_LT_PROG_LTMAIN],
[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
-ltmain="$ac_aux_dir/ltmain.sh"
+ltmain=$ac_aux_dir/ltmain.sh
])# _LT_PROG_LTMAIN
# So that we can recreate a full libtool script including additional
# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
-# in macros and then make a single call at the end using the `libtool'
+# in macros and then make a single call at the end using the 'libtool'
# label.
@@ -434,8 +447,8 @@ m4_define([_lt_decl_all_varnames],
# _LT_CONFIG_STATUS_DECLARE([VARNAME])
# ------------------------------------
-# Quote a variable value, and forward it to `config.status' so that its
-# declaration there will have the same value as in `configure'. VARNAME
+# Quote a variable value, and forward it to 'config.status' so that its
+# declaration there will have the same value as in 'configure'. VARNAME
# must have a single quote delimited value for this to work.
m4_define([_LT_CONFIG_STATUS_DECLARE],
[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
@@ -459,7 +472,7 @@ m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
# Output comment and list of tags supported by the script
m4_defun([_LT_LIBTOOL_TAGS],
[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
-available_tags="_LT_TAGS"dnl
+available_tags='_LT_TAGS'dnl
])
@@ -487,7 +500,7 @@ m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
# _LT_LIBTOOL_CONFIG_VARS
# -----------------------
# Produce commented declarations of non-tagged libtool config variables
-# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
+# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool'
# script. Tagged libtool config variables (even for the LIBTOOL CONFIG
# section) are produced by _LT_LIBTOOL_TAG_VARS.
m4_defun([_LT_LIBTOOL_CONFIG_VARS],
@@ -513,8 +526,8 @@ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of
# variables for single and double quote escaping we saved from calls
# to _LT_DECL, we can put quote escaped variables declarations
-# into `config.status', and then the shell code to quote escape them in
-# for loops in `config.status'. Finally, any additional code accumulated
+# into 'config.status', and then the shell code to quote escape them in
+# for loops in 'config.status'. Finally, any additional code accumulated
# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
m4_defun([_LT_CONFIG_COMMANDS],
[AC_PROVIDE_IFELSE([LT_OUTPUT],
@@ -560,7 +573,7 @@ for var in lt_decl_all_varnames([[ \
]], lt_decl_quote_varnames); do
case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
*[[\\\\\\\`\\"\\\$]]*)
- eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
;;
*)
eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -573,7 +586,7 @@ for var in lt_decl_all_varnames([[ \
]], lt_decl_dquote_varnames); do
case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
*[[\\\\\\\`\\"\\\$]]*)
- eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
;;
*)
eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -589,7 +602,7 @@ _LT_OUTPUT_LIBTOOL_INIT
# Generate a child script FILE with all initialization necessary to
# reuse the environment learned by the parent script, and make the
# file executable. If COMMENT is supplied, it is inserted after the
-# `#!' sequence but before initialization text begins. After this
+# '#!' sequence but before initialization text begins. After this
# macro, additional text can be appended to FILE to form the body of
# the child script. The macro ends with non-zero status if the
# file could not be fully written (such as if the disk is full).
@@ -611,7 +624,7 @@ AS_SHELL_SANITIZE
_AS_PREPARE
exec AS_MESSAGE_FD>&1
_ASEOF
-test $lt_write_fail = 0 && chmod +x $1[]dnl
+test 0 = "$lt_write_fail" && chmod +x $1[]dnl
m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
# LT_OUTPUT
@@ -634,7 +647,7 @@ exec AS_MESSAGE_LOG_FD>>config.log
} >&AS_MESSAGE_LOG_FD
lt_cl_help="\
-\`$as_me' creates a local libtool stub from the current configuration,
+'$as_me' creates a local libtool stub from the current configuration,
for use in further configure time tests before the real libtool is
generated.
@@ -652,11 +665,11 @@ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
configured by $[0], generated by m4_PACKAGE_STRING.
-Copyright (C) 2010 Free Software Foundation, Inc.
+Copyright (C) 2011 Free Software Foundation, Inc.
This config.lt script is free software; the Free Software Foundation
gives unlimited permision to copy, distribute and modify it."
-while test $[#] != 0
+while test 0 != $[#]
do
case $[1] in
--version | --v* | -V )
@@ -669,10 +682,10 @@ do
lt_cl_silent=: ;;
-*) AC_MSG_ERROR([unrecognized option: $[1]
-Try \`$[0] --help' for more information.]) ;;
+Try '$[0] --help' for more information.]) ;;
*) AC_MSG_ERROR([unrecognized argument: $[1]
-Try \`$[0] --help' for more information.]) ;;
+Try '$[0] --help' for more information.]) ;;
esac
shift
done
@@ -698,7 +711,7 @@ chmod +x "$CONFIG_LT"
# open by configure. Here we exec the FD to /dev/null, effectively closing
# config.log, so it can be properly (re)opened and appended to by config.lt.
lt_cl_success=:
-test "$silent" = yes &&
+test yes = "$silent" &&
lt_config_lt_args="$lt_config_lt_args --quiet"
exec AS_MESSAGE_LOG_FD>/dev/null
$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
@@ -718,27 +731,31 @@ m4_defun([_LT_CONFIG],
_LT_CONFIG_SAVE_COMMANDS([
m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
m4_if(_LT_TAG, [C], [
- # See if we are running on zsh, and set the options which allow our
+ # See if we are running on zsh, and set the options that allow our
# commands through without removal of \ escapes.
- if test -n "${ZSH_VERSION+set}" ; then
+ if test -n "${ZSH_VERSION+set}"; then
setopt NO_GLOB_SUBST
fi
- cfgfile="${ofile}T"
+ cfgfile=${ofile}T
trap "$RM \"$cfgfile\"; exit 1" 1 2 15
$RM "$cfgfile"
cat <<_LT_EOF >> "$cfgfile"
#! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Generated automatically by $as_me ($PACKAGE) $VERSION
# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
# NOTE: Changes made to this file will be lost: look at ltmain.sh.
-#
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
_LT_COPYING
_LT_LIBTOOL_TAGS
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
# ### BEGIN LIBTOOL CONFIG
_LT_LIBTOOL_CONFIG_VARS
_LT_LIBTOOL_TAG_VARS
@@ -746,13 +763,24 @@ _LT_LIBTOOL_TAG_VARS
_LT_EOF
+ cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_PREPARE_MUNGE_PATH_LIST
+_LT_PREPARE_CC_BASENAME
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
case $host_os in
aix3*)
cat <<\_LT_EOF >> "$cfgfile"
# AIX sometimes has problems with the GCC collect2 program. For some
# reason, if we set the COLLECT_NAMES environment variable, the problems
# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
+if test set != "${COLLECT_NAMES+set}"; then
COLLECT_NAMES=
export COLLECT_NAMES
fi
@@ -769,8 +797,6 @@ _LT_EOF
sed '$q' "$ltmain" >> "$cfgfile" \
|| (rm -f "$cfgfile"; exit 1)
- _LT_PROG_REPLACE_SHELLFNS
-
mv -f "$cfgfile" "$ofile" ||
(rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
chmod +x "$ofile"
@@ -788,7 +814,6 @@ _LT_EOF
[m4_if([$1], [], [
PACKAGE='$PACKAGE'
VERSION='$VERSION'
- TIMESTAMP='$TIMESTAMP'
RM='$RM'
ofile='$ofile'], [])
])dnl /_LT_CONFIG_SAVE_COMMANDS
@@ -816,6 +841,7 @@ AC_DEFUN([LT_LANG],
m4_case([$1],
[C], [_LT_LANG(C)],
[C++], [_LT_LANG(CXX)],
+ [Go], [_LT_LANG(GO)],
[Java], [_LT_LANG(GCJ)],
[Fortran 77], [_LT_LANG(F77)],
[Fortran], [_LT_LANG(FC)],
@@ -837,6 +863,29 @@ m4_defun([_LT_LANG],
])# _LT_LANG
+m4_ifndef([AC_PROG_GO], [
+# NOTE: This macro has been submitted for inclusion into #
+# GNU Autoconf as AC_PROG_GO. When it is available in #
+# a released version of Autoconf we should remove this #
+# macro and use it instead. #
+m4_defun([AC_PROG_GO],
+[AC_LANG_PUSH(Go)dnl
+AC_ARG_VAR([GOC], [Go compiler command])dnl
+AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl
+_AC_ARG_VAR_LDFLAGS()dnl
+AC_CHECK_TOOL(GOC, gccgo)
+if test -z "$GOC"; then
+ if test -n "$ac_tool_prefix"; then
+ AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])
+ fi
+fi
+if test -z "$GOC"; then
+ AC_CHECK_PROG(GOC, gccgo, gccgo, false)
+fi
+])#m4_defun
+])#m4_ifndef
+
+
# _LT_LANG_DEFAULT_CONFIG
# -----------------------
m4_defun([_LT_LANG_DEFAULT_CONFIG],
@@ -867,6 +916,10 @@ AC_PROVIDE_IFELSE([AC_PROG_GCJ],
m4_ifdef([LT_PROG_GCJ],
[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
+AC_PROVIDE_IFELSE([AC_PROG_GO],
+ [LT_LANG(GO)],
+ [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])
+
AC_PROVIDE_IFELSE([LT_PROG_RC],
[LT_LANG(RC)],
[m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
@@ -957,7 +1010,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
[lt_cv_apple_cc_single_mod=no
- if test -z "${LT_MULTI_MODULE}"; then
+ if test -z "$LT_MULTI_MODULE"; then
# By default we will add the -single_module flag. You can override
# by either setting the environment variable LT_MULTI_MODULE
# non-empty at configure time, or by adding -multi_module to the
@@ -969,7 +1022,13 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-dynamiclib -Wl,-single_module conftest.c 2>conftest.err
_lt_result=$?
- if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
+ # If there is a non-empty error log, and "single_module"
+ # appears in it, assume the flag caused a linker warning
+ if test -s conftest.err && $GREP single_module conftest.err; then
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ # Otherwise, if the output was created with a 0 exit code from
+ # the compiler, it worked.
+ elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
lt_cv_apple_cc_single_mod=yes
else
cat conftest.err >&AS_MESSAGE_LOG_FD
@@ -977,6 +1036,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
rm -rf libconftest.dylib*
rm -f conftest.*
fi])
+
AC_CACHE_CHECK([for -exported_symbols_list linker flag],
[lt_cv_ld_exported_symbols_list],
[lt_cv_ld_exported_symbols_list=no
@@ -986,8 +1046,9 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
[lt_cv_ld_exported_symbols_list=yes],
[lt_cv_ld_exported_symbols_list=no])
- LDFLAGS="$save_LDFLAGS"
+ LDFLAGS=$save_LDFLAGS
])
+
AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
[lt_cv_ld_force_load=no
cat > conftest.c << _LT_EOF
@@ -1005,7 +1066,9 @@ _LT_EOF
echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
_lt_result=$?
- if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then
+ if test -s conftest.err && $GREP force_load conftest.err; then
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
lt_cv_ld_force_load=yes
else
cat conftest.err >&AS_MESSAGE_LOG_FD
@@ -1015,32 +1078,32 @@ _LT_EOF
])
case $host_os in
rhapsody* | darwin1.[[012]])
- _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+ _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
darwin1.*)
- _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
darwin*) # darwin 5.x on
# if running on 10.5 or later, the deployment target defaults
# to the OS version, if on x86, and 10.4, the deployment
# target defaults to 10.4. Don't you love it?
case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
- _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
- 10.[[012]]*)
- _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+ 10.[[012]][[,.]]*)
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
10.*)
- _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
esac
;;
esac
- if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+ if test yes = "$lt_cv_apple_cc_single_mod"; then
_lt_dar_single_mod='$single_module'
fi
- if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
- _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+ if test yes = "$lt_cv_ld_exported_symbols_list"; then
+ _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
else
- _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
fi
- if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+ if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
_lt_dsymutil='~$DSYMUTIL $lib || :'
else
_lt_dsymutil=
@@ -1050,8 +1113,8 @@ _LT_EOF
])
-# _LT_DARWIN_LINKER_FEATURES
-# --------------------------
+# _LT_DARWIN_LINKER_FEATURES([TAG])
+# ---------------------------------
# Checks for linker and compiler features on darwin
m4_defun([_LT_DARWIN_LINKER_FEATURES],
[
@@ -1060,27 +1123,29 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES],
_LT_TAGVAR(hardcode_direct, $1)=no
_LT_TAGVAR(hardcode_automatic, $1)=yes
_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
- if test "$lt_cv_ld_force_load" = "yes"; then
- _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+ if test yes = "$lt_cv_ld_force_load"; then
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+ m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
+ [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes])
else
_LT_TAGVAR(whole_archive_flag_spec, $1)=''
fi
_LT_TAGVAR(link_all_deplibs, $1)=yes
- _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
+ _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined
case $cc_basename in
- ifort*) _lt_dar_can_shared=yes ;;
+ ifort*|nagfor*) _lt_dar_can_shared=yes ;;
*) _lt_dar_can_shared=$GCC ;;
esac
- if test "$_lt_dar_can_shared" = "yes"; then
+ if test yes = "$_lt_dar_can_shared"; then
output_verbose_link_cmd=func_echo_all
- _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
- _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
- _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
- _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+ _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+ _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+ _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+ _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
m4_if([$1], [CXX],
-[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then
- _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
- _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+[ if test yes != "$lt_cv_apple_cc_single_mod"; then
+ _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
+ _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
fi
],[])
else
@@ -1100,7 +1165,7 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES],
# Allow to override them for all tags through lt_cv_aix_libpath.
m4_defun([_LT_SYS_MODULE_PATH_AIX],
[m4_require([_LT_DECL_SED])dnl
-if test "${lt_cv_aix_libpath+set}" = set; then
+if test set = "${lt_cv_aix_libpath+set}"; then
aix_libpath=$lt_cv_aix_libpath
else
AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
@@ -1118,7 +1183,7 @@ else
_LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
fi],[])
if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
- _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib"
+ _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib
fi
])
aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
@@ -1138,8 +1203,8 @@ m4_define([_LT_SHELL_INIT],
# -----------------------
# Find how we can fake an echo command that does not interpret backslash.
# In particular, with Autoconf 2.60 or later we add some code to the start
-# of the generated configure script which will find a shell with a builtin
-# printf (which we can use as an echo command).
+# of the generated configure script that will find a shell with a builtin
+# printf (that we can use as an echo command).
m4_defun([_LT_PROG_ECHO_BACKSLASH],
[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
@@ -1167,10 +1232,10 @@ fi
# Invoke $ECHO with all args, space-separated.
func_echo_all ()
{
- $ECHO "$*"
+ $ECHO "$*"
}
-case "$ECHO" in
+case $ECHO in
printf*) AC_MSG_RESULT([printf]) ;;
print*) AC_MSG_RESULT([print -r]) ;;
*) AC_MSG_RESULT([cat]) ;;
@@ -1196,16 +1261,17 @@ _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
AC_DEFUN([_LT_WITH_SYSROOT],
[AC_MSG_CHECKING([for sysroot])
AC_ARG_WITH([sysroot],
-[ --with-sysroot[=DIR] Search for dependent libraries within DIR
- (or the compiler's sysroot if not specified).],
+[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@],
+ [Search for dependent libraries within DIR (or the compiler's sysroot
+ if not specified).])],
[], [with_sysroot=no])
dnl lt_sysroot will always be passed unquoted. We quote it here
dnl in case the user passed a directory name.
lt_sysroot=
-case ${with_sysroot} in #(
+case $with_sysroot in #(
yes)
- if test "$GCC" = yes; then
+ if test yes = "$GCC"; then
lt_sysroot=`$CC --print-sysroot 2>/dev/null`
fi
;; #(
@@ -1215,14 +1281,14 @@ case ${with_sysroot} in #(
no|'')
;; #(
*)
- AC_MSG_RESULT([${with_sysroot}])
+ AC_MSG_RESULT([$with_sysroot])
AC_MSG_ERROR([The sysroot must be an absolute path.])
;;
esac
AC_MSG_RESULT([${lt_sysroot:-no}])
_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
-[dependent libraries, and in which our libraries should be installed.])])
+[dependent libraries, and where our libraries should be installed.])])
# _LT_ENABLE_LOCK
# ---------------
@@ -1230,31 +1296,33 @@ m4_defun([_LT_ENABLE_LOCK],
[AC_ARG_ENABLE([libtool-lock],
[AS_HELP_STRING([--disable-libtool-lock],
[avoid locking (might break parallel builds)])])
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
# Some flags need to be propagated to the compiler or linker for good
# libtool support.
case $host in
ia64-*-hpux*)
- # Find out which ABI we are using.
+ # Find out what ABI is being produced by ac_compile, and set mode
+ # options accordingly.
echo 'int i;' > conftest.$ac_ext
if AC_TRY_EVAL(ac_compile); then
case `/usr/bin/file conftest.$ac_objext` in
*ELF-32*)
- HPUX_IA64_MODE="32"
+ HPUX_IA64_MODE=32
;;
*ELF-64*)
- HPUX_IA64_MODE="64"
+ HPUX_IA64_MODE=64
;;
esac
fi
rm -rf conftest*
;;
*-*-irix6*)
- # Find out which ABI we are using.
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
if AC_TRY_EVAL(ac_compile); then
- if test "$lt_cv_prog_gnu_ld" = yes; then
+ if test yes = "$lt_cv_prog_gnu_ld"; then
case `/usr/bin/file conftest.$ac_objext` in
*32-bit*)
LD="${LD-ld} -melf32bsmip"
@@ -1283,9 +1351,46 @@ ia64-*-hpux*)
rm -rf conftest*
;;
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+mips64*-*linux*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ emul=elf
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ emul="${emul}32"
+ ;;
+ *64-bit*)
+ emul="${emul}64"
+ ;;
+ esac
+ case `/usr/bin/file conftest.$ac_objext` in
+ *MSB*)
+ emul="${emul}btsmip"
+ ;;
+ *LSB*)
+ emul="${emul}ltsmip"
+ ;;
+ esac
+ case `/usr/bin/file conftest.$ac_objext` in
+ *N32*)
+ emul="${emul}n32"
+ ;;
+ esac
+ LD="${LD-ld} -m $emul"
+ fi
+ rm -rf conftest*
+ ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
- # Find out which ABI we are using.
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly. Note that the listed cases only cover the
+ # situations where additional linker options are needed (such as when
+ # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+ # vice versa); the common cases where no linker options are needed do
+ # not appear in the list.
echo 'int i;' > conftest.$ac_ext
if AC_TRY_EVAL(ac_compile); then
case `/usr/bin/file conftest.o` in
@@ -1295,9 +1400,19 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
LD="${LD-ld} -m elf_i386_fbsd"
;;
x86_64-*linux*)
- LD="${LD-ld} -m elf_i386"
+ case `/usr/bin/file conftest.o` in
+ *x86-64*)
+ LD="${LD-ld} -m elf32_x86_64"
+ ;;
+ *)
+ LD="${LD-ld} -m elf_i386"
+ ;;
+ esac
+ ;;
+ powerpc64le-*linux*)
+ LD="${LD-ld} -m elf32lppclinux"
;;
- ppc64-*linux*|powerpc64-*linux*)
+ powerpc64-*linux*)
LD="${LD-ld} -m elf32ppclinux"
;;
s390x-*linux*)
@@ -1316,7 +1431,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
x86_64-*linux*)
LD="${LD-ld} -m elf_x86_64"
;;
- ppc*-*linux*|powerpc*-*linux*)
+ powerpcle-*linux*)
+ LD="${LD-ld} -m elf64lppc"
+ ;;
+ powerpc-*linux*)
LD="${LD-ld} -m elf64ppc"
;;
s390*-*linux*|s390*-*tpf*)
@@ -1334,25 +1452,39 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
*-*-sco3.2v5*)
# On SCO OpenServer 5, we need -belf to get full-featured binaries.
- SAVE_CFLAGS="$CFLAGS"
+ SAVE_CFLAGS=$CFLAGS
CFLAGS="$CFLAGS -belf"
AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
[AC_LANG_PUSH(C)
AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
AC_LANG_POP])
- if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+ if test yes != "$lt_cv_cc_needs_belf"; then
# this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
- CFLAGS="$SAVE_CFLAGS"
+ CFLAGS=$SAVE_CFLAGS
fi
;;
-sparc*-*solaris*)
- # Find out which ABI we are using.
+*-*solaris*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
echo 'int i;' > conftest.$ac_ext
if AC_TRY_EVAL(ac_compile); then
case `/usr/bin/file conftest.o` in
*64-bit*)
case $lt_cv_prog_gnu_ld in
- yes*) LD="${LD-ld} -m elf64_sparc" ;;
+ yes*)
+ case $host in
+ i?86-*-solaris*|x86_64-*-solaris*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ sparc*-*-solaris*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ # GNU ld 2.21 introduced _sol2 emulations. Use them if available.
+ if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+ LD=${LD-ld}_sol2
+ fi
+ ;;
*)
if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
LD="${LD-ld} -64"
@@ -1366,7 +1498,7 @@ sparc*-*solaris*)
;;
esac
-need_locks="$enable_libtool_lock"
+need_locks=$enable_libtool_lock
])# _LT_ENABLE_LOCK
@@ -1385,11 +1517,11 @@ AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
[echo conftest.$ac_objext > conftest.lst
lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
AC_TRY_EVAL([lt_ar_try])
- if test "$ac_status" -eq 0; then
+ if test 0 -eq "$ac_status"; then
# Ensure the archiver fails upon bogus file names.
rm -f conftest.$ac_objext libconftest.a
AC_TRY_EVAL([lt_ar_try])
- if test "$ac_status" -ne 0; then
+ if test 0 -ne "$ac_status"; then
lt_cv_ar_at_file=@
fi
fi
@@ -1397,7 +1529,7 @@ AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
])
])
-if test "x$lt_cv_ar_at_file" = xno; then
+if test no = "$lt_cv_ar_at_file"; then
archiver_list_spec=
else
archiver_list_spec=$lt_cv_ar_at_file
@@ -1428,14 +1560,14 @@ old_postuninstall_cmds=
if test -n "$RANLIB"; then
case $host_os in
- openbsd*)
- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+ bitrig* | openbsd*)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
;;
*)
- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
;;
esac
- old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
fi
case $host_os in
@@ -1464,7 +1596,7 @@ AC_CACHE_CHECK([$1], [$2],
[$2=no
m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
echo "$lt_simple_compile_test_code" > conftest.$ac_ext
- lt_compiler_flag="$3"
+ lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment
# Insert the option either (1) after the last *FLAGS variable, or
# (2) before a word containing "conftest.", or (3) at the end.
# Note that $ac_compile itself does not contain backslashes and begins
@@ -1491,7 +1623,7 @@ AC_CACHE_CHECK([$1], [$2],
$RM conftest*
])
-if test x"[$]$2" = xyes; then
+if test yes = "[$]$2"; then
m4_if([$5], , :, [$5])
else
m4_if([$6], , :, [$6])
@@ -1513,7 +1645,7 @@ AC_DEFUN([_LT_LINKER_OPTION],
m4_require([_LT_DECL_SED])dnl
AC_CACHE_CHECK([$1], [$2],
[$2=no
- save_LDFLAGS="$LDFLAGS"
+ save_LDFLAGS=$LDFLAGS
LDFLAGS="$LDFLAGS $3"
echo "$lt_simple_link_test_code" > conftest.$ac_ext
if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
@@ -1532,10 +1664,10 @@ AC_CACHE_CHECK([$1], [$2],
fi
fi
$RM -r conftest*
- LDFLAGS="$save_LDFLAGS"
+ LDFLAGS=$save_LDFLAGS
])
-if test x"[$]$2" = xyes; then
+if test yes = "[$]$2"; then
m4_if([$4], , :, [$4])
else
m4_if([$5], , :, [$5])
@@ -1556,7 +1688,7 @@ AC_DEFUN([LT_CMD_MAX_LEN],
AC_MSG_CHECKING([the maximum length of command line arguments])
AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
i=0
- teststring="ABCD"
+ teststring=ABCD
case $build_os in
msdosdjgpp*)
@@ -1596,7 +1728,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
lt_cv_sys_max_cmd_len=8192;
;;
- netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+ bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
# This has been around since 386BSD, at least. Likely further.
if test -x /sbin/sysctl; then
lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
@@ -1615,6 +1747,11 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
lt_cv_sys_max_cmd_len=196608
;;
+ os2*)
+ # The test takes a long time on OS/2.
+ lt_cv_sys_max_cmd_len=8192
+ ;;
+
osf*)
# Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
# due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
@@ -1641,22 +1778,23 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
;;
*)
lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
- if test -n "$lt_cv_sys_max_cmd_len"; then
+ if test -n "$lt_cv_sys_max_cmd_len" && \
+ test undefined != "$lt_cv_sys_max_cmd_len"; then
lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
else
# Make teststring a little bigger before we do anything with it.
# a 1K string should be a reasonable start.
- for i in 1 2 3 4 5 6 7 8 ; do
+ for i in 1 2 3 4 5 6 7 8; do
teststring=$teststring$teststring
done
SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
# If test is not a shell built-in, we'll probably end up computing a
# maximum length that is only half of the actual maximum length, but
# we can't tell.
- while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \
+ while { test X`env echo "$teststring$teststring" 2>/dev/null` \
= "X$teststring$teststring"; } >/dev/null 2>&1 &&
- test $i != 17 # 1/2 MB should be enough
+ test 17 != "$i" # 1/2 MB should be enough
do
i=`expr $i + 1`
teststring=$teststring$teststring
@@ -1672,7 +1810,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
;;
esac
])
-if test -n $lt_cv_sys_max_cmd_len ; then
+if test -n "$lt_cv_sys_max_cmd_len"; then
AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
else
AC_MSG_RESULT(none)
@@ -1700,7 +1838,7 @@ m4_defun([_LT_HEADER_DLFCN],
# ----------------------------------------------------------------
m4_defun([_LT_TRY_DLOPEN_SELF],
[m4_require([_LT_HEADER_DLFCN])dnl
-if test "$cross_compiling" = yes; then :
+if test yes = "$cross_compiling"; then :
[$4]
else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
@@ -1747,9 +1885,9 @@ else
# endif
#endif
-/* When -fvisbility=hidden is used, assume the code has been annotated
+/* When -fvisibility=hidden is used, assume the code has been annotated
correspondingly for the symbols needed. */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
int fnord () __attribute__((visibility("default")));
#endif
@@ -1775,7 +1913,7 @@ int main ()
return status;
}]
_LT_EOF
- if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+ if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then
(./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
lt_status=$?
case x$lt_status in
@@ -1796,7 +1934,7 @@ rm -fr conftest*
# ------------------
AC_DEFUN([LT_SYS_DLOPEN_SELF],
[m4_require([_LT_HEADER_DLFCN])dnl
-if test "x$enable_dlopen" != xyes; then
+if test yes != "$enable_dlopen"; then
enable_dlopen=unknown
enable_dlopen_self=unknown
enable_dlopen_self_static=unknown
@@ -1806,44 +1944,52 @@ else
case $host_os in
beos*)
- lt_cv_dlopen="load_add_on"
+ lt_cv_dlopen=load_add_on
lt_cv_dlopen_libs=
lt_cv_dlopen_self=yes
;;
mingw* | pw32* | cegcc*)
- lt_cv_dlopen="LoadLibrary"
+ lt_cv_dlopen=LoadLibrary
lt_cv_dlopen_libs=
;;
cygwin*)
- lt_cv_dlopen="dlopen"
+ lt_cv_dlopen=dlopen
lt_cv_dlopen_libs=
;;
darwin*)
- # if libdl is installed we need to link against it
+ # if libdl is installed we need to link against it
AC_CHECK_LIB([dl], [dlopen],
- [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
- lt_cv_dlopen="dyld"
+ [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[
+ lt_cv_dlopen=dyld
lt_cv_dlopen_libs=
lt_cv_dlopen_self=yes
])
;;
+ tpf*)
+ # Don't try to run any link tests for TPF. We know it's impossible
+ # because TPF is a cross-compiler, and we know how we open DSOs.
+ lt_cv_dlopen=dlopen
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=no
+ ;;
+
*)
AC_CHECK_FUNC([shl_load],
- [lt_cv_dlopen="shl_load"],
+ [lt_cv_dlopen=shl_load],
[AC_CHECK_LIB([dld], [shl_load],
- [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
+ [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld],
[AC_CHECK_FUNC([dlopen],
- [lt_cv_dlopen="dlopen"],
+ [lt_cv_dlopen=dlopen],
[AC_CHECK_LIB([dl], [dlopen],
- [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+ [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],
[AC_CHECK_LIB([svld], [dlopen],
- [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+ [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld],
[AC_CHECK_LIB([dld], [dld_link],
- [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
+ [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld])
])
])
])
@@ -1852,21 +1998,21 @@ else
;;
esac
- if test "x$lt_cv_dlopen" != xno; then
- enable_dlopen=yes
- else
+ if test no = "$lt_cv_dlopen"; then
enable_dlopen=no
+ else
+ enable_dlopen=yes
fi
case $lt_cv_dlopen in
dlopen)
- save_CPPFLAGS="$CPPFLAGS"
- test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+ save_CPPFLAGS=$CPPFLAGS
+ test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
- save_LDFLAGS="$LDFLAGS"
+ save_LDFLAGS=$LDFLAGS
wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
- save_LIBS="$LIBS"
+ save_LIBS=$LIBS
LIBS="$lt_cv_dlopen_libs $LIBS"
AC_CACHE_CHECK([whether a program can dlopen itself],
@@ -1876,7 +2022,7 @@ else
lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
])
- if test "x$lt_cv_dlopen_self" = xyes; then
+ if test yes = "$lt_cv_dlopen_self"; then
wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
lt_cv_dlopen_self_static, [dnl
@@ -1886,9 +2032,9 @@ else
])
fi
- CPPFLAGS="$save_CPPFLAGS"
- LDFLAGS="$save_LDFLAGS"
- LIBS="$save_LIBS"
+ CPPFLAGS=$save_CPPFLAGS
+ LDFLAGS=$save_LDFLAGS
+ LIBS=$save_LIBS
;;
esac
@@ -1980,8 +2126,8 @@ m4_defun([_LT_COMPILER_FILE_LOCKS],
m4_require([_LT_FILEUTILS_DEFAULTS])dnl
_LT_COMPILER_C_O([$1])
-hard_links="nottested"
-if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+hard_links=nottested
+if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then
# do not overwrite the value of need_locks provided by the user
AC_MSG_CHECKING([if we can lock with hard links])
hard_links=yes
@@ -1991,8 +2137,8 @@ if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" !=
ln conftest.a conftest.b 2>&5 || hard_links=no
ln conftest.a conftest.b 2>/dev/null && hard_links=no
AC_MSG_RESULT([$hard_links])
- if test "$hard_links" = no; then
- AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+ if test no = "$hard_links"; then
+ AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe])
need_locks=warn
fi
else
@@ -2019,8 +2165,8 @@ objdir=$lt_cv_objdir
_LT_DECL([], [objdir], [0],
[The name of the directory that contains temporary libtool files])dnl
m4_pattern_allow([LT_OBJDIR])dnl
-AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
- [Define to the sub-directory in which libtool stores uninstalled libraries.])
+AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/",
+ [Define to the sub-directory where libtool stores uninstalled libraries.])
])# _LT_CHECK_OBJDIR
@@ -2032,15 +2178,15 @@ m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
_LT_TAGVAR(hardcode_action, $1)=
if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
test -n "$_LT_TAGVAR(runpath_var, $1)" ||
- test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+ test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then
# We can hardcode non-existent directories.
- if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
+ if test no != "$_LT_TAGVAR(hardcode_direct, $1)" &&
# If the only mechanism to avoid hardcoding is shlibpath_var, we
# have to relink, otherwise we might link with an installed library
# when we should be linking with a yet-to-be-installed one
- ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
- test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
+ ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" &&
+ test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then
# Linking always hardcodes the temporary library directory.
_LT_TAGVAR(hardcode_action, $1)=relink
else
@@ -2054,12 +2200,12 @@ else
fi
AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
-if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
- test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
+if test relink = "$_LT_TAGVAR(hardcode_action, $1)" ||
+ test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then
# Fast installation is not supported
enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
- test "$enable_shared" = no; then
+elif test yes = "$shlibpath_overrides_runpath" ||
+ test no = "$enable_shared"; then
# Fast installation is not necessary
enable_fast_install=needless
fi
@@ -2083,7 +2229,7 @@ else
# FIXME - insert some real tests, host_os isn't really good enough
case $host_os in
darwin*)
- if test -n "$STRIP" ; then
+ if test -n "$STRIP"; then
striplib="$STRIP -x"
old_striplib="$STRIP -S"
AC_MSG_RESULT([yes])
@@ -2101,6 +2247,47 @@ _LT_DECL([], [striplib], [1])
])# _LT_CMD_STRIPLIB
+# _LT_PREPARE_MUNGE_PATH_LIST
+# ---------------------------
+# Make sure func_munge_path_list() is defined correctly.
+m4_defun([_LT_PREPARE_MUNGE_PATH_LIST],
+[[# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+# string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+# string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+# "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+# VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+ case x@S|@2 in
+ x)
+ ;;
+ *:)
+ eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\"
+ ;;
+ x:*)
+ eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\"
+ ;;
+ *::*)
+ eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+ eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\"
+ ;;
+ *)
+ eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\"
+ ;;
+ esac
+}
+]])# _LT_PREPARE_PATH_LIST
+
+
# _LT_SYS_DYNAMIC_LINKER([TAG])
# -----------------------------
# PORTME Fill in your ld.so characteristics
@@ -2111,17 +2298,18 @@ m4_require([_LT_FILEUTILS_DEFAULTS])dnl
m4_require([_LT_DECL_OBJDUMP])dnl
m4_require([_LT_DECL_SED])dnl
m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl
AC_MSG_CHECKING([dynamic linker characteristics])
m4_if([$1],
[], [
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
case $host_os in
- darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
- *) lt_awk_arg="/^libraries:/" ;;
+ darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+ *) lt_awk_arg='/^libraries:/' ;;
esac
case $host_os in
- mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
- *) lt_sed_strip_eq="s,=/,/,g" ;;
+ mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;;
+ *) lt_sed_strip_eq='s|=/|/|g' ;;
esac
lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
case $lt_search_path_spec in
@@ -2137,28 +2325,35 @@ if test "$GCC" = yes; then
;;
esac
# Ok, now we have the path, separated by spaces, we can step through it
- # and add multilib dir if necessary.
+ # and add multilib dir if necessary...
lt_tmp_lt_search_path_spec=
- lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+ lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+ # ...but if some path component already ends with the multilib dir we assume
+ # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+ case "$lt_multi_os_dir; $lt_search_path_spec " in
+ "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+ lt_multi_os_dir=
+ ;;
+ esac
for lt_sys_path in $lt_search_path_spec; do
- if test -d "$lt_sys_path/$lt_multi_os_dir"; then
- lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
- else
+ if test -d "$lt_sys_path$lt_multi_os_dir"; then
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+ elif test -n "$lt_multi_os_dir"; then
test -d "$lt_sys_path" && \
lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
fi
done
lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
- lt_foo="";
- lt_count=0;
+BEGIN {RS = " "; FS = "/|\n";} {
+ lt_foo = "";
+ lt_count = 0;
for (lt_i = NF; lt_i > 0; lt_i--) {
if ($lt_i != "" && $lt_i != ".") {
if ($lt_i == "..") {
lt_count++;
} else {
if (lt_count == 0) {
- lt_foo="/" $lt_i lt_foo;
+ lt_foo = "/" $lt_i lt_foo;
} else {
lt_count--;
}
@@ -2172,7 +2367,7 @@ BEGIN {RS=" "; FS="/|\n";} {
# for these hosts.
case $host_os in
mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
- $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
+ $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;;
esac
sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
else
@@ -2181,7 +2376,7 @@ fi])
library_names_spec=
libname_spec='lib$name'
soname_spec=
-shrext_cmds=".so"
+shrext_cmds=.so
postinstall_cmds=
postuninstall_cmds=
finish_cmds=
@@ -2198,56 +2393,109 @@ hardcode_into_libs=no
# flags to be left without arguments
need_version=unknown
+AC_ARG_VAR([LT_SYS_LIBRARY_PATH],
+[User-defined run-time library search path.])
+
case $host_os in
aix3*)
- version_type=linux
- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
shlibpath_var=LIBPATH
# AIX 3 has no versioning support, so we append a major version to the name.
- soname_spec='${libname}${release}${shared_ext}$major'
+ soname_spec='$libname$release$shared_ext$major'
;;
aix[[4-9]]*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
hardcode_into_libs=yes
- if test "$host_cpu" = ia64; then
+ if test ia64 = "$host_cpu"; then
# AIX 5 supports IA64
- library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+ library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
shlibpath_var=LD_LIBRARY_PATH
else
# With GCC up to 2.95.x, collect2 would create an import file
# for dependence libraries. The import file would start with
- # the line `#! .'. This would cause the generated library to
- # depend on `.', always an invalid library. This was fixed in
+ # the line '#! .'. This would cause the generated library to
+ # depend on '.', always an invalid library. This was fixed in
# development snapshots of GCC prior to 3.0.
case $host_os in
aix4 | aix4.[[01]] | aix4.[[01]].*)
if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
echo ' yes '
- echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+ echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
:
else
can_build_shared=no
fi
;;
esac
- # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+ # Using Import Files as archive members, it is possible to support
+ # filename-based versioning of shared library archives on AIX. While
+ # this would work for both with and without runtime linking, it will
+ # prevent static linking of such archives. So we do filename-based
+ # shared library versioning with .so extension only, which is used
+ # when both runtime linking and shared linking is enabled.
+ # Unfortunately, runtime linking may impact performance, so we do
+ # not want this to be the default eventually. Also, we use the
+ # versioned .so libs for executables only if there is the -brtl
+ # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+ # To allow for filename-based versioning support, we need to create
+ # libNAME.so.V as an archive file, containing:
+ # *) an Import File, referring to the versioned filename of the
+ # archive as well as the shared archive member, telling the
+ # bitwidth (32 or 64) of that shared object, and providing the
+ # list of exported symbols of that shared object, eventually
+ # decorated with the 'weak' keyword
+ # *) the shared object with the F_LOADONLY flag set, to really avoid
+ # it being seen by the linker.
+ # At run time we better use the real file rather than another symlink,
+ # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+ case $with_aix_soname,$aix_use_runtimelinking in
+ # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
# soname into executable. Probably we can add versioning support to
# collect2, so additional links can be useful in future.
- if test "$aix_use_runtimelinking" = yes; then
+ aix,yes) # traditional libtool
+ dynamic_linker='AIX unversionable lib.so'
# If using run time linking (on AIX 4.2 or later) use lib<name>.so
# instead of lib<name>.a to let people know that these are not
# typical AIX shared libraries.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- else
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ aix,no) # traditional AIX only
+ dynamic_linker='AIX lib.a[(]lib.so.V[)]'
# We preserve .a as extension for shared libraries through AIX4.2
# and later when we are not doing run time linking.
- library_names_spec='${libname}${release}.a $libname.a'
- soname_spec='${libname}${release}${shared_ext}$major'
- fi
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ svr4,*) # full svr4 only
+ dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,yes) # both, prefer svr4
+ dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # unpreferred sharedlib libNAME.a needs extra handling
+ postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+ postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,no) # both, prefer aix
+ dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]"
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+ postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+ postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+ ;;
+ esac
shlibpath_var=LIBPATH
fi
;;
@@ -2257,27 +2505,27 @@ amigaos*)
powerpc)
# Since July 2007 AmigaOS4 officially supports .so libraries.
# When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
;;
m68k)
library_names_spec='$libname.ixlibrary $libname.a'
# Create ${libname}_ixlibrary.a entries in /sys/libs.
- finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
;;
esac
;;
beos*)
- library_names_spec='${libname}${shared_ext}'
+ library_names_spec='$libname$shared_ext'
dynamic_linker="$host_os ld.so"
shlibpath_var=LIBRARY_PATH
;;
bsdi[[45]]*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
shlibpath_var=LD_LIBRARY_PATH
sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
@@ -2289,7 +2537,7 @@ bsdi[[45]]*)
cygwin* | mingw* | pw32* | cegcc*)
version_type=windows
- shrext_cmds=".dll"
+ shrext_cmds=.dll
need_version=no
need_lib_prefix=no
@@ -2298,8 +2546,8 @@ cygwin* | mingw* | pw32* | cegcc*)
# gcc
library_names_spec='$libname.dll.a'
# DLL is installed to $(libdir)/../bin by postinstall_cmds
- postinstall_cmds='base_file=`basename \${file}`~
- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
dldir=$destdir/`dirname \$dlpath`~
test -d \$dldir || mkdir -p \$dldir~
$install_prog $dir/$dlname \$dldir/$dlname~
@@ -2315,17 +2563,17 @@ cygwin* | mingw* | pw32* | cegcc*)
case $host_os in
cygwin*)
# Cygwin DLLs use 'cyg' prefix rather than 'lib'
- soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+ soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
m4_if([$1], [],[
sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
;;
mingw* | cegcc*)
# MinGW DLLs use traditional 'lib' prefix
- soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+ soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
;;
pw32*)
# pw32 DLLs use 'pw' prefix rather than 'lib'
- library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+ library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
;;
esac
dynamic_linker='Win32 ld.exe'
@@ -2334,8 +2582,8 @@ m4_if([$1], [],[
*,cl*)
# Native MSVC
libname_spec='$name'
- soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
- library_names_spec='${libname}.dll.lib'
+ soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+ library_names_spec='$libname.dll.lib'
case $build_os in
mingw*)
@@ -2362,7 +2610,7 @@ m4_if([$1], [],[
sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
;;
*)
- sys_lib_search_path_spec="$LIB"
+ sys_lib_search_path_spec=$LIB
if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
# It is most probably a Windows format PATH.
sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
@@ -2375,8 +2623,8 @@ m4_if([$1], [],[
esac
# DLL is installed to $(libdir)/../bin by postinstall_cmds
- postinstall_cmds='base_file=`basename \${file}`~
- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
dldir=$destdir/`dirname \$dlpath`~
test -d \$dldir || mkdir -p \$dldir~
$install_prog $dir/$dlname \$dldir/$dlname'
@@ -2389,7 +2637,7 @@ m4_if([$1], [],[
*)
# Assume MSVC wrapper
- library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib'
dynamic_linker='Win32 ld.exe'
;;
esac
@@ -2402,8 +2650,8 @@ darwin* | rhapsody*)
version_type=darwin
need_lib_prefix=no
need_version=no
- library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
- soname_spec='${libname}${release}${major}$shared_ext'
+ library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$major$shared_ext'
shlibpath_overrides_runpath=yes
shlibpath_var=DYLD_LIBRARY_PATH
shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
@@ -2413,18 +2661,14 @@ m4_if([$1], [],[
;;
dgux*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
- soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LD_LIBRARY_PATH
;;
-freebsd1*)
- dynamic_linker=no
- ;;
-
freebsd* | dragonfly*)
# DragonFly does not have aout. When/if they implement a new
# versioning mechanism, adjust this.
@@ -2432,25 +2676,26 @@ freebsd* | dragonfly*)
objformat=`/usr/bin/objformat`
else
case $host_os in
- freebsd[[123]]*) objformat=aout ;;
+ freebsd[[23]].*) objformat=aout ;;
*) objformat=elf ;;
esac
fi
version_type=freebsd-$objformat
case $version_type in
freebsd-elf*)
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
need_version=no
need_lib_prefix=no
;;
freebsd-*)
- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
need_version=yes
;;
esac
shlibpath_var=LD_LIBRARY_PATH
case $host_os in
- freebsd2*)
+ freebsd2.*)
shlibpath_overrides_runpath=yes
;;
freebsd3.[[01]]* | freebsdelf3.[[01]]*)
@@ -2469,25 +2714,15 @@ freebsd* | dragonfly*)
esac
;;
-gnu*)
- version_type=linux
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- hardcode_into_libs=yes
- ;;
-
haiku*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
dynamic_linker="$host_os runtime_loader"
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LIBRARY_PATH
- shlibpath_overrides_runpath=yes
+ shlibpath_overrides_runpath=no
sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
hardcode_into_libs=yes
;;
@@ -2505,14 +2740,15 @@ hpux9* | hpux10* | hpux11*)
dynamic_linker="$host_os dld.so"
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- if test "X$HPUX_IA64_MODE" = X32; then
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ if test 32 = "$HPUX_IA64_MODE"; then
sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux32
else
sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux64
fi
- sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
;;
hppa*64*)
shrext_cmds='.sl'
@@ -2520,8 +2756,8 @@ hpux9* | hpux10* | hpux11*)
dynamic_linker="$host_os dld.sl"
shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
;;
@@ -2530,8 +2766,8 @@ hpux9* | hpux10* | hpux11*)
dynamic_linker="$host_os dld.sl"
shlibpath_var=SHLIB_PATH
shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
;;
esac
# HP-UX runs *really* slowly unless shared libraries are mode 555, ...
@@ -2541,11 +2777,11 @@ hpux9* | hpux10* | hpux11*)
;;
interix[[3-9]]*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
@@ -2556,16 +2792,16 @@ irix5* | irix6* | nonstopux*)
case $host_os in
nonstopux*) version_type=nonstopux ;;
*)
- if test "$lt_cv_prog_gnu_ld" = yes; then
- version_type=linux
+ if test yes = "$lt_cv_prog_gnu_ld"; then
+ version_type=linux # correct to gnu/linux during the next big refactor
else
version_type=irix
fi ;;
esac
need_lib_prefix=no
need_version=no
- soname_spec='${libname}${release}${shared_ext}$major'
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
case $host_os in
irix5* | nonstopux*)
libsuff= shlibsuff=
@@ -2584,8 +2820,8 @@ irix5* | irix6* | nonstopux*)
esac
shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
shlibpath_overrides_runpath=no
- sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
- sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+ sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+ sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
hardcode_into_libs=yes
;;
@@ -2594,13 +2830,33 @@ linux*oldld* | linux*aout* | linux*coff*)
dynamic_linker=no
;;
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
- version_type=linux
+linux*android*)
+ version_type=none # Android doesn't support versioned libraries.
need_lib_prefix=no
need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='$libname$release$shared_ext'
+ soname_spec='$libname$release$shared_ext'
+ finish_cmds=
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ dynamic_linker='Android linker'
+ # Don't embed -rpath directories since the linker doesn't support them.
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
@@ -2625,7 +2881,12 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu)
# before this can be enabled.
hardcode_into_libs=yes
- # Append ld.so.conf contents to the search path
+ # Ideally, we could use ldconfig to report *all* directores which are
+ # searched for libraries, however this is still not possible. Aside from not
+ # being certain /sbin/ldconfig is available, command
+ # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+ # even though it is searched at run-time. Try to do the best guess by
+ # appending ld.so.conf contents (and includes) to the search path.
if test -f /etc/ld.so.conf; then
lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
@@ -2645,12 +2906,12 @@ netbsd*)
need_lib_prefix=no
need_version=no
if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
dynamic_linker='NetBSD (a.out) ld.so'
else
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
dynamic_linker='NetBSD ld.elf_so'
fi
shlibpath_var=LD_LIBRARY_PATH
@@ -2659,8 +2920,8 @@ netbsd*)
;;
newsos6)
- version_type=linux
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
;;
@@ -2669,58 +2930,68 @@ newsos6)
version_type=qnx
need_lib_prefix=no
need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
hardcode_into_libs=yes
dynamic_linker='ldqnx.so'
;;
-openbsd*)
+openbsd* | bitrig*)
version_type=sunos
- sys_lib_dlsearch_path_spec="/usr/lib"
+ sys_lib_dlsearch_path_spec=/usr/lib
need_lib_prefix=no
- # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
- case $host_os in
- openbsd3.3 | openbsd3.3.*) need_version=yes ;;
- *) need_version=no ;;
- esac
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- case $host_os in
- openbsd2.[[89]] | openbsd2.[[89]].*)
- shlibpath_overrides_runpath=no
- ;;
- *)
- shlibpath_overrides_runpath=yes
- ;;
- esac
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ need_version=no
else
- shlibpath_overrides_runpath=yes
+ need_version=yes
fi
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
;;
os2*)
libname_spec='$name'
- shrext_cmds=".dll"
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
need_lib_prefix=no
- library_names_spec='$libname${shared_ext} $libname.a'
+ # OS/2 can only load a DLL with a base name of 8 characters or less.
+ soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+ v=$($ECHO $release$versuffix | tr -d .-);
+ n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+ $ECHO $n$v`$shared_ext'
+ library_names_spec='${libname}_dll.$libext'
dynamic_linker='OS/2 ld.exe'
- shlibpath_var=LIBPATH
+ shlibpath_var=BEGINLIBPATH
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
;;
osf3* | osf4* | osf5*)
version_type=osf
need_lib_prefix=no
need_version=no
- soname_spec='${libname}${release}${shared_ext}$major'
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
shlibpath_var=LD_LIBRARY_PATH
sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
- sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
;;
rdos*)
@@ -2728,11 +2999,11 @@ rdos*)
;;
solaris*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
hardcode_into_libs=yes
@@ -2742,20 +3013,20 @@ solaris*)
sunos4*)
version_type=sunos
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
- if test "$with_gnu_ld" = yes; then
+ if test yes = "$with_gnu_ld"; then
need_lib_prefix=no
fi
need_version=yes
;;
sysv4 | sysv4.3*)
- version_type=linux
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LD_LIBRARY_PATH
case $host_vendor in
sni)
@@ -2776,24 +3047,24 @@ sysv4 | sysv4.3*)
;;
sysv4*MP*)
- if test -d /usr/nec ;then
- version_type=linux
- library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
- soname_spec='$libname${shared_ext}.$major'
+ if test -d /usr/nec; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+ soname_spec='$libname$shared_ext.$major'
shlibpath_var=LD_LIBRARY_PATH
fi
;;
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
- version_type=freebsd-elf
+ version_type=sco
need_lib_prefix=no
need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
hardcode_into_libs=yes
- if test "$with_gnu_ld" = yes; then
+ if test yes = "$with_gnu_ld"; then
sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
else
sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
@@ -2808,19 +3079,19 @@ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
tpf*)
# TPF is a cross-target only. Preferred cross-host = GNU/Linux.
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
hardcode_into_libs=yes
;;
uts4*)
- version_type=linux
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LD_LIBRARY_PATH
;;
@@ -2829,20 +3100,30 @@ uts4*)
;;
esac
AC_MSG_RESULT([$dynamic_linker])
-test "$dynamic_linker" = no && can_build_shared=no
+test no = "$dynamic_linker" && can_build_shared=no
variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
fi
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
- sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+ sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
- sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+ sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
fi
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
_LT_DECL([], [variables_saved_for_relink], [1],
[Variables whose values should be saved in libtool wrapper scripts and
restored at link time])
@@ -2875,39 +3156,41 @@ _LT_DECL([], [hardcode_into_libs], [0],
[Whether we should hardcode library paths into libraries])
_LT_DECL([], [sys_lib_search_path_spec], [2],
[Compile-time system search path for libraries])
-_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
- [Run-time system search path for libraries])
+_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2],
+ [Detected run-time system search path for libraries])
+_LT_DECL([], [configure_time_lt_sys_library_path], [2],
+ [Explicit LT_SYS_LIBRARY_PATH set during ./configure time])
])# _LT_SYS_DYNAMIC_LINKER
# _LT_PATH_TOOL_PREFIX(TOOL)
# --------------------------
-# find a file program which can recognize shared library
+# find a file program that can recognize shared library
AC_DEFUN([_LT_PATH_TOOL_PREFIX],
[m4_require([_LT_DECL_EGREP])dnl
AC_MSG_CHECKING([for $1])
AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
[case $MAGIC_CMD in
[[\\/*] | ?:[\\/]*])
- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+ lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
;;
*)
- lt_save_MAGIC_CMD="$MAGIC_CMD"
- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ lt_save_MAGIC_CMD=$MAGIC_CMD
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
dnl $ac_dummy forces splitting on constant user-supplied paths.
dnl POSIX.2 word splitting is done only on the output of word expansions,
dnl not every word. This closes a longstanding sh security hole.
ac_dummy="m4_if([$2], , $PATH, [$2])"
for ac_dir in $ac_dummy; do
- IFS="$lt_save_ifs"
+ IFS=$lt_save_ifs
test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$1; then
- lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+ if test -f "$ac_dir/$1"; then
+ lt_cv_path_MAGIC_CMD=$ac_dir/"$1"
if test -n "$file_magic_test_file"; then
case $deplibs_check_method in
"file_magic "*)
file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
- MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+ MAGIC_CMD=$lt_cv_path_MAGIC_CMD
if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
$EGREP "$file_magic_regex" > /dev/null; then
:
@@ -2930,11 +3213,11 @@ _LT_EOF
break
fi
done
- IFS="$lt_save_ifs"
- MAGIC_CMD="$lt_save_MAGIC_CMD"
+ IFS=$lt_save_ifs
+ MAGIC_CMD=$lt_save_MAGIC_CMD
;;
esac])
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
if test -n "$MAGIC_CMD"; then
AC_MSG_RESULT($MAGIC_CMD)
else
@@ -2952,7 +3235,7 @@ dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
# _LT_PATH_MAGIC
# --------------
-# find a file program which can recognize a shared library
+# find a file program that can recognize a shared library
m4_defun([_LT_PATH_MAGIC],
[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
if test -z "$lt_cv_path_MAGIC_CMD"; then
@@ -2979,16 +3262,16 @@ m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
AC_ARG_WITH([gnu-ld],
[AS_HELP_STRING([--with-gnu-ld],
[assume the C compiler uses GNU ld @<:@default=no@:>@])],
- [test "$withval" = no || with_gnu_ld=yes],
+ [test no = "$withval" || with_gnu_ld=yes],
[with_gnu_ld=no])dnl
ac_prog=ld
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
# Check if gcc -print-prog-name=ld gives a path.
AC_MSG_CHECKING([for ld used by $CC])
case $host in
*-*-mingw*)
- # gcc leaves a trailing carriage return which upsets mingw
+ # gcc leaves a trailing carriage return, which upsets mingw
ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
*)
ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
@@ -3002,7 +3285,7 @@ if test "$GCC" = yes; then
while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
done
- test -z "$LD" && LD="$ac_prog"
+ test -z "$LD" && LD=$ac_prog
;;
"")
# If it fails, then pretend we aren't using GCC.
@@ -3013,37 +3296,37 @@ if test "$GCC" = yes; then
with_gnu_ld=unknown
;;
esac
-elif test "$with_gnu_ld" = yes; then
+elif test yes = "$with_gnu_ld"; then
AC_MSG_CHECKING([for GNU ld])
else
AC_MSG_CHECKING([for non-GNU ld])
fi
AC_CACHE_VAL(lt_cv_path_LD,
[if test -z "$LD"; then
- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
for ac_dir in $PATH; do
- IFS="$lt_save_ifs"
+ IFS=$lt_save_ifs
test -z "$ac_dir" && ac_dir=.
if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
- lt_cv_path_LD="$ac_dir/$ac_prog"
+ lt_cv_path_LD=$ac_dir/$ac_prog
# Check to see if the program is GNU ld. I'd rather use --version,
# but apparently some variants of GNU ld only accept -v.
# Break only if it was the GNU/non-GNU ld that we prefer.
case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
*GNU* | *'with BFD'*)
- test "$with_gnu_ld" != no && break
+ test no != "$with_gnu_ld" && break
;;
*)
- test "$with_gnu_ld" != yes && break
+ test yes != "$with_gnu_ld" && break
;;
esac
fi
done
- IFS="$lt_save_ifs"
+ IFS=$lt_save_ifs
else
- lt_cv_path_LD="$LD" # Let the user override the test with a path.
+ lt_cv_path_LD=$LD # Let the user override the test with a path.
fi])
-LD="$lt_cv_path_LD"
+LD=$lt_cv_path_LD
if test -n "$LD"; then
AC_MSG_RESULT($LD)
else
@@ -3097,13 +3380,13 @@ esac
reload_cmds='$LD$reload_flag -o $output$reload_objs'
case $host_os in
cygwin* | mingw* | pw32* | cegcc*)
- if test "$GCC" != yes; then
+ if test yes != "$GCC"; then
reload_cmds=false
fi
;;
darwin*)
- if test "$GCC" = yes; then
- reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+ if test yes = "$GCC"; then
+ reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
else
reload_cmds='$LD$reload_flag -o $output$reload_objs'
fi
@@ -3114,6 +3397,43 @@ _LT_TAGDECL([], [reload_cmds], [2])dnl
])# _LT_CMD_RELOAD
+# _LT_PATH_DD
+# -----------
+# find a working dd
+m4_defun([_LT_PATH_DD],
+[AC_CACHE_CHECK([for a working dd], [ac_cv_path_lt_DD],
+[printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd],
+[if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi])
+rm -f conftest.i conftest2.i conftest.out])
+])# _LT_PATH_DD
+
+
+# _LT_CMD_TRUNCATE
+# ----------------
+# find command to truncate a binary pipe
+m4_defun([_LT_CMD_TRUNCATE],
+[m4_require([_LT_PATH_DD])
+AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin],
+[printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"])
+_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1],
+ [Command to truncate a binary pipe])
+])# _LT_CMD_TRUNCATE
+
+
# _LT_CHECK_MAGIC_METHOD
# ----------------------
# how to check for library dependencies
@@ -3129,13 +3449,13 @@ lt_cv_deplibs_check_method='unknown'
# Need to set the preceding variable on all platforms that support
# interlibrary dependencies.
# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
+# 'unknown' -- same as none, but documents that we really don't know.
# 'pass_all' -- all dependencies passed with no checks.
# 'test_compile' -- check by making test program.
# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
case $host_os in
aix[[4-9]]*)
@@ -3162,8 +3482,7 @@ mingw* | pw32*)
# Base MSYS/MinGW do not provide the 'file' command needed by
# func_win32_libid shell function, so use a weaker test based on 'objdump',
# unless we find 'file', for example because we are cross-compiling.
- # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
- if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+ if ( file / ) >/dev/null 2>&1; then
lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
lt_cv_file_magic_cmd='func_win32_libid'
else
@@ -3199,10 +3518,6 @@ freebsd* | dragonfly*)
fi
;;
-gnu*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
haiku*)
lt_cv_deplibs_check_method=pass_all
;;
@@ -3240,8 +3555,8 @@ irix5* | irix6* | nonstopux*)
lt_cv_deplibs_check_method=pass_all
;;
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
lt_cv_deplibs_check_method=pass_all
;;
@@ -3263,8 +3578,8 @@ newos6*)
lt_cv_deplibs_check_method=pass_all
;;
-openbsd*)
- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+openbsd* | bitrig*)
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
else
lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
@@ -3317,6 +3632,9 @@ sysv4 | sysv4.3*)
tpf*)
lt_cv_deplibs_check_method=pass_all
;;
+os2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
esac
])
@@ -3357,33 +3675,38 @@ AC_DEFUN([LT_PATH_NM],
AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
[if test -n "$NM"; then
# Let the user override the test.
- lt_cv_path_NM="$NM"
+ lt_cv_path_NM=$NM
else
- lt_nm_to_check="${ac_tool_prefix}nm"
+ lt_nm_to_check=${ac_tool_prefix}nm
if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
lt_nm_to_check="$lt_nm_to_check nm"
fi
for lt_tmp_nm in $lt_nm_to_check; do
- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
- IFS="$lt_save_ifs"
+ IFS=$lt_save_ifs
test -z "$ac_dir" && ac_dir=.
- tmp_nm="$ac_dir/$lt_tmp_nm"
- if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+ tmp_nm=$ac_dir/$lt_tmp_nm
+ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
# Check to see if the nm accepts a BSD-compat flag.
- # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+ # Adding the 'sed 1q' prevents false positives on HP-UX, which says:
# nm: unknown option "B" ignored
# Tru64's nm complains that /dev/null is an invalid object file
- case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
- */dev/null* | *'Invalid file or object type'*)
+ # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+ case $build_os in
+ mingw*) lt_bad_file=conftest.nm/nofile ;;
+ *) lt_bad_file=/dev/null ;;
+ esac
+ case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+ *$lt_bad_file* | *'Invalid file or object type'*)
lt_cv_path_NM="$tmp_nm -B"
- break
+ break 2
;;
*)
case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
*/dev/null*)
lt_cv_path_NM="$tmp_nm -p"
- break
+ break 2
;;
*)
lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
@@ -3394,21 +3717,21 @@ else
esac
fi
done
- IFS="$lt_save_ifs"
+ IFS=$lt_save_ifs
done
: ${lt_cv_path_NM=no}
fi])
-if test "$lt_cv_path_NM" != "no"; then
- NM="$lt_cv_path_NM"
+if test no != "$lt_cv_path_NM"; then
+ NM=$lt_cv_path_NM
else
# Didn't find any BSD compatible name lister, look for dumpbin.
if test -n "$DUMPBIN"; then :
# Let the user override the test.
else
AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
- case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+ case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
*COFF*)
- DUMPBIN="$DUMPBIN -symbols"
+ DUMPBIN="$DUMPBIN -symbols -headers"
;;
*)
DUMPBIN=:
@@ -3416,8 +3739,8 @@ else
esac
fi
AC_SUBST([DUMPBIN])
- if test "$DUMPBIN" != ":"; then
- NM="$DUMPBIN"
+ if test : != "$DUMPBIN"; then
+ NM=$DUMPBIN
fi
fi
test -z "$NM" && NM=nm
@@ -3463,8 +3786,8 @@ lt_cv_sharedlib_from_linklib_cmd,
case $host_os in
cygwin* | mingw* | pw32* | cegcc*)
- # two different shell functions defined in ltmain.sh
- # decide which to use based on capabilities of $DLLTOOL
+ # two different shell functions defined in ltmain.sh;
+ # decide which one to use based on capabilities of $DLLTOOL
case `$DLLTOOL --help 2>&1` in
*--identify-strict*)
lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
@@ -3476,7 +3799,7 @@ cygwin* | mingw* | pw32* | cegcc*)
;;
*)
# fallback: assume linklib IS sharedlib
- lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+ lt_cv_sharedlib_from_linklib_cmd=$ECHO
;;
esac
])
@@ -3503,13 +3826,28 @@ AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool
lt_cv_path_mainfest_tool=yes
fi
rm -f conftest*])
-if test "x$lt_cv_path_mainfest_tool" != xyes; then
+if test yes != "$lt_cv_path_mainfest_tool"; then
MANIFEST_TOOL=:
fi
_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
])# _LT_PATH_MANIFEST_TOOL
+# _LT_DLL_DEF_P([FILE])
+# ---------------------
+# True iff FILE is a Windows DLL '.def' file.
+# Keep in sync with func_dll_def_p in the libtool script
+AC_DEFUN([_LT_DLL_DEF_P],
+[dnl
+ test DEF = "`$SED -n dnl
+ -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace
+ -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments
+ -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl
+ -e q dnl Only consider the first "real" line
+ $1`" dnl
+])# _LT_DLL_DEF_P
+
+
# LT_LIB_M
# --------
# check for math library
@@ -3521,11 +3859,11 @@ case $host in
# These system don't have libm, or don't need it
;;
*-ncr-sysv4.3*)
- AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+ AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw)
AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
;;
*)
- AC_CHECK_LIB(m, cos, LIBM="-lm")
+ AC_CHECK_LIB(m, cos, LIBM=-lm)
;;
esac
AC_SUBST([LIBM])
@@ -3544,7 +3882,7 @@ m4_defun([_LT_COMPILER_NO_RTTI],
_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
case $cc_basename in
nvcc*)
_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
@@ -3596,7 +3934,7 @@ cygwin* | mingw* | pw32* | cegcc*)
symcode='[[ABCDGISTW]]'
;;
hpux*)
- if test "$host_cpu" = ia64; then
+ if test ia64 = "$host_cpu"; then
symcode='[[ABCDEGRST]]'
fi
;;
@@ -3629,14 +3967,44 @@ case `$NM -V 2>&1` in
symcode='[[ABCDGIRSTW]]' ;;
esac
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ # Gets list of data symbols to import.
+ lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+ # Adjust the below global symbol transforms to fixup imported variables.
+ lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+ lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'"
+ lt_c_name_lib_hook="\
+ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\
+ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'"
+else
+ # Disable hooks by default.
+ lt_cv_sys_global_symbol_to_import=
+ lt_cdecl_hook=
+ lt_c_name_hook=
+ lt_c_name_lib_hook=
+fi
+
# Transform an extracted symbol line into a proper C declaration.
# Some systems (esp. on ia64) link data and code symbols differently,
# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+lt_cv_sys_global_symbol_to_cdecl="sed -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'"
# Handle CRLF in mingw tool chain
opt_cr=
@@ -3654,20 +4022,24 @@ for ac_symprfx in "" "_"; do
# Write the raw and C identifiers.
if test "$lt_cv_nm_interface" = "MS dumpbin"; then
- # Fake it for dumpbin and say T for any non-static function
- # and D for any global variable.
+ # Fake it for dumpbin and say T for any non-static function,
+ # D for any global variable and I for any imported variable.
# Also find C++ and __fastcall symbols from MSVC++,
# which start with @ or ?.
lt_cv_sys_global_symbol_pipe="$AWK ['"\
" {last_section=section; section=\$ 3};"\
+" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
" \$ 0!~/External *\|/{next};"\
" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
" {if(hide[section]) next};"\
-" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-" s[1]~/^[@?]/{print s[1], s[1]; next};"\
-" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
" ' prfx=^$ac_symprfx]"
else
lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
@@ -3707,11 +4079,11 @@ _LT_EOF
if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
cat <<_LT_EOF > conftest.$ac_ext
/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
relocations are performed -- see ld's documentation on pseudo-relocs. */
# define LT@&t@_DLSYM_CONST
-#elif defined(__osf__)
+#elif defined __osf__
/* This system does not cope well with relocations in const data. */
# define LT@&t@_DLSYM_CONST
#else
@@ -3737,7 +4109,7 @@ lt__PROGRAM__LTX_preloaded_symbols[[]] =
{
{ "@PROGRAM@", (void *) 0 },
_LT_EOF
- $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+ $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
cat <<\_LT_EOF >> conftest.$ac_ext
{0, (void *) 0}
};
@@ -3757,9 +4129,9 @@ _LT_EOF
mv conftest.$ac_objext conftstm.$ac_objext
lt_globsym_save_LIBS=$LIBS
lt_globsym_save_CFLAGS=$CFLAGS
- LIBS="conftstm.$ac_objext"
+ LIBS=conftstm.$ac_objext
CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
- if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+ if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then
pipe_works=yes
fi
LIBS=$lt_globsym_save_LIBS
@@ -3780,7 +4152,7 @@ _LT_EOF
rm -rf conftest* conftst*
# Do not use the global_symbol_pipe unless it works.
- if test "$pipe_works" = yes; then
+ if test yes = "$pipe_works"; then
break
else
lt_cv_sys_global_symbol_pipe=
@@ -3807,12 +4179,16 @@ _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
[Take the output of nm and produce a listing of raw symbols and C names])
_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
[Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1],
+ [Transform the output of nm into a list of symbols to manually relocate])
_LT_DECL([global_symbol_to_c_name_address],
[lt_cv_sys_global_symbol_to_c_name_address], [1],
[Transform the output of nm in a C name address pair])
_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
[lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
[Transform the output of nm in a C name address pair when lib prefix is needed])
+_LT_DECL([nm_interface], [lt_cv_nm_interface], [1],
+ [The name lister interface])
_LT_DECL([], [nm_file_list_spec], [1],
[Specify filename containing input files for $NM])
]) # _LT_CMD_GLOBAL_SYMBOLS
@@ -3828,17 +4204,18 @@ _LT_TAGVAR(lt_prog_compiler_static, $1)=
m4_if([$1], [CXX], [
# C++ specific cases for pic, static, wl, etc.
- if test "$GXX" = yes; then
+ if test yes = "$GXX"; then
_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
case $host_os in
aix*)
# All AIX code is PIC.
- if test "$host_cpu" = ia64; then
+ if test ia64 = "$host_cpu"; then
# AIX 5 now supports IA64 processor
_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
fi
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
;;
amigaos*)
@@ -3849,8 +4226,8 @@ m4_if([$1], [CXX], [
;;
m68k)
# FIXME: we need at least 68020 code to build shared libraries, but
- # adding the `-m68020' flag to GCC prevents building anything better,
- # like `-m68040'.
+ # adding the '-m68020' flag to GCC prevents building anything better,
+ # like '-m68040'.
_LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
;;
esac
@@ -3866,6 +4243,11 @@ m4_if([$1], [CXX], [
# (--disable-auto-import) libraries
m4_if([$1], [GCJ], [],
[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+ case $host_os in
+ os2*)
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+ ;;
+ esac
;;
darwin* | rhapsody*)
# PIC is the default on this platform
@@ -3915,7 +4297,7 @@ m4_if([$1], [CXX], [
case $host_os in
aix[[4-9]]*)
# All AIX code is PIC.
- if test "$host_cpu" = ia64; then
+ if test ia64 = "$host_cpu"; then
# AIX 5 now supports IA64 processor
_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
else
@@ -3956,14 +4338,14 @@ m4_if([$1], [CXX], [
case $cc_basename in
CC*)
_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
- if test "$host_cpu" != ia64; then
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
+ if test ia64 != "$host_cpu"; then
_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
fi
;;
aCC*)
_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
case $host_cpu in
hppa*64*|ia64*)
# +Z the default
@@ -3992,7 +4374,7 @@ m4_if([$1], [CXX], [
;;
esac
;;
- linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
case $cc_basename in
KCC*)
# KAI C++ Compiler
@@ -4000,7 +4382,7 @@ m4_if([$1], [CXX], [
_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
;;
ecpc* )
- # old Intel C++ for x86_64 which still supported -KPIC.
+ # old Intel C++ for x86_64, which still supported -KPIC.
_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
@@ -4145,17 +4527,18 @@ m4_if([$1], [CXX], [
fi
],
[
- if test "$GCC" = yes; then
+ if test yes = "$GCC"; then
_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
case $host_os in
aix*)
# All AIX code is PIC.
- if test "$host_cpu" = ia64; then
+ if test ia64 = "$host_cpu"; then
# AIX 5 now supports IA64 processor
_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
fi
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
;;
amigaos*)
@@ -4166,8 +4549,8 @@ m4_if([$1], [CXX], [
;;
m68k)
# FIXME: we need at least 68020 code to build shared libraries, but
- # adding the `-m68020' flag to GCC prevents building anything better,
- # like `-m68040'.
+ # adding the '-m68020' flag to GCC prevents building anything better,
+ # like '-m68040'.
_LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
;;
esac
@@ -4184,6 +4567,11 @@ m4_if([$1], [CXX], [
# (--disable-auto-import) libraries
m4_if([$1], [GCJ], [],
[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+ case $host_os in
+ os2*)
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+ ;;
+ esac
;;
darwin* | rhapsody*)
@@ -4244,7 +4632,9 @@ m4_if([$1], [CXX], [
case $cc_basename in
nvcc*) # Cuda Compiler Driver 2.2
_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
- _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Xcompiler -fPIC'
+ if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)"
+ fi
;;
esac
else
@@ -4252,7 +4642,7 @@ m4_if([$1], [CXX], [
case $host_os in
aix*)
_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
- if test "$host_cpu" = ia64; then
+ if test ia64 = "$host_cpu"; then
# AIX 5 now supports IA64 processor
_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
else
@@ -4260,11 +4650,30 @@ m4_if([$1], [CXX], [
fi
;;
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+ case $cc_basename in
+ nagfor*)
+ # NAG Fortran compiler
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ esac
+ ;;
+
mingw* | cygwin* | pw32* | os2* | cegcc*)
# This hack is so that the source file can tell whether it is being
# built for inclusion in a dll (and should export symbols for example).
m4_if([$1], [GCJ], [],
[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+ case $host_os in
+ os2*)
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+ ;;
+ esac
;;
hpux9* | hpux10* | hpux11*)
@@ -4280,7 +4689,7 @@ m4_if([$1], [CXX], [
;;
esac
# Is there a better lt_prog_compiler_static that works with the bundled CC?
- _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
;;
irix5* | irix6* | nonstopux*)
@@ -4289,9 +4698,9 @@ m4_if([$1], [CXX], [
_LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
;;
- linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
case $cc_basename in
- # old Intel for x86_64 which still supported -KPIC.
+ # old Intel for x86_64, which still supported -KPIC.
ecc*)
_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
@@ -4316,6 +4725,12 @@ m4_if([$1], [CXX], [
_LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
;;
+ tcc*)
+ # Fabrice Bellard et al's Tiny C Compiler
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
# Portland Group compilers (*not* the Pentium gcc compiler,
# which looks to be a dead project)
@@ -4336,18 +4751,33 @@ m4_if([$1], [CXX], [
;;
*)
case `$CC -V 2>&1 | sed 5q` in
- *Sun\ F* | *Sun*Fortran*)
+ *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*)
# Sun Fortran 8.3 passes all unrecognized flags to the linker
_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
_LT_TAGVAR(lt_prog_compiler_wl, $1)=''
;;
+ *Sun\ F* | *Sun*Fortran*)
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+ ;;
*Sun\ C*)
# Sun C 5.9
_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
;;
+ *Intel*\ [[CF]]*Compiler*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+ *Portland\ Group*)
+ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
esac
;;
esac
@@ -4398,7 +4828,7 @@ m4_if([$1], [CXX], [
;;
sysv4*MP*)
- if test -d /usr/nec ;then
+ if test -d /usr/nec; then
_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
fi
@@ -4427,7 +4857,7 @@ m4_if([$1], [CXX], [
fi
])
case $host_os in
- # For platforms which do not support PIC, -DPIC is meaningless:
+ # For platforms that do not support PIC, -DPIC is meaningless:
*djgpp*)
_LT_TAGVAR(lt_prog_compiler_pic, $1)=
;;
@@ -4493,21 +4923,27 @@ m4_if([$1], [CXX], [
case $host_os in
aix[[4-9]]*)
# If we're using GNU nm, then we don't want the "-C" option.
- # -C means demangle to AIX nm, but means don't demangle with GNU nm
- # Also, AIX nm treats weak defined symbols like other global defined
- # symbols, whereas GNU nm marks them as "W".
+ # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+ # Without the "-l" option, or with the "-B" option, AIX nm treats
+ # weak defined symbols like other global defined symbols, whereas
+ # GNU nm marks them as "W".
+ # While the 'weak' keyword is ignored in the Export File, we need
+ # it in the Import File for the 'aix-soname' feature, so we have
+ # to replace the "-B" option with "-P" for AIX nm.
if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
else
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+ _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
fi
;;
pw32*)
- _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+ _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds
;;
cygwin* | mingw* | cegcc*)
case $cc_basename in
- cl*) ;;
+ cl*)
+ _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+ ;;
*)
_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
_LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
@@ -4532,7 +4968,6 @@ m4_if([$1], [CXX], [
_LT_TAGVAR(hardcode_direct, $1)=no
_LT_TAGVAR(hardcode_direct_absolute, $1)=no
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
- _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
_LT_TAGVAR(hardcode_libdir_separator, $1)=
_LT_TAGVAR(hardcode_minus_L, $1)=no
_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
@@ -4548,9 +4983,9 @@ m4_if([$1], [CXX], [
# included in the symbol list
_LT_TAGVAR(include_expsyms, $1)=
# exclude_expsyms can be an extended regexp of symbols to exclude
- # it will be wrapped by ` (' and `)$', so one must not match beginning or
- # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
- # as well as any symbol that contains `d'.
+ # it will be wrapped by ' (' and ')$', so one must not match beginning or
+ # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+ # as well as any symbol that contains 'd'.
_LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
# platforms (ab)use it in PIC code, but their linkers get confused if
@@ -4566,7 +5001,7 @@ dnl Note also adjust exclude_expsyms for C++ above.
# FIXME: the MSVC++ port hasn't been tested in a loooong time
# When not using gcc, we currently assume that we are using
# Microsoft Visual C++.
- if test "$GCC" != yes; then
+ if test yes != "$GCC"; then
with_gnu_ld=no
fi
;;
@@ -4574,7 +5009,7 @@ dnl Note also adjust exclude_expsyms for C++ above.
# we just hope/assume this is gcc and not c89 (= MSVC++)
with_gnu_ld=yes
;;
- openbsd*)
+ openbsd* | bitrig*)
with_gnu_ld=no
;;
esac
@@ -4584,7 +5019,7 @@ dnl Note also adjust exclude_expsyms for C++ above.
# On some targets, GNU ld is compatible enough with the native linker
# that we're better off using the native interface for both.
lt_use_gnu_ld_interface=no
- if test "$with_gnu_ld" = yes; then
+ if test yes = "$with_gnu_ld"; then
case $host_os in
aix*)
# The AIX port of GNU ld has always aspired to compatibility
@@ -4606,24 +5041,24 @@ dnl Note also adjust exclude_expsyms for C++ above.
esac
fi
- if test "$lt_use_gnu_ld_interface" = yes; then
+ if test yes = "$lt_use_gnu_ld_interface"; then
# If archive_cmds runs LD, not CC, wlarc should be empty
- wlarc='${wl}'
+ wlarc='$wl'
# Set some defaults for GNU ld with shared library support. These
# are reset later if shared libraries are not supported. Putting them
# here allows them to be overridden if necessary.
runpath_var=LD_RUN_PATH
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
# ancient GNU ld didn't support --whole-archive et. al.
if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
- _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
else
_LT_TAGVAR(whole_archive_flag_spec, $1)=
fi
supports_anon_versioning=no
- case `$LD -v 2>&1` in
+ case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in
*GNU\ gold*) supports_anon_versioning=yes ;;
*\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
*\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
@@ -4636,7 +5071,7 @@ dnl Note also adjust exclude_expsyms for C++ above.
case $host_os in
aix[[3-9]]*)
# On AIX/PPC, the GNU linker is very broken
- if test "$host_cpu" != ia64; then
+ if test ia64 != "$host_cpu"; then
_LT_TAGVAR(ld_shlibs, $1)=no
cat <<_LT_EOF 1>&2
@@ -4655,7 +5090,7 @@ _LT_EOF
case $host_cpu in
powerpc)
# see comment about AmigaOS4 .so support
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
_LT_TAGVAR(archive_expsym_cmds, $1)=''
;;
m68k)
@@ -4671,7 +5106,7 @@ _LT_EOF
_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
# support --undefined. This deserves some investigation. FIXME
- _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
else
_LT_TAGVAR(ld_shlibs, $1)=no
fi
@@ -4681,7 +5116,7 @@ _LT_EOF
# _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
# as there is no search path for DLLs.
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols'
_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
_LT_TAGVAR(always_export_symbols, $1)=no
_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
@@ -4689,61 +5124,89 @@ _LT_EOF
_LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
- # If the export-symbols file already is a .def file (1st line
- # is EXPORTS), use it as is; otherwise, prepend...
- _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
- cp $export_symbols $output_objdir/$soname.def;
- else
- echo EXPORTS > $output_objdir/$soname.def;
- cat $export_symbols >> $output_objdir/$soname.def;
- fi~
- $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file, use it as
+ # is; otherwise, prepend EXPORTS...
+ _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
else
_LT_TAGVAR(ld_shlibs, $1)=no
fi
;;
haiku*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
_LT_TAGVAR(link_all_deplibs, $1)=yes
;;
+ os2*)
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ shrext_cmds=.dll
+ _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ ;;
+
interix[[3-9]]*)
_LT_TAGVAR(hardcode_direct, $1)=no
_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
# Instead, shared libraries are loaded at an image base (0x10000000 by
# default) and relocated if they conflict, which is a slow very memory
# consuming and fragmenting process. To avoid this, we pick a random,
# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
# time. Moving up from 0x10000000 also allows more sbrk(2) space.
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
;;
gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
tmp_diet=no
- if test "$host_os" = linux-dietlibc; then
+ if test linux-dietlibc = "$host_os"; then
case $cc_basename in
diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn)
esac
fi
if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
- && test "$tmp_diet" = no
+ && test no = "$tmp_diet"
then
tmp_addflag=' $pic_flag'
tmp_sharedflag='-shared'
case $cc_basename,$host_cpu in
pgcc*) # Portland Group C compiler
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
tmp_addflag=' $pic_flag'
;;
pgf77* | pgf90* | pgf95* | pgfortran*)
# Portland Group f77 and f90 compilers
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
tmp_addflag=' $pic_flag -Mnomain' ;;
ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
tmp_addflag=' -i_dynamic' ;;
@@ -4754,43 +5217,47 @@ _LT_EOF
lf95*) # Lahey Fortran 8.1
_LT_TAGVAR(whole_archive_flag_spec, $1)=
tmp_sharedflag='--shared' ;;
+ nagfor*) # NAGFOR 5.3
+ tmp_sharedflag='-Wl,-shared' ;;
xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
tmp_sharedflag='-qmkshrobj'
tmp_addflag= ;;
nvcc*) # Cuda Compiler Driver 2.2
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
_LT_TAGVAR(compiler_needs_object, $1)=yes
;;
esac
case `$CC -V 2>&1 | sed 5q` in
*Sun\ C*) # Sun C 5.9
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
_LT_TAGVAR(compiler_needs_object, $1)=yes
tmp_sharedflag='-G' ;;
*Sun\ F*) # Sun Fortran 8.3
tmp_sharedflag='-G' ;;
esac
- _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
- if test "x$supports_anon_versioning" = xyes; then
+ if test yes = "$supports_anon_versioning"; then
_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
- echo "local: *; };" >> $output_objdir/$libname.ver~
- $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
fi
case $cc_basename in
+ tcc*)
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic'
+ ;;
xlf* | bgf* | bgxlf* | mpixlf*)
# IBM XL Fortran 10.1 on PPC cannot create shared libs itself
_LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
- _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
_LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
- if test "x$supports_anon_versioning" = xyes; then
+ if test yes = "$supports_anon_versioning"; then
_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
- echo "local: *; };" >> $output_objdir/$libname.ver~
- $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
fi
;;
esac
@@ -4804,8 +5271,8 @@ _LT_EOF
_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
wlarc=
else
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
fi
;;
@@ -4823,8 +5290,8 @@ _LT_EOF
_LT_EOF
elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
else
_LT_TAGVAR(ld_shlibs, $1)=no
fi
@@ -4836,7 +5303,7 @@ _LT_EOF
_LT_TAGVAR(ld_shlibs, $1)=no
cat <<_LT_EOF 1>&2
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
*** reliably create shared libraries on SCO systems. Therefore, libtool
*** is disabling shared libraries support. We urge you to upgrade GNU
*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
@@ -4851,9 +5318,9 @@ _LT_EOF
# DT_RUNPATH tag from executables and libraries. But doing so
# requires that you compile everything twice, which is a pain.
if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
else
_LT_TAGVAR(ld_shlibs, $1)=no
fi
@@ -4870,15 +5337,15 @@ _LT_EOF
*)
if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
else
_LT_TAGVAR(ld_shlibs, $1)=no
fi
;;
esac
- if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
+ if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then
runpath_var=
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
_LT_TAGVAR(export_dynamic_flag_spec, $1)=
@@ -4894,7 +5361,7 @@ _LT_EOF
# Note: this linker hardcodes the directories in LIBPATH if there
# are no directories specified by -L.
_LT_TAGVAR(hardcode_minus_L, $1)=yes
- if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+ if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
# Neither direct hardcoding nor static linking is supported with a
# broken collect2.
_LT_TAGVAR(hardcode_direct, $1)=unsupported
@@ -4902,34 +5369,57 @@ _LT_EOF
;;
aix[[4-9]]*)
- if test "$host_cpu" = ia64; then
+ if test ia64 = "$host_cpu"; then
# On IA64, the linker does run time linking by default, so we don't
# have to do anything special.
aix_use_runtimelinking=no
exp_sym_flag='-Bexport'
- no_entry_flag=""
+ no_entry_flag=
else
# If we're using GNU nm, then we don't want the "-C" option.
- # -C means demangle to AIX nm, but means don't demangle with GNU nm
- # Also, AIX nm treats weak defined symbols like other global
- # defined symbols, whereas GNU nm marks them as "W".
+ # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+ # Without the "-l" option, or with the "-B" option, AIX nm treats
+ # weak defined symbols like other global defined symbols, whereas
+ # GNU nm marks them as "W".
+ # While the 'weak' keyword is ignored in the Export File, we need
+ # it in the Import File for the 'aix-soname' feature, so we have
+ # to replace the "-B" option with "-P" for AIX nm.
if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+ _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
else
- _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+ _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
fi
aix_use_runtimelinking=no
# Test if we are trying to use run time linking or normal
# AIX style linking. If -brtl is somewhere in LDFLAGS, we
- # need to do runtime linking.
+ # have runtime linking enabled, and use it for executables.
+ # For shared libraries, we enable/disable runtime linking
+ # depending on the kind of the shared library created -
+ # when "with_aix_soname,aix_use_runtimelinking" is:
+ # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables
+ # "aix,yes" lib.so shared, rtl:yes, for executables
+ # lib.a static archive
+ # "both,no" lib.so.V(shr.o) shared, rtl:yes
+ # lib.a(lib.so.V) shared, rtl:no, for executables
+ # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a(lib.so.V) shared, rtl:no
+ # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a static archive
case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
for ld_flag in $LDFLAGS; do
- if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
aix_use_runtimelinking=yes
break
fi
done
+ if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # With aix-soname=svr4, we create the lib.so.V shared archives only,
+ # so we don't have lib.a shared libs to link our executables.
+ # We have to force runtime linking in this case.
+ aix_use_runtimelinking=yes
+ LDFLAGS="$LDFLAGS -Wl,-brtl"
+ fi
;;
esac
@@ -4948,13 +5438,21 @@ _LT_EOF
_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
_LT_TAGVAR(link_all_deplibs, $1)=yes
- _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+ _LT_TAGVAR(file_list_spec, $1)='$wl-f,'
+ case $with_aix_soname,$aix_use_runtimelinking in
+ aix,*) ;; # traditional, no import file
+ svr4,* | *,yes) # use import file
+ # The Import File defines what to hardcode.
+ _LT_TAGVAR(hardcode_direct, $1)=no
+ _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+ ;;
+ esac
- if test "$GCC" = yes; then
+ if test yes = "$GCC"; then
case $host_os in aix4.[[012]]|aix4.[[012]].*)
# We only want to do this on AIX 4.2 and lower, the check
# below for broken collect2 doesn't work under 4.3+
- collect2name=`${CC} -print-prog-name=collect2`
+ collect2name=`$CC -print-prog-name=collect2`
if test -f "$collect2name" &&
strings "$collect2name" | $GREP resolve_lib_name >/dev/null
then
@@ -4973,61 +5471,80 @@ _LT_EOF
;;
esac
shared_flag='-shared'
- if test "$aix_use_runtimelinking" = yes; then
- shared_flag="$shared_flag "'${wl}-G'
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag="$shared_flag "'$wl-G'
fi
+ # Need to ensure runtime linking is disabled for the traditional
+ # shared library, or the linker may eventually find shared libraries
+ # /with/ Import File - we do not want to mix them.
+ shared_flag_aix='-shared'
+ shared_flag_svr4='-shared $wl-G'
else
# not using gcc
- if test "$host_cpu" = ia64; then
+ if test ia64 = "$host_cpu"; then
# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
# chokes on -Wl,-G. The following line is correct:
shared_flag='-G'
else
- if test "$aix_use_runtimelinking" = yes; then
- shared_flag='${wl}-G'
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag='$wl-G'
else
- shared_flag='${wl}-bM:SRE'
+ shared_flag='$wl-bM:SRE'
fi
+ shared_flag_aix='$wl-bM:SRE'
+ shared_flag_svr4='$wl-G'
fi
fi
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall'
# It seems that -bexpall does not export symbols beginning with
# underscore (_), so it is better to generate a list of symbols to export.
_LT_TAGVAR(always_export_symbols, $1)=yes
- if test "$aix_use_runtimelinking" = yes; then
+ if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
# Warning - without using the other runtime loading flags (-brtl),
# -berok will link without error, but may produce a broken library.
_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
# Determine the default libpath from the value encoded in an
# empty executable.
_LT_SYS_MODULE_PATH_AIX([$1])
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
else
- if test "$host_cpu" = ia64; then
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+ if test ia64 = "$host_cpu"; then
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib'
_LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
- _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+ _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
else
# Determine the default libpath from the value encoded in an
# empty executable.
_LT_SYS_MODULE_PATH_AIX([$1])
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
# Warning - without using the other run time loading flags,
# -berok will link without error, but may produce a broken library.
- _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
- _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
- if test "$with_gnu_ld" = yes; then
+ _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok'
+ _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok'
+ if test yes = "$with_gnu_ld"; then
# We only use this code for GNU lds that support --whole-archive.
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
else
# Exported symbols can be pulled into shared objects from archives
_LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
fi
_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
- # This is similar to how AIX traditionally builds its shared libraries.
- _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+ # -brtl affects multiple linker settings, -berok does not and is overridden later
+ compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`'
+ if test svr4 != "$with_aix_soname"; then
+ # This is similar to how AIX traditionally builds its shared libraries.
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+ fi
+ if test aix != "$with_aix_soname"; then
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+ else
+ # used by -dlpreopen to get the symbols
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir'
+ fi
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d'
fi
fi
;;
@@ -5036,7 +5553,7 @@ _LT_EOF
case $host_cpu in
powerpc)
# see comment about AmigaOS4 .so support
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
_LT_TAGVAR(archive_expsym_cmds, $1)=''
;;
m68k)
@@ -5066,35 +5583,37 @@ _LT_EOF
# Tell ltmain to make .lib files, not .a files.
libext=lib
# Tell ltmain to make .dll files, not .so files.
- shrext_cmds=".dll"
+ shrext_cmds=.dll
# FIXME: Setting linknames here is a bad hack.
- _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
- _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
- sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
- else
- sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
- fi~
- $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
- linknames='
+ _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+ _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+ cp "$export_symbols" "$output_objdir/$soname.def";
+ echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+ else
+ $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+ fi~
+ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ linknames='
# The linker will not automatically build a static lib if we build a DLL.
# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
# Don't use ranlib
_LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
_LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
- lt_tool_outputfile="@TOOL_OUTPUT@"~
- case $lt_outputfile in
- *.exe|*.EXE) ;;
- *)
- lt_outputfile="$lt_outputfile.exe"
- lt_tool_outputfile="$lt_tool_outputfile.exe"
- ;;
- esac~
- if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
- $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
- $RM "$lt_outputfile.manifest";
- fi'
+ lt_tool_outputfile="@TOOL_OUTPUT@"~
+ case $lt_outputfile in
+ *.exe|*.EXE) ;;
+ *)
+ lt_outputfile=$lt_outputfile.exe
+ lt_tool_outputfile=$lt_tool_outputfile.exe
+ ;;
+ esac~
+ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+ $RM "$lt_outputfile.manifest";
+ fi'
;;
*)
# Assume MSVC wrapper
@@ -5103,7 +5622,7 @@ _LT_EOF
# Tell ltmain to make .lib files, not .a files.
libext=lib
# Tell ltmain to make .dll files, not .so files.
- shrext_cmds=".dll"
+ shrext_cmds=.dll
# FIXME: Setting linknames here is a bad hack.
_LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
# The linker will automatically build a .lib file if we build a DLL.
@@ -5125,10 +5644,6 @@ _LT_EOF
_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
;;
- freebsd1*)
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
-
# FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
# support. Future versions do this automatically, but an explicit c++rt0.o
# does not break anything, and helps significantly (at the cost of a little
@@ -5141,7 +5656,7 @@ _LT_EOF
;;
# Unfortunately, older versions of FreeBSD 2 do not have this feature.
- freebsd2*)
+ freebsd2.*)
_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
_LT_TAGVAR(hardcode_direct, $1)=yes
_LT_TAGVAR(hardcode_minus_L, $1)=yes
@@ -5157,34 +5672,33 @@ _LT_EOF
;;
hpux9*)
- if test "$GCC" = yes; then
- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ if test yes = "$GCC"; then
+ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
else
- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
fi
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
_LT_TAGVAR(hardcode_libdir_separator, $1)=:
_LT_TAGVAR(hardcode_direct, $1)=yes
# hardcode_minus_L: Not really in the search PATH,
# but as the default location of the library.
_LT_TAGVAR(hardcode_minus_L, $1)=yes
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
;;
hpux10*)
- if test "$GCC" = yes && test "$with_gnu_ld" = no; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ if test yes,no = "$GCC,$with_gnu_ld"; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
else
_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
fi
- if test "$with_gnu_ld" = no; then
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
- _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
+ if test no = "$with_gnu_ld"; then
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
_LT_TAGVAR(hardcode_libdir_separator, $1)=:
_LT_TAGVAR(hardcode_direct, $1)=yes
_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
# hardcode_minus_L: Not really in the search PATH,
# but as the default location of the library.
_LT_TAGVAR(hardcode_minus_L, $1)=yes
@@ -5192,25 +5706,25 @@ _LT_EOF
;;
hpux11*)
- if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+ if test yes,no = "$GCC,$with_gnu_ld"; then
case $host_cpu in
hppa*64*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
;;
ia64*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
;;
*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
;;
esac
else
case $host_cpu in
hppa*64*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
;;
ia64*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
;;
*)
m4_if($1, [], [
@@ -5218,14 +5732,14 @@ _LT_EOF
# (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
_LT_LINKER_OPTION([if $CC understands -b],
_LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
- [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
+ [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
[_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
- [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
+ [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
;;
esac
fi
- if test "$with_gnu_ld" = no; then
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ if test no = "$with_gnu_ld"; then
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
_LT_TAGVAR(hardcode_libdir_separator, $1)=:
case $host_cpu in
@@ -5236,7 +5750,7 @@ _LT_EOF
*)
_LT_TAGVAR(hardcode_direct, $1)=yes
_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
# hardcode_minus_L: Not really in the search PATH,
# but as the default location of the library.
@@ -5247,16 +5761,16 @@ _LT_EOF
;;
irix5* | irix6* | nonstopux*)
- if test "$GCC" = yes; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ if test yes = "$GCC"; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
# Try to use the -exported_symbol ld option, if it does not
# work, assume that -exports_file does not work either and
# implicitly export all symbols.
# This should be the same for all languages, so no per-tag cache variable.
AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
[lt_cv_irix_exported_symbol],
- [save_LDFLAGS="$LDFLAGS"
- LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+ [save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
AC_LINK_IFELSE(
[AC_LANG_SOURCE(
[AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
@@ -5269,21 +5783,31 @@ _LT_EOF
end]])])],
[lt_cv_irix_exported_symbol=yes],
[lt_cv_irix_exported_symbol=no])
- LDFLAGS="$save_LDFLAGS"])
- if test "$lt_cv_irix_exported_symbol" = yes; then
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+ LDFLAGS=$save_LDFLAGS])
+ if test yes = "$lt_cv_irix_exported_symbol"; then
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
fi
else
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
fi
_LT_TAGVAR(archive_cmds_need_lc, $1)='no'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
_LT_TAGVAR(hardcode_libdir_separator, $1)=:
_LT_TAGVAR(inherit_rpath, $1)=yes
_LT_TAGVAR(link_all_deplibs, $1)=yes
;;
+ linux*)
+ case $cc_basename in
+ tcc*)
+ # Fabrice Bellard et al's Tiny C Compiler
+ _LT_TAGVAR(ld_shlibs, $1)=yes
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
netbsd*)
if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
@@ -5298,7 +5822,7 @@ _LT_EOF
newsos6)
_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
_LT_TAGVAR(hardcode_direct, $1)=yes
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
_LT_TAGVAR(hardcode_libdir_separator, $1)=:
_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
;;
@@ -5306,27 +5830,19 @@ _LT_EOF
*nto* | *qnx*)
;;
- openbsd*)
+ openbsd* | bitrig*)
if test -f /usr/libexec/ld.so; then
_LT_TAGVAR(hardcode_direct, $1)=yes
_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
else
- case $host_os in
- openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
- _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
- ;;
- *)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
- ;;
- esac
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
fi
else
_LT_TAGVAR(ld_shlibs, $1)=no
@@ -5337,33 +5853,53 @@ _LT_EOF
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
_LT_TAGVAR(hardcode_minus_L, $1)=yes
_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
- _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
- _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+ shrext_cmds=.dll
+ _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
;;
osf3*)
- if test "$GCC" = yes; then
- _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ if test yes = "$GCC"; then
+ _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
else
_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
fi
_LT_TAGVAR(archive_cmds_need_lc, $1)='no'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
_LT_TAGVAR(hardcode_libdir_separator, $1)=:
;;
osf4* | osf5*) # as osf3* with the addition of -msym flag
- if test "$GCC" = yes; then
- _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ if test yes = "$GCC"; then
+ _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
else
_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
- $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
# Both c and cxx compiler support -rpath directly
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
@@ -5374,24 +5910,24 @@ _LT_EOF
solaris*)
_LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
- if test "$GCC" = yes; then
- wlarc='${wl}'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ if test yes = "$GCC"; then
+ wlarc='$wl'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
else
case `$CC -V 2>&1` in
*"Compilers 5.0"*)
wlarc=''
- _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
;;
*)
- wlarc='${wl}'
- _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ wlarc='$wl'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
;;
esac
fi
@@ -5401,11 +5937,11 @@ _LT_EOF
solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
*)
# The compiler driver will combine and reorder linker options,
- # but understands `-z linker_flag'. GCC discards it without `$wl',
+ # but understands '-z linker_flag'. GCC discards it without '$wl',
# but is careful enough not to reorder.
# Supported since Solaris 2.6 (maybe 2.5.1?)
- if test "$GCC" = yes; then
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+ if test yes = "$GCC"; then
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
else
_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
fi
@@ -5415,10 +5951,10 @@ _LT_EOF
;;
sunos4*)
- if test "x$host_vendor" = xsequent; then
+ if test sequent = "$host_vendor"; then
# Use $CC to link under sequent, because it throws in some extra .o
# files that make .init and .fini sections work.
- _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
else
_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
fi
@@ -5467,43 +6003,43 @@ _LT_EOF
;;
sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
- _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+ _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
_LT_TAGVAR(archive_cmds_need_lc, $1)=no
_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
runpath_var='LD_RUN_PATH'
- if test "$GCC" = yes; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ if test yes = "$GCC"; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
else
- _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
fi
;;
sysv5* | sco3.2v5* | sco5v6*)
- # Note: We can NOT use -z defs as we might desire, because we do not
+ # Note: We CANNOT use -z defs as we might desire, because we do not
# link with -lc, and that would cause any symbols used from libc to
# always be unresolved, which means just about no library would
# ever link correctly. If we're not using GNU ld we use -z text
# though, which does catch some bad symbols but isn't as heavy-handed
# as -z defs.
- _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
- _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+ _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+ _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs'
_LT_TAGVAR(archive_cmds_need_lc, $1)=no
_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir'
_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
_LT_TAGVAR(link_all_deplibs, $1)=yes
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport'
runpath_var='LD_RUN_PATH'
- if test "$GCC" = yes; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ if test yes = "$GCC"; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
else
- _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
fi
;;
@@ -5518,17 +6054,17 @@ _LT_EOF
;;
esac
- if test x$host_vendor = xsni; then
+ if test sni = "$host_vendor"; then
case $host in
sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym'
;;
esac
fi
fi
])
AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no
_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
@@ -5545,7 +6081,7 @@ x|xyes)
# Assume -lc should be added
_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
- if test "$enable_shared" = yes && test "$GCC" = yes; then
+ if test yes,yes = "$GCC,$enable_shared"; then
case $_LT_TAGVAR(archive_cmds, $1) in
*'~'*)
# FIXME: we may have to deal with multi-command sequences.
@@ -5622,18 +6158,15 @@ _LT_TAGDECL([], [no_undefined_flag], [1],
_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
[Flag to hardcode $libdir into a binary during linking.
This must work even if $libdir does not exist])
-_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1],
- [[If ld is used when linking, flag to hardcode $libdir into a binary
- during linking. This must work even if $libdir does not exist]])
_LT_TAGDECL([], [hardcode_libdir_separator], [1],
[Whether we need a single "-rpath" flag with a separated argument])
_LT_TAGDECL([], [hardcode_direct], [0],
- [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+ [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes
DIR into the resulting binary])
_LT_TAGDECL([], [hardcode_direct_absolute], [0],
- [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+ [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes
DIR into the resulting binary and the resulting library dependency is
- "absolute", i.e impossible to change by setting ${shlibpath_var} if the
+ "absolute", i.e impossible to change by setting $shlibpath_var if the
library is relocated])
_LT_TAGDECL([], [hardcode_minus_L], [0],
[Set to "yes" if using the -LDIR flag during linking hardcodes DIR
@@ -5674,10 +6207,10 @@ dnl [Compiler flag to generate thread safe objects])
# ------------------------
# Ensure that the configuration variables for a C compiler are suitably
# defined. These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
+# the compiler configuration to 'libtool'.
m4_defun([_LT_LANG_C_CONFIG],
[m4_require([_LT_DECL_EGREP])dnl
-lt_save_CC="$CC"
+lt_save_CC=$CC
AC_LANG_PUSH(C)
# Source file extension for C test sources.
@@ -5713,18 +6246,18 @@ if test -n "$compiler"; then
LT_SYS_DLOPEN_SELF
_LT_CMD_STRIPLIB
- # Report which library types will actually be built
+ # Report what library types will actually be built
AC_MSG_CHECKING([if libtool supports shared libraries])
AC_MSG_RESULT([$can_build_shared])
AC_MSG_CHECKING([whether to build shared libraries])
- test "$can_build_shared" = "no" && enable_shared=no
+ test no = "$can_build_shared" && enable_shared=no
# On AIX, shared libraries and static libraries use the same namespace, and
# are all built from PIC.
case $host_os in
aix3*)
- test "$enable_shared" = yes && enable_static=no
+ test yes = "$enable_shared" && enable_static=no
if test -n "$RANLIB"; then
archive_cmds="$archive_cmds~\$RANLIB \$lib"
postinstall_cmds='$RANLIB $lib'
@@ -5732,8 +6265,12 @@ if test -n "$compiler"; then
;;
aix[[4-9]]*)
- if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
- test "$enable_shared" = yes && enable_static=no
+ if test ia64 != "$host_cpu"; then
+ case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+ yes,aix,yes) ;; # shared object as lib.so file only
+ yes,svr4,*) ;; # shared object as lib.so archive member only
+ yes,*) enable_static=no ;; # shared object in lib.a archive as well
+ esac
fi
;;
esac
@@ -5741,13 +6278,13 @@ if test -n "$compiler"; then
AC_MSG_CHECKING([whether to build static libraries])
# Make sure either enable_shared or enable_static is yes.
- test "$enable_shared" = yes || enable_static=yes
+ test yes = "$enable_shared" || enable_static=yes
AC_MSG_RESULT([$enable_static])
_LT_CONFIG($1)
fi
AC_LANG_POP
-CC="$lt_save_CC"
+CC=$lt_save_CC
])# _LT_LANG_C_CONFIG
@@ -5755,14 +6292,14 @@ CC="$lt_save_CC"
# --------------------------
# Ensure that the configuration variables for a C++ compiler are suitably
# defined. These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
+# the compiler configuration to 'libtool'.
m4_defun([_LT_LANG_CXX_CONFIG],
[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
m4_require([_LT_DECL_EGREP])dnl
m4_require([_LT_PATH_MANIFEST_TOOL])dnl
-if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
- ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
- (test "X$CXX" != "Xg++"))) ; then
+if test -n "$CXX" && ( test no != "$CXX" &&
+ ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
+ (test g++ != "$CXX"))); then
AC_PROG_CXXCPP
else
_lt_caught_CXX_error=yes
@@ -5778,7 +6315,6 @@ _LT_TAGVAR(export_dynamic_flag_spec, $1)=
_LT_TAGVAR(hardcode_direct, $1)=no
_LT_TAGVAR(hardcode_direct_absolute, $1)=no
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
_LT_TAGVAR(hardcode_libdir_separator, $1)=
_LT_TAGVAR(hardcode_minus_L, $1)=no
_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
@@ -5805,7 +6341,7 @@ _LT_TAGVAR(objext, $1)=$objext
# the CXX compiler isn't working. Some variables (like enable_shared)
# are currently assumed to apply to all compilers on this platform,
# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
+if test yes != "$_lt_caught_CXX_error"; then
# Code to be used in simple compile tests
lt_simple_compile_test_code="int some_variable = 0;"
@@ -5847,35 +6383,35 @@ if test "$_lt_caught_CXX_error" != yes; then
if test -n "$compiler"; then
# We don't want -fno-exception when compiling C++ code, so set the
# no_builtin_flag separately
- if test "$GXX" = yes; then
+ if test yes = "$GXX"; then
_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
else
_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
fi
- if test "$GXX" = yes; then
+ if test yes = "$GXX"; then
# Set up default GNU C++ configuration
LT_PATH_LD
# Check if GNU C++ uses GNU ld as the underlying linker, since the
# archiving commands below assume that GNU ld is being used.
- if test "$with_gnu_ld" = yes; then
- _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ if test yes = "$with_gnu_ld"; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
# If archive_cmds runs LD, not CC, wlarc should be empty
# XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
# investigate it a little bit more. (MM)
- wlarc='${wl}'
+ wlarc='$wl'
# ancient GNU ld didn't support --whole-archive et. al.
if eval "`$CC -print-prog-name=ld` --help 2>&1" |
$GREP 'no-whole-archive' > /dev/null; then
- _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
else
_LT_TAGVAR(whole_archive_flag_spec, $1)=
fi
@@ -5911,18 +6447,30 @@ if test "$_lt_caught_CXX_error" != yes; then
_LT_TAGVAR(ld_shlibs, $1)=no
;;
aix[[4-9]]*)
- if test "$host_cpu" = ia64; then
+ if test ia64 = "$host_cpu"; then
# On IA64, the linker does run time linking by default, so we don't
# have to do anything special.
aix_use_runtimelinking=no
exp_sym_flag='-Bexport'
- no_entry_flag=""
+ no_entry_flag=
else
aix_use_runtimelinking=no
# Test if we are trying to use run time linking or normal
# AIX style linking. If -brtl is somewhere in LDFLAGS, we
- # need to do runtime linking.
+ # have runtime linking enabled, and use it for executables.
+ # For shared libraries, we enable/disable runtime linking
+ # depending on the kind of the shared library created -
+ # when "with_aix_soname,aix_use_runtimelinking" is:
+ # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables
+ # "aix,yes" lib.so shared, rtl:yes, for executables
+ # lib.a static archive
+ # "both,no" lib.so.V(shr.o) shared, rtl:yes
+ # lib.a(lib.so.V) shared, rtl:no, for executables
+ # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a(lib.so.V) shared, rtl:no
+ # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a static archive
case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
for ld_flag in $LDFLAGS; do
case $ld_flag in
@@ -5932,6 +6480,13 @@ if test "$_lt_caught_CXX_error" != yes; then
;;
esac
done
+ if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # With aix-soname=svr4, we create the lib.so.V shared archives only,
+ # so we don't have lib.a shared libs to link our executables.
+ # We have to force runtime linking in this case.
+ aix_use_runtimelinking=yes
+ LDFLAGS="$LDFLAGS -Wl,-brtl"
+ fi
;;
esac
@@ -5950,13 +6505,21 @@ if test "$_lt_caught_CXX_error" != yes; then
_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
_LT_TAGVAR(link_all_deplibs, $1)=yes
- _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+ _LT_TAGVAR(file_list_spec, $1)='$wl-f,'
+ case $with_aix_soname,$aix_use_runtimelinking in
+ aix,*) ;; # no import file
+ svr4,* | *,yes) # use import file
+ # The Import File defines what to hardcode.
+ _LT_TAGVAR(hardcode_direct, $1)=no
+ _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+ ;;
+ esac
- if test "$GXX" = yes; then
+ if test yes = "$GXX"; then
case $host_os in aix4.[[012]]|aix4.[[012]].*)
# We only want to do this on AIX 4.2 and lower, the check
# below for broken collect2 doesn't work under 4.3+
- collect2name=`${CC} -print-prog-name=collect2`
+ collect2name=`$CC -print-prog-name=collect2`
if test -f "$collect2name" &&
strings "$collect2name" | $GREP resolve_lib_name >/dev/null
then
@@ -5974,64 +6537,84 @@ if test "$_lt_caught_CXX_error" != yes; then
fi
esac
shared_flag='-shared'
- if test "$aix_use_runtimelinking" = yes; then
- shared_flag="$shared_flag "'${wl}-G'
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag=$shared_flag' $wl-G'
fi
+ # Need to ensure runtime linking is disabled for the traditional
+ # shared library, or the linker may eventually find shared libraries
+ # /with/ Import File - we do not want to mix them.
+ shared_flag_aix='-shared'
+ shared_flag_svr4='-shared $wl-G'
else
# not using gcc
- if test "$host_cpu" = ia64; then
+ if test ia64 = "$host_cpu"; then
# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
# chokes on -Wl,-G. The following line is correct:
shared_flag='-G'
else
- if test "$aix_use_runtimelinking" = yes; then
- shared_flag='${wl}-G'
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag='$wl-G'
else
- shared_flag='${wl}-bM:SRE'
+ shared_flag='$wl-bM:SRE'
fi
+ shared_flag_aix='$wl-bM:SRE'
+ shared_flag_svr4='$wl-G'
fi
fi
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall'
# It seems that -bexpall does not export symbols beginning with
# underscore (_), so it is better to generate a list of symbols to
# export.
_LT_TAGVAR(always_export_symbols, $1)=yes
- if test "$aix_use_runtimelinking" = yes; then
+ if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
# Warning - without using the other runtime loading flags (-brtl),
# -berok will link without error, but may produce a broken library.
- _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+ # The "-G" linker flag allows undefined symbols.
+ _LT_TAGVAR(no_undefined_flag, $1)='-bernotok'
# Determine the default libpath from the value encoded in an empty
# executable.
_LT_SYS_MODULE_PATH_AIX([$1])
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
else
- if test "$host_cpu" = ia64; then
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+ if test ia64 = "$host_cpu"; then
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib'
_LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
- _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+ _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
else
# Determine the default libpath from the value encoded in an
# empty executable.
_LT_SYS_MODULE_PATH_AIX([$1])
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
# Warning - without using the other run time loading flags,
# -berok will link without error, but may produce a broken library.
- _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
- _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
- if test "$with_gnu_ld" = yes; then
+ _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok'
+ _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok'
+ if test yes = "$with_gnu_ld"; then
# We only use this code for GNU lds that support --whole-archive.
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
else
# Exported symbols can be pulled into shared objects from archives
_LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
fi
_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
- # This is similar to how AIX traditionally builds its shared
- # libraries.
- _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+ # -brtl affects multiple linker settings, -berok does not and is overridden later
+ compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`'
+ if test svr4 != "$with_aix_soname"; then
+ # This is similar to how AIX traditionally builds its shared
+ # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+ fi
+ if test aix != "$with_aix_soname"; then
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+ else
+ # used by -dlpreopen to get the symbols
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir'
+ fi
+ _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d'
fi
fi
;;
@@ -6041,7 +6624,7 @@ if test "$_lt_caught_CXX_error" != yes; then
_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
# support --undefined. This deserves some investigation. FIXME
- _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
else
_LT_TAGVAR(ld_shlibs, $1)=no
fi
@@ -6069,57 +6652,58 @@ if test "$_lt_caught_CXX_error" != yes; then
# Tell ltmain to make .lib files, not .a files.
libext=lib
# Tell ltmain to make .dll files, not .so files.
- shrext_cmds=".dll"
+ shrext_cmds=.dll
# FIXME: Setting linknames here is a bad hack.
- _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
- _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
- $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
- else
- $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
- fi~
- $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
- linknames='
+ _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+ _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+ cp "$export_symbols" "$output_objdir/$soname.def";
+ echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+ else
+ $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+ fi~
+ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ linknames='
# The linker will not automatically build a static lib if we build a DLL.
# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
# Don't use ranlib
_LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
_LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
- lt_tool_outputfile="@TOOL_OUTPUT@"~
- case $lt_outputfile in
- *.exe|*.EXE) ;;
- *)
- lt_outputfile="$lt_outputfile.exe"
- lt_tool_outputfile="$lt_tool_outputfile.exe"
- ;;
- esac~
- func_to_tool_file "$lt_outputfile"~
- if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
- $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
- $RM "$lt_outputfile.manifest";
- fi'
+ lt_tool_outputfile="@TOOL_OUTPUT@"~
+ case $lt_outputfile in
+ *.exe|*.EXE) ;;
+ *)
+ lt_outputfile=$lt_outputfile.exe
+ lt_tool_outputfile=$lt_tool_outputfile.exe
+ ;;
+ esac~
+ func_to_tool_file "$lt_outputfile"~
+ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+ $RM "$lt_outputfile.manifest";
+ fi'
;;
*)
# g++
# _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
# as there is no search path for DLLs.
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols'
_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
_LT_TAGVAR(always_export_symbols, $1)=no
_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
- # If the export-symbols file already is a .def file (1st line
- # is EXPORTS), use it as is; otherwise, prepend...
- _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
- cp $export_symbols $output_objdir/$soname.def;
- else
- echo EXPORTS > $output_objdir/$soname.def;
- cat $export_symbols >> $output_objdir/$soname.def;
- fi~
- $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file, use it as
+ # is; otherwise, prepend EXPORTS...
+ _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
else
_LT_TAGVAR(ld_shlibs, $1)=no
fi
@@ -6130,6 +6714,34 @@ if test "$_lt_caught_CXX_error" != yes; then
_LT_DARWIN_LINKER_FEATURES($1)
;;
+ os2*)
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+ shrext_cmds=.dll
+ _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ ;;
+
dgux*)
case $cc_basename in
ec++*)
@@ -6148,7 +6760,7 @@ if test "$_lt_caught_CXX_error" != yes; then
esac
;;
- freebsd[[12]]*)
+ freebsd2.*)
# C++ shared libraries reported to be fairly broken before
# switch to ELF
_LT_TAGVAR(ld_shlibs, $1)=no
@@ -6164,18 +6776,15 @@ if test "$_lt_caught_CXX_error" != yes; then
_LT_TAGVAR(ld_shlibs, $1)=yes
;;
- gnu*)
- ;;
-
haiku*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
_LT_TAGVAR(link_all_deplibs, $1)=yes
;;
hpux9*)
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
_LT_TAGVAR(hardcode_libdir_separator, $1)=:
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
_LT_TAGVAR(hardcode_direct, $1)=yes
_LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
# but as the default
@@ -6187,7 +6796,7 @@ if test "$_lt_caught_CXX_error" != yes; then
_LT_TAGVAR(ld_shlibs, $1)=no
;;
aCC*)
- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
@@ -6196,11 +6805,11 @@ if test "$_lt_caught_CXX_error" != yes; then
# explicitly linking system object files so we need to strip them
# from the output so that they don't get included in the library
# dependencies.
- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
;;
*)
- if test "$GXX" = yes; then
- _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ if test yes = "$GXX"; then
+ _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
else
# FIXME: insert proper C++ library support
_LT_TAGVAR(ld_shlibs, $1)=no
@@ -6210,15 +6819,15 @@ if test "$_lt_caught_CXX_error" != yes; then
;;
hpux10*|hpux11*)
- if test $with_gnu_ld = no; then
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ if test no = "$with_gnu_ld"; then
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
_LT_TAGVAR(hardcode_libdir_separator, $1)=:
case $host_cpu in
hppa*64*|ia64*)
;;
*)
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
;;
esac
fi
@@ -6244,13 +6853,13 @@ if test "$_lt_caught_CXX_error" != yes; then
aCC*)
case $host_cpu in
hppa*64*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
;;
ia64*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
;;
*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
;;
esac
# Commands to make compiler produce verbose output that lists
@@ -6261,20 +6870,20 @@ if test "$_lt_caught_CXX_error" != yes; then
# explicitly linking system object files so we need to strip them
# from the output so that they don't get included in the library
# dependencies.
- output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
;;
*)
- if test "$GXX" = yes; then
- if test $with_gnu_ld = no; then
+ if test yes = "$GXX"; then
+ if test no = "$with_gnu_ld"; then
case $host_cpu in
hppa*64*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
;;
ia64*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
;;
*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
;;
esac
fi
@@ -6289,22 +6898,22 @@ if test "$_lt_caught_CXX_error" != yes; then
interix[[3-9]]*)
_LT_TAGVAR(hardcode_direct, $1)=no
_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
# Instead, shared libraries are loaded at an image base (0x10000000 by
# default) and relocated if they conflict, which is a slow very memory
# consuming and fragmenting process. To avoid this, we pick a random,
# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
# time. Moving up from 0x10000000 also allows more sbrk(2) space.
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
;;
irix5* | irix6*)
case $cc_basename in
CC*)
# SGI C++
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
# Archives containing C++ object files must be created using
# "CC -ar", where "CC" is the IRIX C++ compiler. This is
@@ -6313,22 +6922,22 @@ if test "$_lt_caught_CXX_error" != yes; then
_LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
;;
*)
- if test "$GXX" = yes; then
- if test "$with_gnu_ld" = no; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ if test yes = "$GXX"; then
+ if test no = "$with_gnu_ld"; then
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
else
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
fi
fi
_LT_TAGVAR(link_all_deplibs, $1)=yes
;;
esac
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
_LT_TAGVAR(hardcode_libdir_separator, $1)=:
_LT_TAGVAR(inherit_rpath, $1)=yes
;;
- linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
case $cc_basename in
KCC*)
# Kuck and Associates, Inc. (KAI) C++ Compiler
@@ -6336,8 +6945,8 @@ if test "$_lt_caught_CXX_error" != yes; then
# KCC will only create a shared library if the output file
# ends with ".so" (or ".sl" for HP-UX), so rename the library
# to its proper name (with version) after linking.
- _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+ _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
@@ -6346,10 +6955,10 @@ if test "$_lt_caught_CXX_error" != yes; then
# explicitly linking system object files so we need to strip them
# from the output so that they don't get included in the library
# dependencies.
- output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
# Archives containing C++ object files must be created using
# "CC -Bstatic", where "CC" is the KAI C++ compiler.
@@ -6363,59 +6972,59 @@ if test "$_lt_caught_CXX_error" != yes; then
# earlier do not add the objects themselves.
case `$CC -V 2>&1` in
*"Version 7."*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
;;
*) # Version 8.0 or newer
tmp_idyn=
case $host_cpu in
ia64*) tmp_idyn=' -i_dynamic';;
esac
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
;;
esac
_LT_TAGVAR(archive_cmds_need_lc, $1)=no
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
;;
pgCC* | pgcpp*)
# Portland Group C++ compiler
case `$CC -V` in
*pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
_LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
- rm -rf $tpldir~
- $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
- compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
_LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
- rm -rf $tpldir~
- $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
- $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
- $RANLIB $oldlib'
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+ $RANLIB $oldlib'
_LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
- rm -rf $tpldir~
- $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
- $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
_LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
- rm -rf $tpldir~
- $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
- $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+ rm -rf $tpldir~
+ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
;;
*) # Version 6 and above use weak symbols
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
;;
esac
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
;;
cxx*)
# Compaq C++
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols'
runpath_var=LD_RUN_PATH
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
@@ -6429,18 +7038,18 @@ if test "$_lt_caught_CXX_error" != yes; then
# explicitly linking system object files so we need to strip them
# from the output so that they don't get included in the library
# dependencies.
- output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
;;
xl* | mpixl* | bgxl*)
# IBM XL 8.0 on PPC, with GNU ld
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
- _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- if test "x$supports_anon_versioning" = xyes; then
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ if test yes = "$supports_anon_versioning"; then
_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
- echo "local: *; };" >> $output_objdir/$libname.ver~
- $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
fi
;;
*)
@@ -6448,10 +7057,10 @@ if test "$_lt_caught_CXX_error" != yes; then
*Sun\ C*)
# Sun C++ 5.9
_LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
- _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
_LT_TAGVAR(compiler_needs_object, $1)=yes
# Not sure whether something based on
@@ -6509,22 +7118,17 @@ if test "$_lt_caught_CXX_error" != yes; then
_LT_TAGVAR(ld_shlibs, $1)=yes
;;
- openbsd2*)
- # C++ shared libraries are fairly broken
- _LT_TAGVAR(ld_shlibs, $1)=no
- ;;
-
- openbsd*)
+ openbsd* | bitrig*)
if test -f /usr/libexec/ld.so; then
_LT_TAGVAR(hardcode_direct, $1)=yes
_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
- if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
- _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+ _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
fi
output_verbose_link_cmd=func_echo_all
else
@@ -6540,9 +7144,9 @@ if test "$_lt_caught_CXX_error" != yes; then
# KCC will only create a shared library if the output file
# ends with ".so" (or ".sl" for HP-UX), so rename the library
# to its proper name (with version) after linking.
- _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+ _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
_LT_TAGVAR(hardcode_libdir_separator, $1)=:
# Archives containing C++ object files must be created using
@@ -6560,17 +7164,17 @@ if test "$_lt_caught_CXX_error" != yes; then
cxx*)
case $host in
osf3*)
- _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
;;
*)
_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
- echo "-hidden">> $lib.exp~
- $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
- $RM $lib.exp'
+ echo "-hidden">> $lib.exp~
+ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~
+ $RM $lib.exp'
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
;;
esac
@@ -6585,21 +7189,21 @@ if test "$_lt_caught_CXX_error" != yes; then
# explicitly linking system object files so we need to strip them
# from the output so that they don't get included in the library
# dependencies.
- output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
;;
*)
- if test "$GXX" = yes && test "$with_gnu_ld" = no; then
- _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ if test yes,no = "$GXX,$with_gnu_ld"; then
+ _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
case $host in
osf3*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
;;
*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
;;
esac
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
_LT_TAGVAR(hardcode_libdir_separator, $1)=:
# Commands to make compiler produce verbose output that lists
@@ -6645,9 +7249,9 @@ if test "$_lt_caught_CXX_error" != yes; then
# Sun C++ 4.2, 5.x and Centerline C++
_LT_TAGVAR(archive_cmds_need_lc,$1)=yes
_LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
- _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
@@ -6655,7 +7259,7 @@ if test "$_lt_caught_CXX_error" != yes; then
solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
*)
# The compiler driver will combine and reorder linker options,
- # but understands `-z linker_flag'.
+ # but understands '-z linker_flag'.
# Supported since Solaris 2.6 (maybe 2.5.1?)
_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
;;
@@ -6672,30 +7276,30 @@ if test "$_lt_caught_CXX_error" != yes; then
;;
gcx*)
# Green Hills C++ Compiler
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
# The C++ compiler must be used to create the archive.
_LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
;;
*)
# GNU C++ compiler with Solaris linker
- if test "$GXX" = yes && test "$with_gnu_ld" = no; then
- _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+ if test yes,no = "$GXX,$with_gnu_ld"; then
+ _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs'
if $CC --version | $GREP -v '^2\.7' > /dev/null; then
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
# linking a shared library.
output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
else
- # g++ 2.7 appears to require `-G' NOT `-shared' on this
+ # g++ 2.7 appears to require '-G' NOT '-shared' on this
# platform.
- _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
# Commands to make compiler produce verbose output that lists
# what "hidden" libraries, object files and flags are used when
@@ -6703,11 +7307,11 @@ if test "$_lt_caught_CXX_error" != yes; then
output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
fi
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir'
case $host_os in
solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
*)
- _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+ _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
;;
esac
fi
@@ -6716,52 +7320,52 @@ if test "$_lt_caught_CXX_error" != yes; then
;;
sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
- _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+ _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
_LT_TAGVAR(archive_cmds_need_lc, $1)=no
_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
runpath_var='LD_RUN_PATH'
case $cc_basename in
CC*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
;;
*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
;;
esac
;;
sysv5* | sco3.2v5* | sco5v6*)
- # Note: We can NOT use -z defs as we might desire, because we do not
+ # Note: We CANNOT use -z defs as we might desire, because we do not
# link with -lc, and that would cause any symbols used from libc to
# always be unresolved, which means just about no library would
# ever link correctly. If we're not using GNU ld we use -z text
# though, which does catch some bad symbols but isn't as heavy-handed
# as -z defs.
- _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
- _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+ _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+ _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs'
_LT_TAGVAR(archive_cmds_need_lc, $1)=no
_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
- _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+ _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir'
_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
_LT_TAGVAR(link_all_deplibs, $1)=yes
- _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+ _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport'
runpath_var='LD_RUN_PATH'
case $cc_basename in
CC*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
_LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
- '"$_LT_TAGVAR(old_archive_cmds, $1)"
+ '"$_LT_TAGVAR(old_archive_cmds, $1)"
_LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
- '"$_LT_TAGVAR(reload_cmds, $1)"
+ '"$_LT_TAGVAR(reload_cmds, $1)"
;;
*)
- _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
;;
esac
;;
@@ -6792,10 +7396,10 @@ if test "$_lt_caught_CXX_error" != yes; then
esac
AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
- test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+ test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no
- _LT_TAGVAR(GCC, $1)="$GXX"
- _LT_TAGVAR(LD, $1)="$LD"
+ _LT_TAGVAR(GCC, $1)=$GXX
+ _LT_TAGVAR(LD, $1)=$LD
## CAVEAT EMPTOR:
## There is no encapsulation within the following macros, do not change
@@ -6822,7 +7426,7 @@ if test "$_lt_caught_CXX_error" != yes; then
lt_cv_path_LD=$lt_save_path_LD
lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test "$_lt_caught_CXX_error" != yes
+fi # test yes != "$_lt_caught_CXX_error"
AC_LANG_POP
])# _LT_LANG_CXX_CONFIG
@@ -6844,13 +7448,14 @@ AC_REQUIRE([_LT_DECL_SED])
AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
func_stripname_cnf ()
{
- case ${2} in
- .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
- *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+ case @S|@2 in
+ .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;;
+ *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;;
esac
} # func_stripname_cnf
])# _LT_FUNC_STRIPNAME_CNF
+
# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
# ---------------------------------
# Figure out "hidden" library dependencies from verbose
@@ -6909,12 +7514,18 @@ public class foo {
}
};
_LT_EOF
+], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF
+package foo
+func foo() {
+}
+_LT_EOF
])
_lt_libdeps_save_CFLAGS=$CFLAGS
case "$CC $CFLAGS " in #(
*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
esac
dnl Parse the compiler output and extract the necessary
@@ -6928,13 +7539,13 @@ if AC_TRY_EVAL(ac_compile); then
pre_test_object_deps_done=no
for p in `eval "$output_verbose_link_cmd"`; do
- case ${prev}${p} in
+ case $prev$p in
-L* | -R* | -l*)
# Some compilers place space between "-{L,R}" and the path.
# Remove the space.
- if test $p = "-L" ||
- test $p = "-R"; then
+ if test x-L = "$p" ||
+ test x-R = "$p"; then
prev=$p
continue
fi
@@ -6950,16 +7561,16 @@ if AC_TRY_EVAL(ac_compile); then
case $p in
=*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
esac
- if test "$pre_test_object_deps_done" = no; then
- case ${prev} in
+ if test no = "$pre_test_object_deps_done"; then
+ case $prev in
-L | -R)
# Internal compiler library paths should come after those
# provided the user. The postdeps already come after the
# user supplied libs so there is no need to process them.
if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
- _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+ _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p
else
- _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+ _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p"
fi
;;
# The "-l" case would never come before the object being
@@ -6967,9 +7578,9 @@ if AC_TRY_EVAL(ac_compile); then
esac
else
if test -z "$_LT_TAGVAR(postdeps, $1)"; then
- _LT_TAGVAR(postdeps, $1)="${prev}${p}"
+ _LT_TAGVAR(postdeps, $1)=$prev$p
else
- _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
+ _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p"
fi
fi
prev=
@@ -6984,15 +7595,15 @@ if AC_TRY_EVAL(ac_compile); then
continue
fi
- if test "$pre_test_object_deps_done" = no; then
+ if test no = "$pre_test_object_deps_done"; then
if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
- _LT_TAGVAR(predep_objects, $1)="$p"
+ _LT_TAGVAR(predep_objects, $1)=$p
else
_LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
fi
else
if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
- _LT_TAGVAR(postdep_objects, $1)="$p"
+ _LT_TAGVAR(postdep_objects, $1)=$p
else
_LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
fi
@@ -7023,51 +7634,6 @@ interix[[3-9]]*)
_LT_TAGVAR(postdep_objects,$1)=
_LT_TAGVAR(postdeps,$1)=
;;
-
-linux*)
- case `$CC -V 2>&1 | sed 5q` in
- *Sun\ C*)
- # Sun C++ 5.9
-
- # The more standards-conforming stlport4 library is
- # incompatible with the Cstd library. Avoid specifying
- # it if it's in CXXFLAGS. Ignore libCrun as
- # -library=stlport4 depends on it.
- case " $CXX $CXXFLAGS " in
- *" -library=stlport4 "*)
- solaris_use_stlport4=yes
- ;;
- esac
-
- if test "$solaris_use_stlport4" != yes; then
- _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
- fi
- ;;
- esac
- ;;
-
-solaris*)
- case $cc_basename in
- CC* | sunCC*)
- # The more standards-conforming stlport4 library is
- # incompatible with the Cstd library. Avoid specifying
- # it if it's in CXXFLAGS. Ignore libCrun as
- # -library=stlport4 depends on it.
- case " $CXX $CXXFLAGS " in
- *" -library=stlport4 "*)
- solaris_use_stlport4=yes
- ;;
- esac
-
- # Adding this requires a known-good setup of shared libraries for
- # Sun compiler versions before 5.6, else PIC objects from an old
- # archive will be linked into the output, leading to subtle bugs.
- if test "$solaris_use_stlport4" != yes; then
- _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
- fi
- ;;
- esac
- ;;
esac
])
@@ -7076,7 +7642,7 @@ case " $_LT_TAGVAR(postdeps, $1) " in
esac
_LT_TAGVAR(compiler_lib_search_dirs, $1)=
if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'`
fi
_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
[The directories searched by this compiler when creating a shared library])
@@ -7096,10 +7662,10 @@ _LT_TAGDECL([], [compiler_lib_search_path], [1],
# --------------------------
# Ensure that the configuration variables for a Fortran 77 compiler are
# suitably defined. These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
m4_defun([_LT_LANG_F77_CONFIG],
[AC_LANG_PUSH(Fortran 77)
-if test -z "$F77" || test "X$F77" = "Xno"; then
+if test -z "$F77" || test no = "$F77"; then
_lt_disable_F77=yes
fi
@@ -7111,7 +7677,6 @@ _LT_TAGVAR(export_dynamic_flag_spec, $1)=
_LT_TAGVAR(hardcode_direct, $1)=no
_LT_TAGVAR(hardcode_direct_absolute, $1)=no
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
_LT_TAGVAR(hardcode_libdir_separator, $1)=
_LT_TAGVAR(hardcode_minus_L, $1)=no
_LT_TAGVAR(hardcode_automatic, $1)=no
@@ -7137,7 +7702,7 @@ _LT_TAGVAR(objext, $1)=$objext
# the F77 compiler isn't working. Some variables (like enable_shared)
# are currently assumed to apply to all compilers on this platform,
# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_F77" != yes; then
+if test yes != "$_lt_disable_F77"; then
# Code to be used in simple compile tests
lt_simple_compile_test_code="\
subroutine t
@@ -7159,7 +7724,7 @@ if test "$_lt_disable_F77" != yes; then
_LT_LINKER_BOILERPLATE
# Allow CC to be a program name with arguments.
- lt_save_CC="$CC"
+ lt_save_CC=$CC
lt_save_GCC=$GCC
lt_save_CFLAGS=$CFLAGS
CC=${F77-"f77"}
@@ -7173,21 +7738,25 @@ if test "$_lt_disable_F77" != yes; then
AC_MSG_RESULT([$can_build_shared])
AC_MSG_CHECKING([whether to build shared libraries])
- test "$can_build_shared" = "no" && enable_shared=no
+ test no = "$can_build_shared" && enable_shared=no
# On AIX, shared libraries and static libraries use the same namespace, and
# are all built from PIC.
case $host_os in
aix3*)
- test "$enable_shared" = yes && enable_static=no
+ test yes = "$enable_shared" && enable_static=no
if test -n "$RANLIB"; then
archive_cmds="$archive_cmds~\$RANLIB \$lib"
postinstall_cmds='$RANLIB $lib'
fi
;;
aix[[4-9]]*)
- if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
- test "$enable_shared" = yes && enable_static=no
+ if test ia64 != "$host_cpu"; then
+ case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+ yes,aix,yes) ;; # shared object as lib.so file only
+ yes,svr4,*) ;; # shared object as lib.so archive member only
+ yes,*) enable_static=no ;; # shared object in lib.a archive as well
+ esac
fi
;;
esac
@@ -7195,11 +7764,11 @@ if test "$_lt_disable_F77" != yes; then
AC_MSG_CHECKING([whether to build static libraries])
# Make sure either enable_shared or enable_static is yes.
- test "$enable_shared" = yes || enable_static=yes
+ test yes = "$enable_shared" || enable_static=yes
AC_MSG_RESULT([$enable_static])
- _LT_TAGVAR(GCC, $1)="$G77"
- _LT_TAGVAR(LD, $1)="$LD"
+ _LT_TAGVAR(GCC, $1)=$G77
+ _LT_TAGVAR(LD, $1)=$LD
## CAVEAT EMPTOR:
## There is no encapsulation within the following macros, do not change
@@ -7216,9 +7785,9 @@ if test "$_lt_disable_F77" != yes; then
fi # test -n "$compiler"
GCC=$lt_save_GCC
- CC="$lt_save_CC"
- CFLAGS="$lt_save_CFLAGS"
-fi # test "$_lt_disable_F77" != yes
+ CC=$lt_save_CC
+ CFLAGS=$lt_save_CFLAGS
+fi # test yes != "$_lt_disable_F77"
AC_LANG_POP
])# _LT_LANG_F77_CONFIG
@@ -7228,11 +7797,11 @@ AC_LANG_POP
# -------------------------
# Ensure that the configuration variables for a Fortran compiler are
# suitably defined. These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
m4_defun([_LT_LANG_FC_CONFIG],
[AC_LANG_PUSH(Fortran)
-if test -z "$FC" || test "X$FC" = "Xno"; then
+if test -z "$FC" || test no = "$FC"; then
_lt_disable_FC=yes
fi
@@ -7244,7 +7813,6 @@ _LT_TAGVAR(export_dynamic_flag_spec, $1)=
_LT_TAGVAR(hardcode_direct, $1)=no
_LT_TAGVAR(hardcode_direct_absolute, $1)=no
_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
_LT_TAGVAR(hardcode_libdir_separator, $1)=
_LT_TAGVAR(hardcode_minus_L, $1)=no
_LT_TAGVAR(hardcode_automatic, $1)=no
@@ -7270,7 +7838,7 @@ _LT_TAGVAR(objext, $1)=$objext
# the FC compiler isn't working. Some variables (like enable_shared)
# are currently assumed to apply to all compilers on this platform,
# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_FC" != yes; then
+if test yes != "$_lt_disable_FC"; then
# Code to be used in simple compile tests
lt_simple_compile_test_code="\
subroutine t
@@ -7292,7 +7860,7 @@ if test "$_lt_disable_FC" != yes; then
_LT_LINKER_BOILERPLATE
# Allow CC to be a program name with arguments.
- lt_save_CC="$CC"
+ lt_save_CC=$CC
lt_save_GCC=$GCC
lt_save_CFLAGS=$CFLAGS
CC=${FC-"f95"}
@@ -7308,21 +7876,25 @@ if test "$_lt_disable_FC" != yes; then
AC_MSG_RESULT([$can_build_shared])
AC_MSG_CHECKING([whether to build shared libraries])
- test "$can_build_shared" = "no" && enable_shared=no
+ test no = "$can_build_shared" && enable_shared=no
# On AIX, shared libraries and static libraries use the same namespace, and
# are all built from PIC.
case $host_os in
aix3*)
- test "$enable_shared" = yes && enable_static=no
+ test yes = "$enable_shared" && enable_static=no
if test -n "$RANLIB"; then
archive_cmds="$archive_cmds~\$RANLIB \$lib"
postinstall_cmds='$RANLIB $lib'
fi
;;
aix[[4-9]]*)
- if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
- test "$enable_shared" = yes && enable_static=no
+ if test ia64 != "$host_cpu"; then
+ case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+ yes,aix,yes) ;; # shared object as lib.so file only
+ yes,svr4,*) ;; # shared object as lib.so archive member only
+ yes,*) enable_static=no ;; # shared object in lib.a archive as well
+ esac
fi
;;
esac
@@ -7330,11 +7902,11 @@ if test "$_lt_disable_FC" != yes; then
AC_MSG_CHECKING([whether to build static libraries])
# Make sure either enable_shared or enable_static is yes.
- test "$enable_shared" = yes || enable_static=yes
+ test yes = "$enable_shared" || enable_static=yes
AC_MSG_RESULT([$enable_static])
- _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
- _LT_TAGVAR(LD, $1)="$LD"
+ _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu
+ _LT_TAGVAR(LD, $1)=$LD
## CAVEAT EMPTOR:
## There is no encapsulation within the following macros, do not change
@@ -7354,7 +7926,7 @@ if test "$_lt_disable_FC" != yes; then
GCC=$lt_save_GCC
CC=$lt_save_CC
CFLAGS=$lt_save_CFLAGS
-fi # test "$_lt_disable_FC" != yes
+fi # test yes != "$_lt_disable_FC"
AC_LANG_POP
])# _LT_LANG_FC_CONFIG
@@ -7364,7 +7936,7 @@ AC_LANG_POP
# --------------------------
# Ensure that the configuration variables for the GNU Java Compiler compiler
# are suitably defined. These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
m4_defun([_LT_LANG_GCJ_CONFIG],
[AC_REQUIRE([LT_PROG_GCJ])dnl
AC_LANG_SAVE
@@ -7398,7 +7970,7 @@ CC=${GCJ-"gcj"}
CFLAGS=$GCJFLAGS
compiler=$CC
_LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
+_LT_TAGVAR(LD, $1)=$LD
_LT_CC_BASENAME([$compiler])
# GCJ did not exist at the time GCC didn't implicitly link libc in.
@@ -7427,11 +7999,78 @@ CFLAGS=$lt_save_CFLAGS
])# _LT_LANG_GCJ_CONFIG
+# _LT_LANG_GO_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Go compiler
+# are suitably defined. These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_GO_CONFIG],
+[AC_REQUIRE([LT_PROG_GO])dnl
+AC_LANG_SAVE
+
+# Source file extension for Go test sources.
+ac_ext=go
+
+# Object file extension for compiled Go test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="package main; func main() { }"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='package main; func main() { }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GOC-"gccgo"}
+CFLAGS=$GOFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)=$LD
+_LT_CC_BASENAME([$compiler])
+
+# Go did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+if test -n "$compiler"; then
+ _LT_COMPILER_NO_RTTI($1)
+ _LT_COMPILER_PIC($1)
+ _LT_COMPILER_C_O($1)
+ _LT_COMPILER_FILE_LOCKS($1)
+ _LT_LINKER_SHLIBS($1)
+ _LT_LINKER_HARDCODE_LIBPATH($1)
+
+ _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GO_CONFIG
+
+
# _LT_LANG_RC_CONFIG([TAG])
# -------------------------
# Ensure that the configuration variables for the Windows resource compiler
# are suitably defined. These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
m4_defun([_LT_LANG_RC_CONFIG],
[AC_REQUIRE([LT_PROG_RC])dnl
AC_LANG_SAVE
@@ -7447,7 +8086,7 @@ _LT_TAGVAR(objext, $1)=$objext
lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
# Code to be used in simple link tests
-lt_simple_link_test_code="$lt_simple_compile_test_code"
+lt_simple_link_test_code=$lt_simple_compile_test_code
# ltmain only uses $CC for tagged configurations so make sure $CC is set.
_LT_TAG_COMPILER
@@ -7457,7 +8096,7 @@ _LT_COMPILER_BOILERPLATE
_LT_LINKER_BOILERPLATE
# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
+lt_save_CC=$CC
lt_save_CFLAGS=$CFLAGS
lt_save_GCC=$GCC
GCC=
@@ -7486,7 +8125,7 @@ AC_DEFUN([LT_PROG_GCJ],
[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
[m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
[AC_CHECK_TOOL(GCJ, gcj,)
- test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+ test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2"
AC_SUBST(GCJFLAGS)])])[]dnl
])
@@ -7496,6 +8135,13 @@ dnl aclocal-1.4 backwards compatibility:
dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
+# LT_PROG_GO
+# ----------
+AC_DEFUN([LT_PROG_GO],
+[AC_CHECK_TOOL(GOC, gccgo,)
+])
+
+
# LT_PROG_RC
# ----------
AC_DEFUN([LT_PROG_RC],
@@ -7588,7 +8234,7 @@ lt_ac_count=0
# Add /usr/xpg4/bin/sed as it is typically found on Solaris
# along with /bin/sed that truncates output.
for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
- test ! -f $lt_ac_sed && continue
+ test ! -f "$lt_ac_sed" && continue
cat /dev/null > conftest.in
lt_ac_count=0
echo $ECHO_N "0123456789$ECHO_C" >conftest.in
@@ -7605,9 +8251,9 @@ for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
$lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
cmp -s conftest.out conftest.nl || break
# 10000 chars as input seems more than enough
- test $lt_ac_count -gt 10 && break
+ test 10 -lt "$lt_ac_count" && break
lt_ac_count=`expr $lt_ac_count + 1`
- if test $lt_ac_count -gt $lt_ac_max; then
+ if test "$lt_ac_count" -gt "$lt_ac_max"; then
lt_ac_max=$lt_ac_count
lt_cv_path_SED=$lt_ac_sed
fi
@@ -7631,27 +8277,7 @@ dnl AC_DEFUN([LT_AC_PROG_SED], [])
# Find out whether the shell is Bourne or XSI compatible,
# or has some other useful features.
m4_defun([_LT_CHECK_SHELL_FEATURES],
-[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
- test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
- = c,a/b,b/c, \
- && eval 'test $(( 1 + 1 )) -eq 2 \
- && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
- && xsi_shell=yes
-AC_MSG_RESULT([$xsi_shell])
-_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
-
-AC_MSG_CHECKING([whether the shell understands "+="])
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
- >/dev/null 2>&1 \
- && lt_shell_append=yes
-AC_MSG_RESULT([$lt_shell_append])
-_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
lt_unset=unset
else
lt_unset=false
@@ -7675,102 +8301,9 @@ _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
])# _LT_CHECK_SHELL_FEATURES
-# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)
-# ------------------------------------------------------
-# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and
-# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.
-m4_defun([_LT_PROG_FUNCTION_REPLACE],
-[dnl {
-sed -e '/^$1 ()$/,/^} # $1 /c\
-$1 ()\
-{\
-m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1])
-} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-])
-
-
-# _LT_PROG_REPLACE_SHELLFNS
-# -------------------------
-# Replace existing portable implementations of several shell functions with
-# equivalent extended shell implementations where those features are available..
-m4_defun([_LT_PROG_REPLACE_SHELLFNS],
-[if test x"$xsi_shell" = xyes; then
- _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl
- case ${1} in
- */*) func_dirname_result="${1%/*}${2}" ;;
- * ) func_dirname_result="${3}" ;;
- esac])
-
- _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl
- func_basename_result="${1##*/}"])
-
- _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl
- case ${1} in
- */*) func_dirname_result="${1%/*}${2}" ;;
- * ) func_dirname_result="${3}" ;;
- esac
- func_basename_result="${1##*/}"])
-
- _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl
- # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
- # positional parameters, so assign one to ordinary parameter first.
- func_stripname_result=${3}
- func_stripname_result=${func_stripname_result#"${1}"}
- func_stripname_result=${func_stripname_result%"${2}"}])
-
- _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl
- func_split_long_opt_name=${1%%=*}
- func_split_long_opt_arg=${1#*=}])
-
- _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl
- func_split_short_opt_arg=${1#??}
- func_split_short_opt_name=${1%"$func_split_short_opt_arg"}])
-
- _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl
- case ${1} in
- *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
- *) func_lo2o_result=${1} ;;
- esac])
-
- _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo])
-
- _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))])
-
- _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}])
-fi
-
-if test x"$lt_shell_append" = xyes; then
- _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"])
-
- _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl
- func_quote_for_eval "${2}"
-dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \
- eval "${1}+=\\\\ \\$func_quote_for_eval_result"])
-
- # Save a `func_append' function call where possible by direct use of '+='
- sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
- test 0 -eq $? || _lt_function_replace_fail=:
-else
- # Save a `func_append' function call even when '+=' is not available
- sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
- test 0 -eq $? || _lt_function_replace_fail=:
-fi
-
-if test x"$_lt_function_replace_fail" = x":"; then
- AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])
-fi
-])
-
# _LT_PATH_CONVERSION_FUNCTIONS
# -----------------------------
-# Determine which file name conversion functions should be used by
+# Determine what file name conversion functions should be used by
# func_to_host_file (and, implicitly, by func_to_host_path). These are needed
# for certain cross-compile configurations and native mingw.
m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
@@ -7837,15 +8370,15 @@ _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],
# Helper functions for option handling. -*- Autoconf -*-
#
-# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
-# Inc.
+# Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software
+# Foundation, Inc.
# Written by Gary V. Vaughan, 2004
#
# This file is free software; the Free Software Foundation gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
-# serial 7 ltoptions.m4
+# serial 8 ltoptions.m4
# This is to help aclocal find these macros, as it can't see m4_define.
AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
@@ -7866,7 +8399,7 @@ m4_define([_LT_SET_OPTION],
[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
_LT_MANGLE_DEFUN([$1], [$2]),
- [m4_warning([Unknown $1 option `$2'])])[]dnl
+ [m4_warning([Unknown $1 option '$2'])])[]dnl
])
@@ -7912,13 +8445,15 @@ m4_if([$1],[LT_INIT],[
dnl
dnl If no reference was made to various pairs of opposing options, then
dnl we run the default mode handler for the pair. For example, if neither
- dnl `shared' nor `disable-shared' was passed, we enable building of shared
+ dnl 'shared' nor 'disable-shared' was passed, we enable building of shared
dnl archives by default:
_LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
_LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
_LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
_LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
- [_LT_ENABLE_FAST_INSTALL])
+ [_LT_ENABLE_FAST_INSTALL])
+ _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4],
+ [_LT_WITH_AIX_SONAME([aix])])
])
])# _LT_SET_OPTIONS
@@ -7946,7 +8481,7 @@ AU_DEFUN([AC_LIBTOOL_DLOPEN],
[_LT_SET_OPTION([LT_INIT], [dlopen])
AC_DIAGNOSE([obsolete],
[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `dlopen' option into LT_INIT's first parameter.])
+put the 'dlopen' option into LT_INIT's first parameter.])
])
dnl aclocal-1.4 backwards compatibility:
@@ -7982,7 +8517,7 @@ AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
_LT_SET_OPTION([LT_INIT], [win32-dll])
AC_DIAGNOSE([obsolete],
[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `win32-dll' option into LT_INIT's first parameter.])
+put the 'win32-dll' option into LT_INIT's first parameter.])
])
dnl aclocal-1.4 backwards compatibility:
@@ -7991,9 +8526,9 @@ dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
# _LT_ENABLE_SHARED([DEFAULT])
# ----------------------------
-# implement the --enable-shared flag, and supports the `shared' and
-# `disable-shared' LT_INIT options.
-# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
+# implement the --enable-shared flag, and supports the 'shared' and
+# 'disable-shared' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'.
m4_define([_LT_ENABLE_SHARED],
[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
AC_ARG_ENABLE([shared],
@@ -8006,14 +8541,14 @@ AC_ARG_ENABLE([shared],
*)
enable_shared=no
# Look at the argument we got. We use all the common list separators.
- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
for pkg in $enableval; do
- IFS="$lt_save_ifs"
+ IFS=$lt_save_ifs
if test "X$pkg" = "X$p"; then
enable_shared=yes
fi
done
- IFS="$lt_save_ifs"
+ IFS=$lt_save_ifs
;;
esac],
[enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
@@ -8045,9 +8580,9 @@ dnl AC_DEFUN([AM_DISABLE_SHARED], [])
# _LT_ENABLE_STATIC([DEFAULT])
# ----------------------------
-# implement the --enable-static flag, and support the `static' and
-# `disable-static' LT_INIT options.
-# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
+# implement the --enable-static flag, and support the 'static' and
+# 'disable-static' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'.
m4_define([_LT_ENABLE_STATIC],
[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
AC_ARG_ENABLE([static],
@@ -8060,14 +8595,14 @@ AC_ARG_ENABLE([static],
*)
enable_static=no
# Look at the argument we got. We use all the common list separators.
- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
for pkg in $enableval; do
- IFS="$lt_save_ifs"
+ IFS=$lt_save_ifs
if test "X$pkg" = "X$p"; then
enable_static=yes
fi
done
- IFS="$lt_save_ifs"
+ IFS=$lt_save_ifs
;;
esac],
[enable_static=]_LT_ENABLE_STATIC_DEFAULT)
@@ -8099,9 +8634,9 @@ dnl AC_DEFUN([AM_DISABLE_STATIC], [])
# _LT_ENABLE_FAST_INSTALL([DEFAULT])
# ----------------------------------
-# implement the --enable-fast-install flag, and support the `fast-install'
-# and `disable-fast-install' LT_INIT options.
-# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
+# implement the --enable-fast-install flag, and support the 'fast-install'
+# and 'disable-fast-install' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'.
m4_define([_LT_ENABLE_FAST_INSTALL],
[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
AC_ARG_ENABLE([fast-install],
@@ -8114,14 +8649,14 @@ AC_ARG_ENABLE([fast-install],
*)
enable_fast_install=no
# Look at the argument we got. We use all the common list separators.
- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
for pkg in $enableval; do
- IFS="$lt_save_ifs"
+ IFS=$lt_save_ifs
if test "X$pkg" = "X$p"; then
enable_fast_install=yes
fi
done
- IFS="$lt_save_ifs"
+ IFS=$lt_save_ifs
;;
esac],
[enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
@@ -8138,14 +8673,14 @@ AU_DEFUN([AC_ENABLE_FAST_INSTALL],
[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
AC_DIAGNOSE([obsolete],
[$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `fast-install' option into LT_INIT's first parameter.])
+the 'fast-install' option into LT_INIT's first parameter.])
])
AU_DEFUN([AC_DISABLE_FAST_INSTALL],
[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
AC_DIAGNOSE([obsolete],
[$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `disable-fast-install' option into LT_INIT's first parameter.])
+the 'disable-fast-install' option into LT_INIT's first parameter.])
])
dnl aclocal-1.4 backwards compatibility:
@@ -8153,19 +8688,85 @@ dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
+# _LT_WITH_AIX_SONAME([DEFAULT])
+# ----------------------------------
+# implement the --with-aix-soname flag, and support the `aix-soname=aix'
+# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT
+# is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'.
+m4_define([_LT_WITH_AIX_SONAME],
+[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl
+shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[[5-9]]*,yes)
+ AC_MSG_CHECKING([which variant of shared library versioning to provide])
+ AC_ARG_WITH([aix-soname],
+ [AS_HELP_STRING([--with-aix-soname=aix|svr4|both],
+ [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])],
+ [case $withval in
+ aix|svr4|both)
+ ;;
+ *)
+ AC_MSG_ERROR([Unknown argument to --with-aix-soname])
+ ;;
+ esac
+ lt_cv_with_aix_soname=$with_aix_soname],
+ [AC_CACHE_VAL([lt_cv_with_aix_soname],
+ [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT)
+ with_aix_soname=$lt_cv_with_aix_soname])
+ AC_MSG_RESULT([$with_aix_soname])
+ if test aix != "$with_aix_soname"; then
+ # For the AIX way of multilib, we name the shared archive member
+ # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+ # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+ # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+ # the AIX toolchain works better with OBJECT_MODE set (default 32).
+ if test 64 = "${OBJECT_MODE-32}"; then
+ shared_archive_member_spec=shr_64
+ else
+ shared_archive_member_spec=shr
+ fi
+ fi
+ ;;
+*)
+ with_aix_soname=aix
+ ;;
+esac
+
+_LT_DECL([], [shared_archive_member_spec], [0],
+ [Shared archive member basename, for filename based shared library versioning on AIX])dnl
+])# _LT_WITH_AIX_SONAME
+
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])])
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])])
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])])
+
+
# _LT_WITH_PIC([MODE])
# --------------------
-# implement the --with-pic flag, and support the `pic-only' and `no-pic'
+# implement the --with-pic flag, and support the 'pic-only' and 'no-pic'
# LT_INIT options.
-# MODE is either `yes' or `no'. If omitted, it defaults to `both'.
+# MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'.
m4_define([_LT_WITH_PIC],
[AC_ARG_WITH([pic],
- [AS_HELP_STRING([--with-pic],
+ [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
- [pic_mode="$withval"],
- [pic_mode=default])
-
-test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
+ [lt_p=${PACKAGE-default}
+ case $withval in
+ yes|no) pic_mode=$withval ;;
+ *)
+ pic_mode=default
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for lt_pkg in $withval; do
+ IFS=$lt_save_ifs
+ if test "X$lt_pkg" = "X$lt_p"; then
+ pic_mode=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac],
+ [pic_mode=m4_default([$1], [default])])
_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
])# _LT_WITH_PIC
@@ -8178,7 +8779,7 @@ AU_DEFUN([AC_LIBTOOL_PICMODE],
[_LT_SET_OPTION([LT_INIT], [pic-only])
AC_DIAGNOSE([obsolete],
[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `pic-only' option into LT_INIT's first parameter.])
+put the 'pic-only' option into LT_INIT's first parameter.])
])
dnl aclocal-1.4 backwards compatibility:
@@ -8201,7 +8802,8 @@ LT_OPTION_DEFINE([LTDL_INIT], [convenience],
# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*-
#
-# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software
+# Foundation, Inc.
# Written by Gary V. Vaughan, 2004
#
# This file is free software; the Free Software Foundation gives
@@ -8234,7 +8836,7 @@ m4_define([_lt_join],
# ------------
# Manipulate m4 lists.
# These macros are necessary as long as will still need to support
-# Autoconf-2.59 which quotes differently.
+# Autoconf-2.59, which quotes differently.
m4_define([lt_car], [[$1]])
m4_define([lt_cdr],
[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
@@ -8245,7 +8847,7 @@ m4_define([lt_unquote], $1)
# lt_append(MACRO-NAME, STRING, [SEPARATOR])
# ------------------------------------------
-# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
+# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'.
# Note that neither SEPARATOR nor STRING are expanded; they are appended
# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
# No SEPARATOR is output if MACRO-NAME was previously undefined (different
@@ -8325,7 +8927,7 @@ m4_define([lt_dict_filter],
# ltversion.m4 -- version numbers -*- Autoconf -*-
#
-# Copyright (C) 2004 Free Software Foundation, Inc.
+# Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc.
# Written by Scott James Remnant, 2004
#
# This file is free software; the Free Software Foundation gives
@@ -8334,22 +8936,23 @@ m4_define([lt_dict_filter],
# @configure_input@
-# serial 3293 ltversion.m4
+# serial 4179 ltversion.m4
# This file is part of GNU Libtool
-m4_define([LT_PACKAGE_VERSION], [2.4])
-m4_define([LT_PACKAGE_REVISION], [1.3293])
+m4_define([LT_PACKAGE_VERSION], [2.4.6])
+m4_define([LT_PACKAGE_REVISION], [2.4.6])
AC_DEFUN([LTVERSION_VERSION],
-[macro_version='2.4'
-macro_revision='1.3293'
+[macro_version='2.4.6'
+macro_revision='2.4.6'
_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
_LT_DECL(, macro_revision, 0)
])
# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*-
#
-# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
+# Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software
+# Foundation, Inc.
# Written by Scott James Remnant, 2004.
#
# This file is free software; the Free Software Foundation gives
@@ -8360,7 +8963,7 @@ _LT_DECL(, macro_revision, 0)
# These exist entirely to fool aclocal when bootstrapping libtool.
#
-# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN),
# which have later been changed to m4_define as they aren't part of the
# exported API, or moved to Autoconf or Automake where they belong.
#
@@ -8374,7 +8977,7 @@ _LT_DECL(, macro_revision, 0)
# included after everything else. This provides aclocal with the
# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
# because those macros already exist, or will be overwritten later.
-# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6.
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6.
#
# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
# Yes, that means every name once taken will need to remain here until
@@ -8446,7 +9049,7 @@ m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])])
m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])])
m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])])
-# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# Copyright (C) 2002-2014 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -8458,10 +9061,10 @@ m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])])
# generated from the m4 files accompanying Automake X.Y.
# (This private macro should not be called outside this file.)
AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.11'
+[am__api_version='1.15'
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
dnl require some minimum version. Point them to the right macro.
-m4_if([$1], [1.11.1], [],
+m4_if([$1], [1.15], [],
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
])
@@ -8477,22 +9080,82 @@ m4_define([_AM_AUTOCONF_VERSION], [])
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.11.1])dnl
+[AM_AUTOMAKE_VERSION([1.15])dnl
m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+# Copyright (C) 2011-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_AR([ACT-IF-FAIL])
+# -------------------------
+# Try to determine the archiver interface, and trigger the ar-lib wrapper
+# if it is needed. If the detection of archiver interface fails, run
+# ACT-IF-FAIL (default is to abort configure with a proper error message).
+AC_DEFUN([AM_PROG_AR],
+[AC_BEFORE([$0], [LT_INIT])dnl
+AC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl
+AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([ar-lib])dnl
+AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false])
+: ${AR=ar}
+
+AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface],
+ [AC_LANG_PUSH([C])
+ am_cv_ar_interface=ar
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])],
+ [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD'
+ AC_TRY_EVAL([am_ar_try])
+ if test "$ac_status" -eq 0; then
+ am_cv_ar_interface=ar
+ else
+ am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD'
+ AC_TRY_EVAL([am_ar_try])
+ if test "$ac_status" -eq 0; then
+ am_cv_ar_interface=lib
+ else
+ am_cv_ar_interface=unknown
+ fi
+ fi
+ rm -f conftest.lib libconftest.a
+ ])
+ AC_LANG_POP([C])])
+
+case $am_cv_ar_interface in
+ar)
+ ;;
+lib)
+ # Microsoft lib, so override with the ar-lib wrapper script.
+ # FIXME: It is wrong to rewrite AR.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__AR in this case,
+ # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something
+ # similar.
+ AR="$am_aux_dir/ar-lib $AR"
+ ;;
+unknown)
+ m4_default([$1],
+ [AC_MSG_ERROR([could not determine $AR interface])])
+ ;;
+esac
+AC_SUBST([AR])dnl
+])
+
# AM_AUX_DIR_EXPAND -*- Autoconf -*-
-# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
-# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
-# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to
+# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
#
# Of course, Automake must honor this variable whenever it calls a
# tool from the auxiliary directory. The problem is that $srcdir (and
@@ -8511,7 +9174,7 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
#
# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
# are both prefixed by $srcdir. In an in-source build this is usually
-# harmless because $srcdir is `.', but things will broke when you
+# harmless because $srcdir is '.', but things will broke when you
# start a VPATH build or use an absolute $srcdir.
#
# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
@@ -8529,30 +9192,26 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
# configured tree to be moved without reconfiguration.
AC_DEFUN([AM_AUX_DIR_EXPAND],
-[dnl Rely on autoconf to set up CDPATH properly.
-AC_PREREQ([2.50])dnl
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
])
# AM_CONDITIONAL -*- Autoconf -*-
-# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
-# Free Software Foundation, Inc.
+# Copyright (C) 1997-2014 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 9
-
# AM_CONDITIONAL(NAME, SHELL-CONDITION)
# -------------------------------------
# Define a conditional.
AC_DEFUN([AM_CONDITIONAL],
-[AC_PREREQ(2.52)dnl
- ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
- [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+[AC_PREREQ([2.52])dnl
+ m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
AC_SUBST([$1_TRUE])dnl
AC_SUBST([$1_FALSE])dnl
_AM_SUBST_NOTMAKE([$1_TRUE])dnl
@@ -8571,16 +9230,14 @@ AC_CONFIG_COMMANDS_PRE(
Usually this means the macro was only invoked conditionally.]])
fi])])
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
-# Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 10
-# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
# written in clear, in which case automake, when reading aclocal.m4,
# will think it sees a *use*, and therefore will trigger all it's
# C support machinery. Also note that it means that autoscan, seeing
@@ -8590,7 +9247,7 @@ fi])])
# _AM_DEPENDENCIES(NAME)
# ----------------------
# See how the compiler implements dependency checking.
-# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC".
# We try a few techniques and use that to set a single cache variable.
#
# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
@@ -8603,12 +9260,13 @@ AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
AC_REQUIRE([AM_MAKE_INCLUDE])dnl
AC_REQUIRE([AM_DEP_TRACK])dnl
-ifelse([$1], CC, [depcc="$CC" am_compiler_list=],
- [$1], CXX, [depcc="$CXX" am_compiler_list=],
- [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
- [$1], UPC, [depcc="$UPC" am_compiler_list=],
- [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
- [depcc="$$1" am_compiler_list=])
+m4_if([$1], [CC], [depcc="$CC" am_compiler_list=],
+ [$1], [CXX], [depcc="$CXX" am_compiler_list=],
+ [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
+ [$1], [UPC], [depcc="$UPC" am_compiler_list=],
+ [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
+ [depcc="$$1" am_compiler_list=])
AC_CACHE_CHECK([dependency style of $depcc],
[am_cv_$1_dependencies_compiler_type],
@@ -8616,8 +9274,9 @@ AC_CACHE_CHECK([dependency style of $depcc],
# We make a subdir and do the tests there. Otherwise we can end up
# making bogus files that we don't know about and never remove. For
# instance it was reported that on HP-UX the gcc test will end up
- # making a dummy file named `D' -- because `-MD' means `put the output
- # in D'.
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
mkdir conftest.dir
# Copy depcomp to subdir because otherwise we won't find it if we're
# using a relative directory.
@@ -8656,16 +9315,16 @@ AC_CACHE_CHECK([dependency style of $depcc],
: > sub/conftest.c
for i in 1 2 3 4 5 6; do
echo '#include "conftst'$i'.h"' >> sub/conftest.c
- # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
- # Solaris 8's {/usr,}/bin/sh.
- touch sub/conftst$i.h
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
done
echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
- # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
# mode. It turns out that the SunPro C++ compiler does not properly
- # handle `-M -o', and we need to detect this. Also, some Intel
- # versions had trouble with output in subdirs
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
am__obj=sub/conftest.${OBJEXT-o}
am__minus_obj="-o $am__obj"
case $depmode in
@@ -8674,16 +9333,16 @@ AC_CACHE_CHECK([dependency style of $depcc],
test "$am__universal" = false || continue
;;
nosideeffect)
- # after this tag, mechanisms are not by side-effect, so they'll
- # only be used when explicitly requested
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
if test "x$enable_dependency_tracking" = xyes; then
continue
else
break
fi
;;
- msvisualcpp | msvcmsys)
- # This compiler won't grok `-c -o', but also, the minuso test has
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
# not run yet. These depmodes are late enough in the game, and
# so weak that their functioning should not be impacted.
am__obj=conftest.${OBJEXT-o}
@@ -8731,7 +9390,7 @@ AM_CONDITIONAL([am__fastdep$1], [
# AM_SET_DEPDIR
# -------------
# Choose a directory name for dependency files.
-# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES.
AC_DEFUN([AM_SET_DEPDIR],
[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
@@ -8741,34 +9400,39 @@ AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
# AM_DEP_TRACK
# ------------
AC_DEFUN([AM_DEP_TRACK],
-[AC_ARG_ENABLE(dependency-tracking,
-[ --disable-dependency-tracking speeds up one-time build
- --enable-dependency-tracking do not reject slow dependency extractors])
+[AC_ARG_ENABLE([dependency-tracking], [dnl
+AS_HELP_STRING(
+ [--enable-dependency-tracking],
+ [do not reject slow dependency extractors])
+AS_HELP_STRING(
+ [--disable-dependency-tracking],
+ [speeds up one-time build])])
if test "x$enable_dependency_tracking" != xno; then
am_depcomp="$ac_aux_dir/depcomp"
AMDEPBACKSLASH='\'
+ am__nodep='_no'
fi
AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
AC_SUBST([AMDEPBACKSLASH])dnl
_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
])
# Generate code to set up dependency tracking. -*- Autoconf -*-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-#serial 5
# _AM_OUTPUT_DEPENDENCY_COMMANDS
# ------------------------------
AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
[{
- # Autoconf 2.62 quotes --file arguments for eval, but not when files
+ # Older Autoconf quotes --file arguments for eval, but not when files
# are listed without --file. Let's play safe and only enable the eval
# if we detect the quoting.
case $CONFIG_FILES in
@@ -8781,7 +9445,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
# Strip MF so we end up with the name of the file.
mf=`echo "$mf" | sed -e 's/:.*$//'`
# Check whether this is an Automake generated Makefile or not.
- # We used to match only the files named `Makefile.in', but
+ # We used to match only the files named 'Makefile.in', but
# some people rename them; so instead we look at the file content.
# Grep'ing the first line is not enough: some people post-process
# each Makefile.in and add a new line on top of each file to say so.
@@ -8793,21 +9457,19 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
continue
fi
# Extract the definition of DEPDIR, am__include, and am__quote
- # from the Makefile without running `make'.
+ # from the Makefile without running 'make'.
DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
test -z "$DEPDIR" && continue
am__include=`sed -n 's/^am__include = //p' < "$mf"`
- test -z "am__include" && continue
+ test -z "$am__include" && continue
am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
- # When using ansi2knr, U may be empty or an underscore; expand it
- U=`sed -n 's/^U = //p' < "$mf"`
# Find all dependency output files, they are included files with
# $(DEPDIR) in their names. We invoke sed twice because it is the
# simplest approach to changing $(DEPDIR) to its actual value in the
# expansion.
for file in `sed -n "
s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
- sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
# Make sure the directory exists.
test -f "$dirpart/$file" && continue
fdir=`AS_DIRNAME(["$file"])`
@@ -8825,7 +9487,7 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
# This macro should only be invoked once -- use via AC_REQUIRE.
#
# This code is only required when automatic dependency tracking
-# is enabled. FIXME. This creates each `.P' file that we will
+# is enabled. FIXME. This creates each '.P' file that we will
# need in order to bootstrap the dependency handling code.
AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
[AC_CONFIG_COMMANDS([depfiles],
@@ -8835,18 +9497,21 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
# Do all the work for Automake. -*- Autoconf -*-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 16
-
# This macro actually does too much. Some checks are only needed if
# your package does certain things. But this isn't really a big deal.
+dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
+m4_define([AC_PROG_CC],
+m4_defn([AC_PROG_CC])
+[_AM_PROG_CC_C_O
+])
+
# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
# AM_INIT_AUTOMAKE([OPTIONS])
# -----------------------------------------------
@@ -8859,7 +9524,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
# arguments mandatory, and then we can depend on a new Autoconf
# release and drop the old call support.
AC_DEFUN([AM_INIT_AUTOMAKE],
-[AC_PREREQ([2.62])dnl
+[AC_PREREQ([2.65])dnl
dnl Autoconf wants to disallow AM_ names. We explicitly allow
dnl the ones we care about.
m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
@@ -8888,33 +9553,42 @@ AC_SUBST([CYGPATH_W])
# Define the identity of the package.
dnl Distinguish between old-style and new-style calls.
m4_ifval([$2],
-[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+[AC_DIAGNOSE([obsolete],
+ [$0: two- and three-arguments forms are deprecated.])
+m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
AC_SUBST([PACKAGE], [$1])dnl
AC_SUBST([VERSION], [$2])],
[_AM_SET_OPTIONS([$1])dnl
dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
-m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+m4_if(
+ m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
+ [ok:ok],,
[m4_fatal([AC_INIT should be called with package and version arguments])])dnl
AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
_AM_IF_OPTION([no-define],,
-[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
- AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
# Some tools Automake needs.
AC_REQUIRE([AM_SANITY_CHECK])dnl
AC_REQUIRE([AC_ARG_PROGRAM])dnl
-AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
-AM_MISSING_PROG(AUTOCONF, autoconf)
-AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
-AM_MISSING_PROG(AUTOHEADER, autoheader)
-AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+AM_MISSING_PROG([AUTOCONF], [autoconf])
+AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+AM_MISSING_PROG([AUTOHEADER], [autoheader])
+AM_MISSING_PROG([MAKEINFO], [makeinfo])
AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
-AC_REQUIRE([AM_PROG_MKDIR_P])dnl
-# We need awk for the "check" target. The system "awk" is bad on
-# some platforms.
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
+# We need awk for the "check" target (and possibly the TAP driver). The
+# system "awk" is bad on some platforms.
AC_REQUIRE([AC_PROG_AWK])dnl
AC_REQUIRE([AC_PROG_MAKE_SET])dnl
AC_REQUIRE([AM_SET_LEADING_DOT])dnl
@@ -8923,34 +9597,82 @@ _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
[_AM_PROG_TAR([v7])])])
_AM_IF_OPTION([no-dependencies],,
[AC_PROVIDE_IFELSE([AC_PROG_CC],
- [_AM_DEPENDENCIES(CC)],
- [define([AC_PROG_CC],
- defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+ [_AM_DEPENDENCIES([CC])],
+ [m4_define([AC_PROG_CC],
+ m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
AC_PROVIDE_IFELSE([AC_PROG_CXX],
- [_AM_DEPENDENCIES(CXX)],
- [define([AC_PROG_CXX],
- defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+ [_AM_DEPENDENCIES([CXX])],
+ [m4_define([AC_PROG_CXX],
+ m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
AC_PROVIDE_IFELSE([AC_PROG_OBJC],
- [_AM_DEPENDENCIES(OBJC)],
- [define([AC_PROG_OBJC],
- defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+ [_AM_DEPENDENCIES([OBJC])],
+ [m4_define([AC_PROG_OBJC],
+ m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+ [_AM_DEPENDENCIES([OBJCXX])],
+ [m4_define([AC_PROG_OBJCXX],
+ m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
])
-_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
-dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
-dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro
-dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_REQUIRE([AM_SILENT_RULES])dnl
+dnl The testsuite driver may need to know about EXEEXT, so add the
+dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This
+dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
AC_CONFIG_COMMANDS_PRE(dnl
[m4_provide_if([_AM_COMPILER_EXEEXT],
[AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <http://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
+ fi
+fi
+dnl The trailing newline in this macro's definition is deliberate, for
+dnl backward compatibility and to allow trailing 'dnl'-style comments
+dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
])
-dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not
+dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not
dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
dnl mangled by Autoconf and run in a shell conditional statement.
m4_define([_AC_COMPILER_EXEEXT],
m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
-
# When config.status generates a header, we must update the stamp-h file.
# This file resides in the same directory as the config header
# that is generated. The stamp files are numbered to have different names.
@@ -8972,7 +9694,7 @@ for _am_header in $config_headers :; do
done
echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
-# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -8983,7 +9705,7 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co
# Define $install_sh.
AC_DEFUN([AM_PROG_INSTALL_SH],
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-if test x"${install_sh}" != xset; then
+if test x"${install_sh+set}" != xset; then
case $am_aux_dir in
*\ * | *\ *)
install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
@@ -8991,16 +9713,14 @@ if test x"${install_sh}" != xset; then
install_sh="\${SHELL} $am_aux_dir/install-sh"
esac
fi
-AC_SUBST(install_sh)])
+AC_SUBST([install_sh])])
-# Copyright (C) 2003, 2005 Free Software Foundation, Inc.
+# Copyright (C) 2003-2014 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 2
-
# Check whether the underlying file-system supports filenames
# with a leading dot. For instance MS-DOS doesn't.
AC_DEFUN([AM_SET_LEADING_DOT],
@@ -9017,20 +9737,17 @@ AC_SUBST([am__leading_dot])])
# Add --enable-maintainer-mode option to configure. -*- Autoconf -*-
# From Jim Meyering
-# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 5
-
# AM_MAINTAINER_MODE([DEFAULT-MODE])
# ----------------------------------
# Control maintainer-specific portions of Makefiles.
-# Default is to disable them, unless `enable' is passed literally.
-# For symmetry, `disable' may be passed as well. Anyway, the user
+# Default is to disable them, unless 'enable' is passed literally.
+# For symmetry, 'disable' may be passed as well. Anyway, the user
# can override the default with the --enable/--disable switch.
AC_DEFUN([AM_MAINTAINER_MODE],
[m4_case(m4_default([$1], [disable]),
@@ -9038,13 +9755,14 @@ AC_DEFUN([AM_MAINTAINER_MODE],
[disable], [m4_define([am_maintainer_other], [enable])],
[m4_define([am_maintainer_other], [enable])
m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])
-AC_MSG_CHECKING([whether to am_maintainer_other maintainer-specific portions of Makefiles])
+AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
dnl maintainer-mode's default is 'disable' unless 'enable' is passed
AC_ARG_ENABLE([maintainer-mode],
-[ --][am_maintainer_other][-maintainer-mode am_maintainer_other make rules and dependencies not useful
- (and sometimes confusing) to the casual installer],
- [USE_MAINTAINER_MODE=$enableval],
- [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
+ [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode],
+ am_maintainer_other[ make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer])],
+ [USE_MAINTAINER_MODE=$enableval],
+ [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
AC_MSG_RESULT([$USE_MAINTAINER_MODE])
AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
MAINT=$MAINTAINER_MODE_TRUE
@@ -9052,18 +9770,14 @@ AC_MSG_CHECKING([whether to am_maintainer_other maintainer-specific portions of
]
)
-AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
-
# Check to see how 'make' treats includes. -*- Autoconf -*-
-# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 4
-
# AM_MAKE_INCLUDE()
# -----------------
# Check to see how make treats includes.
@@ -9081,7 +9795,7 @@ am__quote=
_am_result=none
# First try GNU make style include.
echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
+# Ignore all kinds of additional output from 'make'.
case `$am_make -s -f confmf 2> /dev/null` in #(
*the\ am__doit\ target*)
am__include=include
@@ -9108,15 +9822,12 @@ rm -f confinc confmf
# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
-# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
-# Free Software Foundation, Inc.
+# Copyright (C) 1997-2014 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 6
-
# AM_MISSING_PROG(NAME, PROGRAM)
# ------------------------------
AC_DEFUN([AM_MISSING_PROG],
@@ -9124,11 +9835,10 @@ AC_DEFUN([AM_MISSING_PROG],
$1=${$1-"${am_missing_run}$2"}
AC_SUBST($1)])
-
# AM_MISSING_HAS_RUN
# ------------------
-# Define MISSING if not defined so far and test if it supports --run.
-# If it does, set am_missing_run to use it, otherwise, to nothing.
+# Define MISSING if not defined so far and test if it is modern enough.
+# If it is, set am_missing_run to use it, otherwise, to nothing.
AC_DEFUN([AM_MISSING_HAS_RUN],
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
AC_REQUIRE_AUX_FILE([missing])dnl
@@ -9141,63 +9851,35 @@ if test x"${MISSING+set}" != xset; then
esac
fi
# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
- am_missing_run="$MISSING --run "
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
else
am_missing_run=
- AC_MSG_WARN([`missing' script is too old or missing])
+ AC_MSG_WARN(['missing' script is too old or missing])
fi
])
-# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_MKDIR_P
-# ---------------
-# Check for `mkdir -p'.
-AC_DEFUN([AM_PROG_MKDIR_P],
-[AC_PREREQ([2.60])dnl
-AC_REQUIRE([AC_PROG_MKDIR_P])dnl
-dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P,
-dnl while keeping a definition of mkdir_p for backward compatibility.
-dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
-dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
-dnl Makefile.ins that do not define MKDIR_P, so we do our own
-dnl adjustment using top_builddir (which is defined more often than
-dnl MKDIR_P).
-AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
-case $mkdir_p in
- [[\\/$]]* | ?:[[\\/]]*) ;;
- */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-])
-
# Helper functions for option handling. -*- Autoconf -*-
-# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 4
-
# _AM_MANGLE_OPTION(NAME)
# -----------------------
AC_DEFUN([_AM_MANGLE_OPTION],
[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
# _AM_SET_OPTION(NAME)
-# ------------------------------
+# --------------------
# Set option NAME. Presently that only means defining a flag for this option.
AC_DEFUN([_AM_SET_OPTION],
-[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
# _AM_SET_OPTIONS(OPTIONS)
-# ----------------------------------
+# ------------------------
# OPTIONS is a space-separated list of Automake options.
AC_DEFUN([_AM_SET_OPTIONS],
[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
@@ -9208,50 +9890,82 @@ AC_DEFUN([_AM_SET_OPTIONS],
AC_DEFUN([_AM_IF_OPTION],
[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
-# Copyright (C) 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2005, 2006
-# Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 5
-
-AC_DEFUN([AM_C_PROTOTYPES],
-[AC_REQUIRE([AC_C_PROTOTYPES])
-if test "$ac_cv_prog_cc_stdc" != no; then
- U= ANSI2KNR=
-else
- U=_ ANSI2KNR=./ansi2knr
+# _AM_PROG_CC_C_O
+# ---------------
+# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC
+# to automatically call this.
+AC_DEFUN([_AM_PROG_CC_C_O],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+ [whether $CC understands -c and -o together],
+ [am_cv_prog_cc_c_o],
+ [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
fi
-# Ensure some checks needed by ansi2knr itself.
-AC_REQUIRE([AC_HEADER_STDC])
-AC_CHECK_HEADERS([string.h])
-AC_SUBST([U])dnl
-AC_SUBST([ANSI2KNR])dnl
-_AM_SUBST_NOTMAKE([ANSI2KNR])dnl
-])
+AC_LANG_POP([C])])
+
+# For backward compatibility.
+AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
-AU_DEFUN([fp_C_PROTOTYPES], [AM_C_PROTOTYPES])
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+ ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ (exit $ac_status); }])
# Check to make sure that the build environment is sane. -*- Autoconf -*-
-# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
-# Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 5
-
# AM_SANITY_CHECK
# ---------------
AC_DEFUN([AM_SANITY_CHECK],
[AC_MSG_CHECKING([whether build environment is sane])
-# Just in case
-sleep 1
-echo timestamp > conftest.file
# Reject unsafe characters in $srcdir or the absolute working directory
# name. Accept space and tab only in the latter.
am_lf='
@@ -9262,32 +9976,40 @@ case `pwd` in
esac
case $srcdir in
*[[\\\"\#\$\&\'\`$am_lf\ \ ]]*)
- AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
+ AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
esac
-# Do `set' in a subshell so we don't clobber the current shell's
+# Do 'set' in a subshell so we don't clobber the current shell's
# arguments. Must try -L first in case configure is actually a
# symlink; some systems play weird games with the mod time of symlinks
# (eg FreeBSD returns the mod time of the symlink's containing
# directory).
if (
- set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
- if test "$[*]" = "X"; then
- # -L didn't work.
- set X `ls -t "$srcdir/configure" conftest.file`
- fi
- rm -f conftest.file
- if test "$[*]" != "X $srcdir/configure conftest.file" \
- && test "$[*]" != "X conftest.file $srcdir/configure"; then
-
- # If neither matched, then we have a broken ls. This can happen
- # if, for instance, CONFIG_SHELL is bash and it inherits a
- # broken ls alias from the environment. This has actually
- # happened. Such a system could not be considered "sane".
- AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
-alias in your environment])
- fi
-
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+ alias in your environment])
+ fi
+ if test "$[2]" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
test "$[2]" = conftest.file
)
then
@@ -9297,36 +10019,85 @@ else
AC_MSG_ERROR([newly created file is older than distributed files!
Check your system clock])
fi
-AC_MSG_RESULT(yes)])
+AC_MSG_RESULT([yes])
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+AC_CONFIG_COMMANDS_PRE(
+ [AC_MSG_CHECKING([that generated files are newer than configure])
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ AC_MSG_RESULT([done])])
+rm -f conftest.file
+])
-# Copyright (C) 2009 Free Software Foundation, Inc.
+# Copyright (C) 2009-2014 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 1
-
# AM_SILENT_RULES([DEFAULT])
# --------------------------
# Enable less verbose build rules; with the default set to DEFAULT
-# (`yes' being less verbose, `no' or empty being verbose).
+# ("yes" being less verbose, "no" or empty being verbose).
AC_DEFUN([AM_SILENT_RULES],
-[AC_ARG_ENABLE([silent-rules],
-[ --enable-silent-rules less verbose build output (undo: `make V=1')
- --disable-silent-rules verbose build output (undo: `make V=0')])
-case $enable_silent_rules in
-yes) AM_DEFAULT_VERBOSITY=0;;
-no) AM_DEFAULT_VERBOSITY=1;;
-*) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+[AC_ARG_ENABLE([silent-rules], [dnl
+AS_HELP_STRING(
+ [--enable-silent-rules],
+ [less verbose build output (undo: "make V=1")])
+AS_HELP_STRING(
+ [--disable-silent-rules],
+ [verbose build output (undo: "make V=0")])dnl
+])
+case $enable_silent_rules in @%:@ (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
esac
+dnl
+dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
+dnl do not support nested variable expansions.
+dnl See automake bug#9928 and bug#10237.
+am_make=${MAKE-make}
+AC_CACHE_CHECK([whether $am_make supports nested variables],
+ [am_cv_make_support_nested_variables],
+ [if AS_ECHO([['TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi])
+if test $am_cv_make_support_nested_variables = yes; then
+ dnl Using '$V' instead of '$(V)' breaks IRIX make.
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AC_SUBST([AM_V])dnl
+AM_SUBST_NOTMAKE([AM_V])dnl
+AC_SUBST([AM_DEFAULT_V])dnl
+AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
AM_BACKSLASH='\'
AC_SUBST([AM_BACKSLASH])dnl
_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
])
-# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -9334,34 +10105,32 @@ _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
# AM_PROG_INSTALL_STRIP
# ---------------------
-# One issue with vendor `install' (even GNU) is that you can't
+# One issue with vendor 'install' (even GNU) is that you can't
# specify the program used to strip binaries. This is especially
# annoying in cross-compiling environments, where the build's strip
# is unlikely to handle the host's binaries.
# Fortunately install-sh will honor a STRIPPROG variable, so we
-# always use install-sh in `make install-strip', and initialize
+# always use install-sh in "make install-strip", and initialize
# STRIPPROG with the value of the STRIP variable (set by the user).
AC_DEFUN([AM_PROG_INSTALL_STRIP],
[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'. However `strip' might not be the right
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+# will honor the 'STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
if test "$cross_compiling" != no; then
AC_CHECK_TOOL([STRIP], [strip], :)
fi
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
AC_SUBST([INSTALL_STRIP_PROGRAM])])
-# Copyright (C) 2006, 2008 Free Software Foundation, Inc.
+# Copyright (C) 2006-2014 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 2
-
# _AM_SUBST_NOTMAKE(VARIABLE)
# ---------------------------
# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
@@ -9369,24 +10138,22 @@ AC_SUBST([INSTALL_STRIP_PROGRAM])])
AC_DEFUN([_AM_SUBST_NOTMAKE])
# AM_SUBST_NOTMAKE(VARIABLE)
-# ---------------------------
+# --------------------------
# Public sister of _AM_SUBST_NOTMAKE.
AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
# Check how to create a tarball. -*- Autoconf -*-
-# Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+# Copyright (C) 2004-2014 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# serial 2
-
# _AM_PROG_TAR(FORMAT)
# --------------------
# Check how to create a tarball in format FORMAT.
-# FORMAT should be one of `v7', `ustar', or `pax'.
+# FORMAT should be one of 'v7', 'ustar', or 'pax'.
#
# Substitute a variable $(am__tar) that is a command
# writing to stdout a FORMAT-tarball containing the directory
@@ -9396,75 +10163,114 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
# Substitute a variable $(am__untar) that extract such
# a tarball read from stdin.
# $(am__untar) < result.tar
+#
AC_DEFUN([_AM_PROG_TAR],
-[# Always define AMTAR for backward compatibility.
-AM_MISSING_PROG([AMTAR], [tar])
-m4_if([$1], [v7],
- [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
- [m4_case([$1], [ustar],, [pax],,
- [m4_fatal([Unknown tar format])])
-AC_MSG_CHECKING([how to create a $1 tar archive])
-# Loop over all known methods to create a tar archive until one works.
+[# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+
+# We'll loop over all known methods to create a tar archive until one works.
_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
-_am_tools=${am_cv_prog_tar_$1-$_am_tools}
-# Do not fold the above two line into one, because Tru64 sh and
-# Solaris sh will not grok spaces in the rhs of `-'.
-for _am_tool in $_am_tools
-do
- case $_am_tool in
- gnutar)
- for _am_tar in tar gnutar gtar;
- do
- AM_RUN_LOG([$_am_tar --version]) && break
- done
- am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
- am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
- am__untar="$_am_tar -xf -"
- ;;
- plaintar)
- # Must skip GNU tar: if it does not support --format= it doesn't create
- # ustar tarball either.
- (tar --version) >/dev/null 2>&1 && continue
- am__tar='tar chf - "$$tardir"'
- am__tar_='tar chf - "$tardir"'
- am__untar='tar xf -'
- ;;
- pax)
- am__tar='pax -L -x $1 -w "$$tardir"'
- am__tar_='pax -L -x $1 -w "$tardir"'
- am__untar='pax -r'
- ;;
- cpio)
- am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
- am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
- am__untar='cpio -i -H $1 -d'
- ;;
- none)
- am__tar=false
- am__tar_=false
- am__untar=false
- ;;
- esac
- # If the value was cached, stop now. We just wanted to have am__tar
- # and am__untar set.
- test -n "${am_cv_prog_tar_$1}" && break
+m4_if([$1], [v7],
+ [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+
+ [m4_case([$1],
+ [ustar],
+ [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+ # There is notably a 21 bits limit for the UID and the GID. In fact,
+ # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+ # and bug#13588).
+ am_max_uid=2097151 # 2^21 - 1
+ am_max_gid=$am_max_uid
+ # The $UID and $GID variables are not portable, so we need to resort
+ # to the POSIX-mandated id(1) utility. Errors in the 'id' calls
+ # below are definitely unexpected, so allow the users to see them
+ # (that is, avoid stderr redirection).
+ am_uid=`id -u || echo unknown`
+ am_gid=`id -g || echo unknown`
+ AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
+ if test $am_uid -le $am_max_uid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi
+ AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
+ if test $am_gid -le $am_max_gid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi],
- # tar/untar a dummy directory, and stop if the command works
- rm -rf conftest.dir
- mkdir conftest.dir
- echo GrepMe > conftest.dir/file
- AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ [pax],
+ [],
+
+ [m4_fatal([Unknown tar format])])
+
+ AC_MSG_CHECKING([how to create a $1 tar archive])
+
+ # Go ahead even if we have the value already cached. We do so because we
+ # need to set the values for the 'am__tar' and 'am__untar' variables.
+ _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+
+ for _am_tool in $_am_tools; do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar; do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # tar/untar a dummy directory, and stop if the command works.
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ AM_RUN_LOG([$am__untar <conftest.tar])
+ AM_RUN_LOG([cat conftest.dir/file])
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+ done
rm -rf conftest.dir
- if test -s conftest.tar; then
- AM_RUN_LOG([$am__untar <conftest.tar])
- grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
- fi
-done
-rm -rf conftest.dir
-AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
-AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+ AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+ AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+
AC_SUBST([am__tar])
AC_SUBST([am__untar])
]) # _AM_PROG_TAR
diff --git a/3rdparty/libjpeg/ansi2knr.1 b/3rdparty/libjpeg/ansi2knr.1
deleted file mode 100644
index f9ee5a631c2..00000000000
--- a/3rdparty/libjpeg/ansi2knr.1
+++ /dev/null
@@ -1,36 +0,0 @@
-.TH ANSI2KNR 1 "19 Jan 1996"
-.SH NAME
-ansi2knr \- convert ANSI C to Kernighan & Ritchie C
-.SH SYNOPSIS
-.I ansi2knr
-[--varargs] input_file [output_file]
-.SH DESCRIPTION
-If no output_file is supplied, output goes to stdout.
-.br
-There are no error messages.
-.sp
-.I ansi2knr
-recognizes function definitions by seeing a non-keyword identifier at the left
-margin, followed by a left parenthesis, with a right parenthesis as the last
-character on the line, and with a left brace as the first token on the
-following line (ignoring possible intervening comments). It will recognize a
-multi-line header provided that no intervening line ends with a left or right
-brace or a semicolon. These algorithms ignore whitespace and comments, except
-that the function name must be the first thing on the line.
-.sp
-The following constructs will confuse it:
-.br
- - Any other construct that starts at the left margin and follows the
-above syntax (such as a macro or function call).
-.br
- - Some macros that tinker with the syntax of the function header.
-.sp
-The --varargs switch is obsolete, and is recognized only for
-backwards compatibility. The present version of
-.I ansi2knr
-will always attempt to convert a ... argument to va_alist and va_dcl.
-.SH AUTHOR
-L. Peter Deutsch <ghost@aladdin.com> wrote the original ansi2knr and
-continues to maintain the current version; most of the code in the current
-version is his work. ansi2knr also includes contributions by Francois
-Pinard <pinard@iro.umontreal.ca> and Jim Avera <jima@netcom.com>.
diff --git a/3rdparty/libjpeg/ansi2knr.c b/3rdparty/libjpeg/ansi2knr.c
deleted file mode 100644
index e84c210b66b..00000000000
--- a/3rdparty/libjpeg/ansi2knr.c
+++ /dev/null
@@ -1,739 +0,0 @@
-/* Copyright (C) 1989, 2000 Aladdin Enterprises. All rights reserved. */
-
-/*$Id: ansi2knr.c,v 1.14 2003/09/06 05:36:56 eggert Exp $*/
-/* Convert ANSI C function definitions to K&R ("traditional C") syntax */
-
-/*
-ansi2knr is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY. No author or distributor accepts responsibility to anyone for the
-consequences of using it or for whether it serves any particular purpose or
-works at all, unless he says so in writing. Refer to the GNU General Public
-License (the "GPL") for full details.
-
-Everyone is granted permission to copy, modify and redistribute ansi2knr,
-but only under the conditions described in the GPL. A copy of this license
-is supposed to have been given to you along with ansi2knr so you can know
-your rights and responsibilities. It should be in a file named COPYLEFT,
-or, if there is no file named COPYLEFT, a file named COPYING. Among other
-things, the copyright notice and this notice must be preserved on all
-copies.
-
-We explicitly state here what we believe is already implied by the GPL: if
-the ansi2knr program is distributed as a separate set of sources and a
-separate executable file which are aggregated on a storage medium together
-with another program, this in itself does not bring the other program under
-the GPL, nor does the mere fact that such a program or the procedures for
-constructing it invoke the ansi2knr executable bring any other part of the
-program under the GPL.
-*/
-
-/*
- * Usage:
- ansi2knr [--filename FILENAME] [INPUT_FILE [OUTPUT_FILE]]
- * --filename provides the file name for the #line directive in the output,
- * overriding input_file (if present).
- * If no input_file is supplied, input is read from stdin.
- * If no output_file is supplied, output goes to stdout.
- * There are no error messages.
- *
- * ansi2knr recognizes function definitions by seeing a non-keyword
- * identifier at the left margin, followed by a left parenthesis, with a
- * right parenthesis as the last character on the line, and with a left
- * brace as the first token on the following line (ignoring possible
- * intervening comments and/or preprocessor directives), except that a line
- * consisting of only
- * identifier1(identifier2)
- * will not be considered a function definition unless identifier2 is
- * the word "void", and a line consisting of
- * identifier1(identifier2, <<arbitrary>>)
- * will not be considered a function definition.
- * ansi2knr will recognize a multi-line header provided that no intervening
- * line ends with a left or right brace or a semicolon. These algorithms
- * ignore whitespace, comments, and preprocessor directives, except that
- * the function name must be the first thing on the line. The following
- * constructs will confuse it:
- * - Any other construct that starts at the left margin and
- * follows the above syntax (such as a macro or function call).
- * - Some macros that tinker with the syntax of function headers.
- */
-
-/*
- * The original and principal author of ansi2knr is L. Peter Deutsch
- * <ghost@aladdin.com>. Other authors are noted in the change history
- * that follows (in reverse chronological order):
-
- lpd 2000-04-12 backs out Eggert's changes because of bugs:
- - concatlits didn't declare the type of its bufend argument;
- - concatlits didn't recognize when it was inside a comment;
- - scanstring could scan backward past the beginning of the string; when
- - the check for \ + newline in scanstring was unnecessary.
-
- 2000-03-05 Paul Eggert <eggert@twinsun.com>
-
- Add support for concatenated string literals.
- * ansi2knr.c (concatlits): New decl.
- (main): Invoke concatlits to concatenate string literals.
- (scanstring): Handle backslash-newline correctly. Work with
- character constants. Fix bug when scanning backwards through
- backslash-quote. Check for unterminated strings.
- (convert1): Parse character constants, too.
- (appendline, concatlits): New functions.
- * ansi2knr.1: Document this.
-
- lpd 1999-08-17 added code to allow preprocessor directives
- wherever comments are allowed
- lpd 1999-04-12 added minor fixes from Pavel Roskin
- <pavel_roskin@geocities.com> for clean compilation with
- gcc -W -Wall
- lpd 1999-03-22 added hack to recognize lines consisting of
- identifier1(identifier2, xxx) as *not* being procedures
- lpd 1999-02-03 made indentation of preprocessor commands consistent
- lpd 1999-01-28 fixed two bugs: a '/' in an argument list caused an
- endless loop; quoted strings within an argument list
- confused the parser
- lpd 1999-01-24 added a check for write errors on the output,
- suggested by Jim Meyering <meyering@ascend.com>
- lpd 1998-11-09 added further hack to recognize identifier(void)
- as being a procedure
- lpd 1998-10-23 added hack to recognize lines consisting of
- identifier1(identifier2) as *not* being procedures
- lpd 1997-12-08 made input_file optional; only closes input and/or
- output file if not stdin or stdout respectively; prints
- usage message on stderr rather than stdout; adds
- --filename switch (changes suggested by
- <ceder@lysator.liu.se>)
- lpd 1996-01-21 added code to cope with not HAVE_CONFIG_H and with
- compilers that don't understand void, as suggested by
- Tom Lane
- lpd 1996-01-15 changed to require that the first non-comment token
- on the line following a function header be a left brace,
- to reduce sensitivity to macros, as suggested by Tom Lane
- <tgl@sss.pgh.pa.us>
- lpd 1995-06-22 removed #ifndefs whose sole purpose was to define
- undefined preprocessor symbols as 0; changed all #ifdefs
- for configuration symbols to #ifs
- lpd 1995-04-05 changed copyright notice to make it clear that
- including ansi2knr in a program does not bring the entire
- program under the GPL
- lpd 1994-12-18 added conditionals for systems where ctype macros
- don't handle 8-bit characters properly, suggested by
- Francois Pinard <pinard@iro.umontreal.ca>;
- removed --varargs switch (this is now the default)
- lpd 1994-10-10 removed CONFIG_BROKETS conditional
- lpd 1994-07-16 added some conditionals to help GNU `configure',
- suggested by Francois Pinard <pinard@iro.umontreal.ca>;
- properly erase prototype args in function parameters,
- contributed by Jim Avera <jima@netcom.com>;
- correct error in writeblanks (it shouldn't erase EOLs)
- lpd 1989-xx-xx original version
- */
-
-/* Most of the conditionals here are to make ansi2knr work with */
-/* or without the GNU configure machinery. */
-
-#if HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <stdio.h>
-#include <ctype.h>
-
-#if HAVE_CONFIG_H
-
-/*
- For properly autoconfiguring ansi2knr, use AC_CONFIG_HEADER(config.h).
- This will define HAVE_CONFIG_H and so, activate the following lines.
- */
-
-# if STDC_HEADERS || HAVE_STRING_H
-# include <string.h>
-# else
-# include <strings.h>
-# endif
-
-#else /* not HAVE_CONFIG_H */
-
-/* Otherwise do it the hard way */
-
-# ifdef BSD
-# include <strings.h>
-# else
-# ifdef VMS
- extern int strlen(), strncmp();
-# else
-# include <string.h>
-# endif
-# endif
-
-#endif /* not HAVE_CONFIG_H */
-
-#if STDC_HEADERS
-# include <stdlib.h>
-#else
-/*
- malloc and free should be declared in stdlib.h,
- but if you've got a K&R compiler, they probably aren't.
- */
-# ifdef MSDOS
-# include <malloc.h>
-# else
-# ifdef VMS
- extern char *malloc();
- extern void free();
-# else
- extern char *malloc();
- extern int free();
-# endif
-# endif
-
-#endif
-
-/* Define NULL (for *very* old compilers). */
-#ifndef NULL
-# define NULL (0)
-#endif
-
-/*
- * The ctype macros don't always handle 8-bit characters correctly.
- * Compensate for this here.
- */
-#ifdef isascii
-# undef HAVE_ISASCII /* just in case */
-# define HAVE_ISASCII 1
-#else
-#endif
-#if STDC_HEADERS || !HAVE_ISASCII
-# define is_ascii(c) 1
-#else
-# define is_ascii(c) isascii(c)
-#endif
-
-#define is_space(c) (is_ascii(c) && isspace(c))
-#define is_alpha(c) (is_ascii(c) && isalpha(c))
-#define is_alnum(c) (is_ascii(c) && isalnum(c))
-
-/* Scanning macros */
-#define isidchar(ch) (is_alnum(ch) || (ch) == '_')
-#define isidfirstchar(ch) (is_alpha(ch) || (ch) == '_')
-
-/* Forward references */
-char *ppdirforward();
-char *ppdirbackward();
-char *skipspace();
-char *scanstring();
-int writeblanks();
-int test1();
-int convert1();
-
-/* The main program */
-int
-main(argc, argv)
- int argc;
- char *argv[];
-{ FILE *in = stdin;
- FILE *out = stdout;
- char *filename = 0;
- char *program_name = argv[0];
- char *output_name = 0;
-#define bufsize 5000 /* arbitrary size */
- char *buf;
- char *line;
- char *more;
- char *usage =
- "Usage: ansi2knr [--filename FILENAME] [INPUT_FILE [OUTPUT_FILE]]\n";
- /*
- * In previous versions, ansi2knr recognized a --varargs switch.
- * If this switch was supplied, ansi2knr would attempt to convert
- * a ... argument to va_alist and va_dcl; if this switch was not
- * supplied, ansi2knr would simply drop any such arguments.
- * Now, ansi2knr always does this conversion, and we only
- * check for this switch for backward compatibility.
- */
- int convert_varargs = 1;
- int output_error;
-
- while ( argc > 1 && argv[1][0] == '-' ) {
- if ( !strcmp(argv[1], "--varargs") ) {
- convert_varargs = 1;
- argc--;
- argv++;
- continue;
- }
- if ( !strcmp(argv[1], "--filename") && argc > 2 ) {
- filename = argv[2];
- argc -= 2;
- argv += 2;
- continue;
- }
- fprintf(stderr, "%s: Unrecognized switch: %s\n", program_name,
- argv[1]);
- fprintf(stderr, usage);
- exit(1);
- }
- switch ( argc )
- {
- default:
- fprintf(stderr, usage);
- exit(0);
- case 3:
- output_name = argv[2];
- out = fopen(output_name, "w");
- if ( out == NULL ) {
- fprintf(stderr, "%s: Cannot open output file %s\n",
- program_name, output_name);
- exit(1);
- }
- /* falls through */
- case 2:
- in = fopen(argv[1], "r");
- if ( in == NULL ) {
- fprintf(stderr, "%s: Cannot open input file %s\n",
- program_name, argv[1]);
- exit(1);
- }
- if ( filename == 0 )
- filename = argv[1];
- /* falls through */
- case 1:
- break;
- }
- if ( filename )
- fprintf(out, "#line 1 \"%s\"\n", filename);
- buf = malloc(bufsize);
- if ( buf == NULL )
- {
- fprintf(stderr, "Unable to allocate read buffer!\n");
- exit(1);
- }
- line = buf;
- while ( fgets(line, (unsigned)(buf + bufsize - line), in) != NULL )
- {
-test: line += strlen(line);
- switch ( test1(buf) )
- {
- case 2: /* a function header */
- convert1(buf, out, 1, convert_varargs);
- break;
- case 1: /* a function */
- /* Check for a { at the start of the next line. */
- more = ++line;
-f: if ( line >= buf + (bufsize - 1) ) /* overflow check */
- goto wl;
- if ( fgets(line, (unsigned)(buf + bufsize - line), in) == NULL )
- goto wl;
- switch ( *skipspace(ppdirforward(more), 1) )
- {
- case '{':
- /* Definitely a function header. */
- convert1(buf, out, 0, convert_varargs);
- fputs(more, out);
- break;
- case 0:
- /* The next line was blank or a comment: */
- /* keep scanning for a non-comment. */
- line += strlen(line);
- goto f;
- default:
- /* buf isn't a function header, but */
- /* more might be. */
- fputs(buf, out);
- strcpy(buf, more);
- line = buf;
- goto test;
- }
- break;
- case -1: /* maybe the start of a function */
- if ( line != buf + (bufsize - 1) ) /* overflow check */
- continue;
- /* falls through */
- default: /* not a function */
-wl: fputs(buf, out);
- break;
- }
- line = buf;
- }
- if ( line != buf )
- fputs(buf, out);
- free(buf);
- if ( output_name ) {
- output_error = ferror(out);
- output_error |= fclose(out);
- } else { /* out == stdout */
- fflush(out);
- output_error = ferror(out);
- }
- if ( output_error ) {
- fprintf(stderr, "%s: error writing to %s\n", program_name,
- (output_name ? output_name : "stdout"));
- exit(1);
- }
- if ( in != stdin )
- fclose(in);
- return 0;
-}
-
-/*
- * Skip forward or backward over one or more preprocessor directives.
- */
-char *
-ppdirforward(p)
- char *p;
-{
- for (; *p == '#'; ++p) {
- for (; *p != '\r' && *p != '\n'; ++p)
- if (*p == 0)
- return p;
- if (*p == '\r' && p[1] == '\n')
- ++p;
- }
- return p;
-}
-char *
-ppdirbackward(p, limit)
- char *p;
- char *limit;
-{
- char *np = p;
-
- for (;; p = --np) {
- if (*np == '\n' && np[-1] == '\r')
- --np;
- for (; np > limit && np[-1] != '\r' && np[-1] != '\n'; --np)
- if (np[-1] == 0)
- return np;
- if (*np != '#')
- return p;
- }
-}
-
-/*
- * Skip over whitespace, comments, and preprocessor directives,
- * in either direction.
- */
-char *
-skipspace(p, dir)
- char *p;
- int dir; /* 1 for forward, -1 for backward */
-{
- for ( ; ; ) {
- while ( is_space(*p) )
- p += dir;
- if ( !(*p == '/' && p[dir] == '*') )
- break;
- p += dir; p += dir;
- while ( !(*p == '*' && p[dir] == '/') ) {
- if ( *p == 0 )
- return p; /* multi-line comment?? */
- p += dir;
- }
- p += dir; p += dir;
- }
- return p;
-}
-
-/* Scan over a quoted string, in either direction. */
-char *
-scanstring(p, dir)
- char *p;
- int dir;
-{
- for (p += dir; ; p += dir)
- if (*p == '"' && p[-dir] != '\\')
- return p + dir;
-}
-
-/*
- * Write blanks over part of a string.
- * Don't overwrite end-of-line characters.
- */
-int
-writeblanks(start, end)
- char *start;
- char *end;
-{ char *p;
- for ( p = start; p < end; p++ )
- if ( *p != '\r' && *p != '\n' )
- *p = ' ';
- return 0;
-}
-
-/*
- * Test whether the string in buf is a function definition.
- * The string may contain and/or end with a newline.
- * Return as follows:
- * 0 - definitely not a function definition;
- * 1 - definitely a function definition;
- * 2 - definitely a function prototype (NOT USED);
- * -1 - may be the beginning of a function definition,
- * append another line and look again.
- * The reason we don't attempt to convert function prototypes is that
- * Ghostscript's declaration-generating macros look too much like
- * prototypes, and confuse the algorithms.
- */
-int
-test1(buf)
- char *buf;
-{ char *p = buf;
- char *bend;
- char *endfn;
- int contin;
-
- if ( !isidfirstchar(*p) )
- return 0; /* no name at left margin */
- bend = skipspace(ppdirbackward(buf + strlen(buf) - 1, buf), -1);
- switch ( *bend )
- {
- case ';': contin = 0 /*2*/; break;
- case ')': contin = 1; break;
- case '{': return 0; /* not a function */
- case '}': return 0; /* not a function */
- default: contin = -1;
- }
- while ( isidchar(*p) )
- p++;
- endfn = p;
- p = skipspace(p, 1);
- if ( *p++ != '(' )
- return 0; /* not a function */
- p = skipspace(p, 1);
- if ( *p == ')' )
- return 0; /* no parameters */
- /* Check that the apparent function name isn't a keyword. */
- /* We only need to check for keywords that could be followed */
- /* by a left parenthesis (which, unfortunately, is most of them). */
- { static char *words[] =
- { "asm", "auto", "case", "char", "const", "double",
- "extern", "float", "for", "if", "int", "long",
- "register", "return", "short", "signed", "sizeof",
- "static", "switch", "typedef", "unsigned",
- "void", "volatile", "while", 0
- };
- char **key = words;
- char *kp;
- unsigned len = endfn - buf;
-
- while ( (kp = *key) != 0 )
- { if ( strlen(kp) == len && !strncmp(kp, buf, len) )
- return 0; /* name is a keyword */
- key++;
- }
- }
- {
- char *id = p;
- int len;
- /*
- * Check for identifier1(identifier2) and not
- * identifier1(void), or identifier1(identifier2, xxxx).
- */
-
- while ( isidchar(*p) )
- p++;
- len = p - id;
- p = skipspace(p, 1);
- if (*p == ',' ||
- (*p == ')' && (len != 4 || strncmp(id, "void", 4)))
- )
- return 0; /* not a function */
- }
- /*
- * If the last significant character was a ), we need to count
- * parentheses, because it might be part of a formal parameter
- * that is a procedure.
- */
- if (contin > 0) {
- int level = 0;
-
- for (p = skipspace(buf, 1); *p; p = skipspace(p + 1, 1))
- level += (*p == '(' ? 1 : *p == ')' ? -1 : 0);
- if (level > 0)
- contin = -1;
- }
- return contin;
-}
-
-/* Convert a recognized function definition or header to K&R syntax. */
-int
-convert1(buf, out, header, convert_varargs)
- char *buf;
- FILE *out;
- int header; /* Boolean */
- int convert_varargs; /* Boolean */
-{ char *endfn;
- char *p;
- /*
- * The breaks table contains pointers to the beginning and end
- * of each argument.
- */
- char **breaks;
- unsigned num_breaks = 2; /* for testing */
- char **btop;
- char **bp;
- char **ap;
- char *vararg = 0;
-
- /* Pre-ANSI implementations don't agree on whether strchr */
- /* is called strchr or index, so we open-code it here. */
- for ( endfn = buf; *(endfn++) != '('; )
- ;
-top: p = endfn;
- breaks = (char **)malloc(sizeof(char *) * num_breaks * 2);
- if ( breaks == NULL )
- { /* Couldn't allocate break table, give up */
- fprintf(stderr, "Unable to allocate break table!\n");
- fputs(buf, out);
- return -1;
- }
- btop = breaks + num_breaks * 2 - 2;
- bp = breaks;
- /* Parse the argument list */
- do
- { int level = 0;
- char *lp = NULL;
- char *rp = NULL;
- char *end = NULL;
-
- if ( bp >= btop )
- { /* Filled up break table. */
- /* Allocate a bigger one and start over. */
- free((char *)breaks);
- num_breaks <<= 1;
- goto top;
- }
- *bp++ = p;
- /* Find the end of the argument */
- for ( ; end == NULL; p++ )
- { switch(*p)
- {
- case ',':
- if ( !level ) end = p;
- break;
- case '(':
- if ( !level ) lp = p;
- level++;
- break;
- case ')':
- if ( --level < 0 ) end = p;
- else rp = p;
- break;
- case '/':
- if (p[1] == '*')
- p = skipspace(p, 1) - 1;
- break;
- case '"':
- p = scanstring(p, 1) - 1;
- break;
- default:
- ;
- }
- }
- /* Erase any embedded prototype parameters. */
- if ( lp && rp )
- writeblanks(lp + 1, rp);
- p--; /* back up over terminator */
- /* Find the name being declared. */
- /* This is complicated because of procedure and */
- /* array modifiers. */
- for ( ; ; )
- { p = skipspace(p - 1, -1);
- switch ( *p )
- {
- case ']': /* skip array dimension(s) */
- case ')': /* skip procedure args OR name */
- { int level = 1;
- while ( level )
- switch ( *--p )
- {
- case ']': case ')':
- level++;
- break;
- case '[': case '(':
- level--;
- break;
- case '/':
- if (p > buf && p[-1] == '*')
- p = skipspace(p, -1) + 1;
- break;
- case '"':
- p = scanstring(p, -1) + 1;
- break;
- default: ;
- }
- }
- if ( *p == '(' && *skipspace(p + 1, 1) == '*' )
- { /* We found the name being declared */
- while ( !isidfirstchar(*p) )
- p = skipspace(p, 1) + 1;
- goto found;
- }
- break;
- default:
- goto found;
- }
- }
-found: if ( *p == '.' && p[-1] == '.' && p[-2] == '.' )
- { if ( convert_varargs )
- { *bp++ = "va_alist";
- vararg = p-2;
- }
- else
- { p++;
- if ( bp == breaks + 1 ) /* sole argument */
- writeblanks(breaks[0], p);
- else
- writeblanks(bp[-1] - 1, p);
- bp--;
- }
- }
- else
- { while ( isidchar(*p) ) p--;
- *bp++ = p+1;
- }
- p = end;
- }
- while ( *p++ == ',' );
- *bp = p;
- /* Make a special check for 'void' arglist */
- if ( bp == breaks+2 )
- { p = skipspace(breaks[0], 1);
- if ( !strncmp(p, "void", 4) )
- { p = skipspace(p+4, 1);
- if ( p == breaks[2] - 1 )
- { bp = breaks; /* yup, pretend arglist is empty */
- writeblanks(breaks[0], p + 1);
- }
- }
- }
- /* Put out the function name and left parenthesis. */
- p = buf;
- while ( p != endfn ) putc(*p, out), p++;
- /* Put out the declaration. */
- if ( header )
- { fputs(");", out);
- for ( p = breaks[0]; *p; p++ )
- if ( *p == '\r' || *p == '\n' )
- putc(*p, out);
- }
- else
- { for ( ap = breaks+1; ap < bp; ap += 2 )
- { p = *ap;
- while ( isidchar(*p) )
- putc(*p, out), p++;
- if ( ap < bp - 1 )
- fputs(", ", out);
- }
- fputs(") ", out);
- /* Put out the argument declarations */
- for ( ap = breaks+2; ap <= bp; ap += 2 )
- (*ap)[-1] = ';';
- if ( vararg != 0 )
- { *vararg = 0;
- fputs(breaks[0], out); /* any prior args */
- fputs("va_dcl", out); /* the final arg */
- fputs(bp[0], out);
- }
- else
- fputs(breaks[0], out);
- }
- free((char *)breaks);
- return 0;
-}
diff --git a/3rdparty/libjpeg/ar-lib b/3rdparty/libjpeg/ar-lib
new file mode 100644
index 00000000000..463b9ec0206
--- /dev/null
+++ b/3rdparty/libjpeg/ar-lib
@@ -0,0 +1,270 @@
+#! /bin/sh
+# Wrapper for Microsoft lib.exe
+
+me=ar-lib
+scriptversion=2012-03-01.08; # UTC
+
+# Copyright (C) 2010-2014 Free Software Foundation, Inc.
+# Written by Peter Rosin <peda@lysator.liu.se>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+
+# func_error message
+func_error ()
+{
+ echo "$me: $1" 1>&2
+ exit 1
+}
+
+file_conv=
+
+# func_file_conv build_file
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts.
+func_file_conv ()
+{
+ file=$1
+ case $file in
+ / | /[!/]*) # absolute file, and not a UNC file
+ if test -z "$file_conv"; then
+ # lazily determine how to convert abs files
+ case `uname -s` in
+ MINGW*)
+ file_conv=mingw
+ ;;
+ CYGWIN*)
+ file_conv=cygwin
+ ;;
+ *)
+ file_conv=wine
+ ;;
+ esac
+ fi
+ case $file_conv in
+ mingw)
+ file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+ ;;
+ cygwin)
+ file=`cygpath -m "$file" || echo "$file"`
+ ;;
+ wine)
+ file=`winepath -w "$file" || echo "$file"`
+ ;;
+ esac
+ ;;
+ esac
+}
+
+# func_at_file at_file operation archive
+# Iterate over all members in AT_FILE performing OPERATION on ARCHIVE
+# for each of them.
+# When interpreting the content of the @FILE, do NOT use func_file_conv,
+# since the user would need to supply preconverted file names to
+# binutils ar, at least for MinGW.
+func_at_file ()
+{
+ operation=$2
+ archive=$3
+ at_file_contents=`cat "$1"`
+ eval set x "$at_file_contents"
+ shift
+
+ for member
+ do
+ $AR -NOLOGO $operation:"$member" "$archive" || exit $?
+ done
+}
+
+case $1 in
+ '')
+ func_error "no command. Try '$0 --help' for more information."
+ ;;
+ -h | --h*)
+ cat <<EOF
+Usage: $me [--help] [--version] PROGRAM ACTION ARCHIVE [MEMBER...]
+
+Members may be specified in a file named with @FILE.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "$me, version $scriptversion"
+ exit $?
+ ;;
+esac
+
+if test $# -lt 3; then
+ func_error "you must specify a program, an action and an archive"
+fi
+
+AR=$1
+shift
+while :
+do
+ if test $# -lt 2; then
+ func_error "you must specify a program, an action and an archive"
+ fi
+ case $1 in
+ -lib | -LIB \
+ | -ltcg | -LTCG \
+ | -machine* | -MACHINE* \
+ | -subsystem* | -SUBSYSTEM* \
+ | -verbose | -VERBOSE \
+ | -wx* | -WX* )
+ AR="$AR $1"
+ shift
+ ;;
+ *)
+ action=$1
+ shift
+ break
+ ;;
+ esac
+done
+orig_archive=$1
+shift
+func_file_conv "$orig_archive"
+archive=$file
+
+# strip leading dash in $action
+action=${action#-}
+
+delete=
+extract=
+list=
+quick=
+replace=
+index=
+create=
+
+while test -n "$action"
+do
+ case $action in
+ d*) delete=yes ;;
+ x*) extract=yes ;;
+ t*) list=yes ;;
+ q*) quick=yes ;;
+ r*) replace=yes ;;
+ s*) index=yes ;;
+ S*) ;; # the index is always updated implicitly
+ c*) create=yes ;;
+ u*) ;; # TODO: don't ignore the update modifier
+ v*) ;; # TODO: don't ignore the verbose modifier
+ *)
+ func_error "unknown action specified"
+ ;;
+ esac
+ action=${action#?}
+done
+
+case $delete$extract$list$quick$replace,$index in
+ yes,* | ,yes)
+ ;;
+ yesyes*)
+ func_error "more than one action specified"
+ ;;
+ *)
+ func_error "no action specified"
+ ;;
+esac
+
+if test -n "$delete"; then
+ if test ! -f "$orig_archive"; then
+ func_error "archive not found"
+ fi
+ for member
+ do
+ case $1 in
+ @*)
+ func_at_file "${1#@}" -REMOVE "$archive"
+ ;;
+ *)
+ func_file_conv "$1"
+ $AR -NOLOGO -REMOVE:"$file" "$archive" || exit $?
+ ;;
+ esac
+ done
+
+elif test -n "$extract"; then
+ if test ! -f "$orig_archive"; then
+ func_error "archive not found"
+ fi
+ if test $# -gt 0; then
+ for member
+ do
+ case $1 in
+ @*)
+ func_at_file "${1#@}" -EXTRACT "$archive"
+ ;;
+ *)
+ func_file_conv "$1"
+ $AR -NOLOGO -EXTRACT:"$file" "$archive" || exit $?
+ ;;
+ esac
+ done
+ else
+ $AR -NOLOGO -LIST "$archive" | sed -e 's/\\/\\\\/g' | while read member
+ do
+ $AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $?
+ done
+ fi
+
+elif test -n "$quick$replace"; then
+ if test ! -f "$orig_archive"; then
+ if test -z "$create"; then
+ echo "$me: creating $orig_archive"
+ fi
+ orig_archive=
+ else
+ orig_archive=$archive
+ fi
+
+ for member
+ do
+ case $1 in
+ @*)
+ func_file_conv "${1#@}"
+ set x "$@" "@$file"
+ ;;
+ *)
+ func_file_conv "$1"
+ set x "$@" "$file"
+ ;;
+ esac
+ shift
+ shift
+ done
+
+ if test -n "$orig_archive"; then
+ $AR -NOLOGO -OUT:"$archive" "$orig_archive" "$@" || exit $?
+ else
+ $AR -NOLOGO -OUT:"$archive" "$@" || exit $?
+ fi
+
+elif test -n "$list"; then
+ if test ! -f "$orig_archive"; then
+ func_error "archive not found"
+ fi
+ $AR -NOLOGO -LIST "$archive" || exit $?
+fi
diff --git a/3rdparty/libjpeg/change.log b/3rdparty/libjpeg/change.log
index 94865b3f9ce..b8439f41434 100644
--- a/3rdparty/libjpeg/change.log
+++ b/3rdparty/libjpeg/change.log
@@ -1,6 +1,112 @@
CHANGE LOG for Independent JPEG Group's JPEG software
+Version 9b 17-Jan-2016
+-----------------------
+
+Improvements and optimizations in DCT and color calculations.
+Normalize range limit array composition and access pattern.
+Thank to Sia Furler and Maddie Ziegler for inspiration.
+
+Use merged upsample with scaled DCT sizes larger than 8.
+Thank to Taylor Hatala for inspiration.
+
+Check for excessive comment lengths in argument parsing in wrjpgcom.c.
+Thank to Julian Cohen for hint.
+
+Add makefile.b32 for use with Borland C++ 32-bit (bcc32).
+Thank to Joe Slater for contribution.
+
+Document 'f' specifier for jpegtran -crop specification.
+Thank to Michele Martone for suggestion.
+
+Use defined value from header instead of hardwired number in rdswitch.c.
+Thank to Robert Sprowson for hint.
+
+
+Version 9a 19-Jan-2014
+-----------------------
+
+Add support for wide gamut color spaces (JFIF version 2).
+Improve clarity and accuracy in color conversion modules.
+Note: Requires rebuild of test images.
+
+Extend the bit depth support to all values from 8 to 12
+(BITS_IN_JSAMPLE configuration option in jmorecfg.h).
+jpegtran now supports N bits sample data precision with all N from 8 to 12
+in a single instance. Thank to Roland Fassauer for inspiration.
+
+Try to resolve issues with new boolean type definition.
+Thank also to v4hn for suggestion.
+
+Enable option to use default Huffman tables for lossless compression
+(for hardware solution), and in this case improve lossless RGB compression
+with reversible color transform. Thank to Benny Alexandar for hint.
+
+Extend the entropy decoding structure, so that extraneous bytes between
+compressed scan data and following marker can be reported correctly.
+Thank to Nigel Tao for hint.
+
+Add jpegtran -wipe option and extension for -crop.
+Thank to Andrew Senior, David Clunie, and Josef Schmid for suggestion.
+
+
+Version 9 13-Jan-2013
+----------------------
+
+Add cjpeg -rgb1 option to create an RGB JPEG file, and insert
+a simple reversible color transform into the processing which
+significantly improves the compression.
+The recommended command for lossless coding of RGB images is now
+cjpeg -rgb1 -block 1 -arithmetic.
+As said, this option improves the compression significantly, but
+the files are not compatible with JPEG decoders prior to IJG v9
+due to the included color transform.
+The used color transform and marker signaling is compatible with
+other JPEG standards (e.g., JPEG-LS part 2).
+
+Remove the automatic de-ANSI-fication support (Automake 1.12).
+Thank also to Nitin A Kamble for suggestion.
+
+Add remark for jpeg_mem_dest() in jdatadst.c.
+Thank to Elie-Gregoire Khoury for the hint.
+
+Support files with invalid component identifiers (created
+by Adobe PDF). Thank to Robin Watts for the suggestion.
+
+Adapt full buffer case in jcmainct.c for use with scaled DCT.
+Thank to Sergii Biloshytskyi for the suggestion.
+
+Add type identifier for declaration of noreturn functions.
+Thank to Brett L. Moore for the suggestion.
+
+Correct argument type in format string, avoid compiler warnings.
+Thank to Vincent Torri for hint.
+
+Add missing #include directives in configuration checks, avoid
+configuration errors. Thank to John Spencer for the hint.
+
+
+Version 8d 15-Jan-2012
+-----------------------
+
+Add cjpeg -rgb option to create RGB JPEG files.
+Using this switch suppresses the conversion from RGB
+colorspace input to the default YCbCr JPEG colorspace.
+This feature allows true lossless JPEG coding of RGB color images.
+The recommended command for this purpose is currently
+cjpeg -rgb -block 1 -arithmetic.
+SmartScale capable decoder (introduced with IJG JPEG 8) required.
+Thank to Michael Koch for the initial suggestion.
+
+Add option to disable the region adjustment in the transupp crop code.
+Thank to Jeffrey Friedl for the suggestion.
+
+Thank to Richard Jones and Edd Dawson for various minor corrections.
+
+Thank to Akim Demaille for configure.ac cleanup.
+
+
Version 8c 16-Jan-2011
-----------------------
diff --git a/3rdparty/libjpeg/cjpeg.1 b/3rdparty/libjpeg/cjpeg.1
index d50bf80956b..7d685be581a 100644
--- a/3rdparty/libjpeg/cjpeg.1
+++ b/3rdparty/libjpeg/cjpeg.1
@@ -1,4 +1,4 @@
-.TH CJPEG 1 "14 November 2010"
+.TH CJPEG 1 "26 July 2015"
.SH NAME
cjpeg \- compress an image file to a JPEG file
.SH SYNOPSIS
@@ -16,7 +16,7 @@ cjpeg \- compress an image file to a JPEG file
compresses the named image file, or the standard input if no file is
named, and produces a JPEG/JFIF file on the standard output.
The currently supported input file formats are: PPM (PBMPLUS color
-format), PGM (PBMPLUS gray-scale format), BMP, Targa, and RLE (Utah Raster
+format), PGM (PBMPLUS grayscale format), BMP, Targa, and RLE (Utah Raster
Toolkit format). (RLE is supported only if the URT library is available.)
.SH OPTIONS
All switch names may be abbreviated; for example,
@@ -49,6 +49,17 @@ By saying
.BR \-grayscale ,
you'll get a smaller JPEG file that takes less time to process.
.TP
+.B \-rgb
+Create RGB JPEG file.
+Using this switch suppresses the conversion from RGB
+colorspace input to the default YCbCr JPEG colorspace.
+You can use this switch in combination with the
+.BI \-block " N"
+switch (see below) for lossless JPEG coding.
+See also the
+.B \-rgb1
+switch below.
+.TP
.B \-optimize
Perform optimization of entropy encoding parameters. Without this, default
encoding parameters are used.
@@ -155,6 +166,12 @@ about the same --- often a little smaller.
.PP
Switches for advanced users:
.TP
+.B \-arithmetic
+Use arithmetic coding.
+.B Caution:
+arithmetic coded JPEG is not yet widely implemented, so many decoders will
+be unable to view an arithmetic coded JPEG file at all.
+.TP
.BI \-block " N"
Set DCT block size. All N from 1 to 16 are possible.
Default is 8 (baseline format).
@@ -162,9 +179,45 @@ Larger values produce higher compression,
smaller values produce higher quality
(exact DCT stage possible with 1 or 2; with the default quality of 75 and
default Luminance qtable the DCT+Quantization stage is lossless for N=1).
-CAUTION: An implementation of the JPEG SmartScale extension is required for
-this feature. SmartScale enabled JPEG is not yet widely implemented, so
-many decoders will be unable to view a SmartScale extended JPEG file at all.
+.B Caution:
+An implementation of the JPEG SmartScale extension is required for this
+feature. SmartScale enabled JPEG is not yet widely implemented, so many
+decoders will be unable to view a SmartScale extended JPEG file at all.
+.TP
+.B \-rgb1
+Create RGB JPEG file with reversible color transform.
+Works like the
+.B \-rgb
+switch (see above) and inserts a simple reversible color transform
+into the processing which significantly improves the compression.
+Use this switch in combination with the
+.BI \-block " N"
+switch (see above) for lossless JPEG coding.
+.B Caution:
+A decoder with inverse color transform support is required for
+this feature. Reversible color transform support is not yet
+widely implemented, so many decoders will be unable to view
+a reversible color transformed JPEG file at all.
+.TP
+.B \-bgycc
+Create big gamut YCC JPEG file.
+In this type of encoding the color difference components are quantized
+further by a factor of 2 compared to the normal Cb/Cr values, thus creating
+space to allow larger color values with higher saturation than the normal
+gamut limits to be encoded. In order to compensate for the loss of color
+fidelity compared to a normal YCC encoded file, the color quantization
+tables can be adjusted accordingly. For example,
+.B cjpeg \-bgycc \-quality
+80,90 will give similar results as
+.B cjpeg \-quality
+80.
+.B Caution:
+For correct decompression a decoder with big gamut YCC support (JFIF
+version 2) is required. An old decoder may or may not display a big
+gamut YCC encoded JPEG file, depending on JFIF version check and
+corresponding warning/error configuration. In case of a granted
+decompression the old decoder will display the image with half
+saturated colors.
.TP
.B \-dct int
Use integer DCT method (default).
@@ -233,12 +286,6 @@ visibly blur the image, however.
.PP
Switches for wizards:
.TP
-.B \-arithmetic
-Use arithmetic coding.
-.B Caution:
-arithmetic coded JPEG is not yet widely implemented, so many decoders will be
-unable to view an arithmetic coded JPEG file at all.
-.TP
.B \-baseline
Force baseline-compatible quantization tables to be generated. This clamps
quantization values to 8 bits even at low quality settings. (This switch is
@@ -328,7 +375,8 @@ Communications of the ACM, April 1991 (vol. 34, no. 4), pp. 30-44.
.SH AUTHOR
Independent JPEG Group
.SH BUGS
-GIF input files are no longer supported, to avoid the Unisys LZW patent.
+GIF input files are no longer supported, to avoid the Unisys LZW patent
+(now expired).
(Conversion of GIF files to JPEG is usually a bad idea anyway.)
.PP
Not all variants of BMP and Targa file formats are supported.
diff --git a/3rdparty/libjpeg/cjpeg.c b/3rdparty/libjpeg/cjpeg.c
index 40d25215d1c..3cb07fa4ba7 100644
--- a/3rdparty/libjpeg/cjpeg.c
+++ b/3rdparty/libjpeg/cjpeg.c
@@ -2,7 +2,7 @@
* cjpeg.c
*
* Copyright (C) 1991-1998, Thomas G. Lane.
- * Modified 2003-2010 by Guido Vollbeding.
+ * Modified 2003-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -152,6 +152,7 @@ usage (void)
fprintf(stderr, "Switches (names may be abbreviated):\n");
fprintf(stderr, " -quality N[,...] Compression quality (0..100; 5-95 is useful range)\n");
fprintf(stderr, " -grayscale Create monochrome JPEG file\n");
+ fprintf(stderr, " -rgb Create RGB JPEG file\n");
#ifdef ENTROPY_OPT_SUPPORTED
fprintf(stderr, " -optimize Optimize Huffman table (smaller file, but slow compression)\n");
#endif
@@ -165,9 +166,16 @@ usage (void)
fprintf(stderr, " -targa Input file is Targa format (usually not needed)\n");
#endif
fprintf(stderr, "Switches for advanced users:\n");
+#ifdef C_ARITH_CODING_SUPPORTED
+ fprintf(stderr, " -arithmetic Use arithmetic coding\n");
+#endif
#ifdef DCT_SCALING_SUPPORTED
fprintf(stderr, " -block N DCT block size (1..16; default is 8)\n");
#endif
+#if JPEG_LIB_VERSION_MAJOR >= 9
+ fprintf(stderr, " -rgb1 Create RGB JPEG file with reversible color transform\n");
+ fprintf(stderr, " -bgycc Create big gamut YCC JPEG file\n");
+#endif
#ifdef DCT_ISLOW_SUPPORTED
fprintf(stderr, " -dct int Use integer DCT method%s\n",
(JDCT_DEFAULT == JDCT_ISLOW ? " (default)" : ""));
@@ -189,9 +197,6 @@ usage (void)
fprintf(stderr, " -outfile name Specify name for output file\n");
fprintf(stderr, " -verbose or -debug Emit debug output\n");
fprintf(stderr, "Switches for wizards:\n");
-#ifdef C_ARITH_CODING_SUPPORTED
- fprintf(stderr, " -arithmetic Use arithmetic coding\n");
-#endif
fprintf(stderr, " -baseline Force baseline quantization tables\n");
fprintf(stderr, " -qtables file Use quantization tables given in file\n");
fprintf(stderr, " -qslots N[,...] Set component quantization tables\n");
@@ -263,9 +268,8 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
} else if (keymatch(arg, "block", 2)) {
/* Set DCT block size. */
-#if defined(DCT_SCALING_SUPPORTED) && defined(JPEG_LIB_VERSION_MAJOR) && \
- (JPEG_LIB_VERSION_MAJOR > 8 || (JPEG_LIB_VERSION_MAJOR == 8 && \
- defined(JPEG_LIB_VERSION_MINOR) && JPEG_LIB_VERSION_MINOR >= 3))
+#if defined DCT_SCALING_SUPPORTED && JPEG_LIB_VERSION_MAJOR >= 8 && \
+ (JPEG_LIB_VERSION_MAJOR > 8 || JPEG_LIB_VERSION_MINOR >= 3)
int val;
if (++argn >= argc) /* advance to next argument */
@@ -310,6 +314,27 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
/* Force a monochrome JPEG file to be generated. */
jpeg_set_colorspace(cinfo, JCS_GRAYSCALE);
+ } else if (keymatch(arg, "rgb", 3) || keymatch(arg, "rgb1", 4)) {
+ /* Force an RGB JPEG file to be generated. */
+#if JPEG_LIB_VERSION_MAJOR >= 9
+ /* Note: Entropy table assignment in jpeg_set_colorspace depends
+ * on color_transform.
+ */
+ cinfo->color_transform = arg[3] ? JCT_SUBTRACT_GREEN : JCT_NONE;
+#endif
+ jpeg_set_colorspace(cinfo, JCS_RGB);
+
+ } else if (keymatch(arg, "bgycc", 5)) {
+ /* Force a big gamut YCC JPEG file to be generated. */
+#if JPEG_LIB_VERSION_MAJOR >= 9 && \
+ (JPEG_LIB_VERSION_MAJOR > 9 || JPEG_LIB_VERSION_MINOR >= 1)
+ jpeg_set_colorspace(cinfo, JCS_BG_YCC);
+#else
+ fprintf(stderr, "%s: sorry, BG_YCC colorspace not supported\n",
+ progname);
+ exit(EXIT_FAILURE);
+#endif
+
} else if (keymatch(arg, "maxmemory", 3)) {
/* Maximum memory in Kb (or Mb with 'm'). */
long lval;
@@ -324,7 +349,7 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
cinfo->mem->max_memory_to_use = lval * 1000L;
} else if (keymatch(arg, "nosmooth", 3)) {
- /* Suppress fancy downsampling */
+ /* Suppress fancy downsampling. */
cinfo->do_fancy_downsampling = FALSE;
} else if (keymatch(arg, "optimize", 1) || keymatch(arg, "optimise", 1)) {
@@ -410,7 +435,7 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
/* Scale the image by a fraction M/N. */
if (++argn >= argc) /* advance to next argument */
usage();
- if (sscanf(argv[argn], "%d/%d",
+ if (sscanf(argv[argn], "%u/%u",
&cinfo->scale_num, &cinfo->scale_denom) != 2)
usage();
diff --git a/3rdparty/libjpeg/compile b/3rdparty/libjpeg/compile
new file mode 100644
index 00000000000..a85b723c7e6
--- /dev/null
+++ b/3rdparty/libjpeg/compile
@@ -0,0 +1,347 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand '-c -o'.
+
+scriptversion=2012-10-14.11; # UTC
+
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+nl='
+'
+
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent tools from complaining about whitespace usage.
+IFS=" "" $nl"
+
+file_conv=
+
+# func_file_conv build_file lazy
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts. If the determined conversion
+# type is listed in (the comma separated) LAZY, no conversion will
+# take place.
+func_file_conv ()
+{
+ file=$1
+ case $file in
+ / | /[!/]*) # absolute file, and not a UNC file
+ if test -z "$file_conv"; then
+ # lazily determine how to convert abs files
+ case `uname -s` in
+ MINGW*)
+ file_conv=mingw
+ ;;
+ CYGWIN*)
+ file_conv=cygwin
+ ;;
+ *)
+ file_conv=wine
+ ;;
+ esac
+ fi
+ case $file_conv/,$2, in
+ *,$file_conv,*)
+ ;;
+ mingw/*)
+ file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+ ;;
+ cygwin/*)
+ file=`cygpath -m "$file" || echo "$file"`
+ ;;
+ wine/*)
+ file=`winepath -w "$file" || echo "$file"`
+ ;;
+ esac
+ ;;
+ esac
+}
+
+# func_cl_dashL linkdir
+# Make cl look for libraries in LINKDIR
+func_cl_dashL ()
+{
+ func_file_conv "$1"
+ if test -z "$lib_path"; then
+ lib_path=$file
+ else
+ lib_path="$lib_path;$file"
+ fi
+ linker_opts="$linker_opts -LIBPATH:$file"
+}
+
+# func_cl_dashl library
+# Do a library search-path lookup for cl
+func_cl_dashl ()
+{
+ lib=$1
+ found=no
+ save_IFS=$IFS
+ IFS=';'
+ for dir in $lib_path $LIB
+ do
+ IFS=$save_IFS
+ if $shared && test -f "$dir/$lib.dll.lib"; then
+ found=yes
+ lib=$dir/$lib.dll.lib
+ break
+ fi
+ if test -f "$dir/$lib.lib"; then
+ found=yes
+ lib=$dir/$lib.lib
+ break
+ fi
+ if test -f "$dir/lib$lib.a"; then
+ found=yes
+ lib=$dir/lib$lib.a
+ break
+ fi
+ done
+ IFS=$save_IFS
+
+ if test "$found" != yes; then
+ lib=$lib.lib
+ fi
+}
+
+# func_cl_wrapper cl arg...
+# Adjust compile command to suit cl
+func_cl_wrapper ()
+{
+ # Assume a capable shell
+ lib_path=
+ shared=:
+ linker_opts=
+ for arg
+ do
+ if test -n "$eat"; then
+ eat=
+ else
+ case $1 in
+ -o)
+ # configure might choose to run compile as 'compile cc -o foo foo.c'.
+ eat=1
+ case $2 in
+ *.o | *.[oO][bB][jJ])
+ func_file_conv "$2"
+ set x "$@" -Fo"$file"
+ shift
+ ;;
+ *)
+ func_file_conv "$2"
+ set x "$@" -Fe"$file"
+ shift
+ ;;
+ esac
+ ;;
+ -I)
+ eat=1
+ func_file_conv "$2" mingw
+ set x "$@" -I"$file"
+ shift
+ ;;
+ -I*)
+ func_file_conv "${1#-I}" mingw
+ set x "$@" -I"$file"
+ shift
+ ;;
+ -l)
+ eat=1
+ func_cl_dashl "$2"
+ set x "$@" "$lib"
+ shift
+ ;;
+ -l*)
+ func_cl_dashl "${1#-l}"
+ set x "$@" "$lib"
+ shift
+ ;;
+ -L)
+ eat=1
+ func_cl_dashL "$2"
+ ;;
+ -L*)
+ func_cl_dashL "${1#-L}"
+ ;;
+ -static)
+ shared=false
+ ;;
+ -Wl,*)
+ arg=${1#-Wl,}
+ save_ifs="$IFS"; IFS=','
+ for flag in $arg; do
+ IFS="$save_ifs"
+ linker_opts="$linker_opts $flag"
+ done
+ IFS="$save_ifs"
+ ;;
+ -Xlinker)
+ eat=1
+ linker_opts="$linker_opts $2"
+ ;;
+ -*)
+ set x "$@" "$1"
+ shift
+ ;;
+ *.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
+ func_file_conv "$1"
+ set x "$@" -Tp"$file"
+ shift
+ ;;
+ *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
+ func_file_conv "$1" mingw
+ set x "$@" "$file"
+ shift
+ ;;
+ *)
+ set x "$@" "$1"
+ shift
+ ;;
+ esac
+ fi
+ shift
+ done
+ if test -n "$linker_opts"; then
+ linker_opts="-link$linker_opts"
+ fi
+ exec "$@" $linker_opts
+ exit 1
+}
+
+eat=
+
+case $1 in
+ '')
+ echo "$0: No command. Try '$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand '-c -o'.
+Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file 'INSTALL'.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "compile $scriptversion"
+ exit $?
+ ;;
+ cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
+ func_cl_wrapper "$@" # Doesn't return...
+ ;;
+esac
+
+ofile=
+cfile=
+
+for arg
+do
+ if test -n "$eat"; then
+ eat=
+ else
+ case $1 in
+ -o)
+ # configure might choose to run compile as 'compile cc -o foo foo.c'.
+ # So we strip '-o arg' only if arg is an object.
+ eat=1
+ case $2 in
+ *.o | *.obj)
+ ofile=$2
+ ;;
+ *)
+ set x "$@" -o "$2"
+ shift
+ ;;
+ esac
+ ;;
+ *.c)
+ cfile=$1
+ set x "$@" "$1"
+ shift
+ ;;
+ *)
+ set x "$@" "$1"
+ shift
+ ;;
+ esac
+ fi
+ shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+ # If no '-o' option was seen then we might have been invoked from a
+ # pattern rule where we don't need one. That is ok -- this is a
+ # normal compilation that the losing compiler can handle. If no
+ # '.c' file was seen then we are probably linking. That is also
+ # ok.
+ exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use '[/\\:.-]' here to ensure that we don't use the same name
+# that we are using for the .o file. Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
+while true; do
+ if mkdir "$lockdir" >/dev/null 2>&1; then
+ break
+ fi
+ sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+ test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+ test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/3rdparty/libjpeg/config.guess b/3rdparty/libjpeg/config.guess
index dc84c68ef79..6c32c8645c8 100644
--- a/3rdparty/libjpeg/config.guess
+++ b/3rdparty/libjpeg/config.guess
@@ -1,14 +1,12 @@
#! /bin/sh
# Attempt to guess a canonical system name.
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-# Free Software Foundation, Inc.
+# Copyright 1992-2014 Free Software Foundation, Inc.
-timestamp='2009-11-20'
+timestamp='2014-11-04'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
+# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
@@ -17,26 +15,22 @@ timestamp='2009-11-20'
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
#
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Originally written by Per Bothner. Please send patches (context
-# diff format) to <config-patches@gnu.org> and include a ChangeLog
-# entry.
+# the same distribution terms that you use for the rest of that
+# program. This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
#
-# This script attempts to guess a canonical system name similar to
-# config.sub. If it succeeds, it prints the system name on stdout, and
-# exits with 0. Otherwise, it exits with 1.
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
#
# You can get the latest version of this script from:
# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+#
+# Please send patches to <config-patches@gnu.org>.
+
me=`echo "$0" | sed -e 's,.*/,,'`
@@ -56,8 +50,7 @@ version="\
GNU config.guess ($timestamp)
Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+Copyright 1992-2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -139,12 +132,33 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+case "${UNAME_SYSTEM}" in
+Linux|GNU|GNU/*)
+ # If the system lacks a compiler, then just pick glibc.
+ # We could probably try harder.
+ LIBC=gnu
+
+ eval $set_cc_for_build
+ cat <<-EOF > $dummy.c
+ #include <features.h>
+ #if defined(__UCLIBC__)
+ LIBC=uclibc
+ #elif defined(__dietlibc__)
+ LIBC=dietlibc
+ #else
+ LIBC=gnu
+ #endif
+ EOF
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
+ ;;
+esac
+
# Note: order is significant - the case branches are not exclusive.
case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
*:NetBSD:*:*)
# NetBSD (nbsd) targets should (where applicable) match one or
- # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
# *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
# switched to ELF, *-*-netbsd* would select the old
# object file format. This provides both forward
@@ -180,7 +194,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
fi
;;
*)
- os=netbsd
+ os=netbsd
;;
esac
# The OS release
@@ -201,6 +215,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
echo "${machine}-${os}${release}"
exit ;;
+ *:Bitrig:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+ echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
+ exit ;;
*:OpenBSD:*:*)
UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
@@ -223,7 +241,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
;;
*5.*)
- UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
;;
esac
# According to Compaq, /usr/sbin/psrinfo has been available on
@@ -269,7 +287,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
# A Xn.n version is an unreleased experimental baselevel.
# 1.2 uses "1.2" for uname -r.
echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
- exit ;;
+ # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+ exitcode=$?
+ trap '' 0
+ exit $exitcode ;;
Alpha\ *:Windows_NT*:*)
# How do we know it's Interix rather than the generic POSIX subsystem?
# Should we change UNAME_MACHINE based on the output of uname instead
@@ -295,12 +316,12 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
echo s390-ibm-zvmoe
exit ;;
*:OS400:*:*)
- echo powerpc-ibm-os400
+ echo powerpc-ibm-os400
exit ;;
arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
echo arm-acorn-riscix${UNAME_RELEASE}
exit ;;
- arm:riscos:*:*|arm:RISCOS:*:*)
+ arm*:riscos:*:*|arm*:RISCOS:*:*)
echo arm-unknown-riscos
exit ;;
SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
@@ -394,23 +415,23 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
# MiNT. But MiNT is downward compatible to TOS, so this should
# be no problem.
atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
- echo m68k-atari-mint${UNAME_RELEASE}
+ echo m68k-atari-mint${UNAME_RELEASE}
exit ;;
atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
echo m68k-atari-mint${UNAME_RELEASE}
- exit ;;
+ exit ;;
*falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
- echo m68k-atari-mint${UNAME_RELEASE}
+ echo m68k-atari-mint${UNAME_RELEASE}
exit ;;
milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
- echo m68k-milan-mint${UNAME_RELEASE}
- exit ;;
+ echo m68k-milan-mint${UNAME_RELEASE}
+ exit ;;
hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
- echo m68k-hades-mint${UNAME_RELEASE}
- exit ;;
+ echo m68k-hades-mint${UNAME_RELEASE}
+ exit ;;
*:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
- echo m68k-unknown-mint${UNAME_RELEASE}
- exit ;;
+ echo m68k-unknown-mint${UNAME_RELEASE}
+ exit ;;
m68k:machten:*:*)
echo m68k-apple-machten${UNAME_RELEASE}
exit ;;
@@ -480,8 +501,8 @@ EOF
echo m88k-motorola-sysv3
exit ;;
AViiON:dgux:*:*)
- # DG/UX returns AViiON for all architectures
- UNAME_PROCESSOR=`/usr/bin/uname -p`
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
then
if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
@@ -494,7 +515,7 @@ EOF
else
echo i586-dg-dgux${UNAME_RELEASE}
fi
- exit ;;
+ exit ;;
M88*:DolphinOS:*:*) # DolphinOS (SVR3)
echo m88k-dolphin-sysv3
exit ;;
@@ -551,15 +572,16 @@ EOF
echo rs6000-ibm-aix3.2
fi
exit ;;
- *:AIX:*:[456])
+ *:AIX:*:[4567])
IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
IBM_ARCH=rs6000
else
IBM_ARCH=powerpc
fi
- if [ -x /usr/bin/oslevel ] ; then
- IBM_REV=`/usr/bin/oslevel`
+ if [ -x /usr/bin/lslpp ] ; then
+ IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
+ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
else
IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
fi
@@ -594,52 +616,52 @@ EOF
9000/[678][0-9][0-9])
if [ -x /usr/bin/getconf ]; then
sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
- sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
- case "${sc_cpu_version}" in
- 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
- 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
- 532) # CPU_PA_RISC2_0
- case "${sc_kernel_bits}" in
- 32) HP_ARCH="hppa2.0n" ;;
- 64) HP_ARCH="hppa2.0w" ;;
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case "${sc_cpu_version}" in
+ 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case "${sc_kernel_bits}" in
+ 32) HP_ARCH="hppa2.0n" ;;
+ 64) HP_ARCH="hppa2.0w" ;;
'') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
- esac ;;
- esac
+ esac ;;
+ esac
fi
if [ "${HP_ARCH}" = "" ]; then
eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
+ sed 's/^ //' << EOF >$dummy.c
- #define _HPUX_SOURCE
- #include <stdlib.h>
- #include <unistd.h>
+ #define _HPUX_SOURCE
+ #include <stdlib.h>
+ #include <unistd.h>
- int main ()
- {
- #if defined(_SC_KERNEL_BITS)
- long bits = sysconf(_SC_KERNEL_BITS);
- #endif
- long cpu = sysconf (_SC_CPU_VERSION);
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
- switch (cpu)
- {
- case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
- case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
- case CPU_PA_RISC2_0:
- #if defined(_SC_KERNEL_BITS)
- switch (bits)
- {
- case 64: puts ("hppa2.0w"); break;
- case 32: puts ("hppa2.0n"); break;
- default: puts ("hppa2.0"); break;
- } break;
- #else /* !defined(_SC_KERNEL_BITS) */
- puts ("hppa2.0"); break;
- #endif
- default: puts ("hppa1.0"); break;
- }
- exit (0);
- }
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
EOF
(CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
test -z "$HP_ARCH" && HP_ARCH=hppa
@@ -730,22 +752,22 @@ EOF
exit ;;
C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
echo c1-convex-bsd
- exit ;;
+ exit ;;
C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
if getsysinfo -f scalar_acc
then echo c32-convex-bsd
else echo c2-convex-bsd
fi
- exit ;;
+ exit ;;
C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
echo c34-convex-bsd
- exit ;;
+ exit ;;
C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
echo c38-convex-bsd
- exit ;;
+ exit ;;
C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
echo c4-convex-bsd
- exit ;;
+ exit ;;
CRAY*Y-MP:*:*:*)
echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
exit ;;
@@ -769,14 +791,14 @@ EOF
exit ;;
F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
- FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
- echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
- exit ;;
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit ;;
5000:UNIX_System_V:4.*:*)
- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
- FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
- echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
exit ;;
i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
@@ -788,30 +810,35 @@ EOF
echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
exit ;;
*:FreeBSD:*:*)
- case ${UNAME_MACHINE} in
- pc98)
- echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ case ${UNAME_PROCESSOR} in
amd64)
echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
*)
- echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
esac
exit ;;
i*:CYGWIN*:*)
echo ${UNAME_MACHINE}-pc-cygwin
exit ;;
+ *:MINGW64*:*)
+ echo ${UNAME_MACHINE}-pc-mingw64
+ exit ;;
*:MINGW*:*)
echo ${UNAME_MACHINE}-pc-mingw32
exit ;;
+ *:MSYS*:*)
+ echo ${UNAME_MACHINE}-pc-msys
+ exit ;;
i*:windows32*:*)
- # uname -m includes "-pc" on this system.
- echo ${UNAME_MACHINE}-mingw32
+ # uname -m includes "-pc" on this system.
+ echo ${UNAME_MACHINE}-mingw32
exit ;;
i*:PW*:*)
echo ${UNAME_MACHINE}-pc-pw32
exit ;;
*:Interix*:*)
- case ${UNAME_MACHINE} in
+ case ${UNAME_MACHINE} in
x86)
echo i586-pc-interix${UNAME_RELEASE}
exit ;;
@@ -848,15 +875,22 @@ EOF
exit ;;
*:GNU:*:*)
# the GNU system
- echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
exit ;;
*:GNU/*:*:*)
# other systems with GNU libc and userland
- echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
exit ;;
i*86:Minix:*:*)
echo ${UNAME_MACHINE}-pc-minix
exit ;;
+ aarch64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ aarch64_be:Linux:*:*)
+ UNAME_MACHINE=aarch64_be
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
alpha:Linux:*:*)
case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
EV5) UNAME_MACHINE=alphaev5 ;;
@@ -866,52 +900,56 @@ EOF
EV6) UNAME_MACHINE=alphaev6 ;;
EV67) UNAME_MACHINE=alphaev67 ;;
EV68*) UNAME_MACHINE=alphaev68 ;;
- esac
+ esac
objdump --private-headers /bin/sh | grep -q ld.so.1
- if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
- echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+ if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ arc:Linux:*:* | arceb:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit ;;
arm*:Linux:*:*)
eval $set_cc_for_build
if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
| grep -q __ARM_EABI__
then
- echo ${UNAME_MACHINE}-unknown-linux-gnu
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
else
- echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_PCS_VFP
+ then
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
+ else
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
+ fi
fi
exit ;;
avr32*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit ;;
cris:Linux:*:*)
- echo cris-axis-linux-gnu
+ echo ${UNAME_MACHINE}-axis-linux-${LIBC}
exit ;;
crisv32:Linux:*:*)
- echo crisv32-axis-linux-gnu
+ echo ${UNAME_MACHINE}-axis-linux-${LIBC}
exit ;;
frv:Linux:*:*)
- echo frv-unknown-linux-gnu
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ hexagon:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit ;;
i*86:Linux:*:*)
- LIBC=gnu
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
- #ifdef __dietlibc__
- LIBC=dietlibc
- #endif
-EOF
- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
- echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+ echo ${UNAME_MACHINE}-pc-linux-${LIBC}
exit ;;
ia64:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit ;;
m32r*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit ;;
m68*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit ;;
mips:Linux:*:* | mips64:Linux:*:*)
eval $set_cc_for_build
@@ -930,51 +968,63 @@ EOF
#endif
EOF
eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
- test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
;;
- or32:Linux:*:*)
- echo or32-unknown-linux-gnu
+ openrisc*:Linux:*:*)
+ echo or1k-unknown-linux-${LIBC}
+ exit ;;
+ or32:Linux:*:* | or1k*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit ;;
padre:Linux:*:*)
- echo sparc-unknown-linux-gnu
+ echo sparc-unknown-linux-${LIBC}
exit ;;
parisc64:Linux:*:* | hppa64:Linux:*:*)
- echo hppa64-unknown-linux-gnu
+ echo hppa64-unknown-linux-${LIBC}
exit ;;
parisc:Linux:*:* | hppa:Linux:*:*)
# Look for CPU level
case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
- PA7*) echo hppa1.1-unknown-linux-gnu ;;
- PA8*) echo hppa2.0-unknown-linux-gnu ;;
- *) echo hppa-unknown-linux-gnu ;;
+ PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
+ PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
+ *) echo hppa-unknown-linux-${LIBC} ;;
esac
exit ;;
ppc64:Linux:*:*)
- echo powerpc64-unknown-linux-gnu
+ echo powerpc64-unknown-linux-${LIBC}
exit ;;
ppc:Linux:*:*)
- echo powerpc-unknown-linux-gnu
+ echo powerpc-unknown-linux-${LIBC}
+ exit ;;
+ ppc64le:Linux:*:*)
+ echo powerpc64le-unknown-linux-${LIBC}
+ exit ;;
+ ppcle:Linux:*:*)
+ echo powerpcle-unknown-linux-${LIBC}
exit ;;
s390:Linux:*:* | s390x:Linux:*:*)
- echo ${UNAME_MACHINE}-ibm-linux
+ echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
exit ;;
sh64*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit ;;
sh*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit ;;
sparc:Linux:*:* | sparc64:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
+ tile*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit ;;
vax:Linux:*:*)
- echo ${UNAME_MACHINE}-dec-linux-gnu
+ echo ${UNAME_MACHINE}-dec-linux-${LIBC}
exit ;;
x86_64:Linux:*:*)
- echo x86_64-unknown-linux-gnu
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit ;;
xtensa*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit ;;
i*86:DYNIX/ptx:4*:*)
# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
@@ -983,11 +1033,11 @@ EOF
echo i386-sequent-sysv4
exit ;;
i*86:UNIX_SV:4.2MP:2.*)
- # Unixware is an offshoot of SVR4, but it has its own version
- # number series starting with 2...
- # I am not positive that other SVR4 systems won't match this,
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
# I just have to hope. -- rms.
- # Use sysv4.2uw... so that sysv4* matches it.
+ # Use sysv4.2uw... so that sysv4* matches it.
echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
exit ;;
i*86:OS/2:*:*)
@@ -1019,7 +1069,7 @@ EOF
fi
exit ;;
i*86:*:5:[678]*)
- # UnixWare 7.x, OpenUNIX and OpenServer 6.
+ # UnixWare 7.x, OpenUNIX and OpenServer 6.
case `/bin/uname -X | grep "^Machine"` in
*486*) UNAME_MACHINE=i486 ;;
*Pentium) UNAME_MACHINE=i586 ;;
@@ -1047,13 +1097,13 @@ EOF
exit ;;
pc:*:*:*)
# Left here for compatibility:
- # uname -m prints for DJGPP always 'pc', but it prints nothing about
- # the processor, so we play safe by assuming i586.
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i586.
# Note: whatever this is, it MUST be the same as what config.sub
# prints for the "djgpp" host, or else GDB configury will decide that
# this is a cross-build.
echo i586-pc-msdosdjgpp
- exit ;;
+ exit ;;
Intel:Mach:3*:*)
echo i386-pc-mach3
exit ;;
@@ -1088,8 +1138,8 @@ EOF
/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
&& { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && { echo i486-ncr-sysv4; exit; } ;;
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4; exit; } ;;
NCR*:*:4.2:* | MPRAS*:*:4.2:*)
OS_REL='.3'
test -r /etc/.relid \
@@ -1132,10 +1182,10 @@ EOF
echo ns32k-sni-sysv
fi
exit ;;
- PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
- # says <Richard.M.Bartel@ccMail.Census.GOV>
- echo i586-unisys-sysv4
- exit ;;
+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit ;;
*:UNIX_System_V:4*:FTX*)
# From Gerald Hewes <hewes@openmarket.com>.
# How about differentiating between stratus architectures? -djm
@@ -1161,11 +1211,11 @@ EOF
exit ;;
R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
if [ -d /usr/nec ]; then
- echo mips-nec-sysv${UNAME_RELEASE}
+ echo mips-nec-sysv${UNAME_RELEASE}
else
- echo mips-unknown-sysv${UNAME_RELEASE}
+ echo mips-unknown-sysv${UNAME_RELEASE}
fi
- exit ;;
+ exit ;;
BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
echo powerpc-be-beos
exit ;;
@@ -1178,6 +1228,9 @@ EOF
BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
echo i586-pc-haiku
exit ;;
+ x86_64:Haiku:*:*)
+ echo x86_64-unknown-haiku
+ exit ;;
SX-4:SUPER-UX:*:*)
echo sx4-nec-superux${UNAME_RELEASE}
exit ;;
@@ -1204,19 +1257,31 @@ EOF
exit ;;
*:Darwin:*:*)
UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
- case $UNAME_PROCESSOR in
- i386)
- eval $set_cc_for_build
- if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
- if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
- (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
- grep IS_64BIT_ARCH >/dev/null
- then
- UNAME_PROCESSOR="x86_64"
- fi
- fi ;;
- unknown) UNAME_PROCESSOR=powerpc ;;
- esac
+ eval $set_cc_for_build
+ if test "$UNAME_PROCESSOR" = unknown ; then
+ UNAME_PROCESSOR=powerpc
+ fi
+ if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
+ if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+ if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ case $UNAME_PROCESSOR in
+ i386) UNAME_PROCESSOR=x86_64 ;;
+ powerpc) UNAME_PROCESSOR=powerpc64 ;;
+ esac
+ fi
+ fi
+ elif test "$UNAME_PROCESSOR" = i386 ; then
+ # Avoid executing cc on OS X 10.9, as it ships with a stub
+ # that puts up a graphical alert prompting to install
+ # developer tools. Any system running Mac OS X 10.7 or
+ # later (Darwin 11 and later) is required to have a 64-bit
+ # processor. This is not true of the ARM version of Darwin
+ # that Apple uses in portable devices.
+ UNAME_PROCESSOR=x86_64
+ fi
echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
exit ;;
*:procnto*:*:* | *:QNX:[0123456789]*:*)
@@ -1230,7 +1295,10 @@ EOF
*:QNX:*:4*)
echo i386-pc-qnx
exit ;;
- NSE-?:NONSTOP_KERNEL:*:*)
+ NEO-?:NONSTOP_KERNEL:*:*)
+ echo neo-tandem-nsk${UNAME_RELEASE}
+ exit ;;
+ NSE-*:NONSTOP_KERNEL:*:*)
echo nse-tandem-nsk${UNAME_RELEASE}
exit ;;
NSR-?:NONSTOP_KERNEL:*:*)
@@ -1275,13 +1343,13 @@ EOF
echo pdp10-unknown-its
exit ;;
SEI:*:*:SEIUX)
- echo mips-sei-seiux${UNAME_RELEASE}
+ echo mips-sei-seiux${UNAME_RELEASE}
exit ;;
*:DragonFly:*:*)
echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
exit ;;
*:*VMS:*:*)
- UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
case "${UNAME_MACHINE}" in
A*) echo alpha-dec-vms ; exit ;;
I*) echo ia64-dec-vms ; exit ;;
@@ -1299,158 +1367,10 @@ EOF
i*86:AROS:*:*)
echo ${UNAME_MACHINE}-pc-aros
exit ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
- /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
- I don't know.... */
- printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
- printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
- "4"
-#else
- ""
-#endif
- ); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
- printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
- printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
- int version;
- version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
- if (version < 4)
- printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
- else
- printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
- exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
- printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
- printf ("ns32k-encore-mach\n"); exit (0);
-#else
- printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
- printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
- printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
- printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
- struct utsname un;
-
- uname(&un);
-
- if (strncmp(un.version, "V2", 2) == 0) {
- printf ("i386-sequent-ptx2\n"); exit (0);
- }
- if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
- printf ("i386-sequent-ptx1\n"); exit (0);
- }
- printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-# include <sys/param.h>
-# if defined (BSD)
-# if BSD == 43
- printf ("vax-dec-bsd4.3\n"); exit (0);
-# else
-# if BSD == 199006
- printf ("vax-dec-bsd4.3reno\n"); exit (0);
-# else
- printf ("vax-dec-bsd\n"); exit (0);
-# endif
-# endif
-# else
- printf ("vax-dec-bsd\n"); exit (0);
-# endif
-# else
- printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
- printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
- exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
- { echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
- case `getsysinfo -f cpu_type` in
- c1*)
- echo c1-convex-bsd
- exit ;;
- c2*)
- if getsysinfo -f scalar_acc
- then echo c32-convex-bsd
- else echo c2-convex-bsd
- fi
+ x86_64:VMkernel:*:*)
+ echo ${UNAME_MACHINE}-unknown-esx
exit ;;
- c34*)
- echo c34-convex-bsd
- exit ;;
- c38*)
- echo c38-convex-bsd
- exit ;;
- c4*)
- echo c4-convex-bsd
- exit ;;
- esac
-fi
+esac
cat >&2 <<EOF
$0: unable to guess system type
diff --git a/3rdparty/libjpeg/config.sub b/3rdparty/libjpeg/config.sub
index 2a55a50751c..7ffe3737842 100644
--- a/3rdparty/libjpeg/config.sub
+++ b/3rdparty/libjpeg/config.sub
@@ -1,38 +1,31 @@
#! /bin/sh
# Configuration validation subroutine script.
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-# Free Software Foundation, Inc.
+# Copyright 1992-2014 Free Software Foundation, Inc.
-timestamp='2009-11-20'
+timestamp='2014-12-03'
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine. It does not imply ALL GNU software can.
-#
-# This file is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
#
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
+# the same distribution terms that you use for the rest of that
+# program. This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
-# Please send patches to <config-patches@gnu.org>. Submit a context
-# diff and a properly formatted GNU ChangeLog entry.
+# Please send patches to <config-patches@gnu.org>.
#
# Configuration subroutine to validate and canonicalize a configuration type.
# Supply the specified configuration type as an argument.
@@ -75,8 +68,7 @@ Report bugs and patches to <config-patches@gnu.org>."
version="\
GNU config.sub ($timestamp)
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+Copyright 1992-2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -123,13 +115,18 @@ esac
# Here we must recognize all the valid KERNEL-OS combinations.
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
case $maybe_os in
- nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
- uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+ nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+ knetbsd*-gnu* | netbsd*-gnu* | \
kopensolaris*-gnu* | \
storm-chaos* | os2-emx* | rtmk-nova*)
os=-$maybe_os
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
;;
+ android-linux)
+ os=-linux-android
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+ ;;
*)
basic_machine=`echo $1 | sed 's/-[^-]*$//'`
if [ $basic_machine != $1 ]
@@ -152,12 +149,12 @@ case $os in
-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
- -apple | -axis | -knuth | -cray | -microblaze)
+ -apple | -axis | -knuth | -cray | -microblaze*)
os=
basic_machine=$1
;;
- -bluegene*)
- os=-cnk
+ -bluegene*)
+ os=-cnk
;;
-sim | -cisco | -oki | -wec | -winbond)
os=
@@ -173,10 +170,10 @@ case $os in
os=-chorusos
basic_machine=$1
;;
- -chorusrdb)
- os=-chorusrdb
+ -chorusrdb)
+ os=-chorusrdb
basic_machine=$1
- ;;
+ ;;
-hiux*)
os=-hiuxwe2
;;
@@ -221,6 +218,12 @@ case $os in
-isc*)
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
;;
+ -lynx*178)
+ os=-lynxos178
+ ;;
+ -lynx*5)
+ os=-lynxos5
+ ;;
-lynx*)
os=-lynxos
;;
@@ -245,20 +248,28 @@ case $basic_machine in
# Some are omitted here because they have special meanings below.
1750a | 580 \
| a29k \
+ | aarch64 | aarch64_be \
| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
| am33_2.0 \
- | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+ | arc | arceb \
+ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
+ | avr | avr32 \
+ | be32 | be64 \
| bfin \
- | c4x | clipper \
+ | c4x | c8051 | clipper \
| d10v | d30v | dlx | dsp16xx \
+ | epiphany \
| fido | fr30 | frv \
| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | hexagon \
| i370 | i860 | i960 | ia64 \
| ip2k | iq2000 \
+ | k1om \
+ | le32 | le64 \
| lm32 \
| m32c | m32r | m32rle | m68000 | m68k | m88k \
- | maxq | mb | microblaze | mcore | mep | metag \
+ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \
| mips | mipsbe | mipseb | mipsel | mipsle \
| mips16 \
| mips64 | mips64el \
@@ -272,38 +283,55 @@ case $basic_machine in
| mips64vr5900 | mips64vr5900el \
| mipsisa32 | mipsisa32el \
| mipsisa32r2 | mipsisa32r2el \
+ | mipsisa32r6 | mipsisa32r6el \
| mipsisa64 | mipsisa64el \
| mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64r6 | mipsisa64r6el \
| mipsisa64sb1 | mipsisa64sb1el \
| mipsisa64sr71k | mipsisa64sr71kel \
+ | mipsr5900 | mipsr5900el \
| mipstx39 | mipstx39el \
| mn10200 | mn10300 \
| moxie \
| mt \
| msp430 \
- | nios | nios2 \
+ | nds32 | nds32le | nds32be \
+ | nios | nios2 | nios2eb | nios2el \
| ns16k | ns32k \
- | or32 \
+ | open8 | or1k | or1knd | or32 \
| pdp10 | pdp11 | pj | pjl \
- | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+ | powerpc | powerpc64 | powerpc64le | powerpcle \
| pyramid \
- | rx \
+ | riscv32 | riscv64 \
+ | rl78 | rx \
| score \
| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
| sh64 | sh64le \
| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
- | spu | strongarm \
- | tahoe | thumb | tic4x | tic80 | tron \
+ | spu \
+ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
| ubicom32 \
- | v850 | v850e \
+ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+ | visium \
| we32k \
- | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
+ | x86 | xc16x | xstormy16 | xtensa \
| z8k | z80)
basic_machine=$basic_machine-unknown
;;
- m6811 | m68hc11 | m6812 | m68hc12 | picochip)
- # Motorola 68HC11/12.
+ c54x)
+ basic_machine=tic54x-unknown
+ ;;
+ c55x)
+ basic_machine=tic55x-unknown
+ ;;
+ c6x)
+ basic_machine=tic6x-unknown
+ ;;
+ leon|leon[3-9])
+ basic_machine=sparc-$basic_machine
+ ;;
+ m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
basic_machine=$basic_machine-unknown
os=-none
;;
@@ -313,6 +341,21 @@ case $basic_machine in
basic_machine=mt-unknown
;;
+ strongarm | thumb | xscale)
+ basic_machine=arm-unknown
+ ;;
+ xgate)
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ xscaleeb)
+ basic_machine=armeb-unknown
+ ;;
+
+ xscaleel)
+ basic_machine=armel-unknown
+ ;;
+
# We use `pc' rather than `unknown'
# because (1) that's what they normally are, and
# (2) the word "unknown" tends to confuse beginning users.
@@ -327,25 +370,31 @@ case $basic_machine in
# Recognize the basic CPU types with company name.
580-* \
| a29k-* \
+ | aarch64-* | aarch64_be-* \
| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
- | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
| arm-* | armbe-* | armle-* | armeb-* | armv*-* \
| avr-* | avr32-* \
+ | be32-* | be64-* \
| bfin-* | bs2000-* \
- | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
- | clipper-* | craynv-* | cydra-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* \
+ | c8051-* | clipper-* | craynv-* | cydra-* \
| d10v-* | d30v-* | dlx-* \
| elxsi-* \
| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
| h8300-* | h8500-* \
| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ | hexagon-* \
| i*86-* | i860-* | i960-* | ia64-* \
| ip2k-* | iq2000-* \
+ | k1om-* \
+ | le32-* | le64-* \
| lm32-* \
| m32c-* | m32r-* | m32rle-* \
| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
- | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
+ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+ | microblaze-* | microblazeel-* \
| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
| mips16-* \
| mips64-* | mips64el-* \
@@ -359,33 +408,42 @@ case $basic_machine in
| mips64vr5900-* | mips64vr5900el-* \
| mipsisa32-* | mipsisa32el-* \
| mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa32r6-* | mipsisa32r6el-* \
| mipsisa64-* | mipsisa64el-* \
| mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64r6-* | mipsisa64r6el-* \
| mipsisa64sb1-* | mipsisa64sb1el-* \
| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipsr5900-* | mipsr5900el-* \
| mipstx39-* | mipstx39el-* \
| mmix-* \
| mt-* \
| msp430-* \
- | nios-* | nios2-* \
+ | nds32-* | nds32le-* | nds32be-* \
+ | nios-* | nios2-* | nios2eb-* | nios2el-* \
| none-* | np1-* | ns16k-* | ns32k-* \
+ | open8-* \
+ | or1k*-* \
| orion-* \
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
- | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
| pyramid-* \
- | romp-* | rs6000-* | rx-* \
+ | rl78-* | romp-* | rs6000-* | rx-* \
| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
| sparclite-* \
- | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
- | tahoe-* | thumb-* \
- | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+ | tahoe-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tile*-* \
| tron-* \
| ubicom32-* \
- | v850-* | v850e-* | vax-* \
+ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+ | vax-* \
+ | visium-* \
| we32k-* \
- | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+ | x86-* | x86_64-* | xc16x-* | xps100-* \
| xstormy16-* | xtensa*-* \
| ymp-* \
| z8k-* | z80-*)
@@ -410,7 +468,7 @@ case $basic_machine in
basic_machine=a29k-amd
os=-udi
;;
- abacus)
+ abacus)
basic_machine=abacus-unknown
;;
adobe68k)
@@ -480,11 +538,20 @@ case $basic_machine in
basic_machine=powerpc-ibm
os=-cnk
;;
+ c54x-*)
+ basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ c55x-*)
+ basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ c6x-*)
+ basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
c90)
basic_machine=c90-cray
os=-unicos
;;
- cegcc)
+ cegcc)
basic_machine=arm-unknown
os=-cegcc
;;
@@ -516,7 +583,7 @@ case $basic_machine in
basic_machine=craynv-cray
os=-unicosmp
;;
- cr16)
+ cr16 | cr16-*)
basic_machine=cr16-unknown
os=-elf
;;
@@ -674,7 +741,6 @@ case $basic_machine in
i370-ibm* | ibm*)
basic_machine=i370-ibm
;;
-# I'm not sure what "Sysv32" means. Should this be sysv3.2?
i*86v32)
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
os=-sysv32
@@ -713,6 +779,9 @@ case $basic_machine in
basic_machine=m68k-isi
os=-sysv
;;
+ leon-*|leon[3-9]-*)
+ basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'`
+ ;;
m68knommu)
basic_machine=m68k-unknown
os=-linux
@@ -732,11 +801,15 @@ case $basic_machine in
basic_machine=ns32k-utek
os=-sysv
;;
- microblaze)
+ microblaze*)
basic_machine=microblaze-xilinx
;;
+ mingw64)
+ basic_machine=x86_64-pc
+ os=-mingw64
+ ;;
mingw32)
- basic_machine=i386-pc
+ basic_machine=i686-pc
os=-mingw32
;;
mingw32ce)
@@ -764,6 +837,10 @@ case $basic_machine in
basic_machine=powerpc-unknown
os=-morphos
;;
+ moxiebox)
+ basic_machine=moxie-unknown
+ os=-moxiebox
+ ;;
msdos)
basic_machine=i386-pc
os=-msdos
@@ -771,10 +848,18 @@ case $basic_machine in
ms1-*)
basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
;;
+ msys)
+ basic_machine=i686-pc
+ os=-msys
+ ;;
mvs)
basic_machine=i370-ibm
os=-mvs
;;
+ nacl)
+ basic_machine=le32-unknown
+ os=-nacl
+ ;;
ncr3000)
basic_machine=i486-ncr
os=-sysv4
@@ -839,6 +924,12 @@ case $basic_machine in
np1)
basic_machine=np1-gould
;;
+ neo-tandem)
+ basic_machine=neo-tandem
+ ;;
+ nse-tandem)
+ basic_machine=nse-tandem
+ ;;
nsr-tandem)
basic_machine=nsr-tandem
;;
@@ -921,9 +1012,10 @@ case $basic_machine in
;;
power) basic_machine=power-ibm
;;
- ppc) basic_machine=powerpc-unknown
+ ppc | ppcbe) basic_machine=powerpc-unknown
;;
- ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ppc-* | ppcbe-*)
+ basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
ppcle | powerpclittle | ppc-le | powerpc-little)
basic_machine=powerpcle-unknown
@@ -948,7 +1040,11 @@ case $basic_machine in
basic_machine=i586-unknown
os=-pw32
;;
- rdos)
+ rdos | rdos64)
+ basic_machine=x86_64-pc
+ os=-rdos
+ ;;
+ rdos32)
basic_machine=i386-pc
os=-rdos
;;
@@ -1017,6 +1113,9 @@ case $basic_machine in
basic_machine=i860-stratus
os=-sysv4
;;
+ strongarm-* | thumb-*)
+ basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
sun2)
basic_machine=m68000-sun
;;
@@ -1073,20 +1172,8 @@ case $basic_machine in
basic_machine=t90-cray
os=-unicos
;;
- tic54x | c54x*)
- basic_machine=tic54x-unknown
- os=-coff
- ;;
- tic55x | c55x*)
- basic_machine=tic55x-unknown
- os=-coff
- ;;
- tic6x | c6x*)
- basic_machine=tic6x-unknown
- os=-coff
- ;;
tile*)
- basic_machine=tile-unknown
+ basic_machine=$basic_machine-unknown
os=-linux-gnu
;;
tx39)
@@ -1156,6 +1243,9 @@ case $basic_machine in
xps | xps100)
basic_machine=xps100-honeywell
;;
+ xscale-* | xscalee[bl]-*)
+ basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
+ ;;
ymp)
basic_machine=ymp-cray
os=-unicos
@@ -1253,11 +1343,11 @@ esac
if [ x"$os" != x"" ]
then
case $os in
- # First match some system type aliases
- # that might get confused with valid system types.
+ # First match some system type aliases
+ # that might get confused with valid system types.
# -solaris* is a basic system type, with this one exception.
- -auroraux)
- os=-auroraux
+ -auroraux)
+ os=-auroraux
;;
-solaris1 | -solaris1.*)
os=`echo $os | sed -e 's|solaris1|sunos4|'`
@@ -1281,28 +1371,29 @@ case $os in
-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
| -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
- | -sym* | -kopensolaris* \
+ | -sym* | -kopensolaris* | -plan9* \
| -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
| -aos* | -aros* \
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
| -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
- | -openbsd* | -solidbsd* \
+ | -bitrig* | -openbsd* | -solidbsd* \
| -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
| -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
| -chorusos* | -chorusrdb* | -cegcc* \
- | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
- | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
- | -uxpv* | -beos* | -mpeix* | -udk* \
+ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+ | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
| -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
| -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
| -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
| -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
| -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
- | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*)
# Remember, each alternative MUST END IN *, to match a version number.
;;
-qnx*)
@@ -1341,7 +1432,7 @@ case $os in
-opened*)
os=-openedition
;;
- -os400*)
+ -os400*)
os=-os400
;;
-wince*)
@@ -1390,7 +1481,7 @@ case $os in
-sinix*)
os=-sysv4
;;
- -tpf*)
+ -tpf*)
os=-tpf
;;
-triton*)
@@ -1426,15 +1517,14 @@ case $os in
-aros*)
os=-aros
;;
- -kaos*)
- os=-kaos
- ;;
-zvmoe)
os=-zvmoe
;;
-dicos*)
os=-dicos
;;
+ -nacl*)
+ ;;
-none)
;;
*)
@@ -1457,10 +1547,10 @@ else
# system, and we'll never get to this point.
case $basic_machine in
- score-*)
+ score-*)
os=-elf
;;
- spu-*)
+ spu-*)
os=-elf
;;
*-acorn)
@@ -1472,8 +1562,23 @@ case $basic_machine in
arm*-semi)
os=-aout
;;
- c4x-* | tic4x-*)
- os=-coff
+ c4x-* | tic4x-*)
+ os=-coff
+ ;;
+ c8051-*)
+ os=-elf
+ ;;
+ hexagon-*)
+ os=-elf
+ ;;
+ tic54x-*)
+ os=-coff
+ ;;
+ tic55x-*)
+ os=-coff
+ ;;
+ tic6x-*)
+ os=-coff
;;
# This must come before the *-dec entry.
pdp10-*)
@@ -1493,14 +1598,11 @@ case $basic_machine in
;;
m68000-sun)
os=-sunos3
- # This also exists in the configure program, but was not the
- # default.
- # os=-sunos4
;;
m68*-cisco)
os=-aout
;;
- mep-*)
+ mep-*)
os=-elf
;;
mips*-cisco)
@@ -1527,7 +1629,7 @@ case $basic_machine in
*-ibm)
os=-aix
;;
- *-knuth)
+ *-knuth)
os=-mmixware
;;
*-wec)
diff --git a/3rdparty/libjpeg/configure b/3rdparty/libjpeg/configure
index 97b17b19f15..d4a1131adbf 100644
--- a/3rdparty/libjpeg/configure
+++ b/3rdparty/libjpeg/configure
@@ -1,11 +1,9 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.68 for libjpeg 8.3.0.
+# Generated by GNU Autoconf 2.69 for libjpeg 9.2.0.
#
#
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
-# Foundation, Inc.
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
#
#
# This configure script is free software; the Free Software Foundation
@@ -134,6 +132,31 @@ export LANGUAGE
# CDPATH.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+# Use a proper internal environment variable to ensure we don't fall
+ # into an infinite loop, continuously re-executing ourselves.
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+ _as_can_reexec=no; export _as_can_reexec;
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+ fi
+ # We don't want this to propagate to other subprocesses.
+ { _as_can_reexec=; unset _as_can_reexec;}
if test "x$CONFIG_SHELL" = x; then
as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
emulate sh
@@ -167,7 +190,8 @@ if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
else
exitcode=1; echo positional parameters were not saved.
fi
-test x\$exitcode = x0 || exit 1"
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
@@ -220,21 +244,25 @@ IFS=$as_save_IFS
if test "x$CONFIG_SHELL" != x; then :
- # We cannot yet assume a decent shell, so we have to provide a
- # neutralization value for shells without unset; and this also
- # works around shells that cannot unset nonexistent variables.
- # Preserve -v and -x to the replacement shell.
- BASH_ENV=/dev/null
- ENV=/dev/null
- (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
- export CONFIG_SHELL
- case $- in # ((((
- *v*x* | *x*v* ) as_opts=-vx ;;
- *v* ) as_opts=-v ;;
- *x* ) as_opts=-x ;;
- * ) as_opts= ;;
- esac
- exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
+ export CONFIG_SHELL
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
fi
if test x$as_have_required = xno; then :
@@ -336,6 +364,14 @@ $as_echo X"$as_dir" |
} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
# as_fn_append VAR VALUE
# ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take
@@ -457,6 +493,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
chmod +x "$as_me.lineno" ||
{ $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
# Don't try to exec as it changes $[0], causing all sort of problems
# (the dirname of $[0] is not the place where we might find the
# original and so on. Autoconf is especially sensitive to this).
@@ -491,16 +531,16 @@ if (echo >conf$$.file) 2>/dev/null; then
# ... but there are two gotchas:
# 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
# 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
- # In both cases, we have to default to `cp -p'.
+ # In both cases, we have to default to `cp -pR'.
ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
- as_ln_s='cp -p'
+ as_ln_s='cp -pR'
elif ln conf$$.file conf$$ 2>/dev/null; then
as_ln_s=ln
else
- as_ln_s='cp -p'
+ as_ln_s='cp -pR'
fi
else
- as_ln_s='cp -p'
+ as_ln_s='cp -pR'
fi
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
rmdir conf$$.dir 2>/dev/null
@@ -512,28 +552,8 @@ else
as_mkdir_p=false
fi
-if test -x / >/dev/null 2>&1; then
- as_test_x='test -x'
-else
- if ls -dL / >/dev/null 2>&1; then
- as_ls_L_option=L
- else
- as_ls_L_option=
- fi
- as_test_x='
- eval sh -c '\''
- if test -d "$1"; then
- test -d "$1/.";
- else
- case $1 in #(
- -*)set "./$1";;
- esac;
- case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
- ???[sx]*):;;*)false;;esac;fi
- '\'' sh
- '
-fi
-as_executable_p=$as_test_x
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
# Sed expression to map a string onto a valid CPP name.
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -567,8 +587,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='libjpeg'
PACKAGE_TARNAME='libjpeg'
-PACKAGE_VERSION='8.3.0'
-PACKAGE_STRING='libjpeg 8.3.0'
+PACKAGE_VERSION='9.2.0'
+PACKAGE_STRING='libjpeg 9.2.0'
PACKAGE_BUGREPORT=''
PACKAGE_URL=''
@@ -614,6 +634,7 @@ LTLIBOBJS
LIBOBJS
JPEG_LIB_VERSION
MEMORYMGR
+LT_SYS_LIBRARY_PATH
OTOOL64
OTOOL
LIPO
@@ -621,8 +642,6 @@ NMEDIT
DSYMUTIL
MANIFEST_TOOL
RANLIB
-ac_ct_AR
-AR
NM
ac_ct_DUMPBIN
DUMPBIN
@@ -633,20 +652,18 @@ LIBTOOL
OBJDUMP
DLLTOOL
AS
+EGREP
+GREP
HAVE_LD_VERSION_SCRIPT_FALSE
HAVE_LD_VERSION_SCRIPT_TRUE
+ac_ct_AR
+AR
LN_S
-MAINT
-MAINTAINER_MODE_FALSE
-MAINTAINER_MODE_TRUE
-ANSI2KNR
-U
-EGREP
-GREP
CPP
am__fastdepCC_FALSE
am__fastdepCC_TRUE
CCDEPMODE
+am__nodep
AMDEPBACKSLASH
AMDEP_FALSE
AMDEP_TRUE
@@ -660,8 +677,13 @@ CPPFLAGS
LDFLAGS
CFLAGS
CC
+MAINT
+MAINTAINER_MODE_FALSE
+MAINTAINER_MODE_TRUE
AM_BACKSLASH
AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
am__untar
am__tar
AMTAR
@@ -739,13 +761,14 @@ ac_subst_files=''
ac_user_opts='
enable_option_checking
enable_silent_rules
-enable_dependency_tracking
enable_maintainer_mode
+enable_dependency_tracking
enable_ld_version_script
enable_shared
enable_static
with_pic
enable_fast_install
+with_aix_soname
with_gnu_ld
with_sysroot
enable_libtool_lock
@@ -760,13 +783,7 @@ LDFLAGS
LIBS
CPPFLAGS
CPP
-CPPFLAGS
-CC
-LDFLAGS
-LIBS
-CPPFLAGS
-CPP
-CPPFLAGS'
+LT_SYS_LIBRARY_PATH'
# Initialize some variables set by options.
@@ -1222,8 +1239,6 @@ target=$target_alias
if test "x$host_alias" != x; then
if test "x$build_alias" = x; then
cross_compiling=maybe
- $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
- If a cross compiler is detected then cross compile mode will be used" >&2
elif test "x$build_alias" != "x$host_alias"; then
cross_compiling=yes
fi
@@ -1309,7 +1324,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures libjpeg 8.3.0 to adapt to many kinds of systems.
+\`configure' configures libjpeg 9.2.0 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1380,7 +1395,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of libjpeg 8.3.0:";;
+ short | recursive ) echo "Configuration of libjpeg 9.2.0:";;
esac
cat <<\_ACEOF
@@ -1388,12 +1403,15 @@ Optional Features:
--disable-option-checking ignore unrecognized --enable/--with options
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
- --enable-silent-rules less verbose build output (undo: `make V=1')
- --disable-silent-rules verbose build output (undo: `make V=0')
- --disable-dependency-tracking speeds up one-time build
- --enable-dependency-tracking do not reject slow dependency extractors
- --enable-maintainer-mode enable make rules and dependencies not useful
- (and sometimes confusing) to the casual installer
+ --enable-silent-rules less verbose build output (undo: "make V=1")
+ --disable-silent-rules verbose build output (undo: "make V=0")
+ --enable-maintainer-mode
+ enable make rules and dependencies not useful (and
+ sometimes confusing) to the casual installer
+ --enable-dependency-tracking
+ do not reject slow dependency extractors
+ --disable-dependency-tracking
+ speeds up one-time build
--enable-ld-version-script
enable linker version script (default is enabled
when possible)
@@ -1407,11 +1425,14 @@ Optional Features:
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
- --with-pic try to use only PIC/non-PIC objects [default=use
+ --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use
both]
+ --with-aix-soname=aix|svr4|both
+ shared library versioning (aka "SONAME") variant to
+ provide on AIX, [default=aix].
--with-gnu-ld assume the C compiler uses GNU ld [default=no]
- --with-sysroot=DIR Search for dependent libraries within DIR
- (or the compiler's sysroot if not specified).
+ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the
+ compiler's sysroot if not specified).
Some influential environment variables:
CC C compiler command
@@ -1422,6 +1443,8 @@ Some influential environment variables:
CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
you have headers in a nonstandard directory <include dir>
CPP C preprocessor
+ LT_SYS_LIBRARY_PATH
+ User-defined run-time library search path.
Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.
@@ -1489,10 +1512,10 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-libjpeg configure 8.3.0
-generated by GNU Autoconf 2.68
+libjpeg configure 9.2.0
+generated by GNU Autoconf 2.69
-Copyright (C) 2010 Free Software Foundation, Inc.
+Copyright (C) 2012 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
_ACEOF
@@ -1578,13 +1601,13 @@ fi
} # ac_fn_c_try_cpp
-# ac_fn_c_try_run LINENO
-# ----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
-ac_fn_c_try_run ()
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest$ac_exeext
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
@@ -1592,33 +1615,37 @@ case "(($ac_try" in
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
- { { case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_try") 2>&5
+ (eval "$ac_link") 2>conftest.err
ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; }; then :
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }; then :
ac_retval=0
else
- $as_echo "$as_me: program exited with status $ac_status" >&5
- $as_echo "$as_me: failed program was:" >&5
+ $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
- ac_retval=$ac_status
+ ac_retval=1
fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
rm -rf conftest.dSYM conftest_ipa8_conftest.oo
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
-} # ac_fn_c_try_run
+} # ac_fn_c_try_link
# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
# -------------------------------------------------------
@@ -1707,6 +1734,48 @@ fi
} # ac_fn_c_check_header_mongrel
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: program exited with status $ac_status" >&5
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
# -------------------------------------------------------
# Tests whether HEADER exists and can be compiled using the include files in
@@ -1738,52 +1807,6 @@ $as_echo "$ac_res" >&6; }
} # ac_fn_c_check_header_compile
-# ac_fn_c_try_link LINENO
-# -----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_link ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext conftest$ac_exeext
- if { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && {
- test -z "$ac_c_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest$ac_exeext && {
- test "$cross_compiling" = yes ||
- $as_test_x conftest$ac_exeext
- }; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
- # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
- # interfere with the next link command; also delete a directory that is
- # left behind by Apple's compiler. We do this before executing the actions.
- rm -rf conftest.dSYM conftest_ipa8_conftest.oo
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_link
-
# ac_fn_c_check_func LINENO FUNC VAR
# ----------------------------------
# Tests whether FUNC exists, setting the cache variable VAR accordingly
@@ -1854,8 +1877,8 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by libjpeg $as_me 8.3.0, which was
-generated by GNU Autoconf 2.68. Invocation command line was
+It was created by libjpeg $as_me 9.2.0, which was
+generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -2355,7 +2378,7 @@ test -n "$target_alias" &&
# Initialize Automake
# Don't require all the GNU mandated files
-am__api_version='1.11'
+am__api_version='1.15'
# Find a good install program. We prefer a C program (faster),
# so one script is as good as another. But avoid the broken or
@@ -2394,7 +2417,7 @@ case $as_dir/ in #((
# by default.
for ac_prog in ginstall scoinst install; do
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
if test $ac_prog = install &&
grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
# AIX install. It has an incompatible calling convention.
@@ -2452,9 +2475,6 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
$as_echo_n "checking whether build environment is sane... " >&6; }
-# Just in case
-sleep 1
-echo timestamp > conftest.file
# Reject unsafe characters in $srcdir or the absolute working directory
# name. Accept space and tab only in the latter.
am_lf='
@@ -2465,32 +2485,40 @@ case `pwd` in
esac
case $srcdir in
*[\\\"\#\$\&\'\`$am_lf\ \ ]*)
- as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
+ as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
esac
-# Do `set' in a subshell so we don't clobber the current shell's
+# Do 'set' in a subshell so we don't clobber the current shell's
# arguments. Must try -L first in case configure is actually a
# symlink; some systems play weird games with the mod time of symlinks
# (eg FreeBSD returns the mod time of the symlink's containing
# directory).
if (
- set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
- if test "$*" = "X"; then
- # -L didn't work.
- set X `ls -t "$srcdir/configure" conftest.file`
- fi
- rm -f conftest.file
- if test "$*" != "X $srcdir/configure conftest.file" \
- && test "$*" != "X conftest.file $srcdir/configure"; then
-
- # If neither matched, then we have a broken ls. This can happen
- # if, for instance, CONFIG_SHELL is bash and it inherits a
- # broken ls alias from the environment. This has actually
- # happened. Such a system could not be considered "sane".
- as_fn_error $? "ls -t appears to fail. Make sure there is not a broken
-alias in your environment" "$LINENO" 5
- fi
-
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ as_fn_error $? "ls -t appears to fail. Make sure there is not a broken
+ alias in your environment" "$LINENO" 5
+ fi
+ if test "$2" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
test "$2" = conftest.file
)
then
@@ -2502,6 +2530,16 @@ Check your system clock" "$LINENO" 5
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
test "$program_prefix" != NONE &&
program_transform_name="s&^&$program_prefix&;$program_transform_name"
# Use a double $ so make ignores it.
@@ -2512,8 +2550,8 @@ test "$program_suffix" != NONE &&
ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
if test x"${MISSING+set}" != xset; then
case $am_aux_dir in
@@ -2524,15 +2562,15 @@ if test x"${MISSING+set}" != xset; then
esac
fi
# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
- am_missing_run="$MISSING --run "
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
else
am_missing_run=
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
-$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
fi
-if test x"${install_sh}" != xset; then
+if test x"${install_sh+set}" != xset; then
case $am_aux_dir in
*\ * | *\ *)
install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
@@ -2541,10 +2579,10 @@ if test x"${install_sh}" != xset; then
esac
fi
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'. However `strip' might not be the right
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
+# will honor the 'STRIP' environment variable to overrule this program.
if test "$cross_compiling" != no; then
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
@@ -2563,7 +2601,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_STRIP="${ac_tool_prefix}strip"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -2603,7 +2641,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_STRIP="strip"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -2654,7 +2692,7 @@ do
test -z "$as_dir" && as_dir=.
for ac_prog in mkdir gmkdir; do
for ac_exec_ext in '' $ac_executable_extensions; do
- { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+ as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
'mkdir (GNU coreutils) '* | \
'mkdir (coreutils) '* | \
@@ -2683,12 +2721,6 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
$as_echo "$MKDIR_P" >&6; }
-mkdir_p="$MKDIR_P"
-case $mkdir_p in
- [\\/$]* | ?:[\\/]*) ;;
- */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-
for ac_prog in gawk mawk nawk awk
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
@@ -2707,7 +2739,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_AWK="$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -2771,6 +2803,45 @@ else
fi
rmdir .tst 2>/dev/null
+# Check whether --enable-silent-rules was given.
+if test "${enable_silent_rules+set}" = set; then :
+ enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in # (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=1;;
+esac
+am_make=${MAKE-make}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
+if ${am_cv_make_support_nested_variables+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if $as_echo 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+$as_echo "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
if test "`cd $srcdir && pwd`" != "`pwd`"; then
# Use -I$(srcdir) only when $(srcdir) != ., so that make's output
# is not polluted with repeated "-I."
@@ -2793,7 +2864,7 @@ fi
# Define the identity of the package.
PACKAGE='libjpeg'
- VERSION='8.3.0'
+ VERSION='9.2.0'
cat >>confdefs.h <<_ACEOF
@@ -2821,17 +2892,70 @@ AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
-# We need awk for the "check" target. The system "awk" is bad on
-# some platforms.
-# Always define AMTAR for backward compatibility.
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+mkdir_p='$(MKDIR_P)'
+
+# We need awk for the "check" target (and possibly the TAP driver). The
+# system "awk" is bad on some platforms.
+# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar pax cpio none'
+
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
-AMTAR=${AMTAR-"${am_missing_run}tar"}
-am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <http://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+ fi
+fi
# Make --enable-silent-rules the default.
@@ -2842,77 +2966,69 @@ if test "${enable_silent_rules+set}" = set; then :
enableval=$enable_silent_rules;
fi
-case $enable_silent_rules in
-yes) AM_DEFAULT_VERBOSITY=0;;
-no) AM_DEFAULT_VERBOSITY=1;;
-*) AM_DEFAULT_VERBOSITY=0;;
+case $enable_silent_rules in # (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=0;;
esac
-AM_BACKSLASH='\'
-
-
-# This is required when using the de-ANSI-fication feature.
-DEPDIR="${am__leading_dot}deps"
-
-ac_config_commands="$ac_config_commands depfiles"
-
-
am_make=${MAKE-make}
-cat > confinc << 'END'
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
+if ${am_cv_make_support_nested_variables+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if $as_echo 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
am__doit:
- @echo this is the am__doit target
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
-$as_echo_n "checking for style of include used by $am_make... " >&6; }
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# Ignore all kinds of additional output from `make'.
-case `$am_make -s -f confmf 2> /dev/null` in #(
-*the\ am__doit\ target*)
- am__include=include
- am__quote=
- _am_result=GNU
- ;;
-esac
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
- echo '.include "confinc"' > confmf
- case `$am_make -s -f confmf 2> /dev/null` in #(
- *the\ am__doit\ target*)
- am__include=.include
- am__quote="\""
- _am_result=BSD
- ;;
- esac
+ @$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+$as_echo "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
-$as_echo "$_am_result" >&6; }
-rm -f confinc confmf
+# Add configure option --enable-maintainer-mode which enables
+# dependency checking and generation useful to package maintainers.
+# This is made an option to avoid confusing end users.
-# Check whether --enable-dependency-tracking was given.
-if test "${enable_dependency_tracking+set}" = set; then :
- enableval=$enable_dependency_tracking;
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
+$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
+ # Check whether --enable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then :
+ enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
+else
+ USE_MAINTAINER_MODE=no
fi
-if test "x$enable_dependency_tracking" != xno; then
- am_depcomp="$ac_aux_dir/depcomp"
- AMDEPBACKSLASH='\'
-fi
- if test "x$enable_dependency_tracking" != xno; then
- AMDEP_TRUE=
- AMDEP_FALSE='#'
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
+$as_echo "$USE_MAINTAINER_MODE" >&6; }
+ if test $USE_MAINTAINER_MODE = yes; then
+ MAINTAINER_MODE_TRUE=
+ MAINTAINER_MODE_FALSE='#'
else
- AMDEP_TRUE='#'
- AMDEP_FALSE=
+ MAINTAINER_MODE_TRUE='#'
+ MAINTAINER_MODE_FALSE=
fi
+ MAINT=$MAINTAINER_MODE_TRUE
+
+
+# Check for programs
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -2935,7 +3051,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}gcc"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -2975,7 +3091,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="gcc"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -3028,7 +3144,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}cc"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -3069,7 +3185,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
ac_prog_rejected=yes
continue
@@ -3127,7 +3243,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -3171,7 +3287,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -3617,8 +3733,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdarg.h>
#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
+struct stat;
/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
struct buf { int x; };
FILE * (*rcsopen) (struct buf *, struct stat *, int);
@@ -3703,429 +3818,18 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
-depcc="$CC" am_compiler_list=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
-$as_echo_n "checking dependency style of $depcc... " >&6; }
-if ${am_cv_CC_dependencies_compiler_type+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
- # We make a subdir and do the tests there. Otherwise we can end up
- # making bogus files that we don't know about and never remove. For
- # instance it was reported that on HP-UX the gcc test will end up
- # making a dummy file named `D' -- because `-MD' means `put the output
- # in D'.
- mkdir conftest.dir
- # Copy depcomp to subdir because otherwise we won't find it if we're
- # using a relative directory.
- cp "$am_depcomp" conftest.dir
- cd conftest.dir
- # We will build objects and dependencies in a subdirectory because
- # it helps to detect inapplicable dependency modes. For instance
- # both Tru64's cc and ICC support -MD to output dependencies as a
- # side effect of compilation, but ICC will put the dependencies in
- # the current directory while Tru64 will put them in the object
- # directory.
- mkdir sub
-
- am_cv_CC_dependencies_compiler_type=none
- if test "$am_compiler_list" = ""; then
- am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
- fi
- am__universal=false
- case " $depcc " in #(
- *\ -arch\ *\ -arch\ *) am__universal=true ;;
- esac
-
- for depmode in $am_compiler_list; do
- # Setup a source with many dependencies, because some compilers
- # like to wrap large dependency lists on column 80 (with \), and
- # we should not choose a depcomp mode which is confused by this.
- #
- # We need to recreate these files for each test, as the compiler may
- # overwrite some of them when testing with obscure command lines.
- # This happens at least with the AIX C compiler.
- : > sub/conftest.c
- for i in 1 2 3 4 5 6; do
- echo '#include "conftst'$i'.h"' >> sub/conftest.c
- # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
- # Solaris 8's {/usr,}/bin/sh.
- touch sub/conftst$i.h
- done
- echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
- # We check with `-c' and `-o' for the sake of the "dashmstdout"
- # mode. It turns out that the SunPro C++ compiler does not properly
- # handle `-M -o', and we need to detect this. Also, some Intel
- # versions had trouble with output in subdirs
- am__obj=sub/conftest.${OBJEXT-o}
- am__minus_obj="-o $am__obj"
- case $depmode in
- gcc)
- # This depmode causes a compiler race in universal mode.
- test "$am__universal" = false || continue
- ;;
- nosideeffect)
- # after this tag, mechanisms are not by side-effect, so they'll
- # only be used when explicitly requested
- if test "x$enable_dependency_tracking" = xyes; then
- continue
- else
- break
- fi
- ;;
- msvisualcpp | msvcmsys)
- # This compiler won't grok `-c -o', but also, the minuso test has
- # not run yet. These depmodes are late enough in the game, and
- # so weak that their functioning should not be impacted.
- am__obj=conftest.${OBJEXT-o}
- am__minus_obj=
- ;;
- none) break ;;
- esac
- if depmode=$depmode \
- source=sub/conftest.c object=$am__obj \
- depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
- $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
- >/dev/null 2>conftest.err &&
- grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
- grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
- grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
- ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
- # icc doesn't choke on unknown options, it will just issue warnings
- # or remarks (even with -Werror). So we grep stderr for any message
- # that says an option was ignored or not supported.
- # When given -MP, icc 7.0 and 7.1 complain thusly:
- # icc: Command line warning: ignoring option '-M'; no argument required
- # The diagnosis changed in icc 8.0:
- # icc: Command line remark: option '-MP' not supported
- if (grep 'ignoring option' conftest.err ||
- grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
- am_cv_CC_dependencies_compiler_type=$depmode
- break
- fi
- fi
- done
-
- cd ..
- rm -rf conftest.dir
-else
- am_cv_CC_dependencies_compiler_type=none
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
-CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
-
- if
- test "x$enable_dependency_tracking" != xno \
- && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
- am__fastdepCC_TRUE=
- am__fastdepCC_FALSE='#'
-else
- am__fastdepCC_TRUE='#'
- am__fastdepCC_FALSE=
-fi
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for function prototypes" >&5
-$as_echo_n "checking for function prototypes... " >&6; }
-if test "$ac_cv_prog_cc_c89" != no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-
-$as_echo "#define PROTOTYPES 1" >>confdefs.h
-
-
-$as_echo "#define __PROTOTYPES 1" >>confdefs.h
-
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
- CPP=
-fi
-if test -z "$CPP"; then
- if ${ac_cv_prog_CPP+:} false; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
+if ${am_cv_prog_cc_c_o+:} false; then :
$as_echo_n "(cached) " >&6
else
- # Double quotes because CPP needs to be expanded
- for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
- do
- ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
- Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- # Broken: success on invalid input.
-continue
-else
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
- break
-fi
-
- done
- ac_cv_prog_CPP=$CPP
-
-fi
- CPP=$ac_cv_prog_CPP
-else
- ac_cv_prog_CPP=$CPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
- Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- # Broken: success on invalid input.
-continue
-else
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if ${ac_cv_path_GREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -z "$GREP"; then
- ac_path_GREP_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in grep ggrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
- { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
-# Check for GNU ac_path_GREP and select it if it is found.
- # Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
-*GNU*)
- ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo 'GREP' >> "conftest.nl"
- "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_GREP_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_GREP="$ac_path_GREP"
- ac_path_GREP_max=$ac_count
- fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_GREP_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_GREP"; then
- as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
- fi
-else
- ac_cv_path_GREP=$GREP
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
- GREP="$ac_cv_path_GREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if ${ac_cv_path_EGREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
- then ac_cv_path_EGREP="$GREP -E"
- else
- if test -z "$EGREP"; then
- ac_path_EGREP_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in egrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
- { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
-# Check for GNU ac_path_EGREP and select it if it is found.
- # Check for GNU $ac_path_EGREP
-case `"$ac_path_EGREP" --version 2>&1` in
-*GNU*)
- ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo 'EGREP' >> "conftest.nl"
- "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_EGREP_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_EGREP="$ac_path_EGREP"
- ac_path_EGREP_max=$ac_count
- fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_EGREP_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_EGREP"; then
- as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
- fi
-else
- ac_cv_path_EGREP=$EGREP
-fi
-
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
- EGREP="$ac_cv_path_EGREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
int
main ()
@@ -4135,704 +3839,106 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_header_stdc=yes
-else
- ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
- # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "free" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
- if test "$cross_compiling" = yes; then :
- :
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
- (('a' <= (c) && (c) <= 'i') \
- || ('j' <= (c) && (c) <= 'r') \
- || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
- int i;
- for (i = 0; i < 256; i++)
- if (XOR (islower (i), ISLOWER (i))
- || toupper (i) != TOUPPER (i))
- return 2;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
- inttypes.h stdint.h unistd.h
-do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-
-if test "$ac_cv_prog_cc_stdc" != no; then
- U= ANSI2KNR=
-else
- U=_ ANSI2KNR=./ansi2knr
-fi
-# Ensure some checks needed by ansi2knr itself.
-
-for ac_header in string.h
-do :
- ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default"
-if test "x$ac_cv_header_string_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_STRING_H 1
-_ACEOF
-
-fi
-
-done
-
-
-
-# Add configure option --enable-maintainer-mode which enables
-# dependency checking and generation useful to package maintainers.
-# This is made an option to avoid confusing end users.
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
-$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
- # Check whether --enable-maintainer-mode was given.
-if test "${enable_maintainer_mode+set}" = set; then :
- enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
-else
- USE_MAINTAINER_MODE=no
-fi
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
-$as_echo "$USE_MAINTAINER_MODE" >&6; }
- if test $USE_MAINTAINER_MODE = yes; then
- MAINTAINER_MODE_TRUE=
- MAINTAINER_MODE_FALSE='#'
-else
- MAINTAINER_MODE_TRUE='#'
- MAINTAINER_MODE_FALSE=
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+ ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+$as_echo "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
fi
-
- MAINT=$MAINTAINER_MODE_TRUE
-
-
-
-# Check for programs
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_CC="${ac_tool_prefix}gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_CC"; then
- ac_ct_CC=$CC
- # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_CC"; then
- ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_ac_ct_CC="gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
- if test "x$ac_ct_CC" = x; then
- CC=""
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
- CC=$ac_ct_CC
- fi
-else
- CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_CC="${ac_tool_prefix}cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- fi
-fi
-if test -z "$CC"; then
- # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
- ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
- ac_prog_rejected=yes
- continue
- fi
- ac_cv_prog_CC="cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-if test $ac_prog_rejected = yes; then
- # We found a bogon in the path, so make sure we never use it.
- set dummy $ac_cv_prog_CC
- shift
- if test $# != 0; then
- # We chose a different compiler from the bogus one.
- # However, it has the same basename, so the bogon will be chosen
- # first if we set CC to just the basename; use the full file name.
- shift
- ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
- fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
-fi
-if test -z "$CC"; then
- if test -n "$ac_tool_prefix"; then
- for ac_prog in cl.exe
- do
- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$CC" && break
- done
-fi
-if test -z "$CC"; then
- ac_ct_CC=$CC
- for ac_prog in cl.exe
-do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -n "$ac_ct_CC"; then
- ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
- ac_cv_prog_ac_ct_CC="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
- done
-IFS=$as_save_IFS
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
+DEPDIR="${am__leading_dot}deps"
+ac_config_commands="$ac_config_commands depfiles"
- test -n "$ac_ct_CC" && break
-done
- if test "x$ac_ct_CC" = x; then
- CC=""
- else
- case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from 'make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+ am__include=include
+ am__quote=
+ _am_result=GNU
+ ;;
esac
- CC=$ac_ct_CC
- fi
-fi
-
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ case `$am_make -s -f confmf 2> /dev/null` in #(
+ *the\ am__doit\ target*)
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ ;;
+ esac
fi
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "no acceptable C compiler found in \$PATH
-See \`config.log' for more details" "$LINENO" 5; }
-
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
- { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_compiler $ac_option >&5") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- sed '10a\
-... rest of stderr output deleted ...
- 10q' conftest.err >conftest.er1
- cat conftest.er1 >&5
- fi
- rm -f conftest.er1 conftest.err
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }
-done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if ${ac_cv_c_compiler_gnu+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-#ifndef __GNUC__
- choke me
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_compiler_gnu=yes
-else
- ac_compiler_gnu=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+ enableval=$enable_dependency_tracking;
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
- GCC=yes
-else
- GCC=
-fi
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if ${ac_cv_prog_cc_g+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_save_c_werror_flag=$ac_c_werror_flag
- ac_c_werror_flag=yes
- ac_cv_prog_cc_g=no
- CFLAGS="-g"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_g=yes
-else
- CFLAGS=""
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
- ac_c_werror_flag=$ac_save_c_werror_flag
- CFLAGS="-g"
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- ac_c_werror_flag=$ac_save_c_werror_flag
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
- CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
- if test "$GCC" = yes; then
- CFLAGS="-g -O2"
- else
- CFLAGS="-g"
- fi
-else
- if test "$GCC" = yes; then
- CFLAGS="-O2"
- else
- CFLAGS=
- fi
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if ${ac_cv_prog_cc_c89+:} false; then :
- $as_echo_n "(cached) " >&6
+ if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
else
- ac_cv_prog_cc_c89=no
-ac_save_CC=$CC
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdarg.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
- char **p;
- int i;
-{
- return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
- char *s;
- va_list v;
- va_start (v,p);
- s = g (p, va_arg (v,int));
- va_end (v);
- return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
- function prototypes and stuff, but not '\xHH' hex character constants.
- These don't provoke an error unfortunately, instead are silently treated
- as 'x'. The following induces an error, until -std is added to get
- proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
- array size at least. It's necessary to write '\x00'==0 to get something
- that's true only with -std. */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
-
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
- inside strings and character constants. */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
-
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
- ;
- return 0;
-}
-_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
- -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
- CC="$ac_save_CC $ac_arg"
- if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_c89=$ac_arg
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
fi
-rm -f core conftest.err conftest.$ac_objext
- test "x$ac_cv_prog_cc_c89" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
- x)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
- xno)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
- *)
- CC="$CC $ac_cv_prog_cc_c89"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
depcc="$CC" am_compiler_list=
@@ -4845,8 +3951,9 @@ else
# We make a subdir and do the tests there. Otherwise we can end up
# making bogus files that we don't know about and never remove. For
# instance it was reported that on HP-UX the gcc test will end up
- # making a dummy file named `D' -- because `-MD' means `put the output
- # in D'.
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
mkdir conftest.dir
# Copy depcomp to subdir because otherwise we won't find it if we're
# using a relative directory.
@@ -4880,16 +3987,16 @@ else
: > sub/conftest.c
for i in 1 2 3 4 5 6; do
echo '#include "conftst'$i'.h"' >> sub/conftest.c
- # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
- # Solaris 8's {/usr,}/bin/sh.
- touch sub/conftst$i.h
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
done
echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
- # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
# mode. It turns out that the SunPro C++ compiler does not properly
- # handle `-M -o', and we need to detect this. Also, some Intel
- # versions had trouble with output in subdirs
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
am__obj=sub/conftest.${OBJEXT-o}
am__minus_obj="-o $am__obj"
case $depmode in
@@ -4898,16 +4005,16 @@ else
test "$am__universal" = false || continue
;;
nosideeffect)
- # after this tag, mechanisms are not by side-effect, so they'll
- # only be used when explicitly requested
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
if test "x$enable_dependency_tracking" = xyes; then
continue
else
break
fi
;;
- msvisualcpp | msvcmsys)
- # This compiler won't grok `-c -o', but also, the minuso test has
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
# not run yet. These depmodes are late enough in the game, and
# so weak that their functioning should not be impacted.
am__obj=conftest.${OBJEXT-o}
@@ -5111,7 +4218,7 @@ main ()
return 0;
}
_ACEOF
-for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -xc99=all -qlanglvl=extc99
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99
do
CC="$ac_save_CC $ac_arg"
if ac_fn_c_try_compile "$LINENO"; then :
@@ -5151,8 +4258,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdarg.h>
#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
+struct stat;
/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
struct buf { int x; };
FILE * (*rcsopen) (struct buf *, struct stat *, int);
@@ -5435,6 +4541,178 @@ $as_echo "no, using $LN_S" >&6; }
fi
+if test -n "$ac_tool_prefix"; then
+ for ac_prog in ar lib "link -lib"
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AR+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$AR" && break
+ done
+fi
+if test -z "$AR"; then
+ ac_ct_AR=$AR
+ for ac_prog in ar lib "link -lib"
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_AR"; then
+ ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_AR="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_AR" && break
+done
+
+ if test "x$ac_ct_AR" = x; then
+ AR="false"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ AR=$ac_ct_AR
+ fi
+fi
+
+: ${AR=ar}
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5
+$as_echo_n "checking the archiver ($AR) interface... " >&6; }
+if ${am_cv_ar_interface+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ am_cv_ar_interface=ar
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+int some_variable = 0;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5
+ (eval $am_ar_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if test "$ac_status" -eq 0; then
+ am_cv_ar_interface=ar
+ else
+ am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5
+ (eval $am_ar_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if test "$ac_status" -eq 0; then
+ am_cv_ar_interface=lib
+ else
+ am_cv_ar_interface=unknown
+ fi
+ fi
+ rm -f conftest.lib libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5
+$as_echo "$am_cv_ar_interface" >&6; }
+
+case $am_cv_ar_interface in
+ar)
+ ;;
+lib)
+ # Microsoft lib, so override with the ar-lib wrapper script.
+ # FIXME: It is wrong to rewrite AR.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__AR in this case,
+ # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something
+ # similar.
+ AR="$am_aux_dir/ar-lib $AR"
+ ;;
+unknown)
+ as_fn_error $? "could not determine $AR interface" "$LINENO" 5
+ ;;
+esac
+
+
# Check if LD supports linker scripts,
# and define automake conditional HAVE_LD_VERSION_SCRIPT if so.
# Check whether --enable-ld-version-script was given.
@@ -5508,13 +4786,6 @@ int testfunction (int arg1, int * arg2) /* check definitions */
int test2function (void) /* check void arg list */
{ return 0; }
-int
-main ()
-{
-
- ;
- return 0;
-}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
ijg_cv_have_prototypes=yes
@@ -5531,14 +4802,279 @@ if test $ijg_cv_have_prototypes = yes; then
$as_echo "#define HAVE_PROTOTYPES 1" >>confdefs.h
else
- echo Your compiler does not seem to know about function prototypes.
- echo Perhaps it needs a special switch to enable ANSI C mode.
- echo If so, we recommend running configure like this:
- echo " ./configure CC='cc -switch'"
- echo where -switch is the proper switch.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Your compiler does not seem to know about function prototypes.
+ Perhaps it needs a special switch to enable ANSI C mode.
+ If so, we recommend running configure like this:
+ ./configure CC='cc -switch'
+ where -switch is the proper switch." >&5
+$as_echo "$as_me: WARNING: Your compiler does not seem to know about function prototypes.
+ Perhaps it needs a special switch to enable ANSI C mode.
+ If so, we recommend running configure like this:
+ ./configure CC='cc -switch'
+ where -switch is the proper switch." >&2;}
fi
# Check header files
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in grep ggrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_GREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in egrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_header_stdc=yes
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then :
+ :
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ return 2;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
for ac_header in stddef.h stdlib.h locale.h
do :
as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
@@ -5601,12 +5137,12 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ijg_size_t_ok" >&5
$as_echo "$ijg_size_t_ok" >&6; }
if test "$ijg_size_t_ok" != yes; then
-ac_fn_c_check_header_mongrel "$LINENO" "sys/types.h" "ac_cv_header_sys_types_h" "$ac_includes_default"
+ ac_fn_c_check_header_mongrel "$LINENO" "sys/types.h" "ac_cv_header_sys_types_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_types_h" = xyes; then :
$as_echo "#define NEED_SYS_TYPES_H 1" >>confdefs.h
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <sys/types.h>
_ACEOF
@@ -5623,12 +5159,14 @@ else
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ijg_size_t_ok" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ijg_size_t_ok" >&5
$as_echo "$ijg_size_t_ok" >&6; }
-if test "$ijg_size_t_ok" = no; then
- echo Type size_t is not defined in any of the usual places.
- echo Try putting '"typedef unsigned int size_t;"' in jconfig.h.
-fi
+ if test "$ijg_size_t_ok" = no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Type size_t is not defined in any of the usual places.
+ Try putting '\"typedef unsigned int size_t;\"' in jconfig.h." >&5
+$as_echo "$as_me: WARNING: Type size_t is not defined in any of the usual places.
+ Try putting '\"typedef unsigned int size_t;\"' in jconfig.h." >&2;}
+ fi
fi
# Check compiler characteristics
@@ -5656,6 +5194,7 @@ else
$as_echo "no" >&6; }
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for type unsigned short" >&5
$as_echo_n "checking for type unsigned short... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -5680,6 +5219,7 @@ else
$as_echo "no" >&6; }
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for type void" >&5
$as_echo_n "checking for type void... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -5736,11 +5276,11 @@ else
int
main ()
{
-/* FIXME: Include the comments suggested by Paul. */
+
#ifndef __cplusplus
- /* Ultrix mips cc rejects this. */
+ /* Ultrix mips cc rejects this sort of thing. */
typedef int charset[2];
- const charset cs;
+ const charset cs = { 0, 0 };
/* SunOS 4.1.1 cc rejects this. */
char const *const *pcpcc;
char **ppc;
@@ -5757,8 +5297,9 @@ main ()
++pcpcc;
ppc = (char**) pcpcc;
pcpcc = (char const *const *) ppc;
- { /* SCO 3.2v4 cc rejects this. */
- char *t;
+ { /* SCO 3.2v4 cc rejects this sort of thing. */
+ char tx;
+ char *t = &tx;
char const *s = 0 ? (char *) 0 : (char const *) 0;
*t++ = 0;
@@ -5774,10 +5315,10 @@ main ()
iptr p = 0;
++p;
}
- { /* AIX XL C 1.02.0.0 rejects this saying
+ { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying
"k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
- struct s { int j; const int *ap[3]; };
- struct s *b; b->j = 5;
+ struct s { int j; const int *ap[3]; } bx;
+ struct s *b = &bx; b->j = 5;
}
{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
const int foo = 10;
@@ -5928,13 +5469,19 @@ rm -f core conftest.err conftest.$ac_objext \
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if char is signed" >&5
$as_echo_n "checking to see if char is signed... " >&6; }
if test "$cross_compiling" = yes; then :
- echo Assuming that char is signed on target machine.
-echo If it is unsigned, this will be a little bit inefficient.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Assuming that char is signed on target machine.
+ If it is unsigned, this will be a little bit inefficient." >&5
+$as_echo "$as_me: WARNING: Assuming that char is signed on target machine.
+ If it is unsigned, this will be a little bit inefficient." >&2;}
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#include <stdio.h>
#ifdef HAVE_PROTOTYPES
int is_char_signed (int arg)
#else
@@ -5970,6 +5517,7 @@ rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if right shift is signed" >&5
$as_echo_n "checking to see if right shift is signed... " >&6; }
if test "$cross_compiling" = yes; then :
@@ -5979,6 +5527,10 @@ else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#include <stdio.h>
#ifdef HAVE_PROTOTYPES
int is_shifting_signed (long arg)
#else
@@ -6020,6 +5572,7 @@ rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if fopen accepts b spec" >&5
$as_echo_n "checking to see if fopen accepts b spec... " >&6; }
if test "$cross_compiling" = yes; then :
@@ -6029,6 +5582,9 @@ else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
#include <stdio.h>
int main() {
if (fopen("conftestdata", "wb") != NULL)
@@ -6073,7 +5629,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_AS="${ac_tool_prefix}as"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -6113,7 +5669,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_AS="as"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -6165,7 +5721,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -6205,7 +5761,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_DLLTOOL="dlltool"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -6257,7 +5813,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -6297,7 +5853,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_OBJDUMP="objdump"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -6363,8 +5919,8 @@ esac
-macro_version='2.4'
-macro_revision='1.3293'
+macro_version='2.4.6'
+macro_revision='2.4.6'
@@ -6378,7 +5934,7 @@ macro_revision='1.3293'
-ltmain="$ac_aux_dir/ltmain.sh"
+ltmain=$ac_aux_dir/ltmain.sh
# Backslashify metacharacters that are still active within
# double-quoted strings.
@@ -6427,7 +5983,7 @@ func_echo_all ()
$ECHO ""
}
-case "$ECHO" in
+case $ECHO in
printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
$as_echo "printf" >&6; } ;;
print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
@@ -6471,7 +6027,7 @@ do
for ac_prog in sed gsed; do
for ac_exec_ext in '' $ac_executable_extensions; do
ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
- { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
+ as_fn_executable_p "$ac_path_SED" || continue
# Check for GNU ac_path_SED and select it if it is found.
# Check for GNU $ac_path_SED
case `"$ac_path_SED" --version 2>&1` in
@@ -6550,7 +6106,7 @@ do
for ac_prog in fgrep; do
for ac_exec_ext in '' $ac_executable_extensions; do
ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
- { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
+ as_fn_executable_p "$ac_path_FGREP" || continue
# Check for GNU ac_path_FGREP and select it if it is found.
# Check for GNU $ac_path_FGREP
case `"$ac_path_FGREP" --version 2>&1` in
@@ -6620,19 +6176,19 @@ test -z "$GREP" && GREP=grep
# Check whether --with-gnu-ld was given.
if test "${with_gnu_ld+set}" = set; then :
- withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+ withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
else
with_gnu_ld=no
fi
ac_prog=ld
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
# Check if gcc -print-prog-name=ld gives a path.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
$as_echo_n "checking for ld used by $CC... " >&6; }
case $host in
*-*-mingw*)
- # gcc leaves a trailing carriage return which upsets mingw
+ # gcc leaves a trailing carriage return, which upsets mingw
ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
*)
ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
@@ -6646,7 +6202,7 @@ $as_echo_n "checking for ld used by $CC... " >&6; }
while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
done
- test -z "$LD" && LD="$ac_prog"
+ test -z "$LD" && LD=$ac_prog
;;
"")
# If it fails, then pretend we aren't using GCC.
@@ -6657,7 +6213,7 @@ $as_echo_n "checking for ld used by $CC... " >&6; }
with_gnu_ld=unknown
;;
esac
-elif test "$with_gnu_ld" = yes; then
+elif test yes = "$with_gnu_ld"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
$as_echo_n "checking for GNU ld... " >&6; }
else
@@ -6668,32 +6224,32 @@ if ${lt_cv_path_LD+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -z "$LD"; then
- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
for ac_dir in $PATH; do
- IFS="$lt_save_ifs"
+ IFS=$lt_save_ifs
test -z "$ac_dir" && ac_dir=.
if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
- lt_cv_path_LD="$ac_dir/$ac_prog"
+ lt_cv_path_LD=$ac_dir/$ac_prog
# Check to see if the program is GNU ld. I'd rather use --version,
# but apparently some variants of GNU ld only accept -v.
# Break only if it was the GNU/non-GNU ld that we prefer.
case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
*GNU* | *'with BFD'*)
- test "$with_gnu_ld" != no && break
+ test no != "$with_gnu_ld" && break
;;
*)
- test "$with_gnu_ld" != yes && break
+ test yes != "$with_gnu_ld" && break
;;
esac
fi
done
- IFS="$lt_save_ifs"
+ IFS=$lt_save_ifs
else
- lt_cv_path_LD="$LD" # Let the user override the test with a path.
+ lt_cv_path_LD=$LD # Let the user override the test with a path.
fi
fi
-LD="$lt_cv_path_LD"
+LD=$lt_cv_path_LD
if test -n "$LD"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
$as_echo "$LD" >&6; }
@@ -6736,33 +6292,38 @@ if ${lt_cv_path_NM+:} false; then :
else
if test -n "$NM"; then
# Let the user override the test.
- lt_cv_path_NM="$NM"
+ lt_cv_path_NM=$NM
else
- lt_nm_to_check="${ac_tool_prefix}nm"
+ lt_nm_to_check=${ac_tool_prefix}nm
if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
lt_nm_to_check="$lt_nm_to_check nm"
fi
for lt_tmp_nm in $lt_nm_to_check; do
- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
- IFS="$lt_save_ifs"
+ IFS=$lt_save_ifs
test -z "$ac_dir" && ac_dir=.
- tmp_nm="$ac_dir/$lt_tmp_nm"
- if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+ tmp_nm=$ac_dir/$lt_tmp_nm
+ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
# Check to see if the nm accepts a BSD-compat flag.
- # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+ # Adding the 'sed 1q' prevents false positives on HP-UX, which says:
# nm: unknown option "B" ignored
# Tru64's nm complains that /dev/null is an invalid object file
- case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
- */dev/null* | *'Invalid file or object type'*)
+ # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+ case $build_os in
+ mingw*) lt_bad_file=conftest.nm/nofile ;;
+ *) lt_bad_file=/dev/null ;;
+ esac
+ case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+ *$lt_bad_file* | *'Invalid file or object type'*)
lt_cv_path_NM="$tmp_nm -B"
- break
+ break 2
;;
*)
case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
*/dev/null*)
lt_cv_path_NM="$tmp_nm -p"
- break
+ break 2
;;
*)
lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
@@ -6773,15 +6334,15 @@ else
esac
fi
done
- IFS="$lt_save_ifs"
+ IFS=$lt_save_ifs
done
: ${lt_cv_path_NM=no}
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
$as_echo "$lt_cv_path_NM" >&6; }
-if test "$lt_cv_path_NM" != "no"; then
- NM="$lt_cv_path_NM"
+if test no != "$lt_cv_path_NM"; then
+ NM=$lt_cv_path_NM
else
# Didn't find any BSD compatible name lister, look for dumpbin.
if test -n "$DUMPBIN"; then :
@@ -6806,7 +6367,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -6850,7 +6411,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -6887,9 +6448,9 @@ esac
fi
fi
- case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+ case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
*COFF*)
- DUMPBIN="$DUMPBIN -symbols"
+ DUMPBIN="$DUMPBIN -symbols -headers"
;;
*)
DUMPBIN=:
@@ -6897,8 +6458,8 @@ fi
esac
fi
- if test "$DUMPBIN" != ":"; then
- NM="$DUMPBIN"
+ if test : != "$DUMPBIN"; then
+ NM=$DUMPBIN
fi
fi
test -z "$NM" && NM=nm
@@ -6938,7 +6499,7 @@ if ${lt_cv_sys_max_cmd_len+:} false; then :
$as_echo_n "(cached) " >&6
else
i=0
- teststring="ABCD"
+ teststring=ABCD
case $build_os in
msdosdjgpp*)
@@ -6978,7 +6539,7 @@ else
lt_cv_sys_max_cmd_len=8192;
;;
- netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+ bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
# This has been around since 386BSD, at least. Likely further.
if test -x /sbin/sysctl; then
lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
@@ -6997,6 +6558,11 @@ else
lt_cv_sys_max_cmd_len=196608
;;
+ os2*)
+ # The test takes a long time on OS/2.
+ lt_cv_sys_max_cmd_len=8192
+ ;;
+
osf*)
# Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
# due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
@@ -7023,22 +6589,23 @@ else
;;
*)
lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
- if test -n "$lt_cv_sys_max_cmd_len"; then
+ if test -n "$lt_cv_sys_max_cmd_len" && \
+ test undefined != "$lt_cv_sys_max_cmd_len"; then
lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
else
# Make teststring a little bigger before we do anything with it.
# a 1K string should be a reasonable start.
- for i in 1 2 3 4 5 6 7 8 ; do
+ for i in 1 2 3 4 5 6 7 8; do
teststring=$teststring$teststring
done
SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
# If test is not a shell built-in, we'll probably end up computing a
# maximum length that is only half of the actual maximum length, but
# we can't tell.
- while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \
+ while { test X`env echo "$teststring$teststring" 2>/dev/null` \
= "X$teststring$teststring"; } >/dev/null 2>&1 &&
- test $i != 17 # 1/2 MB should be enough
+ test 17 != "$i" # 1/2 MB should be enough
do
i=`expr $i + 1`
teststring=$teststring$teststring
@@ -7056,7 +6623,7 @@ else
fi
-if test -n $lt_cv_sys_max_cmd_len ; then
+if test -n "$lt_cv_sys_max_cmd_len"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
else
@@ -7074,30 +6641,6 @@ max_cmd_len=$lt_cv_sys_max_cmd_len
: ${MV="mv -f"}
: ${RM="rm -f"}
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
-$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
- test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
- = c,a/b,b/c, \
- && eval 'test $(( 1 + 1 )) -eq 2 \
- && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
- && xsi_shell=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
-$as_echo "$xsi_shell" >&6; }
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
-$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
- >/dev/null 2>&1 \
- && lt_shell_append=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
-$as_echo "$lt_shell_append" >&6; }
-
-
if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
lt_unset=unset
else
@@ -7220,13 +6763,13 @@ esac
reload_cmds='$LD$reload_flag -o $output$reload_objs'
case $host_os in
cygwin* | mingw* | pw32* | cegcc*)
- if test "$GCC" != yes; then
+ if test yes != "$GCC"; then
reload_cmds=false
fi
;;
darwin*)
- if test "$GCC" = yes; then
- reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+ if test yes = "$GCC"; then
+ reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
else
reload_cmds='$LD$reload_flag -o $output$reload_objs'
fi
@@ -7258,7 +6801,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -7298,7 +6841,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_OBJDUMP="objdump"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -7351,13 +6894,13 @@ lt_cv_deplibs_check_method='unknown'
# Need to set the preceding variable on all platforms that support
# interlibrary dependencies.
# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
+# 'unknown' -- same as none, but documents that we really don't know.
# 'pass_all' -- all dependencies passed with no checks.
# 'test_compile' -- check by making test program.
# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
case $host_os in
aix[4-9]*)
@@ -7384,8 +6927,7 @@ mingw* | pw32*)
# Base MSYS/MinGW do not provide the 'file' command needed by
# func_win32_libid shell function, so use a weaker test based on 'objdump',
# unless we find 'file', for example because we are cross-compiling.
- # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
- if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+ if ( file / ) >/dev/null 2>&1; then
lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
lt_cv_file_magic_cmd='func_win32_libid'
else
@@ -7421,10 +6963,6 @@ freebsd* | dragonfly*)
fi
;;
-gnu*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
haiku*)
lt_cv_deplibs_check_method=pass_all
;;
@@ -7462,8 +7000,8 @@ irix5* | irix6* | nonstopux*)
lt_cv_deplibs_check_method=pass_all
;;
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
lt_cv_deplibs_check_method=pass_all
;;
@@ -7485,8 +7023,8 @@ newos6*)
lt_cv_deplibs_check_method=pass_all
;;
-openbsd*)
- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+openbsd* | bitrig*)
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
else
lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
@@ -7539,6 +7077,9 @@ sysv4 | sysv4.3*)
tpf*)
lt_cv_deplibs_check_method=pass_all
;;
+os2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
esac
fi
@@ -7601,7 +7142,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -7641,7 +7182,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_DLLTOOL="dlltool"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -7693,8 +7234,8 @@ else
case $host_os in
cygwin* | mingw* | pw32* | cegcc*)
- # two different shell functions defined in ltmain.sh
- # decide which to use based on capabilities of $DLLTOOL
+ # two different shell functions defined in ltmain.sh;
+ # decide which one to use based on capabilities of $DLLTOOL
case `$DLLTOOL --help 2>&1` in
*--identify-strict*)
lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
@@ -7706,7 +7247,7 @@ cygwin* | mingw* | pw32* | cegcc*)
;;
*)
# fallback: assume linklib IS sharedlib
- lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+ lt_cv_sharedlib_from_linklib_cmd=$ECHO
;;
esac
@@ -7741,7 +7282,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -7785,7 +7326,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_AR="$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -7860,7 +7401,7 @@ if ac_fn_c_try_compile "$LINENO"; then :
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
- if test "$ac_status" -eq 0; then
+ if test 0 -eq "$ac_status"; then
# Ensure the archiver fails upon bogus file names.
rm -f conftest.$ac_objext libconftest.a
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
@@ -7868,7 +7409,7 @@ if ac_fn_c_try_compile "$LINENO"; then :
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
- if test "$ac_status" -ne 0; then
+ if test 0 -ne "$ac_status"; then
lt_cv_ar_at_file=@
fi
fi
@@ -7881,7 +7422,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
$as_echo "$lt_cv_ar_at_file" >&6; }
-if test "x$lt_cv_ar_at_file" = xno; then
+if test no = "$lt_cv_ar_at_file"; then
archiver_list_spec=
else
archiver_list_spec=$lt_cv_ar_at_file
@@ -7910,7 +7451,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_STRIP="${ac_tool_prefix}strip"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -7950,7 +7491,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_STRIP="strip"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -8009,7 +7550,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -8049,7 +7590,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_RANLIB="ranlib"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -8098,14 +7639,14 @@ old_postuninstall_cmds=
if test -n "$RANLIB"; then
case $host_os in
- openbsd*)
- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+ bitrig* | openbsd*)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
;;
*)
- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
;;
esac
- old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
fi
case $host_os in
@@ -8188,7 +7729,7 @@ cygwin* | mingw* | pw32* | cegcc*)
symcode='[ABCDGISTW]'
;;
hpux*)
- if test "$host_cpu" = ia64; then
+ if test ia64 = "$host_cpu"; then
symcode='[ABCDEGRST]'
fi
;;
@@ -8221,14 +7762,44 @@ case `$NM -V 2>&1` in
symcode='[ABCDGIRSTW]' ;;
esac
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+ # Gets list of data symbols to import.
+ lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+ # Adjust the below global symbol transforms to fixup imported variables.
+ lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+ lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'"
+ lt_c_name_lib_hook="\
+ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\
+ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'"
+else
+ # Disable hooks by default.
+ lt_cv_sys_global_symbol_to_import=
+ lt_cdecl_hook=
+ lt_c_name_hook=
+ lt_c_name_lib_hook=
+fi
+
# Transform an extracted symbol line into a proper C declaration.
# Some systems (esp. on ia64) link data and code symbols differently,
# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+lt_cv_sys_global_symbol_to_cdecl="sed -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'"
# Handle CRLF in mingw tool chain
opt_cr=
@@ -8246,20 +7817,24 @@ for ac_symprfx in "" "_"; do
# Write the raw and C identifiers.
if test "$lt_cv_nm_interface" = "MS dumpbin"; then
- # Fake it for dumpbin and say T for any non-static function
- # and D for any global variable.
+ # Fake it for dumpbin and say T for any non-static function,
+ # D for any global variable and I for any imported variable.
# Also find C++ and __fastcall symbols from MSVC++,
# which start with @ or ?.
lt_cv_sys_global_symbol_pipe="$AWK '"\
" {last_section=section; section=\$ 3};"\
+" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
" \$ 0!~/External *\|/{next};"\
" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
" {if(hide[section]) next};"\
-" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-" s[1]~/^[@?]/{print s[1], s[1]; next};"\
-" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
" ' prfx=^$ac_symprfx"
else
lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
@@ -8307,11 +7882,11 @@ _LT_EOF
if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
cat <<_LT_EOF > conftest.$ac_ext
/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
relocations are performed -- see ld's documentation on pseudo-relocs. */
# define LT_DLSYM_CONST
-#elif defined(__osf__)
+#elif defined __osf__
/* This system does not cope well with relocations in const data. */
# define LT_DLSYM_CONST
#else
@@ -8337,7 +7912,7 @@ lt__PROGRAM__LTX_preloaded_symbols[] =
{
{ "@PROGRAM@", (void *) 0 },
_LT_EOF
- $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+ $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
cat <<\_LT_EOF >> conftest.$ac_ext
{0, (void *) 0}
};
@@ -8357,13 +7932,13 @@ _LT_EOF
mv conftest.$ac_objext conftstm.$ac_objext
lt_globsym_save_LIBS=$LIBS
lt_globsym_save_CFLAGS=$CFLAGS
- LIBS="conftstm.$ac_objext"
+ LIBS=conftstm.$ac_objext
CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
(eval $ac_link) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && test -s conftest${ac_exeext}; then
+ test $ac_status = 0; } && test -s conftest$ac_exeext; then
pipe_works=yes
fi
LIBS=$lt_globsym_save_LIBS
@@ -8384,7 +7959,7 @@ _LT_EOF
rm -rf conftest* conftst*
# Do not use the global_symbol_pipe unless it works.
- if test "$pipe_works" = yes; then
+ if test yes = "$pipe_works"; then
break
else
lt_cv_sys_global_symbol_pipe=
@@ -8437,6 +8012,16 @@ fi
+
+
+
+
+
+
+
+
+
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
$as_echo_n "checking for sysroot... " >&6; }
@@ -8449,9 +8034,9 @@ fi
lt_sysroot=
-case ${with_sysroot} in #(
+case $with_sysroot in #(
yes)
- if test "$GCC" = yes; then
+ if test yes = "$GCC"; then
lt_sysroot=`$CC --print-sysroot 2>/dev/null`
fi
;; #(
@@ -8461,8 +8046,8 @@ case ${with_sysroot} in #(
no|'')
;; #(
*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5
-$as_echo "${with_sysroot}" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5
+$as_echo "$with_sysroot" >&6; }
as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
;;
esac
@@ -8474,18 +8059,99 @@ $as_echo "${lt_sysroot:-no}" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5
+$as_echo_n "checking for a working dd... " >&6; }
+if ${ac_cv_path_lt_DD+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+if test -z "$lt_DD"; then
+ ac_path_lt_DD_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in dd; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_lt_DD" || continue
+if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi
+ $ac_path_lt_DD_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_lt_DD"; then
+ :
+ fi
+else
+ ac_cv_path_lt_DD=$lt_DD
+fi
+
+rm -f conftest.i conftest2.i conftest.out
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5
+$as_echo "$ac_cv_path_lt_DD" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5
+$as_echo_n "checking how to truncate binary pipes... " >&6; }
+if ${lt_cv_truncate_bin+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+ cmp -s conftest.i conftest.out \
+ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5
+$as_echo "$lt_cv_truncate_bin" >&6; }
+
+
+
+
+
+
+
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+ for cc_temp in $*""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+ done
+ func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
# Check whether --enable-libtool-lock was given.
if test "${enable_libtool_lock+set}" = set; then :
enableval=$enable_libtool_lock;
fi
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
# Some flags need to be propagated to the compiler or linker for good
# libtool support.
case $host in
ia64-*-hpux*)
- # Find out which ABI we are using.
+ # Find out what ABI is being produced by ac_compile, and set mode
+ # options accordingly.
echo 'int i;' > conftest.$ac_ext
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
(eval $ac_compile) 2>&5
@@ -8494,24 +8160,25 @@ ia64-*-hpux*)
test $ac_status = 0; }; then
case `/usr/bin/file conftest.$ac_objext` in
*ELF-32*)
- HPUX_IA64_MODE="32"
+ HPUX_IA64_MODE=32
;;
*ELF-64*)
- HPUX_IA64_MODE="64"
+ HPUX_IA64_MODE=64
;;
esac
fi
rm -rf conftest*
;;
*-*-irix6*)
- # Find out which ABI we are using.
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
echo '#line '$LINENO' "configure"' > conftest.$ac_ext
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
(eval $ac_compile) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
- if test "$lt_cv_prog_gnu_ld" = yes; then
+ if test yes = "$lt_cv_prog_gnu_ld"; then
case `/usr/bin/file conftest.$ac_objext` in
*32-bit*)
LD="${LD-ld} -melf32bsmip"
@@ -8540,9 +8207,50 @@ ia64-*-hpux*)
rm -rf conftest*
;;
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+mips64*-*linux*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
+ echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ emul=elf
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ emul="${emul}32"
+ ;;
+ *64-bit*)
+ emul="${emul}64"
+ ;;
+ esac
+ case `/usr/bin/file conftest.$ac_objext` in
+ *MSB*)
+ emul="${emul}btsmip"
+ ;;
+ *LSB*)
+ emul="${emul}ltsmip"
+ ;;
+ esac
+ case `/usr/bin/file conftest.$ac_objext` in
+ *N32*)
+ emul="${emul}n32"
+ ;;
+ esac
+ LD="${LD-ld} -m $emul"
+ fi
+ rm -rf conftest*
+ ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
- # Find out which ABI we are using.
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly. Note that the listed cases only cover the
+ # situations where additional linker options are needed (such as when
+ # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+ # vice versa); the common cases where no linker options are needed do
+ # not appear in the list.
echo 'int i;' > conftest.$ac_ext
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
(eval $ac_compile) 2>&5
@@ -8556,9 +8264,19 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
LD="${LD-ld} -m elf_i386_fbsd"
;;
x86_64-*linux*)
- LD="${LD-ld} -m elf_i386"
+ case `/usr/bin/file conftest.o` in
+ *x86-64*)
+ LD="${LD-ld} -m elf32_x86_64"
+ ;;
+ *)
+ LD="${LD-ld} -m elf_i386"
+ ;;
+ esac
+ ;;
+ powerpc64le-*linux*)
+ LD="${LD-ld} -m elf32lppclinux"
;;
- ppc64-*linux*|powerpc64-*linux*)
+ powerpc64-*linux*)
LD="${LD-ld} -m elf32ppclinux"
;;
s390x-*linux*)
@@ -8577,7 +8295,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
x86_64-*linux*)
LD="${LD-ld} -m elf_x86_64"
;;
- ppc*-*linux*|powerpc*-*linux*)
+ powerpcle-*linux*)
+ LD="${LD-ld} -m elf64lppc"
+ ;;
+ powerpc-*linux*)
LD="${LD-ld} -m elf64ppc"
;;
s390*-*linux*|s390*-*tpf*)
@@ -8595,7 +8316,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
*-*-sco3.2v5*)
# On SCO OpenServer 5, we need -belf to get full-featured binaries.
- SAVE_CFLAGS="$CFLAGS"
+ SAVE_CFLAGS=$CFLAGS
CFLAGS="$CFLAGS -belf"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
@@ -8635,13 +8356,14 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
$as_echo "$lt_cv_cc_needs_belf" >&6; }
- if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+ if test yes != "$lt_cv_cc_needs_belf"; then
# this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
- CFLAGS="$SAVE_CFLAGS"
+ CFLAGS=$SAVE_CFLAGS
fi
;;
-sparc*-*solaris*)
- # Find out which ABI we are using.
+*-*solaris*)
+ # Find out what ABI is being produced by ac_compile, and set linker
+ # options accordingly.
echo 'int i;' > conftest.$ac_ext
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
(eval $ac_compile) 2>&5
@@ -8651,7 +8373,20 @@ sparc*-*solaris*)
case `/usr/bin/file conftest.o` in
*64-bit*)
case $lt_cv_prog_gnu_ld in
- yes*) LD="${LD-ld} -m elf64_sparc" ;;
+ yes*)
+ case $host in
+ i?86-*-solaris*|x86_64-*-solaris*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ sparc*-*-solaris*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ # GNU ld 2.21 introduced _sol2 emulations. Use them if available.
+ if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+ LD=${LD-ld}_sol2
+ fi
+ ;;
*)
if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
LD="${LD-ld} -64"
@@ -8665,7 +8400,7 @@ sparc*-*solaris*)
;;
esac
-need_locks="$enable_libtool_lock"
+need_locks=$enable_libtool_lock
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
@@ -8684,7 +8419,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -8724,7 +8459,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -8776,7 +8511,7 @@ else
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
$as_echo "$lt_cv_path_mainfest_tool" >&6; }
-if test "x$lt_cv_path_mainfest_tool" != xyes; then
+if test yes != "$lt_cv_path_mainfest_tool"; then
MANIFEST_TOOL=:
fi
@@ -8804,7 +8539,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -8844,7 +8579,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -8896,7 +8631,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -8936,7 +8671,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_NMEDIT="nmedit"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -8988,7 +8723,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -9028,7 +8763,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_LIPO="lipo"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -9080,7 +8815,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -9120,7 +8855,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_OTOOL="otool"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -9172,7 +8907,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -9212,7 +8947,7 @@ do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_OTOOL64="otool64"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -9279,7 +9014,7 @@ if ${lt_cv_apple_cc_single_mod+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_apple_cc_single_mod=no
- if test -z "${LT_MULTI_MODULE}"; then
+ if test -z "$LT_MULTI_MODULE"; then
# By default we will add the -single_module flag. You can override
# by either setting the environment variable LT_MULTI_MODULE
# non-empty at configure time, or by adding -multi_module to the
@@ -9291,7 +9026,13 @@ else
$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-dynamiclib -Wl,-single_module conftest.c 2>conftest.err
_lt_result=$?
- if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
+ # If there is a non-empty error log, and "single_module"
+ # appears in it, assume the flag caused a linker warning
+ if test -s conftest.err && $GREP single_module conftest.err; then
+ cat conftest.err >&5
+ # Otherwise, if the output was created with a 0 exit code from
+ # the compiler, it worked.
+ elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
lt_cv_apple_cc_single_mod=yes
else
cat conftest.err >&5
@@ -9302,6 +9043,7 @@ else
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
if ${lt_cv_ld_exported_symbols_list+:} false; then :
@@ -9329,11 +9071,12 @@ else
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
- LDFLAGS="$save_LDFLAGS"
+ LDFLAGS=$save_LDFLAGS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
$as_echo_n "checking for -force_load linker flag... " >&6; }
if ${lt_cv_ld_force_load+:} false; then :
@@ -9355,7 +9098,9 @@ _LT_EOF
echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
_lt_result=$?
- if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then
+ if test -s conftest.err && $GREP force_load conftest.err; then
+ cat conftest.err >&5
+ elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
lt_cv_ld_force_load=yes
else
cat conftest.err >&5
@@ -9368,32 +9113,32 @@ fi
$as_echo "$lt_cv_ld_force_load" >&6; }
case $host_os in
rhapsody* | darwin1.[012])
- _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+ _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
darwin1.*)
- _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
darwin*) # darwin 5.x on
# if running on 10.5 or later, the deployment target defaults
# to the OS version, if on x86, and 10.4, the deployment
# target defaults to 10.4. Don't you love it?
case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
10.0,*86*-darwin8*|10.0,*-darwin[91]*)
- _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
- 10.[012]*)
- _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+ 10.[012][,.]*)
+ _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
10.*)
- _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+ _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
esac
;;
esac
- if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+ if test yes = "$lt_cv_apple_cc_single_mod"; then
_lt_dar_single_mod='$single_module'
fi
- if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
- _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+ if test yes = "$lt_cv_ld_exported_symbols_list"; then
+ _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
else
- _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
fi
- if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+ if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
_lt_dsymutil='~$DSYMUTIL $lib || :'
else
_lt_dsymutil=
@@ -9401,6 +9146,41 @@ $as_echo "$lt_cv_ld_force_load" >&6; }
;;
esac
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+# string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+# string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+# "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+# VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+ case x$2 in
+ x)
+ ;;
+ *:)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+ ;;
+ x:*)
+ eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ *::*)
+ eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+ eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+ ;;
+ *)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ esac
+}
+
for ac_header in dlfcn.h
do :
ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
@@ -9435,14 +9215,14 @@ if test "${enable_shared+set}" = set; then :
*)
enable_shared=no
# Look at the argument we got. We use all the common list separators.
- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
for pkg in $enableval; do
- IFS="$lt_save_ifs"
+ IFS=$lt_save_ifs
if test "X$pkg" = "X$p"; then
enable_shared=yes
fi
done
- IFS="$lt_save_ifs"
+ IFS=$lt_save_ifs
;;
esac
else
@@ -9466,14 +9246,14 @@ if test "${enable_static+set}" = set; then :
*)
enable_static=no
# Look at the argument we got. We use all the common list separators.
- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
for pkg in $enableval; do
- IFS="$lt_save_ifs"
+ IFS=$lt_save_ifs
if test "X$pkg" = "X$p"; then
enable_static=yes
fi
done
- IFS="$lt_save_ifs"
+ IFS=$lt_save_ifs
;;
esac
else
@@ -9491,14 +9271,27 @@ fi
# Check whether --with-pic was given.
if test "${with_pic+set}" = set; then :
- withval=$with_pic; pic_mode="$withval"
+ withval=$with_pic; lt_p=${PACKAGE-default}
+ case $withval in
+ yes|no) pic_mode=$withval ;;
+ *)
+ pic_mode=default
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+ for lt_pkg in $withval; do
+ IFS=$lt_save_ifs
+ if test "X$lt_pkg" = "X$lt_p"; then
+ pic_mode=yes
+ fi
+ done
+ IFS=$lt_save_ifs
+ ;;
+ esac
else
pic_mode=default
fi
-test -z "$pic_mode" && pic_mode=default
-
@@ -9514,14 +9307,14 @@ if test "${enable_fast_install+set}" = set; then :
*)
enable_fast_install=no
# Look at the argument we got. We use all the common list separators.
- lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
for pkg in $enableval; do
- IFS="$lt_save_ifs"
+ IFS=$lt_save_ifs
if test "X$pkg" = "X$p"; then
enable_fast_install=yes
fi
done
- IFS="$lt_save_ifs"
+ IFS=$lt_save_ifs
;;
esac
else
@@ -9535,11 +9328,63 @@ fi
+ shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[5-9]*,yes)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5
+$as_echo_n "checking which variant of shared library versioning to provide... " >&6; }
+
+# Check whether --with-aix-soname was given.
+if test "${with_aix_soname+set}" = set; then :
+ withval=$with_aix_soname; case $withval in
+ aix|svr4|both)
+ ;;
+ *)
+ as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5
+ ;;
+ esac
+ lt_cv_with_aix_soname=$with_aix_soname
+else
+ if ${lt_cv_with_aix_soname+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ lt_cv_with_aix_soname=aix
+fi
+
+ with_aix_soname=$lt_cv_with_aix_soname
+fi
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5
+$as_echo "$with_aix_soname" >&6; }
+ if test aix != "$with_aix_soname"; then
+ # For the AIX way of multilib, we name the shared archive member
+ # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+ # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+ # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+ # the AIX toolchain works better with OBJECT_MODE set (default 32).
+ if test 64 = "${OBJECT_MODE-32}"; then
+ shared_archive_member_spec=shr_64
+ else
+ shared_archive_member_spec=shr
+ fi
+ fi
+ ;;
+*)
+ with_aix_soname=aix
+ ;;
+esac
+
+
+
+
+
+
+
# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
+LIBTOOL_DEPS=$ltmain
# Always use our own libtool.
LIBTOOL='$(SHELL) $(top_builddir)/libtool'
@@ -9569,6 +9414,10 @@ LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
test -z "$LN_S" && LN_S="ln -s"
@@ -9584,7 +9433,7 @@ test -z "$LN_S" && LN_S="ln -s"
-if test -n "${ZSH_VERSION+set}" ; then
+if test -n "${ZSH_VERSION+set}"; then
setopt NO_GLOB_SUBST
fi
@@ -9623,7 +9472,7 @@ aix3*)
# AIX sometimes has problems with the GCC collect2 program. For some
# reason, if we set the COLLECT_NAMES environment variable, the problems
# vanish in a puff of smoke.
- if test "X${COLLECT_NAMES+set}" != Xset; then
+ if test set != "${COLLECT_NAMES+set}"; then
COLLECT_NAMES=
export COLLECT_NAMES
fi
@@ -9634,14 +9483,14 @@ esac
ofile=libtool
can_build_shared=yes
-# All known linkers require a `.a' archive for static linking (except MSVC,
+# All known linkers require a '.a' archive for static linking (except MSVC,
# which needs '.lib').
libext=a
-with_gnu_ld="$lt_cv_prog_gnu_ld"
+with_gnu_ld=$lt_cv_prog_gnu_ld
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
+old_CC=$CC
+old_CFLAGS=$CFLAGS
# Set sane defaults for various variables
test -z "$CC" && CC=cc
@@ -9650,15 +9499,8 @@ test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
test -z "$LD" && LD=ld
test -z "$ac_objext" && ac_objext=o
-for cc_temp in $compiler""; do
- case $cc_temp in
- compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
- distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
- \-*) ;;
- *) break;;
- esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
# Only perform the check for file, if the check method requires it
@@ -9673,22 +9515,22 @@ if ${lt_cv_path_MAGIC_CMD+:} false; then :
else
case $MAGIC_CMD in
[\\/*] | ?:[\\/]*)
- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+ lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
;;
*)
- lt_save_MAGIC_CMD="$MAGIC_CMD"
- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ lt_save_MAGIC_CMD=$MAGIC_CMD
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
for ac_dir in $ac_dummy; do
- IFS="$lt_save_ifs"
+ IFS=$lt_save_ifs
test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/${ac_tool_prefix}file; then
- lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+ if test -f "$ac_dir/${ac_tool_prefix}file"; then
+ lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file"
if test -n "$file_magic_test_file"; then
case $deplibs_check_method in
"file_magic "*)
file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
- MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+ MAGIC_CMD=$lt_cv_path_MAGIC_CMD
if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
$EGREP "$file_magic_regex" > /dev/null; then
:
@@ -9711,13 +9553,13 @@ _LT_EOF
break
fi
done
- IFS="$lt_save_ifs"
- MAGIC_CMD="$lt_save_MAGIC_CMD"
+ IFS=$lt_save_ifs
+ MAGIC_CMD=$lt_save_MAGIC_CMD
;;
esac
fi
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
if test -n "$MAGIC_CMD"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
$as_echo "$MAGIC_CMD" >&6; }
@@ -9739,22 +9581,22 @@ if ${lt_cv_path_MAGIC_CMD+:} false; then :
else
case $MAGIC_CMD in
[\\/*] | ?:[\\/]*)
- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+ lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
;;
*)
- lt_save_MAGIC_CMD="$MAGIC_CMD"
- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ lt_save_MAGIC_CMD=$MAGIC_CMD
+ lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
for ac_dir in $ac_dummy; do
- IFS="$lt_save_ifs"
+ IFS=$lt_save_ifs
test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/file; then
- lt_cv_path_MAGIC_CMD="$ac_dir/file"
+ if test -f "$ac_dir/file"; then
+ lt_cv_path_MAGIC_CMD=$ac_dir/"file"
if test -n "$file_magic_test_file"; then
case $deplibs_check_method in
"file_magic "*)
file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
- MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+ MAGIC_CMD=$lt_cv_path_MAGIC_CMD
if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
$EGREP "$file_magic_regex" > /dev/null; then
:
@@ -9777,13 +9619,13 @@ _LT_EOF
break
fi
done
- IFS="$lt_save_ifs"
- MAGIC_CMD="$lt_save_MAGIC_CMD"
+ IFS=$lt_save_ifs
+ MAGIC_CMD=$lt_save_MAGIC_CMD
;;
esac
fi
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
if test -n "$MAGIC_CMD"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
$as_echo "$MAGIC_CMD" >&6; }
@@ -9804,7 +9646,7 @@ esac
# Use C for the default configuration in the libtool script
-lt_save_CC="$CC"
+lt_save_CC=$CC
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -9862,7 +9704,7 @@ if test -n "$compiler"; then
lt_prog_compiler_no_builtin_flag=
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
case $cc_basename in
nvcc*)
lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
@@ -9878,7 +9720,7 @@ else
lt_cv_prog_compiler_rtti_exceptions=no
ac_outfile=conftest.$ac_objext
echo "$lt_simple_compile_test_code" > conftest.$ac_ext
- lt_compiler_flag="-fno-rtti -fno-exceptions"
+ lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment
# Insert the option either (1) after the last *FLAGS variable, or
# (2) before a word containing "conftest.", or (3) at the end.
# Note that $ac_compile itself does not contain backslashes and begins
@@ -9908,7 +9750,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
-if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then
lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
else
:
@@ -9926,17 +9768,18 @@ lt_prog_compiler_pic=
lt_prog_compiler_static=
- if test "$GCC" = yes; then
+ if test yes = "$GCC"; then
lt_prog_compiler_wl='-Wl,'
lt_prog_compiler_static='-static'
case $host_os in
aix*)
# All AIX code is PIC.
- if test "$host_cpu" = ia64; then
+ if test ia64 = "$host_cpu"; then
# AIX 5 now supports IA64 processor
lt_prog_compiler_static='-Bstatic'
fi
+ lt_prog_compiler_pic='-fPIC'
;;
amigaos*)
@@ -9947,8 +9790,8 @@ lt_prog_compiler_static=
;;
m68k)
# FIXME: we need at least 68020 code to build shared libraries, but
- # adding the `-m68020' flag to GCC prevents building anything better,
- # like `-m68040'.
+ # adding the '-m68020' flag to GCC prevents building anything better,
+ # like '-m68040'.
lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
;;
esac
@@ -9964,6 +9807,11 @@ lt_prog_compiler_static=
# Although the cygwin gcc ignores -fPIC, still need this for old-style
# (--disable-auto-import) libraries
lt_prog_compiler_pic='-DDLL_EXPORT'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static='$wl-static'
+ ;;
+ esac
;;
darwin* | rhapsody*)
@@ -10024,7 +9872,9 @@ lt_prog_compiler_static=
case $cc_basename in
nvcc*) # Cuda Compiler Driver 2.2
lt_prog_compiler_wl='-Xlinker '
- lt_prog_compiler_pic='-Xcompiler -fPIC'
+ if test -n "$lt_prog_compiler_pic"; then
+ lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+ fi
;;
esac
else
@@ -10032,7 +9882,7 @@ lt_prog_compiler_static=
case $host_os in
aix*)
lt_prog_compiler_wl='-Wl,'
- if test "$host_cpu" = ia64; then
+ if test ia64 = "$host_cpu"; then
# AIX 5 now supports IA64 processor
lt_prog_compiler_static='-Bstatic'
else
@@ -10040,10 +9890,29 @@ lt_prog_compiler_static=
fi
;;
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic='-fno-common'
+ case $cc_basename in
+ nagfor*)
+ # NAG Fortran compiler
+ lt_prog_compiler_wl='-Wl,-Wl,,'
+ lt_prog_compiler_pic='-PIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+ esac
+ ;;
+
mingw* | cygwin* | pw32* | os2* | cegcc*)
# This hack is so that the source file can tell whether it is being
# built for inclusion in a dll (and should export symbols for example).
lt_prog_compiler_pic='-DDLL_EXPORT'
+ case $host_os in
+ os2*)
+ lt_prog_compiler_static='$wl-static'
+ ;;
+ esac
;;
hpux9* | hpux10* | hpux11*)
@@ -10059,7 +9928,7 @@ lt_prog_compiler_static=
;;
esac
# Is there a better lt_prog_compiler_static that works with the bundled CC?
- lt_prog_compiler_static='${wl}-a ${wl}archive'
+ lt_prog_compiler_static='$wl-a ${wl}archive'
;;
irix5* | irix6* | nonstopux*)
@@ -10068,9 +9937,9 @@ lt_prog_compiler_static=
lt_prog_compiler_static='-non_shared'
;;
- linux* | k*bsd*-gnu | kopensolaris*-gnu)
+ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
case $cc_basename in
- # old Intel for x86_64 which still supported -KPIC.
+ # old Intel for x86_64, which still supported -KPIC.
ecc*)
lt_prog_compiler_wl='-Wl,'
lt_prog_compiler_pic='-KPIC'
@@ -10095,6 +9964,12 @@ lt_prog_compiler_static=
lt_prog_compiler_pic='-PIC'
lt_prog_compiler_static='-Bstatic'
;;
+ tcc*)
+ # Fabrice Bellard et al's Tiny C Compiler
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
# Portland Group compilers (*not* the Pentium gcc compiler,
# which looks to be a dead project)
@@ -10115,18 +9990,33 @@ lt_prog_compiler_static=
;;
*)
case `$CC -V 2>&1 | sed 5q` in
- *Sun\ F* | *Sun*Fortran*)
+ *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
# Sun Fortran 8.3 passes all unrecognized flags to the linker
lt_prog_compiler_pic='-KPIC'
lt_prog_compiler_static='-Bstatic'
lt_prog_compiler_wl=''
;;
+ *Sun\ F* | *Sun*Fortran*)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ lt_prog_compiler_wl='-Qoption ld '
+ ;;
*Sun\ C*)
# Sun C 5.9
lt_prog_compiler_pic='-KPIC'
lt_prog_compiler_static='-Bstatic'
lt_prog_compiler_wl='-Wl,'
;;
+ *Intel*\ [CF]*Compiler*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ *Portland\ Group*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-fpic'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
esac
;;
esac
@@ -10177,7 +10067,7 @@ lt_prog_compiler_static=
;;
sysv4*MP*)
- if test -d /usr/nec ;then
+ if test -d /usr/nec; then
lt_prog_compiler_pic='-Kconform_pic'
lt_prog_compiler_static='-Bstatic'
fi
@@ -10206,7 +10096,7 @@ lt_prog_compiler_static=
fi
case $host_os in
- # For platforms which do not support PIC, -DPIC is meaningless:
+ # For platforms that do not support PIC, -DPIC is meaningless:
*djgpp*)
lt_prog_compiler_pic=
;;
@@ -10238,7 +10128,7 @@ else
lt_cv_prog_compiler_pic_works=no
ac_outfile=conftest.$ac_objext
echo "$lt_simple_compile_test_code" > conftest.$ac_ext
- lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+ lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment
# Insert the option either (1) after the last *FLAGS variable, or
# (2) before a word containing "conftest.", or (3) at the end.
# Note that $ac_compile itself does not contain backslashes and begins
@@ -10268,7 +10158,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
-if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
+if test yes = "$lt_cv_prog_compiler_pic_works"; then
case $lt_prog_compiler_pic in
"" | " "*) ;;
*) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
@@ -10300,7 +10190,7 @@ if ${lt_cv_prog_compiler_static_works+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_prog_compiler_static_works=no
- save_LDFLAGS="$LDFLAGS"
+ save_LDFLAGS=$LDFLAGS
LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
echo "$lt_simple_link_test_code" > conftest.$ac_ext
if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
@@ -10319,13 +10209,13 @@ else
fi
fi
$RM -r conftest*
- LDFLAGS="$save_LDFLAGS"
+ LDFLAGS=$save_LDFLAGS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
-if test x"$lt_cv_prog_compiler_static_works" = xyes; then
+if test yes = "$lt_cv_prog_compiler_static_works"; then
:
else
lt_prog_compiler_static=
@@ -10445,8 +10335,8 @@ $as_echo "$lt_cv_prog_compiler_c_o" >&6; }
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then
# do not overwrite the value of need_locks provided by the user
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
$as_echo_n "checking if we can lock with hard links... " >&6; }
@@ -10458,9 +10348,9 @@ $as_echo_n "checking if we can lock with hard links... " >&6; }
ln conftest.a conftest.b 2>/dev/null && hard_links=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
$as_echo "$hard_links" >&6; }
- if test "$hard_links" = no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+ if test no = "$hard_links"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
need_locks=warn
fi
else
@@ -10488,7 +10378,6 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
hardcode_direct=no
hardcode_direct_absolute=no
hardcode_libdir_flag_spec=
- hardcode_libdir_flag_spec_ld=
hardcode_libdir_separator=
hardcode_minus_L=no
hardcode_shlibpath_var=unsupported
@@ -10504,9 +10393,9 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
# included in the symbol list
include_expsyms=
# exclude_expsyms can be an extended regexp of symbols to exclude
- # it will be wrapped by ` (' and `)$', so one must not match beginning or
- # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
- # as well as any symbol that contains `d'.
+ # it will be wrapped by ' (' and ')$', so one must not match beginning or
+ # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+ # as well as any symbol that contains 'd'.
exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
# platforms (ab)use it in PIC code, but their linkers get confused if
@@ -10521,7 +10410,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
# FIXME: the MSVC++ port hasn't been tested in a loooong time
# When not using gcc, we currently assume that we are using
# Microsoft Visual C++.
- if test "$GCC" != yes; then
+ if test yes != "$GCC"; then
with_gnu_ld=no
fi
;;
@@ -10529,7 +10418,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
# we just hope/assume this is gcc and not c89 (= MSVC++)
with_gnu_ld=yes
;;
- openbsd*)
+ openbsd* | bitrig*)
with_gnu_ld=no
;;
esac
@@ -10539,7 +10428,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
# On some targets, GNU ld is compatible enough with the native linker
# that we're better off using the native interface for both.
lt_use_gnu_ld_interface=no
- if test "$with_gnu_ld" = yes; then
+ if test yes = "$with_gnu_ld"; then
case $host_os in
aix*)
# The AIX port of GNU ld has always aspired to compatibility
@@ -10561,24 +10450,24 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
esac
fi
- if test "$lt_use_gnu_ld_interface" = yes; then
+ if test yes = "$lt_use_gnu_ld_interface"; then
# If archive_cmds runs LD, not CC, wlarc should be empty
- wlarc='${wl}'
+ wlarc='$wl'
# Set some defaults for GNU ld with shared library support. These
# are reset later if shared libraries are not supported. Putting them
# here allows them to be overridden if necessary.
runpath_var=LD_RUN_PATH
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- export_dynamic_flag_spec='${wl}--export-dynamic'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ export_dynamic_flag_spec='$wl--export-dynamic'
# ancient GNU ld didn't support --whole-archive et. al.
if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
- whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
else
whole_archive_flag_spec=
fi
supports_anon_versioning=no
- case `$LD -v 2>&1` in
+ case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in
*GNU\ gold*) supports_anon_versioning=yes ;;
*\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
*\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
@@ -10591,7 +10480,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
case $host_os in
aix[3-9]*)
# On AIX/PPC, the GNU linker is very broken
- if test "$host_cpu" != ia64; then
+ if test ia64 != "$host_cpu"; then
ld_shlibs=no
cat <<_LT_EOF 1>&2
@@ -10610,7 +10499,7 @@ _LT_EOF
case $host_cpu in
powerpc)
# see comment about AmigaOS4 .so support
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
archive_expsym_cmds=''
;;
m68k)
@@ -10626,7 +10515,7 @@ _LT_EOF
allow_undefined_flag=unsupported
# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
# support --undefined. This deserves some investigation. FIXME
- archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
else
ld_shlibs=no
fi
@@ -10636,7 +10525,7 @@ _LT_EOF
# _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
# as there is no search path for DLLs.
hardcode_libdir_flag_spec='-L$libdir'
- export_dynamic_flag_spec='${wl}--export-all-symbols'
+ export_dynamic_flag_spec='$wl--export-all-symbols'
allow_undefined_flag=unsupported
always_export_symbols=no
enable_shared_with_static_runtimes=yes
@@ -10644,61 +10533,89 @@ _LT_EOF
exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
- # If the export-symbols file already is a .def file (1st line
- # is EXPORTS), use it as is; otherwise, prepend...
- archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
- cp $export_symbols $output_objdir/$soname.def;
- else
- echo EXPORTS > $output_objdir/$soname.def;
- cat $export_symbols >> $output_objdir/$soname.def;
- fi~
- $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file, use it as
+ # is; otherwise, prepend EXPORTS...
+ archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
else
ld_shlibs=no
fi
;;
haiku*)
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
link_all_deplibs=yes
;;
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ shrext_cmds=.dll
+ archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ enable_shared_with_static_runtimes=yes
+ ;;
+
interix[3-9]*)
hardcode_direct=no
hardcode_shlibpath_var=no
- hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
- export_dynamic_flag_spec='${wl}-E'
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+ export_dynamic_flag_spec='$wl-E'
# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
# Instead, shared libraries are loaded at an image base (0x10000000 by
# default) and relocated if they conflict, which is a slow very memory
# consuming and fragmenting process. To avoid this, we pick a random,
# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
# time. Moving up from 0x10000000 also allows more sbrk(2) space.
- archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
- archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
;;
gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
tmp_diet=no
- if test "$host_os" = linux-dietlibc; then
+ if test linux-dietlibc = "$host_os"; then
case $cc_basename in
diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn)
esac
fi
if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
- && test "$tmp_diet" = no
+ && test no = "$tmp_diet"
then
tmp_addflag=' $pic_flag'
tmp_sharedflag='-shared'
case $cc_basename,$host_cpu in
pgcc*) # Portland Group C compiler
- whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+ whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
tmp_addflag=' $pic_flag'
;;
pgf77* | pgf90* | pgf95* | pgfortran*)
# Portland Group f77 and f90 compilers
- whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+ whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
tmp_addflag=' $pic_flag -Mnomain' ;;
ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
tmp_addflag=' -i_dynamic' ;;
@@ -10709,43 +10626,47 @@ _LT_EOF
lf95*) # Lahey Fortran 8.1
whole_archive_flag_spec=
tmp_sharedflag='--shared' ;;
+ nagfor*) # NAGFOR 5.3
+ tmp_sharedflag='-Wl,-shared' ;;
xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
tmp_sharedflag='-qmkshrobj'
tmp_addflag= ;;
nvcc*) # Cuda Compiler Driver 2.2
- whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+ whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
compiler_needs_object=yes
;;
esac
case `$CC -V 2>&1 | sed 5q` in
*Sun\ C*) # Sun C 5.9
- whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+ whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
compiler_needs_object=yes
tmp_sharedflag='-G' ;;
*Sun\ F*) # Sun Fortran 8.3
tmp_sharedflag='-G' ;;
esac
- archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
- if test "x$supports_anon_versioning" = xyes; then
+ if test yes = "$supports_anon_versioning"; then
archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
- echo "local: *; };" >> $output_objdir/$libname.ver~
- $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
fi
case $cc_basename in
+ tcc*)
+ export_dynamic_flag_spec='-rdynamic'
+ ;;
xlf* | bgf* | bgxlf* | mpixlf*)
# IBM XL Fortran 10.1 on PPC cannot create shared libs itself
whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
- hardcode_libdir_flag_spec=
- hardcode_libdir_flag_spec_ld='-rpath $libdir'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
- if test "x$supports_anon_versioning" = xyes; then
+ if test yes = "$supports_anon_versioning"; then
archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
- cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
- echo "local: *; };" >> $output_objdir/$libname.ver~
- $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ echo "local: *; };" >> $output_objdir/$libname.ver~
+ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
fi
;;
esac
@@ -10759,8 +10680,8 @@ _LT_EOF
archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
wlarc=
else
- archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
fi
;;
@@ -10778,8 +10699,8 @@ _LT_EOF
_LT_EOF
elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
else
ld_shlibs=no
fi
@@ -10791,7 +10712,7 @@ _LT_EOF
ld_shlibs=no
cat <<_LT_EOF 1>&2
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
*** reliably create shared libraries on SCO systems. Therefore, libtool
*** is disabling shared libraries support. We urge you to upgrade GNU
*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
@@ -10806,9 +10727,9 @@ _LT_EOF
# DT_RUNPATH tag from executables and libraries. But doing so
# requires that you compile everything twice, which is a pain.
if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
else
ld_shlibs=no
fi
@@ -10825,15 +10746,15 @@ _LT_EOF
*)
if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
- archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
else
ld_shlibs=no
fi
;;
esac
- if test "$ld_shlibs" = no; then
+ if test no = "$ld_shlibs"; then
runpath_var=
hardcode_libdir_flag_spec=
export_dynamic_flag_spec=
@@ -10849,7 +10770,7 @@ _LT_EOF
# Note: this linker hardcodes the directories in LIBPATH if there
# are no directories specified by -L.
hardcode_minus_L=yes
- if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+ if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
# Neither direct hardcoding nor static linking is supported with a
# broken collect2.
hardcode_direct=unsupported
@@ -10857,34 +10778,57 @@ _LT_EOF
;;
aix[4-9]*)
- if test "$host_cpu" = ia64; then
+ if test ia64 = "$host_cpu"; then
# On IA64, the linker does run time linking by default, so we don't
# have to do anything special.
aix_use_runtimelinking=no
exp_sym_flag='-Bexport'
- no_entry_flag=""
+ no_entry_flag=
else
# If we're using GNU nm, then we don't want the "-C" option.
- # -C means demangle to AIX nm, but means don't demangle with GNU nm
- # Also, AIX nm treats weak defined symbols like other global
- # defined symbols, whereas GNU nm marks them as "W".
+ # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+ # Without the "-l" option, or with the "-B" option, AIX nm treats
+ # weak defined symbols like other global defined symbols, whereas
+ # GNU nm marks them as "W".
+ # While the 'weak' keyword is ignored in the Export File, we need
+ # it in the Import File for the 'aix-soname' feature, so we have
+ # to replace the "-B" option with "-P" for AIX nm.
if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
- export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+ export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
else
- export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+ export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
fi
aix_use_runtimelinking=no
# Test if we are trying to use run time linking or normal
# AIX style linking. If -brtl is somewhere in LDFLAGS, we
- # need to do runtime linking.
+ # have runtime linking enabled, and use it for executables.
+ # For shared libraries, we enable/disable runtime linking
+ # depending on the kind of the shared library created -
+ # when "with_aix_soname,aix_use_runtimelinking" is:
+ # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables
+ # "aix,yes" lib.so shared, rtl:yes, for executables
+ # lib.a static archive
+ # "both,no" lib.so.V(shr.o) shared, rtl:yes
+ # lib.a(lib.so.V) shared, rtl:no, for executables
+ # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a(lib.so.V) shared, rtl:no
+ # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables
+ # lib.a static archive
case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
for ld_flag in $LDFLAGS; do
- if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
aix_use_runtimelinking=yes
break
fi
done
+ if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+ # With aix-soname=svr4, we create the lib.so.V shared archives only,
+ # so we don't have lib.a shared libs to link our executables.
+ # We have to force runtime linking in this case.
+ aix_use_runtimelinking=yes
+ LDFLAGS="$LDFLAGS -Wl,-brtl"
+ fi
;;
esac
@@ -10903,13 +10847,21 @@ _LT_EOF
hardcode_direct_absolute=yes
hardcode_libdir_separator=':'
link_all_deplibs=yes
- file_list_spec='${wl}-f,'
+ file_list_spec='$wl-f,'
+ case $with_aix_soname,$aix_use_runtimelinking in
+ aix,*) ;; # traditional, no import file
+ svr4,* | *,yes) # use import file
+ # The Import File defines what to hardcode.
+ hardcode_direct=no
+ hardcode_direct_absolute=no
+ ;;
+ esac
- if test "$GCC" = yes; then
+ if test yes = "$GCC"; then
case $host_os in aix4.[012]|aix4.[012].*)
# We only want to do this on AIX 4.2 and lower, the check
# below for broken collect2 doesn't work under 4.3+
- collect2name=`${CC} -print-prog-name=collect2`
+ collect2name=`$CC -print-prog-name=collect2`
if test -f "$collect2name" &&
strings "$collect2name" | $GREP resolve_lib_name >/dev/null
then
@@ -10928,35 +10880,42 @@ _LT_EOF
;;
esac
shared_flag='-shared'
- if test "$aix_use_runtimelinking" = yes; then
- shared_flag="$shared_flag "'${wl}-G'
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag="$shared_flag "'$wl-G'
fi
+ # Need to ensure runtime linking is disabled for the traditional
+ # shared library, or the linker may eventually find shared libraries
+ # /with/ Import File - we do not want to mix them.
+ shared_flag_aix='-shared'
+ shared_flag_svr4='-shared $wl-G'
else
# not using gcc
- if test "$host_cpu" = ia64; then
+ if test ia64 = "$host_cpu"; then
# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
# chokes on -Wl,-G. The following line is correct:
shared_flag='-G'
else
- if test "$aix_use_runtimelinking" = yes; then
- shared_flag='${wl}-G'
+ if test yes = "$aix_use_runtimelinking"; then
+ shared_flag='$wl-G'
else
- shared_flag='${wl}-bM:SRE'
+ shared_flag='$wl-bM:SRE'
fi
+ shared_flag_aix='$wl-bM:SRE'
+ shared_flag_svr4='$wl-G'
fi
fi
- export_dynamic_flag_spec='${wl}-bexpall'
+ export_dynamic_flag_spec='$wl-bexpall'
# It seems that -bexpall does not export symbols beginning with
# underscore (_), so it is better to generate a list of symbols to export.
always_export_symbols=yes
- if test "$aix_use_runtimelinking" = yes; then
+ if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
# Warning - without using the other runtime loading flags (-brtl),
# -berok will link without error, but may produce a broken library.
allow_undefined_flag='-berok'
# Determine the default libpath from the value encoded in an
# empty executable.
- if test "${lt_cv_aix_libpath+set}" = set; then
+ if test set = "${lt_cv_aix_libpath+set}"; then
aix_libpath=$lt_cv_aix_libpath
else
if ${lt_cv_aix_libpath_+:} false; then :
@@ -10991,7 +10950,7 @@ fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
if test -z "$lt_cv_aix_libpath_"; then
- lt_cv_aix_libpath_="/usr/lib:/lib"
+ lt_cv_aix_libpath_=/usr/lib:/lib
fi
fi
@@ -10999,17 +10958,17 @@ fi
aix_libpath=$lt_cv_aix_libpath_
fi
- hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
- archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+ archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
else
- if test "$host_cpu" = ia64; then
- hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+ if test ia64 = "$host_cpu"; then
+ hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib'
allow_undefined_flag="-z nodefs"
- archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+ archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
else
# Determine the default libpath from the value encoded in an
# empty executable.
- if test "${lt_cv_aix_libpath+set}" = set; then
+ if test set = "${lt_cv_aix_libpath+set}"; then
aix_libpath=$lt_cv_aix_libpath
else
if ${lt_cv_aix_libpath_+:} false; then :
@@ -11044,7 +11003,7 @@ fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
if test -z "$lt_cv_aix_libpath_"; then
- lt_cv_aix_libpath_="/usr/lib:/lib"
+ lt_cv_aix_libpath_=/usr/lib:/lib
fi
fi
@@ -11052,21 +11011,33 @@ fi
aix_libpath=$lt_cv_aix_libpath_
fi
- hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+ hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
# Warning - without using the other run time loading flags,
# -berok will link without error, but may produce a broken library.
- no_undefined_flag=' ${wl}-bernotok'
- allow_undefined_flag=' ${wl}-berok'
- if test "$with_gnu_ld" = yes; then
+ no_undefined_flag=' $wl-bernotok'
+ allow_undefined_flag=' $wl-berok'
+ if test yes = "$with_gnu_ld"; then
# We only use this code for GNU lds that support --whole-archive.
- whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+ whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive'
else
# Exported symbols can be pulled into shared objects from archives
whole_archive_flag_spec='$convenience'
fi
archive_cmds_need_lc=yes
- # This is similar to how AIX traditionally builds its shared libraries.
- archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+ # -brtl affects multiple linker settings, -berok does not and is overridden later
+ compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+ if test svr4 != "$with_aix_soname"; then
+ # This is similar to how AIX traditionally builds its shared libraries.
+ archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+ fi
+ if test aix != "$with_aix_soname"; then
+ archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+ else
+ # used by -dlpreopen to get the symbols
+ archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir'
+ fi
+ archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d'
fi
fi
;;
@@ -11075,7 +11046,7 @@ fi
case $host_cpu in
powerpc)
# see comment about AmigaOS4 .so support
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
archive_expsym_cmds=''
;;
m68k)
@@ -11105,35 +11076,37 @@ fi
# Tell ltmain to make .lib files, not .a files.
libext=lib
# Tell ltmain to make .dll files, not .so files.
- shrext_cmds=".dll"
+ shrext_cmds=.dll
# FIXME: Setting linknames here is a bad hack.
- archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
- archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
- sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
- else
- sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
- fi~
- $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
- linknames='
+ archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+ archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then
+ cp "$export_symbols" "$output_objdir/$soname.def";
+ echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+ else
+ $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+ fi~
+ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+ linknames='
# The linker will not automatically build a static lib if we build a DLL.
# _LT_TAGVAR(old_archive_from_new_cmds, )='true'
enable_shared_with_static_runtimes=yes
+ exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
# Don't use ranlib
old_postinstall_cmds='chmod 644 $oldlib'
postlink_cmds='lt_outputfile="@OUTPUT@"~
- lt_tool_outputfile="@TOOL_OUTPUT@"~
- case $lt_outputfile in
- *.exe|*.EXE) ;;
- *)
- lt_outputfile="$lt_outputfile.exe"
- lt_tool_outputfile="$lt_tool_outputfile.exe"
- ;;
- esac~
- if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
- $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
- $RM "$lt_outputfile.manifest";
- fi'
+ lt_tool_outputfile="@TOOL_OUTPUT@"~
+ case $lt_outputfile in
+ *.exe|*.EXE) ;;
+ *)
+ lt_outputfile=$lt_outputfile.exe
+ lt_tool_outputfile=$lt_tool_outputfile.exe
+ ;;
+ esac~
+ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+ $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+ $RM "$lt_outputfile.manifest";
+ fi'
;;
*)
# Assume MSVC wrapper
@@ -11142,7 +11115,7 @@ fi
# Tell ltmain to make .lib files, not .a files.
libext=lib
# Tell ltmain to make .dll files, not .so files.
- shrext_cmds=".dll"
+ shrext_cmds=.dll
# FIXME: Setting linknames here is a bad hack.
archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
# The linker will automatically build a .lib file if we build a DLL.
@@ -11161,23 +11134,24 @@ fi
hardcode_direct=no
hardcode_automatic=yes
hardcode_shlibpath_var=unsupported
- if test "$lt_cv_ld_force_load" = "yes"; then
- whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+ if test yes = "$lt_cv_ld_force_load"; then
+ whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
else
whole_archive_flag_spec=''
fi
link_all_deplibs=yes
- allow_undefined_flag="$_lt_dar_allow_undefined"
+ allow_undefined_flag=$_lt_dar_allow_undefined
case $cc_basename in
- ifort*) _lt_dar_can_shared=yes ;;
+ ifort*|nagfor*) _lt_dar_can_shared=yes ;;
*) _lt_dar_can_shared=$GCC ;;
esac
- if test "$_lt_dar_can_shared" = "yes"; then
+ if test yes = "$_lt_dar_can_shared"; then
output_verbose_link_cmd=func_echo_all
- archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
- module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
- archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
- module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+ archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+ module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+ archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+ module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
else
ld_shlibs=no
@@ -11191,10 +11165,6 @@ fi
hardcode_shlibpath_var=no
;;
- freebsd1*)
- ld_shlibs=no
- ;;
-
# FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
# support. Future versions do this automatically, but an explicit c++rt0.o
# does not break anything, and helps significantly (at the cost of a little
@@ -11207,7 +11177,7 @@ fi
;;
# Unfortunately, older versions of FreeBSD 2 do not have this feature.
- freebsd2*)
+ freebsd2.*)
archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
hardcode_direct=yes
hardcode_minus_L=yes
@@ -11223,34 +11193,33 @@ fi
;;
hpux9*)
- if test "$GCC" = yes; then
- archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ if test yes = "$GCC"; then
+ archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
else
- archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
fi
- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_flag_spec='$wl+b $wl$libdir'
hardcode_libdir_separator=:
hardcode_direct=yes
# hardcode_minus_L: Not really in the search PATH,
# but as the default location of the library.
hardcode_minus_L=yes
- export_dynamic_flag_spec='${wl}-E'
+ export_dynamic_flag_spec='$wl-E'
;;
hpux10*)
- if test "$GCC" = yes && test "$with_gnu_ld" = no; then
- archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ if test yes,no = "$GCC,$with_gnu_ld"; then
+ archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
else
archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
fi
- if test "$with_gnu_ld" = no; then
- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
- hardcode_libdir_flag_spec_ld='+b $libdir'
+ if test no = "$with_gnu_ld"; then
+ hardcode_libdir_flag_spec='$wl+b $wl$libdir'
hardcode_libdir_separator=:
hardcode_direct=yes
hardcode_direct_absolute=yes
- export_dynamic_flag_spec='${wl}-E'
+ export_dynamic_flag_spec='$wl-E'
# hardcode_minus_L: Not really in the search PATH,
# but as the default location of the library.
hardcode_minus_L=yes
@@ -11258,25 +11227,25 @@ fi
;;
hpux11*)
- if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+ if test yes,no = "$GCC,$with_gnu_ld"; then
case $host_cpu in
hppa*64*)
- archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
;;
ia64*)
- archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
;;
*)
- archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
;;
esac
else
case $host_cpu in
hppa*64*)
- archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
;;
ia64*)
- archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
;;
*)
@@ -11288,7 +11257,7 @@ if ${lt_cv_prog_compiler__b+:} false; then :
$as_echo_n "(cached) " >&6
else
lt_cv_prog_compiler__b=no
- save_LDFLAGS="$LDFLAGS"
+ save_LDFLAGS=$LDFLAGS
LDFLAGS="$LDFLAGS -b"
echo "$lt_simple_link_test_code" > conftest.$ac_ext
if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
@@ -11307,14 +11276,14 @@ else
fi
fi
$RM -r conftest*
- LDFLAGS="$save_LDFLAGS"
+ LDFLAGS=$save_LDFLAGS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
$as_echo "$lt_cv_prog_compiler__b" >&6; }
-if test x"$lt_cv_prog_compiler__b" = xyes; then
- archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+if test yes = "$lt_cv_prog_compiler__b"; then
+ archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
else
archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
fi
@@ -11322,8 +11291,8 @@ fi
;;
esac
fi
- if test "$with_gnu_ld" = no; then
- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ if test no = "$with_gnu_ld"; then
+ hardcode_libdir_flag_spec='$wl+b $wl$libdir'
hardcode_libdir_separator=:
case $host_cpu in
@@ -11334,7 +11303,7 @@ fi
*)
hardcode_direct=yes
hardcode_direct_absolute=yes
- export_dynamic_flag_spec='${wl}-E'
+ export_dynamic_flag_spec='$wl-E'
# hardcode_minus_L: Not really in the search PATH,
# but as the default location of the library.
@@ -11345,8 +11314,8 @@ fi
;;
irix5* | irix6* | nonstopux*)
- if test "$GCC" = yes; then
- archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ if test yes = "$GCC"; then
+ archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
# Try to use the -exported_symbol ld option, if it does not
# work, assume that -exports_file does not work either and
# implicitly export all symbols.
@@ -11356,8 +11325,8 @@ $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >
if ${lt_cv_irix_exported_symbol+:} false; then :
$as_echo_n "(cached) " >&6
else
- save_LDFLAGS="$LDFLAGS"
- LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+ save_LDFLAGS=$LDFLAGS
+ LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int foo (void) { return 0; }
@@ -11369,24 +11338,34 @@ else
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
- LDFLAGS="$save_LDFLAGS"
+ LDFLAGS=$save_LDFLAGS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
$as_echo "$lt_cv_irix_exported_symbol" >&6; }
- if test "$lt_cv_irix_exported_symbol" = yes; then
- archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+ if test yes = "$lt_cv_irix_exported_symbol"; then
+ archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
fi
else
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
fi
archive_cmds_need_lc='no'
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
hardcode_libdir_separator=:
inherit_rpath=yes
link_all_deplibs=yes
;;
+ linux*)
+ case $cc_basename in
+ tcc*)
+ # Fabrice Bellard et al's Tiny C Compiler
+ ld_shlibs=yes
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+
netbsd*)
if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
@@ -11401,7 +11380,7 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
newsos6)
archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
hardcode_direct=yes
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
hardcode_libdir_separator=:
hardcode_shlibpath_var=no
;;
@@ -11409,27 +11388,19 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
*nto* | *qnx*)
;;
- openbsd*)
+ openbsd* | bitrig*)
if test -f /usr/libexec/ld.so; then
hardcode_direct=yes
hardcode_shlibpath_var=no
hardcode_direct_absolute=yes
- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
- archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
- hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
- export_dynamic_flag_spec='${wl}-E'
+ archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+ export_dynamic_flag_spec='$wl-E'
else
- case $host_os in
- openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
- hardcode_libdir_flag_spec='-R$libdir'
- ;;
- *)
- archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
- hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
- ;;
- esac
+ archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec='$wl-rpath,$libdir'
fi
else
ld_shlibs=no
@@ -11440,33 +11411,53 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
hardcode_libdir_flag_spec='-L$libdir'
hardcode_minus_L=yes
allow_undefined_flag=unsupported
- archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
- old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+ shrext_cmds=.dll
+ archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+ $ECHO EXPORTS >> $output_objdir/$libname.def~
+ prefix_cmds="$SED"~
+ if test EXPORTS = "`$SED 1q $export_symbols`"; then
+ prefix_cmds="$prefix_cmds -e 1d";
+ fi~
+ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+ emximp -o $lib $output_objdir/$libname.def'
+ old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+ enable_shared_with_static_runtimes=yes
;;
osf3*)
- if test "$GCC" = yes; then
- allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ if test yes = "$GCC"; then
+ allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
else
allow_undefined_flag=' -expect_unresolved \*'
- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
fi
archive_cmds_need_lc='no'
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
hardcode_libdir_separator=:
;;
osf4* | osf5*) # as osf3* with the addition of -msym flag
- if test "$GCC" = yes; then
- allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
- archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ if test yes = "$GCC"; then
+ allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+ archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+ hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
else
allow_undefined_flag=' -expect_unresolved \*'
- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+ archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
- $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
# Both c and cxx compiler support -rpath directly
hardcode_libdir_flag_spec='-rpath $libdir'
@@ -11477,24 +11468,24 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
solaris*)
no_undefined_flag=' -z defs'
- if test "$GCC" = yes; then
- wlarc='${wl}'
- archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ if test yes = "$GCC"; then
+ wlarc='$wl'
+ archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
else
case `$CC -V 2>&1` in
*"Compilers 5.0"*)
wlarc=''
- archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
;;
*)
- wlarc='${wl}'
- archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ wlarc='$wl'
+ archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
- $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
;;
esac
fi
@@ -11504,11 +11495,11 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
solaris2.[0-5] | solaris2.[0-5].*) ;;
*)
# The compiler driver will combine and reorder linker options,
- # but understands `-z linker_flag'. GCC discards it without `$wl',
+ # but understands '-z linker_flag'. GCC discards it without '$wl',
# but is careful enough not to reorder.
# Supported since Solaris 2.6 (maybe 2.5.1?)
- if test "$GCC" = yes; then
- whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+ if test yes = "$GCC"; then
+ whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
else
whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
fi
@@ -11518,10 +11509,10 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
;;
sunos4*)
- if test "x$host_vendor" = xsequent; then
+ if test sequent = "$host_vendor"; then
# Use $CC to link under sequent, because it throws in some extra .o
# files that make .init and .fini sections work.
- archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
else
archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
fi
@@ -11570,43 +11561,43 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
;;
sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
- no_undefined_flag='${wl}-z,text'
+ no_undefined_flag='$wl-z,text'
archive_cmds_need_lc=no
hardcode_shlibpath_var=no
runpath_var='LD_RUN_PATH'
- if test "$GCC" = yes; then
- archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ if test yes = "$GCC"; then
+ archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
else
- archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
fi
;;
sysv5* | sco3.2v5* | sco5v6*)
- # Note: We can NOT use -z defs as we might desire, because we do not
+ # Note: We CANNOT use -z defs as we might desire, because we do not
# link with -lc, and that would cause any symbols used from libc to
# always be unresolved, which means just about no library would
# ever link correctly. If we're not using GNU ld we use -z text
# though, which does catch some bad symbols but isn't as heavy-handed
# as -z defs.
- no_undefined_flag='${wl}-z,text'
- allow_undefined_flag='${wl}-z,nodefs'
+ no_undefined_flag='$wl-z,text'
+ allow_undefined_flag='$wl-z,nodefs'
archive_cmds_need_lc=no
hardcode_shlibpath_var=no
- hardcode_libdir_flag_spec='${wl}-R,$libdir'
+ hardcode_libdir_flag_spec='$wl-R,$libdir'
hardcode_libdir_separator=':'
link_all_deplibs=yes
- export_dynamic_flag_spec='${wl}-Bexport'
+ export_dynamic_flag_spec='$wl-Bexport'
runpath_var='LD_RUN_PATH'
- if test "$GCC" = yes; then
- archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ if test yes = "$GCC"; then
+ archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
else
- archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
- archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
fi
;;
@@ -11621,10 +11612,10 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
;;
esac
- if test x$host_vendor = xsni; then
+ if test sni = "$host_vendor"; then
case $host in
sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
- export_dynamic_flag_spec='${wl}-Blargedynsym'
+ export_dynamic_flag_spec='$wl-Blargedynsym'
;;
esac
fi
@@ -11632,7 +11623,7 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
$as_echo "$ld_shlibs" >&6; }
-test "$ld_shlibs" = no && can_build_shared=no
+test no = "$ld_shlibs" && can_build_shared=no
with_gnu_ld=$with_gnu_ld
@@ -11658,7 +11649,7 @@ x|xyes)
# Assume -lc should be added
archive_cmds_need_lc=yes
- if test "$enable_shared" = yes && test "$GCC" = yes; then
+ if test yes,yes = "$GCC,$enable_shared"; then
case $archive_cmds in
*'~'*)
# FIXME: we may have to deal with multi-command sequences.
@@ -11870,22 +11861,17 @@ esac
-
-
-
-
-
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
$as_echo_n "checking dynamic linker characteristics... " >&6; }
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
case $host_os in
- darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
- *) lt_awk_arg="/^libraries:/" ;;
+ darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+ *) lt_awk_arg='/^libraries:/' ;;
esac
case $host_os in
- mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
- *) lt_sed_strip_eq="s,=/,/,g" ;;
+ mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;;
+ *) lt_sed_strip_eq='s|=/|/|g' ;;
esac
lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
case $lt_search_path_spec in
@@ -11901,28 +11887,35 @@ if test "$GCC" = yes; then
;;
esac
# Ok, now we have the path, separated by spaces, we can step through it
- # and add multilib dir if necessary.
+ # and add multilib dir if necessary...
lt_tmp_lt_search_path_spec=
- lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+ lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+ # ...but if some path component already ends with the multilib dir we assume
+ # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+ case "$lt_multi_os_dir; $lt_search_path_spec " in
+ "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+ lt_multi_os_dir=
+ ;;
+ esac
for lt_sys_path in $lt_search_path_spec; do
- if test -d "$lt_sys_path/$lt_multi_os_dir"; then
- lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
- else
+ if test -d "$lt_sys_path$lt_multi_os_dir"; then
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+ elif test -n "$lt_multi_os_dir"; then
test -d "$lt_sys_path" && \
lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
fi
done
lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
- lt_foo="";
- lt_count=0;
+BEGIN {RS = " "; FS = "/|\n";} {
+ lt_foo = "";
+ lt_count = 0;
for (lt_i = NF; lt_i > 0; lt_i--) {
if ($lt_i != "" && $lt_i != ".") {
if ($lt_i == "..") {
lt_count++;
} else {
if (lt_count == 0) {
- lt_foo="/" $lt_i lt_foo;
+ lt_foo = "/" $lt_i lt_foo;
} else {
lt_count--;
}
@@ -11936,7 +11929,7 @@ BEGIN {RS=" "; FS="/|\n";} {
# for these hosts.
case $host_os in
mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
- $SED 's,/\([A-Za-z]:\),\1,g'` ;;
+ $SED 's|/\([A-Za-z]:\)|\1|g'` ;;
esac
sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
else
@@ -11945,7 +11938,7 @@ fi
library_names_spec=
libname_spec='lib$name'
soname_spec=
-shrext_cmds=".so"
+shrext_cmds=.so
postinstall_cmds=
postuninstall_cmds=
finish_cmds=
@@ -11962,56 +11955,108 @@ hardcode_into_libs=no
# flags to be left without arguments
need_version=unknown
+
+
case $host_os in
aix3*)
- version_type=linux
- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
shlibpath_var=LIBPATH
# AIX 3 has no versioning support, so we append a major version to the name.
- soname_spec='${libname}${release}${shared_ext}$major'
+ soname_spec='$libname$release$shared_ext$major'
;;
aix[4-9]*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
hardcode_into_libs=yes
- if test "$host_cpu" = ia64; then
+ if test ia64 = "$host_cpu"; then
# AIX 5 supports IA64
- library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+ library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
shlibpath_var=LD_LIBRARY_PATH
else
# With GCC up to 2.95.x, collect2 would create an import file
# for dependence libraries. The import file would start with
- # the line `#! .'. This would cause the generated library to
- # depend on `.', always an invalid library. This was fixed in
+ # the line '#! .'. This would cause the generated library to
+ # depend on '.', always an invalid library. This was fixed in
# development snapshots of GCC prior to 3.0.
case $host_os in
aix4 | aix4.[01] | aix4.[01].*)
if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
echo ' yes '
- echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+ echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
:
else
can_build_shared=no
fi
;;
esac
- # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+ # Using Import Files as archive members, it is possible to support
+ # filename-based versioning of shared library archives on AIX. While
+ # this would work for both with and without runtime linking, it will
+ # prevent static linking of such archives. So we do filename-based
+ # shared library versioning with .so extension only, which is used
+ # when both runtime linking and shared linking is enabled.
+ # Unfortunately, runtime linking may impact performance, so we do
+ # not want this to be the default eventually. Also, we use the
+ # versioned .so libs for executables only if there is the -brtl
+ # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+ # To allow for filename-based versioning support, we need to create
+ # libNAME.so.V as an archive file, containing:
+ # *) an Import File, referring to the versioned filename of the
+ # archive as well as the shared archive member, telling the
+ # bitwidth (32 or 64) of that shared object, and providing the
+ # list of exported symbols of that shared object, eventually
+ # decorated with the 'weak' keyword
+ # *) the shared object with the F_LOADONLY flag set, to really avoid
+ # it being seen by the linker.
+ # At run time we better use the real file rather than another symlink,
+ # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+ case $with_aix_soname,$aix_use_runtimelinking in
+ # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
# soname into executable. Probably we can add versioning support to
# collect2, so additional links can be useful in future.
- if test "$aix_use_runtimelinking" = yes; then
+ aix,yes) # traditional libtool
+ dynamic_linker='AIX unversionable lib.so'
# If using run time linking (on AIX 4.2 or later) use lib<name>.so
# instead of lib<name>.a to let people know that these are not
# typical AIX shared libraries.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- else
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ ;;
+ aix,no) # traditional AIX only
+ dynamic_linker='AIX lib.a(lib.so.V)'
# We preserve .a as extension for shared libraries through AIX4.2
# and later when we are not doing run time linking.
- library_names_spec='${libname}${release}.a $libname.a'
- soname_spec='${libname}${release}${shared_ext}$major'
- fi
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ ;;
+ svr4,*) # full svr4 only
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,yes) # both, prefer svr4
+ dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+ library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+ # unpreferred sharedlib libNAME.a needs extra handling
+ postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+ postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+ # We do not specify a path in Import Files, so LIBPATH fires.
+ shlibpath_overrides_runpath=yes
+ ;;
+ *,no) # both, prefer aix
+ dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+ library_names_spec='$libname$release.a $libname.a'
+ soname_spec='$libname$release$shared_ext$major'
+ # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+ postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+ postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+ ;;
+ esac
shlibpath_var=LIBPATH
fi
;;
@@ -12021,27 +12066,27 @@ amigaos*)
powerpc)
# Since July 2007 AmigaOS4 officially supports .so libraries.
# When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
;;
m68k)
library_names_spec='$libname.ixlibrary $libname.a'
# Create ${libname}_ixlibrary.a entries in /sys/libs.
- finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
;;
esac
;;
beos*)
- library_names_spec='${libname}${shared_ext}'
+ library_names_spec='$libname$shared_ext'
dynamic_linker="$host_os ld.so"
shlibpath_var=LIBRARY_PATH
;;
bsdi[45]*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
shlibpath_var=LD_LIBRARY_PATH
sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
@@ -12053,7 +12098,7 @@ bsdi[45]*)
cygwin* | mingw* | pw32* | cegcc*)
version_type=windows
- shrext_cmds=".dll"
+ shrext_cmds=.dll
need_version=no
need_lib_prefix=no
@@ -12062,8 +12107,8 @@ cygwin* | mingw* | pw32* | cegcc*)
# gcc
library_names_spec='$libname.dll.a'
# DLL is installed to $(libdir)/../bin by postinstall_cmds
- postinstall_cmds='base_file=`basename \${file}`~
- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
dldir=$destdir/`dirname \$dlpath`~
test -d \$dldir || mkdir -p \$dldir~
$install_prog $dir/$dlname \$dldir/$dlname~
@@ -12079,17 +12124,17 @@ cygwin* | mingw* | pw32* | cegcc*)
case $host_os in
cygwin*)
# Cygwin DLLs use 'cyg' prefix rather than 'lib'
- soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
;;
mingw* | cegcc*)
# MinGW DLLs use traditional 'lib' prefix
- soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
;;
pw32*)
# pw32 DLLs use 'pw' prefix rather than 'lib'
- library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
;;
esac
dynamic_linker='Win32 ld.exe'
@@ -12098,8 +12143,8 @@ cygwin* | mingw* | pw32* | cegcc*)
*,cl*)
# Native MSVC
libname_spec='$name'
- soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
- library_names_spec='${libname}.dll.lib'
+ soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+ library_names_spec='$libname.dll.lib'
case $build_os in
mingw*)
@@ -12126,7 +12171,7 @@ cygwin* | mingw* | pw32* | cegcc*)
sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
;;
*)
- sys_lib_search_path_spec="$LIB"
+ sys_lib_search_path_spec=$LIB
if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
# It is most probably a Windows format PATH.
sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
@@ -12139,8 +12184,8 @@ cygwin* | mingw* | pw32* | cegcc*)
esac
# DLL is installed to $(libdir)/../bin by postinstall_cmds
- postinstall_cmds='base_file=`basename \${file}`~
- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
dldir=$destdir/`dirname \$dlpath`~
test -d \$dldir || mkdir -p \$dldir~
$install_prog $dir/$dlname \$dldir/$dlname'
@@ -12153,7 +12198,7 @@ cygwin* | mingw* | pw32* | cegcc*)
*)
# Assume MSVC wrapper
- library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
dynamic_linker='Win32 ld.exe'
;;
esac
@@ -12166,8 +12211,8 @@ darwin* | rhapsody*)
version_type=darwin
need_lib_prefix=no
need_version=no
- library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
- soname_spec='${libname}${release}${major}$shared_ext'
+ library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$major$shared_ext'
shlibpath_overrides_runpath=yes
shlibpath_var=DYLD_LIBRARY_PATH
shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
@@ -12177,18 +12222,14 @@ darwin* | rhapsody*)
;;
dgux*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
- soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LD_LIBRARY_PATH
;;
-freebsd1*)
- dynamic_linker=no
- ;;
-
freebsd* | dragonfly*)
# DragonFly does not have aout. When/if they implement a new
# versioning mechanism, adjust this.
@@ -12196,25 +12237,26 @@ freebsd* | dragonfly*)
objformat=`/usr/bin/objformat`
else
case $host_os in
- freebsd[123]*) objformat=aout ;;
+ freebsd[23].*) objformat=aout ;;
*) objformat=elf ;;
esac
fi
version_type=freebsd-$objformat
case $version_type in
freebsd-elf*)
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
need_version=no
need_lib_prefix=no
;;
freebsd-*)
- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
need_version=yes
;;
esac
shlibpath_var=LD_LIBRARY_PATH
case $host_os in
- freebsd2*)
+ freebsd2.*)
shlibpath_overrides_runpath=yes
;;
freebsd3.[01]* | freebsdelf3.[01]*)
@@ -12233,25 +12275,15 @@ freebsd* | dragonfly*)
esac
;;
-gnu*)
- version_type=linux
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- shlibpath_var=LD_LIBRARY_PATH
- hardcode_into_libs=yes
- ;;
-
haiku*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
dynamic_linker="$host_os runtime_loader"
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LIBRARY_PATH
- shlibpath_overrides_runpath=yes
+ shlibpath_overrides_runpath=no
sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
hardcode_into_libs=yes
;;
@@ -12269,14 +12301,15 @@ hpux9* | hpux10* | hpux11*)
dynamic_linker="$host_os dld.so"
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
- if test "X$HPUX_IA64_MODE" = X32; then
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
+ if test 32 = "$HPUX_IA64_MODE"; then
sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux32
else
sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ sys_lib_dlsearch_path_spec=/usr/lib/hpux64
fi
- sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
;;
hppa*64*)
shrext_cmds='.sl'
@@ -12284,8 +12317,8 @@ hpux9* | hpux10* | hpux11*)
dynamic_linker="$host_os dld.sl"
shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
;;
@@ -12294,8 +12327,8 @@ hpux9* | hpux10* | hpux11*)
dynamic_linker="$host_os dld.sl"
shlibpath_var=SHLIB_PATH
shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
;;
esac
# HP-UX runs *really* slowly unless shared libraries are mode 555, ...
@@ -12305,11 +12338,11 @@ hpux9* | hpux10* | hpux11*)
;;
interix[3-9]*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
@@ -12320,16 +12353,16 @@ irix5* | irix6* | nonstopux*)
case $host_os in
nonstopux*) version_type=nonstopux ;;
*)
- if test "$lt_cv_prog_gnu_ld" = yes; then
- version_type=linux
+ if test yes = "$lt_cv_prog_gnu_ld"; then
+ version_type=linux # correct to gnu/linux during the next big refactor
else
version_type=irix
fi ;;
esac
need_lib_prefix=no
need_version=no
- soname_spec='${libname}${release}${shared_ext}$major'
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
case $host_os in
irix5* | nonstopux*)
libsuff= shlibsuff=
@@ -12348,8 +12381,8 @@ irix5* | irix6* | nonstopux*)
esac
shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
shlibpath_overrides_runpath=no
- sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
- sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+ sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+ sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
hardcode_into_libs=yes
;;
@@ -12358,13 +12391,33 @@ linux*oldld* | linux*aout* | linux*coff*)
dynamic_linker=no
;;
-# This must be Linux ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
- version_type=linux
+linux*android*)
+ version_type=none # Android doesn't support versioned libraries.
need_lib_prefix=no
need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='$libname$release$shared_ext'
+ soname_spec='$libname$release$shared_ext'
+ finish_cmds=
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ dynamic_linker='Android linker'
+ # Don't embed -rpath directories since the linker doesn't support them.
+ hardcode_libdir_flag_spec='-L$libdir'
+ ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+ version_type=linux # correct to gnu/linux during the next big refactor
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
@@ -12408,7 +12461,12 @@ fi
# before this can be enabled.
hardcode_into_libs=yes
- # Append ld.so.conf contents to the search path
+ # Ideally, we could use ldconfig to report *all* directores which are
+ # searched for libraries, however this is still not possible. Aside from not
+ # being certain /sbin/ldconfig is available, command
+ # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+ # even though it is searched at run-time. Try to do the best guess by
+ # appending ld.so.conf contents (and includes) to the search path.
if test -f /etc/ld.so.conf; then
lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
@@ -12428,12 +12486,12 @@ netbsd*)
need_lib_prefix=no
need_version=no
if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
dynamic_linker='NetBSD (a.out) ld.so'
else
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
dynamic_linker='NetBSD ld.elf_so'
fi
shlibpath_var=LD_LIBRARY_PATH
@@ -12442,8 +12500,8 @@ netbsd*)
;;
newsos6)
- version_type=linux
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
;;
@@ -12452,58 +12510,68 @@ newsos6)
version_type=qnx
need_lib_prefix=no
need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
hardcode_into_libs=yes
dynamic_linker='ldqnx.so'
;;
-openbsd*)
+openbsd* | bitrig*)
version_type=sunos
- sys_lib_dlsearch_path_spec="/usr/lib"
+ sys_lib_dlsearch_path_spec=/usr/lib
need_lib_prefix=no
- # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
- case $host_os in
- openbsd3.3 | openbsd3.3.*) need_version=yes ;;
- *) need_version=no ;;
- esac
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- case $host_os in
- openbsd2.[89] | openbsd2.[89].*)
- shlibpath_overrides_runpath=no
- ;;
- *)
- shlibpath_overrides_runpath=yes
- ;;
- esac
+ if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+ need_version=no
else
- shlibpath_overrides_runpath=yes
+ need_version=yes
fi
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
;;
os2*)
libname_spec='$name'
- shrext_cmds=".dll"
+ version_type=windows
+ shrext_cmds=.dll
+ need_version=no
need_lib_prefix=no
- library_names_spec='$libname${shared_ext} $libname.a'
+ # OS/2 can only load a DLL with a base name of 8 characters or less.
+ soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+ v=$($ECHO $release$versuffix | tr -d .-);
+ n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+ $ECHO $n$v`$shared_ext'
+ library_names_spec='${libname}_dll.$libext'
dynamic_linker='OS/2 ld.exe'
- shlibpath_var=LIBPATH
+ shlibpath_var=BEGINLIBPATH
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ postinstall_cmds='base_file=`basename \$file`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname~
+ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+ eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+ fi'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $RM \$dlpath'
;;
osf3* | osf4* | osf5*)
version_type=osf
need_lib_prefix=no
need_version=no
- soname_spec='${libname}${release}${shared_ext}$major'
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='$libname$release$shared_ext$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
shlibpath_var=LD_LIBRARY_PATH
sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
- sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
;;
rdos*)
@@ -12511,11 +12579,11 @@ rdos*)
;;
solaris*)
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
hardcode_into_libs=yes
@@ -12525,20 +12593,20 @@ solaris*)
sunos4*)
version_type=sunos
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
- if test "$with_gnu_ld" = yes; then
+ if test yes = "$with_gnu_ld"; then
need_lib_prefix=no
fi
need_version=yes
;;
sysv4 | sysv4.3*)
- version_type=linux
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LD_LIBRARY_PATH
case $host_vendor in
sni)
@@ -12559,24 +12627,24 @@ sysv4 | sysv4.3*)
;;
sysv4*MP*)
- if test -d /usr/nec ;then
- version_type=linux
- library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
- soname_spec='$libname${shared_ext}.$major'
+ if test -d /usr/nec; then
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+ soname_spec='$libname$shared_ext.$major'
shlibpath_var=LD_LIBRARY_PATH
fi
;;
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
- version_type=freebsd-elf
+ version_type=sco
need_lib_prefix=no
need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=yes
hardcode_into_libs=yes
- if test "$with_gnu_ld" = yes; then
+ if test yes = "$with_gnu_ld"; then
sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
else
sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
@@ -12591,19 +12659,19 @@ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
tpf*)
# TPF is a cross-target only. Preferred cross-host = GNU/Linux.
- version_type=linux
+ version_type=linux # correct to gnu/linux during the next big refactor
need_lib_prefix=no
need_version=no
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
shlibpath_var=LD_LIBRARY_PATH
shlibpath_overrides_runpath=no
hardcode_into_libs=yes
;;
uts4*)
- version_type=linux
- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
- soname_spec='${libname}${release}${shared_ext}$major'
+ version_type=linux # correct to gnu/linux during the next big refactor
+ library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+ soname_spec='$libname$release$shared_ext$major'
shlibpath_var=LD_LIBRARY_PATH
;;
@@ -12613,20 +12681,35 @@ uts4*)
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
$as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
+test no = "$dynamic_linker" && can_build_shared=no
variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
fi
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
- sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+ sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
- sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+ sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
fi
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
@@ -12723,15 +12806,15 @@ $as_echo_n "checking how to hardcode library paths into programs... " >&6; }
hardcode_action=
if test -n "$hardcode_libdir_flag_spec" ||
test -n "$runpath_var" ||
- test "X$hardcode_automatic" = "Xyes" ; then
+ test yes = "$hardcode_automatic"; then
# We can hardcode non-existent directories.
- if test "$hardcode_direct" != no &&
+ if test no != "$hardcode_direct" &&
# If the only mechanism to avoid hardcoding is shlibpath_var, we
# have to relink, otherwise we might link with an installed library
# when we should be linking with a yet-to-be-installed one
- ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
- test "$hardcode_minus_L" != no; then
+ ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" &&
+ test no != "$hardcode_minus_L"; then
# Linking always hardcodes the temporary library directory.
hardcode_action=relink
else
@@ -12746,12 +12829,12 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
$as_echo "$hardcode_action" >&6; }
-if test "$hardcode_action" = relink ||
- test "$inherit_rpath" = yes; then
+if test relink = "$hardcode_action" ||
+ test yes = "$inherit_rpath"; then
# Fast installation is not supported
enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
- test "$enable_shared" = no; then
+elif test yes = "$shlibpath_overrides_runpath" ||
+ test no = "$enable_shared"; then
# Fast installation is not necessary
enable_fast_install=needless
fi
@@ -12761,7 +12844,7 @@ fi
- if test "x$enable_dlopen" != xyes; then
+ if test yes != "$enable_dlopen"; then
enable_dlopen=unknown
enable_dlopen_self=unknown
enable_dlopen_self_static=unknown
@@ -12771,23 +12854,23 @@ else
case $host_os in
beos*)
- lt_cv_dlopen="load_add_on"
+ lt_cv_dlopen=load_add_on
lt_cv_dlopen_libs=
lt_cv_dlopen_self=yes
;;
mingw* | pw32* | cegcc*)
- lt_cv_dlopen="LoadLibrary"
+ lt_cv_dlopen=LoadLibrary
lt_cv_dlopen_libs=
;;
cygwin*)
- lt_cv_dlopen="dlopen"
+ lt_cv_dlopen=dlopen
lt_cv_dlopen_libs=
;;
darwin*)
- # if libdl is installed we need to link against it
+ # if libdl is installed we need to link against it
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
$as_echo_n "checking for dlopen in -ldl... " >&6; }
if ${ac_cv_lib_dl_dlopen+:} false; then :
@@ -12825,10 +12908,10 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
- lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+ lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
else
- lt_cv_dlopen="dyld"
+ lt_cv_dlopen=dyld
lt_cv_dlopen_libs=
lt_cv_dlopen_self=yes
@@ -12836,10 +12919,18 @@ fi
;;
+ tpf*)
+ # Don't try to run any link tests for TPF. We know it's impossible
+ # because TPF is a cross-compiler, and we know how we open DSOs.
+ lt_cv_dlopen=dlopen
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=no
+ ;;
+
*)
ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
if test "x$ac_cv_func_shl_load" = xyes; then :
- lt_cv_dlopen="shl_load"
+ lt_cv_dlopen=shl_load
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
$as_echo_n "checking for shl_load in -ldld... " >&6; }
@@ -12878,11 +12969,11 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
- lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+ lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld
else
ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
if test "x$ac_cv_func_dlopen" = xyes; then :
- lt_cv_dlopen="dlopen"
+ lt_cv_dlopen=dlopen
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
$as_echo_n "checking for dlopen in -ldl... " >&6; }
@@ -12921,7 +13012,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
- lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+ lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
$as_echo_n "checking for dlopen in -lsvld... " >&6; }
@@ -12960,7 +13051,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
- lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+ lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
$as_echo_n "checking for dld_link in -ldld... " >&6; }
@@ -12999,7 +13090,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
- lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+ lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld
fi
@@ -13020,21 +13111,21 @@ fi
;;
esac
- if test "x$lt_cv_dlopen" != xno; then
- enable_dlopen=yes
- else
+ if test no = "$lt_cv_dlopen"; then
enable_dlopen=no
+ else
+ enable_dlopen=yes
fi
case $lt_cv_dlopen in
dlopen)
- save_CPPFLAGS="$CPPFLAGS"
- test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+ save_CPPFLAGS=$CPPFLAGS
+ test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
- save_LDFLAGS="$LDFLAGS"
+ save_LDFLAGS=$LDFLAGS
wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
- save_LIBS="$LIBS"
+ save_LIBS=$LIBS
LIBS="$lt_cv_dlopen_libs $LIBS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
@@ -13042,7 +13133,7 @@ $as_echo_n "checking whether a program can dlopen itself... " >&6; }
if ${lt_cv_dlopen_self+:} false; then :
$as_echo_n "(cached) " >&6
else
- if test "$cross_compiling" = yes; then :
+ if test yes = "$cross_compiling"; then :
lt_cv_dlopen_self=cross
else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
@@ -13089,9 +13180,9 @@ else
# endif
#endif
-/* When -fvisbility=hidden is used, assume the code has been annotated
+/* When -fvisibility=hidden is used, assume the code has been annotated
correspondingly for the symbols needed. */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
int fnord () __attribute__((visibility("default")));
#endif
@@ -13121,7 +13212,7 @@ _LT_EOF
(eval $ac_link) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+ test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
(./conftest; exit; ) >&5 2>/dev/null
lt_status=$?
case x$lt_status in
@@ -13141,14 +13232,14 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
$as_echo "$lt_cv_dlopen_self" >&6; }
- if test "x$lt_cv_dlopen_self" = xyes; then
+ if test yes = "$lt_cv_dlopen_self"; then
wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
if ${lt_cv_dlopen_self_static+:} false; then :
$as_echo_n "(cached) " >&6
else
- if test "$cross_compiling" = yes; then :
+ if test yes = "$cross_compiling"; then :
lt_cv_dlopen_self_static=cross
else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
@@ -13195,9 +13286,9 @@ else
# endif
#endif
-/* When -fvisbility=hidden is used, assume the code has been annotated
+/* When -fvisibility=hidden is used, assume the code has been annotated
correspondingly for the symbols needed. */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
int fnord () __attribute__((visibility("default")));
#endif
@@ -13227,7 +13318,7 @@ _LT_EOF
(eval $ac_link) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+ test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
(./conftest; exit; ) >&5 2>/dev/null
lt_status=$?
case x$lt_status in
@@ -13248,9 +13339,9 @@ fi
$as_echo "$lt_cv_dlopen_self_static" >&6; }
fi
- CPPFLAGS="$save_CPPFLAGS"
- LDFLAGS="$save_LDFLAGS"
- LIBS="$save_LIBS"
+ CPPFLAGS=$save_CPPFLAGS
+ LDFLAGS=$save_LDFLAGS
+ LIBS=$save_LIBS
;;
esac
@@ -13294,7 +13385,7 @@ else
# FIXME - insert some real tests, host_os isn't really good enough
case $host_os in
darwin*)
- if test -n "$STRIP" ; then
+ if test -n "$STRIP"; then
striplib="$STRIP -x"
old_striplib="$STRIP -S"
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
@@ -13322,7 +13413,7 @@ fi
- # Report which library types will actually be built
+ # Report what library types will actually be built
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
$as_echo_n "checking if libtool supports shared libraries... " >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
@@ -13330,13 +13421,13 @@ $as_echo "$can_build_shared" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
$as_echo_n "checking whether to build shared libraries... " >&6; }
- test "$can_build_shared" = "no" && enable_shared=no
+ test no = "$can_build_shared" && enable_shared=no
# On AIX, shared libraries and static libraries use the same namespace, and
# are all built from PIC.
case $host_os in
aix3*)
- test "$enable_shared" = yes && enable_static=no
+ test yes = "$enable_shared" && enable_static=no
if test -n "$RANLIB"; then
archive_cmds="$archive_cmds~\$RANLIB \$lib"
postinstall_cmds='$RANLIB $lib'
@@ -13344,8 +13435,12 @@ $as_echo_n "checking whether to build shared libraries... " >&6; }
;;
aix[4-9]*)
- if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
- test "$enable_shared" = yes && enable_static=no
+ if test ia64 != "$host_cpu"; then
+ case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+ yes,aix,yes) ;; # shared object as lib.so file only
+ yes,svr4,*) ;; # shared object as lib.so archive member only
+ yes,*) enable_static=no ;; # shared object in lib.a archive as well
+ esac
fi
;;
esac
@@ -13355,7 +13450,7 @@ $as_echo "$enable_shared" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
$as_echo_n "checking whether to build static libraries... " >&6; }
# Make sure either enable_shared or enable_static is yes.
- test "$enable_shared" = yes || enable_static=yes
+ test yes = "$enable_shared" || enable_static=yes
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
$as_echo "$enable_static" >&6; }
@@ -13369,7 +13464,9 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
-CC="$lt_save_CC"
+CC=$lt_save_CC
+
+
@@ -13414,9 +13511,9 @@ cat >>confdefs.h <<_ACEOF
#define DEFAULT_MAX_MEM ${DEFAULTMAXMEM}
_ACEOF
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for 'tmpfile()'" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 'tmpfile()'" >&5
$as_echo_n "checking for 'tmpfile()'... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdio.h>
int
@@ -13430,19 +13527,20 @@ _ACEOF
if ac_fn_c_try_link "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
-MEMORYMGR='jmemansi'
+ MEMORYMGR='jmemansi'
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
-MEMORYMGR='jmemname'
+ MEMORYMGR='jmemname'
-# Test for the need to remove temporary files using a signal handler (for cjpeg/djpeg)
+ # Test for the need to remove temporary files using a signal handler
+ # (for cjpeg/djpeg)
$as_echo "#define NEED_SIGNAL_CATCHER 1" >>confdefs.h
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for 'mktemp()'" >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 'mktemp()'" >&5
$as_echo_n "checking for 'mktemp()'... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
@@ -13474,13 +13572,13 @@ fi
# Extract the library version IDs from jpeglib.h.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking libjpeg version number" >&5
$as_echo_n "checking libjpeg version number... " >&6; }
-JPEG_LIB_VERSION_MAJOR=`sed -e '/^#define JPEG_LIB_VERSION_MAJOR/!d' -e 's/^[^0-9]*\([0-9][0-9]*\).*$/\1/' $srcdir/jpeglib.h`
-JPEG_LIB_VERSION_MINOR=`sed -e '/^#define JPEG_LIB_VERSION_MINOR/!d' -e 's/^[^0-9]*\([0-9][0-9]*\).*$/\1/' $srcdir/jpeglib.h`
-JPEG_LIB_VERSION="`expr $JPEG_LIB_VERSION_MAJOR + $JPEG_LIB_VERSION_MINOR`:0:$JPEG_LIB_VERSION_MINOR"
+major=`sed -ne 's/^#define JPEG_LIB_VERSION_MAJOR *\([0-9][0-9]*\).*$/\1/p' $srcdir/jpeglib.h`
+minor=`sed -ne 's/^#define JPEG_LIB_VERSION_MINOR *\([0-9][0-9]*\).*$/\1/p' $srcdir/jpeglib.h`
+JPEG_LIB_VERSION=`expr $major + $minor`:0:$minor
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $JPEG_LIB_VERSION" >&5
$as_echo "$JPEG_LIB_VERSION" >&6; }
-
ac_config_files="$ac_config_files Makefile"
cat >confcache <<\_ACEOF
@@ -13577,6 +13675,7 @@ DEFS=-DHAVE_CONFIG_H
ac_libobjs=
ac_ltlibobjs=
+U=
for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
# 1. Remove the extension, and $U if already installed.
ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
@@ -13591,6 +13690,14 @@ LIBOBJS=$ac_libobjs
LTLIBOBJS=$ac_ltlibobjs
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+$as_echo_n "checking that generated files are newer than configure... " >&6; }
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
+$as_echo "done" >&6; }
if test -n "$EXEEXT"; then
am__EXEEXT_TRUE=
am__EXEEXT_FALSE='#'
@@ -13599,18 +13706,14 @@ else
am__EXEEXT_FALSE=
fi
-if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
- as_fn_error $? "conditional \"AMDEP\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
- as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -13917,16 +14020,16 @@ if (echo >conf$$.file) 2>/dev/null; then
# ... but there are two gotchas:
# 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
# 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
- # In both cases, we have to default to `cp -p'.
+ # In both cases, we have to default to `cp -pR'.
ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
- as_ln_s='cp -p'
+ as_ln_s='cp -pR'
elif ln conf$$.file conf$$ 2>/dev/null; then
as_ln_s=ln
else
- as_ln_s='cp -p'
+ as_ln_s='cp -pR'
fi
else
- as_ln_s='cp -p'
+ as_ln_s='cp -pR'
fi
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
rmdir conf$$.dir 2>/dev/null
@@ -13986,28 +14089,16 @@ else
as_mkdir_p=false
fi
-if test -x / >/dev/null 2>&1; then
- as_test_x='test -x'
-else
- if ls -dL / >/dev/null 2>&1; then
- as_ls_L_option=L
- else
- as_ls_L_option=
- fi
- as_test_x='
- eval sh -c '\''
- if test -d "$1"; then
- test -d "$1/.";
- else
- case $1 in #(
- -*)set "./$1";;
- esac;
- case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
- ???[sx]*):;;*)false;;esac;fi
- '\'' sh
- '
-fi
-as_executable_p=$as_test_x
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
# Sed expression to map a string onto a valid CPP name.
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -14028,8 +14119,8 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by libjpeg $as_me 8.3.0, which was
-generated by GNU Autoconf 2.68. Invocation command line was
+This file was extended by libjpeg $as_me 9.2.0, which was
+generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
CONFIG_HEADERS = $CONFIG_HEADERS
@@ -14094,11 +14185,11 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-libjpeg config.status 8.3.0
-configured by $0, generated by GNU Autoconf 2.68,
+libjpeg config.status 9.2.0
+configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
-Copyright (C) 2010 Free Software Foundation, Inc.
+Copyright (C) 2012 Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."
@@ -14189,7 +14280,7 @@ fi
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
if \$ac_cs_recheck; then
- set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
shift
\$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
CONFIG_SHELL='$SHELL'
@@ -14232,8 +14323,10 @@ enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`'
SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
@@ -14278,10 +14371,13 @@ compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`'
lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`'
nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`'
objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
@@ -14314,7 +14410,6 @@ with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
-hardcode_libdir_flag_spec_ld='`$ECHO "$hardcode_libdir_flag_spec_ld" | $SED "$delay_single_quote_subst"`'
hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
@@ -14347,7 +14442,8 @@ finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
-sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
+configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
+configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`'
hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
@@ -14373,6 +14469,7 @@ DLLTOOL \
OBJDUMP \
SHELL \
ECHO \
+PATH_SEPARATOR \
SED \
GREP \
EGREP \
@@ -14398,9 +14495,12 @@ CFLAGS \
compiler \
lt_cv_sys_global_symbol_pipe \
lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_import \
lt_cv_sys_global_symbol_to_c_name_address \
lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_cv_nm_interface \
nm_file_list_spec \
+lt_cv_truncate_bin \
lt_prog_compiler_no_builtin_flag \
lt_prog_compiler_pic \
lt_prog_compiler_wl \
@@ -14421,7 +14521,6 @@ with_gnu_ld \
allow_undefined_flag \
no_undefined_flag \
hardcode_libdir_flag_spec \
-hardcode_libdir_flag_spec_ld \
hardcode_libdir_separator \
exclude_expsyms \
include_expsyms \
@@ -14436,7 +14535,7 @@ old_striplib \
striplib; do
case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
*[\\\\\\\`\\"\\\$]*)
- eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
;;
*)
eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -14463,10 +14562,11 @@ postinstall_cmds \
postuninstall_cmds \
finish_cmds \
sys_lib_search_path_spec \
-sys_lib_dlsearch_path_spec; do
+configure_time_dlsearch_path \
+configure_time_lt_sys_library_path; do
case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
*[\\\\\\\`\\"\\\$]*)
- eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
;;
*)
eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -14475,19 +14575,16 @@ sys_lib_dlsearch_path_spec; do
done
ac_aux_dir='$ac_aux_dir'
-xsi_shell='$xsi_shell'
-lt_shell_append='$lt_shell_append'
-# See if we are running on zsh, and set the options which allow our
+# See if we are running on zsh, and set the options that allow our
# commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
+if test -n "\${ZSH_VERSION+set}"; then
setopt NO_GLOB_SUBST
fi
PACKAGE='$PACKAGE'
VERSION='$VERSION'
- TIMESTAMP='$TIMESTAMP'
RM='$RM'
ofile='$ofile'
@@ -15102,7 +15199,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;}
case $ac_file$ac_mode in
"depfiles":C) test x"$AMDEP_TRUE" != x"" || {
- # Autoconf 2.62 quotes --file arguments for eval, but not when files
+ # Older Autoconf quotes --file arguments for eval, but not when files
# are listed without --file. Let's play safe and only enable the eval
# if we detect the quoting.
case $CONFIG_FILES in
@@ -15115,7 +15212,7 @@ $as_echo "$as_me: executing $ac_file commands" >&6;}
# Strip MF so we end up with the name of the file.
mf=`echo "$mf" | sed -e 's/:.*$//'`
# Check whether this is an Automake generated Makefile or not.
- # We used to match only the files named `Makefile.in', but
+ # We used to match only the files named 'Makefile.in', but
# some people rename them; so instead we look at the file content.
# Grep'ing the first line is not enough: some people post-process
# each Makefile.in and add a new line on top of each file to say so.
@@ -15149,21 +15246,19 @@ $as_echo X"$mf" |
continue
fi
# Extract the definition of DEPDIR, am__include, and am__quote
- # from the Makefile without running `make'.
+ # from the Makefile without running 'make'.
DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
test -z "$DEPDIR" && continue
am__include=`sed -n 's/^am__include = //p' < "$mf"`
- test -z "am__include" && continue
+ test -z "$am__include" && continue
am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
- # When using ansi2knr, U may be empty or an underscore; expand it
- U=`sed -n 's/^U = //p' < "$mf"`
# Find all dependency output files, they are included files with
# $(DEPDIR) in their names. We invoke sed twice because it is the
# simplest approach to changing $(DEPDIR) to its actual value in the
# expansion.
for file in `sed -n "
s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
- sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
# Make sure the directory exists.
test -f "$dirpart/$file" && continue
fdir=`$as_dirname -- "$file" ||
@@ -15198,55 +15293,53 @@ $as_echo X"$file" |
;;
"libtool":C)
- # See if we are running on zsh, and set the options which allow our
+ # See if we are running on zsh, and set the options that allow our
# commands through without removal of \ escapes.
- if test -n "${ZSH_VERSION+set}" ; then
+ if test -n "${ZSH_VERSION+set}"; then
setopt NO_GLOB_SUBST
fi
- cfgfile="${ofile}T"
+ cfgfile=${ofile}T
trap "$RM \"$cfgfile\"; exit 1" 1 2 15
$RM "$cfgfile"
cat <<_LT_EOF >> "$cfgfile"
#! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Generated automatically by $as_me ($PACKAGE) $VERSION
# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions. There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
#
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-# 2006, 2007, 2008, 2009, 2010 Free Software Foundation,
-# Inc.
-# Written by Gordon Matzigkeit, 1996
-#
-# This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the same
+# distribution terms that you use for the rest of that program.
#
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING. If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
# The names of the tagged configurations supported by this script.
-available_tags=""
+available_tags=''
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
# ### BEGIN LIBTOOL CONFIG
@@ -15275,12 +15368,18 @@ pic_mode=$pic_mode
# Whether or not to optimize for fast installation.
fast_install=$enable_fast_install
+# Shared archive member basename,for filename based shared library versioning on AIX.
+shared_archive_member_spec=$shared_archive_member_spec
+
# Shell to use when invoking shell scripts.
SHELL=$lt_SHELL
# An echo program that protects backslashes.
ECHO=$lt_ECHO
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
# The host system.
host_alias=$host_alias
host=$host
@@ -15383,18 +15482,27 @@ global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
# Transform the output of nm in a proper C declaration.
global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+# Transform the output of nm into a list of symbols to manually relocate.
+global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import
+
# Transform the output of nm in a C name address pair.
global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
# Transform the output of nm in a C name address pair when lib prefix is needed.
global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+# The name lister interface.
+nm_interface=$lt_lt_cv_nm_interface
+
# Specify filename containing input files for \$NM.
nm_file_list_spec=$lt_nm_file_list_spec
-# The root where to search for dependent libraries,and in which our libraries should be installed.
+# The root where to search for dependent libraries,and where our libraries should be installed.
lt_sysroot=$lt_sysroot
+# Command to truncate a binary pipe.
+lt_truncate_bin=$lt_lt_cv_truncate_bin
+
# The name of the directory that contains temporary libtool files.
objdir=$objdir
@@ -15485,8 +15593,11 @@ hardcode_into_libs=$hardcode_into_libs
# Compile-time system search path for libraries.
sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
-# Run-time system search path for libraries.
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+# Detected run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
+
+# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
+configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
# Whether dlopen is supported.
dlopen_support=$enable_dlopen
@@ -15576,20 +15687,16 @@ no_undefined_flag=$lt_no_undefined_flag
# This must work even if \$libdir does not exist
hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
-# If ld is used when linking, flag to hardcode \$libdir into a binary
-# during linking. This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
-
# Whether we need a single "-rpath" flag with a separated argument.
hardcode_libdir_separator=$lt_hardcode_libdir_separator
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
# DIR into the resulting binary.
hardcode_direct=$hardcode_direct
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
# DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
# library is relocated.
hardcode_direct_absolute=$hardcode_direct_absolute
@@ -15641,13 +15748,72 @@ hardcode_action=$hardcode_action
_LT_EOF
+ cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+# string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+# string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+# string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+# "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+# VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+ case x$2 in
+ x)
+ ;;
+ *:)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+ ;;
+ x:*)
+ eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ *::*)
+ eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+ eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+ ;;
+ *)
+ eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+ ;;
+ esac
+}
+
+
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+ for cc_temp in $*""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+ done
+ func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
case $host_os in
aix3*)
cat <<\_LT_EOF >> "$cfgfile"
# AIX sometimes has problems with the GCC collect2 program. For some
# reason, if we set the COLLECT_NAMES environment variable, the problems
# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
+if test set != "${COLLECT_NAMES+set}"; then
COLLECT_NAMES=
export COLLECT_NAMES
fi
@@ -15656,7 +15822,7 @@ _LT_EOF
esac
-ltmain="$ac_aux_dir/ltmain.sh"
+ltmain=$ac_aux_dir/ltmain.sh
# We use sed instead of cat because bash on DJGPP gets confused if
@@ -15666,165 +15832,6 @@ ltmain="$ac_aux_dir/ltmain.sh"
sed '$q' "$ltmain" >> "$cfgfile" \
|| (rm -f "$cfgfile"; exit 1)
- if test x"$xsi_shell" = xyes; then
- sed -e '/^func_dirname ()$/,/^} # func_dirname /c\
-func_dirname ()\
-{\
-\ case ${1} in\
-\ */*) func_dirname_result="${1%/*}${2}" ;;\
-\ * ) func_dirname_result="${3}" ;;\
-\ esac\
-} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_basename ()$/,/^} # func_basename /c\
-func_basename ()\
-{\
-\ func_basename_result="${1##*/}"\
-} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\
-func_dirname_and_basename ()\
-{\
-\ case ${1} in\
-\ */*) func_dirname_result="${1%/*}${2}" ;;\
-\ * ) func_dirname_result="${3}" ;;\
-\ esac\
-\ func_basename_result="${1##*/}"\
-} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_stripname ()$/,/^} # func_stripname /c\
-func_stripname ()\
-{\
-\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\
-\ # positional parameters, so assign one to ordinary parameter first.\
-\ func_stripname_result=${3}\
-\ func_stripname_result=${func_stripname_result#"${1}"}\
-\ func_stripname_result=${func_stripname_result%"${2}"}\
-} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\
-func_split_long_opt ()\
-{\
-\ func_split_long_opt_name=${1%%=*}\
-\ func_split_long_opt_arg=${1#*=}\
-} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\
-func_split_short_opt ()\
-{\
-\ func_split_short_opt_arg=${1#??}\
-\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\
-} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\
-func_lo2o ()\
-{\
-\ case ${1} in\
-\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\
-\ *) func_lo2o_result=${1} ;;\
-\ esac\
-} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_xform ()$/,/^} # func_xform /c\
-func_xform ()\
-{\
- func_xform_result=${1%.*}.lo\
-} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_arith ()$/,/^} # func_arith /c\
-func_arith ()\
-{\
- func_arith_result=$(( $* ))\
-} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_len ()$/,/^} # func_len /c\
-func_len ()\
-{\
- func_len_result=${#1}\
-} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-fi
-
-if test x"$lt_shell_append" = xyes; then
- sed -e '/^func_append ()$/,/^} # func_append /c\
-func_append ()\
-{\
- eval "${1}+=\\${2}"\
-} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\
-func_append_quoted ()\
-{\
-\ func_quote_for_eval "${2}"\
-\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\
-} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
- # Save a `func_append' function call where possible by direct use of '+='
- sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
- test 0 -eq $? || _lt_function_replace_fail=:
-else
- # Save a `func_append' function call even when '+=' is not available
- sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
- && mv -f "$cfgfile.tmp" "$cfgfile" \
- || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
- test 0 -eq $? || _lt_function_replace_fail=:
-fi
-
-if test x"$_lt_function_replace_fail" = x":"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5
-$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;}
-fi
-
-
mv -f "$cfgfile" "$ofile" ||
(rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
chmod +x "$ofile"
diff --git a/3rdparty/libjpeg/configure.ac b/3rdparty/libjpeg/configure.ac
index e2c377416a2..e06ff34faeb 100644
--- a/3rdparty/libjpeg/configure.ac
+++ b/3rdparty/libjpeg/configure.ac
@@ -5,7 +5,7 @@
# Configure script for IJG libjpeg
#
-AC_INIT([libjpeg], [8.3.0])
+AC_INIT([libjpeg], [9.2.0])
# Directory where autotools helper scripts lives.
AC_CONFIG_AUX_DIR([.])
@@ -21,16 +21,13 @@ AC_CANONICAL_TARGET
# Initialize Automake
# Don't require all the GNU mandated files
-AM_INIT_AUTOMAKE([-Wall -Werror ansi2knr no-dist foreign])
+AM_INIT_AUTOMAKE([-Wall -Werror no-dist foreign])
# Make --enable-silent-rules the default.
# To get verbose build output you may configure
# with --disable-silent-rules or use "make V=1".
AM_SILENT_RULES([yes])
-# This is required when using the de-ANSI-fication feature.
-AM_C_PROTOTYPES
-
# Add configure option --enable-maintainer-mode which enables
# dependency checking and generation useful to package maintainers.
# This is made an option to avoid confusing end users.
@@ -43,6 +40,7 @@ AC_PROG_CPP
AC_PROG_INSTALL
AC_PROG_MAKE_SET
AC_PROG_LN_S
+AM_PROG_AR
# Check if LD supports linker scripts,
# and define automake conditional HAVE_LD_VERSION_SCRIPT if so.
@@ -72,9 +70,9 @@ fi
AM_CONDITIONAL(HAVE_LD_VERSION_SCRIPT, test "$have_ld_version_script" = "yes")
# See if compiler supports prototypes.
-AC_MSG_CHECKING(for function prototypes)
-AC_CACHE_VAL(ijg_cv_have_prototypes,
-[AC_TRY_COMPILE([
+AC_MSG_CHECKING([for function prototypes])
+AC_CACHE_VAL([ijg_cv_have_prototypes],
+[AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
int testfunction (int arg1, int * arg2); /* check prototypes */
struct methods_struct { /* check method-pointer declarations */
int (*error_exit) (char *msgtext);
@@ -85,25 +83,29 @@ int testfunction (int arg1, int * arg2) /* check definitions */
{ return arg2[arg1]; }
int test2function (void) /* check void arg list */
{ return 0; }
-], [ ], ijg_cv_have_prototypes=yes, ijg_cv_have_prototypes=no)])
-AC_MSG_RESULT($ijg_cv_have_prototypes)
+]])],
+ [ijg_cv_have_prototypes=yes],
+ [ijg_cv_have_prototypes=no])])
+AC_MSG_RESULT([$ijg_cv_have_prototypes])
if test $ijg_cv_have_prototypes = yes; then
AC_DEFINE([HAVE_PROTOTYPES],[1],[Compiler supports function prototypes.])
else
- echo Your compiler does not seem to know about function prototypes.
- echo Perhaps it needs a special switch to enable ANSI C mode.
- echo If so, we recommend running configure like this:
- echo " ./configure CC='cc -switch'"
- echo where -switch is the proper switch.
+ AC_MSG_WARN([Your compiler does not seem to know about function prototypes.
+ Perhaps it needs a special switch to enable ANSI C mode.
+ If so, we recommend running configure like this:
+ ./configure CC='cc -switch'
+ where -switch is the proper switch.])
fi
# Check header files
-AC_CHECK_HEADERS(stddef.h stdlib.h locale.h)
-AC_CHECK_HEADER(string.h, , AC_DEFINE([NEED_BSD_STRINGS],[1],[Compiler has <strings.h> rather than standard <string.h>.]))
+AC_CHECK_HEADERS([stddef.h stdlib.h locale.h])
+AC_CHECK_HEADER([string.h], [],
+ [AC_DEFINE([NEED_BSD_STRINGS], [1],
+ [Compiler has <strings.h> rather than standard <string.h>.])])
# See whether type size_t is defined in any ANSI-standard places;
# if not, perhaps it is defined in <sys/types.h>.
-AC_MSG_CHECKING(for size_t)
+AC_MSG_CHECKING([for size_t])
AC_TRY_COMPILE([
#ifdef HAVE_STDDEF_H
#include <stddef.h>
@@ -118,33 +120,42 @@ AC_TRY_COMPILE([
#include <string.h>
#endif
typedef size_t my_size_t;
-], [ my_size_t foovar; ], ijg_size_t_ok=yes,
-[ijg_size_t_ok="not ANSI, perhaps it is in sys/types.h"])
-AC_MSG_RESULT($ijg_size_t_ok)
+],
+ [ my_size_t foovar; ],
+ [ijg_size_t_ok=yes],
+ [ijg_size_t_ok="not ANSI, perhaps it is in sys/types.h"])
+AC_MSG_RESULT([$ijg_size_t_ok])
if test "$ijg_size_t_ok" != yes; then
-AC_CHECK_HEADER(sys/types.h, [AC_DEFINE([NEED_SYS_TYPES_H],[1],[Need to include <sys/types.h> in order to obtain size_t.])
-AC_EGREP_CPP(size_t, [#include <sys/types.h>],
-[ijg_size_t_ok="size_t is in sys/types.h"], ijg_size_t_ok=no)],
-ijg_size_t_ok=no)
-AC_MSG_RESULT($ijg_size_t_ok)
-if test "$ijg_size_t_ok" = no; then
- echo Type size_t is not defined in any of the usual places.
- echo Try putting '"typedef unsigned int size_t;"' in jconfig.h.
-fi
+ AC_CHECK_HEADER([sys/types.h],
+ [AC_DEFINE([NEED_SYS_TYPES_H], [1],
+ [Need to include <sys/types.h> in order to obtain size_t.])
+ AC_EGREP_CPP([size_t], [#include <sys/types.h>],
+ [ijg_size_t_ok="size_t is in sys/types.h"],
+ [ijg_size_t_ok=no])],
+ [ijg_size_t_ok=no])
+ AC_MSG_RESULT([$ijg_size_t_ok])
+ if test "$ijg_size_t_ok" = no; then
+ AC_MSG_WARN([Type size_t is not defined in any of the usual places.
+ Try putting '"typedef unsigned int size_t;"' in jconfig.h.])
+ fi
fi
# Check compiler characteristics
-AC_MSG_CHECKING(for type unsigned char)
-AC_TRY_COMPILE(, [ unsigned char un_char; ],
-[AC_MSG_RESULT(yes)
-AC_DEFINE([HAVE_UNSIGNED_CHAR],[1],[Compiler supports 'unsigned char'.])], AC_MSG_RESULT(no))
-dnl
-AC_MSG_CHECKING(for type unsigned short)
-AC_TRY_COMPILE(, [ unsigned short un_short; ],
-[AC_MSG_RESULT(yes)
-AC_DEFINE([HAVE_UNSIGNED_SHORT],[1],[Compiler supports 'unsigned short'.])], AC_MSG_RESULT(no))
-dnl
-AC_MSG_CHECKING(for type void)
+AC_MSG_CHECKING([for type unsigned char])
+AC_TRY_COMPILE([], [ unsigned char un_char; ],
+ [AC_MSG_RESULT(yes)
+ AC_DEFINE([HAVE_UNSIGNED_CHAR], [1],
+ [Compiler supports 'unsigned char'.])],
+ [AC_MSG_RESULT(no)])
+
+AC_MSG_CHECKING([for type unsigned short])
+AC_TRY_COMPILE([], [ unsigned short un_short; ],
+ [AC_MSG_RESULT(yes)
+ AC_DEFINE([HAVE_UNSIGNED_SHORT], [1],
+ [Compiler supports 'unsigned short'.])],
+ [AC_MSG_RESULT(no)])
+
+AC_MSG_CHECKING([for type void])
AC_TRY_COMPILE([
/* Caution: a C++ compiler will insist on valid prototypes */
typedef void * void_ptr; /* check void * */
@@ -166,40 +177,56 @@ void test3function (arg1, arg2)
arg1 = (void *) locptr;
(*arg2) (1, 2); /* check call of fcn returning void */
}
-], [ ], AC_MSG_RESULT(yes), [AC_MSG_RESULT(no)
-AC_DEFINE([void],[char],[Define 'void' as 'char' for archaic compilers that don't understand it.])])
+], [ ],
+ [AC_MSG_RESULT(yes)],
+ [AC_MSG_RESULT(no)
+ AC_DEFINE([void], [char],
+ [Define 'void' as 'char' for archaic compilers
+ that don't understand it.])])
AC_C_CONST
# Check for non-broken inline under various spellings
-AC_MSG_CHECKING(for inline)
+AC_MSG_CHECKING([for inline])
ijg_cv_inline=""
-AC_TRY_COMPILE(, [} __inline__ int foo() { return 0; }
+AC_TRY_COMPILE([], [} __inline__ int foo() { return 0; }
int bar() { return foo();], ijg_cv_inline="__inline__",
-AC_TRY_COMPILE(, [} __inline int foo() { return 0; }
+[AC_TRY_COMPILE(, [} __inline int foo() { return 0; }
int bar() { return foo();], ijg_cv_inline="__inline",
-AC_TRY_COMPILE(, [} inline int foo() { return 0; }
-int bar() { return foo();], ijg_cv_inline="inline")))
+[AC_TRY_COMPILE(, [} inline int foo() { return 0; }
+int bar() { return foo();], ijg_cv_inline="inline")])])
AC_MSG_RESULT($ijg_cv_inline)
-AC_DEFINE_UNQUOTED([INLINE],[$ijg_cv_inline],[How to obtain function inlining.])
+AC_DEFINE_UNQUOTED([INLINE], [$ijg_cv_inline],
+ [How to obtain function inlining.])
# We cannot check for bogus warnings, but at least we can check for errors
-AC_MSG_CHECKING(for broken incomplete types)
-AC_TRY_COMPILE([ typedef struct undefined_structure * undef_struct_ptr; ], ,
-AC_MSG_RESULT(ok),
-[AC_MSG_RESULT(broken)
-AC_DEFINE([INCOMPLETE_TYPES_BROKEN],[1],[Compiler does not support pointers to unspecified structures.])])
+AC_MSG_CHECKING([for broken incomplete types])
+AC_TRY_COMPILE([ typedef struct undefined_structure * undef_struct_ptr; ],
+ [],
+ [AC_MSG_RESULT(ok)],
+ [AC_MSG_RESULT(broken)
+ AC_DEFINE([INCOMPLETE_TYPES_BROKEN], [1],
+ [Compiler does not support pointers to unspecified
+ structures.])])
# Test whether global names are unique to at least 15 chars
-AC_MSG_CHECKING(for short external names)
+AC_MSG_CHECKING([for short external names])
AC_TRY_LINK([
int possibly_duplicate_function () { return 0; }
int possibly_dupli_function () { return 1; }
-], [ ], AC_MSG_RESULT(ok), [AC_MSG_RESULT(short)
-AC_DEFINE([NEED_SHORT_EXTERNAL_NAMES],[1],[Linker requires that global names be unique in first 15 characters.])])
+], [],
+ [AC_MSG_RESULT(ok)],
+ [AC_MSG_RESULT(short)
+ AC_DEFINE([NEED_SHORT_EXTERNAL_NAMES], [1],
+ [Linker requires that global names be unique in
+ first 15 characters.])])
# Run-time checks
-AC_MSG_CHECKING(to see if char is signed)
+AC_MSG_CHECKING([to see if char is signed])
AC_TRY_RUN([
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#include <stdio.h>
#ifdef HAVE_PROTOTYPES
int is_char_signed (int arg)
#else
@@ -220,13 +247,19 @@ char signed_char_check = (char) (-67);
int main() {
exit(is_char_signed((int) signed_char_check));
}], [AC_MSG_RESULT(no)
-AC_DEFINE([CHAR_IS_UNSIGNED],[1],[Characters are unsigned])], AC_MSG_RESULT(yes),
-[echo Assuming that char is signed on target machine.
-echo If it is unsigned, this will be a little bit inefficient.
+ AC_DEFINE([CHAR_IS_UNSIGNED], [1],
+ [Characters are unsigned])],
+ [AC_MSG_RESULT(yes)],
+[AC_MSG_WARN([Assuming that char is signed on target machine.
+ If it is unsigned, this will be a little bit inefficient.])
])
-dnl
-AC_MSG_CHECKING(to see if right shift is signed)
+
+AC_MSG_CHECKING([to see if right shift is signed])
AC_TRY_RUN([
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#include <stdio.h>
#ifdef HAVE_PROTOTYPES
int is_shifting_signed (long arg)
#else
@@ -252,20 +285,29 @@ int is_shifting_signed (arg)
}
int main() {
exit(is_shifting_signed(-0x7F7E80B1L));
-}], [AC_MSG_RESULT(no)
-AC_DEFINE([RIGHT_SHIFT_IS_UNSIGNED],[1],[Broken compiler shifts signed values as an unsigned shift.])], AC_MSG_RESULT(yes),
-AC_MSG_RESULT(Assuming that right shift is signed on target machine.))
-dnl
-AC_MSG_CHECKING(to see if fopen accepts b spec)
+}],
+ [AC_MSG_RESULT(no)
+ AC_DEFINE([RIGHT_SHIFT_IS_UNSIGNED], [1],
+ [Broken compiler shifts signed values as an unsigned shift.])],
+ [AC_MSG_RESULT(yes)],
+ [AC_MSG_RESULT(Assuming that right shift is signed on target machine.)])
+
+AC_MSG_CHECKING([to see if fopen accepts b spec])
AC_TRY_RUN([
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
#include <stdio.h>
int main() {
if (fopen("conftestdata", "wb") != NULL)
exit(0);
exit(1);
-}], AC_MSG_RESULT(yes), [AC_MSG_RESULT(no)
-AC_DEFINE([DONT_USE_B_MODE],[1],[Don't open files in binary mode.])],
-AC_MSG_RESULT(Assuming that it does.))
+}],
+ [AC_MSG_RESULT(yes)],
+ [AC_MSG_RESULT(no)
+ AC_DEFINE([DONT_USE_B_MODE], [1],
+ [Don't open files in binary mode.])],
+ [AC_MSG_RESULT(Assuming that it does.)])
# Configure libtool
AC_LIBTOOL_WIN32_DLL
@@ -275,9 +317,9 @@ AC_PROG_LIBTOOL
# If no "-enable-maxmem", use jmemnobs
MEMORYMGR='jmemnobs'
MAXMEM="no"
-AC_ARG_ENABLE(maxmem,
+AC_ARG_ENABLE([maxmem],
[ --enable-maxmem[=N] enable use of temp files, set max mem usage to N MB],
-MAXMEM="$enableval")
+[MAXMEM="$enableval"])
dnl [# support --with-maxmem for backwards compatibility with IJG V5.]
dnl AC_ARG_WITH(maxmem, , MAXMEM="$withval")
if test "x$MAXMEM" = xyes; then
@@ -288,31 +330,36 @@ if test "x$MAXMEM" != xno; then
AC_MSG_ERROR(non-numeric argument to --enable-maxmem)
fi
DEFAULTMAXMEM=`expr $MAXMEM \* 1048576`
-AC_DEFINE_UNQUOTED([DEFAULT_MAX_MEM], [${DEFAULTMAXMEM}], [Maximum data space library will allocate.])
-AC_MSG_CHECKING([for 'tmpfile()'])
-AC_TRY_LINK([#include <stdio.h>], [ FILE * tfile = tmpfile(); ],
-[AC_MSG_RESULT(yes)
-MEMORYMGR='jmemansi'],
-[AC_MSG_RESULT(no)
-dnl if tmpfile is not present, must use jmemname.
-MEMORYMGR='jmemname'
+ AC_DEFINE_UNQUOTED([DEFAULT_MAX_MEM], [${DEFAULTMAXMEM}],
+ [Maximum data space library will allocate.])
+ AC_MSG_CHECKING([for 'tmpfile()'])
+ AC_TRY_LINK([#include <stdio.h>], [ FILE * tfile = tmpfile(); ],
+ [AC_MSG_RESULT(yes)
+ MEMORYMGR='jmemansi'],
+ [AC_MSG_RESULT(no)
+ dnl if tmpfile is not present, must use jmemname.
+ MEMORYMGR='jmemname'
-# Test for the need to remove temporary files using a signal handler (for cjpeg/djpeg)
-AC_DEFINE([NEED_SIGNAL_CATCHER],[1],[Need signal handler to clean up temporary files.])
-AC_MSG_CHECKING([for 'mktemp()'])
-AC_TRY_LINK(, [ char fname[80]; mktemp(fname); ], AC_MSG_RESULT(yes),
-[AC_MSG_RESULT(no)
-AC_DEFINE([NO_MKTEMP],[1],[The mktemp() function is not available.])])])
+ # Test for the need to remove temporary files using a signal handler
+ # (for cjpeg/djpeg)
+ AC_DEFINE([NEED_SIGNAL_CATCHER], [1],
+ [Need signal handler to clean up temporary files.])
+ AC_MSG_CHECKING([for 'mktemp()'])
+ AC_TRY_LINK([], [ char fname[80]; mktemp(fname); ],
+ [AC_MSG_RESULT(yes)],
+ [AC_MSG_RESULT(no)
+ AC_DEFINE([NO_MKTEMP], [1],
+ [The mktemp() function is not available.])])])
fi
-AC_SUBST(MEMORYMGR)
+AC_SUBST([MEMORYMGR])
# Extract the library version IDs from jpeglib.h.
AC_MSG_CHECKING([libjpeg version number])
-[JPEG_LIB_VERSION_MAJOR=`sed -e '/^#define JPEG_LIB_VERSION_MAJOR/!d' -e 's/^[^0-9]*\([0-9][0-9]*\).*$/\1/' $srcdir/jpeglib.h`]
-[JPEG_LIB_VERSION_MINOR=`sed -e '/^#define JPEG_LIB_VERSION_MINOR/!d' -e 's/^[^0-9]*\([0-9][0-9]*\).*$/\1/' $srcdir/jpeglib.h`]
-[JPEG_LIB_VERSION="`expr $JPEG_LIB_VERSION_MAJOR + $JPEG_LIB_VERSION_MINOR`:0:$JPEG_LIB_VERSION_MINOR"]
+[major=`sed -ne 's/^#define JPEG_LIB_VERSION_MAJOR *\([0-9][0-9]*\).*$/\1/p' $srcdir/jpeglib.h`
+minor=`sed -ne 's/^#define JPEG_LIB_VERSION_MINOR *\([0-9][0-9]*\).*$/\1/p' $srcdir/jpeglib.h`]
+AC_SUBST([JPEG_LIB_VERSION],
+ [`expr $major + $minor`:0:$minor])
AC_MSG_RESULT([$JPEG_LIB_VERSION])
-AC_SUBST([JPEG_LIB_VERSION])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
diff --git a/3rdparty/libjpeg/depcomp b/3rdparty/libjpeg/depcomp
index df8eea7e4ce..fc98710e2a1 100644
--- a/3rdparty/libjpeg/depcomp
+++ b/3rdparty/libjpeg/depcomp
@@ -1,10 +1,9 @@
#! /bin/sh
# depcomp - compile a program generating dependencies as side-effects
-scriptversion=2009-04-28.21; # UTC
+scriptversion=2013-05-30.07; # UTC
-# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free
-# Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -28,9 +27,9 @@ scriptversion=2009-04-28.21; # UTC
case $1 in
'')
- echo "$0: No command. Try \`$0 --help' for more information." 1>&2
- exit 1;
- ;;
+ echo "$0: No command. Try '$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
-h | --h*)
cat <<\EOF
Usage: depcomp [--help] [--version] PROGRAM [ARGS]
@@ -40,11 +39,11 @@ as side-effects.
Environment variables:
depmode Dependency tracking mode.
- source Source file read by `PROGRAMS ARGS'.
- object Object file output by `PROGRAMS ARGS'.
+ source Source file read by 'PROGRAMS ARGS'.
+ object Object file output by 'PROGRAMS ARGS'.
DEPDIR directory where to store dependencies.
depfile Dependency file to output.
- tmpdepfile Temporary file to use when outputing dependencies.
+ tmpdepfile Temporary file to use when outputting dependencies.
libtool Whether libtool is used (yes/no).
Report bugs to <bug-automake@gnu.org>.
@@ -57,6 +56,66 @@ EOF
;;
esac
+# Get the directory component of the given path, and save it in the
+# global variables '$dir'. Note that this directory component will
+# be either empty or ending with a '/' character. This is deliberate.
+set_dir_from ()
+{
+ case $1 in
+ */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
+ *) dir=;;
+ esac
+}
+
+# Get the suffix-stripped basename of the given path, and save it the
+# global variable '$base'.
+set_base_from ()
+{
+ base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
+}
+
+# If no dependency file was actually created by the compiler invocation,
+# we still have to create a dummy depfile, to avoid errors with the
+# Makefile "include basename.Plo" scheme.
+make_dummy_depfile ()
+{
+ echo "#dummy" > "$depfile"
+}
+
+# Factor out some common post-processing of the generated depfile.
+# Requires the auxiliary global variable '$tmpdepfile' to be set.
+aix_post_process_depfile ()
+{
+ # If the compiler actually managed to produce a dependency file,
+ # post-process it.
+ if test -f "$tmpdepfile"; then
+ # Each line is of the form 'foo.o: dependency.h'.
+ # Do two passes, one to just change these to
+ # $object: dependency.h
+ # and one to simply output
+ # dependency.h:
+ # which is needed to avoid the deleted-header problem.
+ { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
+ sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
+ } > "$depfile"
+ rm -f "$tmpdepfile"
+ else
+ make_dummy_depfile
+ fi
+}
+
+# A tabulation character.
+tab=' '
+# A newline character.
+nl='
+'
+# Character ranges might be problematic outside the C locale.
+# These definitions help.
+upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
+lower=abcdefghijklmnopqrstuvwxyz
+digits=0123456789
+alpha=${upper}${lower}
+
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
echo "depcomp: Variables source, object and depmode must be set" 1>&2
exit 1
@@ -69,6 +128,9 @@ tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
rm -f "$tmpdepfile"
+# Avoid interferences from the environment.
+gccflag= dashmflag=
+
# Some modes work just like other modes, but use different flags. We
# parameterize here, but still list the modes in the big case below,
# to make depend.m4 easier to write. Note that we *cannot* use a case
@@ -80,18 +142,32 @@ if test "$depmode" = hp; then
fi
if test "$depmode" = dashXmstdout; then
- # This is just like dashmstdout with a different argument.
- dashmflag=-xM
- depmode=dashmstdout
+ # This is just like dashmstdout with a different argument.
+ dashmflag=-xM
+ depmode=dashmstdout
fi
cygpath_u="cygpath -u -f -"
if test "$depmode" = msvcmsys; then
- # This is just like msvisualcpp but w/o cygpath translation.
- # Just convert the backslash-escaped backslashes to single forward
- # slashes to satisfy depend.m4
- cygpath_u="sed s,\\\\\\\\,/,g"
- depmode=msvisualcpp
+ # This is just like msvisualcpp but w/o cygpath translation.
+ # Just convert the backslash-escaped backslashes to single forward
+ # slashes to satisfy depend.m4
+ cygpath_u='sed s,\\\\,/,g'
+ depmode=msvisualcpp
+fi
+
+if test "$depmode" = msvc7msys; then
+ # This is just like msvc7 but w/o cygpath translation.
+ # Just convert the backslash-escaped backslashes to single forward
+ # slashes to satisfy depend.m4
+ cygpath_u='sed s,\\\\,/,g'
+ depmode=msvc7
+fi
+
+if test "$depmode" = xlc; then
+ # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
+ gccflag=-qmakedep=gcc,-MF
+ depmode=gcc
fi
case "$depmode" in
@@ -114,8 +190,7 @@ gcc3)
done
"$@"
stat=$?
- if test $stat -eq 0; then :
- else
+ if test $stat -ne 0; then
rm -f "$tmpdepfile"
exit $stat
fi
@@ -123,13 +198,17 @@ gcc3)
;;
gcc)
+## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
+## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
+## (see the conditional assignment to $gccflag above).
## There are various ways to get dependency output from gcc. Here's
## why we pick this rather obscure method:
## - Don't want to use -MD because we'd like the dependencies to end
## up in a subdir. Having to rename by hand is ugly.
## (We might end up doing this anyway to support other compilers.)
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
-## -MM, not -M (despite what the docs say).
+## -MM, not -M (despite what the docs say). Also, it might not be
+## supported by the other compilers which use the 'gcc' depmode.
## - Using -M directly means running the compiler twice (even worse
## than renaming).
if test -z "$gccflag"; then
@@ -137,31 +216,31 @@ gcc)
fi
"$@" -Wp,"$gccflag$tmpdepfile"
stat=$?
- if test $stat -eq 0; then :
- else
+ if test $stat -ne 0; then
rm -f "$tmpdepfile"
exit $stat
fi
rm -f "$depfile"
echo "$object : \\" > "$depfile"
- alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
-## The second -e expression handles DOS-style file names with drive letters.
+ # The second -e expression handles DOS-style file names with drive
+ # letters.
sed -e 's/^[^:]*: / /' \
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
-## This next piece of magic avoids the `deleted header file' problem.
+## This next piece of magic avoids the "deleted header file" problem.
## The problem is that when a header file which appears in a .P file
## is deleted, the dependency causes make to die (because there is
## typically no way to rebuild the header). We avoid this by adding
## dummy dependencies for each header file. Too bad gcc doesn't do
## this for us directly.
- tr ' ' '
-' < "$tmpdepfile" |
-## Some versions of gcc put a space before the `:'. On the theory
+## Some versions of gcc put a space before the ':'. On the theory
## that the space means something, we add a space to the output as
-## well.
+## well. hp depmode also adds that space, but also prefixes the VPATH
+## to the object. Take care to not repeat it in the output.
## Some versions of the HPUX 10.20 sed can't process this invocation
## correctly. Breaking it into two sed invocations is a workaround.
- sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
+ | sed -e 's/$/ :/' >> "$depfile"
rm -f "$tmpdepfile"
;;
@@ -179,8 +258,7 @@ sgi)
"$@" -MDupdate "$tmpdepfile"
fi
stat=$?
- if test $stat -eq 0; then :
- else
+ if test $stat -ne 0; then
rm -f "$tmpdepfile"
exit $stat
fi
@@ -188,43 +266,41 @@ sgi)
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
echo "$object : \\" > "$depfile"
-
# Clip off the initial element (the dependent). Don't try to be
# clever and replace this with sed code, as IRIX sed won't handle
# lines with more than a fixed number of characters (4096 in
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
- # the IRIX cc adds comments like `#:fec' to the end of the
+ # the IRIX cc adds comments like '#:fec' to the end of the
# dependency line.
- tr ' ' '
-' < "$tmpdepfile" \
- | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
- tr '
-' ' ' >> "$depfile"
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
+ | tr "$nl" ' ' >> "$depfile"
echo >> "$depfile"
-
# The second pass generates a dummy entry for each header file.
- tr ' ' '
-' < "$tmpdepfile" \
- | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
- >> "$depfile"
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+ >> "$depfile"
else
- # The sourcefile does not contain any dependencies, so just
- # store a dummy comment line, to avoid errors with the Makefile
- # "include basename.Plo" scheme.
- echo "#dummy" > "$depfile"
+ make_dummy_depfile
fi
rm -f "$tmpdepfile"
;;
+xlc)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
aix)
# The C for AIX Compiler uses -M and outputs the dependencies
# in a .u file. In older versions, this file always lives in the
- # current directory. Also, the AIX compiler puts `$object:' at the
+ # current directory. Also, the AIX compiler puts '$object:' at the
# start of each line; $object doesn't have directory information.
# Version 6 uses the directory in both cases.
- dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
- test "x$dir" = "x$object" && dir=
- base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+ set_dir_from "$object"
+ set_base_from "$object"
if test "$libtool" = yes; then
tmpdepfile1=$dir$base.u
tmpdepfile2=$base.u
@@ -237,9 +313,7 @@ aix)
"$@" -M
fi
stat=$?
-
- if test $stat -eq 0; then :
- else
+ if test $stat -ne 0; then
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
exit $stat
fi
@@ -248,44 +322,100 @@ aix)
do
test -f "$tmpdepfile" && break
done
- if test -f "$tmpdepfile"; then
- # Each line is of the form `foo.o: dependent.h'.
- # Do two passes, one to just change these to
- # `$object: dependent.h' and one to simply `dependent.h:'.
- sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
- # That's a tab and a space in the [].
- sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
- else
- # The sourcefile does not contain any dependencies, so just
- # store a dummy comment line, to avoid errors with the Makefile
- # "include basename.Plo" scheme.
- echo "#dummy" > "$depfile"
+ aix_post_process_depfile
+ ;;
+
+tcc)
+ # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
+ # FIXME: That version still under development at the moment of writing.
+ # Make that this statement remains true also for stable, released
+ # versions.
+ # It will wrap lines (doesn't matter whether long or short) with a
+ # trailing '\', as in:
+ #
+ # foo.o : \
+ # foo.c \
+ # foo.h \
+ #
+ # It will put a trailing '\' even on the last line, and will use leading
+ # spaces rather than leading tabs (at least since its commit 0394caf7
+ # "Emit spaces for -MD").
+ "$@" -MD -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
fi
+ rm -f "$depfile"
+ # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
+ # We have to change lines of the first kind to '$object: \'.
+ sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
+ # And for each line of the second kind, we have to emit a 'dep.h:'
+ # dummy dependency, to avoid the deleted-header problem.
+ sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
rm -f "$tmpdepfile"
;;
-icc)
- # Intel's C compiler understands `-MD -MF file'. However on
- # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
- # ICC 7.0 will fill foo.d with something like
- # foo.o: sub/foo.c
- # foo.o: sub/foo.h
- # which is wrong. We want:
- # sub/foo.o: sub/foo.c
- # sub/foo.o: sub/foo.h
- # sub/foo.c:
- # sub/foo.h:
- # ICC 7.1 will output
+## The order of this option in the case statement is important, since the
+## shell code in configure will try each of these formats in the order
+## listed in this file. A plain '-MD' option would be understood by many
+## compilers, so we must ensure this comes after the gcc and icc options.
+pgcc)
+ # Portland's C compiler understands '-MD'.
+ # Will always output deps to 'file.d' where file is the root name of the
+ # source file under compilation, even if file resides in a subdirectory.
+ # The object file name does not affect the name of the '.d' file.
+ # pgcc 10.2 will output
# foo.o: sub/foo.c sub/foo.h
- # and will wrap long lines using \ :
+ # and will wrap long lines using '\' :
# foo.o: sub/foo.c ... \
# sub/foo.h ... \
# ...
+ set_dir_from "$object"
+ # Use the source, not the object, to determine the base name, since
+ # that's sadly what pgcc will do too.
+ set_base_from "$source"
+ tmpdepfile=$base.d
+
+ # For projects that build the same source file twice into different object
+ # files, the pgcc approach of using the *source* file root name can cause
+ # problems in parallel builds. Use a locking strategy to avoid stomping on
+ # the same $tmpdepfile.
+ lockdir=$base.d-lock
+ trap "
+ echo '$0: caught signal, cleaning up...' >&2
+ rmdir '$lockdir'
+ exit 1
+ " 1 2 13 15
+ numtries=100
+ i=$numtries
+ while test $i -gt 0; do
+ # mkdir is a portable test-and-set.
+ if mkdir "$lockdir" 2>/dev/null; then
+ # This process acquired the lock.
+ "$@" -MD
+ stat=$?
+ # Release the lock.
+ rmdir "$lockdir"
+ break
+ else
+ # If the lock is being held by a different process, wait
+ # until the winning process is done or we timeout.
+ while test -d "$lockdir" && test $i -gt 0; do
+ sleep 1
+ i=`expr $i - 1`
+ done
+ fi
+ i=`expr $i - 1`
+ done
+ trap - 1 2 13 15
+ if test $i -le 0; then
+ echo "$0: failed to acquire lock after $numtries attempts" >&2
+ echo "$0: check lockdir '$lockdir'" >&2
+ exit 1
+ fi
- "$@" -MD -MF "$tmpdepfile"
- stat=$?
- if test $stat -eq 0; then :
- else
+ if test $stat -ne 0; then
rm -f "$tmpdepfile"
exit $stat
fi
@@ -297,8 +427,8 @@ icc)
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
# Some versions of the HPUX 10.20 sed can't process this invocation
# correctly. Breaking it into two sed invocations is a workaround.
- sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
- sed -e 's/$/ :/' >> "$depfile"
+ sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
+ | sed -e 's/$/ :/' >> "$depfile"
rm -f "$tmpdepfile"
;;
@@ -309,9 +439,8 @@ hp2)
# 'foo.d', which lands next to the object file, wherever that
# happens to be.
# Much of this is similar to the tru64 case; see comments there.
- dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
- test "x$dir" = "x$object" && dir=
- base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+ set_dir_from "$object"
+ set_base_from "$object"
if test "$libtool" = yes; then
tmpdepfile1=$dir$base.d
tmpdepfile2=$dir.libs/$base.d
@@ -322,8 +451,7 @@ hp2)
"$@" +Maked
fi
stat=$?
- if test $stat -eq 0; then :
- else
+ if test $stat -ne 0; then
rm -f "$tmpdepfile1" "$tmpdepfile2"
exit $stat
fi
@@ -333,77 +461,107 @@ hp2)
test -f "$tmpdepfile" && break
done
if test -f "$tmpdepfile"; then
- sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
- # Add `dependent.h:' lines.
+ sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
+ # Add 'dependent.h:' lines.
sed -ne '2,${
- s/^ *//
- s/ \\*$//
- s/$/:/
- p
- }' "$tmpdepfile" >> "$depfile"
+ s/^ *//
+ s/ \\*$//
+ s/$/:/
+ p
+ }' "$tmpdepfile" >> "$depfile"
else
- echo "#dummy" > "$depfile"
+ make_dummy_depfile
fi
rm -f "$tmpdepfile" "$tmpdepfile2"
;;
tru64)
- # The Tru64 compiler uses -MD to generate dependencies as a side
- # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
- # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
- # dependencies in `foo.d' instead, so we check for that too.
- # Subdirectories are respected.
- dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
- test "x$dir" = "x$object" && dir=
- base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-
- if test "$libtool" = yes; then
- # With Tru64 cc, shared objects can also be used to make a
- # static library. This mechanism is used in libtool 1.4 series to
- # handle both shared and static libraries in a single compilation.
- # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
- #
- # With libtool 1.5 this exception was removed, and libtool now
- # generates 2 separate objects for the 2 libraries. These two
- # compilations output dependencies in $dir.libs/$base.o.d and
- # in $dir$base.o.d. We have to check for both files, because
- # one of the two compilations can be disabled. We should prefer
- # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
- # automatically cleaned when .libs/ is deleted, while ignoring
- # the former would cause a distcleancheck panic.
- tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4
- tmpdepfile2=$dir$base.o.d # libtool 1.5
- tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
- tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
- "$@" -Wc,-MD
- else
- tmpdepfile1=$dir$base.o.d
- tmpdepfile2=$dir$base.d
- tmpdepfile3=$dir$base.d
- tmpdepfile4=$dir$base.d
- "$@" -MD
- fi
-
- stat=$?
- if test $stat -eq 0; then :
- else
- rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
- exit $stat
- fi
-
- for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
- do
- test -f "$tmpdepfile" && break
- done
- if test -f "$tmpdepfile"; then
- sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
- # That's a tab and a space in the [].
- sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
- else
- echo "#dummy" > "$depfile"
- fi
- rm -f "$tmpdepfile"
- ;;
+ # The Tru64 compiler uses -MD to generate dependencies as a side
+ # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
+ # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+ # dependencies in 'foo.d' instead, so we check for that too.
+ # Subdirectories are respected.
+ set_dir_from "$object"
+ set_base_from "$object"
+
+ if test "$libtool" = yes; then
+ # Libtool generates 2 separate objects for the 2 libraries. These
+ # two compilations output dependencies in $dir.libs/$base.o.d and
+ # in $dir$base.o.d. We have to check for both files, because
+ # one of the two compilations can be disabled. We should prefer
+ # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+ # automatically cleaned when .libs/ is deleted, while ignoring
+ # the former would cause a distcleancheck panic.
+ tmpdepfile1=$dir$base.o.d # libtool 1.5
+ tmpdepfile2=$dir.libs/$base.o.d # Likewise.
+ tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504
+ "$@" -Wc,-MD
+ else
+ tmpdepfile1=$dir$base.d
+ tmpdepfile2=$dir$base.d
+ tmpdepfile3=$dir$base.d
+ "$@" -MD
+ fi
+
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ # Same post-processing that is required for AIX mode.
+ aix_post_process_depfile
+ ;;
+
+msvc7)
+ if test "$libtool" = yes; then
+ showIncludes=-Wc,-showIncludes
+ else
+ showIncludes=-showIncludes
+ fi
+ "$@" $showIncludes > "$tmpdepfile"
+ stat=$?
+ grep -v '^Note: including file: ' "$tmpdepfile"
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ # The first sed program below extracts the file names and escapes
+ # backslashes for cygpath. The second sed program outputs the file
+ # name when reading, but also accumulates all include files in the
+ # hold buffer in order to output them again at the end. This only
+ # works with sed implementations that can handle large buffers.
+ sed < "$tmpdepfile" -n '
+/^Note: including file: *\(.*\)/ {
+ s//\1/
+ s/\\/\\\\/g
+ p
+}' | $cygpath_u | sort -u | sed -n '
+s/ /\\ /g
+s/\(.*\)/'"$tab"'\1 \\/p
+s/.\(.*\) \\/\1:/
+H
+$ {
+ s/.*/'"$tab"'/
+ G
+ p
+}' >> "$depfile"
+ echo >> "$depfile" # make sure the fragment doesn't end with a backslash
+ rm -f "$tmpdepfile"
+ ;;
+
+msvc7msys)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
#nosideeffect)
# This comment above is used by automake to tell side-effect
@@ -422,7 +580,7 @@ dashmstdout)
shift
fi
- # Remove `-o $object'.
+ # Remove '-o $object'.
IFS=" "
for arg
do
@@ -442,18 +600,18 @@ dashmstdout)
done
test -z "$dashmflag" && dashmflag=-M
- # Require at least two characters before searching for `:'
+ # Require at least two characters before searching for ':'
# in the target name. This is to cope with DOS-style filenames:
- # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+ # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
"$@" $dashmflag |
- sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
+ sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
rm -f "$depfile"
cat < "$tmpdepfile" > "$depfile"
- tr ' ' '
-' < "$tmpdepfile" | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly. Breaking it into two sed invocations is a workaround.
- sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process this sed invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+ | sed -e 's/$/ :/' >> "$depfile"
rm -f "$tmpdepfile"
;;
@@ -503,12 +661,15 @@ makedepend)
touch "$tmpdepfile"
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
rm -f "$depfile"
- cat < "$tmpdepfile" > "$depfile"
- sed '1,2d' "$tmpdepfile" | tr ' ' '
-' | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly. Breaking it into two sed invocations is a workaround.
- sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+ # makedepend may prepend the VPATH from the source file name to the object.
+ # No need to regex-escape $object, excess matching of '.' is harmless.
+ sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process the last invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ sed '1,2d' "$tmpdepfile" \
+ | tr ' ' "$nl" \
+ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+ | sed -e 's/$/ :/' >> "$depfile"
rm -f "$tmpdepfile" "$tmpdepfile".bak
;;
@@ -525,7 +686,7 @@ cpp)
shift
fi
- # Remove `-o $object'.
+ # Remove '-o $object'.
IFS=" "
for arg
do
@@ -544,10 +705,10 @@ cpp)
esac
done
- "$@" -E |
- sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
- -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
- sed '$ s: \\$::' > "$tmpdepfile"
+ "$@" -E \
+ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+ | sed '$ s: \\$::' > "$tmpdepfile"
rm -f "$depfile"
echo "$object : \\" > "$depfile"
cat < "$tmpdepfile" >> "$depfile"
@@ -579,23 +740,23 @@ msvisualcpp)
shift
;;
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
- set fnord "$@"
- shift
- shift
- ;;
+ set fnord "$@"
+ shift
+ shift
+ ;;
*)
- set fnord "$@" "$arg"
- shift
- shift
- ;;
+ set fnord "$@" "$arg"
+ shift
+ shift
+ ;;
esac
done
"$@" -E 2>/dev/null |
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
rm -f "$depfile"
echo "$object : \\" > "$depfile"
- sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
- echo " " >> "$depfile"
+ sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
+ echo "$tab" >> "$depfile"
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
rm -f "$tmpdepfile"
;;
diff --git a/3rdparty/libjpeg/djpeg.1 b/3rdparty/libjpeg/djpeg.1
index f3722d1500d..dfbe4f12ac5 100644
--- a/3rdparty/libjpeg/djpeg.1
+++ b/3rdparty/libjpeg/djpeg.1
@@ -1,4 +1,4 @@
-.TH DJPEG 1 "3 October 2009"
+.TH DJPEG 1 "26 July 2015"
.SH NAME
djpeg \- decompress a JPEG file to an image file
.SH SYNOPSIS
@@ -55,11 +55,16 @@ default options are chosen for highest quality output.) Currently, this is
equivalent to \fB\-dct fast \-nosmooth \-onepass \-dither ordered\fR.
.TP
.B \-grayscale
-Force gray-scale output even if JPEG file is color. Useful for viewing on
-monochrome displays; also,
+Force grayscale output even if JPEG file is color.
+Useful for viewing on monochrome displays; also,
.B djpeg
runs noticeably faster in this mode.
.TP
+.B \-rgb
+Force RGB output even if JPEG file is grayscale.
+This is provided to support applications that don't
+want to cope with grayscale as a separate case.
+.TP
.BI \-scale " M/N"
Scale the output image by a factor M/N. Currently supported scale factors are
M/N with all M from 1 to 16, where N is the source DCT size, which is 8 for
@@ -76,7 +81,7 @@ emitted if
.B \-colors
or
.B \-grayscale
-is specified, or if the JPEG file is gray-scale; otherwise, 24-bit full-color
+is specified, or if the JPEG file is grayscale; otherwise, 24-bit full-color
format is emitted.
.TP
.B \-gif
@@ -90,12 +95,12 @@ emitted if
.B \-colors
or
.B \-grayscale
-is specified, or if the JPEG file is gray-scale; otherwise, 24-bit full-color
+is specified, or if the JPEG file is grayscale; otherwise, 24-bit full-color
format is emitted.
.TP
.B \-pnm
Select PBMPLUS (PPM/PGM) output format (this is the default format).
-PGM is emitted if the JPEG file is gray-scale or if
+PGM is emitted if the JPEG file is grayscale or if
.B \-grayscale
is specified; otherwise PPM is emitted.
.TP
@@ -103,8 +108,8 @@ is specified; otherwise PPM is emitted.
Select RLE output format. (Requires URT library.)
.TP
.B \-targa
-Select Targa output format. Gray-scale format is emitted if the JPEG file is
-gray-scale or if
+Select Targa output format. Grayscale format is emitted if the JPEG file is
+grayscale or if
.B \-grayscale
is specified; otherwise, colormapped format is emitted if
.B \-colors
@@ -162,7 +167,7 @@ faster and needs less memory, but it produces a lower-quality image.
is ignored unless you also say
.B \-colors
.IR N .
-Also, the one-pass method is always used for gray-scale output (the two-pass
+Also, the one-pass method is always used for grayscale output (the two-pass
method is no improvement then).
.TP
.BI \-maxmemory " N"
@@ -246,7 +251,7 @@ Communications of the ACM, April 1991 (vol. 34, no. 4), pp. 30-44.
.SH AUTHOR
Independent JPEG Group
.SH BUGS
-To avoid the Unisys LZW patent,
+To avoid the Unisys LZW patent (now expired),
.B djpeg
produces uncompressed GIF files. These are larger than they should be, but
are readable by standard GIF decoders.
diff --git a/3rdparty/libjpeg/djpeg.c b/3rdparty/libjpeg/djpeg.c
index bc544dc1017..0c9b89bdd5f 100644
--- a/3rdparty/libjpeg/djpeg.c
+++ b/3rdparty/libjpeg/djpeg.c
@@ -2,7 +2,7 @@
* djpeg.c
*
* Copyright (C) 1991-1997, Thomas G. Lane.
- * Modified 2009 by Guido Vollbeding.
+ * Modified 2009-2015 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -102,6 +102,7 @@ usage (void)
fprintf(stderr, " -colors N Reduce image to no more than N colors\n");
fprintf(stderr, " -fast Fast, low-quality processing\n");
fprintf(stderr, " -grayscale Force grayscale output\n");
+ fprintf(stderr, " -rgb Force RGB output\n");
#ifdef IDCT_SCALING_SUPPORTED
fprintf(stderr, " -scale M/N Scale output image by fraction M/N, eg, 1/8\n");
#endif
@@ -264,6 +265,10 @@ parse_switches (j_decompress_ptr cinfo, int argc, char **argv,
/* Force monochrome output. */
cinfo->out_color_space = JCS_GRAYSCALE;
+ } else if (keymatch(arg, "rgb", 3)) {
+ /* Force RGB output. */
+ cinfo->out_color_space = JCS_RGB;
+
} else if (keymatch(arg, "map", 3)) {
/* Quantize to a color map taken from an input file. */
if (++argn >= argc) /* advance to next argument */
@@ -298,7 +303,7 @@ parse_switches (j_decompress_ptr cinfo, int argc, char **argv,
cinfo->mem->max_memory_to_use = lval * 1000L;
} else if (keymatch(arg, "nosmooth", 3)) {
- /* Suppress fancy upsampling */
+ /* Suppress fancy upsampling. */
cinfo->do_fancy_upsampling = FALSE;
} else if (keymatch(arg, "onepass", 3)) {
@@ -327,7 +332,7 @@ parse_switches (j_decompress_ptr cinfo, int argc, char **argv,
/* Scale the output image by a fraction M/N. */
if (++argn >= argc) /* advance to next argument */
usage();
- if (sscanf(argv[argn], "%d/%d",
+ if (sscanf(argv[argn], "%u/%u",
&cinfo->scale_num, &cinfo->scale_denom) < 1)
usage();
diff --git a/3rdparty/libjpeg/filelist.txt b/3rdparty/libjpeg/filelist.txt
index 7e053869a6b..adfd14f3530 100644
--- a/3rdparty/libjpeg/filelist.txt
+++ b/3rdparty/libjpeg/filelist.txt
@@ -1,6 +1,6 @@
IJG JPEG LIBRARY: FILE LIST
-Copyright (C) 1994-2009, Thomas G. Lane, Guido Vollbeding.
+Copyright (C) 1994-2013, Thomas G. Lane, Guido Vollbeding.
This file is part of the Independent JPEG Group's software.
For conditions of distribution and use, see the accompanying README file.
@@ -197,6 +197,8 @@ config.guess
config.sub
depcomp
missing
+ar-lib
+compile
install-sh Install shell script for those Unix systems lacking one.
Makefile.in Makefile input for configure.
Makefile.am Source file for use with Automake to generate Makefile.in.
@@ -206,8 +208,6 @@ mak*.* Sample makefiles for particular systems.
jconfig.* Sample jconfig.h for particular systems.
libjpeg.map Script to generate shared library with versioned symbols.
aclocal.m4 M4 macro definitions for use with Autoconf.
-ansi2knr.c De-ANSIfier for pre-ANSI C compilers (courtesy of
- L. Peter Deutsch and Aladdin Enterprises).
Test files (see install.txt for test procedure):
diff --git a/3rdparty/libjpeg/install-sh b/3rdparty/libjpeg/install-sh
index 6781b987bdb..0b0fdcbba69 100644
--- a/3rdparty/libjpeg/install-sh
+++ b/3rdparty/libjpeg/install-sh
@@ -1,7 +1,7 @@
#!/bin/sh
# install - install a program, script, or datafile
-scriptversion=2009-04-28.21; # UTC
+scriptversion=2013-12-25.23; # UTC
# This originates from X11R5 (mit/util/scripts/install.sh), which was
# later released in X11R6 (xc/config/util/install.sh) with the
@@ -35,25 +35,21 @@ scriptversion=2009-04-28.21; # UTC
# FSF changes to this file are in the public domain.
#
# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
+# 'make' implicit rules from creating a file called install from it
# when there is no Makefile.
#
# This script is compatible with the BSD install script, but was written
# from scratch.
+tab=' '
nl='
'
-IFS=" "" $nl"
+IFS=" $tab$nl"
-# set DOITPROG to echo to test this script
+# Set DOITPROG to "echo" to test this script.
-# Don't use :- since 4.3BSD and earlier shells don't like it.
doit=${DOITPROG-}
-if test -z "$doit"; then
- doit_exec=exec
-else
- doit_exec=$doit
-fi
+doit_exec=${doit:-exec}
# Put in absolute file names if you don't have them in your path;
# or use environment vars.
@@ -68,17 +64,6 @@ mvprog=${MVPROG-mv}
rmprog=${RMPROG-rm}
stripprog=${STRIPPROG-strip}
-posix_glob='?'
-initialize_posix_glob='
- test "$posix_glob" != "?" || {
- if (set -f) 2>/dev/null; then
- posix_glob=
- else
- posix_glob=:
- fi
- }
-'
-
posix_mkdir=
# Desired mode of installed file.
@@ -97,7 +82,7 @@ dir_arg=
dst_arg=
copy_on_change=false
-no_target_directory=
+is_target_a_directory=possibly
usage="\
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
@@ -137,42 +122,57 @@ while test $# -ne 0; do
-d) dir_arg=true;;
-g) chgrpcmd="$chgrpprog $2"
- shift;;
+ shift;;
--help) echo "$usage"; exit $?;;
-m) mode=$2
- case $mode in
- *' '* | *' '* | *'
-'* | *'*'* | *'?'* | *'['*)
- echo "$0: invalid mode: $mode" >&2
- exit 1;;
- esac
- shift;;
+ case $mode in
+ *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
+ echo "$0: invalid mode: $mode" >&2
+ exit 1;;
+ esac
+ shift;;
-o) chowncmd="$chownprog $2"
- shift;;
+ shift;;
-s) stripcmd=$stripprog;;
- -t) dst_arg=$2
- shift;;
+ -t)
+ is_target_a_directory=always
+ dst_arg=$2
+ # Protect names problematic for 'test' and other utilities.
+ case $dst_arg in
+ -* | [=\(\)!]) dst_arg=./$dst_arg;;
+ esac
+ shift;;
- -T) no_target_directory=true;;
+ -T) is_target_a_directory=never;;
--version) echo "$0 $scriptversion"; exit $?;;
- --) shift
- break;;
+ --) shift
+ break;;
- -*) echo "$0: invalid option: $1" >&2
- exit 1;;
+ -*) echo "$0: invalid option: $1" >&2
+ exit 1;;
*) break;;
esac
shift
done
+# We allow the use of options -d and -T together, by making -d
+# take the precedence; this is for compatibility with GNU install.
+
+if test -n "$dir_arg"; then
+ if test -n "$dst_arg"; then
+ echo "$0: target directory not allowed when installing a directory." >&2
+ exit 1
+ fi
+fi
+
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
# When -d is used, all remaining arguments are directories to create.
# When -t is used, the destination is already specified.
@@ -186,6 +186,10 @@ if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
fi
shift # arg
dst_arg=$arg
+ # Protect names problematic for 'test' and other utilities.
+ case $dst_arg in
+ -* | [=\(\)!]) dst_arg=./$dst_arg;;
+ esac
done
fi
@@ -194,13 +198,26 @@ if test $# -eq 0; then
echo "$0: no input file specified." >&2
exit 1
fi
- # It's OK to call `install-sh -d' without argument.
+ # It's OK to call 'install-sh -d' without argument.
# This can happen when creating conditional directories.
exit 0
fi
if test -z "$dir_arg"; then
- trap '(exit $?); exit' 1 2 13 15
+ if test $# -gt 1 || test "$is_target_a_directory" = always; then
+ if test ! -d "$dst_arg"; then
+ echo "$0: $dst_arg: Is not a directory." >&2
+ exit 1
+ fi
+ fi
+fi
+
+if test -z "$dir_arg"; then
+ do_exit='(exit $ret); exit $ret'
+ trap "ret=129; $do_exit" 1
+ trap "ret=130; $do_exit" 2
+ trap "ret=141; $do_exit" 13
+ trap "ret=143; $do_exit" 15
# Set umask so as not to create temps with too-generous modes.
# However, 'strip' requires both read and write access to temps.
@@ -211,16 +228,16 @@ if test -z "$dir_arg"; then
*[0-7])
if test -z "$stripcmd"; then
- u_plus_rw=
+ u_plus_rw=
else
- u_plus_rw='% 200'
+ u_plus_rw='% 200'
fi
cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
*)
if test -z "$stripcmd"; then
- u_plus_rw=
+ u_plus_rw=
else
- u_plus_rw=,u+rw
+ u_plus_rw=,u+rw
fi
cp_umask=$mode$u_plus_rw;;
esac
@@ -228,9 +245,9 @@ fi
for src
do
- # Protect names starting with `-'.
+ # Protect names problematic for 'test' and other utilities.
case $src in
- -*) src=./$src;;
+ -* | [=\(\)!]) src=./$src;;
esac
if test -n "$dir_arg"; then
@@ -252,51 +269,20 @@ do
echo "$0: no destination specified." >&2
exit 1
fi
-
dst=$dst_arg
- # Protect names starting with `-'.
- case $dst in
- -*) dst=./$dst;;
- esac
# If destination is a directory, append the input filename; won't work
# if double slashes aren't ignored.
if test -d "$dst"; then
- if test -n "$no_target_directory"; then
- echo "$0: $dst_arg: Is a directory" >&2
- exit 1
+ if test "$is_target_a_directory" = never; then
+ echo "$0: $dst_arg: Is a directory" >&2
+ exit 1
fi
dstdir=$dst
dst=$dstdir/`basename "$src"`
dstdir_status=0
else
- # Prefer dirname, but fall back on a substitute if dirname fails.
- dstdir=`
- (dirname "$dst") 2>/dev/null ||
- expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$dst" : 'X\(//\)[^/]' \| \
- X"$dst" : 'X\(//\)$' \| \
- X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
- echo X"$dst" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
- s//\1/
- q
- }
- /^X\(\/\/\)[^/].*/{
- s//\1/
- q
- }
- /^X\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'
- `
-
+ dstdir=`dirname "$dst"`
test -d "$dstdir"
dstdir_status=$?
fi
@@ -307,74 +293,74 @@ do
if test $dstdir_status != 0; then
case $posix_mkdir in
'')
- # Create intermediate dirs using mode 755 as modified by the umask.
- # This is like FreeBSD 'install' as of 1997-10-28.
- umask=`umask`
- case $stripcmd.$umask in
- # Optimize common cases.
- *[2367][2367]) mkdir_umask=$umask;;
- .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
-
- *[0-7])
- mkdir_umask=`expr $umask + 22 \
- - $umask % 100 % 40 + $umask % 20 \
- - $umask % 10 % 4 + $umask % 2
- `;;
- *) mkdir_umask=$umask,go-w;;
- esac
-
- # With -d, create the new directory with the user-specified mode.
- # Otherwise, rely on $mkdir_umask.
- if test -n "$dir_arg"; then
- mkdir_mode=-m$mode
- else
- mkdir_mode=
- fi
-
- posix_mkdir=false
- case $umask in
- *[123567][0-7][0-7])
- # POSIX mkdir -p sets u+wx bits regardless of umask, which
- # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
- ;;
- *)
- tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
- trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
-
- if (umask $mkdir_umask &&
- exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
- then
- if test -z "$dir_arg" || {
- # Check for POSIX incompatibilities with -m.
- # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
- # other-writeable bit of parent directory when it shouldn't.
- # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
- ls_ld_tmpdir=`ls -ld "$tmpdir"`
- case $ls_ld_tmpdir in
- d????-?r-*) different_mode=700;;
- d????-?--*) different_mode=755;;
- *) false;;
- esac &&
- $mkdirprog -m$different_mode -p -- "$tmpdir" && {
- ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
- test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
- }
- }
- then posix_mkdir=:
- fi
- rmdir "$tmpdir/d" "$tmpdir"
- else
- # Remove any dirs left behind by ancient mkdir implementations.
- rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
- fi
- trap '' 0;;
- esac;;
+ # Create intermediate dirs using mode 755 as modified by the umask.
+ # This is like FreeBSD 'install' as of 1997-10-28.
+ umask=`umask`
+ case $stripcmd.$umask in
+ # Optimize common cases.
+ *[2367][2367]) mkdir_umask=$umask;;
+ .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+ *[0-7])
+ mkdir_umask=`expr $umask + 22 \
+ - $umask % 100 % 40 + $umask % 20 \
+ - $umask % 10 % 4 + $umask % 2
+ `;;
+ *) mkdir_umask=$umask,go-w;;
+ esac
+
+ # With -d, create the new directory with the user-specified mode.
+ # Otherwise, rely on $mkdir_umask.
+ if test -n "$dir_arg"; then
+ mkdir_mode=-m$mode
+ else
+ mkdir_mode=
+ fi
+
+ posix_mkdir=false
+ case $umask in
+ *[123567][0-7][0-7])
+ # POSIX mkdir -p sets u+wx bits regardless of umask, which
+ # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+ ;;
+ *)
+ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+ if (umask $mkdir_umask &&
+ exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+ then
+ if test -z "$dir_arg" || {
+ # Check for POSIX incompatibilities with -m.
+ # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+ # other-writable bit of parent directory when it shouldn't.
+ # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+ ls_ld_tmpdir=`ls -ld "$tmpdir"`
+ case $ls_ld_tmpdir in
+ d????-?r-*) different_mode=700;;
+ d????-?--*) different_mode=755;;
+ *) false;;
+ esac &&
+ $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+ ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+ test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+ }
+ }
+ then posix_mkdir=:
+ fi
+ rmdir "$tmpdir/d" "$tmpdir"
+ else
+ # Remove any dirs left behind by ancient mkdir implementations.
+ rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+ fi
+ trap '' 0;;
+ esac;;
esac
if
$posix_mkdir && (
- umask $mkdir_umask &&
- $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+ umask $mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
)
then :
else
@@ -384,53 +370,51 @@ do
# directory the slow way, step by step, checking for races as we go.
case $dstdir in
- /*) prefix='/';;
- -*) prefix='./';;
- *) prefix='';;
+ /*) prefix='/';;
+ [-=\(\)!]*) prefix='./';;
+ *) prefix='';;
esac
- eval "$initialize_posix_glob"
-
oIFS=$IFS
IFS=/
- $posix_glob set -f
+ set -f
set fnord $dstdir
shift
- $posix_glob set +f
+ set +f
IFS=$oIFS
prefixes=
for d
do
- test -z "$d" && continue
-
- prefix=$prefix$d
- if test -d "$prefix"; then
- prefixes=
- else
- if $posix_mkdir; then
- (umask=$mkdir_umask &&
- $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
- # Don't fail if two instances are running concurrently.
- test -d "$prefix" || exit 1
- else
- case $prefix in
- *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
- *) qprefix=$prefix;;
- esac
- prefixes="$prefixes '$qprefix'"
- fi
- fi
- prefix=$prefix/
+ test X"$d" = X && continue
+
+ prefix=$prefix$d
+ if test -d "$prefix"; then
+ prefixes=
+ else
+ if $posix_mkdir; then
+ (umask=$mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+ # Don't fail if two instances are running concurrently.
+ test -d "$prefix" || exit 1
+ else
+ case $prefix in
+ *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) qprefix=$prefix;;
+ esac
+ prefixes="$prefixes '$qprefix'"
+ fi
+ fi
+ prefix=$prefix/
done
if test -n "$prefixes"; then
- # Don't fail if two instances are running concurrently.
- (umask $mkdir_umask &&
- eval "\$doit_exec \$mkdirprog $prefixes") ||
- test -d "$dstdir" || exit 1
- obsolete_mkdir_used=true
+ # Don't fail if two instances are running concurrently.
+ (umask $mkdir_umask &&
+ eval "\$doit_exec \$mkdirprog $prefixes") ||
+ test -d "$dstdir" || exit 1
+ obsolete_mkdir_used=true
fi
fi
fi
@@ -465,15 +449,12 @@ do
# If -C, don't bother to copy if it wouldn't change the file.
if $copy_on_change &&
- old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
- new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
-
- eval "$initialize_posix_glob" &&
- $posix_glob set -f &&
+ old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
+ new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
+ set -f &&
set X $old && old=:$2:$4:$5:$6 &&
set X $new && new=:$2:$4:$5:$6 &&
- $posix_glob set +f &&
-
+ set +f &&
test "$old" = "$new" &&
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
then
@@ -486,24 +467,24 @@ do
# to itself, or perhaps because mv is so ancient that it does not
# support -f.
{
- # Now remove or move aside any old file at destination location.
- # We try this two ways since rm can't unlink itself on some
- # systems and the destination file might be busy for other
- # reasons. In this case, the final cleanup might fail but the new
- # file should still install successfully.
- {
- test ! -f "$dst" ||
- $doit $rmcmd -f "$dst" 2>/dev/null ||
- { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
- { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
- } ||
- { echo "$0: cannot unlink or rename $dst" >&2
- (exit 1); exit 1
- }
- } &&
-
- # Now rename the file to the real destination.
- $doit $mvcmd "$dsttmp" "$dst"
+ # Now remove or move aside any old file at destination location.
+ # We try this two ways since rm can't unlink itself on some
+ # systems and the destination file might be busy for other
+ # reasons. In this case, the final cleanup might fail but the new
+ # file should still install successfully.
+ {
+ test ! -f "$dst" ||
+ $doit $rmcmd -f "$dst" 2>/dev/null ||
+ { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+ { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+ } ||
+ { echo "$0: cannot unlink or rename $dst" >&2
+ (exit 1); exit 1
+ }
+ } &&
+
+ # Now rename the file to the real destination.
+ $doit $mvcmd "$dsttmp" "$dst"
}
fi || exit 1
diff --git a/3rdparty/libjpeg/install.txt b/3rdparty/libjpeg/install.txt
index 2ee86adf458..0cec9b872e1 100644
--- a/3rdparty/libjpeg/install.txt
+++ b/3rdparty/libjpeg/install.txt
@@ -1,6 +1,6 @@
INSTALLATION INSTRUCTIONS for the Independent JPEG Group's JPEG software
-Copyright (C) 1991-2010, Thomas G. Lane, Guido Vollbeding.
+Copyright (C) 1991-2015, Thomas G. Lane, Guido Vollbeding.
This file is part of the Independent JPEG Group's software.
For conditions of distribution and use, see the accompanying README file.
@@ -147,9 +147,10 @@ makefile.bcc jconfig.bcc MS-DOS or OS/2, Borland C
makefile.dj jconfig.dj MS-DOS, DJGPP (Delorie's port of GNU C)
makefile.mc6 jconfig.mc6 MS-DOS, Microsoft C (16-bit only)
makefile.wat jconfig.wat MS-DOS, OS/2, or Windows NT, Watcom C
-makefile.vc jconfig.vc Windows NT/95, MS Visual C++
-make*.vc6 jconfig.vc Windows NT/95, MS Visual C++ 6
-make*.v10 jconfig.vc Windows NT/95, MS Visual C++ 2010 (v10)
+makefile.vc jconfig.vc Windows NT/9x, MS Visual C++
+make*.vc6 jconfig.vc Windows NT/9x, MS Visual C++ 6
+make*.v10 jconfig.vc Windows NT/9x, MS Visual C++ 2010 (v10)
+makefile.b32 jconfig.vc Windows NT/9x, Borland C++ 32-bit (bcc32)
makefile.mms jconfig.vms Digital VMS, with MMS software
makefile.vms jconfig.vms Digital VMS, without MMS software
@@ -321,9 +322,9 @@ several forms:
testimg.jpg The output of cjpeg testimg.ppm
testprog.jpg Progressive-mode equivalent of testorig.jpg.
testimgp.jpg The output of cjpeg -progressive -optimize testimg.ppm
-(The first- and second-generation .jpg files aren't identical since JPEG is
-lossy.) If you can generate duplicates of the testimg* files then you
-probably have working programs.
+(The first- and second-generation .jpg files aren't identical since the
+default compression parameters are lossy.) If you can generate duplicates
+of the testimg* files then you probably have working programs.
With most of the makefiles, "make test" will perform the necessary
comparisons.
@@ -418,54 +419,58 @@ support as follows:
the directory containing the URT "librle.a" file (typically the
"lib" subdirectory of the URT distribution).
-Support for 12-bit-deep pixel data:
+Support for 9-bit to 12-bit deep pixel data:
-The JPEG standard allows either 8-bit or 12-bit data precision. (For color,
-this means 8 or 12 bits per channel, of course.) If you need to work with
-deeper than 8-bit data, you can compile the IJG code for 12-bit operation.
+The IJG code currently allows 8, 9, 10, 11, or 12 bits sample data precision.
+(For color, this means 8 to 12 bits per channel, of course.) If you need to
+work with deeper than 8-bit data, you can compile the IJG code for 9-bit to
+12-bit operation.
To do so:
- 1. In jmorecfg.h, define BITS_IN_JSAMPLE as 12 rather than 8.
+ 1. In jmorecfg.h, define BITS_IN_JSAMPLE as 9, 10, 11, or 12 rather than 8.
2. In jconfig.h, undefine BMP_SUPPORTED, RLE_SUPPORTED, and TARGA_SUPPORTED,
- because the code for those formats doesn't handle 12-bit data and won't
- even compile. (The PPM code does work, as explained below. The GIF
- code works too; it scales 8-bit GIF data to and from 12-bit depth
- automatically.)
+ because the code for those formats doesn't handle deeper than 8-bit data
+ and won't even compile. (The PPM code does work, as explained below.
+ The GIF code works too; it scales 8-bit GIF data to and from 12-bit
+ depth automatically.)
3. Compile. Don't expect "make test" to pass, since the supplied test
files are for 8-bit data.
-Currently, 12-bit support does not work on 16-bit-int machines.
+Currently, 9-bit to 12-bit support does not work on 16-bit-int machines.
-Note that a 12-bit version will not read 8-bit JPEG files, nor vice versa;
-so you'll want to keep around a regular 8-bit compilation as well.
-(Run-time selection of data depth, to allow a single copy that does both,
-is possible but would probably slow things down considerably; it's very low
-on our to-do list.)
+Run-time selection and conversion of data precision are currently not
+supported and may be added later.
+Exception: The transcoding part (jpegtran) supports all settings in a
+single instance, since it operates on the level of DCT coefficients and
+not sample values.
-The PPM reader (rdppm.c) can read 12-bit data from either text-format or
-binary-format PPM and PGM files. Binary-format PPM/PGM files which have a
-maxval greater than 255 are assumed to use 2 bytes per sample, MSB first
-(big-endian order). As of early 1995, 2-byte binary format is not
+The PPM reader (rdppm.c) can read deeper than 8-bit data from either
+text-format or binary-format PPM and PGM files. Binary-format PPM/PGM files
+which have a maxval greater than 255 are assumed to use 2 bytes per sample,
+MSB first (big-endian order). As of early 1995, 2-byte binary format is not
officially supported by the PBMPLUS library, but it is expected that a
future release of PBMPLUS will support it. Note that the PPM reader will
read files of any maxval regardless of the BITS_IN_JSAMPLE setting; incoming
-data is automatically rescaled to either maxval=255 or maxval=4095 as
-appropriate for the cjpeg bit depth.
+data is automatically rescaled to maxval=MAXJSAMPLE as appropriate for the
+cjpeg bit depth.
The PPM writer (wrppm.c) will normally write 2-byte binary PPM or PGM
-format, maxval 4095, when compiled with BITS_IN_JSAMPLE=12. Since this
+format, maxval=MAXJSAMPLE, when compiled with BITS_IN_JSAMPLE>8. Since this
format is not yet widely supported, you can disable it by compiling wrppm.c
with PPM_NORAWWORD defined; then the data is scaled down to 8 bits to make a
standard 1-byte/sample PPM or PGM file. (Yes, this means still another copy
of djpeg to keep around. But hopefully you won't need it for very long.
Poskanzer's supposed to get that new PBMPLUS release out Real Soon Now.)
-Of course, if you are working with 12-bit data, you probably have it stored
-in some other, nonstandard format. In that case you'll probably want to
-write your own I/O modules to read and write your format.
+Of course, if you are working with 9-bit to 12-bit data, you probably have
+it stored in some other, nonstandard format. In that case you'll probably
+want to write your own I/O modules to read and write your format.
-Note that a 12-bit version of cjpeg always runs in "-optimize" mode, in
-order to generate valid Huffman tables. This is necessary because our
-default Huffman tables only cover 8-bit data.
+Note:
+The standard Huffman tables are only valid for 8-bit data precision. If
+you selected more than 8-bit data precision, cjpeg uses arithmetic coding
+by default. The Huffman encoder normally uses entropy optimization to
+compute usable tables for higher precision. Otherwise, you'll have to
+supply different default Huffman tables.
Removing code:
@@ -534,17 +539,17 @@ In general, it's worth trying the maximum optimization level of your compiler,
and experimenting with any optional optimizations such as loop unrolling.
(Unfortunately, far too many compilers have optimizer bugs ... be prepared to
back off if the code fails self-test.) If you do any experimentation along
-these lines, please report the optimal settings to jpeg-info@uc.ag so we
-can mention them in future releases. Be sure to specify your machine
-and compiler version.
+these lines, please report the optimal settings to jpeg-info@jpegclub.org so
+we can mention them in future releases. Be sure to specify your machine and
+compiler version.
HINTS FOR SPECIFIC SYSTEMS
==========================
We welcome reports on changes needed for systems not mentioned here. Submit
-'em to jpeg-info@uc.ag. Also, if configure or ckconfig.c is wrong about how
-to configure the JPEG software for your system, please let us know.
+'em to jpeg-info@jpegclub.org. Also, if configure or ckconfig.c is wrong
+about how to configure the JPEG software for your system, please let us know.
Acorn RISC OS:
@@ -848,17 +853,23 @@ with /Oo-.
Microsoft Windows (all versions), generic comments:
Some Windows system include files define typedef boolean as "unsigned char".
-The IJG code also defines typedef boolean, but we make it "int" by default.
+The IJG code also defines typedef boolean, but we make it an "enum" by default.
This doesn't affect the IJG programs because we don't import those Windows
include files. But if you use the JPEG library in your own program, and some
of your program's files import one definition of boolean while some import the
other, you can get all sorts of mysterious problems. A good preventive step
is to make the IJG library use "unsigned char" for boolean. To do that,
add something like this to your jconfig.h file:
- /* Define "boolean" as unsigned char, not int, per Windows custom */
+ /* Define "boolean" as unsigned char, not enum, per Windows custom */
#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
typedef unsigned char boolean;
#endif
+ #ifndef FALSE /* in case these macros already exist */
+ #define FALSE 0 /* values of boolean */
+ #endif
+ #ifndef TRUE
+ #define TRUE 1
+ #endif
#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
(This is already in jconfig.vc, by the way.)
diff --git a/3rdparty/libjpeg/jaricom.c b/3rdparty/libjpeg/jaricom.c
index f43e2ea7fac..690068861fa 100644
--- a/3rdparty/libjpeg/jaricom.c
+++ b/3rdparty/libjpeg/jaricom.c
@@ -1,16 +1,16 @@
/*
* jaricom.c
*
- * Developed 1997-2009 by Guido Vollbeding.
+ * Developed 1997-2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
* This file contains probability estimation tables for common use in
* arithmetic entropy encoding and decoding routines.
*
- * This data represents Table D.2 in the JPEG spec (ISO/IEC IS 10918-1
- * and CCITT Recommendation ITU-T T.81) and Table 24 in the JBIG spec
- * (ISO/IEC IS 11544 and CCITT Recommendation ITU-T T.82).
+ * This data represents Table D.3 in the JPEG spec (D.2 in the draft),
+ * ISO/IEC IS 10918-1 and CCITT Recommendation ITU-T T.81, and Table 24
+ * in the JBIG spec, ISO/IEC IS 11544 and CCITT Recommendation ITU-T T.82.
*/
#define JPEG_INTERNALS
@@ -147,7 +147,7 @@ const INT32 jpeg_aritab[113+1] = {
V( 112, 0x59eb, 112, 111, 1 ),
/*
* This last entry is used for fixed probability estimate of 0.5
- * as recommended in Section 10.3 Table 5 of ITU-T Rec. T.851.
+ * as suggested in Section 10.3 Table 5 of ITU-T Rec. T.851.
*/
V( 113, 0x5a1d, 113, 113, 0 )
};
diff --git a/3rdparty/libjpeg/jcapistd.c b/3rdparty/libjpeg/jcapistd.c
index c0320b1b190..0917afa97dc 100644
--- a/3rdparty/libjpeg/jcapistd.c
+++ b/3rdparty/libjpeg/jcapistd.c
@@ -2,6 +2,7 @@
* jcapistd.c
*
* Copyright (C) 1994-1996, Thomas G. Lane.
+ * Modified 2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -145,7 +146,7 @@ jpeg_write_raw_data (j_compress_ptr cinfo, JSAMPIMAGE data,
(*cinfo->master->pass_startup) (cinfo);
/* Verify that at least one iMCU row has been passed. */
- lines_per_iMCU_row = cinfo->max_v_samp_factor * DCTSIZE;
+ lines_per_iMCU_row = cinfo->max_v_samp_factor * cinfo->min_DCT_v_scaled_size;
if (num_lines < lines_per_iMCU_row)
ERREXIT(cinfo, JERR_BUFFER_SIZE);
diff --git a/3rdparty/libjpeg/jcarith.c b/3rdparty/libjpeg/jcarith.c
index 0b7ea55d404..a64190e72e0 100644
--- a/3rdparty/libjpeg/jcarith.c
+++ b/3rdparty/libjpeg/jcarith.c
@@ -1,7 +1,7 @@
/*
* jcarith.c
*
- * Developed 1997-2009 by Guido Vollbeding.
+ * Developed 1997-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -223,7 +223,7 @@ arith_encode (j_compress_ptr cinfo, unsigned char *st, int val)
register INT32 qe, temp;
register int sv;
- /* Fetch values from our compact representation of Table D.2:
+ /* Fetch values from our compact representation of Table D.3(D.2):
* Qe values and probability estimation state machine
*/
sv = *st;
@@ -362,7 +362,6 @@ METHODDEF(boolean)
encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
{
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
- JBLOCKROW block;
unsigned char *st;
int blkn, ci, tbl;
int v, v2, m;
@@ -381,14 +380,13 @@ encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
/* Encode the MCU data blocks */
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
- block = MCU_data[blkn];
ci = cinfo->MCU_membership[blkn];
tbl = cinfo->cur_comp_info[ci]->dc_tbl_no;
/* Compute the DC value after the required point transform by Al.
* This is simply an arithmetic right shift.
*/
- m = IRIGHT_SHIFT((int) ((*block)[0]), cinfo->Al);
+ m = IRIGHT_SHIFT((int) (MCU_data[blkn][0][0]), cinfo->Al);
/* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */
@@ -453,11 +451,11 @@ METHODDEF(boolean)
encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
{
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
+ const int * natural_order;
JBLOCKROW block;
unsigned char *st;
int tbl, k, ke;
int v, v2, m;
- const int * natural_order;
/* Emit restart marker if needed */
if (cinfo->restart_interval) {
@@ -479,7 +477,8 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
/* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */
/* Establish EOB (end-of-block) index */
- for (ke = cinfo->Se; ke > 0; ke--)
+ ke = cinfo->Se;
+ do {
/* We must apply the point transform by Al. For AC coefficients this
* is an integer division with rounding towards 0. To do this portably
* in C, we shift after obtaining the absolute value.
@@ -490,13 +489,14 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
v = -v;
if (v >>= cinfo->Al) break;
}
+ } while (--ke);
/* Figure F.5: Encode_AC_Coefficients */
- for (k = cinfo->Ss; k <= ke; k++) {
- st = entropy->ac_stats[tbl] + 3 * (k - 1);
+ for (k = cinfo->Ss - 1; k < ke;) {
+ st = entropy->ac_stats[tbl] + 3 * k;
arith_encode(cinfo, st, 0); /* EOB decision */
for (;;) {
- if ((v = (*block)[natural_order[k]]) >= 0) {
+ if ((v = (*block)[natural_order[++k]]) >= 0) {
if (v >>= cinfo->Al) {
arith_encode(cinfo, st + 1, 1);
arith_encode(cinfo, entropy->fixed_bin, 0);
@@ -510,7 +510,8 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
break;
}
}
- arith_encode(cinfo, st + 1, 0); st += 3; k++;
+ arith_encode(cinfo, st + 1, 0);
+ st += 3;
}
st += 2;
/* Figure F.8: Encoding the magnitude category of v */
@@ -537,9 +538,9 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
while (m >>= 1)
arith_encode(cinfo, st, (m & v) ? 1 : 0);
}
- /* Encode EOB decision only if k <= cinfo->Se */
- if (k <= cinfo->Se) {
- st = entropy->ac_stats[tbl] + 3 * (k - 1);
+ /* Encode EOB decision only if k < cinfo->Se */
+ if (k < cinfo->Se) {
+ st = entropy->ac_stats[tbl] + 3 * k;
arith_encode(cinfo, st, 1);
}
@@ -549,6 +550,8 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
/*
* MCU encoding for DC successive approximation refinement scan.
+ * Note: we assume such scans can be multi-component,
+ * although the spec is not very clear on the point.
*/
METHODDEF(boolean)
@@ -590,11 +593,11 @@ METHODDEF(boolean)
encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
{
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
+ const int * natural_order;
JBLOCKROW block;
unsigned char *st;
int tbl, k, ke, kex;
int v;
- const int * natural_order;
/* Emit restart marker if needed */
if (cinfo->restart_interval) {
@@ -616,7 +619,8 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
/* Section G.1.3.3: Encoding of AC coefficients */
/* Establish EOB (end-of-block) index */
- for (ke = cinfo->Se; ke > 0; ke--)
+ ke = cinfo->Se;
+ do {
/* We must apply the point transform by Al. For AC coefficients this
* is an integer division with rounding towards 0. To do this portably
* in C, we shift after obtaining the absolute value.
@@ -627,6 +631,7 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
v = -v;
if (v >>= cinfo->Al) break;
}
+ } while (--ke);
/* Establish EOBx (previous stage end-of-block) index */
for (kex = ke; kex > 0; kex--)
@@ -638,12 +643,12 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
}
/* Figure G.10: Encode_AC_Coefficients_SA */
- for (k = cinfo->Ss; k <= ke; k++) {
- st = entropy->ac_stats[tbl] + 3 * (k - 1);
- if (k > kex)
+ for (k = cinfo->Ss - 1; k < ke;) {
+ st = entropy->ac_stats[tbl] + 3 * k;
+ if (k >= kex)
arith_encode(cinfo, st, 0); /* EOB decision */
for (;;) {
- if ((v = (*block)[natural_order[k]]) >= 0) {
+ if ((v = (*block)[natural_order[++k]]) >= 0) {
if (v >>= cinfo->Al) {
if (v >> 1) /* previously nonzero coef */
arith_encode(cinfo, st + 2, (v & 1));
@@ -665,12 +670,13 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
break;
}
}
- arith_encode(cinfo, st + 1, 0); st += 3; k++;
+ arith_encode(cinfo, st + 1, 0);
+ st += 3;
}
}
- /* Encode EOB decision only if k <= cinfo->Se */
- if (k <= cinfo->Se) {
- st = entropy->ac_stats[tbl] + 3 * (k - 1);
+ /* Encode EOB decision only if k < cinfo->Se */
+ if (k < cinfo->Se) {
+ st = entropy->ac_stats[tbl] + 3 * k;
arith_encode(cinfo, st, 1);
}
@@ -686,12 +692,13 @@ METHODDEF(boolean)
encode_mcu (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
{
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
- jpeg_component_info * compptr;
+ const int * natural_order;
JBLOCKROW block;
unsigned char *st;
- int blkn, ci, tbl, k, ke;
+ int tbl, k, ke;
int v, v2, m;
- const int * natural_order;
+ int blkn, ci;
+ jpeg_component_info * compptr;
/* Emit restart marker if needed */
if (cinfo->restart_interval) {
@@ -765,18 +772,21 @@ encode_mcu (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
/* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */
+ if ((ke = cinfo->lim_Se) == 0) continue;
tbl = compptr->ac_tbl_no;
/* Establish EOB (end-of-block) index */
- for (ke = cinfo->lim_Se; ke > 0; ke--)
+ do {
if ((*block)[natural_order[ke]]) break;
+ } while (--ke);
/* Figure F.5: Encode_AC_Coefficients */
- for (k = 1; k <= ke; k++) {
- st = entropy->ac_stats[tbl] + 3 * (k - 1);
+ for (k = 0; k < ke;) {
+ st = entropy->ac_stats[tbl] + 3 * k;
arith_encode(cinfo, st, 0); /* EOB decision */
- while ((v = (*block)[natural_order[k]]) == 0) {
- arith_encode(cinfo, st + 1, 0); st += 3; k++;
+ while ((v = (*block)[natural_order[++k]]) == 0) {
+ arith_encode(cinfo, st + 1, 0);
+ st += 3;
}
arith_encode(cinfo, st + 1, 1);
/* Figure F.6: Encoding nonzero value v */
@@ -812,9 +822,9 @@ encode_mcu (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
while (m >>= 1)
arith_encode(cinfo, st, (m & v) ? 1 : 0);
}
- /* Encode EOB decision only if k <= cinfo->lim_Se */
- if (k <= cinfo->lim_Se) {
- st = entropy->ac_stats[tbl] + 3 * (k - 1);
+ /* Encode EOB decision only if k < cinfo->lim_Se */
+ if (k < cinfo->lim_Se) {
+ st = entropy->ac_stats[tbl] + 3 * k;
arith_encode(cinfo, st, 1);
}
}
@@ -919,7 +929,7 @@ jinit_arith_encoder (j_compress_ptr cinfo)
entropy = (arith_entropy_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(arith_entropy_encoder));
- cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
+ cinfo->entropy = &entropy->pub;
entropy->pub.start_pass = start_pass;
entropy->pub.finish_pass = finish_pass;
diff --git a/3rdparty/libjpeg/jccoefct.c b/3rdparty/libjpeg/jccoefct.c
index d775313b86f..924a703dda2 100644
--- a/3rdparty/libjpeg/jccoefct.c
+++ b/3rdparty/libjpeg/jccoefct.c
@@ -2,6 +2,7 @@
* jccoefct.c
*
* Copyright (C) 1994-1997, Thomas G. Lane.
+ * Modified 2003-2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -183,16 +184,16 @@ compress_data (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
ypos, xpos, (JDIMENSION) blockcnt);
if (blockcnt < compptr->MCU_width) {
/* Create some dummy blocks at the right edge of the image. */
- jzero_far((void FAR *) coef->MCU_buffer[blkn + blockcnt],
- (compptr->MCU_width - blockcnt) * SIZEOF(JBLOCK));
+ FMEMZERO((void FAR *) coef->MCU_buffer[blkn + blockcnt],
+ (compptr->MCU_width - blockcnt) * SIZEOF(JBLOCK));
for (bi = blockcnt; bi < compptr->MCU_width; bi++) {
coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn+bi-1][0][0];
}
}
} else {
/* Create a row of dummy blocks at the bottom of the image. */
- jzero_far((void FAR *) coef->MCU_buffer[blkn],
- compptr->MCU_width * SIZEOF(JBLOCK));
+ FMEMZERO((void FAR *) coef->MCU_buffer[blkn],
+ compptr->MCU_width * SIZEOF(JBLOCK));
for (bi = 0; bi < compptr->MCU_width; bi++) {
coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn-1][0][0];
}
@@ -290,7 +291,7 @@ compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
if (ndummy > 0) {
/* Create dummy blocks at the right edge of the image. */
thisblockrow += blocks_across; /* => first dummy block */
- jzero_far((void FAR *) thisblockrow, ndummy * SIZEOF(JBLOCK));
+ FMEMZERO((void FAR *) thisblockrow, ndummy * SIZEOF(JBLOCK));
lastDC = thisblockrow[-1][0];
for (bi = 0; bi < ndummy; bi++) {
thisblockrow[bi][0] = lastDC;
@@ -309,8 +310,8 @@ compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
block_row++) {
thisblockrow = buffer[block_row];
lastblockrow = buffer[block_row-1];
- jzero_far((void FAR *) thisblockrow,
- (size_t) (blocks_across * SIZEOF(JBLOCK)));
+ FMEMZERO((void FAR *) thisblockrow,
+ (size_t) (blocks_across * SIZEOF(JBLOCK)));
for (MCUindex = 0; MCUindex < MCUs_across; MCUindex++) {
lastDC = lastblockrow[h_samp_factor-1][0];
for (bi = 0; bi < h_samp_factor; bi++) {
diff --git a/3rdparty/libjpeg/jccolor.c b/3rdparty/libjpeg/jccolor.c
index 0a8a4b5d13c..f6b4a493fda 100644
--- a/3rdparty/libjpeg/jccolor.c
+++ b/3rdparty/libjpeg/jccolor.c
@@ -2,6 +2,7 @@
* jccolor.c
*
* Copyright (C) 1991-1996, Thomas G. Lane.
+ * Modified 2011-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -28,13 +29,25 @@ typedef my_color_converter * my_cconvert_ptr;
/**************** RGB -> YCbCr conversion: most common case **************/
/*
- * YCbCr is defined per CCIR 601-1, except that Cb and Cr are
- * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
- * The conversion equations to be implemented are therefore
- * Y = 0.29900 * R + 0.58700 * G + 0.11400 * B
- * Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B + CENTERJSAMPLE
- * Cr = 0.50000 * R - 0.41869 * G - 0.08131 * B + CENTERJSAMPLE
- * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)
+ * YCbCr is defined per Recommendation ITU-R BT.601-7 (03/2011),
+ * previously known as Recommendation CCIR 601-1, except that Cb and Cr
+ * are normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
+ * sRGB (standard RGB color space) is defined per IEC 61966-2-1:1999.
+ * sYCC (standard luma-chroma-chroma color space with extended gamut)
+ * is defined per IEC 61966-2-1:1999 Amendment A1:2003 Annex F.
+ * bg-sRGB and bg-sYCC (big gamut standard color spaces)
+ * are defined per IEC 61966-2-1:1999 Amendment A1:2003 Annex G.
+ * Note that the derived conversion coefficients given in some of these
+ * documents are imprecise. The general conversion equations are
+ * Y = Kr * R + (1 - Kr - Kb) * G + Kb * B
+ * Cb = 0.5 * (B - Y) / (1 - Kb)
+ * Cr = 0.5 * (R - Y) / (1 - Kr)
+ * With Kr = 0.299 and Kb = 0.114 (derived according to SMPTE RP 177-1993
+ * from the 1953 FCC NTSC primaries and CIE Illuminant C),
+ * the conversion equations to be implemented are therefore
+ * Y = 0.299 * R + 0.587 * G + 0.114 * B
+ * Cb = -0.168735892 * R - 0.331264108 * G + 0.5 * B + CENTERJSAMPLE
+ * Cr = 0.5 * R - 0.418687589 * G - 0.081312411 * B + CENTERJSAMPLE
* Note: older versions of the IJG code used a zero offset of MAXJSAMPLE/2,
* rather than CENTERJSAMPLE, for Cb and Cr. This gave equal positive and
* negative swings for Cb/Cr, but meant that grayscale values (Cb=Cr=0)
@@ -48,9 +61,9 @@ typedef my_color_converter * my_cconvert_ptr;
* For even more speed, we avoid doing any multiplications in the inner loop
* by precalculating the constants times R,G,B for all possible values.
* For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);
- * for 12-bit samples it is still acceptable. It's not very reasonable for
- * 16-bit samples, but if you want lossless storage you shouldn't be changing
- * colorspace anyway.
+ * for 9-bit to 12-bit samples it is still acceptable. It's not very
+ * reasonable for 16-bit samples, but if you want lossless storage you
+ * shouldn't be changing colorspace anyway.
* The CENTERJSAMPLE offsets and the rounding fudge-factor of 0.5 are included
* in the tables to save adding them separately in the inner loop.
*/
@@ -95,21 +108,21 @@ rgb_ycc_start (j_compress_ptr cinfo)
(TABLE_SIZE * SIZEOF(INT32)));
for (i = 0; i <= MAXJSAMPLE; i++) {
- rgb_ycc_tab[i+R_Y_OFF] = FIX(0.29900) * i;
- rgb_ycc_tab[i+G_Y_OFF] = FIX(0.58700) * i;
- rgb_ycc_tab[i+B_Y_OFF] = FIX(0.11400) * i + ONE_HALF;
- rgb_ycc_tab[i+R_CB_OFF] = (-FIX(0.16874)) * i;
- rgb_ycc_tab[i+G_CB_OFF] = (-FIX(0.33126)) * i;
+ rgb_ycc_tab[i+R_Y_OFF] = FIX(0.299) * i;
+ rgb_ycc_tab[i+G_Y_OFF] = FIX(0.587) * i;
+ rgb_ycc_tab[i+B_Y_OFF] = FIX(0.114) * i + ONE_HALF;
+ rgb_ycc_tab[i+R_CB_OFF] = (-FIX(0.168735892)) * i;
+ rgb_ycc_tab[i+G_CB_OFF] = (-FIX(0.331264108)) * i;
/* We use a rounding fudge-factor of 0.5-epsilon for Cb and Cr.
* This ensures that the maximum output will round to MAXJSAMPLE
* not MAXJSAMPLE+1, and thus that we don't have to range-limit.
*/
- rgb_ycc_tab[i+B_CB_OFF] = FIX(0.50000) * i + CBCR_OFFSET + ONE_HALF-1;
+ rgb_ycc_tab[i+B_CB_OFF] = FIX(0.5) * i + CBCR_OFFSET + ONE_HALF-1;
/* B=>Cb and R=>Cr tables are the same
- rgb_ycc_tab[i+R_CR_OFF] = FIX(0.50000) * i + CBCR_OFFSET + ONE_HALF-1;
+ rgb_ycc_tab[i+R_CR_OFF] = FIX(0.5) * i + CBCR_OFFSET + ONE_HALF-1;
*/
- rgb_ycc_tab[i+G_CR_OFF] = (-FIX(0.41869)) * i;
- rgb_ycc_tab[i+B_CR_OFF] = (-FIX(0.08131)) * i;
+ rgb_ycc_tab[i+G_CR_OFF] = (-FIX(0.418687589)) * i;
+ rgb_ycc_tab[i+B_CR_OFF] = (-FIX(0.081312411)) * i;
}
}
@@ -132,8 +145,8 @@ rgb_ycc_convert (j_compress_ptr cinfo,
JDIMENSION output_row, int num_rows)
{
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
- register int r, g, b;
register INT32 * ctab = cconvert->rgb_ycc_tab;
+ register int r, g, b;
register JSAMPROW inptr;
register JSAMPROW outptr0, outptr1, outptr2;
register JDIMENSION col;
@@ -149,7 +162,6 @@ rgb_ycc_convert (j_compress_ptr cinfo,
r = GETJSAMPLE(inptr[RGB_RED]);
g = GETJSAMPLE(inptr[RGB_GREEN]);
b = GETJSAMPLE(inptr[RGB_BLUE]);
- inptr += RGB_PIXELSIZE;
/* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
* must be too; we do not need an explicit range-limiting operation.
* Hence the value being shifted is never negative, and we don't
@@ -167,6 +179,7 @@ rgb_ycc_convert (j_compress_ptr cinfo,
outptr2[col] = (JSAMPLE)
((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
>> SCALEBITS);
+ inptr += RGB_PIXELSIZE;
}
}
}
@@ -188,8 +201,8 @@ rgb_gray_convert (j_compress_ptr cinfo,
JDIMENSION output_row, int num_rows)
{
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
- register int r, g, b;
register INT32 * ctab = cconvert->rgb_ycc_tab;
+ register int r, g, b;
register JSAMPROW inptr;
register JSAMPROW outptr;
register JDIMENSION col;
@@ -197,17 +210,16 @@ rgb_gray_convert (j_compress_ptr cinfo,
while (--num_rows >= 0) {
inptr = *input_buf++;
- outptr = output_buf[0][output_row];
- output_row++;
+ outptr = output_buf[0][output_row++];
for (col = 0; col < num_cols; col++) {
r = GETJSAMPLE(inptr[RGB_RED]);
g = GETJSAMPLE(inptr[RGB_GREEN]);
b = GETJSAMPLE(inptr[RGB_BLUE]);
- inptr += RGB_PIXELSIZE;
/* Y */
outptr[col] = (JSAMPLE)
((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
>> SCALEBITS);
+ inptr += RGB_PIXELSIZE;
}
}
}
@@ -227,8 +239,8 @@ cmyk_ycck_convert (j_compress_ptr cinfo,
JDIMENSION output_row, int num_rows)
{
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
- register int r, g, b;
register INT32 * ctab = cconvert->rgb_ycc_tab;
+ register int r, g, b;
register JSAMPROW inptr;
register JSAMPROW outptr0, outptr1, outptr2, outptr3;
register JDIMENSION col;
@@ -247,7 +259,6 @@ cmyk_ycck_convert (j_compress_ptr cinfo,
b = MAXJSAMPLE - GETJSAMPLE(inptr[2]);
/* K passes through as-is */
outptr3[col] = inptr[3]; /* don't need GETJSAMPLE here */
- inptr += 4;
/* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
* must be too; we do not need an explicit range-limiting operation.
* Hence the value being shifted is never negative, and we don't
@@ -265,6 +276,49 @@ cmyk_ycck_convert (j_compress_ptr cinfo,
outptr2[col] = (JSAMPLE)
((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
>> SCALEBITS);
+ inptr += 4;
+ }
+ }
+}
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
+ * [R,G,B] to [R-G,G,B-G] conversion with modulo calculation
+ * (forward reversible color transform).
+ * This can be seen as an adaption of the general RGB->YCbCr
+ * conversion equation with Kr = Kb = 0, while replacing the
+ * normalization by modulo calculation.
+ */
+
+METHODDEF(void)
+rgb_rgb1_convert (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows)
+{
+ register int r, g, b;
+ register JSAMPROW inptr;
+ register JSAMPROW outptr0, outptr1, outptr2;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->image_width;
+
+ while (--num_rows >= 0) {
+ inptr = *input_buf++;
+ outptr0 = output_buf[0][output_row];
+ outptr1 = output_buf[1][output_row];
+ outptr2 = output_buf[2][output_row];
+ output_row++;
+ for (col = 0; col < num_cols; col++) {
+ r = GETJSAMPLE(inptr[RGB_RED]);
+ g = GETJSAMPLE(inptr[RGB_GREEN]);
+ b = GETJSAMPLE(inptr[RGB_BLUE]);
+ /* Assume that MAXJSAMPLE+1 is a power of 2, so that the MOD
+ * (modulo) operator is equivalent to the bitmask operator AND.
+ */
+ outptr0[col] = (JSAMPLE) ((r - g + CENTERJSAMPLE) & MAXJSAMPLE);
+ outptr1[col] = (JSAMPLE) g;
+ outptr2[col] = (JSAMPLE) ((b - g + CENTERJSAMPLE) & MAXJSAMPLE);
+ inptr += RGB_PIXELSIZE;
}
}
}
@@ -273,7 +327,7 @@ cmyk_ycck_convert (j_compress_ptr cinfo,
/*
* Convert some rows of samples to the JPEG colorspace.
* This version handles grayscale output with no conversion.
- * The source can be either plain grayscale or YCbCr (since Y == gray).
+ * The source can be either plain grayscale or YCC (since Y == gray).
*/
METHODDEF(void)
@@ -281,16 +335,15 @@ grayscale_convert (j_compress_ptr cinfo,
JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
JDIMENSION output_row, int num_rows)
{
+ int instride = cinfo->input_components;
register JSAMPROW inptr;
register JSAMPROW outptr;
register JDIMENSION col;
JDIMENSION num_cols = cinfo->image_width;
- int instride = cinfo->input_components;
while (--num_rows >= 0) {
inptr = *input_buf++;
- outptr = output_buf[0][output_row];
- output_row++;
+ outptr = output_buf[0][output_row++];
for (col = 0; col < num_cols; col++) {
outptr[col] = inptr[0]; /* don't need GETJSAMPLE() here */
inptr += instride;
@@ -301,6 +354,39 @@ grayscale_convert (j_compress_ptr cinfo,
/*
* Convert some rows of samples to the JPEG colorspace.
+ * No colorspace conversion, but change from interleaved
+ * to separate-planes representation.
+ */
+
+METHODDEF(void)
+rgb_convert (j_compress_ptr cinfo,
+ JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
+ JDIMENSION output_row, int num_rows)
+{
+ register JSAMPROW inptr;
+ register JSAMPROW outptr0, outptr1, outptr2;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->image_width;
+
+ while (--num_rows >= 0) {
+ inptr = *input_buf++;
+ outptr0 = output_buf[0][output_row];
+ outptr1 = output_buf[1][output_row];
+ outptr2 = output_buf[2][output_row];
+ output_row++;
+ for (col = 0; col < num_cols; col++) {
+ /* We can dispense with GETJSAMPLE() here */
+ outptr0[col] = inptr[RGB_RED];
+ outptr1[col] = inptr[RGB_GREEN];
+ outptr2[col] = inptr[RGB_BLUE];
+ inptr += RGB_PIXELSIZE;
+ }
+ }
+}
+
+
+/*
+ * Convert some rows of samples to the JPEG colorspace.
* This version handles multi-component colorspaces without conversion.
* We assume input_components == num_components.
*/
@@ -310,20 +396,20 @@ null_convert (j_compress_ptr cinfo,
JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
JDIMENSION output_row, int num_rows)
{
+ int ci;
+ register int nc = cinfo->num_components;
register JSAMPROW inptr;
register JSAMPROW outptr;
register JDIMENSION col;
- register int ci;
- int nc = cinfo->num_components;
JDIMENSION num_cols = cinfo->image_width;
while (--num_rows >= 0) {
/* It seems fastest to make a separate pass for each component. */
for (ci = 0; ci < nc; ci++) {
- inptr = *input_buf;
+ inptr = input_buf[0] + ci;
outptr = output_buf[ci][output_row];
for (col = 0; col < num_cols; col++) {
- outptr[col] = inptr[ci]; /* don't need GETJSAMPLE() here */
+ *outptr++ = *inptr; /* don't need GETJSAMPLE() here */
inptr += nc;
}
}
@@ -356,7 +442,7 @@ jinit_color_converter (j_compress_ptr cinfo)
cconvert = (my_cconvert_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_color_converter));
- cinfo->cconvert = (struct jpeg_color_converter *) cconvert;
+ cinfo->cconvert = &cconvert->pub;
/* set start_pass to null method until we find out differently */
cconvert->pub.start_pass = null_method;
@@ -368,13 +454,13 @@ jinit_color_converter (j_compress_ptr cinfo)
break;
case JCS_RGB:
-#if RGB_PIXELSIZE != 3
+ case JCS_BG_RGB:
if (cinfo->input_components != RGB_PIXELSIZE)
ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
break;
-#endif /* else share code with YCbCr */
case JCS_YCbCr:
+ case JCS_BG_YCC:
if (cinfo->input_components != 3)
ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
break;
@@ -391,41 +477,96 @@ jinit_color_converter (j_compress_ptr cinfo)
break;
}
+ /* Support color transform only for RGB colorspaces */
+ if (cinfo->color_transform &&
+ cinfo->jpeg_color_space != JCS_RGB &&
+ cinfo->jpeg_color_space != JCS_BG_RGB)
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+
/* Check num_components, set conversion method based on requested space */
switch (cinfo->jpeg_color_space) {
case JCS_GRAYSCALE:
if (cinfo->num_components != 1)
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
- if (cinfo->in_color_space == JCS_GRAYSCALE)
+ switch (cinfo->in_color_space) {
+ case JCS_GRAYSCALE:
+ case JCS_YCbCr:
+ case JCS_BG_YCC:
cconvert->pub.color_convert = grayscale_convert;
- else if (cinfo->in_color_space == JCS_RGB) {
+ break;
+ case JCS_RGB:
cconvert->pub.start_pass = rgb_ycc_start;
cconvert->pub.color_convert = rgb_gray_convert;
- } else if (cinfo->in_color_space == JCS_YCbCr)
- cconvert->pub.color_convert = grayscale_convert;
- else
+ break;
+ default:
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ }
break;
case JCS_RGB:
+ case JCS_BG_RGB:
if (cinfo->num_components != 3)
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
- if (cinfo->in_color_space == JCS_RGB && RGB_PIXELSIZE == 3)
- cconvert->pub.color_convert = null_convert;
- else
+ if (cinfo->in_color_space == cinfo->jpeg_color_space) {
+ switch (cinfo->color_transform) {
+ case JCT_NONE:
+ cconvert->pub.color_convert = rgb_convert;
+ break;
+ case JCT_SUBTRACT_GREEN:
+ cconvert->pub.color_convert = rgb_rgb1_convert;
+ break;
+ default:
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ }
+ } else
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
break;
case JCS_YCbCr:
if (cinfo->num_components != 3)
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
- if (cinfo->in_color_space == JCS_RGB) {
+ switch (cinfo->in_color_space) {
+ case JCS_RGB:
cconvert->pub.start_pass = rgb_ycc_start;
cconvert->pub.color_convert = rgb_ycc_convert;
- } else if (cinfo->in_color_space == JCS_YCbCr)
+ break;
+ case JCS_YCbCr:
cconvert->pub.color_convert = null_convert;
- else
+ break;
+ default:
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ }
+ break;
+
+ case JCS_BG_YCC:
+ if (cinfo->num_components != 3)
+ ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
+ switch (cinfo->in_color_space) {
+ case JCS_RGB:
+ /* For conversion from normal RGB input to BG_YCC representation,
+ * the Cb/Cr values are first computed as usual, and then
+ * quantized further after DCT processing by a factor of
+ * 2 in reference to the nominal quantization factor.
+ */
+ /* need quantization scale by factor of 2 after DCT */
+ cinfo->comp_info[1].component_needed = TRUE;
+ cinfo->comp_info[2].component_needed = TRUE;
+ /* compute normal YCC first */
+ cconvert->pub.start_pass = rgb_ycc_start;
+ cconvert->pub.color_convert = rgb_ycc_convert;
+ break;
+ case JCS_YCbCr:
+ /* need quantization scale by factor of 2 after DCT */
+ cinfo->comp_info[1].component_needed = TRUE;
+ cinfo->comp_info[2].component_needed = TRUE;
+ /*FALLTHROUGH*/
+ case JCS_BG_YCC:
+ /* Pass through for BG_YCC input */
+ cconvert->pub.color_convert = null_convert;
+ break;
+ default:
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ }
break;
case JCS_CMYK:
@@ -440,13 +581,17 @@ jinit_color_converter (j_compress_ptr cinfo)
case JCS_YCCK:
if (cinfo->num_components != 4)
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
- if (cinfo->in_color_space == JCS_CMYK) {
+ switch (cinfo->in_color_space) {
+ case JCS_CMYK:
cconvert->pub.start_pass = rgb_ycc_start;
cconvert->pub.color_convert = cmyk_ycck_convert;
- } else if (cinfo->in_color_space == JCS_YCCK)
+ break;
+ case JCS_YCCK:
cconvert->pub.color_convert = null_convert;
- else
+ break;
+ default:
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ }
break;
default: /* allow null conversion of JCS_UNKNOWN */
diff --git a/3rdparty/libjpeg/jcdctmgr.c b/3rdparty/libjpeg/jcdctmgr.c
index 0bbdbb685d1..fafab91c69b 100644
--- a/3rdparty/libjpeg/jcdctmgr.c
+++ b/3rdparty/libjpeg/jcdctmgr.c
@@ -2,6 +2,7 @@
* jcdctmgr.c
*
* Copyright (C) 1994-1996, Thomas G. Lane.
+ * Modified 2003-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -25,22 +26,30 @@ typedef struct {
/* Pointer to the DCT routine actually in use */
forward_DCT_method_ptr do_dct[MAX_COMPONENTS];
- /* The actual post-DCT divisors --- not identical to the quant table
- * entries, because of scaling (especially for an unnormalized DCT).
- * Each table is given in normal array order.
- */
- DCTELEM * divisors[NUM_QUANT_TBLS];
-
#ifdef DCT_FLOAT_SUPPORTED
/* Same as above for the floating-point case. */
float_DCT_method_ptr do_float_dct[MAX_COMPONENTS];
- FAST_FLOAT * float_divisors[NUM_QUANT_TBLS];
#endif
} my_fdct_controller;
typedef my_fdct_controller * my_fdct_ptr;
+/* The allocated post-DCT divisor tables -- big enough for any
+ * supported variant and not identical to the quant table entries,
+ * because of scaling (especially for an unnormalized DCT) --
+ * are pointed to by dct_table in the per-component comp_info
+ * structures. Each table is given in normal array order.
+ */
+
+typedef union {
+ DCTELEM int_array[DCTSIZE2];
+#ifdef DCT_FLOAT_SUPPORTED
+ FAST_FLOAT float_array[DCTSIZE2];
+#endif
+} divisor_table;
+
+
/* The current scaled-DCT routines require ISLOW-style divisor tables,
* so be sure to compile that code if either ISLOW or SCALING is requested.
*/
@@ -71,7 +80,7 @@ forward_DCT (j_compress_ptr cinfo, jpeg_component_info * compptr,
/* This routine is heavily used, so it's worth coding it tightly. */
my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
forward_DCT_method_ptr do_dct = fdct->do_dct[compptr->component_index];
- DCTELEM * divisors = fdct->divisors[compptr->quant_tbl_no];
+ DCTELEM * divisors = (DCTELEM *) compptr->dct_table;
DCTELEM workspace[DCTSIZE2]; /* work area for FDCT subroutine */
JDIMENSION bi;
@@ -134,7 +143,7 @@ forward_DCT_float (j_compress_ptr cinfo, jpeg_component_info * compptr,
/* This routine is heavily used, so it's worth coding it tightly. */
my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
float_DCT_method_ptr do_dct = fdct->do_float_dct[compptr->component_index];
- FAST_FLOAT * divisors = fdct->float_divisors[compptr->quant_tbl_no];
+ FAST_FLOAT * divisors = (FAST_FLOAT *) compptr->dct_table;
FAST_FLOAT workspace[DCTSIZE2]; /* work area for FDCT subroutine */
JDIMENSION bi;
@@ -352,22 +361,17 @@ start_pass_fdctmgr (j_compress_ptr cinfo)
cinfo->quant_tbl_ptrs[qtblno] == NULL)
ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno);
qtbl = cinfo->quant_tbl_ptrs[qtblno];
- /* Compute divisors for this quant table */
- /* We may do this more than once for same table, but it's not a big deal */
+ /* Create divisor table from quant table */
switch (method) {
#ifdef PROVIDE_ISLOW_TABLES
case JDCT_ISLOW:
/* For LL&M IDCT method, divisors are equal to raw quantization
* coefficients multiplied by 8 (to counteract scaling).
*/
- if (fdct->divisors[qtblno] == NULL) {
- fdct->divisors[qtblno] = (DCTELEM *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- DCTSIZE2 * SIZEOF(DCTELEM));
- }
- dtbl = fdct->divisors[qtblno];
+ dtbl = (DCTELEM *) compptr->dct_table;
for (i = 0; i < DCTSIZE2; i++) {
- dtbl[i] = ((DCTELEM) qtbl->quantval[i]) << 3;
+ dtbl[i] =
+ ((DCTELEM) qtbl->quantval[i]) << (compptr->component_needed ? 4 : 3);
}
fdct->pub.forward_DCT[ci] = forward_DCT;
break;
@@ -395,17 +399,12 @@ start_pass_fdctmgr (j_compress_ptr cinfo)
};
SHIFT_TEMPS
- if (fdct->divisors[qtblno] == NULL) {
- fdct->divisors[qtblno] = (DCTELEM *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- DCTSIZE2 * SIZEOF(DCTELEM));
- }
- dtbl = fdct->divisors[qtblno];
+ dtbl = (DCTELEM *) compptr->dct_table;
for (i = 0; i < DCTSIZE2; i++) {
dtbl[i] = (DCTELEM)
DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i],
(INT32) aanscales[i]),
- CONST_BITS-3);
+ compptr->component_needed ? CONST_BITS-4 : CONST_BITS-3);
}
}
fdct->pub.forward_DCT[ci] = forward_DCT;
@@ -422,25 +421,20 @@ start_pass_fdctmgr (j_compress_ptr cinfo)
* What's actually stored is 1/divisor so that the inner loop can
* use a multiplication rather than a division.
*/
- FAST_FLOAT * fdtbl;
+ FAST_FLOAT * fdtbl = (FAST_FLOAT *) compptr->dct_table;
int row, col;
static const double aanscalefactor[DCTSIZE] = {
1.0, 1.387039845, 1.306562965, 1.175875602,
1.0, 0.785694958, 0.541196100, 0.275899379
};
- if (fdct->float_divisors[qtblno] == NULL) {
- fdct->float_divisors[qtblno] = (FAST_FLOAT *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- DCTSIZE2 * SIZEOF(FAST_FLOAT));
- }
- fdtbl = fdct->float_divisors[qtblno];
i = 0;
for (row = 0; row < DCTSIZE; row++) {
for (col = 0; col < DCTSIZE; col++) {
fdtbl[i] = (FAST_FLOAT)
- (1.0 / (((double) qtbl->quantval[i] *
- aanscalefactor[row] * aanscalefactor[col] * 8.0)));
+ (1.0 / ((double) qtbl->quantval[i] *
+ aanscalefactor[row] * aanscalefactor[col] *
+ (compptr->component_needed ? 16.0 : 8.0)));
i++;
}
}
@@ -464,19 +458,20 @@ GLOBAL(void)
jinit_forward_dct (j_compress_ptr cinfo)
{
my_fdct_ptr fdct;
- int i;
+ int ci;
+ jpeg_component_info *compptr;
fdct = (my_fdct_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_fdct_controller));
- cinfo->fdct = (struct jpeg_forward_dct *) fdct;
+ cinfo->fdct = &fdct->pub;
fdct->pub.start_pass = start_pass_fdctmgr;
- /* Mark divisor tables unallocated */
- for (i = 0; i < NUM_QUANT_TBLS; i++) {
- fdct->divisors[i] = NULL;
-#ifdef DCT_FLOAT_SUPPORTED
- fdct->float_divisors[i] = NULL;
-#endif
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
+ ci++, compptr++) {
+ /* Allocate a divisor table for each component */
+ compptr->dct_table =
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ SIZEOF(divisor_table));
}
}
diff --git a/3rdparty/libjpeg/jchuff.c b/3rdparty/libjpeg/jchuff.c
index abf27d05e8a..d1313f676f6 100644
--- a/3rdparty/libjpeg/jchuff.c
+++ b/3rdparty/libjpeg/jchuff.c
@@ -2,7 +2,7 @@
* jchuff.c
*
* Copyright (C) 1991-1997, Thomas G. Lane.
- * Modified 2006-2009 by Guido Vollbeding.
+ * Modified 2006-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -302,30 +302,33 @@ dump_buffer_e (huff_entropy_ptr entropy)
* between calls, so 24 bits are sufficient.
*/
-/*INLINE*/
+INLINE
LOCAL(boolean)
emit_bits_s (working_state * state, unsigned int code, int size)
/* Emit some bits; return TRUE if successful, FALSE if must suspend */
{
/* This routine is heavily used, so it's worth coding tightly. */
- register INT32 put_buffer = (INT32) code;
- register int put_bits = state->cur.put_bits;
+ register INT32 put_buffer;
+ register int put_bits;
/* if size is 0, caller used an invalid Huffman table entry */
if (size == 0)
ERREXIT(state->cinfo, JERR_HUFF_MISSING_CODE);
- put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */
-
- put_bits += size; /* new number of bits in buffer */
-
+ /* mask off any extra bits in code */
+ put_buffer = ((INT32) code) & ((((INT32) 1) << size) - 1);
+
+ /* new number of bits in buffer */
+ put_bits = size + state->cur.put_bits;
+
put_buffer <<= 24 - put_bits; /* align incoming bits */
- put_buffer |= state->cur.put_buffer; /* and merge with old buffer contents */
-
+ /* and merge with old buffer contents */
+ put_buffer |= state->cur.put_buffer;
+
while (put_bits >= 8) {
int c = (int) ((put_buffer >> 16) & 0xFF);
-
+
emit_byte_s(state, c, return FALSE);
if (c == 0xFF) { /* need to stuff a zero byte? */
emit_byte_s(state, 0, return FALSE);
@@ -341,14 +344,14 @@ emit_bits_s (working_state * state, unsigned int code, int size)
}
-/*INLINE*/
+INLINE
LOCAL(void)
emit_bits_e (huff_entropy_ptr entropy, unsigned int code, int size)
/* Emit some bits, unless we are in gather mode */
{
/* This routine is heavily used, so it's worth coding tightly. */
- register INT32 put_buffer = (INT32) code;
- register int put_bits = entropy->saved.put_bits;
+ register INT32 put_buffer;
+ register int put_bits;
/* if size is 0, caller used an invalid Huffman table entry */
if (size == 0)
@@ -357,9 +360,11 @@ emit_bits_e (huff_entropy_ptr entropy, unsigned int code, int size)
if (entropy->gather_statistics)
return; /* do nothing if we're only getting stats */
- put_buffer &= (((INT32) 1)<<size) - 1; /* mask off any extra bits in code */
-
- put_bits += size; /* new number of bits in buffer */
+ /* mask off any extra bits in code */
+ put_buffer = ((INT32) code) & ((((INT32) 1) << size) - 1);
+
+ /* new number of bits in buffer */
+ put_bits = size + entropy->saved.put_bits;
put_buffer <<= 24 - put_bits; /* align incoming bits */
@@ -406,7 +411,7 @@ flush_bits_e (huff_entropy_ptr entropy)
* Emit (or just count) a Huffman symbol.
*/
-/*INLINE*/
+INLINE
LOCAL(void)
emit_dc_symbol (huff_entropy_ptr entropy, int tbl_no, int symbol)
{
@@ -419,7 +424,7 @@ emit_dc_symbol (huff_entropy_ptr entropy, int tbl_no, int symbol)
}
-/*INLINE*/
+INLINE
LOCAL(void)
emit_ac_symbol (huff_entropy_ptr entropy, int tbl_no, int symbol)
{
@@ -543,10 +548,7 @@ encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
register int temp, temp2;
register int nbits;
- int blkn, ci;
- int Al = cinfo->Al;
- JBLOCKROW block;
- jpeg_component_info * compptr;
+ int blkn, ci, tbl;
ISHIFT_TEMPS
entropy->next_output_byte = cinfo->dest->next_output_byte;
@@ -559,28 +561,27 @@ encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
/* Encode the MCU data blocks */
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
- block = MCU_data[blkn];
ci = cinfo->MCU_membership[blkn];
- compptr = cinfo->cur_comp_info[ci];
+ tbl = cinfo->cur_comp_info[ci]->dc_tbl_no;
/* Compute the DC value after the required point transform by Al.
* This is simply an arithmetic right shift.
*/
- temp2 = IRIGHT_SHIFT((int) ((*block)[0]), Al);
+ temp = IRIGHT_SHIFT((int) (MCU_data[blkn][0][0]), cinfo->Al);
/* DC differences are figured on the point-transformed values. */
- temp = temp2 - entropy->saved.last_dc_val[ci];
- entropy->saved.last_dc_val[ci] = temp2;
+ temp2 = temp - entropy->saved.last_dc_val[ci];
+ entropy->saved.last_dc_val[ci] = temp;
/* Encode the DC coefficient difference per section G.1.2.1 */
- temp2 = temp;
+ temp = temp2;
if (temp < 0) {
temp = -temp; /* temp is abs value of input */
/* For a negative input, want temp2 = bitwise complement of abs(input) */
/* This code assumes we are on a two's complement machine */
temp2--;
}
-
+
/* Find the number of bits needed for the magnitude of the coefficient */
nbits = 0;
while (temp) {
@@ -592,10 +593,10 @@ encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
*/
if (nbits > MAX_COEF_BITS+1)
ERREXIT(cinfo, JERR_BAD_DCT_COEF);
-
+
/* Count/emit the Huffman-coded symbol for the number of bits */
- emit_dc_symbol(entropy, compptr->dc_tbl_no, nbits);
-
+ emit_dc_symbol(entropy, tbl, nbits);
+
/* Emit that number of bits of the value, if positive, */
/* or the complement of its magnitude, if negative. */
if (nbits) /* emit_bits rejects calls with size 0 */
@@ -628,12 +629,12 @@ METHODDEF(boolean)
encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
{
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+ const int * natural_order;
+ JBLOCKROW block;
register int temp, temp2;
register int nbits;
register int r, k;
int Se, Al;
- const int * natural_order;
- JBLOCKROW block;
entropy->next_output_byte = cinfo->dest->next_output_byte;
entropy->free_in_buffer = cinfo->dest->free_in_buffer;
@@ -731,18 +732,15 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
/*
* MCU encoding for DC successive approximation refinement scan.
- * Note: we assume such scans can be multi-component, although the spec
- * is not very clear on the point.
+ * Note: we assume such scans can be multi-component,
+ * although the spec is not very clear on the point.
*/
METHODDEF(boolean)
encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
{
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
- register int temp;
- int blkn;
- int Al = cinfo->Al;
- JBLOCKROW block;
+ int Al, blkn;
entropy->next_output_byte = cinfo->dest->next_output_byte;
entropy->free_in_buffer = cinfo->dest->free_in_buffer;
@@ -752,13 +750,12 @@ encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
if (entropy->restarts_to_go == 0)
emit_restart_e(entropy, entropy->next_restart_num);
+ Al = cinfo->Al;
+
/* Encode the MCU data blocks */
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
- block = MCU_data[blkn];
-
/* We simply emit the Al'th bit of the DC coefficient value. */
- temp = (*block)[0];
- emit_bits_e(entropy, (unsigned int) (temp >> Al), 1);
+ emit_bits_e(entropy, (unsigned int) (MCU_data[blkn][0][0] >> Al), 1);
}
cinfo->dest->next_output_byte = entropy->next_output_byte;
@@ -786,14 +783,14 @@ METHODDEF(boolean)
encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
{
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+ const int * natural_order;
+ JBLOCKROW block;
register int temp;
register int r, k;
+ int Se, Al;
int EOB;
char *BR_buffer;
unsigned int BR;
- int Se, Al;
- const int * natural_order;
- JBLOCKROW block;
int absvalues[DCTSIZE2];
entropy->next_output_byte = cinfo->dest->next_output_byte;
@@ -918,7 +915,7 @@ encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,
{
register int temp, temp2;
register int nbits;
- register int k, r, i;
+ register int r, k;
int Se = state->cinfo->lim_Se;
const int * natural_order = state->cinfo->natural_order;
@@ -960,7 +957,7 @@ encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,
r = 0; /* r = run length of zeros */
for (k = 1; k <= Se; k++) {
- if ((temp = block[natural_order[k]]) == 0) {
+ if ((temp2 = block[natural_order[k]]) == 0) {
r++;
} else {
/* if run length > 15, must emit special run-length-16 codes (0xF0) */
@@ -970,7 +967,7 @@ encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,
r -= 16;
}
- temp2 = temp;
+ temp = temp2;
if (temp < 0) {
temp = -temp; /* temp is abs value of input */
/* This code assumes we are on a two's complement machine */
@@ -986,8 +983,8 @@ encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,
ERREXIT(state->cinfo, JERR_BAD_DCT_COEF);
/* Emit Huffman symbol for run length / number of bits */
- i = (r << 4) + nbits;
- if (! emit_bits_s(state, actbl->ehufco[i], actbl->ehufsi[i]))
+ temp = (r << 4) + nbits;
+ if (! emit_bits_s(state, actbl->ehufco[temp], actbl->ehufsi[temp]))
return FALSE;
/* Emit that number of bits of the value, if positive, */
@@ -1124,16 +1121,16 @@ htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val,
{
register int temp;
register int nbits;
- register int k, r;
+ register int r, k;
int Se = cinfo->lim_Se;
const int * natural_order = cinfo->natural_order;
-
+
/* Encode the DC coefficient difference per section F.1.2.1 */
-
+
temp = block[0] - last_dc_val;
if (temp < 0)
temp = -temp;
-
+
/* Find the number of bits needed for the magnitude of the coefficient */
nbits = 0;
while (temp) {
@@ -1148,11 +1145,11 @@ htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val,
/* Count the Huffman symbol for the number of bits */
dc_counts[nbits]++;
-
+
/* Encode the AC coefficients per section F.1.2.2 */
-
+
r = 0; /* r = run length of zeros */
-
+
for (k = 1; k <= Se; k++) {
if ((temp = block[natural_order[k]]) == 0) {
r++;
@@ -1162,11 +1159,11 @@ htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val,
ac_counts[0xF0]++;
r -= 16;
}
-
+
/* Find the number of bits needed for the magnitude of the coefficient */
if (temp < 0)
temp = -temp;
-
+
/* Find the number of bits needed for the magnitude of the coefficient */
nbits = 1; /* there must be at least one 1 bit */
while ((temp >>= 1))
@@ -1174,10 +1171,10 @@ htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val,
/* Check for out-of-range coefficient values */
if (nbits > MAX_COEF_BITS)
ERREXIT(cinfo, JERR_BAD_DCT_COEF);
-
+
/* Count Huffman symbol for run length / number of bits */
ac_counts[(r << 4) + nbits]++;
-
+
r = 0;
}
}
@@ -1562,7 +1559,7 @@ jinit_huff_encoder (j_compress_ptr cinfo)
entropy = (huff_entropy_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(huff_entropy_encoder));
- cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
+ cinfo->entropy = &entropy->pub;
entropy->pub.start_pass = start_pass_huff;
/* Mark tables unallocated */
diff --git a/3rdparty/libjpeg/jcinit.c b/3rdparty/libjpeg/jcinit.c
index 0ba310f217d..1e13e3462d6 100644
--- a/3rdparty/libjpeg/jcinit.c
+++ b/3rdparty/libjpeg/jcinit.c
@@ -2,6 +2,7 @@
* jcinit.c
*
* Copyright (C) 1991-1997, Thomas G. Lane.
+ * Modified 2003-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -29,6 +30,24 @@
GLOBAL(void)
jinit_compress_master (j_compress_ptr cinfo)
{
+ long samplesperrow;
+ JDIMENSION jd_samplesperrow;
+
+ /* For now, precision must match compiled-in value... */
+ if (cinfo->data_precision != BITS_IN_JSAMPLE)
+ ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
+
+ /* Sanity check on image dimensions */
+ if (cinfo->image_height <= 0 || cinfo->image_width <= 0 ||
+ cinfo->input_components <= 0)
+ ERREXIT(cinfo, JERR_EMPTY_IMAGE);
+
+ /* Width of an input scanline must be representable as JDIMENSION. */
+ samplesperrow = (long) cinfo->image_width * (long) cinfo->input_components;
+ jd_samplesperrow = (JDIMENSION) samplesperrow;
+ if ((long) jd_samplesperrow != samplesperrow)
+ ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
+
/* Initialize master control (includes parameter checking/processing) */
jinit_c_master_control(cinfo, FALSE /* full compression */);
diff --git a/3rdparty/libjpeg/jcmainct.c b/3rdparty/libjpeg/jcmainct.c
index 6c8ffdf11fe..39b97902e8f 100644
--- a/3rdparty/libjpeg/jcmainct.c
+++ b/3rdparty/libjpeg/jcmainct.c
@@ -2,6 +2,7 @@
* jcmainct.c
*
* Copyright (C) 1994-1996, Thomas G. Lane.
+ * Modified 2003-2012 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -68,32 +69,32 @@ METHODDEF(void) process_data_buffer_main
METHODDEF(void)
start_pass_main (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
{
- my_main_ptr mymain = (my_main_ptr) cinfo->main;
+ my_main_ptr mainp = (my_main_ptr) cinfo->main;
/* Do nothing in raw-data mode. */
if (cinfo->raw_data_in)
return;
- mymain->cur_iMCU_row = 0; /* initialize counters */
- mymain->rowgroup_ctr = 0;
- mymain->suspended = FALSE;
- mymain->pass_mode = pass_mode; /* save mode for use by process_data */
+ mainp->cur_iMCU_row = 0; /* initialize counters */
+ mainp->rowgroup_ctr = 0;
+ mainp->suspended = FALSE;
+ mainp->pass_mode = pass_mode; /* save mode for use by process_data */
switch (pass_mode) {
case JBUF_PASS_THRU:
#ifdef FULL_MAIN_BUFFER_SUPPORTED
- if (mymain->whole_image[0] != NULL)
+ if (mainp->whole_image[0] != NULL)
ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
#endif
- mymain->pub.process_data = process_data_simple_main;
+ mainp->pub.process_data = process_data_simple_main;
break;
#ifdef FULL_MAIN_BUFFER_SUPPORTED
case JBUF_SAVE_SOURCE:
case JBUF_CRANK_DEST:
case JBUF_SAVE_AND_PASS:
- if (mymain->whole_image[0] == NULL)
+ if (mainp->whole_image[0] == NULL)
ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
- mymain->pub.process_data = process_data_buffer_main;
+ mainp->pub.process_data = process_data_buffer_main;
break;
#endif
default:
@@ -114,46 +115,46 @@ process_data_simple_main (j_compress_ptr cinfo,
JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
JDIMENSION in_rows_avail)
{
- my_main_ptr mymain = (my_main_ptr) cinfo->main;
+ my_main_ptr mainp = (my_main_ptr) cinfo->main;
- while (mymain->cur_iMCU_row < cinfo->total_iMCU_rows) {
+ while (mainp->cur_iMCU_row < cinfo->total_iMCU_rows) {
/* Read input data if we haven't filled the main buffer yet */
- if (mymain->rowgroup_ctr < (JDIMENSION) cinfo->min_DCT_v_scaled_size)
+ if (mainp->rowgroup_ctr < (JDIMENSION) cinfo->min_DCT_v_scaled_size)
(*cinfo->prep->pre_process_data) (cinfo,
input_buf, in_row_ctr, in_rows_avail,
- mymain->buffer, &mymain->rowgroup_ctr,
+ mainp->buffer, &mainp->rowgroup_ctr,
(JDIMENSION) cinfo->min_DCT_v_scaled_size);
/* If we don't have a full iMCU row buffered, return to application for
* more data. Note that preprocessor will always pad to fill the iMCU row
* at the bottom of the image.
*/
- if (mymain->rowgroup_ctr != (JDIMENSION) cinfo->min_DCT_v_scaled_size)
+ if (mainp->rowgroup_ctr != (JDIMENSION) cinfo->min_DCT_v_scaled_size)
return;
/* Send the completed row to the compressor */
- if (! (*cinfo->coef->compress_data) (cinfo, mymain->buffer)) {
+ if (! (*cinfo->coef->compress_data) (cinfo, mainp->buffer)) {
/* If compressor did not consume the whole row, then we must need to
* suspend processing and return to the application. In this situation
* we pretend we didn't yet consume the last input row; otherwise, if
* it happened to be the last row of the image, the application would
* think we were done.
*/
- if (! mymain->suspended) {
+ if (! mainp->suspended) {
(*in_row_ctr)--;
- mymain->suspended = TRUE;
+ mainp->suspended = TRUE;
}
return;
}
/* We did finish the row. Undo our little suspension hack if a previous
* call suspended; then mark the main buffer empty.
*/
- if (mymain->suspended) {
+ if (mainp->suspended) {
(*in_row_ctr)++;
- mymain->suspended = FALSE;
+ mainp->suspended = FALSE;
}
- mymain->rowgroup_ctr = 0;
- mymain->cur_iMCU_row++;
+ mainp->rowgroup_ctr = 0;
+ mainp->cur_iMCU_row++;
}
}
@@ -170,25 +171,27 @@ process_data_buffer_main (j_compress_ptr cinfo,
JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
JDIMENSION in_rows_avail)
{
- my_main_ptr main = (my_main_ptr) cinfo->main;
+ my_main_ptr mainp = (my_main_ptr) cinfo->main;
int ci;
jpeg_component_info *compptr;
- boolean writing = (main->pass_mode != JBUF_CRANK_DEST);
+ boolean writing = (mainp->pass_mode != JBUF_CRANK_DEST);
- while (main->cur_iMCU_row < cinfo->total_iMCU_rows) {
+ while (mainp->cur_iMCU_row < cinfo->total_iMCU_rows) {
/* Realign the virtual buffers if at the start of an iMCU row. */
- if (main->rowgroup_ctr == 0) {
+ if (mainp->rowgroup_ctr == 0) {
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
ci++, compptr++) {
- main->buffer[ci] = (*cinfo->mem->access_virt_sarray)
- ((j_common_ptr) cinfo, main->whole_image[ci],
- main->cur_iMCU_row * (compptr->v_samp_factor * DCTSIZE),
- (JDIMENSION) (compptr->v_samp_factor * DCTSIZE), writing);
+ mainp->buffer[ci] = (*cinfo->mem->access_virt_sarray)
+ ((j_common_ptr) cinfo, mainp->whole_image[ci], mainp->cur_iMCU_row *
+ ((JDIMENSION) (compptr->v_samp_factor * cinfo->min_DCT_v_scaled_size)),
+ (JDIMENSION) (compptr->v_samp_factor * cinfo->min_DCT_v_scaled_size),
+ writing);
}
/* In a read pass, pretend we just read some source data. */
if (! writing) {
- *in_row_ctr += cinfo->max_v_samp_factor * DCTSIZE;
- main->rowgroup_ctr = DCTSIZE;
+ *in_row_ctr += (JDIMENSION)
+ (cinfo->max_v_samp_factor * cinfo->min_DCT_v_scaled_size);
+ mainp->rowgroup_ctr = (JDIMENSION) cinfo->min_DCT_v_scaled_size;
}
}
@@ -197,40 +200,40 @@ process_data_buffer_main (j_compress_ptr cinfo,
if (writing) {
(*cinfo->prep->pre_process_data) (cinfo,
input_buf, in_row_ctr, in_rows_avail,
- main->buffer, &main->rowgroup_ctr,
- (JDIMENSION) DCTSIZE);
+ mainp->buffer, &mainp->rowgroup_ctr,
+ (JDIMENSION) cinfo->min_DCT_v_scaled_size);
/* Return to application if we need more data to fill the iMCU row. */
- if (main->rowgroup_ctr < DCTSIZE)
+ if (mainp->rowgroup_ctr < (JDIMENSION) cinfo->min_DCT_v_scaled_size)
return;
}
/* Emit data, unless this is a sink-only pass. */
- if (main->pass_mode != JBUF_SAVE_SOURCE) {
- if (! (*cinfo->coef->compress_data) (cinfo, main->buffer)) {
+ if (mainp->pass_mode != JBUF_SAVE_SOURCE) {
+ if (! (*cinfo->coef->compress_data) (cinfo, mainp->buffer)) {
/* If compressor did not consume the whole row, then we must need to
* suspend processing and return to the application. In this situation
* we pretend we didn't yet consume the last input row; otherwise, if
* it happened to be the last row of the image, the application would
* think we were done.
*/
- if (! main->suspended) {
+ if (! mainp->suspended) {
(*in_row_ctr)--;
- main->suspended = TRUE;
+ mainp->suspended = TRUE;
}
return;
}
/* We did finish the row. Undo our little suspension hack if a previous
* call suspended; then mark the main buffer empty.
*/
- if (main->suspended) {
+ if (mainp->suspended) {
(*in_row_ctr)++;
- main->suspended = FALSE;
+ mainp->suspended = FALSE;
}
}
/* If get here, we are done with this iMCU row. Mark buffer empty. */
- main->rowgroup_ctr = 0;
- main->cur_iMCU_row++;
+ mainp->rowgroup_ctr = 0;
+ mainp->cur_iMCU_row++;
}
}
@@ -244,15 +247,15 @@ process_data_buffer_main (j_compress_ptr cinfo,
GLOBAL(void)
jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer)
{
- my_main_ptr mymain;
+ my_main_ptr mainp;
int ci;
jpeg_component_info *compptr;
- mymain = (my_main_ptr)
+ mainp = (my_main_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_main_controller));
- cinfo->main = (struct jpeg_c_main_controller *) mymain;
- mymain->pub.start_pass = start_pass_main;
+ cinfo->main = &mainp->pub;
+ mainp->pub.start_pass = start_pass_main;
/* We don't need to create a buffer in raw-data mode. */
if (cinfo->raw_data_in)
@@ -267,11 +270,12 @@ jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer)
/* Note we pad the bottom to a multiple of the iMCU height */
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
ci++, compptr++) {
- mymain->whole_image[ci] = (*cinfo->mem->request_virt_sarray)
+ mainp->whole_image[ci] = (*cinfo->mem->request_virt_sarray)
((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,
- compptr->width_in_blocks * compptr->DCT_h_scaled_size,
- (JDIMENSION) jround_up((long) compptr->height_in_blocks,
- (long) compptr->v_samp_factor) * DCTSIZE,
+ compptr->width_in_blocks * ((JDIMENSION) compptr->DCT_h_scaled_size),
+ ((JDIMENSION) jround_up((long) compptr->height_in_blocks,
+ (long) compptr->v_samp_factor)) *
+ ((JDIMENSION) cinfo->min_DCT_v_scaled_size),
(JDIMENSION) (compptr->v_samp_factor * compptr->DCT_v_scaled_size));
}
#else
@@ -279,14 +283,14 @@ jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer)
#endif
} else {
#ifdef FULL_MAIN_BUFFER_SUPPORTED
- mymain->whole_image[0] = NULL; /* flag for no virtual arrays */
+ mainp->whole_image[0] = NULL; /* flag for no virtual arrays */
#endif
/* Allocate a strip buffer for each component */
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
ci++, compptr++) {
- mymain->buffer[ci] = (*cinfo->mem->alloc_sarray)
+ mainp->buffer[ci] = (*cinfo->mem->alloc_sarray)
((j_common_ptr) cinfo, JPOOL_IMAGE,
- compptr->width_in_blocks * compptr->DCT_h_scaled_size,
+ compptr->width_in_blocks * ((JDIMENSION) compptr->DCT_h_scaled_size),
(JDIMENSION) (compptr->v_samp_factor * compptr->DCT_v_scaled_size));
}
}
diff --git a/3rdparty/libjpeg/jcmarker.c b/3rdparty/libjpeg/jcmarker.c
index 606c19af397..ca2bb39922f 100644
--- a/3rdparty/libjpeg/jcmarker.c
+++ b/3rdparty/libjpeg/jcmarker.c
@@ -2,7 +2,7 @@
* jcmarker.c
*
* Copyright (C) 1991-1998, Thomas G. Lane.
- * Modified 2003-2010 by Guido Vollbeding.
+ * Modified 2003-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -19,24 +19,24 @@ typedef enum { /* JPEG marker codes */
M_SOF1 = 0xc1,
M_SOF2 = 0xc2,
M_SOF3 = 0xc3,
-
+
M_SOF5 = 0xc5,
M_SOF6 = 0xc6,
M_SOF7 = 0xc7,
-
+
M_JPG = 0xc8,
M_SOF9 = 0xc9,
M_SOF10 = 0xca,
M_SOF11 = 0xcb,
-
+
M_SOF13 = 0xcd,
M_SOF14 = 0xce,
M_SOF15 = 0xcf,
-
+
M_DHT = 0xc4,
-
+
M_DAC = 0xcc,
-
+
M_RST0 = 0xd0,
M_RST1 = 0xd1,
M_RST2 = 0xd2,
@@ -45,7 +45,7 @@ typedef enum { /* JPEG marker codes */
M_RST5 = 0xd5,
M_RST6 = 0xd6,
M_RST7 = 0xd7,
-
+
M_SOI = 0xd8,
M_EOI = 0xd9,
M_SOS = 0xda,
@@ -54,7 +54,7 @@ typedef enum { /* JPEG marker codes */
M_DRI = 0xdd,
M_DHP = 0xde,
M_EXP = 0xdf,
-
+
M_APP0 = 0xe0,
M_APP1 = 0xe1,
M_APP2 = 0xe2,
@@ -71,13 +71,14 @@ typedef enum { /* JPEG marker codes */
M_APP13 = 0xed,
M_APP14 = 0xee,
M_APP15 = 0xef,
-
+
M_JPG0 = 0xf0,
+ M_JPG8 = 0xf8,
M_JPG13 = 0xfd,
M_COM = 0xfe,
-
+
M_TEM = 0x01,
-
+
M_ERROR = 0x100
} JPEG_MARKER;
@@ -282,6 +283,37 @@ emit_dri (j_compress_ptr cinfo)
LOCAL(void)
+emit_lse_ict (j_compress_ptr cinfo)
+/* Emit an LSE inverse color transform specification marker */
+{
+ /* Support only 1 transform */
+ if (cinfo->color_transform != JCT_SUBTRACT_GREEN ||
+ cinfo->num_components < 3)
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+
+ emit_marker(cinfo, M_JPG8);
+
+ emit_2bytes(cinfo, 24); /* fixed length */
+
+ emit_byte(cinfo, 0x0D); /* ID inverse transform specification */
+ emit_2bytes(cinfo, MAXJSAMPLE); /* MAXTRANS */
+ emit_byte(cinfo, 3); /* Nt=3 */
+ emit_byte(cinfo, cinfo->comp_info[1].component_id);
+ emit_byte(cinfo, cinfo->comp_info[0].component_id);
+ emit_byte(cinfo, cinfo->comp_info[2].component_id);
+ emit_byte(cinfo, 0x80); /* F1: CENTER1=1, NORM1=0 */
+ emit_2bytes(cinfo, 0); /* A(1,1)=0 */
+ emit_2bytes(cinfo, 0); /* A(1,2)=0 */
+ emit_byte(cinfo, 0); /* F2: CENTER2=0, NORM2=0 */
+ emit_2bytes(cinfo, 1); /* A(2,1)=1 */
+ emit_2bytes(cinfo, 0); /* A(2,2)=0 */
+ emit_byte(cinfo, 0); /* F3: CENTER3=0, NORM3=0 */
+ emit_2bytes(cinfo, 1); /* A(3,1)=1 */
+ emit_2bytes(cinfo, 0); /* A(3,2)=0 */
+}
+
+
+LOCAL(void)
emit_sof (j_compress_ptr cinfo, JPEG_MARKER code)
/* Emit a SOF marker */
{
@@ -476,8 +508,8 @@ write_marker_byte (j_compress_ptr cinfo, int val)
* Write datastream header.
* This consists of an SOI and optional APPn markers.
* We recommend use of the JFIF marker, but not the Adobe marker,
- * when using YCbCr or grayscale data. The JFIF marker should NOT
- * be used for any other JPEG colorspace. The Adobe marker is helpful
+ * when using YCbCr or grayscale data. The JFIF marker is also used
+ * for other standard JPEG colorspaces. The Adobe marker is helpful
* to distinguish RGB, CMYK, and YCCK colorspaces.
* Note that an application can write additional header markers after
* jpeg_start_compress returns.
@@ -502,7 +534,8 @@ write_file_header (j_compress_ptr cinfo)
/*
* Write frame header.
- * This consists of DQT and SOFn markers, and a conditional pseudo SOS marker.
+ * This consists of DQT and SOFn markers,
+ * a conditional LSE marker and a conditional pseudo SOS marker.
* Note that we do not emit the SOF until we have emitted the DQT(s).
* This avoids compatibility problems with incorrect implementations that
* try to error-check the quant table numbers as soon as they see the SOF.
@@ -560,6 +593,10 @@ write_frame_header (j_compress_ptr cinfo)
emit_sof(cinfo, M_SOF1); /* SOF code for non-baseline Huffman file */
}
+ /* Check to emit LSE inverse color transform specification marker */
+ if (cinfo->color_transform)
+ emit_lse_ict(cinfo);
+
/* Check to emit pseudo SOS marker */
if (cinfo->progressive_mode && cinfo->block_size != DCTSIZE)
emit_pseudo_sos(cinfo);
@@ -668,7 +705,7 @@ jinit_marker_writer (j_compress_ptr cinfo)
marker = (my_marker_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_marker_writer));
- cinfo->marker = (struct jpeg_marker_writer *) marker;
+ cinfo->marker = &marker->pub;
/* Initialize method pointers */
marker->pub.write_file_header = write_file_header;
marker->pub.write_frame_header = write_frame_header;
diff --git a/3rdparty/libjpeg/jcmaster.c b/3rdparty/libjpeg/jcmaster.c
index caf80a53b38..2a8ae63303a 100644
--- a/3rdparty/libjpeg/jcmaster.c
+++ b/3rdparty/libjpeg/jcmaster.c
@@ -2,7 +2,7 @@
* jcmaster.c
*
* Copyright (C) 1991-1997, Thomas G. Lane.
- * Modified 2003-2011 by Guido Vollbeding.
+ * Modified 2003-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -222,8 +222,6 @@ initial_setup (j_compress_ptr cinfo, boolean transcode_only)
{
int ci, ssize;
jpeg_component_info *compptr;
- long samplesperrow;
- JDIMENSION jd_samplesperrow;
if (transcode_only)
jpeg_calc_trans_dimensions(cinfo);
@@ -251,7 +249,7 @@ initial_setup (j_compress_ptr cinfo, boolean transcode_only)
/* Sanity check on image dimensions */
if (cinfo->jpeg_height <= 0 || cinfo->jpeg_width <= 0 ||
- cinfo->num_components <= 0 || cinfo->input_components <= 0)
+ cinfo->num_components <= 0)
ERREXIT(cinfo, JERR_EMPTY_IMAGE);
/* Make sure image isn't bigger than I can handle */
@@ -259,14 +257,8 @@ initial_setup (j_compress_ptr cinfo, boolean transcode_only)
(long) cinfo->jpeg_width > (long) JPEG_MAX_DIMENSION)
ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);
- /* Width of an input scanline must be representable as JDIMENSION. */
- samplesperrow = (long) cinfo->image_width * (long) cinfo->input_components;
- jd_samplesperrow = (JDIMENSION) samplesperrow;
- if ((long) jd_samplesperrow != samplesperrow)
- ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
-
- /* For now, precision must match compiled-in value... */
- if (cinfo->data_precision != BITS_IN_JSAMPLE)
+ /* Only 8 to 12 bits data precision are supported for DCT based JPEG */
+ if (cinfo->data_precision < 8 || cinfo->data_precision > 12)
ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
/* Check that number of components won't exceed internal array sizes */
@@ -339,8 +331,10 @@ initial_setup (j_compress_ptr cinfo, boolean transcode_only)
jdiv_round_up((long) cinfo->jpeg_height *
(long) (compptr->v_samp_factor * compptr->DCT_v_scaled_size),
(long) (cinfo->max_v_samp_factor * cinfo->block_size));
- /* Mark component needed (this flag isn't actually used for compression) */
- compptr->component_needed = TRUE;
+ /* Don't need quantization scale after DCT,
+ * until color conversion says otherwise.
+ */
+ compptr->component_needed = FALSE;
}
/* Compute number of fully interleaved MCU rows (number of times that
@@ -811,7 +805,7 @@ jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only)
master = (my_master_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_comp_master));
- cinfo->master = (struct jpeg_comp_master *) master;
+ cinfo->master = &master->pub;
master->pub.prepare_for_pass = prepare_for_pass;
master->pub.pass_startup = pass_startup;
master->pub.finish_pass = finish_pass_master;
@@ -833,10 +827,14 @@ jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only)
cinfo->num_scans = 1;
}
- if ((cinfo->progressive_mode || cinfo->block_size < DCTSIZE) &&
- !cinfo->arith_code) /* TEMPORARY HACK ??? */
- /* assume default tables no good for progressive or downscale mode */
- cinfo->optimize_coding = TRUE;
+ if (cinfo->optimize_coding)
+ cinfo->arith_code = FALSE; /* disable arithmetic coding */
+ else if (! cinfo->arith_code &&
+ (cinfo->progressive_mode ||
+ (cinfo->block_size > 1 && cinfo->block_size < DCTSIZE)))
+ /* TEMPORARY HACK ??? */
+ /* assume default tables no good for progressive or reduced AC mode */
+ cinfo->optimize_coding = TRUE; /* force Huffman optimization */
/* Initialize my private state */
if (transcode_only) {
diff --git a/3rdparty/libjpeg/jconfig.cfg b/3rdparty/libjpeg/jconfig.cfg
index bb7435c9ff2..c4548fc29fa 100644
--- a/3rdparty/libjpeg/jconfig.cfg
+++ b/3rdparty/libjpeg/jconfig.cfg
@@ -17,11 +17,17 @@
/* Define this if you get warnings about undefined structures. */
#undef INCOMPLETE_TYPES_BROKEN
-/* Define "boolean" as unsigned char, not int, on Windows systems. */
+/* Define "boolean" as unsigned char, not enum, on Windows systems. */
#ifdef _WIN32
#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
typedef unsigned char boolean;
#endif
+#ifndef FALSE /* in case these macros already exist */
+#define FALSE 0 /* values of boolean */
+#endif
+#ifndef TRUE
+#define TRUE 1
+#endif
#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
#endif
diff --git a/3rdparty/libjpeg/jconfig.h b/3rdparty/libjpeg/jconfig.h
index 68b254dec30..c761ffa3467 100644
--- a/3rdparty/libjpeg/jconfig.h
+++ b/3rdparty/libjpeg/jconfig.h
@@ -1,4 +1,5 @@
-/* jconfig.vc --- jconfig.h for Microsoft Visual C++ on Windows 95 or NT. */
+/* jconfig.vc --- jconfig.h for Microsoft Visual C++ on Windows 9x or NT. */
+/* This file also works for Borland C++ 32-bit (bcc32) on Windows 9x or NT. */
/* see jconfig.txt for explanations */
#define HAVE_PROTOTYPES
@@ -12,15 +13,21 @@
#define HAVE_STDLIB_H
#undef NEED_BSD_STRINGS
#undef NEED_SYS_TYPES_H
-#undef NEED_FAR_POINTERS /* we presume a 32-bit flat memory model */
+#undef NEED_FAR_POINTERS /* we presume a 32-bit flat memory model */
#undef NEED_SHORT_EXTERNAL_NAMES
#undef INCOMPLETE_TYPES_BROKEN
-/* Define "boolean" as unsigned char, not int, per Windows custom */
-#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
+/* Define "boolean" as unsigned char, not enum, per Windows custom */
+#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
typedef unsigned char boolean;
#endif
-#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
+#ifndef FALSE /* in case these macros already exist */
+#define FALSE 0 /* values of boolean */
+#endif
+#ifndef TRUE
+#define TRUE 1
+#endif
+#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
#ifdef JPEG_INTERNALS
@@ -31,16 +38,16 @@ typedef unsigned char boolean;
#ifdef JPEG_CJPEG_DJPEG
-#define BMP_SUPPORTED /* BMP image file format */
-#define GIF_SUPPORTED /* GIF image file format */
-#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */
-#undef RLE_SUPPORTED /* Utah RLE image file format */
-#define TARGA_SUPPORTED /* Targa image file format */
+#define BMP_SUPPORTED /* BMP image file format */
+#define GIF_SUPPORTED /* GIF image file format */
+#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */
+#undef RLE_SUPPORTED /* Utah RLE image file format */
+#define TARGA_SUPPORTED /* Targa image file format */
-#define TWO_FILE_COMMANDLINE /* optional */
-#define USE_SETMODE /* Microsoft has setmode() */
+#define TWO_FILE_COMMANDLINE /* optional */
+#define USE_SETMODE /* Microsoft has setmode() */
#undef NEED_SIGNAL_CATCHER
#undef DONT_USE_B_MODE
-#undef PROGRESS_REPORT /* optional */
+#undef PROGRESS_REPORT /* optional */
#endif /* JPEG_CJPEG_DJPEG */
diff --git a/3rdparty/libjpeg/jconfig.mc6 b/3rdparty/libjpeg/jconfig.mc6
index ad5651b8cef..6b05e81b843 100644
--- a/3rdparty/libjpeg/jconfig.mc6
+++ b/3rdparty/libjpeg/jconfig.mc6
@@ -30,7 +30,7 @@
#define SHORTxLCONST_32 /* enable compiler-specific DCT optimization */
/* Note: the above define is known to improve the code with Microsoft C 6.00A.
* I do not know whether it is good for later compiler versions.
- * Please report any info on this point to jpeg-info@uc.ag.
+ * Please report any info on this point to jpeg-info@jpegclub.org.
*/
#endif /* JPEG_INTERNALS */
diff --git a/3rdparty/libjpeg/jconfig.txt b/3rdparty/libjpeg/jconfig.txt
index b96d3124928..d1710ae7d0f 100644
--- a/3rdparty/libjpeg/jconfig.txt
+++ b/3rdparty/libjpeg/jconfig.txt
@@ -2,6 +2,7 @@
* jconfig.txt
*
* Copyright (C) 1991-1994, Thomas G. Lane.
+ * Modified 2009-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -91,12 +92,18 @@
*/
#undef INCOMPLETE_TYPES_BROKEN
-/* Define "boolean" as unsigned char, not int, on Windows systems.
+/* Define "boolean" as unsigned char, not enum, on Windows systems.
*/
#ifdef _WIN32
#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
typedef unsigned char boolean;
#endif
+#ifndef FALSE /* in case these macros already exist */
+#define FALSE 0 /* values of boolean */
+#endif
+#ifndef TRUE
+#define TRUE 1
+#endif
#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
#endif
diff --git a/3rdparty/libjpeg/jconfig.vc b/3rdparty/libjpeg/jconfig.vc
index 679404da4ee..e9d33e58709 100644
--- a/3rdparty/libjpeg/jconfig.vc
+++ b/3rdparty/libjpeg/jconfig.vc
@@ -1,4 +1,5 @@
-/* jconfig.vc --- jconfig.h for Microsoft Visual C++ on Windows 95 or NT. */
+/* jconfig.vc --- jconfig.h for Microsoft Visual C++ on Windows 9x or NT. */
+/* This file also works for Borland C++ 32-bit (bcc32) on Windows 9x or NT. */
/* see jconfig.txt for explanations */
#define HAVE_PROTOTYPES
@@ -15,10 +16,16 @@
#undef NEED_SHORT_EXTERNAL_NAMES
#undef INCOMPLETE_TYPES_BROKEN
-/* Define "boolean" as unsigned char, not int, per Windows custom */
+/* Define "boolean" as unsigned char, not enum, per Windows custom */
#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
typedef unsigned char boolean;
#endif
+#ifndef FALSE /* in case these macros already exist */
+#define FALSE 0 /* values of boolean */
+#endif
+#ifndef TRUE
+#define TRUE 1
+#endif
#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
diff --git a/3rdparty/libjpeg/jcparam.c b/3rdparty/libjpeg/jcparam.c
index c5e85dda550..4b2bee24976 100644
--- a/3rdparty/libjpeg/jcparam.c
+++ b/3rdparty/libjpeg/jcparam.c
@@ -2,7 +2,7 @@
* jcparam.c
*
* Copyright (C) 1991-1998, Thomas G. Lane.
- * Modified 2003-2008 by Guido Vollbeding.
+ * Modified 2003-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -150,7 +150,7 @@ jpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline)
/* Set or change the 'quality' (quantization) setting, using default tables.
* This is the standard quality-adjusting entry point for typical user
* interfaces; only those who want detailed control over quantization tables
- * would use the preceding three routines directly.
+ * would use the preceding routines directly.
*/
{
/* Convert user 0-100 rating to percentage scaling */
@@ -323,18 +323,17 @@ jpeg_set_defaults (j_compress_ptr cinfo)
/* Expect normal source image, not raw downsampled data */
cinfo->raw_data_in = FALSE;
- /* Use Huffman coding, not arithmetic coding, by default */
- cinfo->arith_code = FALSE;
+ /* The standard Huffman tables are only valid for 8-bit data precision.
+ * If the precision is higher, use arithmetic coding.
+ * (Alternatively, using Huffman coding would be possible with forcing
+ * optimization on so that usable tables will be computed, or by
+ * supplying default tables that are valid for the desired precision.)
+ * Otherwise, use Huffman coding by default.
+ */
+ cinfo->arith_code = cinfo->data_precision > 8 ? TRUE : FALSE;
/* By default, don't do extra passes to optimize entropy coding */
cinfo->optimize_coding = FALSE;
- /* The standard Huffman tables are only valid for 8-bit data precision.
- * If the precision is higher, force optimization on so that usable
- * tables will be computed. This test can be removed if default tables
- * are supplied that are valid for the desired precision.
- */
- if (cinfo->data_precision > 8)
- cinfo->optimize_coding = TRUE;
/* By default, use the simpler non-cosited sampling alignment */
cinfo->CCIR601_sampling = FALSE;
@@ -360,6 +359,9 @@ jpeg_set_defaults (j_compress_ptr cinfo)
* JFIF_minor_version to 2. We could probably get away with just defaulting
* to 1.02, but there may still be some decoders in use that will complain
* about that; saying 1.01 should minimize compatibility problems.
+ *
+ * For wide gamut colorspaces (BG_RGB and BG_YCC), the major version will be
+ * overridden by jpeg_set_colorspace and set to 2.
*/
cinfo->JFIF_major_version = 1; /* Default JFIF version = 1.01 */
cinfo->JFIF_minor_version = 1;
@@ -367,6 +369,9 @@ jpeg_set_defaults (j_compress_ptr cinfo)
cinfo->X_density = 1; /* Pixel aspect ratio is square by default */
cinfo->Y_density = 1;
+ /* No color transform */
+ cinfo->color_transform = JCT_NONE;
+
/* Choose JPEG colorspace based on input space, set defaults accordingly */
jpeg_default_colorspace(cinfo);
@@ -381,6 +386,9 @@ GLOBAL(void)
jpeg_default_colorspace (j_compress_ptr cinfo)
{
switch (cinfo->in_color_space) {
+ case JCS_UNKNOWN:
+ jpeg_set_colorspace(cinfo, JCS_UNKNOWN);
+ break;
case JCS_GRAYSCALE:
jpeg_set_colorspace(cinfo, JCS_GRAYSCALE);
break;
@@ -396,8 +404,12 @@ jpeg_default_colorspace (j_compress_ptr cinfo)
case JCS_YCCK:
jpeg_set_colorspace(cinfo, JCS_YCCK);
break;
- case JCS_UNKNOWN:
- jpeg_set_colorspace(cinfo, JCS_UNKNOWN);
+ case JCS_BG_RGB:
+ /* No translation for now -- conversion to BG_YCC not yet supportet */
+ jpeg_set_colorspace(cinfo, JCS_BG_RGB);
+ break;
+ case JCS_BG_YCC:
+ jpeg_set_colorspace(cinfo, JCS_BG_YCC);
break;
default:
ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
@@ -438,27 +450,40 @@ jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace)
cinfo->write_Adobe_marker = FALSE; /* write no Adobe marker by default */
switch (colorspace) {
+ case JCS_UNKNOWN:
+ cinfo->num_components = cinfo->input_components;
+ if (cinfo->num_components < 1 || cinfo->num_components > MAX_COMPONENTS)
+ ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
+ MAX_COMPONENTS);
+ for (ci = 0; ci < cinfo->num_components; ci++) {
+ SET_COMP(ci, ci, 1,1, 0, 0,0);
+ }
+ break;
case JCS_GRAYSCALE:
cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */
cinfo->num_components = 1;
/* JFIF specifies component ID 1 */
- SET_COMP(0, 1, 1,1, 0, 0,0);
+ SET_COMP(0, 0x01, 1,1, 0, 0,0);
break;
case JCS_RGB:
cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag RGB */
cinfo->num_components = 3;
- SET_COMP(0, 0x52 /* 'R' */, 1,1, 0, 0,0);
+ SET_COMP(0, 0x52 /* 'R' */, 1,1, 0,
+ cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0,
+ cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0);
SET_COMP(1, 0x47 /* 'G' */, 1,1, 0, 0,0);
- SET_COMP(2, 0x42 /* 'B' */, 1,1, 0, 0,0);
+ SET_COMP(2, 0x42 /* 'B' */, 1,1, 0,
+ cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0,
+ cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0);
break;
case JCS_YCbCr:
cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */
cinfo->num_components = 3;
/* JFIF specifies component IDs 1,2,3 */
/* We default to 2x2 subsamples of chrominance */
- SET_COMP(0, 1, 2,2, 0, 0,0);
- SET_COMP(1, 2, 1,1, 1, 1,1);
- SET_COMP(2, 3, 1,1, 1, 1,1);
+ SET_COMP(0, 0x01, 2,2, 0, 0,0);
+ SET_COMP(1, 0x02, 1,1, 1, 1,1);
+ SET_COMP(2, 0x03, 1,1, 1, 1,1);
break;
case JCS_CMYK:
cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag CMYK */
@@ -471,19 +496,33 @@ jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace)
case JCS_YCCK:
cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag YCCK */
cinfo->num_components = 4;
- SET_COMP(0, 1, 2,2, 0, 0,0);
- SET_COMP(1, 2, 1,1, 1, 1,1);
- SET_COMP(2, 3, 1,1, 1, 1,1);
- SET_COMP(3, 4, 2,2, 0, 0,0);
+ SET_COMP(0, 0x01, 2,2, 0, 0,0);
+ SET_COMP(1, 0x02, 1,1, 1, 1,1);
+ SET_COMP(2, 0x03, 1,1, 1, 1,1);
+ SET_COMP(3, 0x04, 2,2, 0, 0,0);
break;
- case JCS_UNKNOWN:
- cinfo->num_components = cinfo->input_components;
- if (cinfo->num_components < 1 || cinfo->num_components > MAX_COMPONENTS)
- ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
- MAX_COMPONENTS);
- for (ci = 0; ci < cinfo->num_components; ci++) {
- SET_COMP(ci, ci, 1,1, 0, 0,0);
- }
+ case JCS_BG_RGB:
+ cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */
+ cinfo->JFIF_major_version = 2; /* Set JFIF major version = 2 */
+ cinfo->num_components = 3;
+ /* Add offset 0x20 to the normal R/G/B component IDs */
+ SET_COMP(0, 0x72 /* 'r' */, 1,1, 0,
+ cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0,
+ cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0);
+ SET_COMP(1, 0x67 /* 'g' */, 1,1, 0, 0,0);
+ SET_COMP(2, 0x62 /* 'b' */, 1,1, 0,
+ cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0,
+ cinfo->color_transform == JCT_SUBTRACT_GREEN ? 1 : 0);
+ break;
+ case JCS_BG_YCC:
+ cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */
+ cinfo->JFIF_major_version = 2; /* Set JFIF major version = 2 */
+ cinfo->num_components = 3;
+ /* Add offset 0x20 to the normal Cb/Cr component IDs */
+ /* We default to 2x2 subsamples of chrominance */
+ SET_COMP(0, 0x01, 2,2, 0, 0,0);
+ SET_COMP(1, 0x22, 1,1, 1, 1,1);
+ SET_COMP(2, 0x23, 1,1, 1, 1,1);
break;
default:
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
@@ -567,8 +606,10 @@ jpeg_simple_progression (j_compress_ptr cinfo)
ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
/* Figure space needed for script. Calculation must match code below! */
- if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {
- /* Custom script for YCbCr color images. */
+ if (ncomps == 3 &&
+ (cinfo->jpeg_color_space == JCS_YCbCr ||
+ cinfo->jpeg_color_space == JCS_BG_YCC)) {
+ /* Custom script for YCC color images. */
nscans = 10;
} else {
/* All-purpose script for other color spaces. */
@@ -583,7 +624,7 @@ jpeg_simple_progression (j_compress_ptr cinfo)
* multiple compressions without changing the settings. To avoid a memory
* leak if jpeg_simple_progression is called repeatedly for the same JPEG
* object, we try to re-use previously allocated space, and we allocate
- * enough space to handle YCbCr even if initially asked for grayscale.
+ * enough space to handle YCC even if initially asked for grayscale.
*/
if (cinfo->script_space == NULL || cinfo->script_space_size < nscans) {
cinfo->script_space_size = MAX(nscans, 10);
@@ -595,8 +636,10 @@ jpeg_simple_progression (j_compress_ptr cinfo)
cinfo->scan_info = scanptr;
cinfo->num_scans = nscans;
- if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) {
- /* Custom script for YCbCr color images. */
+ if (ncomps == 3 &&
+ (cinfo->jpeg_color_space == JCS_YCbCr ||
+ cinfo->jpeg_color_space == JCS_BG_YCC)) {
+ /* Custom script for YCC color images. */
/* Initial DC scan */
scanptr = fill_dc_scans(scanptr, ncomps, 0, 1);
/* Initial AC scan: get some luma data out in a hurry */
diff --git a/3rdparty/libjpeg/jctrans.c b/3rdparty/libjpeg/jctrans.c
index cee6b0f343f..7cd077e4f67 100644
--- a/3rdparty/libjpeg/jctrans.c
+++ b/3rdparty/libjpeg/jctrans.c
@@ -2,7 +2,7 @@
* jctrans.c
*
* Copyright (C) 1995-1998, Thomas G. Lane.
- * Modified 2000-2009 by Guido Vollbeding.
+ * Modified 2000-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -85,7 +85,10 @@ jpeg_copy_critical_parameters (j_decompress_ptr srcinfo,
jpeg_set_defaults(dstinfo);
/* jpeg_set_defaults may choose wrong colorspace, eg YCbCr if input is RGB.
* Fix it to get the right header markers for the image colorspace.
+ * Note: Entropy table assignment in jpeg_set_colorspace depends
+ * on color_transform.
*/
+ dstinfo->color_transform = srcinfo->color_transform;
jpeg_set_colorspace(dstinfo, srcinfo->jpeg_color_space);
dstinfo->data_precision = srcinfo->data_precision;
dstinfo->CCIR601_sampling = srcinfo->CCIR601_sampling;
@@ -130,7 +133,7 @@ jpeg_copy_critical_parameters (j_decompress_ptr srcinfo,
ERREXIT1(dstinfo, JERR_MISMATCHED_QUANT_TABLE, tblno);
}
}
- /* Note: we do not copy the source's Huffman table assignments;
+ /* Note: we do not copy the source's entropy table assignments;
* instead we rely on jpeg_set_colorspace to have made a suitable choice.
*/
}
@@ -140,10 +143,10 @@ jpeg_copy_critical_parameters (j_decompress_ptr srcinfo,
* if the application chooses to copy JFIF 1.02 extension markers from
* the source file, we need to copy the version to make sure we don't
* emit a file that has 1.02 extensions but a claimed version of 1.01.
- * We will *not*, however, copy version info from mislabeled "2.01" files.
*/
if (srcinfo->saw_JFIF_marker) {
- if (srcinfo->JFIF_major_version == 1) {
+ if (srcinfo->JFIF_major_version == 1 ||
+ srcinfo->JFIF_major_version == 2) {
dstinfo->JFIF_major_version = srcinfo->JFIF_major_version;
dstinfo->JFIF_minor_version = srcinfo->JFIF_minor_version;
}
@@ -364,7 +367,7 @@ transencode_coef_controller (j_compress_ptr cinfo,
coef = (my_coef_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_coef_controller));
- cinfo->coef = (struct jpeg_c_coef_controller *) coef;
+ cinfo->coef = &coef->pub;
coef->pub.start_pass = start_pass_coef;
coef->pub.compress_data = compress_output;
@@ -375,7 +378,7 @@ transencode_coef_controller (j_compress_ptr cinfo,
buffer = (JBLOCKROW)
(*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
- jzero_far((void FAR *) buffer, C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
+ FMEMZERO((void FAR *) buffer, C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) {
coef->dummy_buffer[i] = buffer + i;
}
diff --git a/3rdparty/libjpeg/jdapimin.c b/3rdparty/libjpeg/jdapimin.c
index 7f1ce4c05b2..a6e0dd9fb82 100644
--- a/3rdparty/libjpeg/jdapimin.c
+++ b/3rdparty/libjpeg/jdapimin.c
@@ -2,7 +2,7 @@
* jdapimin.c
*
* Copyright (C) 1994-1998, Thomas G. Lane.
- * Modified 2009 by Guido Vollbeding.
+ * Modified 2009-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -114,8 +114,9 @@ jpeg_abort_decompress (j_decompress_ptr cinfo)
LOCAL(void)
default_decompress_parms (j_decompress_ptr cinfo)
{
+ int cid0, cid1, cid2;
+
/* Guess the input colorspace, and set output colorspace accordingly. */
- /* (Wish JPEG committee had provided a real way to specify this...) */
/* Note application may override our guesses. */
switch (cinfo->num_components) {
case 1:
@@ -124,9 +125,22 @@ default_decompress_parms (j_decompress_ptr cinfo)
break;
case 3:
- if (cinfo->saw_JFIF_marker) {
- cinfo->jpeg_color_space = JCS_YCbCr; /* JFIF implies YCbCr */
- } else if (cinfo->saw_Adobe_marker) {
+ cid0 = cinfo->comp_info[0].component_id;
+ cid1 = cinfo->comp_info[1].component_id;
+ cid2 = cinfo->comp_info[2].component_id;
+
+ /* First try to guess from the component IDs */
+ if (cid0 == 0x01 && cid1 == 0x02 && cid2 == 0x03)
+ cinfo->jpeg_color_space = JCS_YCbCr;
+ else if (cid0 == 0x01 && cid1 == 0x22 && cid2 == 0x23)
+ cinfo->jpeg_color_space = JCS_BG_YCC;
+ else if (cid0 == 0x52 && cid1 == 0x47 && cid2 == 0x42)
+ cinfo->jpeg_color_space = JCS_RGB; /* ASCII 'R', 'G', 'B' */
+ else if (cid0 == 0x72 && cid1 == 0x67 && cid2 == 0x62)
+ cinfo->jpeg_color_space = JCS_BG_RGB; /* ASCII 'r', 'g', 'b' */
+ else if (cinfo->saw_JFIF_marker)
+ cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
+ else if (cinfo->saw_Adobe_marker) {
switch (cinfo->Adobe_transform) {
case 0:
cinfo->jpeg_color_space = JCS_RGB;
@@ -136,23 +150,12 @@ default_decompress_parms (j_decompress_ptr cinfo)
break;
default:
WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
- cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
+ cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
break;
}
} else {
- /* Saw no special markers, try to guess from the component IDs */
- int cid0 = cinfo->comp_info[0].component_id;
- int cid1 = cinfo->comp_info[1].component_id;
- int cid2 = cinfo->comp_info[2].component_id;
-
- if (cid0 == 1 && cid1 == 2 && cid2 == 3)
- cinfo->jpeg_color_space = JCS_YCbCr; /* assume JFIF w/out marker */
- else if (cid0 == 82 && cid1 == 71 && cid2 == 66)
- cinfo->jpeg_color_space = JCS_RGB; /* ASCII 'R', 'G', 'B' */
- else {
- TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2);
- cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
- }
+ TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2);
+ cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */
}
/* Always guess RGB is proper output colorspace. */
cinfo->out_color_space = JCS_RGB;
@@ -169,7 +172,7 @@ default_decompress_parms (j_decompress_ptr cinfo)
break;
default:
WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
- cinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */
+ cinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */
break;
}
} else {
diff --git a/3rdparty/libjpeg/jdapistd.c b/3rdparty/libjpeg/jdapistd.c
index 9d745377724..7f3a78b25af 100644
--- a/3rdparty/libjpeg/jdapistd.c
+++ b/3rdparty/libjpeg/jdapistd.c
@@ -2,6 +2,7 @@
* jdapistd.c
*
* Copyright (C) 1994-1996, Thomas G. Lane.
+ * Modified 2002-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
diff --git a/3rdparty/libjpeg/jdarith.c b/3rdparty/libjpeg/jdarith.c
index c858b248b6b..5533c07397f 100644
--- a/3rdparty/libjpeg/jdarith.c
+++ b/3rdparty/libjpeg/jdarith.c
@@ -1,7 +1,7 @@
/*
* jdarith.c
*
- * Developed 1997-2009 by Guido Vollbeding.
+ * Developed 1997-2015 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -94,7 +94,7 @@ get_byte (j_decompress_ptr cinfo)
* (instead of fixed) with the bit shift counter CT.
* Thus, we also need only one (variable instead of
* fixed size) shift for the LPS/MPS decision, and
- * we can get away with any renormalization update
+ * we can do away with any renormalization update
* of C (except for new data insertion, of course).
*
* I've also introduced a new scheme for accessing
@@ -145,7 +145,7 @@ arith_decode (j_decompress_ptr cinfo, unsigned char *st)
e->a <<= 1;
}
- /* Fetch values from our compact representation of Table D.2:
+ /* Fetch values from our compact representation of Table D.3(D.2):
* Qe values and probability estimation state machine
*/
sv = *st;
@@ -345,12 +345,15 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
/* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */
/* Figure F.20: Decode_AC_coefficients */
- for (k = cinfo->Ss; k <= cinfo->Se; k++) {
- st = entropy->ac_stats[tbl] + 3 * (k - 1);
+ k = cinfo->Ss - 1;
+ do {
+ st = entropy->ac_stats[tbl] + 3 * k;
if (arith_decode(cinfo, st)) break; /* EOB flag */
- while (arith_decode(cinfo, st + 1) == 0) {
- st += 3; k++;
- if (k > cinfo->Se) {
+ for (;;) {
+ k++;
+ if (arith_decode(cinfo, st + 1)) break;
+ st += 3;
+ if (k >= cinfo->Se) {
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
entropy->ct = -1; /* spectral overflow */
return TRUE;
@@ -384,7 +387,7 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
v += 1; if (sign) v = -v;
/* Scale and output coefficient in natural (dezigzagged) order */
(*block)[natural_order[k]] = (JCOEF) (v << cinfo->Al);
- }
+ } while (k < cinfo->Se);
return TRUE;
}
@@ -392,6 +395,8 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
/*
* MCU decoding for DC successive approximation refinement scan.
+ * Note: we assume such scans can be multi-component,
+ * although the spec is not very clear on the point.
*/
METHODDEF(boolean)
@@ -457,15 +462,18 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */
/* Establish EOBx (previous stage end-of-block) index */
- for (kex = cinfo->Se; kex > 0; kex--)
+ kex = cinfo->Se;
+ do {
if ((*block)[natural_order[kex]]) break;
+ } while (--kex);
- for (k = cinfo->Ss; k <= cinfo->Se; k++) {
- st = entropy->ac_stats[tbl] + 3 * (k - 1);
- if (k > kex)
+ k = cinfo->Ss - 1;
+ do {
+ st = entropy->ac_stats[tbl] + 3 * k;
+ if (k >= kex)
if (arith_decode(cinfo, st)) break; /* EOB flag */
for (;;) {
- thiscoef = *block + natural_order[k];
+ thiscoef = *block + natural_order[++k];
if (*thiscoef) { /* previously nonzero coef */
if (arith_decode(cinfo, st + 2)) {
if (*thiscoef < 0)
@@ -482,14 +490,14 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
*thiscoef = p1;
break;
}
- st += 3; k++;
- if (k > cinfo->Se) {
+ st += 3;
+ if (k >= cinfo->Se) {
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
entropy->ct = -1; /* spectral overflow */
return TRUE;
}
}
- }
+ } while (k < cinfo->Se);
return TRUE;
}
@@ -575,15 +583,19 @@ decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
/* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */
+ if (cinfo->lim_Se == 0) continue;
tbl = compptr->ac_tbl_no;
+ k = 0;
/* Figure F.20: Decode_AC_coefficients */
- for (k = 1; k <= cinfo->lim_Se; k++) {
- st = entropy->ac_stats[tbl] + 3 * (k - 1);
+ do {
+ st = entropy->ac_stats[tbl] + 3 * k;
if (arith_decode(cinfo, st)) break; /* EOB flag */
- while (arith_decode(cinfo, st + 1) == 0) {
- st += 3; k++;
- if (k > cinfo->lim_Se) {
+ for (;;) {
+ k++;
+ if (arith_decode(cinfo, st + 1)) break;
+ st += 3;
+ if (k >= cinfo->lim_Se) {
WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
entropy->ct = -1; /* spectral overflow */
return TRUE;
@@ -616,7 +628,7 @@ decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
if (arith_decode(cinfo, st)) v |= m;
v += 1; if (sign) v = -v;
(*block)[natural_order[k]] = (JCOEF) v;
- }
+ } while (k < cinfo->lim_Se);
}
return TRUE;
@@ -734,6 +746,17 @@ start_pass (j_decompress_ptr cinfo)
/*
+ * Finish up at the end of an arithmetic-compressed scan.
+ */
+
+METHODDEF(void)
+finish_pass (j_decompress_ptr cinfo)
+{
+ /* no work necessary here */
+}
+
+
+/*
* Module initialization routine for arithmetic entropy decoding.
*/
@@ -746,8 +769,9 @@ jinit_arith_decoder (j_decompress_ptr cinfo)
entropy = (arith_entropy_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(arith_entropy_decoder));
- cinfo->entropy = (struct jpeg_entropy_decoder *) entropy;
+ cinfo->entropy = &entropy->pub;
entropy->pub.start_pass = start_pass;
+ entropy->pub.finish_pass = finish_pass;
/* Mark tables unallocated */
for (i = 0; i < NUM_ARITH_TBLS; i++) {
diff --git a/3rdparty/libjpeg/jdatadst.c b/3rdparty/libjpeg/jdatadst.c
index a0ccfb20a66..5c8681c9e4a 100644
--- a/3rdparty/libjpeg/jdatadst.c
+++ b/3rdparty/libjpeg/jdatadst.c
@@ -2,7 +2,7 @@
* jdatadst.c
*
* Copyright (C) 1994-1996, Thomas G. Lane.
- * Modified 2009 by Guido Vollbeding.
+ * Modified 2009-2012 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -128,7 +128,7 @@ empty_mem_output_buffer (j_compress_ptr cinfo)
/* Try to allocate new buffer with double size */
nextsize = dest->bufsize * 2;
- nextbuffer = (JOCTET*)malloc(nextsize);
+ nextbuffer = (JOCTET *) malloc(nextsize);
if (nextbuffer == NULL)
ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10);
@@ -226,6 +226,9 @@ jpeg_stdio_dest (j_compress_ptr cinfo, FILE * outfile)
* larger memory, so the buffer is available to the application after
* finishing compression, and then the application is responsible for
* freeing the requested memory.
+ * Note: An initial buffer supplied by the caller is expected to be
+ * managed by the application. The library does not free such buffer
+ * when allocating a larger buffer.
*/
GLOBAL(void)
@@ -256,7 +259,7 @@ jpeg_mem_dest (j_compress_ptr cinfo,
if (*outbuffer == NULL || *outsize == 0) {
/* Allocate initial buffer */
- dest->newbuffer = *outbuffer = (unsigned char*)malloc(OUTPUT_BUF_SIZE);
+ dest->newbuffer = *outbuffer = (unsigned char *) malloc(OUTPUT_BUF_SIZE);
if (dest->newbuffer == NULL)
ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10);
*outsize = OUTPUT_BUF_SIZE;
diff --git a/3rdparty/libjpeg/jdatasrc.c b/3rdparty/libjpeg/jdatasrc.c
index c8fe3daf336..2a27cfed809 100644
--- a/3rdparty/libjpeg/jdatasrc.c
+++ b/3rdparty/libjpeg/jdatasrc.c
@@ -2,7 +2,7 @@
* jdatasrc.c
*
* Copyright (C) 1994-1996, Thomas G. Lane.
- * Modified 2009-2010 by Guido Vollbeding.
+ * Modified 2009-2015 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -121,16 +121,17 @@ fill_input_buffer (j_decompress_ptr cinfo)
METHODDEF(boolean)
fill_mem_input_buffer (j_decompress_ptr cinfo)
{
- static JOCTET mybuffer[4];
+ static const JOCTET mybuffer[4] = {
+ (JOCTET) 0xFF, (JOCTET) JPEG_EOI, 0, 0
+ };
/* The whole JPEG data is expected to reside in the supplied memory
* buffer, so any request for more data beyond the given buffer size
* is treated as an error.
*/
WARNMS(cinfo, JWRN_JPEG_EOF);
+
/* Insert a fake EOI marker */
- mybuffer[0] = (JOCTET) 0xFF;
- mybuffer[1] = (JOCTET) JPEG_EOI;
cinfo->src->next_input_byte = mybuffer;
cinfo->src->bytes_in_buffer = 2;
@@ -246,7 +247,7 @@ jpeg_stdio_src (j_decompress_ptr cinfo, FILE * infile)
GLOBAL(void)
jpeg_mem_src (j_decompress_ptr cinfo,
- unsigned char * inbuffer, unsigned long insize)
+ const unsigned char * inbuffer, unsigned long insize)
{
struct jpeg_source_mgr * src;
@@ -270,5 +271,5 @@ jpeg_mem_src (j_decompress_ptr cinfo,
src->resync_to_restart = jpeg_resync_to_restart; /* use default method */
src->term_source = term_source;
src->bytes_in_buffer = (size_t) insize;
- src->next_input_byte = (JOCTET *) inbuffer;
+ src->next_input_byte = (const JOCTET *) inbuffer;
}
diff --git a/3rdparty/libjpeg/jdcoefct.c b/3rdparty/libjpeg/jdcoefct.c
index 462e92c6125..ed02fc378f5 100644
--- a/3rdparty/libjpeg/jdcoefct.c
+++ b/3rdparty/libjpeg/jdcoefct.c
@@ -2,6 +2,7 @@
* jdcoefct.c
*
* Copyright (C) 1994-1997, Thomas G. Lane.
+ * Modified 2002-2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -162,8 +163,9 @@ decompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
MCU_col_num++) {
/* Try to fetch an MCU. Entropy decoder expects buffer to be zeroed. */
- jzero_far((void FAR *) coef->MCU_buffer[0],
- (size_t) (cinfo->blocks_in_MCU * SIZEOF(JBLOCK)));
+ if (cinfo->lim_Se) /* can bypass in DC only case */
+ FMEMZERO((void FAR *) coef->MCU_buffer[0],
+ (size_t) (cinfo->blocks_in_MCU * SIZEOF(JBLOCK)));
if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
/* Suspension forced; update state counters and exit */
coef->MCU_vert_offset = yoffset;
@@ -729,6 +731,9 @@ jinit_d_coef_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
coef->MCU_buffer[i] = buffer + i;
}
+ if (cinfo->lim_Se == 0) /* DC only case: want to bypass later */
+ FMEMZERO((void FAR *) buffer,
+ (size_t) (D_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)));
coef->pub.consume_data = dummy_consume_data;
coef->pub.decompress_data = decompress_onepass;
coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
diff --git a/3rdparty/libjpeg/jdcolor.c b/3rdparty/libjpeg/jdcolor.c
index 6c04dfe8aa1..29c30fae515 100644
--- a/3rdparty/libjpeg/jdcolor.c
+++ b/3rdparty/libjpeg/jdcolor.c
@@ -2,6 +2,7 @@
* jdcolor.c
*
* Copyright (C) 1991-1997, Thomas G. Lane.
+ * Modified 2011-2015 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -18,27 +19,57 @@
typedef struct {
struct jpeg_color_deconverter pub; /* public fields */
- /* Private state for YCC->RGB conversion */
+ /* Private state for YCbCr->RGB and BG_YCC->RGB conversion */
int * Cr_r_tab; /* => table for Cr to R conversion */
int * Cb_b_tab; /* => table for Cb to B conversion */
INT32 * Cr_g_tab; /* => table for Cr to G conversion */
INT32 * Cb_g_tab; /* => table for Cb to G conversion */
+
+ /* Private state for RGB->Y conversion */
+ INT32 * rgb_y_tab; /* => table for RGB to Y conversion */
} my_color_deconverter;
typedef my_color_deconverter * my_cconvert_ptr;
-/**************** YCbCr -> RGB conversion: most common case **************/
+/*************** YCbCr -> RGB conversion: most common case **************/
+/*************** BG_YCC -> RGB conversion: less common case **************/
+/*************** RGB -> Y conversion: less common case **************/
/*
- * YCbCr is defined per CCIR 601-1, except that Cb and Cr are
- * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
- * The conversion equations to be implemented are therefore
- * R = Y + 1.40200 * Cr
- * G = Y - 0.34414 * Cb - 0.71414 * Cr
- * B = Y + 1.77200 * Cb
+ * YCbCr is defined per Recommendation ITU-R BT.601-7 (03/2011),
+ * previously known as Recommendation CCIR 601-1, except that Cb and Cr
+ * are normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
+ * sRGB (standard RGB color space) is defined per IEC 61966-2-1:1999.
+ * sYCC (standard luma-chroma-chroma color space with extended gamut)
+ * is defined per IEC 61966-2-1:1999 Amendment A1:2003 Annex F.
+ * bg-sRGB and bg-sYCC (big gamut standard color spaces)
+ * are defined per IEC 61966-2-1:1999 Amendment A1:2003 Annex G.
+ * Note that the derived conversion coefficients given in some of these
+ * documents are imprecise. The general conversion equations are
+ *
+ * R = Y + K * (1 - Kr) * Cr
+ * G = Y - K * (Kb * (1 - Kb) * Cb + Kr * (1 - Kr) * Cr) / (1 - Kr - Kb)
+ * B = Y + K * (1 - Kb) * Cb
+ *
+ * Y = Kr * R + (1 - Kr - Kb) * G + Kb * B
+ *
+ * With Kr = 0.299 and Kb = 0.114 (derived according to SMPTE RP 177-1993
+ * from the 1953 FCC NTSC primaries and CIE Illuminant C), K = 2 for sYCC,
+ * the conversion equations to be implemented are therefore
+ *
+ * R = Y + 1.402 * Cr
+ * G = Y - 0.344136286 * Cb - 0.714136286 * Cr
+ * B = Y + 1.772 * Cb
+ *
+ * Y = 0.299 * R + 0.587 * G + 0.114 * B
+ *
* where Cb and Cr represent the incoming values less CENTERJSAMPLE.
- * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)
+ * For bg-sYCC, with K = 4, the equations are
+ *
+ * R = Y + 2.804 * Cr
+ * G = Y - 0.688272572 * Cb - 1.428272572 * Cr
+ * B = Y + 3.544 * Cb
*
* To avoid floating-point arithmetic, we represent the fractional constants
* as integers scaled up by 2^16 (about 4 digits precision); we have to divide
@@ -49,9 +80,9 @@ typedef my_color_deconverter * my_cconvert_ptr;
* For even more speed, we avoid doing any multiplications in the inner loop
* by precalculating the constants times Cb and Cr for all possible values.
* For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);
- * for 12-bit samples it is still acceptable. It's not very reasonable for
- * 16-bit samples, but if you want lossless storage you shouldn't be changing
- * colorspace anyway.
+ * for 9-bit to 12-bit samples it is still acceptable. It's not very
+ * reasonable for 16-bit samples, but if you want lossless storage you
+ * shouldn't be changing colorspace anyway.
* The Cr=>R and Cb=>B values can be rounded to integers in advance; the
* values for the G calculation are left scaled up, since we must add them
* together before rounding.
@@ -61,13 +92,66 @@ typedef my_color_deconverter * my_cconvert_ptr;
#define ONE_HALF ((INT32) 1 << (SCALEBITS-1))
#define FIX(x) ((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
+/* We allocate one big table for RGB->Y conversion and divide it up into
+ * three parts, instead of doing three alloc_small requests. This lets us
+ * use a single table base address, which can be held in a register in the
+ * inner loops on many machines (more than can hold all three addresses,
+ * anyway).
+ */
+
+#define R_Y_OFF 0 /* offset to R => Y section */
+#define G_Y_OFF (1*(MAXJSAMPLE+1)) /* offset to G => Y section */
+#define B_Y_OFF (2*(MAXJSAMPLE+1)) /* etc. */
+#define TABLE_SIZE (3*(MAXJSAMPLE+1))
+
/*
- * Initialize tables for YCC->RGB colorspace conversion.
+ * Initialize tables for YCbCr->RGB and BG_YCC->RGB colorspace conversion.
*/
LOCAL(void)
build_ycc_rgb_table (j_decompress_ptr cinfo)
+/* Normal case, sYCC */
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ int i;
+ INT32 x;
+ SHIFT_TEMPS
+
+ cconvert->Cr_r_tab = (int *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(int));
+ cconvert->Cb_b_tab = (int *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(int));
+ cconvert->Cr_g_tab = (INT32 *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(INT32));
+ cconvert->Cb_g_tab = (INT32 *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(INT32));
+
+ for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
+ /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
+ /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
+ /* Cr=>R value is nearest int to 1.402 * x */
+ cconvert->Cr_r_tab[i] = (int)
+ RIGHT_SHIFT(FIX(1.402) * x + ONE_HALF, SCALEBITS);
+ /* Cb=>B value is nearest int to 1.772 * x */
+ cconvert->Cb_b_tab[i] = (int)
+ RIGHT_SHIFT(FIX(1.772) * x + ONE_HALF, SCALEBITS);
+ /* Cr=>G value is scaled-up -0.714136286 * x */
+ cconvert->Cr_g_tab[i] = (- FIX(0.714136286)) * x;
+ /* Cb=>G value is scaled-up -0.344136286 * x */
+ /* We also add in ONE_HALF so that need not do it in inner loop */
+ cconvert->Cb_g_tab[i] = (- FIX(0.344136286)) * x + ONE_HALF;
+ }
+}
+
+
+LOCAL(void)
+build_bg_ycc_rgb_table (j_decompress_ptr cinfo)
+/* Wide gamut case, bg-sYCC */
{
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
int i;
@@ -90,17 +174,17 @@ build_ycc_rgb_table (j_decompress_ptr cinfo)
for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
/* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
/* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
- /* Cr=>R value is nearest int to 1.40200 * x */
+ /* Cr=>R value is nearest int to 2.804 * x */
cconvert->Cr_r_tab[i] = (int)
- RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS);
- /* Cb=>B value is nearest int to 1.77200 * x */
+ RIGHT_SHIFT(FIX(2.804) * x + ONE_HALF, SCALEBITS);
+ /* Cb=>B value is nearest int to 3.544 * x */
cconvert->Cb_b_tab[i] = (int)
- RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS);
- /* Cr=>G value is scaled-up -0.71414 * x */
- cconvert->Cr_g_tab[i] = (- FIX(0.71414)) * x;
- /* Cb=>G value is scaled-up -0.34414 * x */
+ RIGHT_SHIFT(FIX(3.544) * x + ONE_HALF, SCALEBITS);
+ /* Cr=>G value is scaled-up -1.428272572 * x */
+ cconvert->Cr_g_tab[i] = (- FIX(1.428272572)) * x;
+ /* Cb=>G value is scaled-up -0.688272572 * x */
/* We also add in ONE_HALF so that need not do it in inner loop */
- cconvert->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF;
+ cconvert->Cb_g_tab[i] = (- FIX(0.688272572)) * x + ONE_HALF;
}
}
@@ -145,19 +229,196 @@ ycc_rgb_convert (j_decompress_ptr cinfo,
y = GETJSAMPLE(inptr0[col]);
cb = GETJSAMPLE(inptr1[col]);
cr = GETJSAMPLE(inptr2[col]);
- /* Range-limiting is essential due to noise introduced by DCT losses. */
- outptr[RGB_RED] = range_limit[y + Crrtab[cr]];
+ /* Range-limiting is essential due to noise introduced by DCT losses,
+ * for extended gamut (sYCC) and wide gamut (bg-sYCC) encodings.
+ */
+ outptr[RGB_RED] = range_limit[y + Crrtab[cr]];
outptr[RGB_GREEN] = range_limit[y +
((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
SCALEBITS))];
- outptr[RGB_BLUE] = range_limit[y + Cbbtab[cb]];
+ outptr[RGB_BLUE] = range_limit[y + Cbbtab[cb]];
outptr += RGB_PIXELSIZE;
}
}
}
-/**************** Cases other than YCbCr -> RGB **************/
+/**************** Cases other than YCC -> RGB ****************/
+
+
+/*
+ * Initialize for RGB->grayscale colorspace conversion.
+ */
+
+LOCAL(void)
+build_rgb_y_table (j_decompress_ptr cinfo)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ INT32 * rgb_y_tab;
+ INT32 i;
+
+ /* Allocate and fill in the conversion tables. */
+ cconvert->rgb_y_tab = rgb_y_tab = (INT32 *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (TABLE_SIZE * SIZEOF(INT32)));
+
+ for (i = 0; i <= MAXJSAMPLE; i++) {
+ rgb_y_tab[i+R_Y_OFF] = FIX(0.299) * i;
+ rgb_y_tab[i+G_Y_OFF] = FIX(0.587) * i;
+ rgb_y_tab[i+B_Y_OFF] = FIX(0.114) * i + ONE_HALF;
+ }
+}
+
+
+/*
+ * Convert RGB to grayscale.
+ */
+
+METHODDEF(void)
+rgb_gray_convert (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION input_row,
+ JSAMPARRAY output_buf, int num_rows)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ register INT32 * ctab = cconvert->rgb_y_tab;
+ register int r, g, b;
+ register JSAMPROW outptr;
+ register JSAMPROW inptr0, inptr1, inptr2;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->output_width;
+
+ while (--num_rows >= 0) {
+ inptr0 = input_buf[0][input_row];
+ inptr1 = input_buf[1][input_row];
+ inptr2 = input_buf[2][input_row];
+ input_row++;
+ outptr = *output_buf++;
+ for (col = 0; col < num_cols; col++) {
+ r = GETJSAMPLE(inptr0[col]);
+ g = GETJSAMPLE(inptr1[col]);
+ b = GETJSAMPLE(inptr2[col]);
+ /* Y */
+ outptr[col] = (JSAMPLE)
+ ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
+ >> SCALEBITS);
+ }
+ }
+}
+
+
+/*
+ * [R-G,G,B-G] to [R,G,B] conversion with modulo calculation
+ * (inverse color transform).
+ * This can be seen as an adaption of the general YCbCr->RGB
+ * conversion equation with Kr = Kb = 0, while replacing the
+ * normalization by modulo calculation.
+ */
+
+METHODDEF(void)
+rgb1_rgb_convert (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION input_row,
+ JSAMPARRAY output_buf, int num_rows)
+{
+ register int r, g, b;
+ register JSAMPROW outptr;
+ register JSAMPROW inptr0, inptr1, inptr2;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->output_width;
+
+ while (--num_rows >= 0) {
+ inptr0 = input_buf[0][input_row];
+ inptr1 = input_buf[1][input_row];
+ inptr2 = input_buf[2][input_row];
+ input_row++;
+ outptr = *output_buf++;
+ for (col = 0; col < num_cols; col++) {
+ r = GETJSAMPLE(inptr0[col]);
+ g = GETJSAMPLE(inptr1[col]);
+ b = GETJSAMPLE(inptr2[col]);
+ /* Assume that MAXJSAMPLE+1 is a power of 2, so that the MOD
+ * (modulo) operator is equivalent to the bitmask operator AND.
+ */
+ outptr[RGB_RED] = (JSAMPLE) ((r + g - CENTERJSAMPLE) & MAXJSAMPLE);
+ outptr[RGB_GREEN] = (JSAMPLE) g;
+ outptr[RGB_BLUE] = (JSAMPLE) ((b + g - CENTERJSAMPLE) & MAXJSAMPLE);
+ outptr += RGB_PIXELSIZE;
+ }
+ }
+}
+
+
+/*
+ * [R-G,G,B-G] to grayscale conversion with modulo calculation
+ * (inverse color transform).
+ */
+
+METHODDEF(void)
+rgb1_gray_convert (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION input_row,
+ JSAMPARRAY output_buf, int num_rows)
+{
+ my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+ register INT32 * ctab = cconvert->rgb_y_tab;
+ register int r, g, b;
+ register JSAMPROW outptr;
+ register JSAMPROW inptr0, inptr1, inptr2;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->output_width;
+
+ while (--num_rows >= 0) {
+ inptr0 = input_buf[0][input_row];
+ inptr1 = input_buf[1][input_row];
+ inptr2 = input_buf[2][input_row];
+ input_row++;
+ outptr = *output_buf++;
+ for (col = 0; col < num_cols; col++) {
+ r = GETJSAMPLE(inptr0[col]);
+ g = GETJSAMPLE(inptr1[col]);
+ b = GETJSAMPLE(inptr2[col]);
+ /* Assume that MAXJSAMPLE+1 is a power of 2, so that the MOD
+ * (modulo) operator is equivalent to the bitmask operator AND.
+ */
+ r = (r + g - CENTERJSAMPLE) & MAXJSAMPLE;
+ b = (b + g - CENTERJSAMPLE) & MAXJSAMPLE;
+ /* Y */
+ outptr[col] = (JSAMPLE)
+ ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
+ >> SCALEBITS);
+ }
+ }
+}
+
+
+/*
+ * No colorspace change, but conversion from separate-planes
+ * to interleaved representation.
+ */
+
+METHODDEF(void)
+rgb_convert (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION input_row,
+ JSAMPARRAY output_buf, int num_rows)
+{
+ register JSAMPROW outptr;
+ register JSAMPROW inptr0, inptr1, inptr2;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->output_width;
+
+ while (--num_rows >= 0) {
+ inptr0 = input_buf[0][input_row];
+ inptr1 = input_buf[1][input_row];
+ inptr2 = input_buf[2][input_row];
+ input_row++;
+ outptr = *output_buf++;
+ for (col = 0; col < num_cols; col++) {
+ /* We can dispense with GETJSAMPLE() here */
+ outptr[RGB_RED] = inptr0[col];
+ outptr[RGB_GREEN] = inptr1[col];
+ outptr[RGB_BLUE] = inptr2[col];
+ outptr += RGB_PIXELSIZE;
+ }
+ }
+}
/*
@@ -170,19 +431,20 @@ null_convert (j_decompress_ptr cinfo,
JSAMPIMAGE input_buf, JDIMENSION input_row,
JSAMPARRAY output_buf, int num_rows)
{
- register JSAMPROW inptr, outptr;
- register JDIMENSION count;
- register int num_components = cinfo->num_components;
- JDIMENSION num_cols = cinfo->output_width;
int ci;
+ register int nc = cinfo->num_components;
+ register JSAMPROW outptr;
+ register JSAMPROW inptr;
+ register JDIMENSION col;
+ JDIMENSION num_cols = cinfo->output_width;
while (--num_rows >= 0) {
- for (ci = 0; ci < num_components; ci++) {
+ for (ci = 0; ci < nc; ci++) {
inptr = input_buf[ci][input_row];
outptr = output_buf[0] + ci;
- for (count = num_cols; count > 0; count--) {
+ for (col = 0; col < num_cols; col++) {
*outptr = *inptr++; /* needn't bother with GETJSAMPLE() here */
- outptr += num_components;
+ outptr += nc;
}
}
input_row++;
@@ -193,7 +455,7 @@ null_convert (j_decompress_ptr cinfo,
/*
* Color conversion for grayscale: just copy the data.
- * This also works for YCbCr -> grayscale conversion, in which
+ * This also works for YCC -> grayscale conversion, in which
* we just copy the Y (luminance) component and ignore chrominance.
*/
@@ -218,7 +480,8 @@ gray_rgb_convert (j_decompress_ptr cinfo,
JSAMPIMAGE input_buf, JDIMENSION input_row,
JSAMPARRAY output_buf, int num_rows)
{
- register JSAMPROW inptr, outptr;
+ register JSAMPROW outptr;
+ register JSAMPROW inptr;
register JDIMENSION col;
JDIMENSION num_cols = cinfo->output_width;
@@ -271,7 +534,9 @@ ycck_cmyk_convert (j_decompress_ptr cinfo,
y = GETJSAMPLE(inptr0[col]);
cb = GETJSAMPLE(inptr1[col]);
cr = GETJSAMPLE(inptr2[col]);
- /* Range-limiting is essential due to noise introduced by DCT losses. */
+ /* Range-limiting is essential due to noise introduced by DCT losses,
+ * and for extended gamut encodings (sYCC).
+ */
outptr[0] = range_limit[MAXJSAMPLE - (y + Crrtab[cr])]; /* red */
outptr[1] = range_limit[MAXJSAMPLE - (y + /* green */
((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr],
@@ -309,7 +574,7 @@ jinit_color_deconverter (j_decompress_ptr cinfo)
cconvert = (my_cconvert_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_color_deconverter));
- cinfo->cconvert = (struct jpeg_color_deconverter *) cconvert;
+ cinfo->cconvert = &cconvert->pub;
cconvert->pub.start_pass = start_pass_dcolor;
/* Make sure num_components agrees with jpeg_color_space */
@@ -321,6 +586,8 @@ jinit_color_deconverter (j_decompress_ptr cinfo)
case JCS_RGB:
case JCS_YCbCr:
+ case JCS_BG_RGB:
+ case JCS_BG_YCC:
if (cinfo->num_components != 3)
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
break;
@@ -337,6 +604,12 @@ jinit_color_deconverter (j_decompress_ptr cinfo)
break;
}
+ /* Support color transform only for RGB colorspaces */
+ if (cinfo->color_transform &&
+ cinfo->jpeg_color_space != JCS_RGB &&
+ cinfo->jpeg_color_space != JCS_BG_RGB)
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+
/* Set out_color_components and conversion method based on requested space.
* Also clear the component_needed flags for any unused components,
* so that earlier pipeline stages can avoid useless computation.
@@ -345,38 +618,94 @@ jinit_color_deconverter (j_decompress_ptr cinfo)
switch (cinfo->out_color_space) {
case JCS_GRAYSCALE:
cinfo->out_color_components = 1;
- if (cinfo->jpeg_color_space == JCS_GRAYSCALE ||
- cinfo->jpeg_color_space == JCS_YCbCr) {
+ switch (cinfo->jpeg_color_space) {
+ case JCS_GRAYSCALE:
+ case JCS_YCbCr:
+ case JCS_BG_YCC:
cconvert->pub.color_convert = grayscale_convert;
/* For color->grayscale conversion, only the Y (0) component is needed */
for (ci = 1; ci < cinfo->num_components; ci++)
cinfo->comp_info[ci].component_needed = FALSE;
- } else
+ break;
+ case JCS_RGB:
+ switch (cinfo->color_transform) {
+ case JCT_NONE:
+ cconvert->pub.color_convert = rgb_gray_convert;
+ break;
+ case JCT_SUBTRACT_GREEN:
+ cconvert->pub.color_convert = rgb1_gray_convert;
+ break;
+ default:
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ }
+ build_rgb_y_table(cinfo);
+ break;
+ default:
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ }
break;
case JCS_RGB:
cinfo->out_color_components = RGB_PIXELSIZE;
- if (cinfo->jpeg_color_space == JCS_YCbCr) {
+ switch (cinfo->jpeg_color_space) {
+ case JCS_GRAYSCALE:
+ cconvert->pub.color_convert = gray_rgb_convert;
+ break;
+ case JCS_YCbCr:
cconvert->pub.color_convert = ycc_rgb_convert;
build_ycc_rgb_table(cinfo);
- } else if (cinfo->jpeg_color_space == JCS_GRAYSCALE) {
- cconvert->pub.color_convert = gray_rgb_convert;
- } else if (cinfo->jpeg_color_space == JCS_RGB && RGB_PIXELSIZE == 3) {
- cconvert->pub.color_convert = null_convert;
+ break;
+ case JCS_BG_YCC:
+ cconvert->pub.color_convert = ycc_rgb_convert;
+ build_bg_ycc_rgb_table(cinfo);
+ break;
+ case JCS_RGB:
+ switch (cinfo->color_transform) {
+ case JCT_NONE:
+ cconvert->pub.color_convert = rgb_convert;
+ break;
+ case JCT_SUBTRACT_GREEN:
+ cconvert->pub.color_convert = rgb1_rgb_convert;
+ break;
+ default:
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ }
+ break;
+ default:
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ }
+ break;
+
+ case JCS_BG_RGB:
+ cinfo->out_color_components = RGB_PIXELSIZE;
+ if (cinfo->jpeg_color_space == JCS_BG_RGB) {
+ switch (cinfo->color_transform) {
+ case JCT_NONE:
+ cconvert->pub.color_convert = rgb_convert;
+ break;
+ case JCT_SUBTRACT_GREEN:
+ cconvert->pub.color_convert = rgb1_rgb_convert;
+ break;
+ default:
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ }
} else
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
break;
case JCS_CMYK:
cinfo->out_color_components = 4;
- if (cinfo->jpeg_color_space == JCS_YCCK) {
+ switch (cinfo->jpeg_color_space) {
+ case JCS_YCCK:
cconvert->pub.color_convert = ycck_cmyk_convert;
build_ycc_rgb_table(cinfo);
- } else if (cinfo->jpeg_color_space == JCS_CMYK) {
+ break;
+ case JCS_CMYK:
cconvert->pub.color_convert = null_convert;
- } else
+ break;
+ default:
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ }
break;
default:
diff --git a/3rdparty/libjpeg/jdct.h b/3rdparty/libjpeg/jdct.h
index 360dec80c94..5d0fe83fb25 100644
--- a/3rdparty/libjpeg/jdct.h
+++ b/3rdparty/libjpeg/jdct.h
@@ -2,6 +2,7 @@
* jdct.h
*
* Copyright (C) 1994-1996, Thomas G. Lane.
+ * Modified 2002-2015 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -78,13 +79,16 @@ typedef FAST_FLOAT FLOAT_MULT_TYPE; /* preferred floating type */
* converting them to unsigned form (0..MAXJSAMPLE). The raw outputs could
* be quite far out of range if the input data is corrupt, so a bulletproof
* range-limiting step is required. We use a mask-and-table-lookup method
- * to do the combined operations quickly. See the comments with
- * prepare_range_limit_table (in jdmaster.c) for more info.
+ * to do the combined operations quickly, assuming that MAXJSAMPLE+1
+ * is a power of 2. See the comments with prepare_range_limit_table
+ * (in jdmaster.c) for more info.
*/
-#define IDCT_range_limit(cinfo) ((cinfo)->sample_range_limit + CENTERJSAMPLE)
-
#define RANGE_MASK (MAXJSAMPLE * 4 + 3) /* 2 bits wider than legal samples */
+#define RANGE_CENTER (MAXJSAMPLE * 2 + 2)
+#define RANGE_SUBSET (RANGE_CENTER - CENTERJSAMPLE)
+
+#define IDCT_range_limit(cinfo) ((cinfo)->sample_range_limit - RANGE_SUBSET)
/* Short forms of external names for systems with brain-damaged linkers. */
@@ -391,3 +395,23 @@ EXTERN(void) jpeg_idct_1x2
#ifndef MULTIPLY16V16 /* default definition */
#define MULTIPLY16V16(var1,var2) ((var1) * (var2))
#endif
+
+/* Like RIGHT_SHIFT, but applies to a DCTELEM.
+ * We assume that int right shift is unsigned if INT32 right shift is.
+ */
+
+#ifdef RIGHT_SHIFT_IS_UNSIGNED
+#define ISHIFT_TEMPS DCTELEM ishift_temp;
+#if BITS_IN_JSAMPLE == 8
+#define DCTELEMBITS 16 /* DCTELEM may be 16 or 32 bits */
+#else
+#define DCTELEMBITS 32 /* DCTELEM must be 32 bits */
+#endif
+#define IRIGHT_SHIFT(x,shft) \
+ ((ishift_temp = (x)) < 0 ? \
+ (ishift_temp >> (shft)) | ((~((DCTELEM) 0)) << (DCTELEMBITS-(shft))) : \
+ (ishift_temp >> (shft)))
+#else
+#define ISHIFT_TEMPS
+#define IRIGHT_SHIFT(x,shft) ((x) >> (shft))
+#endif
diff --git a/3rdparty/libjpeg/jddctmgr.c b/3rdparty/libjpeg/jddctmgr.c
index 0ded9d57413..9ecfbb5107e 100644
--- a/3rdparty/libjpeg/jddctmgr.c
+++ b/3rdparty/libjpeg/jddctmgr.c
@@ -2,7 +2,7 @@
* jddctmgr.c
*
* Copyright (C) 1994-1996, Thomas G. Lane.
- * Modified 2002-2010 by Guido Vollbeding.
+ * Modified 2002-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -368,7 +368,7 @@ jinit_inverse_dct (j_decompress_ptr cinfo)
idct = (my_idct_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_idct_controller));
- cinfo->idct = (struct jpeg_inverse_dct *) idct;
+ cinfo->idct = &idct->pub;
idct->pub.start_pass = start_pass;
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
diff --git a/3rdparty/libjpeg/jdhuff.c b/3rdparty/libjpeg/jdhuff.c
index 06f92fe47f6..6920e207c8e 100644
--- a/3rdparty/libjpeg/jdhuff.c
+++ b/3rdparty/libjpeg/jdhuff.c
@@ -2,7 +2,7 @@
* jdhuff.c
*
* Copyright (C) 1991-1997, Thomas G. Lane.
- * Modified 2006-2009 by Guido Vollbeding.
+ * Modified 2006-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -628,6 +628,22 @@ jpeg_huff_decode (bitread_working_state * state,
/*
+ * Finish up at the end of a Huffman-compressed scan.
+ */
+
+METHODDEF(void)
+finish_pass_huff (j_decompress_ptr cinfo)
+{
+ huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
+
+ /* Throw away any unused bits remaining in bit buffer; */
+ /* include any full bytes in next_marker's count of discarded bytes */
+ cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8;
+ entropy->bitstate.bits_left = 0;
+}
+
+
+/*
* Check for a restart marker & resynchronize decoder.
* Returns FALSE if must suspend.
*/
@@ -638,10 +654,7 @@ process_restart (j_decompress_ptr cinfo)
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
int ci;
- /* Throw away any unused bits remaining in bit buffer; */
- /* include any full bytes in next_marker's count of discarded bytes */
- cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8;
- entropy->bitstate.bits_left = 0;
+ finish_pass_huff(cinfo);
/* Advance past the RSTn marker */
if (! (*cinfo->marker->read_restart_marker) (cinfo))
@@ -797,7 +810,7 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
/* There is always only one block per MCU */
- if (EOBRUN > 0) /* if it's a band of zeroes... */
+ if (EOBRUN) /* if it's a band of zeroes... */
EOBRUN--; /* ...process it now (we do nothing) */
else {
BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
@@ -816,18 +829,17 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
/* Scale and output coefficient in natural (dezigzagged) order */
(*block)[natural_order[k]] = (JCOEF) (s << Al);
} else {
- if (r == 15) { /* ZRL */
- k += 15; /* skip 15 zeroes in band */
- } else { /* EOBr, run length is 2^r + appended bits */
- EOBRUN = 1 << r;
+ if (r != 15) { /* EOBr, run length is 2^r + appended bits */
if (r) { /* EOBr, r > 0 */
+ EOBRUN = 1 << r;
CHECK_BIT_BUFFER(br_state, r, return FALSE);
r = GET_BITS(r);
EOBRUN += r;
+ EOBRUN--; /* this band is processed at this moment */
}
- EOBRUN--; /* this band is processed at this moment */
break; /* force end-of-band */
}
+ k += 15; /* ZRL: skip 15 zeroes in band */
}
}
@@ -847,17 +859,15 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
/*
* MCU decoding for DC successive approximation refinement scan.
- * Note: we assume such scans can be multi-component, although the spec
- * is not very clear on the point.
+ * Note: we assume such scans can be multi-component,
+ * although the spec is not very clear on the point.
*/
METHODDEF(boolean)
decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
{
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
- int p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
- int blkn;
- JBLOCKROW block;
+ int p1, blkn;
BITREAD_STATE_VARS;
/* Process restart marker if needed; may have to suspend */
@@ -874,15 +884,15 @@ decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
/* Load up working state */
BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
+ p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
+
/* Outer loop handles each block in the MCU */
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
- block = MCU_data[blkn];
-
/* Encoded data is simply the next bit of the two's-complement DC value */
CHECK_BIT_BUFFER(br_state, 1, return FALSE);
if (GET_BITS(1))
- (*block)[0] |= p1;
+ MCU_data[blkn][0][0] |= p1;
/* Note: since we use |=, repeating the assignment later is safe */
}
@@ -951,7 +961,7 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
k = cinfo->Ss;
if (EOBRUN == 0) {
- for (; k <= Se; k++) {
+ do {
HUFF_DECODE(s, br_state, tbl, goto undoit, label3);
r = s >> 4;
s &= 15;
@@ -981,7 +991,7 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
*/
do {
thiscoef = *block + natural_order[k];
- if (*thiscoef != 0) {
+ if (*thiscoef) {
CHECK_BIT_BUFFER(br_state, 1, goto undoit);
if (GET_BITS(1)) {
if ((*thiscoef & p1) == 0) { /* do nothing if already set it */
@@ -1004,18 +1014,19 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
/* Remember its position in case we have to suspend */
newnz_pos[num_newnz++] = pos;
}
- }
+ k++;
+ } while (k <= Se);
}
- if (EOBRUN > 0) {
+ if (EOBRUN) {
/* Scan any remaining coefficient positions after the end-of-band
* (the last newly nonzero coefficient, if any). Append a correction
* bit to each already-nonzero coefficient. A correction bit is 1
* if the absolute value of the coefficient must be increased.
*/
- for (; k <= Se; k++) {
+ do {
thiscoef = *block + natural_order[k];
- if (*thiscoef != 0) {
+ if (*thiscoef) {
CHECK_BIT_BUFFER(br_state, 1, goto undoit);
if (GET_BITS(1)) {
if ((*thiscoef & p1) == 0) { /* do nothing if already changed it */
@@ -1026,7 +1037,8 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
}
}
}
- }
+ k++;
+ } while (k <= Se);
/* Count one block completed in EOB run */
EOBRUN--;
}
@@ -1043,7 +1055,7 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
undoit:
/* Re-zero any output coefficients that we made newly nonzero */
- while (num_newnz > 0)
+ while (num_newnz)
(*block)[newnz_pos[--num_newnz]] = 0;
return FALSE;
@@ -1514,8 +1526,9 @@ jinit_huff_decoder (j_decompress_ptr cinfo)
entropy = (huff_entropy_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(huff_entropy_decoder));
- cinfo->entropy = (struct jpeg_entropy_decoder *) entropy;
+ cinfo->entropy = &entropy->pub;
entropy->pub.start_pass = start_pass_huff_decoder;
+ entropy->pub.finish_pass = finish_pass_huff;
if (cinfo->progressive_mode) {
/* Create progression status table */
diff --git a/3rdparty/libjpeg/jdinput.c b/3rdparty/libjpeg/jdinput.c
index 2c5c717b9c3..0199553e896 100644
--- a/3rdparty/libjpeg/jdinput.c
+++ b/3rdparty/libjpeg/jdinput.c
@@ -2,7 +2,7 @@
* jdinput.c
*
* Copyright (C) 1991-1997, Thomas G. Lane.
- * Modified 2002-2009 by Guido Vollbeding.
+ * Modified 2002-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -196,7 +196,7 @@ jpeg_core_output_dimensions (j_decompress_ptr cinfo)
/* Hardwire it to "no scaling" */
cinfo->output_width = cinfo->image_width;
cinfo->output_height = cinfo->image_height;
- /* jdinput.c has already initialized DCT_scaled_size,
+ /* initial_setup has already initialized DCT_scaled_size,
* and has computed unscaled downsampled_width and downsampled_height.
*/
@@ -216,8 +216,8 @@ initial_setup (j_decompress_ptr cinfo)
(long) cinfo->image_width > (long) JPEG_MAX_DIMENSION)
ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);
- /* For now, precision must match compiled-in value... */
- if (cinfo->data_precision != BITS_IN_JSAMPLE)
+ /* Only 8 to 12 bits data precision are supported for DCT based JPEG */
+ if (cinfo->data_precision < 8 || cinfo->data_precision > 12)
ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
/* Check that number of components won't exceed internal array sizes */
@@ -537,6 +537,7 @@ start_input_pass (j_decompress_ptr cinfo)
METHODDEF(void)
finish_input_pass (j_decompress_ptr cinfo)
{
+ (*cinfo->entropy->finish_pass) (cinfo);
cinfo->inputctl->consume_input = consume_markers;
}
@@ -646,7 +647,7 @@ jinit_input_controller (j_decompress_ptr cinfo)
inputctl = (my_inputctl_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
SIZEOF(my_input_controller));
- cinfo->inputctl = (struct jpeg_input_controller *) inputctl;
+ cinfo->inputctl = &inputctl->pub;
/* Initialize method pointers */
inputctl->pub.consume_input = consume_markers;
inputctl->pub.reset_input_controller = reset_input_controller;
diff --git a/3rdparty/libjpeg/jdmainct.c b/3rdparty/libjpeg/jdmainct.c
index b1defa2facc..52091fb2bed 100644
--- a/3rdparty/libjpeg/jdmainct.c
+++ b/3rdparty/libjpeg/jdmainct.c
@@ -2,6 +2,7 @@
* jdmainct.c
*
* Copyright (C) 1994-1996, Thomas G. Lane.
+ * Modified 2002-2012 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -159,7 +160,7 @@ alloc_funny_pointers (j_decompress_ptr cinfo)
* This is done only once, not once per pass.
*/
{
- my_main_ptr mymain = (my_main_ptr) cinfo->main;
+ my_main_ptr mainp = (my_main_ptr) cinfo->main;
int ci, rgroup;
int M = cinfo->min_DCT_v_scaled_size;
jpeg_component_info *compptr;
@@ -168,10 +169,10 @@ alloc_funny_pointers (j_decompress_ptr cinfo)
/* Get top-level space for component array pointers.
* We alloc both arrays with one call to save a few cycles.
*/
- mymain->xbuffer[0] = (JSAMPIMAGE)
+ mainp->xbuffer[0] = (JSAMPIMAGE)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
cinfo->num_components * 2 * SIZEOF(JSAMPARRAY));
- mymain->xbuffer[1] = mymain->xbuffer[0] + cinfo->num_components;
+ mainp->xbuffer[1] = mainp->xbuffer[0] + cinfo->num_components;
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
ci++, compptr++) {
@@ -184,9 +185,9 @@ alloc_funny_pointers (j_decompress_ptr cinfo)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
2 * (rgroup * (M + 4)) * SIZEOF(JSAMPROW));
xbuf += rgroup; /* want one row group at negative offsets */
- mymain->xbuffer[0][ci] = xbuf;
+ mainp->xbuffer[0][ci] = xbuf;
xbuf += rgroup * (M + 4);
- mymain->xbuffer[1][ci] = xbuf;
+ mainp->xbuffer[1][ci] = xbuf;
}
}
@@ -200,7 +201,7 @@ make_funny_pointers (j_decompress_ptr cinfo)
* This will be repeated at the beginning of each pass.
*/
{
- my_main_ptr mymain = (my_main_ptr) cinfo->main;
+ my_main_ptr mainp = (my_main_ptr) cinfo->main;
int ci, i, rgroup;
int M = cinfo->min_DCT_v_scaled_size;
jpeg_component_info *compptr;
@@ -210,10 +211,10 @@ make_funny_pointers (j_decompress_ptr cinfo)
ci++, compptr++) {
rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /
cinfo->min_DCT_v_scaled_size; /* height of a row group of component */
- xbuf0 = mymain->xbuffer[0][ci];
- xbuf1 = mymain->xbuffer[1][ci];
+ xbuf0 = mainp->xbuffer[0][ci];
+ xbuf1 = mainp->xbuffer[1][ci];
/* First copy the workspace pointers as-is */
- buf = mymain->buffer[ci];
+ buf = mainp->buffer[ci];
for (i = 0; i < rgroup * (M + 2); i++) {
xbuf0[i] = xbuf1[i] = buf[i];
}
@@ -240,7 +241,7 @@ set_wraparound_pointers (j_decompress_ptr cinfo)
* This changes the pointer list state from top-of-image to the normal state.
*/
{
- my_main_ptr mymain = (my_main_ptr) cinfo->main;
+ my_main_ptr mainp = (my_main_ptr) cinfo->main;
int ci, i, rgroup;
int M = cinfo->min_DCT_v_scaled_size;
jpeg_component_info *compptr;
@@ -250,8 +251,8 @@ set_wraparound_pointers (j_decompress_ptr cinfo)
ci++, compptr++) {
rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /
cinfo->min_DCT_v_scaled_size; /* height of a row group of component */
- xbuf0 = mymain->xbuffer[0][ci];
- xbuf1 = mymain->xbuffer[1][ci];
+ xbuf0 = mainp->xbuffer[0][ci];
+ xbuf1 = mainp->xbuffer[1][ci];
for (i = 0; i < rgroup; i++) {
xbuf0[i - rgroup] = xbuf0[rgroup*(M+1) + i];
xbuf1[i - rgroup] = xbuf1[rgroup*(M+1) + i];
@@ -269,7 +270,7 @@ set_bottom_pointers (j_decompress_ptr cinfo)
* Also sets rowgroups_avail to indicate number of nondummy row groups in row.
*/
{
- my_main_ptr mymain = (my_main_ptr) cinfo->main;
+ my_main_ptr mainp = (my_main_ptr) cinfo->main;
int ci, i, rgroup, iMCUheight, rows_left;
jpeg_component_info *compptr;
JSAMPARRAY xbuf;
@@ -286,12 +287,12 @@ set_bottom_pointers (j_decompress_ptr cinfo)
* so we need only do it once.
*/
if (ci == 0) {
- mymain->rowgroups_avail = (JDIMENSION) ((rows_left-1) / rgroup + 1);
+ mainp->rowgroups_avail = (JDIMENSION) ((rows_left-1) / rgroup + 1);
}
/* Duplicate the last real sample row rgroup*2 times; this pads out the
* last partial rowgroup and ensures at least one full rowgroup of context.
*/
- xbuf = mymain->xbuffer[mymain->whichptr][ci];
+ xbuf = mainp->xbuffer[mainp->whichptr][ci];
for (i = 0; i < rgroup * 2; i++) {
xbuf[rows_left + i] = xbuf[rows_left-1];
}
@@ -306,27 +307,27 @@ set_bottom_pointers (j_decompress_ptr cinfo)
METHODDEF(void)
start_pass_main (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)
{
- my_main_ptr mymain = (my_main_ptr) cinfo->main;
+ my_main_ptr mainp = (my_main_ptr) cinfo->main;
switch (pass_mode) {
case JBUF_PASS_THRU:
if (cinfo->upsample->need_context_rows) {
- mymain->pub.process_data = process_data_context_main;
+ mainp->pub.process_data = process_data_context_main;
make_funny_pointers(cinfo); /* Create the xbuffer[] lists */
- mymain->whichptr = 0; /* Read first iMCU row into xbuffer[0] */
- mymain->context_state = CTX_PREPARE_FOR_IMCU;
- mymain->iMCU_row_ctr = 0;
+ mainp->whichptr = 0; /* Read first iMCU row into xbuffer[0] */
+ mainp->context_state = CTX_PREPARE_FOR_IMCU;
+ mainp->iMCU_row_ctr = 0;
} else {
/* Simple case with no context needed */
- mymain->pub.process_data = process_data_simple_main;
+ mainp->pub.process_data = process_data_simple_main;
}
- mymain->buffer_full = FALSE; /* Mark buffer empty */
- mymain->rowgroup_ctr = 0;
+ mainp->buffer_full = FALSE; /* Mark buffer empty */
+ mainp->rowgroup_ctr = 0;
break;
#ifdef QUANT_2PASS_SUPPORTED
case JBUF_CRANK_DEST:
/* For last pass of 2-pass quantization, just crank the postprocessor */
- mymain->pub.process_data = process_data_crank_post;
+ mainp->pub.process_data = process_data_crank_post;
break;
#endif
default:
@@ -346,14 +347,14 @@ process_data_simple_main (j_decompress_ptr cinfo,
JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
JDIMENSION out_rows_avail)
{
- my_main_ptr mymain = (my_main_ptr) cinfo->main;
+ my_main_ptr mainp = (my_main_ptr) cinfo->main;
JDIMENSION rowgroups_avail;
/* Read input data if we haven't filled the main buffer yet */
- if (! mymain->buffer_full) {
- if (! (*cinfo->coef->decompress_data) (cinfo, mymain->buffer))
+ if (! mainp->buffer_full) {
+ if (! (*cinfo->coef->decompress_data) (cinfo, mainp->buffer))
return; /* suspension forced, can do nothing more */
- mymain->buffer_full = TRUE; /* OK, we have an iMCU row to work with */
+ mainp->buffer_full = TRUE; /* OK, we have an iMCU row to work with */
}
/* There are always min_DCT_scaled_size row groups in an iMCU row. */
@@ -364,14 +365,14 @@ process_data_simple_main (j_decompress_ptr cinfo,
*/
/* Feed the postprocessor */
- (*cinfo->post->post_process_data) (cinfo, mymain->buffer,
- &mymain->rowgroup_ctr, rowgroups_avail,
+ (*cinfo->post->post_process_data) (cinfo, mainp->buffer,
+ &mainp->rowgroup_ctr, rowgroups_avail,
output_buf, out_row_ctr, out_rows_avail);
/* Has postprocessor consumed all the data yet? If so, mark buffer empty */
- if (mymain->rowgroup_ctr >= rowgroups_avail) {
- mymain->buffer_full = FALSE;
- mymain->rowgroup_ctr = 0;
+ if (mainp->rowgroup_ctr >= rowgroups_avail) {
+ mainp->buffer_full = FALSE;
+ mainp->rowgroup_ctr = 0;
}
}
@@ -386,15 +387,15 @@ process_data_context_main (j_decompress_ptr cinfo,
JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
JDIMENSION out_rows_avail)
{
- my_main_ptr mymain = (my_main_ptr) cinfo->main;
+ my_main_ptr mainp = (my_main_ptr) cinfo->main;
/* Read input data if we haven't filled the main buffer yet */
- if (! mymain->buffer_full) {
+ if (! mainp->buffer_full) {
if (! (*cinfo->coef->decompress_data) (cinfo,
- mymain->xbuffer[mymain->whichptr]))
+ mainp->xbuffer[mainp->whichptr]))
return; /* suspension forced, can do nothing more */
- mymain->buffer_full = TRUE; /* OK, we have an iMCU row to work with */
- mymain->iMCU_row_ctr++; /* count rows received */
+ mainp->buffer_full = TRUE; /* OK, we have an iMCU row to work with */
+ mainp->iMCU_row_ctr++; /* count rows received */
}
/* Postprocessor typically will not swallow all the input data it is handed
@@ -402,47 +403,47 @@ process_data_context_main (j_decompress_ptr cinfo,
* to exit and restart. This switch lets us keep track of how far we got.
* Note that each case falls through to the next on successful completion.
*/
- switch (mymain->context_state) {
+ switch (mainp->context_state) {
case CTX_POSTPONED_ROW:
/* Call postprocessor using previously set pointers for postponed row */
- (*cinfo->post->post_process_data) (cinfo, mymain->xbuffer[mymain->whichptr],
- &mymain->rowgroup_ctr, mymain->rowgroups_avail,
+ (*cinfo->post->post_process_data) (cinfo, mainp->xbuffer[mainp->whichptr],
+ &mainp->rowgroup_ctr, mainp->rowgroups_avail,
output_buf, out_row_ctr, out_rows_avail);
- if (mymain->rowgroup_ctr < mymain->rowgroups_avail)
+ if (mainp->rowgroup_ctr < mainp->rowgroups_avail)
return; /* Need to suspend */
- mymain->context_state = CTX_PREPARE_FOR_IMCU;
+ mainp->context_state = CTX_PREPARE_FOR_IMCU;
if (*out_row_ctr >= out_rows_avail)
return; /* Postprocessor exactly filled output buf */
/*FALLTHROUGH*/
case CTX_PREPARE_FOR_IMCU:
/* Prepare to process first M-1 row groups of this iMCU row */
- mymain->rowgroup_ctr = 0;
- mymain->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_v_scaled_size - 1);
+ mainp->rowgroup_ctr = 0;
+ mainp->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_v_scaled_size - 1);
/* Check for bottom of image: if so, tweak pointers to "duplicate"
* the last sample row, and adjust rowgroups_avail to ignore padding rows.
*/
- if (mymain->iMCU_row_ctr == cinfo->total_iMCU_rows)
+ if (mainp->iMCU_row_ctr == cinfo->total_iMCU_rows)
set_bottom_pointers(cinfo);
- mymain->context_state = CTX_PROCESS_IMCU;
+ mainp->context_state = CTX_PROCESS_IMCU;
/*FALLTHROUGH*/
case CTX_PROCESS_IMCU:
/* Call postprocessor using previously set pointers */
- (*cinfo->post->post_process_data) (cinfo, mymain->xbuffer[mymain->whichptr],
- &mymain->rowgroup_ctr, mymain->rowgroups_avail,
+ (*cinfo->post->post_process_data) (cinfo, mainp->xbuffer[mainp->whichptr],
+ &mainp->rowgroup_ctr, mainp->rowgroups_avail,
output_buf, out_row_ctr, out_rows_avail);
- if (mymain->rowgroup_ctr < mymain->rowgroups_avail)
+ if (mainp->rowgroup_ctr < mainp->rowgroups_avail)
return; /* Need to suspend */
/* After the first iMCU, change wraparound pointers to normal state */
- if (mymain->iMCU_row_ctr == 1)
+ if (mainp->iMCU_row_ctr == 1)
set_wraparound_pointers(cinfo);
/* Prepare to load new iMCU row using other xbuffer list */
- mymain->whichptr ^= 1; /* 0=>1 or 1=>0 */
- mymain->buffer_full = FALSE;
+ mainp->whichptr ^= 1; /* 0=>1 or 1=>0 */
+ mainp->buffer_full = FALSE;
/* Still need to process last row group of this iMCU row, */
/* which is saved at index M+1 of the other xbuffer */
- mymain->rowgroup_ctr = (JDIMENSION) (cinfo->min_DCT_v_scaled_size + 1);
- mymain->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_v_scaled_size + 2);
- mymain->context_state = CTX_POSTPONED_ROW;
+ mainp->rowgroup_ctr = (JDIMENSION) (cinfo->min_DCT_v_scaled_size + 1);
+ mainp->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_v_scaled_size + 2);
+ mainp->context_state = CTX_POSTPONED_ROW;
}
}
@@ -475,15 +476,15 @@ process_data_crank_post (j_decompress_ptr cinfo,
GLOBAL(void)
jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
{
- my_main_ptr mymain;
+ my_main_ptr mainp;
int ci, rgroup, ngroups;
jpeg_component_info *compptr;
- mymain = (my_main_ptr)
+ mainp = (my_main_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_main_controller));
- cinfo->main = (struct jpeg_d_main_controller *) mymain;
- mymain->pub.start_pass = start_pass_main;
+ cinfo->main = &mainp->pub;
+ mainp->pub.start_pass = start_pass_main;
if (need_full_buffer) /* shouldn't happen */
ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
@@ -504,9 +505,9 @@ jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
ci++, compptr++) {
rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /
cinfo->min_DCT_v_scaled_size; /* height of a row group of component */
- mymain->buffer[ci] = (*cinfo->mem->alloc_sarray)
- ((j_common_ptr) cinfo, JPOOL_IMAGE,
- compptr->width_in_blocks * compptr->DCT_h_scaled_size,
- (JDIMENSION) (rgroup * ngroups));
+ mainp->buffer[ci] = (*cinfo->mem->alloc_sarray)
+ ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ compptr->width_in_blocks * ((JDIMENSION) compptr->DCT_h_scaled_size),
+ (JDIMENSION) (rgroup * ngroups));
}
}
diff --git a/3rdparty/libjpeg/jdmarker.c b/3rdparty/libjpeg/jdmarker.c
index f2a9cc42951..3fbe5c16578 100644
--- a/3rdparty/libjpeg/jdmarker.c
+++ b/3rdparty/libjpeg/jdmarker.c
@@ -2,7 +2,7 @@
* jdmarker.c
*
* Copyright (C) 1991-1998, Thomas G. Lane.
- * Modified 2009 by Guido Vollbeding.
+ * Modified 2009-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -23,24 +23,24 @@ typedef enum { /* JPEG marker codes */
M_SOF1 = 0xc1,
M_SOF2 = 0xc2,
M_SOF3 = 0xc3,
-
+
M_SOF5 = 0xc5,
M_SOF6 = 0xc6,
M_SOF7 = 0xc7,
-
+
M_JPG = 0xc8,
M_SOF9 = 0xc9,
M_SOF10 = 0xca,
M_SOF11 = 0xcb,
-
+
M_SOF13 = 0xcd,
M_SOF14 = 0xce,
M_SOF15 = 0xcf,
-
+
M_DHT = 0xc4,
-
+
M_DAC = 0xcc,
-
+
M_RST0 = 0xd0,
M_RST1 = 0xd1,
M_RST2 = 0xd2,
@@ -49,7 +49,7 @@ typedef enum { /* JPEG marker codes */
M_RST5 = 0xd5,
M_RST6 = 0xd6,
M_RST7 = 0xd7,
-
+
M_SOI = 0xd8,
M_EOI = 0xd9,
M_SOS = 0xda,
@@ -58,7 +58,7 @@ typedef enum { /* JPEG marker codes */
M_DRI = 0xdd,
M_DHP = 0xde,
M_EXP = 0xdf,
-
+
M_APP0 = 0xe0,
M_APP1 = 0xe1,
M_APP2 = 0xe2,
@@ -75,13 +75,14 @@ typedef enum { /* JPEG marker codes */
M_APP13 = 0xed,
M_APP14 = 0xee,
M_APP15 = 0xef,
-
+
M_JPG0 = 0xf0,
+ M_JPG8 = 0xf8,
M_JPG13 = 0xfd,
M_COM = 0xfe,
-
+
M_TEM = 0x01,
-
+
M_ERROR = 0x100
} JPEG_MARKER;
@@ -217,6 +218,7 @@ get_soi (j_decompress_ptr cinfo)
/* Set initial assumptions for colorspace etc */
cinfo->jpeg_color_space = JCS_UNKNOWN;
+ cinfo->color_transform = JCT_NONE;
cinfo->CCIR601_sampling = FALSE; /* Assume non-CCIR sampling??? */
cinfo->saw_JFIF_marker = FALSE;
@@ -240,7 +242,7 @@ get_sof (j_decompress_ptr cinfo, boolean is_baseline, boolean is_prog,
/* Process a SOFn marker */
{
INT32 length;
- int c, ci;
+ int c, ci, i;
jpeg_component_info * compptr;
INPUT_VARS(cinfo);
@@ -267,8 +269,8 @@ get_sof (j_decompress_ptr cinfo, boolean is_baseline, boolean is_prog,
/* We don't support files in which the image height is initially specified */
/* as 0 and is later redefined by DNL. As long as we have to check that, */
/* might as well have a general sanity check. */
- if (cinfo->image_height <= 0 || cinfo->image_width <= 0
- || cinfo->num_components <= 0)
+ if (cinfo->image_height <= 0 || cinfo->image_width <= 0 ||
+ cinfo->num_components <= 0)
ERREXIT(cinfo, JERR_EMPTY_IMAGE);
if (length != (cinfo->num_components * 3))
@@ -278,11 +280,27 @@ get_sof (j_decompress_ptr cinfo, boolean is_baseline, boolean is_prog,
cinfo->comp_info = (jpeg_component_info *) (*cinfo->mem->alloc_small)
((j_common_ptr) cinfo, JPOOL_IMAGE,
cinfo->num_components * SIZEOF(jpeg_component_info));
-
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
- ci++, compptr++) {
+
+ for (ci = 0; ci < cinfo->num_components; ci++) {
+ INPUT_BYTE(cinfo, c, return FALSE);
+ /* Check to see whether component id has already been seen */
+ /* (in violation of the spec, but unfortunately seen in some */
+ /* files). If so, create "fake" component id equal to the */
+ /* max id seen so far + 1. */
+ for (i = 0, compptr = cinfo->comp_info; i < ci; i++, compptr++) {
+ if (c == compptr->component_id) {
+ compptr = cinfo->comp_info;
+ c = compptr->component_id;
+ compptr++;
+ for (i = 1; i < ci; i++, compptr++) {
+ if (compptr->component_id > c) c = compptr->component_id;
+ }
+ c++;
+ break;
+ }
+ }
+ compptr->component_id = c;
compptr->component_index = ci;
- INPUT_BYTE(cinfo, compptr->component_id, return FALSE);
INPUT_BYTE(cinfo, c, return FALSE);
compptr->h_samp_factor = (c >> 4) & 15;
compptr->v_samp_factor = (c ) & 15;
@@ -305,12 +323,12 @@ get_sos (j_decompress_ptr cinfo)
/* Process a SOS marker */
{
INT32 length;
- int i, ci, n, c, cc;
+ int c, ci, i, n;
jpeg_component_info * compptr;
INPUT_VARS(cinfo);
if (! cinfo->marker->saw_SOF)
- ERREXIT(cinfo, JERR_SOS_NO_SOF);
+ ERREXITS(cinfo, JERR_SOF_BEFORE, "SOS");
INPUT_2BYTES(cinfo, length, return FALSE);
@@ -328,24 +346,41 @@ get_sos (j_decompress_ptr cinfo)
/* Collect the component-spec parameters */
for (i = 0; i < n; i++) {
- INPUT_BYTE(cinfo, cc, return FALSE);
INPUT_BYTE(cinfo, c, return FALSE);
-
+
+ /* Detect the case where component id's are not unique, and, if so, */
+ /* create a fake component id using the same logic as in get_sof. */
+ /* Note: This also ensures that all of the SOF components are */
+ /* referenced in the single scan case, which prevents access to */
+ /* uninitialized memory in later decoding stages. */
+ for (ci = 0; ci < i; ci++) {
+ if (c == cinfo->cur_comp_info[ci]->component_id) {
+ c = cinfo->cur_comp_info[0]->component_id;
+ for (ci = 1; ci < i; ci++) {
+ compptr = cinfo->cur_comp_info[ci];
+ if (compptr->component_id > c) c = compptr->component_id;
+ }
+ c++;
+ break;
+ }
+ }
+
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
ci++, compptr++) {
- if (cc == compptr->component_id)
+ if (c == compptr->component_id)
goto id_found;
}
- ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc);
+ ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, c);
id_found:
cinfo->cur_comp_info[i] = compptr;
+ INPUT_BYTE(cinfo, c, return FALSE);
compptr->dc_tbl_no = (c >> 4) & 15;
compptr->ac_tbl_no = (c ) & 15;
-
- TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc,
+
+ TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, compptr->component_id,
compptr->dc_tbl_no, compptr->ac_tbl_no);
}
@@ -461,6 +496,8 @@ get_dht (j_decompress_ptr cinfo)
if (count > 256 || ((INT32) count) > length)
ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
+ MEMZERO(huffval, SIZEOF(huffval)); /* pre-zero array for later copy */
+
for (i = 0; i < count; i++)
INPUT_BYTE(cinfo, huffval[i], return FALSE);
@@ -605,6 +642,68 @@ get_dri (j_decompress_ptr cinfo)
}
+LOCAL(boolean)
+get_lse (j_decompress_ptr cinfo)
+/* Process an LSE marker */
+{
+ INT32 length;
+ unsigned int tmp;
+ int cid;
+ INPUT_VARS(cinfo);
+
+ if (! cinfo->marker->saw_SOF)
+ ERREXITS(cinfo, JERR_SOF_BEFORE, "LSE");
+
+ if (cinfo->num_components < 3) goto bad;
+
+ INPUT_2BYTES(cinfo, length, return FALSE);
+
+ if (length != 24)
+ ERREXIT(cinfo, JERR_BAD_LENGTH);
+
+ INPUT_BYTE(cinfo, tmp, return FALSE);
+ if (tmp != 0x0D) /* ID inverse transform specification */
+ ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
+ INPUT_2BYTES(cinfo, tmp, return FALSE);
+ if (tmp != MAXJSAMPLE) goto bad; /* MAXTRANS */
+ INPUT_BYTE(cinfo, tmp, return FALSE);
+ if (tmp != 3) goto bad; /* Nt=3 */
+ INPUT_BYTE(cinfo, cid, return FALSE);
+ if (cid != cinfo->comp_info[1].component_id) goto bad;
+ INPUT_BYTE(cinfo, cid, return FALSE);
+ if (cid != cinfo->comp_info[0].component_id) goto bad;
+ INPUT_BYTE(cinfo, cid, return FALSE);
+ if (cid != cinfo->comp_info[2].component_id) goto bad;
+ INPUT_BYTE(cinfo, tmp, return FALSE);
+ if (tmp != 0x80) goto bad; /* F1: CENTER1=1, NORM1=0 */
+ INPUT_2BYTES(cinfo, tmp, return FALSE);
+ if (tmp != 0) goto bad; /* A(1,1)=0 */
+ INPUT_2BYTES(cinfo, tmp, return FALSE);
+ if (tmp != 0) goto bad; /* A(1,2)=0 */
+ INPUT_BYTE(cinfo, tmp, return FALSE);
+ if (tmp != 0) goto bad; /* F2: CENTER2=0, NORM2=0 */
+ INPUT_2BYTES(cinfo, tmp, return FALSE);
+ if (tmp != 1) goto bad; /* A(2,1)=1 */
+ INPUT_2BYTES(cinfo, tmp, return FALSE);
+ if (tmp != 0) goto bad; /* A(2,2)=0 */
+ INPUT_BYTE(cinfo, tmp, return FALSE);
+ if (tmp != 0) goto bad; /* F3: CENTER3=0, NORM3=0 */
+ INPUT_2BYTES(cinfo, tmp, return FALSE);
+ if (tmp != 1) goto bad; /* A(3,1)=1 */
+ INPUT_2BYTES(cinfo, tmp, return FALSE);
+ if (tmp != 0) { /* A(3,2)=0 */
+ bad:
+ ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
+ }
+
+ /* OK, valid transform that we can handle. */
+ cinfo->color_transform = JCT_SUBTRACT_GREEN;
+
+ INPUT_SYNC(cinfo);
+ return TRUE;
+}
+
+
/*
* Routines for processing APPn and COM markers.
* These are either saved in memory or discarded, per application request.
@@ -641,12 +740,13 @@ examine_app0 (j_decompress_ptr cinfo, JOCTET FAR * data,
cinfo->X_density = (GETJOCTET(data[8]) << 8) + GETJOCTET(data[9]);
cinfo->Y_density = (GETJOCTET(data[10]) << 8) + GETJOCTET(data[11]);
/* Check version.
- * Major version must be 1, anything else signals an incompatible change.
+ * Major version must be 1 or 2, anything else signals an incompatible
+ * change.
* (We used to treat this as an error, but now it's a nonfatal warning,
* because some bozo at Hijaak couldn't read the spec.)
* Minor version should be 0..2, but process anyway if newer.
*/
- if (cinfo->JFIF_major_version != 1)
+ if (cinfo->JFIF_major_version != 1 && cinfo->JFIF_major_version != 2)
WARNMS2(cinfo, JWRN_JFIF_MAJOR,
cinfo->JFIF_major_version, cinfo->JFIF_minor_version);
/* Generate trace messages */
@@ -1059,32 +1159,37 @@ read_markers (j_decompress_ptr cinfo)
return JPEG_SUSPENDED;
cinfo->unread_marker = 0; /* processed the marker */
return JPEG_REACHED_SOS;
-
+
case M_EOI:
TRACEMS(cinfo, 1, JTRC_EOI);
cinfo->unread_marker = 0; /* processed the marker */
return JPEG_REACHED_EOI;
-
+
case M_DAC:
if (! get_dac(cinfo))
return JPEG_SUSPENDED;
break;
-
+
case M_DHT:
if (! get_dht(cinfo))
return JPEG_SUSPENDED;
break;
-
+
case M_DQT:
if (! get_dqt(cinfo))
return JPEG_SUSPENDED;
break;
-
+
case M_DRI:
if (! get_dri(cinfo))
return JPEG_SUSPENDED;
break;
-
+
+ case M_JPG8:
+ if (! get_lse(cinfo))
+ return JPEG_SUSPENDED;
+ break;
+
case M_APP0:
case M_APP1:
case M_APP2:
@@ -1105,7 +1210,7 @@ read_markers (j_decompress_ptr cinfo)
cinfo->unread_marker - (int) M_APP0]) (cinfo))
return JPEG_SUSPENDED;
break;
-
+
case M_COM:
if (! (*((my_marker_ptr) cinfo->marker)->process_COM) (cinfo))
return JPEG_SUSPENDED;
@@ -1314,7 +1419,7 @@ jinit_marker_reader (j_decompress_ptr cinfo)
marker = (my_marker_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
SIZEOF(my_marker_reader));
- cinfo->marker = (struct jpeg_marker_reader *) marker;
+ cinfo->marker = &marker->pub;
/* Initialize public method pointers */
marker->pub.reset_marker_reader = reset_marker_reader;
marker->pub.read_markers = read_markers;
diff --git a/3rdparty/libjpeg/jdmaster.c b/3rdparty/libjpeg/jdmaster.c
index 8c1146e4fe1..ab95090f4d9 100644
--- a/3rdparty/libjpeg/jdmaster.c
+++ b/3rdparty/libjpeg/jdmaster.c
@@ -2,7 +2,7 @@
* jdmaster.c
*
* Copyright (C) 1991-1997, Thomas G. Lane.
- * Modified 2002-2009 by Guido Vollbeding.
+ * Modified 2002-2015 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -45,13 +45,26 @@ LOCAL(boolean)
use_merged_upsample (j_decompress_ptr cinfo)
{
#ifdef UPSAMPLE_MERGING_SUPPORTED
- /* Merging is the equivalent of plain box-filter upsampling */
- if (cinfo->do_fancy_upsampling || cinfo->CCIR601_sampling)
+ /* Merging is the equivalent of plain box-filter upsampling. */
+ /* The following condition is only needed if fancy shall select
+ * a different upsampling method. In our current implementation
+ * fancy only affects the DCT scaling, thus we can use fancy
+ * upsampling and merged upsample simultaneously, in particular
+ * with scaled DCT sizes larger than the default DCTSIZE.
+ */
+#if 0
+ if (cinfo->do_fancy_upsampling)
+ return FALSE;
+#endif
+ if (cinfo->CCIR601_sampling)
return FALSE;
/* jdmerge.c only supports YCC=>RGB color conversion */
- if (cinfo->jpeg_color_space != JCS_YCbCr || cinfo->num_components != 3 ||
+ if ((cinfo->jpeg_color_space != JCS_YCbCr &&
+ cinfo->jpeg_color_space != JCS_BG_YCC) ||
+ cinfo->num_components != 3 ||
cinfo->out_color_space != JCS_RGB ||
- cinfo->out_color_components != RGB_PIXELSIZE)
+ cinfo->out_color_components != RGB_PIXELSIZE ||
+ cinfo->color_transform)
return FALSE;
/* and it only handles 2h1v or 2h2v sampling ratios */
if (cinfo->comp_info[0].h_samp_factor != 2 ||
@@ -158,11 +171,11 @@ jpeg_calc_output_dimensions (j_decompress_ptr cinfo)
cinfo->out_color_components = 1;
break;
case JCS_RGB:
-#if RGB_PIXELSIZE != 3
+ case JCS_BG_RGB:
cinfo->out_color_components = RGB_PIXELSIZE;
break;
-#endif /* else share code with YCbCr */
case JCS_YCbCr:
+ case JCS_BG_YCC:
cinfo->out_color_components = 3;
break;
case JCS_CMYK:
@@ -198,30 +211,20 @@ jpeg_calc_output_dimensions (j_decompress_ptr cinfo)
* These processes all use a common table prepared by the routine below.
*
* For most steps we can mathematically guarantee that the initial value
- * of x is within MAXJSAMPLE+1 of the legal range, so a table running from
- * -(MAXJSAMPLE+1) to 2*MAXJSAMPLE+1 is sufficient. But for the initial
- * limiting step (just after the IDCT), a wildly out-of-range value is
- * possible if the input data is corrupt. To avoid any chance of indexing
+ * of x is within 2*(MAXJSAMPLE+1) of the legal range, so a table running
+ * from -2*(MAXJSAMPLE+1) to 3*MAXJSAMPLE+2 is sufficient. But for the
+ * initial limiting step (just after the IDCT), a wildly out-of-range value
+ * is possible if the input data is corrupt. To avoid any chance of indexing
* off the end of memory and getting a bad-pointer trap, we perform the
* post-IDCT limiting thus:
- * x = range_limit[x & MASK];
+ * x = (sample_range_limit - SUBSET)[(x + CENTER) & MASK];
* where MASK is 2 bits wider than legal sample data, ie 10 bits for 8-bit
* samples. Under normal circumstances this is more than enough range and
* a correct output will be generated; with bogus input data the mask will
* cause wraparound, and we will safely generate a bogus-but-in-range output.
* For the post-IDCT step, we want to convert the data from signed to unsigned
* representation by adding CENTERJSAMPLE at the same time that we limit it.
- * So the post-IDCT limiting table ends up looking like this:
- * CENTERJSAMPLE,CENTERJSAMPLE+1,...,MAXJSAMPLE,
- * MAXJSAMPLE (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),
- * 0 (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times),
- * 0,1,...,CENTERJSAMPLE-1
- * Negative inputs select values from the upper half of the table after
- * masking.
- *
- * We can save some space by overlapping the start of the post-IDCT table
- * with the simpler range limiting table. The post-IDCT table begins at
- * sample_range_limit + CENTERJSAMPLE.
+ * This is accomplished with SUBSET = CENTER - CENTERJSAMPLE.
*
* Note that the table is allocated in near data space on PCs; it's small
* enough and used often enough to justify this.
@@ -236,23 +239,17 @@ prepare_range_limit_table (j_decompress_ptr cinfo)
table = (JSAMPLE *)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
- (5 * (MAXJSAMPLE+1) + CENTERJSAMPLE) * SIZEOF(JSAMPLE));
- table += (MAXJSAMPLE+1); /* allow negative subscripts of simple table */
+ 5 * (MAXJSAMPLE+1) * SIZEOF(JSAMPLE));
+ /* First segment of range limit table: limit[x] = 0 for x < 0 */
+ MEMZERO(table, 2 * (MAXJSAMPLE+1) * SIZEOF(JSAMPLE));
+ table += 2 * (MAXJSAMPLE+1); /* allow negative subscripts of table */
cinfo->sample_range_limit = table;
- /* First segment of "simple" table: limit[x] = 0 for x < 0 */
- MEMZERO(table - (MAXJSAMPLE+1), (MAXJSAMPLE+1) * SIZEOF(JSAMPLE));
- /* Main part of "simple" table: limit[x] = x */
+ /* Main part of range limit table: limit[x] = x */
for (i = 0; i <= MAXJSAMPLE; i++)
table[i] = (JSAMPLE) i;
- table += CENTERJSAMPLE; /* Point to where post-IDCT table starts */
- /* End of simple table, rest of first half of post-IDCT table */
- for (i = CENTERJSAMPLE; i < 2*(MAXJSAMPLE+1); i++)
+ /* End of range limit table: limit[x] = MAXJSAMPLE for x > MAXJSAMPLE */
+ for (; i < 3 * (MAXJSAMPLE+1); i++)
table[i] = MAXJSAMPLE;
- /* Second half of post-IDCT table */
- MEMZERO(table + (2 * (MAXJSAMPLE+1)),
- (2 * (MAXJSAMPLE+1) - CENTERJSAMPLE) * SIZEOF(JSAMPLE));
- MEMCOPY(table + (4 * (MAXJSAMPLE+1) - CENTERJSAMPLE),
- cinfo->sample_range_limit, CENTERJSAMPLE * SIZEOF(JSAMPLE));
}
@@ -275,10 +272,19 @@ master_selection (j_decompress_ptr cinfo)
long samplesperrow;
JDIMENSION jd_samplesperrow;
+ /* For now, precision must match compiled-in value... */
+ if (cinfo->data_precision != BITS_IN_JSAMPLE)
+ ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
+
/* Initialize dimensions and other stuff */
jpeg_calc_output_dimensions(cinfo);
prepare_range_limit_table(cinfo);
+ /* Sanity check on image dimensions */
+ if (cinfo->output_height <= 0 || cinfo->output_width <= 0 ||
+ cinfo->out_color_components <= 0)
+ ERREXIT(cinfo, JERR_EMPTY_IMAGE);
+
/* Width of an output scanline must be representable as JDIMENSION. */
samplesperrow = (long) cinfo->output_width * (long) cinfo->out_color_components;
jd_samplesperrow = (JDIMENSION) samplesperrow;
@@ -523,7 +529,7 @@ jinit_master_decompress (j_decompress_ptr cinfo)
master = (my_master_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_decomp_master));
- cinfo->master = (struct jpeg_decomp_master *) master;
+ cinfo->master = &master->pub;
master->pub.prepare_for_output_pass = prepare_for_output_pass;
master->pub.finish_output_pass = finish_output_pass;
diff --git a/3rdparty/libjpeg/jdmerge.c b/3rdparty/libjpeg/jdmerge.c
index 37444468c23..192da5829d0 100644
--- a/3rdparty/libjpeg/jdmerge.c
+++ b/3rdparty/libjpeg/jdmerge.c
@@ -2,6 +2,7 @@
* jdmerge.c
*
* Copyright (C) 1994-1996, Thomas G. Lane.
+ * Modified 2013-2015 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -23,7 +24,7 @@
* multiplications needed for color conversion.
*
* This file currently provides implementations for the following cases:
- * YCbCr => RGB color conversion only.
+ * YCC => RGB color conversion only (YCbCr or BG_YCC).
* Sampling ratios of 2h1v or 2h2v.
* No scaling needed at upsample time.
* Corner-aligned (non-CCIR601) sampling alignment.
@@ -75,12 +76,13 @@ typedef my_upsampler * my_upsample_ptr;
/*
- * Initialize tables for YCC->RGB colorspace conversion.
+ * Initialize tables for YCbCr->RGB and BG_YCC->RGB colorspace conversion.
* This is taken directly from jdcolor.c; see that file for more info.
*/
LOCAL(void)
build_ycc_rgb_table (j_decompress_ptr cinfo)
+/* Normal case, sYCC */
{
my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
int i;
@@ -103,17 +105,57 @@ build_ycc_rgb_table (j_decompress_ptr cinfo)
for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
/* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
/* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
- /* Cr=>R value is nearest int to 1.40200 * x */
+ /* Cr=>R value is nearest int to 1.402 * x */
upsample->Cr_r_tab[i] = (int)
- RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS);
- /* Cb=>B value is nearest int to 1.77200 * x */
+ RIGHT_SHIFT(FIX(1.402) * x + ONE_HALF, SCALEBITS);
+ /* Cb=>B value is nearest int to 1.772 * x */
upsample->Cb_b_tab[i] = (int)
- RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS);
- /* Cr=>G value is scaled-up -0.71414 * x */
- upsample->Cr_g_tab[i] = (- FIX(0.71414)) * x;
- /* Cb=>G value is scaled-up -0.34414 * x */
+ RIGHT_SHIFT(FIX(1.772) * x + ONE_HALF, SCALEBITS);
+ /* Cr=>G value is scaled-up -0.714136286 * x */
+ upsample->Cr_g_tab[i] = (- FIX(0.714136286)) * x;
+ /* Cb=>G value is scaled-up -0.344136286 * x */
/* We also add in ONE_HALF so that need not do it in inner loop */
- upsample->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF;
+ upsample->Cb_g_tab[i] = (- FIX(0.344136286)) * x + ONE_HALF;
+ }
+}
+
+
+LOCAL(void)
+build_bg_ycc_rgb_table (j_decompress_ptr cinfo)
+/* Wide gamut case, bg-sYCC */
+{
+ my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample;
+ int i;
+ INT32 x;
+ SHIFT_TEMPS
+
+ upsample->Cr_r_tab = (int *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(int));
+ upsample->Cb_b_tab = (int *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(int));
+ upsample->Cr_g_tab = (INT32 *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(INT32));
+ upsample->Cb_g_tab = (INT32 *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (MAXJSAMPLE+1) * SIZEOF(INT32));
+
+ for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) {
+ /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */
+ /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */
+ /* Cr=>R value is nearest int to 2.804 * x */
+ upsample->Cr_r_tab[i] = (int)
+ RIGHT_SHIFT(FIX(2.804) * x + ONE_HALF, SCALEBITS);
+ /* Cb=>B value is nearest int to 3.544 * x */
+ upsample->Cb_b_tab[i] = (int)
+ RIGHT_SHIFT(FIX(3.544) * x + ONE_HALF, SCALEBITS);
+ /* Cr=>G value is scaled-up -1.428272572 * x */
+ upsample->Cr_g_tab[i] = (- FIX(1.428272572)) * x;
+ /* Cb=>G value is scaled-up -0.688272572 * x */
+ /* We also add in ONE_HALF so that need not do it in inner loop */
+ upsample->Cb_g_tab[i] = (- FIX(0.688272572)) * x + ONE_HALF;
}
}
@@ -250,32 +292,32 @@ h2v1_merged_upsample (j_decompress_ptr cinfo,
/* Do the chroma part of the calculation */
cb = GETJSAMPLE(*inptr1++);
cr = GETJSAMPLE(*inptr2++);
- cred = Crrtab[cr];
+ cred = Crrtab[cr];
cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
- cblue = Cbbtab[cb];
+ cblue = Cbbtab[cb];
/* Fetch 2 Y values and emit 2 pixels */
y = GETJSAMPLE(*inptr0++);
- outptr[RGB_RED] = range_limit[y + cred];
+ outptr[RGB_RED] = range_limit[y + cred];
outptr[RGB_GREEN] = range_limit[y + cgreen];
- outptr[RGB_BLUE] = range_limit[y + cblue];
+ outptr[RGB_BLUE] = range_limit[y + cblue];
outptr += RGB_PIXELSIZE;
y = GETJSAMPLE(*inptr0++);
- outptr[RGB_RED] = range_limit[y + cred];
+ outptr[RGB_RED] = range_limit[y + cred];
outptr[RGB_GREEN] = range_limit[y + cgreen];
- outptr[RGB_BLUE] = range_limit[y + cblue];
+ outptr[RGB_BLUE] = range_limit[y + cblue];
outptr += RGB_PIXELSIZE;
}
/* If image width is odd, do the last output column separately */
if (cinfo->output_width & 1) {
cb = GETJSAMPLE(*inptr1);
cr = GETJSAMPLE(*inptr2);
- cred = Crrtab[cr];
+ cred = Crrtab[cr];
cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
- cblue = Cbbtab[cb];
+ cblue = Cbbtab[cb];
y = GETJSAMPLE(*inptr0);
- outptr[RGB_RED] = range_limit[y + cred];
+ outptr[RGB_RED] = range_limit[y + cred];
outptr[RGB_GREEN] = range_limit[y + cgreen];
- outptr[RGB_BLUE] = range_limit[y + cblue];
+ outptr[RGB_BLUE] = range_limit[y + cblue];
}
}
@@ -314,46 +356,46 @@ h2v2_merged_upsample (j_decompress_ptr cinfo,
/* Do the chroma part of the calculation */
cb = GETJSAMPLE(*inptr1++);
cr = GETJSAMPLE(*inptr2++);
- cred = Crrtab[cr];
+ cred = Crrtab[cr];
cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
- cblue = Cbbtab[cb];
+ cblue = Cbbtab[cb];
/* Fetch 4 Y values and emit 4 pixels */
y = GETJSAMPLE(*inptr00++);
- outptr0[RGB_RED] = range_limit[y + cred];
+ outptr0[RGB_RED] = range_limit[y + cred];
outptr0[RGB_GREEN] = range_limit[y + cgreen];
- outptr0[RGB_BLUE] = range_limit[y + cblue];
+ outptr0[RGB_BLUE] = range_limit[y + cblue];
outptr0 += RGB_PIXELSIZE;
y = GETJSAMPLE(*inptr00++);
- outptr0[RGB_RED] = range_limit[y + cred];
+ outptr0[RGB_RED] = range_limit[y + cred];
outptr0[RGB_GREEN] = range_limit[y + cgreen];
- outptr0[RGB_BLUE] = range_limit[y + cblue];
+ outptr0[RGB_BLUE] = range_limit[y + cblue];
outptr0 += RGB_PIXELSIZE;
y = GETJSAMPLE(*inptr01++);
- outptr1[RGB_RED] = range_limit[y + cred];
+ outptr1[RGB_RED] = range_limit[y + cred];
outptr1[RGB_GREEN] = range_limit[y + cgreen];
- outptr1[RGB_BLUE] = range_limit[y + cblue];
+ outptr1[RGB_BLUE] = range_limit[y + cblue];
outptr1 += RGB_PIXELSIZE;
y = GETJSAMPLE(*inptr01++);
- outptr1[RGB_RED] = range_limit[y + cred];
+ outptr1[RGB_RED] = range_limit[y + cred];
outptr1[RGB_GREEN] = range_limit[y + cgreen];
- outptr1[RGB_BLUE] = range_limit[y + cblue];
+ outptr1[RGB_BLUE] = range_limit[y + cblue];
outptr1 += RGB_PIXELSIZE;
}
/* If image width is odd, do the last output column separately */
if (cinfo->output_width & 1) {
cb = GETJSAMPLE(*inptr1);
cr = GETJSAMPLE(*inptr2);
- cred = Crrtab[cr];
+ cred = Crrtab[cr];
cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS);
- cblue = Cbbtab[cb];
+ cblue = Cbbtab[cb];
y = GETJSAMPLE(*inptr00);
- outptr0[RGB_RED] = range_limit[y + cred];
+ outptr0[RGB_RED] = range_limit[y + cred];
outptr0[RGB_GREEN] = range_limit[y + cgreen];
- outptr0[RGB_BLUE] = range_limit[y + cblue];
+ outptr0[RGB_BLUE] = range_limit[y + cblue];
y = GETJSAMPLE(*inptr01);
- outptr1[RGB_RED] = range_limit[y + cred];
+ outptr1[RGB_RED] = range_limit[y + cred];
outptr1[RGB_GREEN] = range_limit[y + cgreen];
- outptr1[RGB_BLUE] = range_limit[y + cblue];
+ outptr1[RGB_BLUE] = range_limit[y + cblue];
}
}
@@ -374,7 +416,7 @@ jinit_merged_upsampler (j_decompress_ptr cinfo)
upsample = (my_upsample_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_upsampler));
- cinfo->upsample = (struct jpeg_upsampler *) upsample;
+ cinfo->upsample = &upsample->pub;
upsample->pub.start_pass = start_pass_merged_upsample;
upsample->pub.need_context_rows = FALSE;
@@ -394,7 +436,10 @@ jinit_merged_upsampler (j_decompress_ptr cinfo)
upsample->spare_row = NULL;
}
- build_ycc_rgb_table(cinfo);
+ if (cinfo->jpeg_color_space == JCS_BG_YCC)
+ build_bg_ycc_rgb_table(cinfo);
+ else
+ build_ycc_rgb_table(cinfo);
}
#endif /* UPSAMPLE_MERGING_SUPPORTED */
diff --git a/3rdparty/libjpeg/jdsample.c b/3rdparty/libjpeg/jdsample.c
index 7bc8885b02e..fd9907e20cd 100644
--- a/3rdparty/libjpeg/jdsample.c
+++ b/3rdparty/libjpeg/jdsample.c
@@ -2,7 +2,7 @@
* jdsample.c
*
* Copyright (C) 1991-1996, Thomas G. Lane.
- * Modified 2002-2008 by Guido Vollbeding.
+ * Modified 2002-2015 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -296,13 +296,12 @@ jinit_upsampler (j_decompress_ptr cinfo)
my_upsample_ptr upsample;
int ci;
jpeg_component_info * compptr;
- boolean need_buffer;
int h_in_group, v_in_group, h_out_group, v_out_group;
upsample = (my_upsample_ptr)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
SIZEOF(my_upsampler));
- cinfo->upsample = (struct jpeg_upsampler *) upsample;
+ cinfo->upsample = &upsample->pub;
upsample->pub.start_pass = start_pass_upsample;
upsample->pub.upsample = sep_upsample;
upsample->pub.need_context_rows = FALSE; /* until we find out differently */
@@ -325,17 +324,17 @@ jinit_upsampler (j_decompress_ptr cinfo)
h_out_group = cinfo->max_h_samp_factor;
v_out_group = cinfo->max_v_samp_factor;
upsample->rowgroup_height[ci] = v_in_group; /* save for use later */
- need_buffer = TRUE;
if (! compptr->component_needed) {
/* Don't bother to upsample an uninteresting component. */
upsample->methods[ci] = noop_upsample;
- need_buffer = FALSE;
- } else if (h_in_group == h_out_group && v_in_group == v_out_group) {
+ continue; /* don't need to allocate buffer */
+ }
+ if (h_in_group == h_out_group && v_in_group == v_out_group) {
/* Fullsize components can be processed without any work. */
upsample->methods[ci] = fullsize_upsample;
- need_buffer = FALSE;
- } else if (h_in_group * 2 == h_out_group &&
- v_in_group == v_out_group) {
+ continue; /* don't need to allocate buffer */
+ }
+ if (h_in_group * 2 == h_out_group && v_in_group == v_out_group) {
/* Special case for 2h1v upsampling */
upsample->methods[ci] = h2v1_upsample;
} else if (h_in_group * 2 == h_out_group &&
@@ -350,12 +349,10 @@ jinit_upsampler (j_decompress_ptr cinfo)
upsample->v_expand[ci] = (UINT8) (v_out_group / v_in_group);
} else
ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL);
- if (need_buffer) {
- upsample->color_buf[ci] = (*cinfo->mem->alloc_sarray)
- ((j_common_ptr) cinfo, JPOOL_IMAGE,
- (JDIMENSION) jround_up((long) cinfo->output_width,
- (long) cinfo->max_h_samp_factor),
- (JDIMENSION) cinfo->max_v_samp_factor);
- }
+ upsample->color_buf[ci] = (*cinfo->mem->alloc_sarray)
+ ((j_common_ptr) cinfo, JPOOL_IMAGE,
+ (JDIMENSION) jround_up((long) cinfo->output_width,
+ (long) cinfo->max_h_samp_factor),
+ (JDIMENSION) cinfo->max_v_samp_factor);
}
}
diff --git a/3rdparty/libjpeg/jerror.c b/3rdparty/libjpeg/jerror.c
index 3da7be86a00..7163af699c3 100644
--- a/3rdparty/libjpeg/jerror.c
+++ b/3rdparty/libjpeg/jerror.c
@@ -2,6 +2,7 @@
* jerror.c
*
* Copyright (C) 1991-1998, Thomas G. Lane.
+ * Modified 2012-2015 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -18,16 +19,16 @@
* These routines are used by both the compression and decompression code.
*/
+#ifdef USE_WINDOWS_MESSAGEBOX
+#include <windows.h>
+#endif
+
/* this is not a core library module, so it doesn't define JPEG_INTERNALS */
#include "jinclude.h"
#include "jpeglib.h"
#include "jversion.h"
#include "jerror.h"
-#ifdef USE_WINDOWS_MESSAGEBOX
-#include <windows.h>
-#endif
-
#ifndef EXIT_FAILURE /* define exit() codes if not provided */
#define EXIT_FAILURE 1
#endif
@@ -66,7 +67,7 @@ const char * const jpeg_std_message_table[] = {
* or jpeg_destroy) at some point.
*/
-METHODDEF(void)
+METHODDEF(noreturn_t)
error_exit (j_common_ptr cinfo)
{
/* Always display the message */
diff --git a/3rdparty/libjpeg/jerror.h b/3rdparty/libjpeg/jerror.h
index 1cfb2b19d85..a4b661f716d 100644
--- a/3rdparty/libjpeg/jerror.h
+++ b/3rdparty/libjpeg/jerror.h
@@ -2,7 +2,7 @@
* jerror.h
*
* Copyright (C) 1994-1997, Thomas G. Lane.
- * Modified 1997-2009 by Guido Vollbeding.
+ * Modified 1997-2012 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -106,11 +106,11 @@ JMESSAGE(JERR_QUANT_COMPONENTS,
"Cannot quantize more than %d color components")
JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors")
JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors")
+JMESSAGE(JERR_SOF_BEFORE, "Invalid JPEG file structure: %s before SOF")
JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers")
JMESSAGE(JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker")
JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x")
JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers")
-JMESSAGE(JERR_SOS_NO_SOF, "Invalid JPEG file structure: SOS before SOF")
JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s")
JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file")
JMESSAGE(JERR_TFILE_SEEK, "Seek failed on temporary file")
diff --git a/3rdparty/libjpeg/jfdctflt.c b/3rdparty/libjpeg/jfdctflt.c
index 74d0d862dcb..0ebc186d222 100644
--- a/3rdparty/libjpeg/jfdctflt.c
+++ b/3rdparty/libjpeg/jfdctflt.c
@@ -2,7 +2,7 @@
* jfdctflt.c
*
* Copyright (C) 1994-1996, Thomas G. Lane.
- * Modified 2003-2009 by Guido Vollbeding.
+ * Modified 2003-2015 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -54,6 +54,8 @@
/*
* Perform the forward DCT on one block of samples.
+ *
+ * cK represents cos(K*pi/16).
*/
GLOBAL(void)
@@ -89,7 +91,7 @@ jpeg_fdct_float (FAST_FLOAT * data, JSAMPARRAY sample_data, JDIMENSION start_col
tmp11 = tmp1 + tmp2;
tmp12 = tmp1 - tmp2;
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = tmp10 + tmp11 - 8 * CENTERJSAMPLE; /* phase 3 */
dataptr[4] = tmp10 - tmp11;
diff --git a/3rdparty/libjpeg/jfdctfst.c b/3rdparty/libjpeg/jfdctfst.c
index 8cad5f22939..d779f78bf4f 100644
--- a/3rdparty/libjpeg/jfdctfst.c
+++ b/3rdparty/libjpeg/jfdctfst.c
@@ -2,7 +2,7 @@
* jfdctfst.c
*
* Copyright (C) 1994-1996, Thomas G. Lane.
- * Modified 2003-2009 by Guido Vollbeding.
+ * Modified 2003-2015 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -109,6 +109,8 @@
/*
* Perform the forward DCT on one block of samples.
+ *
+ * cK represents cos(K*pi/16).
*/
GLOBAL(void)
@@ -145,7 +147,7 @@ jpeg_fdct_ifast (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
tmp11 = tmp1 + tmp2;
tmp12 = tmp1 - tmp2;
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = tmp10 + tmp11 - 8 * CENTERJSAMPLE; /* phase 3 */
dataptr[4] = tmp10 - tmp11;
diff --git a/3rdparty/libjpeg/jfdctint.c b/3rdparty/libjpeg/jfdctint.c
index 1dde58c499d..7ed42e5db5e 100644
--- a/3rdparty/libjpeg/jfdctint.c
+++ b/3rdparty/libjpeg/jfdctint.c
@@ -2,7 +2,7 @@
* jfdctint.c
*
* Copyright (C) 1991-1996, Thomas G. Lane.
- * Modification developed 2003-2009 by Guido Vollbeding.
+ * Modification developed 2003-2015 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -165,16 +165,18 @@ jpeg_fdct_islow (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
int ctr;
SHIFT_TEMPS
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * cK represents sqrt(2) * cos(K*pi/16).
+ */
dataptr = data;
for (ctr = 0; ctr < DCTSIZE; ctr++) {
elemptr = sample_data[ctr] + start_col;
/* Even part per LL&M figure 1 --- note that published figure is faulty;
- * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".
+ * rotator "c1" should be "c6".
*/
tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]);
@@ -192,51 +194,53 @@ jpeg_fdct_islow (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]);
tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]);
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM) ((tmp10 + tmp11 - 8 * CENTERJSAMPLE) << PASS1_BITS);
dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS);
- z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); /* c6 */
/* Add fudge factor here for final descale. */
z1 += ONE << (CONST_BITS-PASS1_BITS-1);
- dataptr[2] = (DCTELEM) RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865),
- CONST_BITS-PASS1_BITS);
- dataptr[6] = (DCTELEM) RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065),
- CONST_BITS-PASS1_BITS);
+
+ dataptr[2] = (DCTELEM)
+ RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), /* c2-c6 */
+ CONST_BITS-PASS1_BITS);
+ dataptr[6] = (DCTELEM)
+ RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), /* c2+c6 */
+ CONST_BITS-PASS1_BITS);
/* Odd part per figure 8 --- note paper omits factor of sqrt(2).
- * cK represents sqrt(2) * cos(K*pi/16).
* i0..i3 in the paper are tmp0..tmp3 here.
*/
- tmp10 = tmp0 + tmp3;
- tmp11 = tmp1 + tmp2;
tmp12 = tmp0 + tmp2;
tmp13 = tmp1 + tmp3;
- z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */
+
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */
/* Add fudge factor here for final descale. */
z1 += ONE << (CONST_BITS-PASS1_BITS-1);
- tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */
- tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */
- tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */
- tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */
- tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */
- tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */
- tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */
- tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */
-
+ tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* -c3+c5 */
+ tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */
tmp12 += z1;
tmp13 += z1;
- dataptr[1] = (DCTELEM)
- RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS-PASS1_BITS);
- dataptr[3] = (DCTELEM)
- RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS-PASS1_BITS);
- dataptr[5] = (DCTELEM)
- RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS-PASS1_BITS);
- dataptr[7] = (DCTELEM)
- RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS-PASS1_BITS);
+ z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
+ tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */
+ tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */
+ tmp0 += z1 + tmp12;
+ tmp3 += z1 + tmp13;
+
+ z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
+ tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */
+ tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */
+ tmp1 += z1 + tmp13;
+ tmp2 += z1 + tmp12;
+
+ dataptr[1] = (DCTELEM) RIGHT_SHIFT(tmp0, CONST_BITS-PASS1_BITS);
+ dataptr[3] = (DCTELEM) RIGHT_SHIFT(tmp1, CONST_BITS-PASS1_BITS);
+ dataptr[5] = (DCTELEM) RIGHT_SHIFT(tmp2, CONST_BITS-PASS1_BITS);
+ dataptr[7] = (DCTELEM) RIGHT_SHIFT(tmp3, CONST_BITS-PASS1_BITS);
dataptr += DCTSIZE; /* advance pointer to next row */
}
@@ -244,12 +248,13 @@ jpeg_fdct_islow (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pass 2: process columns.
* We remove the PASS1_BITS scaling, but leave the results scaled up
* by an overall factor of 8.
+ * cK represents sqrt(2) * cos(K*pi/16).
*/
dataptr = data;
for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
/* Even part per LL&M figure 1 --- note that published figure is faulty;
- * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".
+ * rotator "c1" should be "c6".
*/
tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
@@ -271,47 +276,49 @@ jpeg_fdct_islow (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp10 + tmp11, PASS1_BITS);
dataptr[DCTSIZE*4] = (DCTELEM) RIGHT_SHIFT(tmp10 - tmp11, PASS1_BITS);
- z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); /* c6 */
/* Add fudge factor here for final descale. */
z1 += ONE << (CONST_BITS+PASS1_BITS-1);
+
dataptr[DCTSIZE*2] = (DCTELEM)
- RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), CONST_BITS+PASS1_BITS);
+ RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), /* c2-c6 */
+ CONST_BITS+PASS1_BITS);
dataptr[DCTSIZE*6] = (DCTELEM)
- RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), CONST_BITS+PASS1_BITS);
+ RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), /* c2+c6 */
+ CONST_BITS+PASS1_BITS);
/* Odd part per figure 8 --- note paper omits factor of sqrt(2).
- * cK represents sqrt(2) * cos(K*pi/16).
* i0..i3 in the paper are tmp0..tmp3 here.
*/
- tmp10 = tmp0 + tmp3;
- tmp11 = tmp1 + tmp2;
tmp12 = tmp0 + tmp2;
tmp13 = tmp1 + tmp3;
- z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */
+
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */
/* Add fudge factor here for final descale. */
z1 += ONE << (CONST_BITS+PASS1_BITS-1);
- tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */
- tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */
- tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */
- tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */
- tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */
- tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */
- tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */
- tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */
-
+ tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* -c3+c5 */
+ tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */
tmp12 += z1;
tmp13 += z1;
- dataptr[DCTSIZE*1] = (DCTELEM)
- RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS+PASS1_BITS);
- dataptr[DCTSIZE*3] = (DCTELEM)
- RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS+PASS1_BITS);
- dataptr[DCTSIZE*5] = (DCTELEM)
- RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS+PASS1_BITS);
- dataptr[DCTSIZE*7] = (DCTELEM)
- RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS+PASS1_BITS);
+ z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
+ tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */
+ tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */
+ tmp0 += z1 + tmp12;
+ tmp3 += z1 + tmp13;
+
+ z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
+ tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */
+ tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */
+ tmp1 += z1 + tmp13;
+ tmp2 += z1 + tmp12;
+
+ dataptr[DCTSIZE*1] = (DCTELEM) RIGHT_SHIFT(tmp0, CONST_BITS+PASS1_BITS);
+ dataptr[DCTSIZE*3] = (DCTELEM) RIGHT_SHIFT(tmp1, CONST_BITS+PASS1_BITS);
+ dataptr[DCTSIZE*5] = (DCTELEM) RIGHT_SHIFT(tmp2, CONST_BITS+PASS1_BITS);
+ dataptr[DCTSIZE*7] = (DCTELEM) RIGHT_SHIFT(tmp3, CONST_BITS+PASS1_BITS);
dataptr++; /* advance pointer to next column */
}
@@ -338,10 +345,11 @@ jpeg_fdct_7x7 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* cK represents sqrt(2) * cos(K*pi/14). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * cK represents sqrt(2) * cos(K*pi/14).
+ */
dataptr = data;
for (ctr = 0; ctr < 7; ctr++) {
@@ -359,7 +367,7 @@ jpeg_fdct_7x7 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[4]);
z1 = tmp0 + tmp2;
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM)
((z1 + tmp1 + tmp3 - 7 * CENTERJSAMPLE) << PASS1_BITS);
tmp3 += tmp3;
@@ -472,10 +480,11 @@ jpeg_fdct_6x6 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* cK represents sqrt(2) * cos(K*pi/12). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * cK represents sqrt(2) * cos(K*pi/12).
+ */
dataptr = data;
for (ctr = 0; ctr < 6; ctr++) {
@@ -494,7 +503,7 @@ jpeg_fdct_6x6 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[4]);
tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[3]);
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM)
((tmp10 + tmp11 - 6 * CENTERJSAMPLE) << PASS1_BITS);
dataptr[2] = (DCTELEM)
@@ -585,12 +594,13 @@ jpeg_fdct_5x5 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* We scale the results further by 2 as part of output adaption */
- /* scaling for different DCT size. */
- /* cK represents sqrt(2) * cos(K*pi/10). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * We scale the results further by 2 as part of output adaption
+ * scaling for different DCT size.
+ * cK represents sqrt(2) * cos(K*pi/10).
+ */
dataptr = data;
for (ctr = 0; ctr < 5; ctr++) {
@@ -608,7 +618,7 @@ jpeg_fdct_5x5 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[4]);
tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[3]);
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM)
((tmp10 + tmp2 - 5 * CENTERJSAMPLE) << (PASS1_BITS+1));
tmp11 = MULTIPLY(tmp11, FIX(0.790569415)); /* (c2+c4)/2 */
@@ -695,11 +705,12 @@ jpeg_fdct_4x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* We must also scale the output by (8/4)**2 = 2**2, which we add here. */
- /* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT]. */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * We must also scale the output by (8/4)**2 = 2**2, which we add here.
+ * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT].
+ */
dataptr = data;
for (ctr = 0; ctr < 4; ctr++) {
@@ -713,7 +724,7 @@ jpeg_fdct_4x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[3]);
tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[2]);
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM)
((tmp0 + tmp1 - 4 * CENTERJSAMPLE) << (PASS1_BITS+2));
dataptr[2] = (DCTELEM) ((tmp0 - tmp1) << (PASS1_BITS+2));
@@ -737,6 +748,7 @@ jpeg_fdct_4x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pass 2: process columns.
* We remove the PASS1_BITS scaling, but leave the results scaled up
* by an overall factor of 8.
+ * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT].
*/
dataptr = data;
@@ -787,12 +799,13 @@ jpeg_fdct_3x3 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* We scale the results further by 2**2 as part of output adaption */
- /* scaling for different DCT size. */
- /* cK represents sqrt(2) * cos(K*pi/6). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * We scale the results further by 2**2 as part of output adaption
+ * scaling for different DCT size.
+ * cK represents sqrt(2) * cos(K*pi/6).
+ */
dataptr = data;
for (ctr = 0; ctr < 3; ctr++) {
@@ -805,7 +818,7 @@ jpeg_fdct_3x3 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
tmp2 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[2]);
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM)
((tmp0 + tmp1 - 3 * CENTERJSAMPLE) << (PASS1_BITS+2));
dataptr[2] = (DCTELEM)
@@ -863,14 +876,15 @@ jpeg_fdct_3x3 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
GLOBAL(void)
jpeg_fdct_2x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
{
- INT32 tmp0, tmp1, tmp2, tmp3;
+ DCTELEM tmp0, tmp1, tmp2, tmp3;
JSAMPROW elemptr;
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT. */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT.
+ */
/* Row 0 */
elemptr = sample_data[0] + start_col;
@@ -890,13 +904,13 @@ jpeg_fdct_2x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
*/
/* Column 0 */
- /* Apply unsigned->signed conversion */
- data[DCTSIZE*0] = (DCTELEM) ((tmp0 + tmp2 - 4 * CENTERJSAMPLE) << 4);
- data[DCTSIZE*1] = (DCTELEM) ((tmp0 - tmp2) << 4);
+ /* Apply unsigned->signed conversion. */
+ data[DCTSIZE*0] = (tmp0 + tmp2 - 4 * CENTERJSAMPLE) << 4;
+ data[DCTSIZE*1] = (tmp0 - tmp2) << 4;
/* Column 1 */
- data[DCTSIZE*0+1] = (DCTELEM) ((tmp1 + tmp3) << 4);
- data[DCTSIZE*1+1] = (DCTELEM) ((tmp1 - tmp3) << 4);
+ data[DCTSIZE*0+1] = (tmp1 + tmp3) << 4;
+ data[DCTSIZE*1+1] = (tmp1 - tmp3) << 4;
}
@@ -907,14 +921,17 @@ jpeg_fdct_2x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
GLOBAL(void)
jpeg_fdct_1x1 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
{
+ DCTELEM dcval;
+
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
+ dcval = GETJSAMPLE(sample_data[0][start_col]);
+
/* We leave the result scaled up by an overall factor of 8. */
/* We must also scale the output by (8/1)**2 = 2**6. */
- /* Apply unsigned->signed conversion */
- data[0] = (DCTELEM)
- ((GETJSAMPLE(sample_data[0][start_col]) - CENTERJSAMPLE) << 6);
+ /* Apply unsigned->signed conversion. */
+ data[0] = (dcval - CENTERJSAMPLE) << 6;
}
@@ -935,11 +952,12 @@ jpeg_fdct_9x9 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
int ctr;
SHIFT_TEMPS
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* we scale the results further by 2 as part of output adaption */
- /* scaling for different DCT size. */
- /* cK represents sqrt(2) * cos(K*pi/18). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * we scale the results further by 2 as part of output adaption
+ * scaling for different DCT size.
+ * cK represents sqrt(2) * cos(K*pi/18).
+ */
dataptr = data;
ctr = 0;
@@ -961,7 +979,7 @@ jpeg_fdct_9x9 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
z1 = tmp0 + tmp2 + tmp3;
z2 = tmp1 + tmp4;
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM) ((z1 + z2 - 9 * CENTERJSAMPLE) << 1);
dataptr[6] = (DCTELEM)
DESCALE(MULTIPLY(z1 - z2 - z2, FIX(0.707106781)), /* c6 */
@@ -1084,11 +1102,12 @@ jpeg_fdct_10x10 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
int ctr;
SHIFT_TEMPS
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* we scale the results further by 2 as part of output adaption */
- /* scaling for different DCT size. */
- /* cK represents sqrt(2) * cos(K*pi/20). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * we scale the results further by 2 as part of output adaption
+ * scaling for different DCT size.
+ * cK represents sqrt(2) * cos(K*pi/20).
+ */
dataptr = data;
ctr = 0;
@@ -1114,7 +1133,7 @@ jpeg_fdct_10x10 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[6]);
tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[5]);
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM)
((tmp10 + tmp11 + tmp12 - 10 * CENTERJSAMPLE) << 1);
tmp12 += tmp12;
@@ -1248,11 +1267,12 @@ jpeg_fdct_11x11 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
int ctr;
SHIFT_TEMPS
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* we scale the results further by 2 as part of output adaption */
- /* scaling for different DCT size. */
- /* cK represents sqrt(2) * cos(K*pi/22). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * we scale the results further by 2 as part of output adaption
+ * scaling for different DCT size.
+ * cK represents sqrt(2) * cos(K*pi/22).
+ */
dataptr = data;
ctr = 0;
@@ -1274,7 +1294,7 @@ jpeg_fdct_11x11 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
tmp13 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[7]);
tmp14 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[6]);
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM)
((tmp0 + tmp1 + tmp2 + tmp3 + tmp4 + tmp5 - 11 * CENTERJSAMPLE) << 1);
tmp5 += tmp5;
@@ -1430,9 +1450,10 @@ jpeg_fdct_12x12 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
int ctr;
SHIFT_TEMPS
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT. */
- /* cK represents sqrt(2) * cos(K*pi/24). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT.
+ * cK represents sqrt(2) * cos(K*pi/24).
+ */
dataptr = data;
ctr = 0;
@@ -1462,7 +1483,7 @@ jpeg_fdct_12x12 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[7]);
tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[6]);
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM) (tmp10 + tmp11 + tmp12 - 12 * CENTERJSAMPLE);
dataptr[6] = (DCTELEM) (tmp13 - tmp14 - tmp15);
dataptr[4] = (DCTELEM)
@@ -1596,9 +1617,10 @@ jpeg_fdct_13x13 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
int ctr;
SHIFT_TEMPS
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT. */
- /* cK represents sqrt(2) * cos(K*pi/26). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT.
+ * cK represents sqrt(2) * cos(K*pi/26).
+ */
dataptr = data;
ctr = 0;
@@ -1622,7 +1644,7 @@ jpeg_fdct_13x13 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
tmp14 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[8]);
tmp15 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[7]);
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM)
(tmp0 + tmp1 + tmp2 + tmp3 + tmp4 + tmp5 + tmp6 - 13 * CENTERJSAMPLE);
tmp6 += tmp6;
@@ -1794,9 +1816,10 @@ jpeg_fdct_14x14 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
int ctr;
SHIFT_TEMPS
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT. */
- /* cK represents sqrt(2) * cos(K*pi/28). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT.
+ * cK represents sqrt(2) * cos(K*pi/28).
+ */
dataptr = data;
ctr = 0;
@@ -1828,7 +1851,7 @@ jpeg_fdct_14x14 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[8]);
tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[7]);
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM)
(tmp10 + tmp11 + tmp12 + tmp13 - 14 * CENTERJSAMPLE);
tmp13 += tmp13;
@@ -1995,9 +2018,10 @@ jpeg_fdct_15x15 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
int ctr;
SHIFT_TEMPS
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT. */
- /* cK represents sqrt(2) * cos(K*pi/30). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT.
+ * cK represents sqrt(2) * cos(K*pi/30).
+ */
dataptr = data;
ctr = 0;
@@ -2026,7 +2050,7 @@ jpeg_fdct_15x15 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
z1 = tmp0 + tmp4 + tmp5;
z2 = tmp1 + tmp3 + tmp6;
z3 = tmp2 + tmp7;
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM) (z1 + z2 + z3 - 15 * CENTERJSAMPLE);
z3 += z3;
dataptr[6] = (DCTELEM)
@@ -2173,10 +2197,11 @@ jpeg_fdct_16x16 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
int ctr;
SHIFT_TEMPS
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* cK represents sqrt(2) * cos(K*pi/32). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * cK represents sqrt(2) * cos(K*pi/32).
+ */
dataptr = data;
ctr = 0;
@@ -2212,7 +2237,7 @@ jpeg_fdct_16x16 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[9]);
tmp7 = GETJSAMPLE(elemptr[7]) - GETJSAMPLE(elemptr[8]);
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM)
((tmp10 + tmp11 + tmp12 + tmp13 - 16 * CENTERJSAMPLE) << PASS1_BITS);
dataptr[4] = (DCTELEM)
@@ -2275,6 +2300,7 @@ jpeg_fdct_16x16 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
* We remove the PASS1_BITS scaling, but leave the results scaled up
* by an overall factor of 8.
* We must also scale the output by (8/16)**2 = 1/2**2.
+ * cK represents sqrt(2) * cos(K*pi/32).
*/
dataptr = data;
@@ -2380,10 +2406,11 @@ jpeg_fdct_16x8 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
int ctr;
SHIFT_TEMPS
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* 16-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/32). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * 16-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/32).
+ */
dataptr = data;
ctr = 0;
@@ -2419,7 +2446,7 @@ jpeg_fdct_16x8 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[9]);
tmp7 = GETJSAMPLE(elemptr[7]) - GETJSAMPLE(elemptr[8]);
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM)
((tmp10 + tmp11 + tmp12 + tmp13 - 16 * CENTERJSAMPLE) << PASS1_BITS);
dataptr[4] = (DCTELEM)
@@ -2475,12 +2502,13 @@ jpeg_fdct_16x8 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
* We remove the PASS1_BITS scaling, but leave the results scaled up
* by an overall factor of 8.
* We must also scale the output by 8/16 = 1/2.
+ * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
*/
dataptr = data;
for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
/* Even part per LL&M figure 1 --- note that published figure is faulty;
- * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".
+ * rotator "c1" should be "c6".
*/
tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
@@ -2501,43 +2529,43 @@ jpeg_fdct_16x8 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS+1);
dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS+1);
- z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
- dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, FIX_0_765366865),
- CONST_BITS+PASS1_BITS+1);
- dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 - MULTIPLY(tmp13, FIX_1_847759065),
- CONST_BITS+PASS1_BITS+1);
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); /* c6 */
+ dataptr[DCTSIZE*2] = (DCTELEM)
+ DESCALE(z1 + MULTIPLY(tmp12, FIX_0_765366865), /* c2-c6 */
+ CONST_BITS+PASS1_BITS+1);
+ dataptr[DCTSIZE*6] = (DCTELEM)
+ DESCALE(z1 - MULTIPLY(tmp13, FIX_1_847759065), /* c2+c6 */
+ CONST_BITS+PASS1_BITS+1);
/* Odd part per figure 8 --- note paper omits factor of sqrt(2).
- * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
* i0..i3 in the paper are tmp0..tmp3 here.
*/
- tmp10 = tmp0 + tmp3;
- tmp11 = tmp1 + tmp2;
tmp12 = tmp0 + tmp2;
tmp13 = tmp1 + tmp3;
- z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */
-
- tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */
- tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */
- tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */
- tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */
- tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */
- tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */
- tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */
- tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */
+ tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* -c3+c5 */
+ tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */
tmp12 += z1;
tmp13 += z1;
- dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0 + tmp10 + tmp12,
- CONST_BITS+PASS1_BITS+1);
- dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1 + tmp11 + tmp13,
- CONST_BITS+PASS1_BITS+1);
- dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2 + tmp11 + tmp12,
- CONST_BITS+PASS1_BITS+1);
- dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3 + tmp10 + tmp13,
- CONST_BITS+PASS1_BITS+1);
+ z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
+ tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */
+ tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */
+ tmp0 += z1 + tmp12;
+ tmp3 += z1 + tmp13;
+
+ z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
+ tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */
+ tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */
+ tmp1 += z1 + tmp13;
+ tmp2 += z1 + tmp12;
+
+ dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp0, CONST_BITS+PASS1_BITS+1);
+ dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp1, CONST_BITS+PASS1_BITS+1);
+ dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp2, CONST_BITS+PASS1_BITS+1);
+ dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp3, CONST_BITS+PASS1_BITS+1);
dataptr++; /* advance pointer to next column */
}
@@ -2564,10 +2592,11 @@ jpeg_fdct_14x7 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Zero bottom row of output coefficient block. */
MEMZERO(&data[DCTSIZE*7], SIZEOF(DCTELEM) * DCTSIZE);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* 14-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/28). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * 14-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/28).
+ */
dataptr = data;
for (ctr = 0; ctr < 7; ctr++) {
@@ -2598,7 +2627,7 @@ jpeg_fdct_14x7 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[8]);
tmp6 = GETJSAMPLE(elemptr[6]) - GETJSAMPLE(elemptr[7]);
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM)
((tmp10 + tmp11 + tmp12 + tmp13 - 14 * CENTERJSAMPLE) << PASS1_BITS);
tmp13 += tmp13;
@@ -2727,10 +2756,11 @@ jpeg_fdct_12x6 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Zero 2 bottom rows of output coefficient block. */
MEMZERO(&data[DCTSIZE*6], SIZEOF(DCTELEM) * DCTSIZE * 2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* 12-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/24). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * 12-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/24).
+ */
dataptr = data;
for (ctr = 0; ctr < 6; ctr++) {
@@ -2759,7 +2789,7 @@ jpeg_fdct_12x6 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[7]);
tmp5 = GETJSAMPLE(elemptr[5]) - GETJSAMPLE(elemptr[6]);
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM)
((tmp10 + tmp11 + tmp12 - 12 * CENTERJSAMPLE) << PASS1_BITS);
dataptr[6] = (DCTELEM) ((tmp13 - tmp14 - tmp15) << PASS1_BITS);
@@ -2866,10 +2896,11 @@ jpeg_fdct_10x5 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Zero 3 bottom rows of output coefficient block. */
MEMZERO(&data[DCTSIZE*5], SIZEOF(DCTELEM) * DCTSIZE * 3);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* 10-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/20). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * 10-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/20).
+ */
dataptr = data;
for (ctr = 0; ctr < 5; ctr++) {
@@ -2894,7 +2925,7 @@ jpeg_fdct_10x5 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[6]);
tmp4 = GETJSAMPLE(elemptr[4]) - GETJSAMPLE(elemptr[5]);
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM)
((tmp10 + tmp11 + tmp12 - 10 * CENTERJSAMPLE) << PASS1_BITS);
tmp12 += tmp12;
@@ -2999,17 +3030,19 @@ jpeg_fdct_8x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Zero 4 bottom rows of output coefficient block. */
MEMZERO(&data[DCTSIZE*4], SIZEOF(DCTELEM) * DCTSIZE * 4);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* We must also scale the output by 8/4 = 2, which we add here. */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * We must also scale the output by 8/4 = 2, which we add here.
+ * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
+ */
dataptr = data;
for (ctr = 0; ctr < 4; ctr++) {
elemptr = sample_data[ctr] + start_col;
/* Even part per LL&M figure 1 --- note that published figure is faulty;
- * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".
+ * rotator "c1" should be "c6".
*/
tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]);
@@ -3027,52 +3060,54 @@ jpeg_fdct_8x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]);
tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]);
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM)
((tmp10 + tmp11 - 8 * CENTERJSAMPLE) << (PASS1_BITS+1));
dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << (PASS1_BITS+1));
- z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); /* c6 */
/* Add fudge factor here for final descale. */
z1 += ONE << (CONST_BITS-PASS1_BITS-2);
- dataptr[2] = (DCTELEM) RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865),
- CONST_BITS-PASS1_BITS-1);
- dataptr[6] = (DCTELEM) RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065),
- CONST_BITS-PASS1_BITS-1);
+
+ dataptr[2] = (DCTELEM)
+ RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), /* c2-c6 */
+ CONST_BITS-PASS1_BITS-1);
+ dataptr[6] = (DCTELEM)
+ RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), /* c2+c6 */
+ CONST_BITS-PASS1_BITS-1);
/* Odd part per figure 8 --- note paper omits factor of sqrt(2).
- * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
* i0..i3 in the paper are tmp0..tmp3 here.
*/
- tmp10 = tmp0 + tmp3;
- tmp11 = tmp1 + tmp2;
tmp12 = tmp0 + tmp2;
tmp13 = tmp1 + tmp3;
- z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */
+
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */
/* Add fudge factor here for final descale. */
z1 += ONE << (CONST_BITS-PASS1_BITS-2);
- tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */
- tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */
- tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */
- tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */
- tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */
- tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */
- tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */
- tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */
-
+ tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* -c3+c5 */
+ tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */
tmp12 += z1;
tmp13 += z1;
- dataptr[1] = (DCTELEM)
- RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS-PASS1_BITS-1);
- dataptr[3] = (DCTELEM)
- RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS-PASS1_BITS-1);
- dataptr[5] = (DCTELEM)
- RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS-PASS1_BITS-1);
- dataptr[7] = (DCTELEM)
- RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS-PASS1_BITS-1);
+ z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
+ tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */
+ tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */
+ tmp0 += z1 + tmp12;
+ tmp3 += z1 + tmp13;
+
+ z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
+ tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */
+ tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */
+ tmp1 += z1 + tmp13;
+ tmp2 += z1 + tmp12;
+
+ dataptr[1] = (DCTELEM) RIGHT_SHIFT(tmp0, CONST_BITS-PASS1_BITS-1);
+ dataptr[3] = (DCTELEM) RIGHT_SHIFT(tmp1, CONST_BITS-PASS1_BITS-1);
+ dataptr[5] = (DCTELEM) RIGHT_SHIFT(tmp2, CONST_BITS-PASS1_BITS-1);
+ dataptr[7] = (DCTELEM) RIGHT_SHIFT(tmp3, CONST_BITS-PASS1_BITS-1);
dataptr += DCTSIZE; /* advance pointer to next row */
}
@@ -3080,7 +3115,8 @@ jpeg_fdct_8x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pass 2: process columns.
* We remove the PASS1_BITS scaling, but leave the results scaled up
* by an overall factor of 8.
- * 4-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
+ * 4-point FDCT kernel,
+ * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT].
*/
dataptr = data;
@@ -3099,7 +3135,7 @@ jpeg_fdct_8x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Odd part */
- tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */
+ tmp0 = MULTIPLY(tmp10 + tmp11, FIX_0_541196100); /* c6 */
/* Add fudge factor here for final descale. */
tmp0 += ONE << (CONST_BITS+PASS1_BITS-1);
@@ -3134,12 +3170,13 @@ jpeg_fdct_6x3 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* We scale the results further by 2 as part of output adaption */
- /* scaling for different DCT size. */
- /* 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * We scale the results further by 2 as part of output adaption
+ * scaling for different DCT size.
+ * 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
+ */
dataptr = data;
for (ctr = 0; ctr < 3; ctr++) {
@@ -3158,7 +3195,7 @@ jpeg_fdct_6x3 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[4]);
tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[3]);
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM)
((tmp10 + tmp11 - 6 * CENTERJSAMPLE) << (PASS1_BITS+1));
dataptr[2] = (DCTELEM)
@@ -3234,12 +3271,13 @@ jpeg_fdct_4x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* We must also scale the output by (8/4)*(8/2) = 2**3, which we add here. */
- /* 4-point FDCT kernel, */
- /* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT]. */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * We must also scale the output by (8/4)*(8/2) = 2**3, which we add here.
+ * 4-point FDCT kernel,
+ * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT].
+ */
dataptr = data;
for (ctr = 0; ctr < 2; ctr++) {
@@ -3253,7 +3291,7 @@ jpeg_fdct_4x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[3]);
tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[2]);
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM)
((tmp0 + tmp1 - 4 * CENTERJSAMPLE) << (PASS1_BITS+3));
dataptr[2] = (DCTELEM) ((tmp0 - tmp1) << (PASS1_BITS+3));
@@ -3307,7 +3345,7 @@ jpeg_fdct_4x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
GLOBAL(void)
jpeg_fdct_2x1 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
{
- INT32 tmp0, tmp1;
+ DCTELEM tmp0, tmp1;
JSAMPROW elemptr;
/* Pre-zero output coefficient block. */
@@ -3323,11 +3361,13 @@ jpeg_fdct_2x1 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
*/
/* Even part */
- /* Apply unsigned->signed conversion */
- data[0] = (DCTELEM) ((tmp0 + tmp1 - 2 * CENTERJSAMPLE) << 5);
+
+ /* Apply unsigned->signed conversion. */
+ data[0] = (tmp0 + tmp1 - 2 * CENTERJSAMPLE) << 5;
/* Odd part */
- data[1] = (DCTELEM) ((tmp0 - tmp1) << 5);
+
+ data[1] = (tmp0 - tmp1) << 5;
}
@@ -3350,9 +3390,11 @@ jpeg_fdct_8x16 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
int ctr;
SHIFT_TEMPS
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
+ */
dataptr = data;
ctr = 0;
@@ -3360,7 +3402,7 @@ jpeg_fdct_8x16 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
elemptr = sample_data[ctr] + start_col;
/* Even part per LL&M figure 1 --- note that published figure is faulty;
- * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".
+ * rotator "c1" should be "c6".
*/
tmp0 = GETJSAMPLE(elemptr[0]) + GETJSAMPLE(elemptr[7]);
@@ -3378,43 +3420,47 @@ jpeg_fdct_8x16 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[5]);
tmp3 = GETJSAMPLE(elemptr[3]) - GETJSAMPLE(elemptr[4]);
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM) ((tmp10 + tmp11 - 8 * CENTERJSAMPLE) << PASS1_BITS);
dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS);
- z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
- dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, FIX_0_765366865),
- CONST_BITS-PASS1_BITS);
- dataptr[6] = (DCTELEM) DESCALE(z1 - MULTIPLY(tmp13, FIX_1_847759065),
- CONST_BITS-PASS1_BITS);
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); /* c6 */
+ dataptr[2] = (DCTELEM)
+ DESCALE(z1 + MULTIPLY(tmp12, FIX_0_765366865), /* c2-c6 */
+ CONST_BITS-PASS1_BITS);
+ dataptr[6] = (DCTELEM)
+ DESCALE(z1 - MULTIPLY(tmp13, FIX_1_847759065), /* c2+c6 */
+ CONST_BITS-PASS1_BITS);
/* Odd part per figure 8 --- note paper omits factor of sqrt(2).
- * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
* i0..i3 in the paper are tmp0..tmp3 here.
*/
- tmp10 = tmp0 + tmp3;
- tmp11 = tmp1 + tmp2;
tmp12 = tmp0 + tmp2;
tmp13 = tmp1 + tmp3;
- z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */
-
- tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */
- tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */
- tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */
- tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */
- tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */
- tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */
- tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */
- tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */
+ tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* -c3+c5 */
+ tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */
tmp12 += z1;
tmp13 += z1;
- dataptr[1] = (DCTELEM) DESCALE(tmp0 + tmp10 + tmp12, CONST_BITS-PASS1_BITS);
- dataptr[3] = (DCTELEM) DESCALE(tmp1 + tmp11 + tmp13, CONST_BITS-PASS1_BITS);
- dataptr[5] = (DCTELEM) DESCALE(tmp2 + tmp11 + tmp12, CONST_BITS-PASS1_BITS);
- dataptr[7] = (DCTELEM) DESCALE(tmp3 + tmp10 + tmp13, CONST_BITS-PASS1_BITS);
+ z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
+ tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */
+ tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */
+ tmp0 += z1 + tmp12;
+ tmp3 += z1 + tmp13;
+
+ z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
+ tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */
+ tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */
+ tmp1 += z1 + tmp13;
+ tmp2 += z1 + tmp12;
+
+ dataptr[1] = (DCTELEM) DESCALE(tmp0, CONST_BITS-PASS1_BITS);
+ dataptr[3] = (DCTELEM) DESCALE(tmp1, CONST_BITS-PASS1_BITS);
+ dataptr[5] = (DCTELEM) DESCALE(tmp2, CONST_BITS-PASS1_BITS);
+ dataptr[7] = (DCTELEM) DESCALE(tmp3, CONST_BITS-PASS1_BITS);
ctr++;
@@ -3541,10 +3587,11 @@ jpeg_fdct_7x14 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* 7-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/14). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * 7-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/14).
+ */
dataptr = data;
ctr = 0;
@@ -3563,7 +3610,7 @@ jpeg_fdct_7x14 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
tmp12 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[4]);
z1 = tmp0 + tmp2;
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM)
((z1 + tmp1 + tmp3 - 7 * CENTERJSAMPLE) << PASS1_BITS);
tmp3 += tmp3;
@@ -3721,10 +3768,11 @@ jpeg_fdct_6x12 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * 6-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
+ */
dataptr = data;
ctr = 0;
@@ -3744,7 +3792,7 @@ jpeg_fdct_6x12 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[4]);
tmp2 = GETJSAMPLE(elemptr[2]) - GETJSAMPLE(elemptr[3]);
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM)
((tmp10 + tmp11 - 6 * CENTERJSAMPLE) << PASS1_BITS);
dataptr[2] = (DCTELEM)
@@ -3870,10 +3918,11 @@ jpeg_fdct_5x10 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* 5-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/10). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * 5-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/10).
+ */
dataptr = data;
ctr = 0;
@@ -3892,7 +3941,7 @@ jpeg_fdct_5x10 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
tmp0 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[4]);
tmp1 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[3]);
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM)
((tmp10 + tmp2 - 5 * CENTERJSAMPLE) << PASS1_BITS);
tmp11 = MULTIPLY(tmp11, FIX(0.790569415)); /* (c2+c4)/2 */
@@ -4015,11 +4064,13 @@ jpeg_fdct_4x8 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* We must also scale the output by 8/4 = 2, which we add here. */
- /* 4-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * We must also scale the output by 8/4 = 2, which we add here.
+ * 4-point FDCT kernel,
+ * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point FDCT].
+ */
dataptr = data;
for (ctr = 0; ctr < DCTSIZE; ctr++) {
@@ -4033,7 +4084,7 @@ jpeg_fdct_4x8 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
tmp10 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[3]);
tmp11 = GETJSAMPLE(elemptr[1]) - GETJSAMPLE(elemptr[2]);
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM)
((tmp0 + tmp1 - 4 * CENTERJSAMPLE) << (PASS1_BITS+1));
dataptr[2] = (DCTELEM) ((tmp0 - tmp1) << (PASS1_BITS+1));
@@ -4057,12 +4108,13 @@ jpeg_fdct_4x8 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pass 2: process columns.
* We remove the PASS1_BITS scaling, but leave the results scaled up
* by an overall factor of 8.
+ * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
*/
dataptr = data;
for (ctr = 0; ctr < 4; ctr++) {
/* Even part per LL&M figure 1 --- note that published figure is faulty;
- * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".
+ * rotator "c1" should be "c6".
*/
tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
@@ -4084,47 +4136,49 @@ jpeg_fdct_4x8 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
dataptr[DCTSIZE*0] = (DCTELEM) RIGHT_SHIFT(tmp10 + tmp11, PASS1_BITS);
dataptr[DCTSIZE*4] = (DCTELEM) RIGHT_SHIFT(tmp10 - tmp11, PASS1_BITS);
- z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); /* c6 */
/* Add fudge factor here for final descale. */
z1 += ONE << (CONST_BITS+PASS1_BITS-1);
+
dataptr[DCTSIZE*2] = (DCTELEM)
- RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), CONST_BITS+PASS1_BITS);
+ RIGHT_SHIFT(z1 + MULTIPLY(tmp12, FIX_0_765366865), /* c2-c6 */
+ CONST_BITS+PASS1_BITS);
dataptr[DCTSIZE*6] = (DCTELEM)
- RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), CONST_BITS+PASS1_BITS);
+ RIGHT_SHIFT(z1 - MULTIPLY(tmp13, FIX_1_847759065), /* c2+c6 */
+ CONST_BITS+PASS1_BITS);
/* Odd part per figure 8 --- note paper omits factor of sqrt(2).
- * 8-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
* i0..i3 in the paper are tmp0..tmp3 here.
*/
- tmp10 = tmp0 + tmp3;
- tmp11 = tmp1 + tmp2;
tmp12 = tmp0 + tmp2;
tmp13 = tmp1 + tmp3;
- z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */
+
+ z1 = MULTIPLY(tmp12 + tmp13, FIX_1_175875602); /* c3 */
/* Add fudge factor here for final descale. */
z1 += ONE << (CONST_BITS+PASS1_BITS-1);
- tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */
- tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */
- tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */
- tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */
- tmp10 = MULTIPLY(tmp10, - FIX_0_899976223); /* c7-c3 */
- tmp11 = MULTIPLY(tmp11, - FIX_2_562915447); /* -c1-c3 */
- tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* c5-c3 */
- tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */
-
+ tmp12 = MULTIPLY(tmp12, - FIX_0_390180644); /* -c3+c5 */
+ tmp13 = MULTIPLY(tmp13, - FIX_1_961570560); /* -c3-c5 */
tmp12 += z1;
tmp13 += z1;
- dataptr[DCTSIZE*1] = (DCTELEM)
- RIGHT_SHIFT(tmp0 + tmp10 + tmp12, CONST_BITS+PASS1_BITS);
- dataptr[DCTSIZE*3] = (DCTELEM)
- RIGHT_SHIFT(tmp1 + tmp11 + tmp13, CONST_BITS+PASS1_BITS);
- dataptr[DCTSIZE*5] = (DCTELEM)
- RIGHT_SHIFT(tmp2 + tmp11 + tmp12, CONST_BITS+PASS1_BITS);
- dataptr[DCTSIZE*7] = (DCTELEM)
- RIGHT_SHIFT(tmp3 + tmp10 + tmp13, CONST_BITS+PASS1_BITS);
+ z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
+ tmp0 = MULTIPLY(tmp0, FIX_1_501321110); /* c1+c3-c5-c7 */
+ tmp3 = MULTIPLY(tmp3, FIX_0_298631336); /* -c1+c3+c5-c7 */
+ tmp0 += z1 + tmp12;
+ tmp3 += z1 + tmp13;
+
+ z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
+ tmp1 = MULTIPLY(tmp1, FIX_3_072711026); /* c1+c3+c5-c7 */
+ tmp2 = MULTIPLY(tmp2, FIX_2_053119869); /* c1+c3-c5+c7 */
+ tmp1 += z1 + tmp13;
+ tmp2 += z1 + tmp12;
+
+ dataptr[DCTSIZE*1] = (DCTELEM) RIGHT_SHIFT(tmp0, CONST_BITS+PASS1_BITS);
+ dataptr[DCTSIZE*3] = (DCTELEM) RIGHT_SHIFT(tmp1, CONST_BITS+PASS1_BITS);
+ dataptr[DCTSIZE*5] = (DCTELEM) RIGHT_SHIFT(tmp2, CONST_BITS+PASS1_BITS);
+ dataptr[DCTSIZE*7] = (DCTELEM) RIGHT_SHIFT(tmp3, CONST_BITS+PASS1_BITS);
dataptr++; /* advance pointer to next column */
}
@@ -4150,12 +4204,13 @@ jpeg_fdct_3x6 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
- /* We scale the results further by 2 as part of output adaption */
- /* scaling for different DCT size. */
- /* 3-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/6). */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * We scale the results further by 2 as part of output adaption
+ * scaling for different DCT size.
+ * 3-point FDCT kernel, cK represents sqrt(2) * cos(K*pi/6).
+ */
dataptr = data;
for (ctr = 0; ctr < 6; ctr++) {
@@ -4168,7 +4223,7 @@ jpeg_fdct_3x6 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
tmp2 = GETJSAMPLE(elemptr[0]) - GETJSAMPLE(elemptr[2]);
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM)
((tmp0 + tmp1 - 3 * CENTERJSAMPLE) << (PASS1_BITS+1));
dataptr[2] = (DCTELEM)
@@ -4255,9 +4310,10 @@ jpeg_fdct_2x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- /* Pass 1: process rows. */
- /* Note results are scaled up by sqrt(8) compared to a true DCT. */
- /* We must also scale the output by (8/2)*(8/4) = 2**3, which we add here. */
+ /* Pass 1: process rows.
+ * Note results are scaled up by sqrt(8) compared to a true DCT.
+ * We must also scale the output by (8/2)*(8/4) = 2**3, which we add here.
+ */
dataptr = data;
for (ctr = 0; ctr < 4; ctr++) {
@@ -4268,7 +4324,7 @@ jpeg_fdct_2x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
tmp0 = GETJSAMPLE(elemptr[0]);
tmp1 = GETJSAMPLE(elemptr[1]);
- /* Apply unsigned->signed conversion */
+ /* Apply unsigned->signed conversion. */
dataptr[0] = (DCTELEM) ((tmp0 + tmp1 - 2 * CENTERJSAMPLE) << 3);
/* Odd part */
@@ -4324,24 +4380,29 @@ jpeg_fdct_2x4 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
GLOBAL(void)
jpeg_fdct_1x2 (DCTELEM * data, JSAMPARRAY sample_data, JDIMENSION start_col)
{
- INT32 tmp0, tmp1;
+ DCTELEM tmp0, tmp1;
/* Pre-zero output coefficient block. */
MEMZERO(data, SIZEOF(DCTELEM) * DCTSIZE2);
- tmp0 = GETJSAMPLE(sample_data[0][start_col]);
- tmp1 = GETJSAMPLE(sample_data[1][start_col]);
+ /* Pass 1: empty. */
- /* We leave the results scaled up by an overall factor of 8.
+ /* Pass 2: process columns.
+ * We leave the results scaled up by an overall factor of 8.
* We must also scale the output by (8/1)*(8/2) = 2**5.
*/
/* Even part */
- /* Apply unsigned->signed conversion */
- data[DCTSIZE*0] = (DCTELEM) ((tmp0 + tmp1 - 2 * CENTERJSAMPLE) << 5);
+
+ tmp0 = GETJSAMPLE(sample_data[0][start_col]);
+ tmp1 = GETJSAMPLE(sample_data[1][start_col]);
+
+ /* Apply unsigned->signed conversion. */
+ data[DCTSIZE*0] = (tmp0 + tmp1 - 2 * CENTERJSAMPLE) << 5;
/* Odd part */
- data[DCTSIZE*1] = (DCTELEM) ((tmp0 - tmp1) << 5);
+
+ data[DCTSIZE*1] = (tmp0 - tmp1) << 5;
}
#endif /* DCT_SCALING_SUPPORTED */
diff --git a/3rdparty/libjpeg/jidctflt.c b/3rdparty/libjpeg/jidctflt.c
index 23ae9d333b7..c7e832a3bb0 100644
--- a/3rdparty/libjpeg/jidctflt.c
+++ b/3rdparty/libjpeg/jidctflt.c
@@ -2,7 +2,7 @@
* jidctflt.c
*
* Copyright (C) 1994-1998, Thomas G. Lane.
- * Modified 2010 by Guido Vollbeding.
+ * Modified 2010-2015 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -63,6 +63,8 @@
/*
* Perform dequantization and inverse DCT on one block of coefficients.
+ *
+ * cK represents cos(K*pi/16).
*/
GLOBAL(void)
@@ -77,7 +79,7 @@ jpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr,
FLOAT_MULT_TYPE * quantptr;
FAST_FLOAT * wsptr;
JSAMPROW outptr;
- JSAMPLE *range_limit = cinfo->sample_range_limit;
+ JSAMPLE *range_limit = IDCT_range_limit(cinfo);
int ctr;
FAST_FLOAT workspace[DCTSIZE2]; /* buffers data between passes */
@@ -95,14 +97,14 @@ jpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr,
* With typical images and quantization tables, half or more of the
* column DCT calculations can be simplified this way.
*/
-
+
if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&
inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&
inptr[DCTSIZE*7] == 0) {
/* AC terms all zero */
FAST_FLOAT dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
-
+
wsptr[DCTSIZE*0] = dcval;
wsptr[DCTSIZE*1] = dcval;
wsptr[DCTSIZE*2] = dcval;
@@ -111,13 +113,13 @@ jpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr,
wsptr[DCTSIZE*5] = dcval;
wsptr[DCTSIZE*6] = dcval;
wsptr[DCTSIZE*7] = dcval;
-
+
inptr++; /* advance pointers to next column */
quantptr++;
wsptr++;
continue;
}
-
+
/* Even part */
tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
@@ -135,7 +137,7 @@ jpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr,
tmp3 = tmp10 - tmp13;
tmp1 = tmp11 + tmp12;
tmp2 = tmp11 - tmp12;
-
+
/* Odd part */
tmp4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
@@ -172,7 +174,7 @@ jpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr,
quantptr++;
wsptr++;
}
-
+
/* Pass 2: process rows from work array, store into output array. */
wsptr = workspace;
@@ -183,16 +185,17 @@ jpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr,
* the simplification applies less often (typically 5% to 10% of the time).
* And testing floats for zero is relatively expensive, so we don't bother.
*/
-
+
/* Even part */
- /* Apply signed->unsigned and prepare float->int conversion */
- z5 = wsptr[0] + ((FAST_FLOAT) CENTERJSAMPLE + (FAST_FLOAT) 0.5);
+ /* Prepare range-limit and float->int conversion */
+ z5 = wsptr[0] + (((FAST_FLOAT) RANGE_CENTER) + ((FAST_FLOAT) 0.5));
tmp10 = z5 + wsptr[4];
tmp11 = z5 - wsptr[4];
tmp13 = wsptr[2] + wsptr[6];
- tmp12 = (wsptr[2] - wsptr[6]) * ((FAST_FLOAT) 1.414213562) - tmp13;
+ tmp12 = (wsptr[2] - wsptr[6]) *
+ ((FAST_FLOAT) 1.414213562) - tmp13; /* 2*c4 */
tmp0 = tmp10 + tmp13;
tmp3 = tmp10 - tmp13;
@@ -206,28 +209,28 @@ jpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr,
z11 = wsptr[1] + wsptr[7];
z12 = wsptr[1] - wsptr[7];
- tmp7 = z11 + z13;
- tmp11 = (z11 - z13) * ((FAST_FLOAT) 1.414213562);
+ tmp7 = z11 + z13; /* phase 5 */
+ tmp11 = (z11 - z13) * ((FAST_FLOAT) 1.414213562); /* 2*c4 */
z5 = (z10 + z12) * ((FAST_FLOAT) 1.847759065); /* 2*c2 */
tmp10 = z5 - z12 * ((FAST_FLOAT) 1.082392200); /* 2*(c2-c6) */
tmp12 = z5 - z10 * ((FAST_FLOAT) 2.613125930); /* 2*(c2+c6) */
- tmp6 = tmp12 - tmp7;
+ tmp6 = tmp12 - tmp7; /* phase 2 */
tmp5 = tmp11 - tmp6;
tmp4 = tmp10 - tmp5;
/* Final output stage: float->int conversion and range-limit */
- outptr[0] = range_limit[((int) (tmp0 + tmp7)) & RANGE_MASK];
- outptr[7] = range_limit[((int) (tmp0 - tmp7)) & RANGE_MASK];
- outptr[1] = range_limit[((int) (tmp1 + tmp6)) & RANGE_MASK];
- outptr[6] = range_limit[((int) (tmp1 - tmp6)) & RANGE_MASK];
- outptr[2] = range_limit[((int) (tmp2 + tmp5)) & RANGE_MASK];
- outptr[5] = range_limit[((int) (tmp2 - tmp5)) & RANGE_MASK];
- outptr[3] = range_limit[((int) (tmp3 + tmp4)) & RANGE_MASK];
- outptr[4] = range_limit[((int) (tmp3 - tmp4)) & RANGE_MASK];
-
+ outptr[0] = range_limit[(int) (tmp0 + tmp7) & RANGE_MASK];
+ outptr[7] = range_limit[(int) (tmp0 - tmp7) & RANGE_MASK];
+ outptr[1] = range_limit[(int) (tmp1 + tmp6) & RANGE_MASK];
+ outptr[6] = range_limit[(int) (tmp1 - tmp6) & RANGE_MASK];
+ outptr[2] = range_limit[(int) (tmp2 + tmp5) & RANGE_MASK];
+ outptr[5] = range_limit[(int) (tmp2 - tmp5) & RANGE_MASK];
+ outptr[3] = range_limit[(int) (tmp3 + tmp4) & RANGE_MASK];
+ outptr[4] = range_limit[(int) (tmp3 - tmp4) & RANGE_MASK];
+
wsptr += DCTSIZE; /* advance pointer to next row */
}
}
diff --git a/3rdparty/libjpeg/jidctfst.c b/3rdparty/libjpeg/jidctfst.c
index dba4216fb95..474cc45fd7f 100644
--- a/3rdparty/libjpeg/jidctfst.c
+++ b/3rdparty/libjpeg/jidctfst.c
@@ -2,6 +2,7 @@
* jidctfst.c
*
* Copyright (C) 1994-1998, Thomas G. Lane.
+ * Modified 2015 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -133,35 +134,10 @@
#endif
-/* Like DESCALE, but applies to a DCTELEM and produces an int.
- * We assume that int right shift is unsigned if INT32 right shift is.
- */
-
-#ifdef RIGHT_SHIFT_IS_UNSIGNED
-#define ISHIFT_TEMPS DCTELEM ishift_temp;
-#if BITS_IN_JSAMPLE == 8
-#define DCTELEMBITS 16 /* DCTELEM may be 16 or 32 bits */
-#else
-#define DCTELEMBITS 32 /* DCTELEM must be 32 bits */
-#endif
-#define IRIGHT_SHIFT(x,shft) \
- ((ishift_temp = (x)) < 0 ? \
- (ishift_temp >> (shft)) | ((~((DCTELEM) 0)) << (DCTELEMBITS-(shft))) : \
- (ishift_temp >> (shft)))
-#else
-#define ISHIFT_TEMPS
-#define IRIGHT_SHIFT(x,shft) ((x) >> (shft))
-#endif
-
-#ifdef USE_ACCURATE_ROUNDING
-#define IDESCALE(x,n) ((int) IRIGHT_SHIFT((x) + (1 << ((n)-1)), n))
-#else
-#define IDESCALE(x,n) ((int) IRIGHT_SHIFT(x, n))
-#endif
-
-
/*
* Perform dequantization and inverse DCT on one block of coefficients.
+ *
+ * cK represents cos(K*pi/16).
*/
GLOBAL(void)
@@ -180,7 +156,7 @@ jpeg_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info * compptr,
int ctr;
int workspace[DCTSIZE2]; /* buffers data between passes */
SHIFT_TEMPS /* for DESCALE */
- ISHIFT_TEMPS /* for IDESCALE */
+ ISHIFT_TEMPS /* for IRIGHT_SHIFT */
/* Pass 1: process columns from input, store into work array. */
@@ -253,12 +229,12 @@ jpeg_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info * compptr,
tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */
z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */
- tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */
- tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */
+ tmp10 = z5 - MULTIPLY(z12, FIX_1_082392200); /* 2*(c2-c6) */
+ tmp12 = z5 - MULTIPLY(z10, FIX_2_613125930); /* 2*(c2+c6) */
tmp6 = tmp12 - tmp7; /* phase 2 */
tmp5 = tmp11 - tmp6;
- tmp4 = tmp10 + tmp5;
+ tmp4 = tmp10 - tmp5;
wsptr[DCTSIZE*0] = (int) (tmp0 + tmp7);
wsptr[DCTSIZE*7] = (int) (tmp0 - tmp7);
@@ -266,21 +242,28 @@ jpeg_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info * compptr,
wsptr[DCTSIZE*6] = (int) (tmp1 - tmp6);
wsptr[DCTSIZE*2] = (int) (tmp2 + tmp5);
wsptr[DCTSIZE*5] = (int) (tmp2 - tmp5);
- wsptr[DCTSIZE*4] = (int) (tmp3 + tmp4);
- wsptr[DCTSIZE*3] = (int) (tmp3 - tmp4);
+ wsptr[DCTSIZE*3] = (int) (tmp3 + tmp4);
+ wsptr[DCTSIZE*4] = (int) (tmp3 - tmp4);
inptr++; /* advance pointers to next column */
quantptr++;
wsptr++;
}
- /* Pass 2: process rows from work array, store into output array. */
- /* Note that we must descale the results by a factor of 8 == 2**3, */
- /* and also undo the PASS1_BITS scaling. */
+ /* Pass 2: process rows from work array, store into output array.
+ * Note that we must descale the results by a factor of 8 == 2**3,
+ * and also undo the PASS1_BITS scaling.
+ */
wsptr = workspace;
for (ctr = 0; ctr < DCTSIZE; ctr++) {
outptr = output_buf[ctr] + output_col;
+
+ /* Add range center and fudge factor for final descale and range-limit. */
+ z5 = (DCTELEM) wsptr[0] +
+ ((((DCTELEM) RANGE_CENTER) << (PASS1_BITS+3)) +
+ (1 << (PASS1_BITS+2)));
+
/* Rows of zeroes can be exploited in the same way as we did with columns.
* However, the column calculation has created many nonzero AC terms, so
* the simplification applies less often (typically 5% to 10% of the time).
@@ -293,7 +276,7 @@ jpeg_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info * compptr,
if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 &&
wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {
/* AC terms all zero */
- JSAMPLE dcval = range_limit[IDESCALE(wsptr[0], PASS1_BITS+3)
+ JSAMPLE dcval = range_limit[(int) IRIGHT_SHIFT(z5, PASS1_BITS+3)
& RANGE_MASK];
outptr[0] = dcval;
@@ -312,12 +295,12 @@ jpeg_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Even part */
- tmp10 = ((DCTELEM) wsptr[0] + (DCTELEM) wsptr[4]);
- tmp11 = ((DCTELEM) wsptr[0] - (DCTELEM) wsptr[4]);
+ tmp10 = z5 + (DCTELEM) wsptr[4];
+ tmp11 = z5 - (DCTELEM) wsptr[4];
- tmp13 = ((DCTELEM) wsptr[2] + (DCTELEM) wsptr[6]);
- tmp12 = MULTIPLY((DCTELEM) wsptr[2] - (DCTELEM) wsptr[6], FIX_1_414213562)
- - tmp13;
+ tmp13 = (DCTELEM) wsptr[2] + (DCTELEM) wsptr[6];
+ tmp12 = MULTIPLY((DCTELEM) wsptr[2] - (DCTELEM) wsptr[6],
+ FIX_1_414213562) - tmp13; /* 2*c4 */
tmp0 = tmp10 + tmp13;
tmp3 = tmp10 - tmp13;
@@ -335,30 +318,30 @@ jpeg_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info * compptr,
tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */
z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */
- tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */
- tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */
+ tmp10 = z5 - MULTIPLY(z12, FIX_1_082392200); /* 2*(c2-c6) */
+ tmp12 = z5 - MULTIPLY(z10, FIX_2_613125930); /* 2*(c2+c6) */
tmp6 = tmp12 - tmp7; /* phase 2 */
tmp5 = tmp11 - tmp6;
- tmp4 = tmp10 + tmp5;
+ tmp4 = tmp10 - tmp5;
/* Final output stage: scale down by a factor of 8 and range-limit */
- outptr[0] = range_limit[IDESCALE(tmp0 + tmp7, PASS1_BITS+3)
+ outptr[0] = range_limit[(int) IRIGHT_SHIFT(tmp0 + tmp7, PASS1_BITS+3)
& RANGE_MASK];
- outptr[7] = range_limit[IDESCALE(tmp0 - tmp7, PASS1_BITS+3)
+ outptr[7] = range_limit[(int) IRIGHT_SHIFT(tmp0 - tmp7, PASS1_BITS+3)
& RANGE_MASK];
- outptr[1] = range_limit[IDESCALE(tmp1 + tmp6, PASS1_BITS+3)
+ outptr[1] = range_limit[(int) IRIGHT_SHIFT(tmp1 + tmp6, PASS1_BITS+3)
& RANGE_MASK];
- outptr[6] = range_limit[IDESCALE(tmp1 - tmp6, PASS1_BITS+3)
+ outptr[6] = range_limit[(int) IRIGHT_SHIFT(tmp1 - tmp6, PASS1_BITS+3)
& RANGE_MASK];
- outptr[2] = range_limit[IDESCALE(tmp2 + tmp5, PASS1_BITS+3)
+ outptr[2] = range_limit[(int) IRIGHT_SHIFT(tmp2 + tmp5, PASS1_BITS+3)
& RANGE_MASK];
- outptr[5] = range_limit[IDESCALE(tmp2 - tmp5, PASS1_BITS+3)
+ outptr[5] = range_limit[(int) IRIGHT_SHIFT(tmp2 - tmp5, PASS1_BITS+3)
& RANGE_MASK];
- outptr[4] = range_limit[IDESCALE(tmp3 + tmp4, PASS1_BITS+3)
+ outptr[3] = range_limit[(int) IRIGHT_SHIFT(tmp3 + tmp4, PASS1_BITS+3)
& RANGE_MASK];
- outptr[3] = range_limit[IDESCALE(tmp3 - tmp4, PASS1_BITS+3)
+ outptr[4] = range_limit[(int) IRIGHT_SHIFT(tmp3 - tmp4, PASS1_BITS+3)
& RANGE_MASK];
wsptr += DCTSIZE; /* advance pointer to next row */
diff --git a/3rdparty/libjpeg/jidctint.c b/3rdparty/libjpeg/jidctint.c
index dcdf7ce4547..de233ec996e 100644
--- a/3rdparty/libjpeg/jidctint.c
+++ b/3rdparty/libjpeg/jidctint.c
@@ -2,7 +2,7 @@
* jidctint.c
*
* Copyright (C) 1991-1998, Thomas G. Lane.
- * Modification developed 2002-2009 by Guido Vollbeding.
+ * Modification developed 2002-2015 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -165,6 +165,8 @@
/*
* Perform dequantization and inverse DCT on one block of coefficients.
+ *
+ * cK represents sqrt(2) * cos(K*pi/16).
*/
GLOBAL(void)
@@ -184,9 +186,10 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
int workspace[DCTSIZE2]; /* buffers data between passes */
SHIFT_TEMPS
- /* Pass 1: process columns from input, store into work array. */
- /* Note results are scaled up by sqrt(8) compared to a true IDCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
+ /* Pass 1: process columns from input, store into work array.
+ * Note results are scaled up by sqrt(8) compared to a true IDCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ */
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
@@ -223,15 +226,9 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
continue;
}
- /* Even part: reverse the even part of the forward DCT. */
- /* The rotator is sqrt(2)*c(-6). */
-
- z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
- z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
-
- z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
- tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865);
- tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065);
+ /* Even part: reverse the even part of the forward DCT.
+ * The rotator is c(-6).
+ */
z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
@@ -243,6 +240,13 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
tmp0 = z2 + z3;
tmp1 = z2 - z3;
+ z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
+ z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
+
+ z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
+ tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
+ tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
+
tmp10 = tmp0 + tmp2;
tmp13 = tmp0 - tmp2;
tmp11 = tmp1 + tmp3;
@@ -256,25 +260,25 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
-
+
z2 = tmp0 + tmp2;
z3 = tmp1 + tmp3;
- z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */
- z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
- z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
+ z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
+ z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
+ z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
z2 += z1;
z3 += z1;
- z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
- tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
- tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
+ z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
+ tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
+ tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
tmp0 += z1 + z2;
tmp3 += z1 + z3;
- z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
- tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
- tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
+ z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
+ tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
+ tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
tmp1 += z1 + z3;
tmp2 += z1 + z2;
@@ -288,19 +292,26 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
wsptr[DCTSIZE*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
wsptr[DCTSIZE*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
wsptr[DCTSIZE*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
-
+
inptr++; /* advance pointers to next column */
quantptr++;
wsptr++;
}
- /* Pass 2: process rows from work array, store into output array. */
- /* Note that we must descale the results by a factor of 8 == 2**3, */
- /* and also undo the PASS1_BITS scaling. */
+ /* Pass 2: process rows from work array, store into output array.
+ * Note that we must descale the results by a factor of 8 == 2**3,
+ * and also undo the PASS1_BITS scaling.
+ */
wsptr = workspace;
for (ctr = 0; ctr < DCTSIZE; ctr++) {
outptr = output_buf[ctr] + output_col;
+
+ /* Add range center and fudge factor for final descale and range-limit. */
+ z2 = (INT32) wsptr[0] +
+ ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
+ (ONE << (PASS1_BITS+2)));
+
/* Rows of zeroes can be exploited in the same way as we did with columns.
* However, the column calculation has created many nonzero AC terms, so
* the simplification applies less often (typically 5% to 10% of the time).
@@ -313,7 +324,7 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 &&
wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {
/* AC terms all zero */
- JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)
+ JSAMPLE dcval = range_limit[(int) RIGHT_SHIFT(z2, PASS1_BITS+3)
& RANGE_MASK];
outptr[0] = dcval;
@@ -330,23 +341,22 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
}
#endif
- /* Even part: reverse the even part of the forward DCT. */
- /* The rotator is sqrt(2)*c(-6). */
-
- z2 = (INT32) wsptr[2];
- z3 = (INT32) wsptr[6];
-
- z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
- tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865);
- tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065);
+ /* Even part: reverse the even part of the forward DCT.
+ * The rotator is c(-6).
+ */
- /* Add fudge factor here for final descale. */
- z2 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
z3 = (INT32) wsptr[4];
tmp0 = (z2 + z3) << CONST_BITS;
tmp1 = (z2 - z3) << CONST_BITS;
-
+
+ z2 = (INT32) wsptr[2];
+ z3 = (INT32) wsptr[6];
+
+ z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
+ tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
+ tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
+
tmp10 = tmp0 + tmp2;
tmp13 = tmp0 - tmp2;
tmp11 = tmp1 + tmp3;
@@ -364,21 +374,21 @@ jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
z2 = tmp0 + tmp2;
z3 = tmp1 + tmp3;
- z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */
- z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
- z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
+ z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
+ z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
+ z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
z2 += z1;
z3 += z1;
- z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
- tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
- tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
+ z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
+ tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
+ tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
tmp0 += z1 + z2;
tmp3 += z1 + z3;
- z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
- tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
- tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
+ z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
+ tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
+ tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
tmp1 += z1 + z3;
tmp2 += z1 + z2;
@@ -502,8 +512,10 @@ jpeg_idct_7x7 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Even part */
- /* Add fudge factor here for final descale. */
- tmp13 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
+ /* Add range center and fudge factor for final descale and range-limit. */
+ tmp13 = (INT32) wsptr[0] +
+ ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
+ (ONE << (PASS1_BITS+2)));
tmp13 <<= CONST_BITS;
z1 = (INT32) wsptr[2];
@@ -638,8 +650,10 @@ jpeg_idct_6x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Even part */
- /* Add fudge factor here for final descale. */
- tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
+ /* Add range center and fudge factor for final descale and range-limit. */
+ tmp0 = (INT32) wsptr[0] +
+ ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
+ (ONE << (PASS1_BITS+2)));
tmp0 <<= CONST_BITS;
tmp2 = (INT32) wsptr[4];
tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */
@@ -757,8 +771,10 @@ jpeg_idct_5x5 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Even part */
- /* Add fudge factor here for final descale. */
- tmp12 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
+ /* Add range center and fudge factor for final descale and range-limit. */
+ tmp12 = (INT32) wsptr[0] +
+ ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
+ (ONE << (PASS1_BITS+2)));
tmp12 <<= CONST_BITS;
tmp0 = (INT32) wsptr[2];
tmp1 = (INT32) wsptr[4];
@@ -869,8 +885,10 @@ jpeg_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Even part */
- /* Add fudge factor here for final descale. */
- tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
+ /* Add range center and fudge factor for final descale and range-limit. */
+ tmp0 = (INT32) wsptr[0] +
+ ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
+ (ONE << (PASS1_BITS+2)));
tmp2 = (INT32) wsptr[2];
tmp10 = (tmp0 + tmp2) << CONST_BITS;
@@ -966,8 +984,10 @@ jpeg_idct_3x3 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Even part */
- /* Add fudge factor here for final descale. */
- tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
+ /* Add range center and fudge factor for final descale and range-limit. */
+ tmp0 = (INT32) wsptr[0] +
+ ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
+ (ONE << (PASS1_BITS+2)));
tmp0 <<= CONST_BITS;
tmp2 = (INT32) wsptr[2];
tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */
@@ -1008,11 +1028,11 @@ jpeg_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
JCOEFPTR coef_block,
JSAMPARRAY output_buf, JDIMENSION output_col)
{
- INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5;
+ DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5;
ISLOW_MULT_TYPE * quantptr;
JSAMPROW outptr;
JSAMPLE *range_limit = IDCT_range_limit(cinfo);
- SHIFT_TEMPS
+ ISHIFT_TEMPS
/* Pass 1: process columns from input. */
@@ -1021,8 +1041,8 @@ jpeg_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Column 0 */
tmp4 = DEQUANTIZE(coef_block[DCTSIZE*0], quantptr[DCTSIZE*0]);
tmp5 = DEQUANTIZE(coef_block[DCTSIZE*1], quantptr[DCTSIZE*1]);
- /* Add fudge factor here for final descale. */
- tmp4 += ONE << 2;
+ /* Add range center and fudge factor for final descale and range-limit. */
+ tmp4 += (((DCTELEM) RANGE_CENTER) << 3) + (1 << 2);
tmp0 = tmp4 + tmp5;
tmp2 = tmp4 - tmp5;
@@ -1039,14 +1059,14 @@ jpeg_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Row 0 */
outptr = output_buf[0] + output_col;
- outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp0 + tmp1, 3) & RANGE_MASK];
- outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp0 - tmp1, 3) & RANGE_MASK];
+ outptr[0] = range_limit[(int) IRIGHT_SHIFT(tmp0 + tmp1, 3) & RANGE_MASK];
+ outptr[1] = range_limit[(int) IRIGHT_SHIFT(tmp0 - tmp1, 3) & RANGE_MASK];
/* Row 1 */
outptr = output_buf[1] + output_col;
- outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp2 + tmp3, 3) & RANGE_MASK];
- outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp2 - tmp3, 3) & RANGE_MASK];
+ outptr[0] = range_limit[(int) IRIGHT_SHIFT(tmp2 + tmp3, 3) & RANGE_MASK];
+ outptr[1] = range_limit[(int) IRIGHT_SHIFT(tmp2 - tmp3, 3) & RANGE_MASK];
}
@@ -1063,17 +1083,21 @@ jpeg_idct_1x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
JCOEFPTR coef_block,
JSAMPARRAY output_buf, JDIMENSION output_col)
{
- int dcval;
+ DCTELEM dcval;
ISLOW_MULT_TYPE * quantptr;
JSAMPLE *range_limit = IDCT_range_limit(cinfo);
- SHIFT_TEMPS
+ ISHIFT_TEMPS
/* 1x1 is trivial: just take the DC coefficient divided by 8. */
+
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
+
dcval = DEQUANTIZE(coef_block[0], quantptr[0]);
- dcval = (int) DESCALE((INT32) dcval, 3);
+ /* Add range center and fudge factor for descale and range-limit. */
+ dcval += (((DCTELEM) RANGE_CENTER) << 3) + (1 << 2);
- output_buf[0][output_col] = range_limit[dcval & RANGE_MASK];
+ output_buf[0][output_col] =
+ range_limit[(int) IRIGHT_SHIFT(dcval, 3) & RANGE_MASK];
}
@@ -1172,8 +1196,10 @@ jpeg_idct_9x9 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Even part */
- /* Add fudge factor here for final descale. */
- tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
+ /* Add range center and fudge factor for final descale and range-limit. */
+ tmp0 = (INT32) wsptr[0] +
+ ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
+ (ONE << (PASS1_BITS+2)));
tmp0 <<= CONST_BITS;
z1 = (INT32) wsptr[2];
@@ -1355,8 +1381,10 @@ jpeg_idct_10x10 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Even part */
- /* Add fudge factor here for final descale. */
- z3 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
+ /* Add range center and fudge factor for final descale and range-limit. */
+ z3 = (INT32) wsptr[0] +
+ ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
+ (ONE << (PASS1_BITS+2)));
z3 <<= CONST_BITS;
z4 = (INT32) wsptr[4];
z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */
@@ -1548,8 +1576,10 @@ jpeg_idct_11x11 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Even part */
- /* Add fudge factor here for final descale. */
- tmp10 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
+ /* Add range center and fudge factor for final descale and range-limit. */
+ tmp10 = (INT32) wsptr[0] +
+ ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
+ (ONE << (PASS1_BITS+2)));
tmp10 <<= CONST_BITS;
z1 = (INT32) wsptr[2];
@@ -1752,8 +1782,10 @@ jpeg_idct_12x12 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Even part */
- /* Add fudge factor here for final descale. */
- z3 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
+ /* Add range center and fudge factor for final descale and range-limit. */
+ z3 = (INT32) wsptr[0] +
+ ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
+ (ONE << (PASS1_BITS+2)));
z3 <<= CONST_BITS;
z4 = (INT32) wsptr[4];
@@ -1973,8 +2005,10 @@ jpeg_idct_13x13 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Even part */
- /* Add fudge factor here for final descale. */
- z1 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
+ /* Add range center and fudge factor for final descale and range-limit. */
+ z1 = (INT32) wsptr[0] +
+ ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
+ (ONE << (PASS1_BITS+2)));
z1 <<= CONST_BITS;
z2 = (INT32) wsptr[2];
@@ -2200,8 +2234,10 @@ jpeg_idct_14x14 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Even part */
- /* Add fudge factor here for final descale. */
- z1 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
+ /* Add range center and fudge factor for final descale and range-limit. */
+ z1 = (INT32) wsptr[0] +
+ ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
+ (ONE << (PASS1_BITS+2)));
z1 <<= CONST_BITS;
z4 = (INT32) wsptr[4];
z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */
@@ -2432,8 +2468,10 @@ jpeg_idct_15x15 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Even part */
- /* Add fudge factor here for final descale. */
- z1 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
+ /* Add range center and fudge factor for final descale and range-limit. */
+ z1 = (INT32) wsptr[0] +
+ ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
+ (ONE << (PASS1_BITS+2)));
z1 <<= CONST_BITS;
z2 = (INT32) wsptr[2];
@@ -2683,8 +2721,10 @@ jpeg_idct_16x16 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Even part */
- /* Add fudge factor here for final descale. */
- tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
+ /* Add range center and fudge factor for final descale and range-limit. */
+ tmp0 = (INT32) wsptr[0] +
+ ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
+ (ONE << (PASS1_BITS+2)));
tmp0 <<= CONST_BITS;
z1 = (INT32) wsptr[4];
@@ -2835,9 +2875,11 @@ jpeg_idct_16x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
int workspace[8*8]; /* buffers data between passes */
SHIFT_TEMPS
- /* Pass 1: process columns from input, store into work array. */
- /* Note results are scaled up by sqrt(8) compared to a true IDCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
+ /* Pass 1: process columns from input, store into work array.
+ * Note results are scaled up by sqrt(8) compared to a true IDCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * 8-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
+ */
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
@@ -2851,14 +2893,14 @@ jpeg_idct_16x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
* With typical images and quantization tables, half or more of the
* column DCT calculations can be simplified this way.
*/
-
+
if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&
inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&
inptr[DCTSIZE*7] == 0) {
/* AC terms all zero */
int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
-
+
wsptr[DCTSIZE*0] = dcval;
wsptr[DCTSIZE*1] = dcval;
wsptr[DCTSIZE*2] = dcval;
@@ -2867,23 +2909,24 @@ jpeg_idct_16x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
wsptr[DCTSIZE*5] = dcval;
wsptr[DCTSIZE*6] = dcval;
wsptr[DCTSIZE*7] = dcval;
-
+
inptr++; /* advance pointers to next column */
quantptr++;
wsptr++;
continue;
}
-
- /* Even part: reverse the even part of the forward DCT. */
- /* The rotator is sqrt(2)*c(-6). */
-
+
+ /* Even part: reverse the even part of the forward DCT.
+ * The rotator is c(-6).
+ */
+
z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
-
- z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
- tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865);
- tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065);
-
+
+ z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
+ tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
+ tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
+
z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
z2 <<= CONST_BITS;
@@ -2893,44 +2936,44 @@ jpeg_idct_16x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
tmp0 = z2 + z3;
tmp1 = z2 - z3;
-
+
tmp10 = tmp0 + tmp2;
tmp13 = tmp0 - tmp2;
tmp11 = tmp1 + tmp3;
tmp12 = tmp1 - tmp3;
-
+
/* Odd part per figure 8; the matrix is unitary and hence its
* transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
*/
-
+
tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
-
+
z2 = tmp0 + tmp2;
z3 = tmp1 + tmp3;
- z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */
- z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
- z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
+ z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
+ z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
+ z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
z2 += z1;
z3 += z1;
- z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
- tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
- tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
+ z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
+ tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
+ tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
tmp0 += z1 + z2;
tmp3 += z1 + z3;
- z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
- tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
- tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
+ z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
+ tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
+ tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
tmp1 += z1 + z3;
tmp2 += z1 + z2;
-
+
/* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
-
+
wsptr[DCTSIZE*0] = (int) RIGHT_SHIFT(tmp10 + tmp3, CONST_BITS-PASS1_BITS);
wsptr[DCTSIZE*7] = (int) RIGHT_SHIFT(tmp10 - tmp3, CONST_BITS-PASS1_BITS);
wsptr[DCTSIZE*1] = (int) RIGHT_SHIFT(tmp11 + tmp2, CONST_BITS-PASS1_BITS);
@@ -2939,7 +2982,7 @@ jpeg_idct_16x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
wsptr[DCTSIZE*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
wsptr[DCTSIZE*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
wsptr[DCTSIZE*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
-
+
inptr++; /* advance pointers to next column */
quantptr++;
wsptr++;
@@ -2948,14 +2991,17 @@ jpeg_idct_16x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 2: process 8 rows from work array, store into output array.
* 16-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/32).
*/
+
wsptr = workspace;
for (ctr = 0; ctr < 8; ctr++) {
outptr = output_buf[ctr] + output_col;
/* Even part */
- /* Add fudge factor here for final descale. */
- tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
+ /* Add range center and fudge factor for final descale and range-limit. */
+ tmp0 = (INT32) wsptr[0] +
+ ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
+ (ONE << (PASS1_BITS+2)));
tmp0 <<= CONST_BITS;
z1 = (INT32) wsptr[4];
@@ -3109,6 +3155,7 @@ jpeg_idct_14x7 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 1: process columns from input, store into work array.
* 7-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/14).
*/
+
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
wsptr = workspace;
@@ -3164,14 +3211,17 @@ jpeg_idct_14x7 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 2: process 7 rows from work array, store into output array.
* 14-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/28).
*/
+
wsptr = workspace;
for (ctr = 0; ctr < 7; ctr++) {
outptr = output_buf[ctr] + output_col;
/* Even part */
- /* Add fudge factor here for final descale. */
- z1 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
+ /* Add range center and fudge factor for final descale and range-limit. */
+ z1 = (INT32) wsptr[0] +
+ ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
+ (ONE << (PASS1_BITS+2)));
z1 <<= CONST_BITS;
z4 = (INT32) wsptr[4];
z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */
@@ -3304,6 +3354,7 @@ jpeg_idct_12x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 1: process columns from input, store into work array.
* 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
*/
+
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
wsptr = workspace;
@@ -3346,14 +3397,17 @@ jpeg_idct_12x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 2: process 6 rows from work array, store into output array.
* 12-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/24).
*/
+
wsptr = workspace;
for (ctr = 0; ctr < 6; ctr++) {
outptr = output_buf[ctr] + output_col;
/* Even part */
- /* Add fudge factor here for final descale. */
- z3 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
+ /* Add range center and fudge factor for final descale and range-limit. */
+ z3 = (INT32) wsptr[0] +
+ ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
+ (ONE << (PASS1_BITS+2)));
z3 <<= CONST_BITS;
z4 = (INT32) wsptr[4];
@@ -3480,6 +3534,7 @@ jpeg_idct_10x5 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 1: process columns from input, store into work array.
* 5-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/10).
*/
+
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
wsptr = workspace;
@@ -3520,14 +3575,17 @@ jpeg_idct_10x5 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 2: process 5 rows from work array, store into output array.
* 10-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/20).
*/
+
wsptr = workspace;
for (ctr = 0; ctr < 5; ctr++) {
outptr = output_buf[ctr] + output_col;
/* Even part */
- /* Add fudge factor here for final descale. */
- z3 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
+ /* Add range center and fudge factor for final descale and range-limit. */
+ z3 = (INT32) wsptr[0] +
+ ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
+ (ONE << (PASS1_BITS+2)));
z3 <<= CONST_BITS;
z4 = (INT32) wsptr[4];
z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */
@@ -3639,8 +3697,10 @@ jpeg_idct_8x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
SHIFT_TEMPS
/* Pass 1: process columns from input, store into work array.
- * 4-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
+ * 4-point IDCT kernel,
+ * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT].
*/
+
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
wsptr = workspace;
@@ -3675,31 +3735,36 @@ jpeg_idct_8x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
wsptr[8*2] = (int) (tmp12 - tmp2);
}
- /* Pass 2: process rows from work array, store into output array. */
- /* Note that we must descale the results by a factor of 8 == 2**3, */
- /* and also undo the PASS1_BITS scaling. */
+ /* Pass 2: process rows from work array, store into output array.
+ * Note that we must descale the results by a factor of 8 == 2**3,
+ * and also undo the PASS1_BITS scaling.
+ * 8-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
+ */
wsptr = workspace;
for (ctr = 0; ctr < 4; ctr++) {
outptr = output_buf[ctr] + output_col;
- /* Even part: reverse the even part of the forward DCT. */
- /* The rotator is sqrt(2)*c(-6). */
+ /* Even part: reverse the even part of the forward DCT.
+ * The rotator is c(-6).
+ */
- z2 = (INT32) wsptr[2];
- z3 = (INT32) wsptr[6];
-
- z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
- tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865);
- tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065);
-
- /* Add fudge factor here for final descale. */
- z2 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
+ /* Add range center and fudge factor for final descale and range-limit. */
+ z2 = (INT32) wsptr[0] +
+ ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
+ (ONE << (PASS1_BITS+2)));
z3 = (INT32) wsptr[4];
-
+
tmp0 = (z2 + z3) << CONST_BITS;
tmp1 = (z2 - z3) << CONST_BITS;
-
+
+ z2 = (INT32) wsptr[2];
+ z3 = (INT32) wsptr[6];
+
+ z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
+ tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
+ tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
+
tmp10 = tmp0 + tmp2;
tmp13 = tmp0 - tmp2;
tmp11 = tmp1 + tmp3;
@@ -3717,21 +3782,21 @@ jpeg_idct_8x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
z2 = tmp0 + tmp2;
z3 = tmp1 + tmp3;
- z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */
- z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
- z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
+ z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
+ z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
+ z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
z2 += z1;
z3 += z1;
- z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
- tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
- tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
+ z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
+ tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
+ tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
tmp0 += z1 + z2;
tmp3 += z1 + z3;
- z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
- tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
- tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
+ z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
+ tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
+ tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
tmp1 += z1 + z3;
tmp2 += z1 + z2;
@@ -3793,6 +3858,7 @@ jpeg_idct_6x3 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 1: process columns from input, store into work array.
* 3-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/6).
*/
+
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
wsptr = workspace;
@@ -3823,14 +3889,17 @@ jpeg_idct_6x3 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 2: process 3 rows from work array, store into output array.
* 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
*/
+
wsptr = workspace;
for (ctr = 0; ctr < 3; ctr++) {
outptr = output_buf[ctr] + output_col;
/* Even part */
- /* Add fudge factor here for final descale. */
- tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
+ /* Add range center and fudge factor for final descale and range-limit. */
+ tmp0 = (INT32) wsptr[0] +
+ ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
+ (ONE << (PASS1_BITS+2)));
tmp0 <<= CONST_BITS;
tmp2 = (INT32) wsptr[4];
tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */
@@ -3924,14 +3993,15 @@ jpeg_idct_4x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
* 4-point IDCT kernel,
* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT].
*/
+
wsptr = workspace;
for (ctr = 0; ctr < 2; ctr++) {
outptr = output_buf[ctr] + output_col;
/* Even part */
- /* Add fudge factor here for final descale. */
- tmp0 = wsptr[0] + (ONE << 2);
+ /* Add range center and fudge factor for final descale and range-limit. */
+ tmp0 = wsptr[0] + ((((INT32) RANGE_CENTER) << 3) + (ONE << 2));
tmp2 = wsptr[2];
tmp10 = (tmp0 + tmp2) << CONST_BITS;
@@ -3979,11 +4049,11 @@ jpeg_idct_2x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
JCOEFPTR coef_block,
JSAMPARRAY output_buf, JDIMENSION output_col)
{
- INT32 tmp0, tmp10;
+ DCTELEM tmp0, tmp1;
ISLOW_MULT_TYPE * quantptr;
JSAMPROW outptr;
JSAMPLE *range_limit = IDCT_range_limit(cinfo);
- SHIFT_TEMPS
+ ISHIFT_TEMPS
/* Pass 1: empty. */
@@ -3994,18 +4064,18 @@ jpeg_idct_2x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Even part */
- tmp10 = DEQUANTIZE(coef_block[0], quantptr[0]);
- /* Add fudge factor here for final descale. */
- tmp10 += ONE << 2;
+ tmp0 = DEQUANTIZE(coef_block[0], quantptr[0]);
+ /* Add range center and fudge factor for final descale and range-limit. */
+ tmp0 += (((DCTELEM) RANGE_CENTER) << 3) + (1 << 2);
/* Odd part */
- tmp0 = DEQUANTIZE(coef_block[1], quantptr[1]);
+ tmp1 = DEQUANTIZE(coef_block[1], quantptr[1]);
/* Final output stage */
- outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, 3) & RANGE_MASK];
- outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, 3) & RANGE_MASK];
+ outptr[0] = range_limit[(int) IRIGHT_SHIFT(tmp0 + tmp1, 3) & RANGE_MASK];
+ outptr[1] = range_limit[(int) IRIGHT_SHIFT(tmp0 - tmp1, 3) & RANGE_MASK];
}
@@ -4036,6 +4106,7 @@ jpeg_idct_8x16 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 1: process columns from input, store into work array.
* 16-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/32).
*/
+
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
wsptr = workspace;
@@ -4134,69 +4205,74 @@ jpeg_idct_8x16 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
wsptr[8*7] = (int) RIGHT_SHIFT(tmp27 + tmp13, CONST_BITS-PASS1_BITS);
wsptr[8*8] = (int) RIGHT_SHIFT(tmp27 - tmp13, CONST_BITS-PASS1_BITS);
}
-
- /* Pass 2: process rows from work array, store into output array. */
- /* Note that we must descale the results by a factor of 8 == 2**3, */
- /* and also undo the PASS1_BITS scaling. */
+
+ /* Pass 2: process rows from work array, store into output array.
+ * Note that we must descale the results by a factor of 8 == 2**3,
+ * and also undo the PASS1_BITS scaling.
+ * 8-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
+ */
wsptr = workspace;
for (ctr = 0; ctr < 16; ctr++) {
outptr = output_buf[ctr] + output_col;
-
- /* Even part: reverse the even part of the forward DCT. */
- /* The rotator is sqrt(2)*c(-6). */
-
- z2 = (INT32) wsptr[2];
- z3 = (INT32) wsptr[6];
-
- z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
- tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865);
- tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065);
-
- /* Add fudge factor here for final descale. */
- z2 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
+
+ /* Even part: reverse the even part of the forward DCT.
+ * The rotator is c(-6).
+ */
+
+ /* Add range center and fudge factor for final descale and range-limit. */
+ z2 = (INT32) wsptr[0] +
+ ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
+ (ONE << (PASS1_BITS+2)));
z3 = (INT32) wsptr[4];
-
+
tmp0 = (z2 + z3) << CONST_BITS;
tmp1 = (z2 - z3) << CONST_BITS;
-
+
+ z2 = (INT32) wsptr[2];
+ z3 = (INT32) wsptr[6];
+
+ z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
+ tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
+ tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
+
tmp10 = tmp0 + tmp2;
tmp13 = tmp0 - tmp2;
tmp11 = tmp1 + tmp3;
tmp12 = tmp1 - tmp3;
-
+
/* Odd part per figure 8; the matrix is unitary and hence its
* transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
*/
-
+
tmp0 = (INT32) wsptr[7];
tmp1 = (INT32) wsptr[5];
tmp2 = (INT32) wsptr[3];
tmp3 = (INT32) wsptr[1];
-
+
z2 = tmp0 + tmp2;
z3 = tmp1 + tmp3;
- z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */
- z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
- z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
+ z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
+ z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
+ z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
z2 += z1;
z3 += z1;
- z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
- tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
- tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
+ z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
+ tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
+ tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
tmp0 += z1 + z2;
tmp3 += z1 + z3;
- z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
- tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
- tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
+ z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
+ tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
+ tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
tmp1 += z1 + z3;
tmp2 += z1 + z2;
-
+
/* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
-
+
outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp3,
CONST_BITS+PASS1_BITS+3)
& RANGE_MASK];
@@ -4221,7 +4297,7 @@ jpeg_idct_8x16 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp0,
CONST_BITS+PASS1_BITS+3)
& RANGE_MASK];
-
+
wsptr += DCTSIZE; /* advance pointer to next row */
}
}
@@ -4254,6 +4330,7 @@ jpeg_idct_7x14 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 1: process columns from input, store into work array.
* 14-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/28).
*/
+
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
wsptr = workspace;
@@ -4341,14 +4418,17 @@ jpeg_idct_7x14 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 2: process 14 rows from work array, store into output array.
* 7-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/14).
*/
+
wsptr = workspace;
for (ctr = 0; ctr < 14; ctr++) {
outptr = output_buf[ctr] + output_col;
/* Even part */
- /* Add fudge factor here for final descale. */
- tmp23 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
+ /* Add range center and fudge factor for final descale and range-limit. */
+ tmp23 = (INT32) wsptr[0] +
+ ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
+ (ONE << (PASS1_BITS+2)));
tmp23 <<= CONST_BITS;
z1 = (INT32) wsptr[2];
@@ -4437,6 +4517,7 @@ jpeg_idct_6x12 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 1: process columns from input, store into work array.
* 12-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/24).
*/
+
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
wsptr = workspace;
@@ -4520,14 +4601,17 @@ jpeg_idct_6x12 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 2: process 12 rows from work array, store into output array.
* 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
*/
+
wsptr = workspace;
for (ctr = 0; ctr < 12; ctr++) {
outptr = output_buf[ctr] + output_col;
/* Even part */
- /* Add fudge factor here for final descale. */
- tmp10 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
+ /* Add range center and fudge factor for final descale and range-limit. */
+ tmp10 = (INT32) wsptr[0] +
+ ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
+ (ONE << (PASS1_BITS+2)));
tmp10 <<= CONST_BITS;
tmp12 = (INT32) wsptr[4];
tmp20 = MULTIPLY(tmp12, FIX(0.707106781)); /* c4 */
@@ -4601,6 +4685,7 @@ jpeg_idct_5x10 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 1: process columns from input, store into work array.
* 10-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/20).
*/
+
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
wsptr = workspace;
@@ -4676,14 +4761,17 @@ jpeg_idct_5x10 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 2: process 10 rows from work array, store into output array.
* 5-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/10).
*/
+
wsptr = workspace;
for (ctr = 0; ctr < 10; ctr++) {
outptr = output_buf[ctr] + output_col;
/* Even part */
- /* Add fudge factor here for final descale. */
- tmp12 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
+ /* Add range center and fudge factor for final descale and range-limit. */
+ tmp12 = (INT32) wsptr[0] +
+ ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
+ (ONE << (PASS1_BITS+2)));
tmp12 <<= CONST_BITS;
tmp13 = (INT32) wsptr[2];
tmp14 = (INT32) wsptr[4];
@@ -4750,9 +4838,11 @@ jpeg_idct_4x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
int workspace[4*8]; /* buffers data between passes */
SHIFT_TEMPS
- /* Pass 1: process columns from input, store into work array. */
- /* Note results are scaled up by sqrt(8) compared to a true IDCT; */
- /* furthermore, we scale the results by 2**PASS1_BITS. */
+ /* Pass 1: process columns from input, store into work array.
+ * Note results are scaled up by sqrt(8) compared to a true IDCT;
+ * furthermore, we scale the results by 2**PASS1_BITS.
+ * 8-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
+ */
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
@@ -4789,16 +4879,17 @@ jpeg_idct_4x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
continue;
}
- /* Even part: reverse the even part of the forward DCT. */
- /* The rotator is sqrt(2)*c(-6). */
+ /* Even part: reverse the even part of the forward DCT.
+ * The rotator is c(-6).
+ */
z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
-
- z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
- tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865);
- tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065);
-
+
+ z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
+ tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
+ tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
+
z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
z2 <<= CONST_BITS;
@@ -4808,7 +4899,7 @@ jpeg_idct_4x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
tmp0 = z2 + z3;
tmp1 = z2 - z3;
-
+
tmp10 = tmp0 + tmp2;
tmp13 = tmp0 - tmp2;
tmp11 = tmp1 + tmp3;
@@ -4826,21 +4917,21 @@ jpeg_idct_4x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
z2 = tmp0 + tmp2;
z3 = tmp1 + tmp3;
- z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* sqrt(2) * c3 */
- z2 = MULTIPLY(z2, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
- z3 = MULTIPLY(z3, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
+ z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
+ z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
+ z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
z2 += z1;
z3 += z1;
- z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */
- tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
- tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */
+ z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
+ tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
+ tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
tmp0 += z1 + z2;
tmp3 += z1 + z3;
- z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
- tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
- tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
+ z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
+ tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
+ tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
tmp1 += z1 + z3;
tmp2 += z1 + z2;
@@ -4861,16 +4952,20 @@ jpeg_idct_4x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
}
/* Pass 2: process 8 rows from work array, store into output array.
- * 4-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
+ * 4-point IDCT kernel,
+ * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT].
*/
+
wsptr = workspace;
for (ctr = 0; ctr < 8; ctr++) {
outptr = output_buf[ctr] + output_col;
/* Even part */
- /* Add fudge factor here for final descale. */
- tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
+ /* Add range center and fudge factor for final descale and range-limit. */
+ tmp0 = (INT32) wsptr[0] +
+ ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
+ (ONE << (PASS1_BITS+2)));
tmp2 = (INT32) wsptr[2];
tmp10 = (tmp0 + tmp2) << CONST_BITS;
@@ -4900,7 +4995,7 @@ jpeg_idct_4x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2,
CONST_BITS+PASS1_BITS+3)
& RANGE_MASK];
-
+
wsptr += 4; /* advance pointer to next row */
}
}
@@ -4932,6 +5027,7 @@ jpeg_idct_3x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 1: process columns from input, store into work array.
* 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
*/
+
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
wsptr = workspace;
@@ -4974,14 +5070,17 @@ jpeg_idct_3x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Pass 2: process 6 rows from work array, store into output array.
* 3-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/6).
*/
+
wsptr = workspace;
for (ctr = 0; ctr < 6; ctr++) {
outptr = output_buf[ctr] + output_col;
/* Even part */
- /* Add fudge factor here for final descale. */
- tmp0 = (INT32) wsptr[0] + (ONE << (PASS1_BITS+2));
+ /* Add range center and fudge factor for final descale and range-limit. */
+ tmp0 = (INT32) wsptr[0] +
+ ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
+ (ONE << (PASS1_BITS+2)));
tmp0 <<= CONST_BITS;
tmp2 = (INT32) wsptr[2];
tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */
@@ -5037,6 +5136,7 @@ jpeg_idct_2x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
* 4-point IDCT kernel,
* cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT].
*/
+
inptr = coef_block;
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
wsptr = workspace;
@@ -5075,8 +5175,10 @@ jpeg_idct_2x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Even part */
- /* Add fudge factor here for final descale. */
- tmp10 = wsptr[0] + (ONE << (CONST_BITS+2));
+ /* Add range center and fudge factor for final descale and range-limit. */
+ tmp10 = wsptr[0] +
+ ((((INT32) RANGE_CENTER) << (CONST_BITS+3)) +
+ (ONE << (CONST_BITS+2)));
/* Odd part */
@@ -5106,31 +5208,31 @@ jpeg_idct_1x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
JCOEFPTR coef_block,
JSAMPARRAY output_buf, JDIMENSION output_col)
{
- INT32 tmp0, tmp10;
+ DCTELEM tmp0, tmp1;
ISLOW_MULT_TYPE * quantptr;
JSAMPLE *range_limit = IDCT_range_limit(cinfo);
- SHIFT_TEMPS
+ ISHIFT_TEMPS
/* Process 1 column from input, store into output array. */
quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
/* Even part */
-
- tmp10 = DEQUANTIZE(coef_block[DCTSIZE*0], quantptr[DCTSIZE*0]);
- /* Add fudge factor here for final descale. */
- tmp10 += ONE << 2;
+
+ tmp0 = DEQUANTIZE(coef_block[DCTSIZE*0], quantptr[DCTSIZE*0]);
+ /* Add range center and fudge factor for final descale and range-limit. */
+ tmp0 += (((DCTELEM) RANGE_CENTER) << 3) + (1 << 2);
/* Odd part */
- tmp0 = DEQUANTIZE(coef_block[DCTSIZE*1], quantptr[DCTSIZE*1]);
+ tmp1 = DEQUANTIZE(coef_block[DCTSIZE*1], quantptr[DCTSIZE*1]);
/* Final output stage */
- output_buf[0][output_col] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, 3)
- & RANGE_MASK];
- output_buf[1][output_col] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, 3)
- & RANGE_MASK];
+ output_buf[0][output_col] =
+ range_limit[(int) IRIGHT_SHIFT(tmp0 + tmp1, 3) & RANGE_MASK];
+ output_buf[1][output_col] =
+ range_limit[(int) IRIGHT_SHIFT(tmp0 - tmp1, 3) & RANGE_MASK];
}
#endif /* IDCT_SCALING_SUPPORTED */
diff --git a/3rdparty/libjpeg/jmemmgr.c b/3rdparty/libjpeg/jmemmgr.c
index d801b322da0..0a137cdde43 100644
--- a/3rdparty/libjpeg/jmemmgr.c
+++ b/3rdparty/libjpeg/jmemmgr.c
@@ -2,6 +2,7 @@
* jmemmgr.c
*
* Copyright (C) 1991-1997, Thomas G. Lane.
+ * Modified 2011-2012 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -213,7 +214,7 @@ print_mem_stats (j_common_ptr cinfo, int pool_id)
#endif /* MEM_STATS */
-LOCAL(void)
+LOCAL(noreturn_t)
out_of_memory (j_common_ptr cinfo, int which)
/* Report an out-of-memory error and stop execution */
/* If we compiled MEM_STATS support, report alloc requests before dying */
@@ -821,7 +822,7 @@ access_virt_sarray (j_common_ptr cinfo, jvirt_sarray_ptr ptr,
undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */
end_row -= ptr->cur_start_row;
while (undef_row < end_row) {
- jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow);
+ FMEMZERO((void FAR *) ptr->mem_buffer[undef_row], bytesperrow);
undef_row++;
}
} else {
@@ -906,7 +907,7 @@ access_virt_barray (j_common_ptr cinfo, jvirt_barray_ptr ptr,
undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */
end_row -= ptr->cur_start_row;
while (undef_row < end_row) {
- jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow);
+ FMEMZERO((void FAR *) ptr->mem_buffer[undef_row], bytesperrow);
undef_row++;
}
} else {
diff --git a/3rdparty/libjpeg/jmorecfg.h b/3rdparty/libjpeg/jmorecfg.h
index d336e6c7c32..679d68bdc54 100644
--- a/3rdparty/libjpeg/jmorecfg.h
+++ b/3rdparty/libjpeg/jmorecfg.h
@@ -2,7 +2,7 @@
* jmorecfg.h
*
* Copyright (C) 1991-1997, Thomas G. Lane.
- * Modified 1997-2009 by Guido Vollbeding.
+ * Modified 1997-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -15,13 +15,22 @@
/*
* Define BITS_IN_JSAMPLE as either
* 8 for 8-bit sample values (the usual setting)
+ * 9 for 9-bit sample values
+ * 10 for 10-bit sample values
+ * 11 for 11-bit sample values
* 12 for 12-bit sample values
- * Only 8 and 12 are legal data precisions for lossy JPEG according to the
- * JPEG standard, and the IJG code does not support anything else!
- * We do not support run-time selection of data precision, sorry.
+ * Only 8, 9, 10, 11, and 12 bits sample data precision are supported for
+ * full-feature DCT processing. Further depths up to 16-bit may be added
+ * later for the lossless modes of operation.
+ * Run-time selection and conversion of data precision will be added later
+ * and are currently not supported, sorry.
+ * Exception: The transcoding part (jpegtran) supports all settings in a
+ * single instance, since it operates on the level of DCT coefficients and
+ * not sample values. The DCT coefficients are of the same type (16 bits)
+ * in all cases (see below).
*/
-#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */
+#define BITS_IN_JSAMPLE 8 /* use 8, 9, 10, 11, or 12 */
/*
@@ -77,6 +86,48 @@ typedef char JSAMPLE;
#endif /* BITS_IN_JSAMPLE == 8 */
+#if BITS_IN_JSAMPLE == 9
+/* JSAMPLE should be the smallest type that will hold the values 0..511.
+ * On nearly all machines "short" will do nicely.
+ */
+
+typedef short JSAMPLE;
+#define GETJSAMPLE(value) ((int) (value))
+
+#define MAXJSAMPLE 511
+#define CENTERJSAMPLE 256
+
+#endif /* BITS_IN_JSAMPLE == 9 */
+
+
+#if BITS_IN_JSAMPLE == 10
+/* JSAMPLE should be the smallest type that will hold the values 0..1023.
+ * On nearly all machines "short" will do nicely.
+ */
+
+typedef short JSAMPLE;
+#define GETJSAMPLE(value) ((int) (value))
+
+#define MAXJSAMPLE 1023
+#define CENTERJSAMPLE 512
+
+#endif /* BITS_IN_JSAMPLE == 10 */
+
+
+#if BITS_IN_JSAMPLE == 11
+/* JSAMPLE should be the smallest type that will hold the values 0..2047.
+ * On nearly all machines "short" will do nicely.
+ */
+
+typedef short JSAMPLE;
+#define GETJSAMPLE(value) ((int) (value))
+
+#define MAXJSAMPLE 2047
+#define CENTERJSAMPLE 1024
+
+#endif /* BITS_IN_JSAMPLE == 11 */
+
+
#if BITS_IN_JSAMPLE == 12
/* JSAMPLE should be the smallest type that will hold the values 0..4095.
* On nearly all machines "short" will do nicely.
@@ -162,7 +213,7 @@ typedef short INT16;
#ifndef _BASETSD_H_ /* Microsoft defines it in basetsd.h */
#ifndef _BASETSD_H /* MinGW is slightly different */
#ifndef QGLOBAL_H /* Qt defines it in qglobal.h */
-typedef int INT32;
+typedef long INT32;
#endif
#endif
#endif
@@ -210,6 +261,26 @@ typedef unsigned int JDIMENSION;
#endif
+/* The noreturn type identifier is used to declare functions
+ * which cannot return.
+ * Compilers can thus create more optimized code and perform
+ * better checks for warnings and errors.
+ * Static analyzer tools can make improved inferences about
+ * execution paths and are prevented from giving false alerts.
+ *
+ * Unfortunately, the proposed specifications of corresponding
+ * extensions in the Dec 2011 ISO C standard revision (C11),
+ * GCC, MSVC, etc. are not viable.
+ * Thus we introduce a user defined type to declare noreturn
+ * functions at least for clarity. A proper compiler would
+ * have a suitable noreturn type to match in place of void.
+ */
+
+#ifndef HAVE_NORETURN_T
+typedef void noreturn_t;
+#endif
+
+
/* Here is the pseudo-keyword for declaring pointers that must be "far"
* on 80x86 machines. Most of the specialized coding for 80x86 is handled
* by just saying "FAR *" where such a pointer is needed. In a few places
@@ -233,14 +304,19 @@ typedef unsigned int JDIMENSION;
*/
#ifndef HAVE_BOOLEAN
+#if defined FALSE || defined TRUE || defined QGLOBAL_H
+/* Qt3 defines FALSE and TRUE as "const" variables in qglobal.h */
typedef int boolean;
-#endif
#ifndef FALSE /* in case these macros already exist */
#define FALSE 0 /* values of boolean */
#endif
#ifndef TRUE
#define TRUE 1
#endif
+#else
+typedef enum { FALSE = 0, TRUE = 1 } boolean;
+#endif
+#endif
/*
@@ -278,11 +354,12 @@ typedef int boolean;
#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/
#define DCT_SCALING_SUPPORTED /* Input rescaling via DCT? (Requires DCT_ISLOW)*/
#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */
-/* Note: if you selected 12-bit data precision, it is dangerous to turn off
- * ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit
- * precision, so jchuff.c normally uses entropy optimization to compute
- * usable tables for higher precision. If you don't want to do optimization,
- * you'll have to supply different default Huffman tables.
+/* Note: if you selected more than 8-bit data precision, it is dangerous to
+ * turn off ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only
+ * good for 8-bit precision, so arithmetic coding is recommended for higher
+ * precision. The Huffman encoder normally uses entropy optimization to
+ * compute usable tables for higher precision. Otherwise, you'll have to
+ * supply different default Huffman tables.
* The exact same statements apply for progressive JPEG: the default tables
* don't work for progressive mode. (This may get fixed, however.)
*/
@@ -293,7 +370,7 @@ typedef int boolean;
#define D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */
#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/
-#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */
+#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? (Requires DCT_ISLOW)*/
#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */
#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */
#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */
@@ -312,9 +389,7 @@ typedef int boolean;
* the offsets will also change the order in which colormap data is organized.
* RESTRICTIONS:
* 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats.
- * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not
- * useful if you are using JPEG color spaces other than YCbCr or grayscale.
- * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE
+ * 2. The color quantizer modules will not behave desirably if RGB_PIXELSIZE
* is not 3 (they don't understand about dummy color components!). So you
* can't use color quantization if you change that value.
*/
diff --git a/3rdparty/libjpeg/jpegint.h b/3rdparty/libjpeg/jpegint.h
index 0c27a4e4a03..18bb8879aaa 100644
--- a/3rdparty/libjpeg/jpegint.h
+++ b/3rdparty/libjpeg/jpegint.h
@@ -2,7 +2,7 @@
* jpegint.h
*
* Copyright (C) 1991-1997, Thomas G. Lane.
- * Modified 1997-2009 by Guido Vollbeding.
+ * Modified 1997-2013 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -211,8 +211,8 @@ struct jpeg_marker_reader {
/* Entropy decoding */
struct jpeg_entropy_decoder {
JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
- JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo,
- JBLOCKROW *MCU_data));
+ JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo, JBLOCKROW *MCU_data));
+ JMETHOD(void, finish_pass, (j_decompress_ptr cinfo));
};
/* Inverse DCT (also performs dequantization) */
@@ -321,21 +321,41 @@ struct jpeg_color_quantizer {
#define jinit_memory_mgr jIMemMgr
#define jdiv_round_up jDivRound
#define jround_up jRound
+#define jzero_far jZeroFar
#define jcopy_sample_rows jCopySamples
#define jcopy_block_row jCopyBlocks
-#define jzero_far jZeroFar
#define jpeg_zigzag_order jZIGTable
#define jpeg_natural_order jZAGTable
-#define jpeg_natural_order7 jZAGTable7
-#define jpeg_natural_order6 jZAGTable6
-#define jpeg_natural_order5 jZAGTable5
-#define jpeg_natural_order4 jZAGTable4
-#define jpeg_natural_order3 jZAGTable3
-#define jpeg_natural_order2 jZAGTable2
+#define jpeg_natural_order7 jZAG7Table
+#define jpeg_natural_order6 jZAG6Table
+#define jpeg_natural_order5 jZAG5Table
+#define jpeg_natural_order4 jZAG4Table
+#define jpeg_natural_order3 jZAG3Table
+#define jpeg_natural_order2 jZAG2Table
#define jpeg_aritab jAriTab
#endif /* NEED_SHORT_EXTERNAL_NAMES */
+/* On normal machines we can apply MEMCOPY() and MEMZERO() to sample arrays
+ * and coefficient-block arrays. This won't work on 80x86 because the arrays
+ * are FAR and we're assuming a small-pointer memory model. However, some
+ * DOS compilers provide far-pointer versions of memcpy() and memset() even
+ * in the small-model libraries. These will be used if USE_FMEM is defined.
+ * Otherwise, the routines in jutils.c do it the hard way.
+ */
+
+#ifndef NEED_FAR_POINTERS /* normal case, same as regular macro */
+#define FMEMZERO(target,size) MEMZERO(target,size)
+#else /* 80x86 case */
+#ifdef USE_FMEM
+#define FMEMZERO(target,size) _fmemset((void FAR *)(target), 0, (size_t)(size))
+#else
+EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero));
+#define FMEMZERO(target,size) jzero_far(target, size)
+#endif
+#endif
+
+
/* Compression module initialization routines */
EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo));
EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo,
@@ -381,7 +401,6 @@ EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row,
int num_rows, JDIMENSION num_cols));
EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row,
JDIMENSION num_blocks));
-EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero));
/* Constant tables in jutils.c */
#if 0 /* This table is not actually needed in v6a */
extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */
diff --git a/3rdparty/libjpeg/jpeglib.h b/3rdparty/libjpeg/jpeglib.h
index 1eb1fac033f..939b50be58d 100644
--- a/3rdparty/libjpeg/jpeglib.h
+++ b/3rdparty/libjpeg/jpeglib.h
@@ -2,7 +2,7 @@
* jpeglib.h
*
* Copyright (C) 1991-1998, Thomas G. Lane.
- * Modified 2002-2010 by Guido Vollbeding.
+ * Modified 2002-2015 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -34,20 +34,20 @@ extern "C" {
#endif
/* Version IDs for the JPEG library.
- * Might be useful for tests like "#if JPEG_LIB_VERSION >= 80".
+ * Might be useful for tests like "#if JPEG_LIB_VERSION >= 90".
*/
-#define JPEG_LIB_VERSION 80 /* Compatibility version 8.0 */
-#define JPEG_LIB_VERSION_MAJOR 8
-#define JPEG_LIB_VERSION_MINOR 3
+#define JPEG_LIB_VERSION 90 /* Compatibility version 9.0 */
+#define JPEG_LIB_VERSION_MAJOR 9
+#define JPEG_LIB_VERSION_MINOR 2
/* Various constants determining the sizes of things.
- * All of these are specified by the JPEG standard, so don't change them
- * if you want to be compatible.
+ * All of these are specified by the JPEG standard,
+ * so don't change them if you want to be compatible.
*/
-#define DCTSIZE 8 /* The basic DCT block is 8x8 samples */
+#define DCTSIZE 8 /* The basic DCT block is 8x8 coefficients */
#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */
#define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */
#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */
@@ -157,16 +157,21 @@ typedef struct {
/* The downsampled dimensions are the component's actual, unpadded number
* of samples at the main buffer (preprocessing/compression interface);
* DCT scaling is included, so
- * downsampled_width = ceil(image_width * Hi/Hmax * DCT_h_scaled_size/DCTSIZE)
+ * downsampled_width =
+ * ceil(image_width * Hi/Hmax * DCT_h_scaled_size/block_size)
* and similarly for height.
*/
JDIMENSION downsampled_width; /* actual width in samples */
JDIMENSION downsampled_height; /* actual height in samples */
- /* This flag is used only for decompression. In cases where some of the
- * components will be ignored (eg grayscale output from YCbCr image),
- * we can skip most computations for the unused components.
+ /* For decompression, in cases where some of the components will be
+ * ignored (eg grayscale output from YCbCr image), we can skip most
+ * computations for the unused components.
+ * For compression, some of the components will need further quantization
+ * scale by factor of 2 after DCT (eg BG_YCC output from normal RGB input).
+ * The field is first set TRUE for decompression, FALSE for compression
+ * in initial_setup, and then adapted in color conversion setup.
*/
- boolean component_needed; /* do we need the value of this component? */
+ boolean component_needed;
/* These values are computed before starting a scan of the component. */
/* The decompressor output side may not use these variables. */
@@ -215,12 +220,21 @@ struct jpeg_marker_struct {
typedef enum {
JCS_UNKNOWN, /* error/unspecified */
JCS_GRAYSCALE, /* monochrome */
- JCS_RGB, /* red/green/blue */
- JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */
+ JCS_RGB, /* red/green/blue, standard RGB (sRGB) */
+ JCS_YCbCr, /* Y/Cb/Cr (also known as YUV), standard YCC */
JCS_CMYK, /* C/M/Y/K */
- JCS_YCCK /* Y/Cb/Cr/K */
+ JCS_YCCK, /* Y/Cb/Cr/K */
+ JCS_BG_RGB, /* big gamut red/green/blue, bg-sRGB */
+ JCS_BG_YCC /* big gamut Y/Cb/Cr, bg-sYCC */
} J_COLOR_SPACE;
+/* Supported color transforms. */
+
+typedef enum {
+ JCT_NONE = 0,
+ JCT_SUBTRACT_GREEN = 1
+} J_COLOR_TRANSFORM;
+
/* DCT/IDCT algorithm options. */
typedef enum {
@@ -369,7 +383,10 @@ struct jpeg_compress_struct {
UINT16 X_density; /* Horizontal pixel density */
UINT16 Y_density; /* Vertical pixel density */
boolean write_Adobe_marker; /* should an Adobe marker be written? */
-
+
+ J_COLOR_TRANSFORM color_transform;
+ /* Color transform identifier, writes LSE marker if nonzero */
+
/* State variable: index of next scanline to be written to
* jpeg_write_scanlines(). Application may use this to control its
* processing loop, e.g., "while (next_scanline < image_height)".
@@ -589,6 +606,9 @@ struct jpeg_decompress_struct {
boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */
UINT8 Adobe_transform; /* Color transform code from Adobe marker */
+ J_COLOR_TRANSFORM color_transform;
+ /* Color transform identifier derived from LSE marker, otherwise zero */
+
boolean CCIR601_sampling; /* TRUE=first samples are cosited */
/* Aside from the specific data retained from APPn markers known to the
@@ -681,7 +701,7 @@ struct jpeg_decompress_struct {
struct jpeg_error_mgr {
/* Error exit handler: does not return to caller */
- JMETHOD(void, error_exit, (j_common_ptr cinfo));
+ JMETHOD(noreturn_t, error_exit, (j_common_ptr cinfo));
/* Conditionally emit a trace or warning message */
JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level));
/* Routine that actually outputs a trace or error message */
@@ -959,7 +979,7 @@ EXTERN(void) jpeg_mem_dest JPP((j_compress_ptr cinfo,
unsigned char ** outbuffer,
unsigned long * outsize));
EXTERN(void) jpeg_mem_src JPP((j_decompress_ptr cinfo,
- unsigned char * inbuffer,
+ const unsigned char * inbuffer,
unsigned long insize));
/* Default parameter setup for compression */
diff --git a/3rdparty/libjpeg/jpegtran.1 b/3rdparty/libjpeg/jpegtran.1
index 0ad1bbc8412..caefcd14169 100644
--- a/3rdparty/libjpeg/jpegtran.1
+++ b/3rdparty/libjpeg/jpegtran.1
@@ -1,4 +1,4 @@
-.TH JPEGTRAN 1 "28 December 2009"
+.TH JPEGTRAN 1 "20 September 2015"
.SH NAME
jpegtran \- lossless transformation of JPEG files
.SH SYNOPSIS
@@ -19,6 +19,10 @@ for example from baseline JPEG to progressive JPEG or vice versa. It can also
perform some rearrangements of the image data, for example turning an image
from landscape to portrait format by rotation.
.PP
+For EXIF files and JPEG files containing Exif data, you may prefer to use
+.B exiftran
+instead.
+.PP
.B jpegtran
works by rearranging the compressed data (DCT coefficients), without
ever fully decoding the image. Therefore, its transformations are lossless:
@@ -28,7 +32,11 @@ followed by
.B cjpeg
to accomplish the same conversion. But by the same token,
.B jpegtran
-cannot perform lossy operations such as changing the image quality.
+cannot perform lossy operations such as changing the image quality. However,
+while the image data is losslessly transformed, metadata can be removed. See
+the
+.B \-copy
+option for specifics.
.PP
.B jpegtran
reads the named JPEG/JFIF file, or the standard input if no file is
@@ -156,15 +164,24 @@ image region but losslessly preserves what is inside. Like the rotate and
flip transforms, lossless crop is restricted by the current JPEG format: the
upper left corner of the selected region must fall on an iMCU boundary. If
this does not hold for the given crop parameters, we silently move the upper
-left corner up and/or left to make it so, simultaneously increasing the region
-dimensions to keep the lower right crop corner unchanged. (Thus, the output
-image covers at least the requested region, but may cover more.)
+left corner up and/or left to make it so, simultaneously increasing the
+region dimensions to keep the lower right crop corner unchanged. (Thus, the
+output image covers at least the requested region, but may cover more.)
+The adjustment of the region dimensions may be optionally disabled by
+attaching an 'f' character ("force") to the width or height number.
The image can be losslessly cropped by giving the switch:
.TP
.B \-crop WxH+X+Y
Crop to a rectangular subarea of width W, height H starting at point X,Y.
.PP
+A complementary lossless-wipe option is provided to discard (gray out) data
+inside a given image region while losslessly preserving what is outside:
+.TP
+.B \-wipe WxH+X+Y
+Wipe (gray out) a rectangular subarea of width W, height H starting at point
+X,Y.
+.PP
Other not-strictly-lossless transformation switches are:
.TP
.B \-grayscale
@@ -198,16 +215,17 @@ such as comment blocks:
.TP
.B \-copy none
Copy no extra markers from source file. This setting suppresses all
-comments and other excess baggage present in the source file.
+comments and other metadata in the source file.
.TP
.B \-copy comments
Copy only comment markers. This setting copies comments from the source file,
-but discards any other inessential (for image display) data.
+but discards any other metadata.
.TP
.B \-copy all
-Copy all extra markers. This setting preserves miscellaneous markers
+Copy all extra markers. This setting preserves metadata
found in the source file, such as JFIF thumbnails, Exif data, and Photoshop
-settings. In some files these extra markers can be sizable.
+settings. In some files these extra markers can be sizable. Note that this
+option will copy thumbnails as-is; they will not be transformed.
.IP
The default behavior is
.BR "\-copy comments" .
diff --git a/3rdparty/libjpeg/jpegtran.c b/3rdparty/libjpeg/jpegtran.c
index 8cb3d807fbb..5269344e171 100644
--- a/3rdparty/libjpeg/jpegtran.c
+++ b/3rdparty/libjpeg/jpegtran.c
@@ -1,7 +1,7 @@
/*
* jpegtran.c
*
- * Copyright (C) 1995-2010, Thomas G. Lane, Guido Vollbeding.
+ * Copyright (C) 1995-2013, Thomas G. Lane, Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -66,8 +66,8 @@ usage (void)
fprintf(stderr, "Switches for modifying the image:\n");
#if TRANSFORMS_SUPPORTED
fprintf(stderr, " -crop WxH+X+Y Crop to a rectangular subarea\n");
- fprintf(stderr, " -grayscale Reduce to grayscale (omit color data)\n");
fprintf(stderr, " -flip [horizontal|vertical] Mirror image (left-right or top-bottom)\n");
+ fprintf(stderr, " -grayscale Reduce to grayscale (omit color data)\n");
fprintf(stderr, " -perfect Fail if there is non-transformable edge blocks\n");
fprintf(stderr, " -rotate [90|180|270] Rotate image (degrees clockwise)\n");
#endif
@@ -76,16 +76,17 @@ usage (void)
fprintf(stderr, " -transpose Transpose image\n");
fprintf(stderr, " -transverse Transverse transpose image\n");
fprintf(stderr, " -trim Drop non-transformable edge blocks\n");
+ fprintf(stderr, " -wipe WxH+X+Y Wipe (gray out) a rectangular subarea\n");
#endif
fprintf(stderr, "Switches for advanced users:\n");
+#ifdef C_ARITH_CODING_SUPPORTED
+ fprintf(stderr, " -arithmetic Use arithmetic coding\n");
+#endif
fprintf(stderr, " -restart N Set restart interval in rows, or in blocks with B\n");
fprintf(stderr, " -maxmemory N Maximum memory to use (in kbytes)\n");
fprintf(stderr, " -outfile name Specify name for output file\n");
fprintf(stderr, " -verbose or -debug Emit debug output\n");
fprintf(stderr, "Switches for wizards:\n");
-#ifdef C_ARITH_CODING_SUPPORTED
- fprintf(stderr, " -arithmetic Use arithmetic coding\n");
-#endif
#ifdef C_MULTISCAN_FILES_SUPPORTED
fprintf(stderr, " -scans file Create multi-scan JPEG per script file\n");
#endif
@@ -187,7 +188,8 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
#if TRANSFORMS_SUPPORTED
if (++argn >= argc) /* advance to next argument */
usage();
- if (! jtransform_parse_crop_spec(&transformoption, argv[argn])) {
+ if (transformoption.crop /* reject multiple crop/wipe requests */ ||
+ ! jtransform_parse_crop_spec(&transformoption, argv[argn])) {
fprintf(stderr, "%s: bogus -crop argument '%s'\n",
progname, argv[argn]);
exit(EXIT_FAILURE);
@@ -336,6 +338,21 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
/* Trim off any partial edge MCUs that the transform can't handle. */
transformoption.trim = TRUE;
+ } else if (keymatch(arg, "wipe", 1)) {
+#if TRANSFORMS_SUPPORTED
+ if (++argn >= argc) /* advance to next argument */
+ usage();
+ if (transformoption.crop /* reject multiple crop/wipe requests */ ||
+ ! jtransform_parse_crop_spec(&transformoption, argv[argn])) {
+ fprintf(stderr, "%s: bogus -wipe argument '%s'\n",
+ progname, argv[argn]);
+ exit(EXIT_FAILURE);
+ }
+ select_transform(JXFORM_WIPE);
+#else
+ select_transform(JXFORM_NONE); /* force an error */
+#endif
+
} else {
usage(); /* bogus switch */
}
@@ -467,7 +484,7 @@ main (int argc, char **argv)
/* Adjust default decompression parameters */
if (scaleoption != NULL)
- if (sscanf(scaleoption, "%d/%d",
+ if (sscanf(scaleoption, "%u/%u",
&srcinfo.scale_num, &srcinfo.scale_denom) < 1)
usage();
diff --git a/3rdparty/libjpeg/jquant1.c b/3rdparty/libjpeg/jquant1.c
index b2f96aa15d2..9d11f70669b 100644
--- a/3rdparty/libjpeg/jquant1.c
+++ b/3rdparty/libjpeg/jquant1.c
@@ -2,6 +2,7 @@
* jquant1.c
*
* Copyright (C) 1991-1996, Thomas G. Lane.
+ * Modified 2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -530,8 +531,8 @@ quantize_ord_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
for (row = 0; row < num_rows; row++) {
/* Initialize output values to 0 so can process components separately */
- jzero_far((void FAR *) output_buf[row],
- (size_t) (width * SIZEOF(JSAMPLE)));
+ FMEMZERO((void FAR *) output_buf[row],
+ (size_t) (width * SIZEOF(JSAMPLE)));
row_index = cquantize->row_index;
for (ci = 0; ci < nc; ci++) {
input_ptr = input_buf[row] + ci;
@@ -635,8 +636,8 @@ quantize_fs_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
for (row = 0; row < num_rows; row++) {
/* Initialize output values to 0 so can process components separately */
- jzero_far((void FAR *) output_buf[row],
- (size_t) (width * SIZEOF(JSAMPLE)));
+ FMEMZERO((void FAR *) output_buf[row],
+ (size_t) (width * SIZEOF(JSAMPLE)));
for (ci = 0; ci < nc; ci++) {
input_ptr = input_buf[row] + ci;
output_ptr = output_buf[row];
@@ -781,7 +782,7 @@ start_pass_1_quant (j_decompress_ptr cinfo, boolean is_pre_scan)
/* Initialize the propagated errors to zero. */
arraysize = (size_t) ((cinfo->output_width + 2) * SIZEOF(FSERROR));
for (i = 0; i < cinfo->out_color_components; i++)
- jzero_far((void FAR *) cquantize->fserrors[i], arraysize);
+ FMEMZERO((void FAR *) cquantize->fserrors[i], arraysize);
break;
default:
ERREXIT(cinfo, JERR_NOT_COMPILED);
diff --git a/3rdparty/libjpeg/jquant2.c b/3rdparty/libjpeg/jquant2.c
index af601e334b2..38fc2af7a55 100644
--- a/3rdparty/libjpeg/jquant2.c
+++ b/3rdparty/libjpeg/jquant2.c
@@ -2,6 +2,7 @@
* jquant2.c
*
* Copyright (C) 1991-1996, Thomas G. Lane.
+ * Modified 2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -1203,7 +1204,7 @@ start_pass_2_quant (j_decompress_ptr cinfo, boolean is_pre_scan)
cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large)
((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize);
/* Initialize the propagated errors to zero. */
- jzero_far((void FAR *) cquantize->fserrors, arraysize);
+ FMEMZERO((void FAR *) cquantize->fserrors, arraysize);
/* Make the error-limit table if we didn't already. */
if (cquantize->error_limiter == NULL)
init_error_limit(cinfo);
@@ -1214,8 +1215,8 @@ start_pass_2_quant (j_decompress_ptr cinfo, boolean is_pre_scan)
/* Zero the histogram or inverse color map, if necessary */
if (cquantize->needs_zeroed) {
for (i = 0; i < HIST_C0_ELEMS; i++) {
- jzero_far((void FAR *) histogram[i],
- HIST_C1_ELEMS*HIST_C2_ELEMS * SIZEOF(histcell));
+ FMEMZERO((void FAR *) histogram[i],
+ HIST_C1_ELEMS*HIST_C2_ELEMS * SIZEOF(histcell));
}
cquantize->needs_zeroed = FALSE;
}
diff --git a/3rdparty/libjpeg/jutils.c b/3rdparty/libjpeg/jutils.c
index 04351797cd7..5b16b6d03c0 100644
--- a/3rdparty/libjpeg/jutils.c
+++ b/3rdparty/libjpeg/jutils.c
@@ -2,7 +2,7 @@
* jutils.c
*
* Copyright (C) 1991-1996, Thomas G. Lane.
- * Modified 2009 by Guido Vollbeding.
+ * Modified 2009-2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -148,13 +148,27 @@ jround_up (long a, long b)
* is not all that great, because these routines aren't very heavily used.)
*/
-#ifndef NEED_FAR_POINTERS /* normal case, same as regular macros */
+#ifndef NEED_FAR_POINTERS /* normal case, same as regular macro */
#define FMEMCOPY(dest,src,size) MEMCOPY(dest,src,size)
-#define FMEMZERO(target,size) MEMZERO(target,size)
#else /* 80x86 case, define if we can */
#ifdef USE_FMEM
#define FMEMCOPY(dest,src,size) _fmemcpy((void FAR *)(dest), (const void FAR *)(src), (size_t)(size))
-#define FMEMZERO(target,size) _fmemset((void FAR *)(target), 0, (size_t)(size))
+#else
+/* This function is for use by the FMEMZERO macro defined in jpegint.h.
+ * Do not call this function directly, use the FMEMZERO macro instead.
+ */
+GLOBAL(void)
+jzero_far (void FAR * target, size_t bytestozero)
+/* Zero out a chunk of FAR memory. */
+/* This might be sample-array data, block-array data, or alloc_large data. */
+{
+ register char FAR * ptr = (char FAR *) target;
+ register size_t count;
+
+ for (count = bytestozero; count > 0; count--) {
+ *ptr++ = 0;
+ }
+}
#endif
#endif
@@ -211,21 +225,3 @@ jcopy_block_row (JBLOCKROW input_row, JBLOCKROW output_row,
}
#endif
}
-
-
-GLOBAL(void)
-jzero_far (void FAR * target, size_t bytestozero)
-/* Zero out a chunk of FAR memory. */
-/* This might be sample-array data, block-array data, or alloc_large data. */
-{
-#ifdef FMEMZERO
- FMEMZERO(target, bytestozero);
-#else
- register char FAR * ptr = (char FAR *) target;
- register size_t count;
-
- for (count = bytestozero; count > 0; count--) {
- *ptr++ = 0;
- }
-#endif
-}
diff --git a/3rdparty/libjpeg/jversion.h b/3rdparty/libjpeg/jversion.h
index e868538c884..0740b317d77 100644
--- a/3rdparty/libjpeg/jversion.h
+++ b/3rdparty/libjpeg/jversion.h
@@ -1,7 +1,7 @@
/*
* jversion.h
*
- * Copyright (C) 1991-2011, Thomas G. Lane, Guido Vollbeding.
+ * Copyright (C) 1991-2016, Thomas G. Lane, Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -9,6 +9,6 @@
*/
-#define JVERSION "8c 16-Jan-2011"
+#define JVERSION "9b 17-Jan-2016"
-#define JCOPYRIGHT "Copyright (C) 2011, Thomas G. Lane, Guido Vollbeding"
+#define JCOPYRIGHT "Copyright (C) 2016, Thomas G. Lane, Guido Vollbeding"
diff --git a/3rdparty/libjpeg/libjpeg.map b/3rdparty/libjpeg/libjpeg.map
index ac77dca781f..fa70b1f1213 100644
--- a/3rdparty/libjpeg/libjpeg.map
+++ b/3rdparty/libjpeg/libjpeg.map
@@ -1,4 +1,4 @@
-LIBJPEG_8.0 {
+LIBJPEG_9.0 {
global:
*;
};
diff --git a/3rdparty/libjpeg/libjpeg.txt b/3rdparty/libjpeg/libjpeg.txt
index 2d98e22fc41..4243c246333 100644
--- a/3rdparty/libjpeg/libjpeg.txt
+++ b/3rdparty/libjpeg/libjpeg.txt
@@ -1,6 +1,6 @@
USING THE IJG JPEG LIBRARY
-Copyright (C) 1994-2010, Thomas G. Lane, Guido Vollbeding.
+Copyright (C) 1994-2013, Thomas G. Lane, Guido Vollbeding.
This file is part of the Independent JPEG Group's software.
For conditions of distribution and use, see the accompanying README file.
@@ -95,8 +95,8 @@ use.) Unsupported ISO options include:
* Lossless JPEG
* DNL marker
* Nonintegral subsampling ratios
-We support both 8- and 12-bit data precision, but this is a compile-time
-choice rather than a run-time choice; hence it is difficult to use both
+We support 8-bit to 12-bit data precision, but this is a compile-time choice
+rather than a run-time choice; hence it is difficult to use different
precisions in a single application.
By itself, the library handles only interchange JPEG datastreams --- in
@@ -225,7 +225,7 @@ For best results, source data values should have the precision specified by
BITS_IN_JSAMPLE (normally 8 bits). For instance, if you choose to compress
data that's only 6 bits/channel, you should left-justify each value in a
byte before passing it to the compressor. If you need to compress data
-that has more than 8 bits/channel, compile with BITS_IN_JSAMPLE = 12.
+that has more than 8 bits/channel, compile with BITS_IN_JSAMPLE = 9 to 12.
(See "Library compile-time options", later.)
@@ -876,6 +876,10 @@ jpeg_simple_progression (j_compress_ptr cinfo)
Compression parameters (cinfo fields) include:
+boolean arith_code
+ If TRUE, use arithmetic coding.
+ If FALSE, use Huffman coding.
+
int block_size
Set DCT block size. All N from 1 to 16 are possible.
Default is 8 (baseline format).
@@ -916,7 +920,16 @@ J_COLOR_SPACE jpeg_color_space
int num_components
The JPEG color space and corresponding number of components; see
"Special color spaces", below, for more info. We recommend using
- jpeg_set_color_space() if you want to change these.
+ jpeg_set_colorspace() if you want to change these.
+
+J_COLOR_TRANSFORM color_transform
+ Internal color transform identifier, writes LSE marker if nonzero
+ (requires decoder with inverse color transform support, introduced
+ with IJG JPEG 9).
+ Two values are currently possible: JCT_NONE and JCT_SUBTRACT_GREEN.
+ Set this value for lossless RGB application *before* calling
+ jpeg_set_colorspace(), because entropy table assignment in
+ jpeg_set_colorspace() depends on color_transform.
boolean optimize_coding
TRUE causes the compressor to compute optimal Huffman coding tables
@@ -1260,9 +1273,10 @@ Special color spaces
The JPEG standard itself is "color blind" and doesn't specify any particular
color space. It is customary to convert color data to a luminance/chrominance
color space before compressing, since this permits greater compression. The
-existing de-facto JPEG file format standards specify YCbCr or grayscale data
-(JFIF), or grayscale, RGB, YCbCr, CMYK, or YCCK (Adobe). For special
-applications such as multispectral images, other color spaces can be used,
+existing JPEG file interchange format standards specify YCbCr or GRAYSCALE
+data (JFIF version 1), GRAYSCALE, RGB, YCbCr, CMYK, or YCCK (Adobe), or BG_RGB
+or BG_YCC (big gamut color spaces, JFIF version 2). For special applications
+such as multispectral images, other color spaces can be used,
but it must be understood that such files will be unportable.
The JPEG library can handle the most common colorspace conversions (namely
@@ -1279,22 +1293,25 @@ jpeg_set_colorspace(). Of course you must select a supported transformation.
jccolor.c currently supports the following transformations:
RGB => YCbCr
RGB => GRAYSCALE
+ RGB => BG_YCC
YCbCr => GRAYSCALE
+ YCbCr => BG_YCC
CMYK => YCCK
plus the null transforms: GRAYSCALE => GRAYSCALE, RGB => RGB,
-YCbCr => YCbCr, CMYK => CMYK, YCCK => YCCK, and UNKNOWN => UNKNOWN.
-
-The de-facto file format standards (JFIF and Adobe) specify APPn markers that
-indicate the color space of the JPEG file. It is important to ensure that
-these are written correctly, or omitted if the JPEG file's color space is not
-one of the ones supported by the de-facto standards. jpeg_set_colorspace()
-will set the compression parameters to include or omit the APPn markers
-properly, so long as it is told the truth about the JPEG color space.
-For example, if you are writing some random 3-component color space without
-conversion, don't try to fake out the library by setting in_color_space and
-jpeg_color_space to JCS_YCbCr; use JCS_UNKNOWN. You may want to write an
-APPn marker of your own devising to identify the colorspace --- see "Special
-markers", below.
+BG_RGB => BG_RGB, YCbCr => YCbCr, BG_YCC => BG_YCC, CMYK => CMYK,
+YCCK => YCCK, and UNKNOWN => UNKNOWN.
+
+The file interchange format standards (JFIF and Adobe) specify APPn markers
+that indicate the color space of the JPEG file. It is important to ensure
+that these are written correctly, or omitted if the JPEG file's color space
+is not one of the ones supported by the interchange standards.
+jpeg_set_colorspace() will set the compression parameters to include or omit
+the APPn markers properly, so long as it is told the truth about the JPEG
+color space. For example, if you are writing some random 3-component color
+space without conversion, don't try to fake out the library by setting
+in_color_space and jpeg_color_space to JCS_YCbCr; use JCS_UNKNOWN.
+You may want to write an APPn marker of your own devising to identify
+the colorspace --- see "Special markers", below.
When told that the color space is UNKNOWN, the library will default to using
luminance-quality compression parameters for all color components. You may
@@ -1310,8 +1327,11 @@ jpeg_read_header's guess by setting jpeg_color_space. jpeg_read_header also
selects a default output color space based on (its guess of) jpeg_color_space;
set out_color_space to override this. Again, you must select a supported
transformation. jdcolor.c currently supports
- YCbCr => GRAYSCALE
YCbCr => RGB
+ YCbCr => GRAYSCALE
+ BG_YCC => RGB
+ BG_YCC => GRAYSCALE
+ RGB => GRAYSCALE
GRAYSCALE => RGB
YCCK => CMYK
as well as the null transforms. (Since GRAYSCALE=>RGB is provided, an
@@ -2571,10 +2591,10 @@ different sizes. If the image dimensions are not a multiple of the MCU size,
you must also pad the data correctly (usually, this is done by replicating
the last column and/or row). The data must be padded to a multiple of a DCT
block in each component: that is, each downsampled row must contain a
-multiple of 8 valid samples, and there must be a multiple of 8 sample rows
-for each component. (For applications such as conversion of digital TV
-images, the standard image size is usually a multiple of the DCT block size,
-so that no padding need actually be done.)
+multiple of block_size valid samples, and there must be a multiple of
+block_size sample rows for each component. (For applications such as
+conversion of digital TV images, the standard image size is usually a
+multiple of the DCT block size, so that no padding need actually be done.)
The procedure for compression of raw data is basically the same as normal
compression, except that you call jpeg_write_raw_data() in place of
@@ -2600,22 +2620,22 @@ The scanlines count passed to and returned from jpeg_write_raw_data is
measured in terms of the component with the largest v_samp_factor.
jpeg_write_raw_data() processes one MCU row per call, which is to say
-v_samp_factor*DCTSIZE sample rows of each component. The passed num_lines
-value must be at least max_v_samp_factor*DCTSIZE, and the return value will
-be exactly that amount (or possibly some multiple of that amount, in future
-library versions). This is true even on the last call at the bottom of the
-image; don't forget to pad your data as necessary.
+v_samp_factor*block_size sample rows of each component. The passed num_lines
+value must be at least max_v_samp_factor*block_size, and the return value
+will be exactly that amount (or possibly some multiple of that amount, in
+future library versions). This is true even on the last call at the bottom
+of the image; don't forget to pad your data as necessary.
The required dimensions of the supplied data can be computed for each
component as
- cinfo->comp_info[i].width_in_blocks*DCTSIZE samples per row
- cinfo->comp_info[i].height_in_blocks*DCTSIZE rows in image
+ cinfo->comp_info[i].width_in_blocks*block_size samples per row
+ cinfo->comp_info[i].height_in_blocks*block_size rows in image
after jpeg_start_compress() has initialized those fields. If the valid data
is smaller than this, it must be padded appropriately. For some sampling
factors and image sizes, additional dummy DCT blocks are inserted to make
the image a multiple of the MCU dimensions. The library creates such dummy
blocks itself; it does not read them from your supplied data. Therefore you
-need never pad by more than DCTSIZE samples. An example may help here.
+need never pad by more than block_size samples. An example may help here.
Assume 2h2v downsampling of YCbCr data, that is
cinfo->comp_info[0].h_samp_factor = 2 for Y
cinfo->comp_info[0].v_samp_factor = 2
@@ -2657,8 +2677,8 @@ Then call jpeg_read_raw_data() in place of jpeg_read_scanlines(). The
decompression process is otherwise the same as usual.
jpeg_read_raw_data() returns one MCU row per call, and thus you must pass a
-buffer of at least max_v_samp_factor*DCTSIZE scanlines (scanline counting is
-the same as for raw-data compression). The buffer you pass must be large
+buffer of at least max_v_samp_factor*block_size scanlines (scanline counting
+is the same as for raw-data compression). The buffer you pass must be large
enough to hold the actual data plus padding to DCT-block boundaries. As with
compression, any entirely dummy DCT blocks are not processed so you need not
allocate space for them, but the total scanline count includes them. The
@@ -2914,10 +2934,10 @@ This does not count any memory allocated by the application, such as a
buffer to hold the final output image.
The above figures are valid for 8-bit JPEG data precision and a machine with
-32-bit ints. For 12-bit JPEG data, double the size of the strip buffers and
-quantization pixel buffer. The "fixed-size" data will be somewhat smaller
-with 16-bit ints, larger with 64-bit ints. Also, CMYK or other unusual
-color spaces will require different amounts of space.
+32-bit ints. For 9-bit to 12-bit JPEG data, double the size of the strip
+buffers and quantization pixel buffer. The "fixed-size" data will be
+somewhat smaller with 16-bit ints, larger with 64-bit ints. Also, CMYK
+or other unusual color spaces will require different amounts of space.
The full-image coefficient and pixel buffers, if needed at all, do not
have to be fully RAM resident; you can have the library use temporary
@@ -2939,27 +2959,34 @@ Library compile-time options
A number of compile-time options are available by modifying jmorecfg.h.
-The JPEG standard provides for both the baseline 8-bit DCT process and
-a 12-bit DCT process. The IJG code supports 12-bit lossy JPEG if you define
-BITS_IN_JSAMPLE as 12 rather than 8. Note that this causes JSAMPLE to be
-larger than a char, so it affects the surrounding application's image data.
-The sample applications cjpeg and djpeg can support 12-bit mode only for PPM
-and GIF file formats; you must disable the other file formats to compile a
-12-bit cjpeg or djpeg. (install.txt has more information about that.)
-At present, a 12-bit library can handle *only* 12-bit images, not both
-precisions. (If you need to include both 8- and 12-bit libraries in a single
-application, you could probably do it by defining NEED_SHORT_EXTERNAL_NAMES
-for just one of the copies. You'd have to access the 8-bit and 12-bit copies
-from separate application source files. This is untested ... if you try it,
-we'd like to hear whether it works!)
-
-Note that a 12-bit library always compresses in Huffman optimization mode,
-in order to generate valid Huffman tables. This is necessary because our
-default Huffman tables only cover 8-bit data. If you need to output 12-bit
-files in one pass, you'll have to supply suitable default Huffman tables.
-You may also want to supply your own DCT quantization tables; the existing
-quality-scaling code has been developed for 8-bit use, and probably doesn't
-generate especially good tables for 12-bit.
+The IJG code currently supports 8-bit to 12-bit sample data precision by
+defining BITS_IN_JSAMPLE as 8, 9, 10, 11, or 12.
+Note that a value larger than 8 causes JSAMPLE to be larger than a char,
+so it affects the surrounding application's image data.
+The sample applications cjpeg and djpeg can support deeper than 8-bit data
+only for PPM and GIF file formats; you must disable the other file formats
+to compile a 9-bit to 12-bit cjpeg or djpeg. (install.txt has more
+information about that.)
+Run-time selection and conversion of data precision are currently not
+supported and may be added later.
+Exception: The transcoding part (jpegtran) supports all settings in a
+single instance, since it operates on the level of DCT coefficients and
+not sample values.
+(If you need to include an 8-bit library and a 9-bit to 12-bit library for
+compression or decompression in a single application, you could probably do
+it by defining NEED_SHORT_EXTERNAL_NAMES for just one of the copies. You'd
+have to access the 8-bit and the 9-bit to 12-bit copies from separate
+application source files. This is untested ... if you try it, we'd like to
+hear whether it works!)
+
+Note that the standard Huffman tables are only valid for 8-bit data precision.
+If you selected more than 8-bit data precision, cjpeg uses arithmetic coding
+by default. The Huffman encoder normally uses entropy optimization to
+compute usable tables for higher precision. Otherwise, you'll have to
+supply different default Huffman tables. You may also want to supply your
+own DCT quantization tables; the existing quality-scaling code has been
+developed for 8-bit use, and probably doesn't generate especially good tables
+for 9-bit to 12-bit.
The maximum number of components (color channels) in the image is determined
by MAX_COMPONENTS. The JPEG standard allows up to 255 components, but we
diff --git a/3rdparty/libjpeg/ltmain.sh b/3rdparty/libjpeg/ltmain.sh
index 3061e3c5a2f..0f0a2da3f9d 100644
--- a/3rdparty/libjpeg/ltmain.sh
+++ b/3rdparty/libjpeg/ltmain.sh
@@ -1,9 +1,12 @@
+#! /bin/sh
+## DO NOT EDIT - This file generated from ./build-aux/ltmain.in
+## by inline-source v2014-01-03.01
-# libtool (GNU libtool) 2.4
+# libtool (GNU libtool) 2.4.6
+# Provide generalized library-building support services.
# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
-# 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+# Copyright (C) 1996-2015 Free Software Foundation, Inc.
# This is free software; see the source for copying conditions. There is NO
# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
@@ -23,885 +26,2112 @@
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING. If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html,
-# or obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
-# Usage: $progname [OPTION]... [MODE-ARG]...
-#
-# Provide generalized library-building support services.
-#
-# --config show all configuration variables
-# --debug enable verbose shell tracing
-# -n, --dry-run display commands without modifying any files
-# --features display basic configuration information and exit
-# --mode=MODE use operation mode MODE
-# --preserve-dup-deps don't remove duplicate dependency libraries
-# --quiet, --silent don't print informational messages
-# --no-quiet, --no-silent
-# print informational messages (default)
-# --tag=TAG use configuration variables from tag TAG
-# -v, --verbose print more informational messages than default
-# --no-verbose don't print the extra informational messages
-# --version print version information
-# -h, --help, --help-all print short, long, or detailed help message
-#
-# MODE must be one of the following:
-#
-# clean remove files from the build directory
-# compile compile a source file into a libtool object
-# execute automatically set library path, then run a program
-# finish complete the installation of libtool libraries
-# install install libraries or executables
-# link create a library or an executable
-# uninstall remove libraries from an installed directory
-#
-# MODE-ARGS vary depending on the MODE. When passed as first option,
-# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
-# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
-#
-# When reporting a bug, please describe a test case to reproduce it and
-# include the following information:
-#
-# host-triplet: $host
-# shell: $SHELL
-# compiler: $LTCC
-# compiler flags: $LTCFLAGS
-# linker: $LD (gnu? $with_gnu_ld)
-# $progname: (GNU libtool) 2.4
-# automake: $automake_version
-# autoconf: $autoconf_version
-#
-# Report bugs to <bug-libtool@gnu.org>.
-# GNU libtool home page: <http://www.gnu.org/software/libtool/>.
-# General help using GNU software: <http://www.gnu.org/gethelp/>.
PROGRAM=libtool
PACKAGE=libtool
-VERSION=2.4
-TIMESTAMP=""
-package_revision=1.3293
+VERSION=2.4.6
+package_revision=2.4.6
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# Run './libtool --help' for help with using this script from the
+# command line.
+
+
+## ------------------------------- ##
+## User overridable command paths. ##
+## ------------------------------- ##
+
+# After configure completes, it has a better idea of some of the
+# shell tools we need than the defaults used by the functions shared
+# with bootstrap, so set those here where they can still be over-
+# ridden by the user, but otherwise take precedence.
+
+: ${AUTOCONF="autoconf"}
+: ${AUTOMAKE="automake"}
+
+
+## -------------------------- ##
+## Source external libraries. ##
+## -------------------------- ##
+
+# Much of our low-level functionality needs to be sourced from external
+# libraries, which are installed to $pkgauxdir.
+
+# Set a version string for this script.
+scriptversion=2015-01-20.17; # UTC
+
+# General shell script boiler plate, and helper functions.
+# Written by Gary V. Vaughan, 2004
+
+# Copyright (C) 2004-2015 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions. There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# As a special exception to the GNU General Public License, if you distribute
+# this file as part of a program or library that is built using GNU Libtool,
+# you may include this file under the same distribution terms that you use
+# for the rest of that program.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Please report bugs or propose patches to gary@gnu.org.
+
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# Evaluate this file near the top of your script to gain access to
+# the functions and variables defined here:
+#
+# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh
+#
+# If you need to override any of the default environment variable
+# settings, do that before evaluating this file.
+
+
+## -------------------- ##
+## Shell normalisation. ##
+## -------------------- ##
+
+# Some shells need a little help to be as Bourne compatible as possible.
+# Before doing anything else, make sure all that help has been provided!
+
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
emulate sh
NULLCMD=:
- # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
else
- case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+ case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac
fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
- eval 'cat <<_LTECHO_EOF
-$1
-_LTECHO_EOF'
-}
-
-# NLS nuisances: We save the old values to restore during execute mode.
-lt_user_locale=
-lt_safe_locale=
-for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+# NLS nuisances: We save the old values in case they are required later.
+_G_user_locale=
+_G_safe_locale=
+for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
do
- eval "if test \"\${$lt_var+set}\" = set; then
- save_$lt_var=\$$lt_var
- $lt_var=C
- export $lt_var
- lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
- lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
+ eval "if test set = \"\${$_G_var+set}\"; then
+ save_$_G_var=\$$_G_var
+ $_G_var=C
+ export $_G_var
+ _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\"
+ _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\"
fi"
done
-LC_ALL=C
-LANGUAGE=C
-export LANGUAGE LC_ALL
-$lt_unset CDPATH
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Make sure IFS has a sensible default
+sp=' '
+nl='
+'
+IFS="$sp $nl"
+
+# There are apparently some retarded systems that use ';' as a PATH separator!
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
-# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
-# is ksh but when the shell is invoked as "sh" and the current value of
-# the _XPG environment variable is not equal to 1 (one), the special
-# positional parameter $0, within a function call, is the name of the
-# function.
-progpath="$0"
+## ------------------------- ##
+## Locate command utilities. ##
+## ------------------------- ##
+# func_executable_p FILE
+# ----------------------
+# Check that FILE is an executable regular file.
+func_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+}
+
+
+# func_path_progs PROGS_LIST CHECK_FUNC [PATH]
+# --------------------------------------------
+# Search for either a program that responds to --version with output
+# containing "GNU", or else returned by CHECK_FUNC otherwise, by
+# trying all the directories in PATH with each of the elements of
+# PROGS_LIST.
+#
+# CHECK_FUNC should accept the path to a candidate program, and
+# set $func_check_prog_result if it truncates its output less than
+# $_G_path_prog_max characters.
+func_path_progs ()
+{
+ _G_progs_list=$1
+ _G_check_func=$2
+ _G_PATH=${3-"$PATH"}
+
+ _G_path_prog_max=0
+ _G_path_prog_found=false
+ _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:}
+ for _G_dir in $_G_PATH; do
+ IFS=$_G_save_IFS
+ test -z "$_G_dir" && _G_dir=.
+ for _G_prog_name in $_G_progs_list; do
+ for _exeext in '' .EXE; do
+ _G_path_prog=$_G_dir/$_G_prog_name$_exeext
+ func_executable_p "$_G_path_prog" || continue
+ case `"$_G_path_prog" --version 2>&1` in
+ *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;;
+ *) $_G_check_func $_G_path_prog
+ func_path_progs_result=$func_check_prog_result
+ ;;
+ esac
+ $_G_path_prog_found && break 3
+ done
+ done
+ done
+ IFS=$_G_save_IFS
+ test -z "$func_path_progs_result" && {
+ echo "no acceptable sed could be found in \$PATH" >&2
+ exit 1
+ }
+}
+
+
+# We want to be able to use the functions in this file before configure
+# has figured out where the best binaries are kept, which means we have
+# to search for them ourselves - except when the results are already set
+# where we skip the searches.
+
+# Unless the user overrides by setting SED, search the path for either GNU
+# sed, or the sed that truncates its output the least.
+test -z "$SED" && {
+ _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+ for _G_i in 1 2 3 4 5 6 7; do
+ _G_sed_script=$_G_sed_script$nl$_G_sed_script
+ done
+ echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed
+ _G_sed_script=
+
+ func_check_prog_sed ()
+ {
+ _G_path_prog=$1
+
+ _G_count=0
+ printf 0123456789 >conftest.in
+ while :
+ do
+ cat conftest.in conftest.in >conftest.tmp
+ mv conftest.tmp conftest.in
+ cp conftest.in conftest.nl
+ echo '' >> conftest.nl
+ "$_G_path_prog" -f conftest.sed <conftest.nl >conftest.out 2>/dev/null || break
+ diff conftest.out conftest.nl >/dev/null 2>&1 || break
+ _G_count=`expr $_G_count + 1`
+ if test "$_G_count" -gt "$_G_path_prog_max"; then
+ # Best one so far, save it but keep looking for a better one
+ func_check_prog_result=$_G_path_prog
+ _G_path_prog_max=$_G_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test 10 -lt "$_G_count" && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out
+ }
+
+ func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin
+ rm -f conftest.sed
+ SED=$func_path_progs_result
+}
+
+
+# Unless the user overrides by setting GREP, search the path for either GNU
+# grep, or the grep that truncates its output the least.
+test -z "$GREP" && {
+ func_check_prog_grep ()
+ {
+ _G_path_prog=$1
+
+ _G_count=0
+ _G_path_prog_max=0
+ printf 0123456789 >conftest.in
+ while :
+ do
+ cat conftest.in conftest.in >conftest.tmp
+ mv conftest.tmp conftest.in
+ cp conftest.in conftest.nl
+ echo 'GREP' >> conftest.nl
+ "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' <conftest.nl >conftest.out 2>/dev/null || break
+ diff conftest.out conftest.nl >/dev/null 2>&1 || break
+ _G_count=`expr $_G_count + 1`
+ if test "$_G_count" -gt "$_G_path_prog_max"; then
+ # Best one so far, save it but keep looking for a better one
+ func_check_prog_result=$_G_path_prog
+ _G_path_prog_max=$_G_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test 10 -lt "$_G_count" && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out
+ }
+
+ func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin
+ GREP=$func_path_progs_result
+}
+
+
+## ------------------------------- ##
+## User overridable command paths. ##
+## ------------------------------- ##
+
+# All uppercase variable names are used for environment variables. These
+# variables can be overridden by the user before calling a script that
+# uses them if a suitable command of that name is not already available
+# in the command search PATH.
+
: ${CP="cp -f"}
-test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'}
-: ${EGREP="grep -E"}
-: ${FGREP="grep -F"}
-: ${GREP="grep"}
+: ${ECHO="printf %s\n"}
+: ${EGREP="$GREP -E"}
+: ${FGREP="$GREP -F"}
: ${LN_S="ln -s"}
: ${MAKE="make"}
: ${MKDIR="mkdir"}
: ${MV="mv -f"}
: ${RM="rm -f"}
-: ${SED="sed"}
: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
-: ${Xsed="$SED -e 1s/^X//"}
-# Global variables:
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing.
-EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake.
-
-exit_status=$EXIT_SUCCESS
-# Make sure IFS has a sensible default
-lt_nl='
-'
-IFS=" $lt_nl"
+## -------------------- ##
+## Useful sed snippets. ##
+## -------------------- ##
-dirname="s,/[^/]*$,,"
-basename="s,^.*/,,"
+sed_dirname='s|/[^/]*$||'
+sed_basename='s|^.*/||'
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE. If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
- func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
- if test "X$func_dirname_result" = "X${1}"; then
- func_dirname_result="${3}"
- else
- func_dirname_result="$func_dirname_result${2}"
- fi
-} # func_dirname may be replaced by extended shell implementation
-
-
-# func_basename file
-func_basename ()
-{
- func_basename_result=`$ECHO "${1}" | $SED "$basename"`
-} # func_basename may be replaced by extended shell implementation
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s|\([`"$\\]\)|\\\1|g'
+# Same as above, but do not quote variable references.
+sed_double_quote_subst='s/\(["`\\]\)/\\\1/g'
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-# dirname: Compute the dirname of FILE. If nonempty,
-# add APPEND to the result, otherwise set result
-# to NONDIR_REPLACEMENT.
-# value returned in "$func_dirname_result"
-# basename: Compute filename of FILE.
-# value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
- # Extract subdirectory from the argument.
- func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"`
- if test "X$func_dirname_result" = "X${1}"; then
- func_dirname_result="${3}"
- else
- func_dirname_result="$func_dirname_result${2}"
- fi
- func_basename_result=`$ECHO "${1}" | $SED -e "$basename"`
-} # func_dirname_and_basename may be replaced by extended shell implementation
+# Sed substitution that turns a string into a regex matching for the
+# string literally.
+sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g'
+# Sed substitution that converts a w32 file name or path
+# that contains forward slashes, into one that contains
+# (escaped) backslashes. A very naive implementation.
+sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+
+# Re-'\' parameter expansions in output of sed_double_quote_subst that
+# were '\'-ed in input to the same. If an odd number of '\' preceded a
+# '$' in input to sed_double_quote_subst, that '$' was protected from
+# expansion. Since each input '\' is now two '\'s, look for any number
+# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'.
+_G_bs='\\'
+_G_bs2='\\\\'
+_G_bs4='\\\\\\\\'
+_G_dollar='\$'
+sed_double_backslash="\
+ s/$_G_bs4/&\\
+/g
+ s/^$_G_bs2$_G_dollar/$_G_bs&/
+ s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g
+ s/\n//g"
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
- case ${2} in
- .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
- *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
- esac
-} # func_stripname may be replaced by extended shell implementation
+## ----------------- ##
+## Global variables. ##
+## ----------------- ##
-# These SED scripts presuppose an absolute path with a trailing slash.
-pathcar='s,^/\([^/]*\).*$,\1,'
-pathcdr='s,^/[^/]*,,'
-removedotparts=':dotsl
- s@/\./@/@g
- t dotsl
- s,/\.$,/,'
-collapseslashes='s@/\{1,\}@/@g'
-finalslash='s,/*$,/,'
+# Except for the global variables explicitly listed below, the following
+# functions in the '^func_' namespace, and the '^require_' namespace
+# variables initialised in the 'Resource management' section, sourcing
+# this file will not pollute your global namespace with anything
+# else. There's no portable way to scope variables in Bourne shell
+# though, so actually running these functions will sometimes place
+# results into a variable named after the function, and often use
+# temporary variables in the '^_G_' namespace. If you are careful to
+# avoid using those namespaces casually in your sourcing script, things
+# should continue to work as you expect. And, of course, you can freely
+# overwrite any of the functions or variables defined here before
+# calling anything to customize them.
-# func_normal_abspath PATH
-# Remove doubled-up and trailing slashes, "." path components,
-# and cancel out any ".." path components in PATH after making
-# it an absolute path.
-# value returned in "$func_normal_abspath_result"
-func_normal_abspath ()
-{
- # Start from root dir and reassemble the path.
- func_normal_abspath_result=
- func_normal_abspath_tpath=$1
- func_normal_abspath_altnamespace=
- case $func_normal_abspath_tpath in
- "")
- # Empty path, that just means $cwd.
- func_stripname '' '/' "`pwd`"
- func_normal_abspath_result=$func_stripname_result
- return
- ;;
- # The next three entries are used to spot a run of precisely
- # two leading slashes without using negated character classes;
- # we take advantage of case's first-match behaviour.
- ///*)
- # Unusual form of absolute path, do nothing.
- ;;
- //*)
- # Not necessarily an ordinary path; POSIX reserves leading '//'
- # and for example Cygwin uses it to access remote file shares
- # over CIFS/SMB, so we conserve a leading double slash if found.
- func_normal_abspath_altnamespace=/
- ;;
- /*)
- # Absolute path, do nothing.
- ;;
- *)
- # Relative path, prepend $cwd.
- func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
- ;;
- esac
- # Cancel out all the simple stuff to save iterations. We also want
- # the path to end with a slash for ease of parsing, so make sure
- # there is one (and only one) here.
- func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
- -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
- while :; do
- # Processed it all yet?
- if test "$func_normal_abspath_tpath" = / ; then
- # If we ascended to the root using ".." the result may be empty now.
- if test -z "$func_normal_abspath_result" ; then
- func_normal_abspath_result=/
- fi
- break
- fi
- func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
- -e "$pathcar"`
- func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
- -e "$pathcdr"`
- # Figure out what to do with it
- case $func_normal_abspath_tcomponent in
- "")
- # Trailing empty path component, ignore it.
- ;;
- ..)
- # Parent dir; strip last assembled component from result.
- func_dirname "$func_normal_abspath_result"
- func_normal_abspath_result=$func_dirname_result
- ;;
- *)
- # Actual path component, append it.
- func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
- ;;
- esac
- done
- # Restore leading double-slash if one was found on entry.
- func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
-}
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing.
+EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake.
-# func_relative_path SRCDIR DSTDIR
-# generates a relative path from SRCDIR to DSTDIR, with a trailing
-# slash if non-empty, suitable for immediately appending a filename
-# without needing to append a separator.
-# value returned in "$func_relative_path_result"
-func_relative_path ()
-{
- func_relative_path_result=
- func_normal_abspath "$1"
- func_relative_path_tlibdir=$func_normal_abspath_result
- func_normal_abspath "$2"
- func_relative_path_tbindir=$func_normal_abspath_result
-
- # Ascend the tree starting from libdir
- while :; do
- # check if we have found a prefix of bindir
- case $func_relative_path_tbindir in
- $func_relative_path_tlibdir)
- # found an exact match
- func_relative_path_tcancelled=
- break
- ;;
- $func_relative_path_tlibdir*)
- # found a matching prefix
- func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
- func_relative_path_tcancelled=$func_stripname_result
- if test -z "$func_relative_path_result"; then
- func_relative_path_result=.
- fi
- break
- ;;
- *)
- func_dirname $func_relative_path_tlibdir
- func_relative_path_tlibdir=${func_dirname_result}
- if test "x$func_relative_path_tlibdir" = x ; then
- # Have to descend all the way to the root!
- func_relative_path_result=../$func_relative_path_result
- func_relative_path_tcancelled=$func_relative_path_tbindir
- break
- fi
- func_relative_path_result=../$func_relative_path_result
- ;;
- esac
- done
+# Allow overriding, eg assuming that you follow the convention of
+# putting '$debug_cmd' at the start of all your functions, you can get
+# bash to show function call trace with:
+#
+# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name
+debug_cmd=${debug_cmd-":"}
+exit_cmd=:
- # Now calculate path; take care to avoid doubling-up slashes.
- func_stripname '' '/' "$func_relative_path_result"
- func_relative_path_result=$func_stripname_result
- func_stripname '/' '/' "$func_relative_path_tcancelled"
- if test "x$func_stripname_result" != x ; then
- func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
- fi
+# By convention, finish your script with:
+#
+# exit $exit_status
+#
+# so that you can set exit_status to non-zero if you want to indicate
+# something went wrong during execution without actually bailing out at
+# the point of failure.
+exit_status=$EXIT_SUCCESS
- # Normalisation. If bindir is libdir, return empty string,
- # else relative path ending with a slash; either way, target
- # file name can be directly appended.
- if test ! -z "$func_relative_path_result"; then
- func_stripname './' '' "$func_relative_path_result/"
- func_relative_path_result=$func_stripname_result
- fi
-}
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath=$0
-# The name of this program:
-func_dirname_and_basename "$progpath"
-progname=$func_basename_result
+# The name of this program.
+progname=`$ECHO "$progpath" |$SED "$sed_basename"`
-# Make sure we have an absolute path for reexecution:
+# Make sure we have an absolute progpath for reexecution:
case $progpath in
[\\/]*|[A-Za-z]:\\*) ;;
*[\\/]*)
- progdir=$func_dirname_result
+ progdir=`$ECHO "$progpath" |$SED "$sed_dirname"`
progdir=`cd "$progdir" && pwd`
- progpath="$progdir/$progname"
+ progpath=$progdir/$progname
;;
*)
- save_IFS="$IFS"
- IFS=:
+ _G_IFS=$IFS
+ IFS=${PATH_SEPARATOR-:}
for progdir in $PATH; do
- IFS="$save_IFS"
+ IFS=$_G_IFS
test -x "$progdir/$progname" && break
done
- IFS="$save_IFS"
+ IFS=$_G_IFS
test -n "$progdir" || progdir=`pwd`
- progpath="$progdir/$progname"
+ progpath=$progdir/$progname
;;
esac
-# Sed substitution that helps us do robust quoting. It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed="${SED}"' -e 1s/^X//'
-sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
+## ----------------- ##
+## Standard options. ##
+## ----------------- ##
-# Sed substitution that turns a string into a regex matching for the
-# string literally.
-sed_make_literal_regex='s,[].[^$\\*\/],\\&,g'
-
-# Sed substitution that converts a w32 file name or path
-# which contains forward slashes, into one that contains
-# (escaped) backslashes. A very naive implementation.
-lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
-
-# Re-`\' parameter expansions in output of double_quote_subst that were
-# `\'-ed in input to the same. If an odd number of `\' preceded a '$'
-# in input to double_quote_subst, that '$' was protected from expansion.
-# Since each input `\' is now two `\'s, look for any number of runs of
-# four `\'s followed by two `\'s and then a '$'. `\' that '$'.
-bs='\\'
-bs2='\\\\'
-bs4='\\\\\\\\'
-dollar='\$'
-sed_double_backslash="\
- s/$bs4/&\\
-/g
- s/^$bs2$dollar/$bs&/
- s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
- s/\n//g"
+# The following options affect the operation of the functions defined
+# below, and should be set appropriately depending on run-time para-
+# meters passed on the command line.
-# Standard options:
opt_dry_run=false
-opt_help=false
opt_quiet=false
opt_verbose=false
-opt_warning=:
-# func_echo arg...
-# Echo program name prefixed message, along with the current mode
-# name if it has been set yet.
-func_echo ()
+# Categories 'all' and 'none' are always available. Append any others
+# you will pass as the first argument to func_warning from your own
+# code.
+warning_categories=
+
+# By default, display warnings according to 'opt_warning_types'. Set
+# 'warning_func' to ':' to elide all warnings, or func_fatal_error to
+# treat the next displayed warning as a fatal error.
+warning_func=func_warn_and_continue
+
+# Set to 'all' to display all warnings, 'none' to suppress all
+# warnings, or a space delimited list of some subset of
+# 'warning_categories' to display only the listed warnings.
+opt_warning_types=all
+
+
+## -------------------- ##
+## Resource management. ##
+## -------------------- ##
+
+# This section contains definitions for functions that each ensure a
+# particular resource (a file, or a non-empty configuration variable for
+# example) is available, and if appropriate to extract default values
+# from pertinent package files. Call them using their associated
+# 'require_*' variable to ensure that they are executed, at most, once.
+#
+# It's entirely deliberate that calling these functions can set
+# variables that don't obey the namespace limitations obeyed by the rest
+# of this file, in order that that they be as useful as possible to
+# callers.
+
+
+# require_term_colors
+# -------------------
+# Allow display of bold text on terminals that support it.
+require_term_colors=func_require_term_colors
+func_require_term_colors ()
{
- $ECHO "$progname: ${opt_mode+$opt_mode: }$*"
+ $debug_cmd
+
+ test -t 1 && {
+ # COLORTERM and USE_ANSI_COLORS environment variables take
+ # precedence, because most terminfo databases neglect to describe
+ # whether color sequences are supported.
+ test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"}
+
+ if test 1 = "$USE_ANSI_COLORS"; then
+ # Standard ANSI escape sequences
+ tc_reset=''
+ tc_bold=''; tc_standout=''
+ tc_red=''; tc_green=''
+ tc_blue=''; tc_cyan=''
+ else
+ # Otherwise trust the terminfo database after all.
+ test -n "`tput sgr0 2>/dev/null`" && {
+ tc_reset=`tput sgr0`
+ test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold`
+ tc_standout=$tc_bold
+ test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso`
+ test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1`
+ test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2`
+ test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4`
+ test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5`
+ }
+ fi
+ }
+
+ require_term_colors=:
}
-# func_verbose arg...
-# Echo program name prefixed message in verbose mode only.
-func_verbose ()
+
+## ----------------- ##
+## Function library. ##
+## ----------------- ##
+
+# This section contains a variety of useful functions to call in your
+# scripts. Take note of the portable wrappers for features provided by
+# some modern shells, which will fall back to slower equivalents on
+# less featureful shells.
+
+
+# func_append VAR VALUE
+# ---------------------
+# Append VALUE onto the existing contents of VAR.
+
+ # We should try to minimise forks, especially on Windows where they are
+ # unreasonably slow, so skip the feature probes when bash or zsh are
+ # being used:
+ if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then
+ : ${_G_HAVE_ARITH_OP="yes"}
+ : ${_G_HAVE_XSI_OPS="yes"}
+ # The += operator was introduced in bash 3.1
+ case $BASH_VERSION in
+ [12].* | 3.0 | 3.0*) ;;
+ *)
+ : ${_G_HAVE_PLUSEQ_OP="yes"}
+ ;;
+ esac
+ fi
+
+ # _G_HAVE_PLUSEQ_OP
+ # Can be empty, in which case the shell is probed, "yes" if += is
+ # useable or anything else if it does not work.
+ test -z "$_G_HAVE_PLUSEQ_OP" \
+ && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \
+ && _G_HAVE_PLUSEQ_OP=yes
+
+if test yes = "$_G_HAVE_PLUSEQ_OP"
+then
+ # This is an XSI compatible shell, allowing a faster implementation...
+ eval 'func_append ()
+ {
+ $debug_cmd
+
+ eval "$1+=\$2"
+ }'
+else
+ # ...otherwise fall back to using expr, which is often a shell builtin.
+ func_append ()
+ {
+ $debug_cmd
+
+ eval "$1=\$$1\$2"
+ }
+fi
+
+
+# func_append_quoted VAR VALUE
+# ----------------------------
+# Quote VALUE and append to the end of shell variable VAR, separated
+# by a space.
+if test yes = "$_G_HAVE_PLUSEQ_OP"; then
+ eval 'func_append_quoted ()
+ {
+ $debug_cmd
+
+ func_quote_for_eval "$2"
+ eval "$1+=\\ \$func_quote_for_eval_result"
+ }'
+else
+ func_append_quoted ()
+ {
+ $debug_cmd
+
+ func_quote_for_eval "$2"
+ eval "$1=\$$1\\ \$func_quote_for_eval_result"
+ }
+fi
+
+
+# func_append_uniq VAR VALUE
+# --------------------------
+# Append unique VALUE onto the existing contents of VAR, assuming
+# entries are delimited by the first character of VALUE. For example:
+#
+# func_append_uniq options " --another-option option-argument"
+#
+# will only append to $options if " --another-option option-argument "
+# is not already present somewhere in $options already (note spaces at
+# each end implied by leading space in second argument).
+func_append_uniq ()
{
- $opt_verbose && func_echo ${1+"$@"}
+ $debug_cmd
- # A bug in bash halts the script if the last line of a function
- # fails when set -e is in force, so we need another command to
- # work around that:
- :
+ eval _G_current_value='`$ECHO $'$1'`'
+ _G_delim=`expr "$2" : '\(.\)'`
+
+ case $_G_delim$_G_current_value$_G_delim in
+ *"$2$_G_delim"*) ;;
+ *) func_append "$@" ;;
+ esac
}
-# func_echo_all arg...
+
+# func_arith TERM...
+# ------------------
+# Set func_arith_result to the result of evaluating TERMs.
+ test -z "$_G_HAVE_ARITH_OP" \
+ && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \
+ && _G_HAVE_ARITH_OP=yes
+
+if test yes = "$_G_HAVE_ARITH_OP"; then
+ eval 'func_arith ()
+ {
+ $debug_cmd
+
+ func_arith_result=$(( $* ))
+ }'
+else
+ func_arith ()
+ {
+ $debug_cmd
+
+ func_arith_result=`expr "$@"`
+ }
+fi
+
+
+# func_basename FILE
+# ------------------
+# Set func_basename_result to FILE with everything up to and including
+# the last / stripped.
+if test yes = "$_G_HAVE_XSI_OPS"; then
+ # If this shell supports suffix pattern removal, then use it to avoid
+ # forking. Hide the definitions single quotes in case the shell chokes
+ # on unsupported syntax...
+ _b='func_basename_result=${1##*/}'
+ _d='case $1 in
+ */*) func_dirname_result=${1%/*}$2 ;;
+ * ) func_dirname_result=$3 ;;
+ esac'
+
+else
+ # ...otherwise fall back to using sed.
+ _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`'
+ _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"`
+ if test "X$func_dirname_result" = "X$1"; then
+ func_dirname_result=$3
+ else
+ func_append func_dirname_result "$2"
+ fi'
+fi
+
+eval 'func_basename ()
+{
+ $debug_cmd
+
+ '"$_b"'
+}'
+
+
+# func_dirname FILE APPEND NONDIR_REPLACEMENT
+# -------------------------------------------
+# Compute the dirname of FILE. If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+eval 'func_dirname ()
+{
+ $debug_cmd
+
+ '"$_d"'
+}'
+
+
+# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT
+# --------------------------------------------------------
+# Perform func_basename and func_dirname in a single function
+# call:
+# dirname: Compute the dirname of FILE. If nonempty,
+# add APPEND to the result, otherwise set result
+# to NONDIR_REPLACEMENT.
+# value returned in "$func_dirname_result"
+# basename: Compute filename of FILE.
+# value retuned in "$func_basename_result"
+# For efficiency, we do not delegate to the functions above but instead
+# duplicate the functionality here.
+eval 'func_dirname_and_basename ()
+{
+ $debug_cmd
+
+ '"$_b"'
+ '"$_d"'
+}'
+
+
+# func_echo ARG...
+# ----------------
+# Echo program name prefixed message.
+func_echo ()
+{
+ $debug_cmd
+
+ _G_message=$*
+
+ func_echo_IFS=$IFS
+ IFS=$nl
+ for _G_line in $_G_message; do
+ IFS=$func_echo_IFS
+ $ECHO "$progname: $_G_line"
+ done
+ IFS=$func_echo_IFS
+}
+
+
+# func_echo_all ARG...
+# --------------------
# Invoke $ECHO with all args, space-separated.
func_echo_all ()
{
$ECHO "$*"
}
-# func_error arg...
-# Echo program name prefixed message to standard error.
-func_error ()
+
+# func_echo_infix_1 INFIX ARG...
+# ------------------------------
+# Echo program name, followed by INFIX on the first line, with any
+# additional lines not showing INFIX.
+func_echo_infix_1 ()
{
- $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2
+ $debug_cmd
+
+ $require_term_colors
+
+ _G_infix=$1; shift
+ _G_indent=$_G_infix
+ _G_prefix="$progname: $_G_infix: "
+ _G_message=$*
+
+ # Strip color escape sequences before counting printable length
+ for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan"
+ do
+ test -n "$_G_tc" && {
+ _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"`
+ _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"`
+ }
+ done
+ _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes
+
+ func_echo_infix_1_IFS=$IFS
+ IFS=$nl
+ for _G_line in $_G_message; do
+ IFS=$func_echo_infix_1_IFS
+ $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2
+ _G_prefix=$_G_indent
+ done
+ IFS=$func_echo_infix_1_IFS
}
-# func_warning arg...
-# Echo program name prefixed warning message to standard error.
-func_warning ()
+
+# func_error ARG...
+# -----------------
+# Echo program name prefixed message to standard error.
+func_error ()
{
- $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2
+ $debug_cmd
- # bash bug again:
- :
+ $require_term_colors
+
+ func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2
}
-# func_fatal_error arg...
+
+# func_fatal_error ARG...
+# -----------------------
# Echo program name prefixed message to standard error, and exit.
func_fatal_error ()
{
- func_error ${1+"$@"}
- exit $EXIT_FAILURE
-}
+ $debug_cmd
-# func_fatal_help arg...
-# Echo program name prefixed message to standard error, followed by
-# a help hint, and exit.
-func_fatal_help ()
-{
- func_error ${1+"$@"}
- func_fatal_error "$help"
+ func_error "$*"
+ exit $EXIT_FAILURE
}
-help="Try \`$progname --help' for more information." ## default
-# func_grep expression filename
+# func_grep EXPRESSION FILENAME
+# -----------------------------
# Check whether EXPRESSION matches any line of FILENAME, without output.
func_grep ()
{
+ $debug_cmd
+
$GREP "$1" "$2" >/dev/null 2>&1
}
-# func_mkdir_p directory-path
+# func_len STRING
+# ---------------
+# Set func_len_result to the length of STRING. STRING may not
+# start with a hyphen.
+ test -z "$_G_HAVE_XSI_OPS" \
+ && (eval 'x=a/b/c;
+ test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
+ && _G_HAVE_XSI_OPS=yes
+
+if test yes = "$_G_HAVE_XSI_OPS"; then
+ eval 'func_len ()
+ {
+ $debug_cmd
+
+ func_len_result=${#1}
+ }'
+else
+ func_len ()
+ {
+ $debug_cmd
+
+ func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
+ }
+fi
+
+
+# func_mkdir_p DIRECTORY-PATH
+# ---------------------------
# Make sure the entire path to DIRECTORY-PATH is available.
func_mkdir_p ()
{
- my_directory_path="$1"
- my_dir_list=
+ $debug_cmd
+
+ _G_directory_path=$1
+ _G_dir_list=
- if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
+ if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then
- # Protect directory names starting with `-'
- case $my_directory_path in
- -*) my_directory_path="./$my_directory_path" ;;
+ # Protect directory names starting with '-'
+ case $_G_directory_path in
+ -*) _G_directory_path=./$_G_directory_path ;;
esac
# While some portion of DIR does not yet exist...
- while test ! -d "$my_directory_path"; do
+ while test ! -d "$_G_directory_path"; do
# ...make a list in topmost first order. Use a colon delimited
# list incase some portion of path contains whitespace.
- my_dir_list="$my_directory_path:$my_dir_list"
+ _G_dir_list=$_G_directory_path:$_G_dir_list
# If the last portion added has no slash in it, the list is done
- case $my_directory_path in */*) ;; *) break ;; esac
+ case $_G_directory_path in */*) ;; *) break ;; esac
# ...otherwise throw away the child directory and loop
- my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
+ _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"`
done
- my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
+ _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'`
- save_mkdir_p_IFS="$IFS"; IFS=':'
- for my_dir in $my_dir_list; do
- IFS="$save_mkdir_p_IFS"
- # mkdir can fail with a `File exist' error if two processes
+ func_mkdir_p_IFS=$IFS; IFS=:
+ for _G_dir in $_G_dir_list; do
+ IFS=$func_mkdir_p_IFS
+ # mkdir can fail with a 'File exist' error if two processes
# try to create one of the directories concurrently. Don't
# stop in that case!
- $MKDIR "$my_dir" 2>/dev/null || :
+ $MKDIR "$_G_dir" 2>/dev/null || :
done
- IFS="$save_mkdir_p_IFS"
+ IFS=$func_mkdir_p_IFS
# Bail out if we (or some other process) failed to create a directory.
- test -d "$my_directory_path" || \
- func_fatal_error "Failed to create \`$1'"
+ test -d "$_G_directory_path" || \
+ func_fatal_error "Failed to create '$1'"
fi
}
-# func_mktempdir [string]
+# func_mktempdir [BASENAME]
+# -------------------------
# Make a temporary directory that won't clash with other running
# libtool processes, and avoids race conditions if possible. If
-# given, STRING is the basename for that directory.
+# given, BASENAME is the basename for that directory.
func_mktempdir ()
{
- my_template="${TMPDIR-/tmp}/${1-$progname}"
+ $debug_cmd
- if test "$opt_dry_run" = ":"; then
+ _G_template=${TMPDIR-/tmp}/${1-$progname}
+
+ if test : = "$opt_dry_run"; then
# Return a directory name, but don't create it in dry-run mode
- my_tmpdir="${my_template}-$$"
+ _G_tmpdir=$_G_template-$$
else
# If mktemp works, use that first and foremost
- my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
+ _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null`
- if test ! -d "$my_tmpdir"; then
+ if test ! -d "$_G_tmpdir"; then
# Failing that, at least try and use $RANDOM to avoid a race
- my_tmpdir="${my_template}-${RANDOM-0}$$"
+ _G_tmpdir=$_G_template-${RANDOM-0}$$
- save_mktempdir_umask=`umask`
+ func_mktempdir_umask=`umask`
umask 0077
- $MKDIR "$my_tmpdir"
- umask $save_mktempdir_umask
+ $MKDIR "$_G_tmpdir"
+ umask $func_mktempdir_umask
fi
# If we're not in dry-run mode, bomb out on failure
- test -d "$my_tmpdir" || \
- func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
+ test -d "$_G_tmpdir" || \
+ func_fatal_error "cannot create temporary directory '$_G_tmpdir'"
fi
- $ECHO "$my_tmpdir"
+ $ECHO "$_G_tmpdir"
}
-# func_quote_for_eval arg
-# Aesthetically quote ARG to be evaled later.
-# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
-# is double-quoted, suitable for a subsequent eval, whereas
-# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
-# which are still active within double quotes backslashified.
-func_quote_for_eval ()
+# func_normal_abspath PATH
+# ------------------------
+# Remove doubled-up and trailing slashes, "." path components,
+# and cancel out any ".." path components in PATH after making
+# it an absolute path.
+func_normal_abspath ()
{
- case $1 in
- *[\\\`\"\$]*)
- func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
- *)
- func_quote_for_eval_unquoted_result="$1" ;;
- esac
+ $debug_cmd
- case $func_quote_for_eval_unquoted_result in
- # Double-quote args containing shell metacharacters to delay
- # word splitting, command substitution and and variable
- # expansion for a subsequent eval.
- # Many Bourne shells cannot handle close brackets correctly
- # in scan sets, so we specify it separately.
- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
- func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
+ # These SED scripts presuppose an absolute path with a trailing slash.
+ _G_pathcar='s|^/\([^/]*\).*$|\1|'
+ _G_pathcdr='s|^/[^/]*||'
+ _G_removedotparts=':dotsl
+ s|/\./|/|g
+ t dotsl
+ s|/\.$|/|'
+ _G_collapseslashes='s|/\{1,\}|/|g'
+ _G_finalslash='s|/*$|/|'
+
+ # Start from root dir and reassemble the path.
+ func_normal_abspath_result=
+ func_normal_abspath_tpath=$1
+ func_normal_abspath_altnamespace=
+ case $func_normal_abspath_tpath in
+ "")
+ # Empty path, that just means $cwd.
+ func_stripname '' '/' "`pwd`"
+ func_normal_abspath_result=$func_stripname_result
+ return
+ ;;
+ # The next three entries are used to spot a run of precisely
+ # two leading slashes without using negated character classes;
+ # we take advantage of case's first-match behaviour.
+ ///*)
+ # Unusual form of absolute path, do nothing.
+ ;;
+ //*)
+ # Not necessarily an ordinary path; POSIX reserves leading '//'
+ # and for example Cygwin uses it to access remote file shares
+ # over CIFS/SMB, so we conserve a leading double slash if found.
+ func_normal_abspath_altnamespace=/
+ ;;
+ /*)
+ # Absolute path, do nothing.
;;
*)
- func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
+ # Relative path, prepend $cwd.
+ func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
+ ;;
esac
+
+ # Cancel out all the simple stuff to save iterations. We also want
+ # the path to end with a slash for ease of parsing, so make sure
+ # there is one (and only one) here.
+ func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+ -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"`
+ while :; do
+ # Processed it all yet?
+ if test / = "$func_normal_abspath_tpath"; then
+ # If we ascended to the root using ".." the result may be empty now.
+ if test -z "$func_normal_abspath_result"; then
+ func_normal_abspath_result=/
+ fi
+ break
+ fi
+ func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
+ -e "$_G_pathcar"`
+ func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+ -e "$_G_pathcdr"`
+ # Figure out what to do with it
+ case $func_normal_abspath_tcomponent in
+ "")
+ # Trailing empty path component, ignore it.
+ ;;
+ ..)
+ # Parent dir; strip last assembled component from result.
+ func_dirname "$func_normal_abspath_result"
+ func_normal_abspath_result=$func_dirname_result
+ ;;
+ *)
+ # Actual path component, append it.
+ func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent"
+ ;;
+ esac
+ done
+ # Restore leading double-slash if one was found on entry.
+ func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
+}
+
+
+# func_notquiet ARG...
+# --------------------
+# Echo program name prefixed message only when not in quiet mode.
+func_notquiet ()
+{
+ $debug_cmd
+
+ $opt_quiet || func_echo ${1+"$@"}
+
+ # A bug in bash halts the script if the last line of a function
+ # fails when set -e is in force, so we need another command to
+ # work around that:
+ :
+}
+
+
+# func_relative_path SRCDIR DSTDIR
+# --------------------------------
+# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR.
+func_relative_path ()
+{
+ $debug_cmd
+
+ func_relative_path_result=
+ func_normal_abspath "$1"
+ func_relative_path_tlibdir=$func_normal_abspath_result
+ func_normal_abspath "$2"
+ func_relative_path_tbindir=$func_normal_abspath_result
+
+ # Ascend the tree starting from libdir
+ while :; do
+ # check if we have found a prefix of bindir
+ case $func_relative_path_tbindir in
+ $func_relative_path_tlibdir)
+ # found an exact match
+ func_relative_path_tcancelled=
+ break
+ ;;
+ $func_relative_path_tlibdir*)
+ # found a matching prefix
+ func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
+ func_relative_path_tcancelled=$func_stripname_result
+ if test -z "$func_relative_path_result"; then
+ func_relative_path_result=.
+ fi
+ break
+ ;;
+ *)
+ func_dirname $func_relative_path_tlibdir
+ func_relative_path_tlibdir=$func_dirname_result
+ if test -z "$func_relative_path_tlibdir"; then
+ # Have to descend all the way to the root!
+ func_relative_path_result=../$func_relative_path_result
+ func_relative_path_tcancelled=$func_relative_path_tbindir
+ break
+ fi
+ func_relative_path_result=../$func_relative_path_result
+ ;;
+ esac
+ done
+
+ # Now calculate path; take care to avoid doubling-up slashes.
+ func_stripname '' '/' "$func_relative_path_result"
+ func_relative_path_result=$func_stripname_result
+ func_stripname '/' '/' "$func_relative_path_tcancelled"
+ if test -n "$func_stripname_result"; then
+ func_append func_relative_path_result "/$func_stripname_result"
+ fi
+
+ # Normalisation. If bindir is libdir, return '.' else relative path.
+ if test -n "$func_relative_path_result"; then
+ func_stripname './' '' "$func_relative_path_result"
+ func_relative_path_result=$func_stripname_result
+ fi
+
+ test -n "$func_relative_path_result" || func_relative_path_result=.
+
+ :
+}
+
+
+# func_quote_for_eval ARG...
+# --------------------------
+# Aesthetically quote ARGs to be evaled later.
+# This function returns two values:
+# i) func_quote_for_eval_result
+# double-quoted, suitable for a subsequent eval
+# ii) func_quote_for_eval_unquoted_result
+# has all characters that are still active within double
+# quotes backslashified.
+func_quote_for_eval ()
+{
+ $debug_cmd
+
+ func_quote_for_eval_unquoted_result=
+ func_quote_for_eval_result=
+ while test 0 -lt $#; do
+ case $1 in
+ *[\\\`\"\$]*)
+ _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;;
+ *)
+ _G_unquoted_arg=$1 ;;
+ esac
+ if test -n "$func_quote_for_eval_unquoted_result"; then
+ func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg"
+ else
+ func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg"
+ fi
+
+ case $_G_unquoted_arg in
+ # Double-quote args containing shell metacharacters to delay
+ # word splitting, command substitution and variable expansion
+ # for a subsequent eval.
+ # Many Bourne shells cannot handle close brackets correctly
+ # in scan sets, so we specify it separately.
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ _G_quoted_arg=\"$_G_unquoted_arg\"
+ ;;
+ *)
+ _G_quoted_arg=$_G_unquoted_arg
+ ;;
+ esac
+
+ if test -n "$func_quote_for_eval_result"; then
+ func_append func_quote_for_eval_result " $_G_quoted_arg"
+ else
+ func_append func_quote_for_eval_result "$_G_quoted_arg"
+ fi
+ shift
+ done
}
-# func_quote_for_expand arg
+# func_quote_for_expand ARG
+# -------------------------
# Aesthetically quote ARG to be evaled later; same as above,
# but do not quote variable references.
func_quote_for_expand ()
{
+ $debug_cmd
+
case $1 in
*[\\\`\"]*)
- my_arg=`$ECHO "$1" | $SED \
- -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
+ _G_arg=`$ECHO "$1" | $SED \
+ -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;;
*)
- my_arg="$1" ;;
+ _G_arg=$1 ;;
esac
- case $my_arg in
+ case $_G_arg in
# Double-quote args containing shell metacharacters to delay
# word splitting and command substitution for a subsequent eval.
# Many Bourne shells cannot handle close brackets correctly
# in scan sets, so we specify it separately.
*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
- my_arg="\"$my_arg\""
+ _G_arg=\"$_G_arg\"
;;
esac
- func_quote_for_expand_result="$my_arg"
+ func_quote_for_expand_result=$_G_arg
}
-# func_show_eval cmd [fail_exp]
-# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is
+# func_stripname PREFIX SUFFIX NAME
+# ---------------------------------
+# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+if test yes = "$_G_HAVE_XSI_OPS"; then
+ eval 'func_stripname ()
+ {
+ $debug_cmd
+
+ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+ # positional parameters, so assign one to ordinary variable first.
+ func_stripname_result=$3
+ func_stripname_result=${func_stripname_result#"$1"}
+ func_stripname_result=${func_stripname_result%"$2"}
+ }'
+else
+ func_stripname ()
+ {
+ $debug_cmd
+
+ case $2 in
+ .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;;
+ *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;;
+ esac
+ }
+fi
+
+
+# func_show_eval CMD [FAIL_EXP]
+# -----------------------------
+# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is
# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP
# is given, then evaluate it.
func_show_eval ()
{
- my_cmd="$1"
- my_fail_exp="${2-:}"
+ $debug_cmd
- ${opt_silent-false} || {
- func_quote_for_expand "$my_cmd"
- eval "func_echo $func_quote_for_expand_result"
- }
+ _G_cmd=$1
+ _G_fail_exp=${2-':'}
+
+ func_quote_for_expand "$_G_cmd"
+ eval "func_notquiet $func_quote_for_expand_result"
- if ${opt_dry_run-false}; then :; else
- eval "$my_cmd"
- my_status=$?
- if test "$my_status" -eq 0; then :; else
- eval "(exit $my_status); $my_fail_exp"
+ $opt_dry_run || {
+ eval "$_G_cmd"
+ _G_status=$?
+ if test 0 -ne "$_G_status"; then
+ eval "(exit $_G_status); $_G_fail_exp"
fi
- fi
+ }
}
-# func_show_eval_locale cmd [fail_exp]
-# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is
+# func_show_eval_locale CMD [FAIL_EXP]
+# ------------------------------------
+# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is
# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP
# is given, then evaluate it. Use the saved locale for evaluation.
func_show_eval_locale ()
{
- my_cmd="$1"
- my_fail_exp="${2-:}"
+ $debug_cmd
+
+ _G_cmd=$1
+ _G_fail_exp=${2-':'}
- ${opt_silent-false} || {
- func_quote_for_expand "$my_cmd"
+ $opt_quiet || {
+ func_quote_for_expand "$_G_cmd"
eval "func_echo $func_quote_for_expand_result"
}
- if ${opt_dry_run-false}; then :; else
- eval "$lt_user_locale
- $my_cmd"
- my_status=$?
- eval "$lt_safe_locale"
- if test "$my_status" -eq 0; then :; else
- eval "(exit $my_status); $my_fail_exp"
+ $opt_dry_run || {
+ eval "$_G_user_locale
+ $_G_cmd"
+ _G_status=$?
+ eval "$_G_safe_locale"
+ if test 0 -ne "$_G_status"; then
+ eval "(exit $_G_status); $_G_fail_exp"
fi
- fi
+ }
}
+
# func_tr_sh
+# ----------
# Turn $1 into a string suitable for a shell variable name.
# Result is stored in $func_tr_sh_result. All characters
# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
# if $1 begins with a digit, a '_' is prepended as well.
func_tr_sh ()
{
- case $1 in
- [0-9]* | *[!a-zA-Z0-9_]*)
- func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'`
- ;;
- * )
- func_tr_sh_result=$1
- ;;
- esac
+ $debug_cmd
+
+ case $1 in
+ [0-9]* | *[!a-zA-Z0-9_]*)
+ func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'`
+ ;;
+ * )
+ func_tr_sh_result=$1
+ ;;
+ esac
}
-# func_version
-# Echo version message to standard output and exit.
-func_version ()
+# func_verbose ARG...
+# -------------------
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
{
- $opt_debug
+ $debug_cmd
- $SED -n '/(C)/!b go
- :more
- /\./!{
- N
- s/\n# / /
- b more
- }
- :go
- /^# '$PROGRAM' (GNU /,/# warranty; / {
- s/^# //
- s/^# *$//
- s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
- p
- }' < "$progpath"
- exit $?
+ $opt_verbose && func_echo "$*"
+
+ :
}
-# func_usage
-# Echo short help message to standard output and exit.
-func_usage ()
+
+# func_warn_and_continue ARG...
+# -----------------------------
+# Echo program name prefixed warning message to standard error.
+func_warn_and_continue ()
{
- $opt_debug
+ $debug_cmd
- $SED -n '/^# Usage:/,/^# *.*--help/ {
- s/^# //
- s/^# *$//
- s/\$progname/'$progname'/
- p
- }' < "$progpath"
- echo
- $ECHO "run \`$progname --help | more' for full usage"
- exit $?
+ $require_term_colors
+
+ func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2
+}
+
+
+# func_warning CATEGORY ARG...
+# ----------------------------
+# Echo program name prefixed warning message to standard error. Warning
+# messages can be filtered according to CATEGORY, where this function
+# elides messages where CATEGORY is not listed in the global variable
+# 'opt_warning_types'.
+func_warning ()
+{
+ $debug_cmd
+
+ # CATEGORY must be in the warning_categories list!
+ case " $warning_categories " in
+ *" $1 "*) ;;
+ *) func_internal_error "invalid warning category '$1'" ;;
+ esac
+
+ _G_category=$1
+ shift
+
+ case " $opt_warning_types " in
+ *" $_G_category "*) $warning_func ${1+"$@"} ;;
+ esac
+}
+
+
+# func_sort_ver VER1 VER2
+# -----------------------
+# 'sort -V' is not generally available.
+# Note this deviates from the version comparison in automake
+# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a
+# but this should suffice as we won't be specifying old
+# version formats or redundant trailing .0 in bootstrap.conf.
+# If we did want full compatibility then we should probably
+# use m4_version_compare from autoconf.
+func_sort_ver ()
+{
+ $debug_cmd
+
+ printf '%s\n%s\n' "$1" "$2" \
+ | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n
+}
+
+# func_lt_ver PREV CURR
+# ---------------------
+# Return true if PREV and CURR are in the correct order according to
+# func_sort_ver, otherwise false. Use it like this:
+#
+# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..."
+func_lt_ver ()
+{
+ $debug_cmd
+
+ test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q`
+}
+
+
+# Local variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
+# time-stamp-time-zone: "UTC"
+# End:
+#! /bin/sh
+
+# Set a version string for this script.
+scriptversion=2014-01-07.03; # UTC
+
+# A portable, pluggable option parser for Bourne shell.
+# Written by Gary V. Vaughan, 2010
+
+# Copyright (C) 2010-2015 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions. There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Please report bugs or propose patches to gary@gnu.org.
+
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# This file is a library for parsing options in your shell scripts along
+# with assorted other useful supporting features that you can make use
+# of too.
+#
+# For the simplest scripts you might need only:
+#
+# #!/bin/sh
+# . relative/path/to/funclib.sh
+# . relative/path/to/options-parser
+# scriptversion=1.0
+# func_options ${1+"$@"}
+# eval set dummy "$func_options_result"; shift
+# ...rest of your script...
+#
+# In order for the '--version' option to work, you will need to have a
+# suitably formatted comment like the one at the top of this file
+# starting with '# Written by ' and ending with '# warranty; '.
+#
+# For '-h' and '--help' to work, you will also need a one line
+# description of your script's purpose in a comment directly above the
+# '# Written by ' line, like the one at the top of this file.
+#
+# The default options also support '--debug', which will turn on shell
+# execution tracing (see the comment above debug_cmd below for another
+# use), and '--verbose' and the func_verbose function to allow your script
+# to display verbose messages only when your user has specified
+# '--verbose'.
+#
+# After sourcing this file, you can plug processing for additional
+# options by amending the variables from the 'Configuration' section
+# below, and following the instructions in the 'Option parsing'
+# section further down.
+
+## -------------- ##
+## Configuration. ##
+## -------------- ##
+
+# You should override these variables in your script after sourcing this
+# file so that they reflect the customisations you have added to the
+# option parser.
+
+# The usage line for option parsing errors and the start of '-h' and
+# '--help' output messages. You can embed shell variables for delayed
+# expansion at the time the message is displayed, but you will need to
+# quote other shell meta-characters carefully to prevent them being
+# expanded when the contents are evaled.
+usage='$progpath [OPTION]...'
+
+# Short help message in response to '-h' and '--help'. Add to this or
+# override it after sourcing this library to reflect the full set of
+# options your script accepts.
+usage_message="\
+ --debug enable verbose shell tracing
+ -W, --warnings=CATEGORY
+ report the warnings falling in CATEGORY [all]
+ -v, --verbose verbosely report processing
+ --version print version information and exit
+ -h, --help print short or long help message and exit
+"
+
+# Additional text appended to 'usage_message' in response to '--help'.
+long_help_message="
+Warning categories include:
+ 'all' show all warnings
+ 'none' turn off all the warnings
+ 'error' warnings are treated as fatal errors"
+
+# Help message printed before fatal option parsing errors.
+fatal_help="Try '\$progname --help' for more information."
+
+
+
+## ------------------------- ##
+## Hook function management. ##
+## ------------------------- ##
+
+# This section contains functions for adding, removing, and running hooks
+# to the main code. A hook is just a named list of of function, that can
+# be run in order later on.
+
+# func_hookable FUNC_NAME
+# -----------------------
+# Declare that FUNC_NAME will run hooks added with
+# 'func_add_hook FUNC_NAME ...'.
+func_hookable ()
+{
+ $debug_cmd
+
+ func_append hookable_fns " $1"
}
-# func_help [NOEXIT]
-# Echo long help message to standard output and exit,
-# unless 'noexit' is passed as argument.
+
+# func_add_hook FUNC_NAME HOOK_FUNC
+# ---------------------------------
+# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must
+# first have been declared "hookable" by a call to 'func_hookable'.
+func_add_hook ()
+{
+ $debug_cmd
+
+ case " $hookable_fns " in
+ *" $1 "*) ;;
+ *) func_fatal_error "'$1' does not accept hook functions." ;;
+ esac
+
+ eval func_append ${1}_hooks '" $2"'
+}
+
+
+# func_remove_hook FUNC_NAME HOOK_FUNC
+# ------------------------------------
+# Remove HOOK_FUNC from the list of functions called by FUNC_NAME.
+func_remove_hook ()
+{
+ $debug_cmd
+
+ eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`'
+}
+
+
+# func_run_hooks FUNC_NAME [ARG]...
+# ---------------------------------
+# Run all hook functions registered to FUNC_NAME.
+# It is assumed that the list of hook functions contains nothing more
+# than a whitespace-delimited list of legal shell function names, and
+# no effort is wasted trying to catch shell meta-characters or preserve
+# whitespace.
+func_run_hooks ()
+{
+ $debug_cmd
+
+ case " $hookable_fns " in
+ *" $1 "*) ;;
+ *) func_fatal_error "'$1' does not support hook funcions.n" ;;
+ esac
+
+ eval _G_hook_fns=\$$1_hooks; shift
+
+ for _G_hook in $_G_hook_fns; do
+ eval $_G_hook '"$@"'
+
+ # store returned options list back into positional
+ # parameters for next 'cmd' execution.
+ eval _G_hook_result=\$${_G_hook}_result
+ eval set dummy "$_G_hook_result"; shift
+ done
+
+ func_quote_for_eval ${1+"$@"}
+ func_run_hooks_result=$func_quote_for_eval_result
+}
+
+
+
+## --------------- ##
+## Option parsing. ##
+## --------------- ##
+
+# In order to add your own option parsing hooks, you must accept the
+# full positional parameter list in your hook function, remove any
+# options that you action, and then pass back the remaining unprocessed
+# options in '<hooked_function_name>_result', escaped suitably for
+# 'eval'. Like this:
+#
+# my_options_prep ()
+# {
+# $debug_cmd
+#
+# # Extend the existing usage message.
+# usage_message=$usage_message'
+# -s, --silent don'\''t print informational messages
+# '
+#
+# func_quote_for_eval ${1+"$@"}
+# my_options_prep_result=$func_quote_for_eval_result
+# }
+# func_add_hook func_options_prep my_options_prep
+#
+#
+# my_silent_option ()
+# {
+# $debug_cmd
+#
+# # Note that for efficiency, we parse as many options as we can
+# # recognise in a loop before passing the remainder back to the
+# # caller on the first unrecognised argument we encounter.
+# while test $# -gt 0; do
+# opt=$1; shift
+# case $opt in
+# --silent|-s) opt_silent=: ;;
+# # Separate non-argument short options:
+# -s*) func_split_short_opt "$_G_opt"
+# set dummy "$func_split_short_opt_name" \
+# "-$func_split_short_opt_arg" ${1+"$@"}
+# shift
+# ;;
+# *) set dummy "$_G_opt" "$*"; shift; break ;;
+# esac
+# done
+#
+# func_quote_for_eval ${1+"$@"}
+# my_silent_option_result=$func_quote_for_eval_result
+# }
+# func_add_hook func_parse_options my_silent_option
+#
+#
+# my_option_validation ()
+# {
+# $debug_cmd
+#
+# $opt_silent && $opt_verbose && func_fatal_help "\
+# '--silent' and '--verbose' options are mutually exclusive."
+#
+# func_quote_for_eval ${1+"$@"}
+# my_option_validation_result=$func_quote_for_eval_result
+# }
+# func_add_hook func_validate_options my_option_validation
+#
+# You'll alse need to manually amend $usage_message to reflect the extra
+# options you parse. It's preferable to append if you can, so that
+# multiple option parsing hooks can be added safely.
+
+
+# func_options [ARG]...
+# ---------------------
+# All the functions called inside func_options are hookable. See the
+# individual implementations for details.
+func_hookable func_options
+func_options ()
+{
+ $debug_cmd
+
+ func_options_prep ${1+"$@"}
+ eval func_parse_options \
+ ${func_options_prep_result+"$func_options_prep_result"}
+ eval func_validate_options \
+ ${func_parse_options_result+"$func_parse_options_result"}
+
+ eval func_run_hooks func_options \
+ ${func_validate_options_result+"$func_validate_options_result"}
+
+ # save modified positional parameters for caller
+ func_options_result=$func_run_hooks_result
+}
+
+
+# func_options_prep [ARG]...
+# --------------------------
+# All initialisations required before starting the option parse loop.
+# Note that when calling hook functions, we pass through the list of
+# positional parameters. If a hook function modifies that list, and
+# needs to propogate that back to rest of this script, then the complete
+# modified list must be put in 'func_run_hooks_result' before
+# returning.
+func_hookable func_options_prep
+func_options_prep ()
+{
+ $debug_cmd
+
+ # Option defaults:
+ opt_verbose=false
+ opt_warning_types=
+
+ func_run_hooks func_options_prep ${1+"$@"}
+
+ # save modified positional parameters for caller
+ func_options_prep_result=$func_run_hooks_result
+}
+
+
+# func_parse_options [ARG]...
+# ---------------------------
+# The main option parsing loop.
+func_hookable func_parse_options
+func_parse_options ()
+{
+ $debug_cmd
+
+ func_parse_options_result=
+
+ # this just eases exit handling
+ while test $# -gt 0; do
+ # Defer to hook functions for initial option parsing, so they
+ # get priority in the event of reusing an option name.
+ func_run_hooks func_parse_options ${1+"$@"}
+
+ # Adjust func_parse_options positional parameters to match
+ eval set dummy "$func_run_hooks_result"; shift
+
+ # Break out of the loop if we already parsed every option.
+ test $# -gt 0 || break
+
+ _G_opt=$1
+ shift
+ case $_G_opt in
+ --debug|-x) debug_cmd='set -x'
+ func_echo "enabling shell trace mode"
+ $debug_cmd
+ ;;
+
+ --no-warnings|--no-warning|--no-warn)
+ set dummy --warnings none ${1+"$@"}
+ shift
+ ;;
+
+ --warnings|--warning|-W)
+ test $# = 0 && func_missing_arg $_G_opt && break
+ case " $warning_categories $1" in
+ *" $1 "*)
+ # trailing space prevents matching last $1 above
+ func_append_uniq opt_warning_types " $1"
+ ;;
+ *all)
+ opt_warning_types=$warning_categories
+ ;;
+ *none)
+ opt_warning_types=none
+ warning_func=:
+ ;;
+ *error)
+ opt_warning_types=$warning_categories
+ warning_func=func_fatal_error
+ ;;
+ *)
+ func_fatal_error \
+ "unsupported warning category: '$1'"
+ ;;
+ esac
+ shift
+ ;;
+
+ --verbose|-v) opt_verbose=: ;;
+ --version) func_version ;;
+ -\?|-h) func_usage ;;
+ --help) func_help ;;
+
+ # Separate optargs to long options (plugins may need this):
+ --*=*) func_split_equals "$_G_opt"
+ set dummy "$func_split_equals_lhs" \
+ "$func_split_equals_rhs" ${1+"$@"}
+ shift
+ ;;
+
+ # Separate optargs to short options:
+ -W*)
+ func_split_short_opt "$_G_opt"
+ set dummy "$func_split_short_opt_name" \
+ "$func_split_short_opt_arg" ${1+"$@"}
+ shift
+ ;;
+
+ # Separate non-argument short options:
+ -\?*|-h*|-v*|-x*)
+ func_split_short_opt "$_G_opt"
+ set dummy "$func_split_short_opt_name" \
+ "-$func_split_short_opt_arg" ${1+"$@"}
+ shift
+ ;;
+
+ --) break ;;
+ -*) func_fatal_help "unrecognised option: '$_G_opt'" ;;
+ *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
+ esac
+ done
+
+ # save modified positional parameters for caller
+ func_quote_for_eval ${1+"$@"}
+ func_parse_options_result=$func_quote_for_eval_result
+}
+
+
+# func_validate_options [ARG]...
+# ------------------------------
+# Perform any sanity checks on option settings and/or unconsumed
+# arguments.
+func_hookable func_validate_options
+func_validate_options ()
+{
+ $debug_cmd
+
+ # Display all warnings if -W was not given.
+ test -n "$opt_warning_types" || opt_warning_types=" $warning_categories"
+
+ func_run_hooks func_validate_options ${1+"$@"}
+
+ # Bail if the options were screwed!
+ $exit_cmd $EXIT_FAILURE
+
+ # save modified positional parameters for caller
+ func_validate_options_result=$func_run_hooks_result
+}
+
+
+
+## ----------------- ##
+## Helper functions. ##
+## ----------------- ##
+
+# This section contains the helper functions used by the rest of the
+# hookable option parser framework in ascii-betical order.
+
+
+# func_fatal_help ARG...
+# ----------------------
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
+{
+ $debug_cmd
+
+ eval \$ECHO \""Usage: $usage"\"
+ eval \$ECHO \""$fatal_help"\"
+ func_error ${1+"$@"}
+ exit $EXIT_FAILURE
+}
+
+
+# func_help
+# ---------
+# Echo long help message to standard output and exit.
func_help ()
{
- $opt_debug
-
- $SED -n '/^# Usage:/,/# Report bugs to/ {
- :print
- s/^# //
- s/^# *$//
- s*\$progname*'$progname'*
- s*\$host*'"$host"'*
- s*\$SHELL*'"$SHELL"'*
- s*\$LTCC*'"$LTCC"'*
- s*\$LTCFLAGS*'"$LTCFLAGS"'*
- s*\$LD*'"$LD"'*
- s/\$with_gnu_ld/'"$with_gnu_ld"'/
- s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/
- s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/
- p
- d
- }
- /^# .* home page:/b print
- /^# General help using/b print
- ' < "$progpath"
- ret=$?
- if test -z "$1"; then
- exit $ret
- fi
+ $debug_cmd
+
+ func_usage_message
+ $ECHO "$long_help_message"
+ exit 0
}
-# func_missing_arg argname
+
+# func_missing_arg ARGNAME
+# ------------------------
# Echo program name prefixed message to standard error and set global
# exit_cmd.
func_missing_arg ()
{
- $opt_debug
+ $debug_cmd
- func_error "missing argument for $1."
+ func_error "Missing argument for '$1'."
exit_cmd=exit
}
-# func_split_short_opt shortopt
+# func_split_equals STRING
+# ------------------------
+# Set func_split_equals_lhs and func_split_equals_rhs shell variables after
+# splitting STRING at the '=' sign.
+test -z "$_G_HAVE_XSI_OPS" \
+ && (eval 'x=a/b/c;
+ test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
+ && _G_HAVE_XSI_OPS=yes
+
+if test yes = "$_G_HAVE_XSI_OPS"
+then
+ # This is an XSI compatible shell, allowing a faster implementation...
+ eval 'func_split_equals ()
+ {
+ $debug_cmd
+
+ func_split_equals_lhs=${1%%=*}
+ func_split_equals_rhs=${1#*=}
+ test "x$func_split_equals_lhs" = "x$1" \
+ && func_split_equals_rhs=
+ }'
+else
+ # ...otherwise fall back to using expr, which is often a shell builtin.
+ func_split_equals ()
+ {
+ $debug_cmd
+
+ func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'`
+ func_split_equals_rhs=
+ test "x$func_split_equals_lhs" = "x$1" \
+ || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'`
+ }
+fi #func_split_equals
+
+
+# func_split_short_opt SHORTOPT
+# -----------------------------
# Set func_split_short_opt_name and func_split_short_opt_arg shell
# variables after splitting SHORTOPT after the 2nd character.
-func_split_short_opt ()
+if test yes = "$_G_HAVE_XSI_OPS"
+then
+ # This is an XSI compatible shell, allowing a faster implementation...
+ eval 'func_split_short_opt ()
+ {
+ $debug_cmd
+
+ func_split_short_opt_arg=${1#??}
+ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}
+ }'
+else
+ # ...otherwise fall back to using expr, which is often a shell builtin.
+ func_split_short_opt ()
+ {
+ $debug_cmd
+
+ func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'`
+ func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'`
+ }
+fi #func_split_short_opt
+
+
+# func_usage
+# ----------
+# Echo short help message to standard output and exit.
+func_usage ()
{
- my_sed_short_opt='1s/^\(..\).*$/\1/;q'
- my_sed_short_rest='1s/^..\(.*\)$/\1/;q'
+ $debug_cmd
- func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"`
- func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"`
-} # func_split_short_opt may be replaced by extended shell implementation
+ func_usage_message
+ $ECHO "Run '$progname --help |${PAGER-more}' for full usage"
+ exit 0
+}
-# func_split_long_opt longopt
-# Set func_split_long_opt_name and func_split_long_opt_arg shell
-# variables after splitting LONGOPT at the `=' sign.
-func_split_long_opt ()
+# func_usage_message
+# ------------------
+# Echo short help message to standard output.
+func_usage_message ()
{
- my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
- my_sed_long_arg='1s/^--[^=]*=//'
+ $debug_cmd
- func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"`
- func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"`
-} # func_split_long_opt may be replaced by extended shell implementation
+ eval \$ECHO \""Usage: $usage"\"
+ echo
+ $SED -n 's|^# ||
+ /^Written by/{
+ x;p;x
+ }
+ h
+ /^Written by/q' < "$progpath"
+ echo
+ eval \$ECHO \""$usage_message"\"
+}
-exit_cmd=:
+# func_version
+# ------------
+# Echo version message to standard output and exit.
+func_version ()
+{
+ $debug_cmd
+ printf '%s\n' "$progname $scriptversion"
+ $SED -n '
+ /(C)/!b go
+ :more
+ /\./!{
+ N
+ s|\n# | |
+ b more
+ }
+ :go
+ /^# Written by /,/# warranty; / {
+ s|^# ||
+ s|^# *$||
+ s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2|
+ p
+ }
+ /^# Written by / {
+ s|^# ||
+ p
+ }
+ /^warranty; /q' < "$progpath"
+ exit $?
+}
-magic="%%%MAGIC variable%%%"
-magic_exe="%%%MAGIC EXE variable%%%"
+# Local variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
+# time-stamp-time-zone: "UTC"
+# End:
-# Global variables.
-nonopt=
-preserve_args=
-lo2o="s/\\.lo\$/.${objext}/"
-o2lo="s/\\.${objext}\$/.lo/"
-extracted_archives=
-extracted_serial=0
+# Set a version string.
+scriptversion='(GNU libtool) 2.4.6'
-# If this variable is set in any of the actions, the command in it
-# will be execed at the end. This prevents here-documents from being
-# left over by shells.
-exec_cmd=
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
+# func_echo ARG...
+# ----------------
+# Libtool also displays the current mode in messages, so override
+# funclib.sh func_echo with this custom definition.
+func_echo ()
{
- eval "${1}=\$${1}\${2}"
-} # func_append may be replaced by extended shell implementation
+ $debug_cmd
-# func_append_quoted var value
-# Quote VALUE and append to the end of shell variable VAR, separated
-# by a space.
-func_append_quoted ()
-{
- func_quote_for_eval "${2}"
- eval "${1}=\$${1}\\ \$func_quote_for_eval_result"
-} # func_append_quoted may be replaced by extended shell implementation
+ _G_message=$*
+
+ func_echo_IFS=$IFS
+ IFS=$nl
+ for _G_line in $_G_message; do
+ IFS=$func_echo_IFS
+ $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line"
+ done
+ IFS=$func_echo_IFS
+}
-# func_arith arithmetic-term...
-func_arith ()
+# func_warning ARG...
+# -------------------
+# Libtool warnings are not categorized, so override funclib.sh
+# func_warning with this simpler definition.
+func_warning ()
{
- func_arith_result=`expr "${@}"`
-} # func_arith may be replaced by extended shell implementation
+ $debug_cmd
+ $warning_func ${1+"$@"}
+}
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
- func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len`
-} # func_len may be replaced by extended shell implementation
+## ---------------- ##
+## Options parsing. ##
+## ---------------- ##
+
+# Hook in the functions to make sure our own options are parsed during
+# the option parsing loop.
+
+usage='$progpath [OPTION]... [MODE-ARG]...'
+
+# Short help message in response to '-h'.
+usage_message="Options:
+ --config show all configuration variables
+ --debug enable verbose shell tracing
+ -n, --dry-run display commands without modifying any files
+ --features display basic configuration information and exit
+ --mode=MODE use operation mode MODE
+ --no-warnings equivalent to '-Wnone'
+ --preserve-dup-deps don't remove duplicate dependency libraries
+ --quiet, --silent don't print informational messages
+ --tag=TAG use configuration variables from tag TAG
+ -v, --verbose print more informational messages than default
+ --version print version information
+ -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all]
+ -h, --help, --help-all print short, long, or detailed help message
+"
-# func_lo2o object
-func_lo2o ()
+# Additional text appended to 'usage_message' in response to '--help'.
+func_help ()
{
- func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
-} # func_lo2o may be replaced by extended shell implementation
+ $debug_cmd
+
+ func_usage_message
+ $ECHO "$long_help_message
+
+MODE must be one of the following:
+
+ clean remove files from the build directory
+ compile compile a source file into a libtool object
+ execute automatically set library path, then run a program
+ finish complete the installation of libtool libraries
+ install install libraries or executables
+ link create a library or an executable
+ uninstall remove libraries from an installed directory
+
+MODE-ARGS vary depending on the MODE. When passed as first option,
+'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that.
+Try '$progname --help --mode=MODE' for a more detailed description of MODE.
+
+When reporting a bug, please describe a test case to reproduce it and
+include the following information:
+
+ host-triplet: $host
+ shell: $SHELL
+ compiler: $LTCC
+ compiler flags: $LTCFLAGS
+ linker: $LD (gnu? $with_gnu_ld)
+ version: $progname (GNU libtool) 2.4.6
+ automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q`
+ autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q`
+
+Report bugs to <bug-libtool@gnu.org>.
+GNU libtool home page: <http://www.gnu.org/software/libtool/>.
+General help using GNU software: <http://www.gnu.org/gethelp/>."
+ exit 0
+}
-# func_xform libobj-or-source
-func_xform ()
-{
- func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
-} # func_xform may be replaced by extended shell implementation
+# func_lo2o OBJECT-NAME
+# ---------------------
+# Transform OBJECT-NAME from a '.lo' suffix to the platform specific
+# object suffix.
+
+lo2o=s/\\.lo\$/.$objext/
+o2lo=s/\\.$objext\$/.lo/
+if test yes = "$_G_HAVE_XSI_OPS"; then
+ eval 'func_lo2o ()
+ {
+ case $1 in
+ *.lo) func_lo2o_result=${1%.lo}.$objext ;;
+ * ) func_lo2o_result=$1 ;;
+ esac
+ }'
-# func_fatal_configuration arg...
+ # func_xform LIBOBJ-OR-SOURCE
+ # ---------------------------
+ # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise)
+ # suffix to a '.lo' libtool-object suffix.
+ eval 'func_xform ()
+ {
+ func_xform_result=${1%.*}.lo
+ }'
+else
+ # ...otherwise fall back to using sed.
+ func_lo2o ()
+ {
+ func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"`
+ }
+
+ func_xform ()
+ {
+ func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'`
+ }
+fi
+
+
+# func_fatal_configuration ARG...
+# -------------------------------
# Echo program name prefixed message to standard error, followed by
# a configuration failure hint, and exit.
func_fatal_configuration ()
{
- func_error ${1+"$@"}
- func_error "See the $PACKAGE documentation for more information."
- func_fatal_error "Fatal configuration error."
+ func__fatal_error ${1+"$@"} \
+ "See the $PACKAGE documentation for more information." \
+ "Fatal configuration error."
}
# func_config
+# -----------
# Display the configuration for all the tags in this script.
func_config ()
{
@@ -919,17 +2149,19 @@ func_config ()
exit $?
}
+
# func_features
+# -------------
# Display the features supported by this script.
func_features ()
{
echo "host: $host"
- if test "$build_libtool_libs" = yes; then
+ if test yes = "$build_libtool_libs"; then
echo "enable shared libraries"
else
echo "disable shared libraries"
fi
- if test "$build_old_libs" = yes; then
+ if test yes = "$build_old_libs"; then
echo "enable static libraries"
else
echo "disable static libraries"
@@ -938,284 +2170,297 @@ func_features ()
exit $?
}
-# func_enable_tag tagname
+
+# func_enable_tag TAGNAME
+# -----------------------
# Verify that TAGNAME is valid, and either flag an error and exit, or
# enable the TAGNAME tag. We also add TAGNAME to the global $taglist
# variable here.
func_enable_tag ()
{
- # Global variable:
- tagname="$1"
+ # Global variable:
+ tagname=$1
- re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
- re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
- sed_extractcf="/$re_begincf/,/$re_endcf/p"
+ re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
+ re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
+ sed_extractcf=/$re_begincf/,/$re_endcf/p
- # Validate tagname.
- case $tagname in
- *[!-_A-Za-z0-9,/]*)
- func_fatal_error "invalid tag name: $tagname"
- ;;
- esac
+ # Validate tagname.
+ case $tagname in
+ *[!-_A-Za-z0-9,/]*)
+ func_fatal_error "invalid tag name: $tagname"
+ ;;
+ esac
- # Don't test for the "default" C tag, as we know it's
- # there but not specially marked.
- case $tagname in
- CC) ;;
+ # Don't test for the "default" C tag, as we know it's
+ # there but not specially marked.
+ case $tagname in
+ CC) ;;
*)
- if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
- taglist="$taglist $tagname"
-
- # Evaluate the configuration. Be careful to quote the path
- # and the sed script, to avoid splitting on whitespace, but
- # also don't use non-portable quotes within backquotes within
- # quotes we have to do it in 2 steps:
- extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
- eval "$extractedcf"
- else
- func_error "ignoring unknown tag $tagname"
- fi
- ;;
- esac
+ if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
+ taglist="$taglist $tagname"
+
+ # Evaluate the configuration. Be careful to quote the path
+ # and the sed script, to avoid splitting on whitespace, but
+ # also don't use non-portable quotes within backquotes within
+ # quotes we have to do it in 2 steps:
+ extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
+ eval "$extractedcf"
+ else
+ func_error "ignoring unknown tag $tagname"
+ fi
+ ;;
+ esac
}
+
# func_check_version_match
+# ------------------------
# Ensure that we are using m4 macros, and libtool script from the same
# release of libtool.
func_check_version_match ()
{
- if test "$package_revision" != "$macro_revision"; then
- if test "$VERSION" != "$macro_version"; then
- if test -z "$macro_version"; then
- cat >&2 <<_LT_EOF
+ if test "$package_revision" != "$macro_revision"; then
+ if test "$VERSION" != "$macro_version"; then
+ if test -z "$macro_version"; then
+ cat >&2 <<_LT_EOF
$progname: Version mismatch error. This is $PACKAGE $VERSION, but the
$progname: definition of this LT_INIT comes from an older release.
$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
$progname: and run autoconf again.
_LT_EOF
- else
- cat >&2 <<_LT_EOF
+ else
+ cat >&2 <<_LT_EOF
$progname: Version mismatch error. This is $PACKAGE $VERSION, but the
$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
$progname: and run autoconf again.
_LT_EOF
- fi
- else
- cat >&2 <<_LT_EOF
+ fi
+ else
+ cat >&2 <<_LT_EOF
$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision,
$progname: but the definition of this LT_INIT comes from revision $macro_revision.
$progname: You should recreate aclocal.m4 with macros from revision $package_revision
$progname: of $PACKAGE $VERSION and run autoconf again.
_LT_EOF
- fi
+ fi
- exit $EXIT_MISMATCH
- fi
+ exit $EXIT_MISMATCH
+ fi
}
-# Shorthand for --mode=foo, only valid as the first argument
-case $1 in
-clean|clea|cle|cl)
- shift; set dummy --mode clean ${1+"$@"}; shift
- ;;
-compile|compil|compi|comp|com|co|c)
- shift; set dummy --mode compile ${1+"$@"}; shift
- ;;
-execute|execut|execu|exec|exe|ex|e)
- shift; set dummy --mode execute ${1+"$@"}; shift
- ;;
-finish|finis|fini|fin|fi|f)
- shift; set dummy --mode finish ${1+"$@"}; shift
- ;;
-install|instal|insta|inst|ins|in|i)
- shift; set dummy --mode install ${1+"$@"}; shift
- ;;
-link|lin|li|l)
- shift; set dummy --mode link ${1+"$@"}; shift
- ;;
-uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
- shift; set dummy --mode uninstall ${1+"$@"}; shift
- ;;
-esac
+# libtool_options_prep [ARG]...
+# -----------------------------
+# Preparation for options parsed by libtool.
+libtool_options_prep ()
+{
+ $debug_mode
+ # Option defaults:
+ opt_config=false
+ opt_dlopen=
+ opt_dry_run=false
+ opt_help=false
+ opt_mode=
+ opt_preserve_dup_deps=false
+ opt_quiet=false
+ nonopt=
+ preserve_args=
-# Option defaults:
-opt_debug=:
-opt_dry_run=false
-opt_config=false
-opt_preserve_dup_deps=false
-opt_features=false
-opt_finish=false
-opt_help=false
-opt_help_all=false
-opt_silent=:
-opt_verbose=:
-opt_silent=false
-opt_verbose=false
+ # Shorthand for --mode=foo, only valid as the first argument
+ case $1 in
+ clean|clea|cle|cl)
+ shift; set dummy --mode clean ${1+"$@"}; shift
+ ;;
+ compile|compil|compi|comp|com|co|c)
+ shift; set dummy --mode compile ${1+"$@"}; shift
+ ;;
+ execute|execut|execu|exec|exe|ex|e)
+ shift; set dummy --mode execute ${1+"$@"}; shift
+ ;;
+ finish|finis|fini|fin|fi|f)
+ shift; set dummy --mode finish ${1+"$@"}; shift
+ ;;
+ install|instal|insta|inst|ins|in|i)
+ shift; set dummy --mode install ${1+"$@"}; shift
+ ;;
+ link|lin|li|l)
+ shift; set dummy --mode link ${1+"$@"}; shift
+ ;;
+ uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+ shift; set dummy --mode uninstall ${1+"$@"}; shift
+ ;;
+ esac
+
+ # Pass back the list of options.
+ func_quote_for_eval ${1+"$@"}
+ libtool_options_prep_result=$func_quote_for_eval_result
+}
+func_add_hook func_options_prep libtool_options_prep
-# Parse options once, thoroughly. This comes as soon as possible in the
-# script to make things like `--version' happen as quickly as we can.
+# libtool_parse_options [ARG]...
+# ---------------------------------
+# Provide handling for libtool specific options.
+libtool_parse_options ()
{
- # this just eases exit handling
- while test $# -gt 0; do
- opt="$1"
- shift
- case $opt in
- --debug|-x) opt_debug='set -x'
- func_echo "enabling shell trace mode"
- $opt_debug
- ;;
- --dry-run|--dryrun|-n)
- opt_dry_run=:
- ;;
- --config)
- opt_config=:
-func_config
- ;;
- --dlopen|-dlopen)
- optarg="$1"
- opt_dlopen="${opt_dlopen+$opt_dlopen
-}$optarg"
- shift
- ;;
- --preserve-dup-deps)
- opt_preserve_dup_deps=:
- ;;
- --features)
- opt_features=:
-func_features
- ;;
- --finish)
- opt_finish=:
-set dummy --mode finish ${1+"$@"}; shift
- ;;
- --help)
- opt_help=:
- ;;
- --help-all)
- opt_help_all=:
-opt_help=': help-all'
- ;;
- --mode)
- test $# = 0 && func_missing_arg $opt && break
- optarg="$1"
- opt_mode="$optarg"
-case $optarg in
- # Valid mode arguments:
- clean|compile|execute|finish|install|link|relink|uninstall) ;;
-
- # Catch anything else as an error
- *) func_error "invalid argument for $opt"
- exit_cmd=exit
- break
- ;;
-esac
- shift
- ;;
- --no-silent|--no-quiet)
- opt_silent=false
-func_append preserve_args " $opt"
- ;;
- --no-verbose)
- opt_verbose=false
-func_append preserve_args " $opt"
- ;;
- --silent|--quiet)
- opt_silent=:
-func_append preserve_args " $opt"
- opt_verbose=false
- ;;
- --verbose|-v)
- opt_verbose=:
-func_append preserve_args " $opt"
-opt_silent=false
- ;;
- --tag)
- test $# = 0 && func_missing_arg $opt && break
- optarg="$1"
- opt_tag="$optarg"
-func_append preserve_args " $opt $optarg"
-func_enable_tag "$optarg"
- shift
- ;;
-
- -\?|-h) func_usage ;;
- --help) func_help ;;
- --version) func_version ;;
-
- # Separate optargs to long options:
- --*=*)
- func_split_long_opt "$opt"
- set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"}
- shift
- ;;
-
- # Separate non-argument short options:
- -\?*|-h*|-n*|-v*)
- func_split_short_opt "$opt"
- set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"}
- shift
- ;;
-
- --) break ;;
- -*) func_fatal_help "unrecognized option \`$opt'" ;;
- *) set dummy "$opt" ${1+"$@"}; shift; break ;;
- esac
- done
+ $debug_cmd
- # Validate options:
+ # Perform our own loop to consume as many options as possible in
+ # each iteration.
+ while test $# -gt 0; do
+ _G_opt=$1
+ shift
+ case $_G_opt in
+ --dry-run|--dryrun|-n)
+ opt_dry_run=:
+ ;;
+
+ --config) func_config ;;
+
+ --dlopen|-dlopen)
+ opt_dlopen="${opt_dlopen+$opt_dlopen
+}$1"
+ shift
+ ;;
+
+ --preserve-dup-deps)
+ opt_preserve_dup_deps=: ;;
+
+ --features) func_features ;;
+
+ --finish) set dummy --mode finish ${1+"$@"}; shift ;;
+
+ --help) opt_help=: ;;
+
+ --help-all) opt_help=': help-all' ;;
+
+ --mode) test $# = 0 && func_missing_arg $_G_opt && break
+ opt_mode=$1
+ case $1 in
+ # Valid mode arguments:
+ clean|compile|execute|finish|install|link|relink|uninstall) ;;
+
+ # Catch anything else as an error
+ *) func_error "invalid argument for $_G_opt"
+ exit_cmd=exit
+ break
+ ;;
+ esac
+ shift
+ ;;
+
+ --no-silent|--no-quiet)
+ opt_quiet=false
+ func_append preserve_args " $_G_opt"
+ ;;
+
+ --no-warnings|--no-warning|--no-warn)
+ opt_warning=false
+ func_append preserve_args " $_G_opt"
+ ;;
+
+ --no-verbose)
+ opt_verbose=false
+ func_append preserve_args " $_G_opt"
+ ;;
+
+ --silent|--quiet)
+ opt_quiet=:
+ opt_verbose=false
+ func_append preserve_args " $_G_opt"
+ ;;
+
+ --tag) test $# = 0 && func_missing_arg $_G_opt && break
+ opt_tag=$1
+ func_append preserve_args " $_G_opt $1"
+ func_enable_tag "$1"
+ shift
+ ;;
+
+ --verbose|-v) opt_quiet=false
+ opt_verbose=:
+ func_append preserve_args " $_G_opt"
+ ;;
+
+ # An option not handled by this hook function:
+ *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
+ esac
+ done
- # save first non-option argument
- if test "$#" -gt 0; then
- nonopt="$opt"
- shift
- fi
- # preserve --debug
- test "$opt_debug" = : || func_append preserve_args " --debug"
+ # save modified positional parameters for caller
+ func_quote_for_eval ${1+"$@"}
+ libtool_parse_options_result=$func_quote_for_eval_result
+}
+func_add_hook func_parse_options libtool_parse_options
- case $host in
- *cygwin* | *mingw* | *pw32* | *cegcc*)
- # don't eliminate duplications in $postdeps and $predeps
- opt_duplicate_compiler_generated_deps=:
- ;;
- *)
- opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
- ;;
- esac
- $opt_help || {
- # Sanity checks first:
- func_check_version_match
- if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
- func_fatal_configuration "not configured to build any kind of library"
+# libtool_validate_options [ARG]...
+# ---------------------------------
+# Perform any sanity checks on option settings and/or unconsumed
+# arguments.
+libtool_validate_options ()
+{
+ # save first non-option argument
+ if test 0 -lt $#; then
+ nonopt=$1
+ shift
fi
- # Darwin sucks
- eval std_shrext=\"$shrext_cmds\"
+ # preserve --debug
+ test : = "$debug_cmd" || func_append preserve_args " --debug"
- # Only execute mode is allowed to have -dlopen flags.
- if test -n "$opt_dlopen" && test "$opt_mode" != execute; then
- func_error "unrecognized option \`-dlopen'"
- $ECHO "$help" 1>&2
- exit $EXIT_FAILURE
- fi
+ case $host in
+ # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452
+ # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788
+ *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*)
+ # don't eliminate duplications in $postdeps and $predeps
+ opt_duplicate_compiler_generated_deps=:
+ ;;
+ *)
+ opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
+ ;;
+ esac
- # Change the help message to a mode-specific one.
- generic_help="$help"
- help="Try \`$progname --help --mode=$opt_mode' for more information."
- }
+ $opt_help || {
+ # Sanity checks first:
+ func_check_version_match
+
+ test yes != "$build_libtool_libs" \
+ && test yes != "$build_old_libs" \
+ && func_fatal_configuration "not configured to build any kind of library"
+ # Darwin sucks
+ eval std_shrext=\"$shrext_cmds\"
- # Bail if the options were screwed
- $exit_cmd $EXIT_FAILURE
+ # Only execute mode is allowed to have -dlopen flags.
+ if test -n "$opt_dlopen" && test execute != "$opt_mode"; then
+ func_error "unrecognized option '-dlopen'"
+ $ECHO "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Change the help message to a mode-specific one.
+ generic_help=$help
+ help="Try '$progname --help --mode=$opt_mode' for more information."
+ }
+
+ # Pass back the unparsed argument list
+ func_quote_for_eval ${1+"$@"}
+ libtool_validate_options_result=$func_quote_for_eval_result
}
+func_add_hook func_validate_options libtool_validate_options
+
+# Process options as early as possible so that --help and --version
+# can return quickly.
+func_options ${1+"$@"}
+eval set dummy "$func_options_result"; shift
@@ -1223,24 +2468,52 @@ func_enable_tag "$optarg"
## Main. ##
## ----------- ##
+magic='%%%MAGIC variable%%%'
+magic_exe='%%%MAGIC EXE variable%%%'
+
+# Global variables.
+extracted_archives=
+extracted_serial=0
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end. This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+
+# func_generated_by_libtool
+# True iff stdin has been generated by Libtool. This function is only
+# a basic sanity check; it will hardly flush out determined imposters.
+func_generated_by_libtool_p ()
+{
+ $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
+
# func_lalib_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
+# True iff FILE is a libtool '.la' library or '.lo' object file.
# This function is only a basic sanity check; it will hardly flush out
# determined imposters.
func_lalib_p ()
{
test -f "$1" &&
- $SED -e 4q "$1" 2>/dev/null \
- | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+ $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p
}
# func_lalib_unsafe_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
+# True iff FILE is a libtool '.la' library or '.lo' object file.
# This function implements the same check as func_lalib_p without
# resorting to external programs. To this end, it redirects stdin and
# closes it afterwards, without saving the original file descriptor.
# As a safety measure, use it only where a negative result would be
-# fatal anyway. Works if `file' does not exist.
+# fatal anyway. Works if 'file' does not exist.
func_lalib_unsafe_p ()
{
lalib_p=no
@@ -1248,13 +2521,13 @@ func_lalib_unsafe_p ()
for lalib_p_l in 1 2 3 4
do
read lalib_p_line
- case "$lalib_p_line" in
+ case $lalib_p_line in
\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
esac
done
exec 0<&5 5<&-
fi
- test "$lalib_p" = yes
+ test yes = "$lalib_p"
}
# func_ltwrapper_script_p file
@@ -1263,7 +2536,8 @@ func_lalib_unsafe_p ()
# determined imposters.
func_ltwrapper_script_p ()
{
- func_lalib_p "$1"
+ test -f "$1" &&
+ $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p
}
# func_ltwrapper_executable_p file
@@ -1288,7 +2562,7 @@ func_ltwrapper_scriptname ()
{
func_dirname_and_basename "$1" "" "."
func_stripname '' '.exe' "$func_basename_result"
- func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
+ func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper
}
# func_ltwrapper_p file
@@ -1307,11 +2581,13 @@ func_ltwrapper_p ()
# FAIL_CMD may read-access the current command in variable CMD!
func_execute_cmds ()
{
- $opt_debug
+ $debug_cmd
+
save_ifs=$IFS; IFS='~'
for cmd in $1; do
- IFS=$save_ifs
+ IFS=$sp$nl
eval cmd=\"$cmd\"
+ IFS=$save_ifs
func_show_eval "$cmd" "${2-:}"
done
IFS=$save_ifs
@@ -1323,10 +2599,11 @@ func_execute_cmds ()
# Note that it is not necessary on cygwin/mingw to append a dot to
# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
# behavior happens only for exec(3), not for open(2)! Also, sourcing
-# `FILE.' does not work on cygwin managed mounts.
+# 'FILE.' does not work on cygwin managed mounts.
func_source ()
{
- $opt_debug
+ $debug_cmd
+
case $1 in
*/* | *\\*) . "$1" ;;
*) . "./$1" ;;
@@ -1353,10 +2630,10 @@ func_resolve_sysroot ()
# store the result into func_replace_sysroot_result.
func_replace_sysroot ()
{
- case "$lt_sysroot:$1" in
+ case $lt_sysroot:$1 in
?*:"$lt_sysroot"*)
func_stripname "$lt_sysroot" '' "$1"
- func_replace_sysroot_result="=$func_stripname_result"
+ func_replace_sysroot_result='='$func_stripname_result
;;
*)
# Including no sysroot.
@@ -1373,7 +2650,8 @@ func_replace_sysroot ()
# arg is usually of the form 'gcc ...'
func_infer_tag ()
{
- $opt_debug
+ $debug_cmd
+
if test -n "$available_tags" && test -z "$tagname"; then
CC_quoted=
for arg in $CC; do
@@ -1392,7 +2670,7 @@ func_infer_tag ()
for z in $available_tags; do
if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
# Evaluate the configuration.
- eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+ eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
CC_quoted=
for arg in $CC; do
# Double-quote args containing other shell metacharacters.
@@ -1417,7 +2695,7 @@ func_infer_tag ()
# line option must be used.
if test -z "$tagname"; then
func_echo "unable to infer tagged configuration"
- func_fatal_error "specify a tag with \`--tag'"
+ func_fatal_error "specify a tag with '--tag'"
# else
# func_verbose "using $tagname tagged configuration"
fi
@@ -1433,15 +2711,15 @@ func_infer_tag ()
# but don't create it if we're doing a dry run.
func_write_libtool_object ()
{
- write_libobj=${1}
- if test "$build_libtool_libs" = yes; then
- write_lobj=\'${2}\'
+ write_libobj=$1
+ if test yes = "$build_libtool_libs"; then
+ write_lobj=\'$2\'
else
write_lobj=none
fi
- if test "$build_old_libs" = yes; then
- write_oldobj=\'${3}\'
+ if test yes = "$build_old_libs"; then
+ write_oldobj=\'$3\'
else
write_oldobj=none
fi
@@ -1449,7 +2727,7 @@ func_write_libtool_object ()
$opt_dry_run || {
cat >${write_libobj}T <<EOF
# $write_libobj - a libtool object file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
#
# Please DO NOT delete this file!
# It is necessary for linking the library.
@@ -1461,7 +2739,7 @@ pic_object=$write_lobj
non_pic_object=$write_oldobj
EOF
- $MV "${write_libobj}T" "${write_libobj}"
+ $MV "${write_libobj}T" "$write_libobj"
}
}
@@ -1481,8 +2759,9 @@ EOF
# be empty on error (or when ARG is empty)
func_convert_core_file_wine_to_w32 ()
{
- $opt_debug
- func_convert_core_file_wine_to_w32_result="$1"
+ $debug_cmd
+
+ func_convert_core_file_wine_to_w32_result=$1
if test -n "$1"; then
# Unfortunately, winepath does not exit with a non-zero error code, so we
# are forced to check the contents of stdout. On the other hand, if the
@@ -1490,9 +2769,9 @@ func_convert_core_file_wine_to_w32 ()
# *an error message* to stdout. So we must check for both error code of
# zero AND non-empty stdout, which explains the odd construction:
func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
- if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then
+ if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then
func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
- $SED -e "$lt_sed_naive_backslashify"`
+ $SED -e "$sed_naive_backslashify"`
else
func_convert_core_file_wine_to_w32_result=
fi
@@ -1513,18 +2792,19 @@ func_convert_core_file_wine_to_w32 ()
# are convertible, then the result may be empty.
func_convert_core_path_wine_to_w32 ()
{
- $opt_debug
+ $debug_cmd
+
# unfortunately, winepath doesn't convert paths, only file names
- func_convert_core_path_wine_to_w32_result=""
+ func_convert_core_path_wine_to_w32_result=
if test -n "$1"; then
oldIFS=$IFS
IFS=:
for func_convert_core_path_wine_to_w32_f in $1; do
IFS=$oldIFS
func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
- if test -n "$func_convert_core_file_wine_to_w32_result" ; then
+ if test -n "$func_convert_core_file_wine_to_w32_result"; then
if test -z "$func_convert_core_path_wine_to_w32_result"; then
- func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result"
+ func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result
else
func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
fi
@@ -1553,7 +2833,8 @@ func_convert_core_path_wine_to_w32 ()
# environment variable; do not put it in $PATH.
func_cygpath ()
{
- $opt_debug
+ $debug_cmd
+
if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
if test "$?" -ne 0; then
@@ -1562,7 +2843,7 @@ func_cygpath ()
fi
else
func_cygpath_result=
- func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'"
+ func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'"
fi
}
#end: func_cygpath
@@ -1573,10 +2854,11 @@ func_cygpath ()
# result in func_convert_core_msys_to_w32_result.
func_convert_core_msys_to_w32 ()
{
- $opt_debug
+ $debug_cmd
+
# awkward: cmd appends spaces to result
func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
- $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
+ $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"`
}
#end: func_convert_core_msys_to_w32
@@ -1587,13 +2869,14 @@ func_convert_core_msys_to_w32 ()
# func_to_host_file_result to ARG1).
func_convert_file_check ()
{
- $opt_debug
- if test -z "$2" && test -n "$1" ; then
+ $debug_cmd
+
+ if test -z "$2" && test -n "$1"; then
func_error "Could not determine host file name corresponding to"
- func_error " \`$1'"
+ func_error " '$1'"
func_error "Continuing, but uninstalled executables may not work."
# Fallback:
- func_to_host_file_result="$1"
+ func_to_host_file_result=$1
fi
}
# end func_convert_file_check
@@ -1605,10 +2888,11 @@ func_convert_file_check ()
# func_to_host_file_result to a simplistic fallback value (see below).
func_convert_path_check ()
{
- $opt_debug
+ $debug_cmd
+
if test -z "$4" && test -n "$3"; then
func_error "Could not determine the host path corresponding to"
- func_error " \`$3'"
+ func_error " '$3'"
func_error "Continuing, but uninstalled executables may not work."
# Fallback. This is a deliberately simplistic "conversion" and
# should not be "improved". See libtool.info.
@@ -1617,7 +2901,7 @@ func_convert_path_check ()
func_to_host_path_result=`echo "$3" |
$SED -e "$lt_replace_pathsep_chars"`
else
- func_to_host_path_result="$3"
+ func_to_host_path_result=$3
fi
fi
}
@@ -1629,9 +2913,10 @@ func_convert_path_check ()
# and appending REPL if ORIG matches BACKPAT.
func_convert_path_front_back_pathsep ()
{
- $opt_debug
+ $debug_cmd
+
case $4 in
- $1 ) func_to_host_path_result="$3$func_to_host_path_result"
+ $1 ) func_to_host_path_result=$3$func_to_host_path_result
;;
esac
case $4 in
@@ -1645,7 +2930,7 @@ func_convert_path_front_back_pathsep ()
##################################################
# $build to $host FILE NAME CONVERSION FUNCTIONS #
##################################################
-# invoked via `$to_host_file_cmd ARG'
+# invoked via '$to_host_file_cmd ARG'
#
# In each case, ARG is the path to be converted from $build to $host format.
# Result will be available in $func_to_host_file_result.
@@ -1656,7 +2941,8 @@ func_convert_path_front_back_pathsep ()
# in func_to_host_file_result.
func_to_host_file ()
{
- $opt_debug
+ $debug_cmd
+
$to_host_file_cmd "$1"
}
# end func_to_host_file
@@ -1668,7 +2954,8 @@ func_to_host_file ()
# in (the comma separated) LAZY, no conversion takes place.
func_to_tool_file ()
{
- $opt_debug
+ $debug_cmd
+
case ,$2, in
*,"$to_tool_file_cmd",*)
func_to_tool_file_result=$1
@@ -1686,7 +2973,7 @@ func_to_tool_file ()
# Copy ARG to func_to_host_file_result.
func_convert_file_noop ()
{
- func_to_host_file_result="$1"
+ func_to_host_file_result=$1
}
# end func_convert_file_noop
@@ -1697,11 +2984,12 @@ func_convert_file_noop ()
# func_to_host_file_result.
func_convert_file_msys_to_w32 ()
{
- $opt_debug
- func_to_host_file_result="$1"
+ $debug_cmd
+
+ func_to_host_file_result=$1
if test -n "$1"; then
func_convert_core_msys_to_w32 "$1"
- func_to_host_file_result="$func_convert_core_msys_to_w32_result"
+ func_to_host_file_result=$func_convert_core_msys_to_w32_result
fi
func_convert_file_check "$1" "$func_to_host_file_result"
}
@@ -1713,8 +3001,9 @@ func_convert_file_msys_to_w32 ()
# func_to_host_file_result.
func_convert_file_cygwin_to_w32 ()
{
- $opt_debug
- func_to_host_file_result="$1"
+ $debug_cmd
+
+ func_to_host_file_result=$1
if test -n "$1"; then
# because $build is cygwin, we call "the" cygpath in $PATH; no need to use
# LT_CYGPATH in this case.
@@ -1730,11 +3019,12 @@ func_convert_file_cygwin_to_w32 ()
# and a working winepath. Returns result in func_to_host_file_result.
func_convert_file_nix_to_w32 ()
{
- $opt_debug
- func_to_host_file_result="$1"
+ $debug_cmd
+
+ func_to_host_file_result=$1
if test -n "$1"; then
func_convert_core_file_wine_to_w32 "$1"
- func_to_host_file_result="$func_convert_core_file_wine_to_w32_result"
+ func_to_host_file_result=$func_convert_core_file_wine_to_w32_result
fi
func_convert_file_check "$1" "$func_to_host_file_result"
}
@@ -1746,12 +3036,13 @@ func_convert_file_nix_to_w32 ()
# Returns result in func_to_host_file_result.
func_convert_file_msys_to_cygwin ()
{
- $opt_debug
- func_to_host_file_result="$1"
+ $debug_cmd
+
+ func_to_host_file_result=$1
if test -n "$1"; then
func_convert_core_msys_to_w32 "$1"
func_cygpath -u "$func_convert_core_msys_to_w32_result"
- func_to_host_file_result="$func_cygpath_result"
+ func_to_host_file_result=$func_cygpath_result
fi
func_convert_file_check "$1" "$func_to_host_file_result"
}
@@ -1764,13 +3055,14 @@ func_convert_file_msys_to_cygwin ()
# in func_to_host_file_result.
func_convert_file_nix_to_cygwin ()
{
- $opt_debug
- func_to_host_file_result="$1"
+ $debug_cmd
+
+ func_to_host_file_result=$1
if test -n "$1"; then
# convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
func_convert_core_file_wine_to_w32 "$1"
func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
- func_to_host_file_result="$func_cygpath_result"
+ func_to_host_file_result=$func_cygpath_result
fi
func_convert_file_check "$1" "$func_to_host_file_result"
}
@@ -1780,7 +3072,7 @@ func_convert_file_nix_to_cygwin ()
#############################################
# $build to $host PATH CONVERSION FUNCTIONS #
#############################################
-# invoked via `$to_host_path_cmd ARG'
+# invoked via '$to_host_path_cmd ARG'
#
# In each case, ARG is the path to be converted from $build to $host format.
# The result will be available in $func_to_host_path_result.
@@ -1804,10 +3096,11 @@ func_convert_file_nix_to_cygwin ()
to_host_path_cmd=
func_init_to_host_path_cmd ()
{
- $opt_debug
+ $debug_cmd
+
if test -z "$to_host_path_cmd"; then
func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
- to_host_path_cmd="func_convert_path_${func_stripname_result}"
+ to_host_path_cmd=func_convert_path_$func_stripname_result
fi
}
@@ -1817,7 +3110,8 @@ func_init_to_host_path_cmd ()
# in func_to_host_path_result.
func_to_host_path ()
{
- $opt_debug
+ $debug_cmd
+
func_init_to_host_path_cmd
$to_host_path_cmd "$1"
}
@@ -1828,7 +3122,7 @@ func_to_host_path ()
# Copy ARG to func_to_host_path_result.
func_convert_path_noop ()
{
- func_to_host_path_result="$1"
+ func_to_host_path_result=$1
}
# end func_convert_path_noop
@@ -1839,8 +3133,9 @@ func_convert_path_noop ()
# func_to_host_path_result.
func_convert_path_msys_to_w32 ()
{
- $opt_debug
- func_to_host_path_result="$1"
+ $debug_cmd
+
+ func_to_host_path_result=$1
if test -n "$1"; then
# Remove leading and trailing path separator characters from ARG. MSYS
# behavior is inconsistent here; cygpath turns them into '.;' and ';.';
@@ -1848,7 +3143,7 @@ func_convert_path_msys_to_w32 ()
func_stripname : : "$1"
func_to_host_path_tmp1=$func_stripname_result
func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
- func_to_host_path_result="$func_convert_core_msys_to_w32_result"
+ func_to_host_path_result=$func_convert_core_msys_to_w32_result
func_convert_path_check : ";" \
"$func_to_host_path_tmp1" "$func_to_host_path_result"
func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
@@ -1862,8 +3157,9 @@ func_convert_path_msys_to_w32 ()
# func_to_host_file_result.
func_convert_path_cygwin_to_w32 ()
{
- $opt_debug
- func_to_host_path_result="$1"
+ $debug_cmd
+
+ func_to_host_path_result=$1
if test -n "$1"; then
# See func_convert_path_msys_to_w32:
func_stripname : : "$1"
@@ -1882,14 +3178,15 @@ func_convert_path_cygwin_to_w32 ()
# a working winepath. Returns result in func_to_host_file_result.
func_convert_path_nix_to_w32 ()
{
- $opt_debug
- func_to_host_path_result="$1"
+ $debug_cmd
+
+ func_to_host_path_result=$1
if test -n "$1"; then
# See func_convert_path_msys_to_w32:
func_stripname : : "$1"
func_to_host_path_tmp1=$func_stripname_result
func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
- func_to_host_path_result="$func_convert_core_path_wine_to_w32_result"
+ func_to_host_path_result=$func_convert_core_path_wine_to_w32_result
func_convert_path_check : ";" \
"$func_to_host_path_tmp1" "$func_to_host_path_result"
func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
@@ -1903,15 +3200,16 @@ func_convert_path_nix_to_w32 ()
# Returns result in func_to_host_file_result.
func_convert_path_msys_to_cygwin ()
{
- $opt_debug
- func_to_host_path_result="$1"
+ $debug_cmd
+
+ func_to_host_path_result=$1
if test -n "$1"; then
# See func_convert_path_msys_to_w32:
func_stripname : : "$1"
func_to_host_path_tmp1=$func_stripname_result
func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
- func_to_host_path_result="$func_cygpath_result"
+ func_to_host_path_result=$func_cygpath_result
func_convert_path_check : : \
"$func_to_host_path_tmp1" "$func_to_host_path_result"
func_convert_path_front_back_pathsep ":*" "*:" : "$1"
@@ -1926,8 +3224,9 @@ func_convert_path_msys_to_cygwin ()
# func_to_host_file_result.
func_convert_path_nix_to_cygwin ()
{
- $opt_debug
- func_to_host_path_result="$1"
+ $debug_cmd
+
+ func_to_host_path_result=$1
if test -n "$1"; then
# Remove leading and trailing path separator characters from
# ARG. msys behavior is inconsistent here, cygpath turns them
@@ -1936,7 +3235,7 @@ func_convert_path_nix_to_cygwin ()
func_to_host_path_tmp1=$func_stripname_result
func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
- func_to_host_path_result="$func_cygpath_result"
+ func_to_host_path_result=$func_cygpath_result
func_convert_path_check : : \
"$func_to_host_path_tmp1" "$func_to_host_path_result"
func_convert_path_front_back_pathsep ":*" "*:" : "$1"
@@ -1945,13 +3244,31 @@ func_convert_path_nix_to_cygwin ()
# end func_convert_path_nix_to_cygwin
+# func_dll_def_p FILE
+# True iff FILE is a Windows DLL '.def' file.
+# Keep in sync with _LT_DLL_DEF_P in libtool.m4
+func_dll_def_p ()
+{
+ $debug_cmd
+
+ func_dll_def_p_tmp=`$SED -n \
+ -e 's/^[ ]*//' \
+ -e '/^\(;.*\)*$/d' \
+ -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \
+ -e q \
+ "$1"`
+ test DEF = "$func_dll_def_p_tmp"
+}
+
+
# func_mode_compile arg...
func_mode_compile ()
{
- $opt_debug
+ $debug_cmd
+
# Get the compilation command and the source file.
base_compile=
- srcfile="$nonopt" # always keep a non-empty value in "srcfile"
+ srcfile=$nonopt # always keep a non-empty value in "srcfile"
suppress_opt=yes
suppress_output=
arg_mode=normal
@@ -1964,12 +3281,12 @@ func_mode_compile ()
case $arg_mode in
arg )
# do not "continue". Instead, add this to base_compile
- lastarg="$arg"
+ lastarg=$arg
arg_mode=normal
;;
target )
- libobj="$arg"
+ libobj=$arg
arg_mode=normal
continue
;;
@@ -1979,7 +3296,7 @@ func_mode_compile ()
case $arg in
-o)
test -n "$libobj" && \
- func_fatal_error "you cannot specify \`-o' more than once"
+ func_fatal_error "you cannot specify '-o' more than once"
arg_mode=target
continue
;;
@@ -2008,12 +3325,12 @@ func_mode_compile ()
func_stripname '-Wc,' '' "$arg"
args=$func_stripname_result
lastarg=
- save_ifs="$IFS"; IFS=','
+ save_ifs=$IFS; IFS=,
for arg in $args; do
- IFS="$save_ifs"
+ IFS=$save_ifs
func_append_quoted lastarg "$arg"
done
- IFS="$save_ifs"
+ IFS=$save_ifs
func_stripname ' ' '' "$lastarg"
lastarg=$func_stripname_result
@@ -2026,8 +3343,8 @@ func_mode_compile ()
# Accept the current argument as the source file.
# The previous "srcfile" becomes the current argument.
#
- lastarg="$srcfile"
- srcfile="$arg"
+ lastarg=$srcfile
+ srcfile=$arg
;;
esac # case $arg
;;
@@ -2042,13 +3359,13 @@ func_mode_compile ()
func_fatal_error "you must specify an argument for -Xcompile"
;;
target)
- func_fatal_error "you must specify a target with \`-o'"
+ func_fatal_error "you must specify a target with '-o'"
;;
*)
# Get the name of the library object.
test -z "$libobj" && {
func_basename "$srcfile"
- libobj="$func_basename_result"
+ libobj=$func_basename_result
}
;;
esac
@@ -2059,7 +3376,7 @@ func_mode_compile ()
*.[cCFSifmso] | \
*.ada | *.adb | *.ads | *.asm | \
*.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
- *.[fF][09]? | *.for | *.java | *.obj | *.sx | *.cu | *.cup)
+ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)
func_xform "$libobj"
libobj=$func_xform_result
;;
@@ -2068,7 +3385,7 @@ func_mode_compile ()
case $libobj in
*.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
*)
- func_fatal_error "cannot determine name of library object from \`$libobj'"
+ func_fatal_error "cannot determine name of library object from '$libobj'"
;;
esac
@@ -2077,8 +3394,8 @@ func_mode_compile ()
for arg in $later; do
case $arg in
-shared)
- test "$build_libtool_libs" != yes && \
- func_fatal_configuration "can not build a shared library"
+ test yes = "$build_libtool_libs" \
+ || func_fatal_configuration "cannot build a shared library"
build_old_libs=no
continue
;;
@@ -2104,17 +3421,17 @@ func_mode_compile ()
func_quote_for_eval "$libobj"
test "X$libobj" != "X$func_quote_for_eval_result" \
&& $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \
- && func_warning "libobj name \`$libobj' may not contain shell special characters."
+ && func_warning "libobj name '$libobj' may not contain shell special characters."
func_dirname_and_basename "$obj" "/" ""
- objname="$func_basename_result"
- xdir="$func_dirname_result"
- lobj=${xdir}$objdir/$objname
+ objname=$func_basename_result
+ xdir=$func_dirname_result
+ lobj=$xdir$objdir/$objname
test -z "$base_compile" && \
func_fatal_help "you must specify a compilation command"
# Delete any leftover library objects.
- if test "$build_old_libs" = yes; then
+ if test yes = "$build_old_libs"; then
removelist="$obj $lobj $libobj ${libobj}T"
else
removelist="$lobj $libobj ${libobj}T"
@@ -2126,16 +3443,16 @@ func_mode_compile ()
pic_mode=default
;;
esac
- if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+ if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then
# non-PIC code in shared libraries is not supported
pic_mode=default
fi
# Calculate the filename of the output object if compiler does
# not support -o with -c
- if test "$compiler_c_o" = no; then
- output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
- lockfile="$output_obj.lock"
+ if test no = "$compiler_c_o"; then
+ output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext
+ lockfile=$output_obj.lock
else
output_obj=
need_locks=no
@@ -2144,12 +3461,12 @@ func_mode_compile ()
# Lock this critical section if it is needed
# We use this script file to make the link, it avoids creating a new file
- if test "$need_locks" = yes; then
+ if test yes = "$need_locks"; then
until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
func_echo "Waiting for $lockfile to be removed"
sleep 2
done
- elif test "$need_locks" = warn; then
+ elif test warn = "$need_locks"; then
if test -f "$lockfile"; then
$ECHO "\
*** ERROR, $lockfile exists and contains:
@@ -2157,7 +3474,7 @@ func_mode_compile ()
This indicates that another process is trying to use the same
temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together. If you
+your compiler does not support '-c' and '-o' together. If you
repeat this compilation, it may succeed, by chance, but you had better
avoid parallel builds (make -j) in this platform, or get a better
compiler."
@@ -2179,11 +3496,11 @@ compiler."
qsrcfile=$func_quote_for_eval_result
# Only build a PIC object if we are building libtool libraries.
- if test "$build_libtool_libs" = yes; then
+ if test yes = "$build_libtool_libs"; then
# Without this assignment, base_compile gets emptied.
fbsd_hideous_sh_bug=$base_compile
- if test "$pic_mode" != no; then
+ if test no != "$pic_mode"; then
command="$base_compile $qsrcfile $pic_flag"
else
# Don't build PIC code
@@ -2200,7 +3517,7 @@ compiler."
func_show_eval_locale "$command" \
'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
- if test "$need_locks" = warn &&
+ if test warn = "$need_locks" &&
test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
$ECHO "\
*** ERROR, $lockfile contains:
@@ -2211,7 +3528,7 @@ $srcfile
This indicates that another process is trying to use the same
temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together. If you
+your compiler does not support '-c' and '-o' together. If you
repeat this compilation, it may succeed, by chance, but you had better
avoid parallel builds (make -j) in this platform, or get a better
compiler."
@@ -2227,20 +3544,20 @@ compiler."
fi
# Allow error messages only from the first compilation.
- if test "$suppress_opt" = yes; then
+ if test yes = "$suppress_opt"; then
suppress_output=' >/dev/null 2>&1'
fi
fi
# Only build a position-dependent object if we build old libraries.
- if test "$build_old_libs" = yes; then
- if test "$pic_mode" != yes; then
+ if test yes = "$build_old_libs"; then
+ if test yes != "$pic_mode"; then
# Don't build PIC code
command="$base_compile $qsrcfile$pie_flag"
else
command="$base_compile $qsrcfile $pic_flag"
fi
- if test "$compiler_c_o" = yes; then
+ if test yes = "$compiler_c_o"; then
func_append command " -o $obj"
fi
@@ -2249,7 +3566,7 @@ compiler."
func_show_eval_locale "$command" \
'$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
- if test "$need_locks" = warn &&
+ if test warn = "$need_locks" &&
test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
$ECHO "\
*** ERROR, $lockfile contains:
@@ -2260,7 +3577,7 @@ $srcfile
This indicates that another process is trying to use the same
temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together. If you
+your compiler does not support '-c' and '-o' together. If you
repeat this compilation, it may succeed, by chance, but you had better
avoid parallel builds (make -j) in this platform, or get a better
compiler."
@@ -2280,7 +3597,7 @@ compiler."
func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
# Unlock the critical section if it was locked
- if test "$need_locks" != no; then
+ if test no != "$need_locks"; then
removelist=$lockfile
$RM "$lockfile"
fi
@@ -2290,7 +3607,7 @@ compiler."
}
$opt_help || {
- test "$opt_mode" = compile && func_mode_compile ${1+"$@"}
+ test compile = "$opt_mode" && func_mode_compile ${1+"$@"}
}
func_mode_help ()
@@ -2310,7 +3627,7 @@ func_mode_help ()
Remove files from the build directory.
RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
+(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed
to RM.
If FILE is a libtool library, object or program, all the files associated
@@ -2329,16 +3646,16 @@ This mode accepts the following additional options:
-no-suppress do not suppress compiler output for multiple passes
-prefer-pic try to build PIC objects only
-prefer-non-pic try to build non-PIC objects only
- -shared do not build a \`.o' file suitable for static linking
- -static only build a \`.o' file suitable for static linking
+ -shared do not build a '.o' file suitable for static linking
+ -static only build a '.o' file suitable for static linking
-Wc,FLAG pass FLAG directly to the compiler
-COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+COMPILE-COMMAND is a command to be used in creating a 'standard' object file
from the given SOURCEFILE.
The output file name is determined by removing the directory component from
-SOURCEFILE, then substituting the C source code suffix \`.c' with the
-library object suffix, \`.lo'."
+SOURCEFILE, then substituting the C source code suffix '.c' with the
+library object suffix, '.lo'."
;;
execute)
@@ -2351,7 +3668,7 @@ This mode accepts the following additional options:
-dlopen FILE add the directory containing FILE to the library path
-This mode sets the library path environment variable according to \`-dlopen'
+This mode sets the library path environment variable according to '-dlopen'
flags.
If any of the ARGS are libtool executable wrappers, then they are translated
@@ -2370,7 +3687,7 @@ Complete the installation of libtool libraries.
Each LIBDIR is a directory that contains libtool libraries.
The commands that this mode executes may require superuser privileges. Use
-the \`--dry-run' option if you just want to see what would be executed."
+the '--dry-run' option if you just want to see what would be executed."
;;
install)
@@ -2380,7 +3697,7 @@ the \`--dry-run' option if you just want to see what would be executed."
Install executables or libraries.
INSTALL-COMMAND is the installation command. The first component should be
-either the \`install' or \`cp' program.
+either the 'install' or 'cp' program.
The following components of INSTALL-COMMAND are treated specially:
@@ -2406,7 +3723,7 @@ The following components of LINK-COMMAND are treated specially:
-avoid-version do not add a version suffix if possible
-bindir BINDIR specify path to binaries directory (for systems where
libraries must be found in the PATH setting at runtime)
- -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime
+ -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime
-dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols
-export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
-export-symbols SYMFILE
@@ -2420,7 +3737,8 @@ The following components of LINK-COMMAND are treated specially:
-no-install link a not-installable executable
-no-undefined declare that a library does not refer to external symbols
-o OUTPUT-FILE create OUTPUT-FILE from the specified objects
- -objectlist FILE Use a list of object files found in FILE to specify objects
+ -objectlist FILE use a list of object files found in FILE to specify objects
+ -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes)
-precious-files-regex REGEX
don't remove output files matching REGEX
-release RELEASE specify package release information
@@ -2440,20 +3758,20 @@ The following components of LINK-COMMAND are treated specially:
-Xlinker FLAG pass linker-specific FLAG directly to the linker
-XCClinker FLAG pass link-specific FLAG to the compiler driver (CC)
-All other options (arguments beginning with \`-') are ignored.
+All other options (arguments beginning with '-') are ignored.
-Every other argument is treated as a filename. Files ending in \`.la' are
+Every other argument is treated as a filename. Files ending in '.la' are
treated as uninstalled libtool libraries, other files are standard or library
object files.
-If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
-only library objects (\`.lo' files) may be specified, and \`-rpath' is
+If the OUTPUT-FILE ends in '.la', then a libtool library is created,
+only library objects ('.lo' files) may be specified, and '-rpath' is
required, except when creating a convenience library.
-If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
-using \`ar' and \`ranlib', or on Windows using \`lib'.
+If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created
+using 'ar' and 'ranlib', or on Windows using 'lib'.
-If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file
is created, otherwise an executable program is created."
;;
@@ -2464,7 +3782,7 @@ is created, otherwise an executable program is created."
Remove libraries from an installation directory.
RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
+(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed
to RM.
If FILE is a libtool library, all the files associated with it are deleted.
@@ -2472,17 +3790,17 @@ Otherwise, only FILE itself is deleted using RM."
;;
*)
- func_fatal_help "invalid operation mode \`$opt_mode'"
+ func_fatal_help "invalid operation mode '$opt_mode'"
;;
esac
echo
- $ECHO "Try \`$progname --help' for more information about other modes."
+ $ECHO "Try '$progname --help' for more information about other modes."
}
# Now that we've collected a possible --mode arg, show help if necessary
if $opt_help; then
- if test "$opt_help" = :; then
+ if test : = "$opt_help"; then
func_mode_help
else
{
@@ -2490,7 +3808,7 @@ if $opt_help; then
for opt_mode in compile link execute install finish uninstall clean; do
func_mode_help
done
- } | sed -n '1p; 2,$s/^Usage:/ or: /p'
+ } | $SED -n '1p; 2,$s/^Usage:/ or: /p'
{
func_help noexit
for opt_mode in compile link execute install finish uninstall clean; do
@@ -2498,7 +3816,7 @@ if $opt_help; then
func_mode_help
done
} |
- sed '1d
+ $SED '1d
/^When reporting/,/^Report/{
H
d
@@ -2515,16 +3833,17 @@ fi
# func_mode_execute arg...
func_mode_execute ()
{
- $opt_debug
+ $debug_cmd
+
# The first argument is the command name.
- cmd="$nonopt"
+ cmd=$nonopt
test -z "$cmd" && \
func_fatal_help "you must specify a COMMAND"
# Handle -dlopen flags immediately.
for file in $opt_dlopen; do
test -f "$file" \
- || func_fatal_help "\`$file' is not a file"
+ || func_fatal_help "'$file' is not a file"
dir=
case $file in
@@ -2534,7 +3853,7 @@ func_mode_execute ()
# Check to see that this really is a libtool archive.
func_lalib_unsafe_p "$file" \
- || func_fatal_help "\`$lib' is not a valid libtool archive"
+ || func_fatal_help "'$lib' is not a valid libtool archive"
# Read the libtool library.
dlname=
@@ -2545,18 +3864,18 @@ func_mode_execute ()
if test -z "$dlname"; then
# Warn if it was a shared library.
test -n "$library_names" && \
- func_warning "\`$file' was not linked with \`-export-dynamic'"
+ func_warning "'$file' was not linked with '-export-dynamic'"
continue
fi
func_dirname "$file" "" "."
- dir="$func_dirname_result"
+ dir=$func_dirname_result
if test -f "$dir/$objdir/$dlname"; then
func_append dir "/$objdir"
else
if test ! -f "$dir/$dlname"; then
- func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
+ func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'"
fi
fi
;;
@@ -2564,18 +3883,18 @@ func_mode_execute ()
*.lo)
# Just add the directory containing the .lo file.
func_dirname "$file" "" "."
- dir="$func_dirname_result"
+ dir=$func_dirname_result
;;
*)
- func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
+ func_warning "'-dlopen' is ignored for non-libtool libraries and objects"
continue
;;
esac
# Get the absolute pathname.
absdir=`cd "$dir" && pwd`
- test -n "$absdir" && dir="$absdir"
+ test -n "$absdir" && dir=$absdir
# Now add the directory to shlibpath_var.
if eval "test -z \"\$$shlibpath_var\""; then
@@ -2587,7 +3906,7 @@ func_mode_execute ()
# This variable tells wrapper scripts just to set shlibpath_var
# rather than running their programs.
- libtool_execute_magic="$magic"
+ libtool_execute_magic=$magic
# Check if any of the arguments is a wrapper script.
args=
@@ -2600,12 +3919,12 @@ func_mode_execute ()
if func_ltwrapper_script_p "$file"; then
func_source "$file"
# Transform arg to wrapped name.
- file="$progdir/$program"
+ file=$progdir/$program
elif func_ltwrapper_executable_p "$file"; then
func_ltwrapper_scriptname "$file"
func_source "$func_ltwrapper_scriptname_result"
# Transform arg to wrapped name.
- file="$progdir/$program"
+ file=$progdir/$program
fi
;;
esac
@@ -2613,7 +3932,15 @@ func_mode_execute ()
func_append_quoted args "$file"
done
- if test "X$opt_dry_run" = Xfalse; then
+ if $opt_dry_run; then
+ # Display what would be done.
+ if test -n "$shlibpath_var"; then
+ eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
+ echo "export $shlibpath_var"
+ fi
+ $ECHO "$cmd$args"
+ exit $EXIT_SUCCESS
+ else
if test -n "$shlibpath_var"; then
# Export the shlibpath_var.
eval "export $shlibpath_var"
@@ -2630,25 +3957,18 @@ func_mode_execute ()
done
# Now prepare to actually exec the command.
- exec_cmd="\$cmd$args"
- else
- # Display what would be done.
- if test -n "$shlibpath_var"; then
- eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
- echo "export $shlibpath_var"
- fi
- $ECHO "$cmd$args"
- exit $EXIT_SUCCESS
+ exec_cmd=\$cmd$args
fi
}
-test "$opt_mode" = execute && func_mode_execute ${1+"$@"}
+test execute = "$opt_mode" && func_mode_execute ${1+"$@"}
# func_mode_finish arg...
func_mode_finish ()
{
- $opt_debug
+ $debug_cmd
+
libs=
libdirs=
admincmds=
@@ -2662,11 +3982,11 @@ func_mode_finish ()
if func_lalib_unsafe_p "$opt"; then
func_append libs " $opt"
else
- func_warning "\`$opt' is not a valid libtool archive"
+ func_warning "'$opt' is not a valid libtool archive"
fi
else
- func_fatal_error "invalid argument \`$opt'"
+ func_fatal_error "invalid argument '$opt'"
fi
done
@@ -2681,12 +4001,12 @@ func_mode_finish ()
# Remove sysroot references
if $opt_dry_run; then
for lib in $libs; do
- echo "removing references to $lt_sysroot and \`=' prefixes from $lib"
+ echo "removing references to $lt_sysroot and '=' prefixes from $lib"
done
else
tmpdir=`func_mktempdir`
for lib in $libs; do
- sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
+ $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
> $tmpdir/tmp-la
mv -f $tmpdir/tmp-la $lib
done
@@ -2711,7 +4031,7 @@ func_mode_finish ()
fi
# Exit here if they wanted silent mode.
- $opt_silent && exit $EXIT_SUCCESS
+ $opt_quiet && exit $EXIT_SUCCESS
if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
echo "----------------------------------------------------------------------"
@@ -2722,27 +4042,27 @@ func_mode_finish ()
echo
echo "If you ever happen to want to link against installed libraries"
echo "in a given directory, LIBDIR, you must either use libtool, and"
- echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+ echo "specify the full pathname of the library, or use the '-LLIBDIR'"
echo "flag during linking and do at least one of the following:"
if test -n "$shlibpath_var"; then
- echo " - add LIBDIR to the \`$shlibpath_var' environment variable"
+ echo " - add LIBDIR to the '$shlibpath_var' environment variable"
echo " during execution"
fi
if test -n "$runpath_var"; then
- echo " - add LIBDIR to the \`$runpath_var' environment variable"
+ echo " - add LIBDIR to the '$runpath_var' environment variable"
echo " during linking"
fi
if test -n "$hardcode_libdir_flag_spec"; then
libdir=LIBDIR
eval flag=\"$hardcode_libdir_flag_spec\"
- $ECHO " - use the \`$flag' linker flag"
+ $ECHO " - use the '$flag' linker flag"
fi
if test -n "$admincmds"; then
$ECHO " - have your system administrator run these commands:$admincmds"
fi
if test -f /etc/ld.so.conf; then
- echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+ echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'"
fi
echo
@@ -2761,18 +4081,20 @@ func_mode_finish ()
exit $EXIT_SUCCESS
}
-test "$opt_mode" = finish && func_mode_finish ${1+"$@"}
+test finish = "$opt_mode" && func_mode_finish ${1+"$@"}
# func_mode_install arg...
func_mode_install ()
{
- $opt_debug
+ $debug_cmd
+
# There may be an optional sh(1) argument at the beginning of
# install_prog (especially on Windows NT).
- if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+ if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" ||
# Allow the use of GNU shtool's install command.
- case $nonopt in *shtool*) :;; *) false;; esac; then
+ case $nonopt in *shtool*) :;; *) false;; esac
+ then
# Aesthetically quote it.
func_quote_for_eval "$nonopt"
install_prog="$func_quote_for_eval_result "
@@ -2799,7 +4121,7 @@ func_mode_install ()
opts=
prev=
install_type=
- isdir=no
+ isdir=false
stripme=
no_mode=:
for arg
@@ -2812,7 +4134,7 @@ func_mode_install ()
fi
case $arg in
- -d) isdir=yes ;;
+ -d) isdir=: ;;
-f)
if $install_cp; then :; else
prev=$arg
@@ -2830,7 +4152,7 @@ func_mode_install ()
*)
# If the previous option needed an argument, then skip it.
if test -n "$prev"; then
- if test "x$prev" = x-m && test -n "$install_override_mode"; then
+ if test X-m = "X$prev" && test -n "$install_override_mode"; then
arg2=$install_override_mode
no_mode=false
fi
@@ -2855,7 +4177,7 @@ func_mode_install ()
func_fatal_help "you must specify an install program"
test -n "$prev" && \
- func_fatal_help "the \`$prev' option requires an argument"
+ func_fatal_help "the '$prev' option requires an argument"
if test -n "$install_override_mode" && $no_mode; then
if $install_cp; then :; else
@@ -2877,19 +4199,19 @@ func_mode_install ()
dest=$func_stripname_result
# Check to see that the destination is a directory.
- test -d "$dest" && isdir=yes
- if test "$isdir" = yes; then
- destdir="$dest"
+ test -d "$dest" && isdir=:
+ if $isdir; then
+ destdir=$dest
destname=
else
func_dirname_and_basename "$dest" "" "."
- destdir="$func_dirname_result"
- destname="$func_basename_result"
+ destdir=$func_dirname_result
+ destname=$func_basename_result
# Not a directory, so check to see that there is only one file specified.
set dummy $files; shift
test "$#" -gt 1 && \
- func_fatal_help "\`$dest' is not a directory"
+ func_fatal_help "'$dest' is not a directory"
fi
case $destdir in
[\\/]* | [A-Za-z]:[\\/]*) ;;
@@ -2898,7 +4220,7 @@ func_mode_install ()
case $file in
*.lo) ;;
*)
- func_fatal_help "\`$destdir' must be an absolute directory name"
+ func_fatal_help "'$destdir' must be an absolute directory name"
;;
esac
done
@@ -2907,7 +4229,7 @@ func_mode_install ()
# This variable tells wrapper scripts just to set variables rather
# than running their programs.
- libtool_install_magic="$magic"
+ libtool_install_magic=$magic
staticlibs=
future_libdirs=
@@ -2927,7 +4249,7 @@ func_mode_install ()
# Check to see that this really is a libtool archive.
func_lalib_unsafe_p "$file" \
- || func_fatal_help "\`$file' is not a valid libtool archive"
+ || func_fatal_help "'$file' is not a valid libtool archive"
library_names=
old_library=
@@ -2949,7 +4271,7 @@ func_mode_install ()
fi
func_dirname "$file" "/" ""
- dir="$func_dirname_result"
+ dir=$func_dirname_result
func_append dir "$objdir"
if test -n "$relink_command"; then
@@ -2963,7 +4285,7 @@ func_mode_install ()
# are installed into $libdir/../bin (currently, that works fine)
# but it's something to keep an eye on.
test "$inst_prefix_dir" = "$destdir" && \
- func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
+ func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir"
if test -n "$inst_prefix_dir"; then
# Stick the inst_prefix_dir data into the link command.
@@ -2972,29 +4294,36 @@ func_mode_install ()
relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
fi
- func_warning "relinking \`$file'"
+ func_warning "relinking '$file'"
func_show_eval "$relink_command" \
- 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
+ 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"'
fi
# See the names of the shared library.
set dummy $library_names; shift
if test -n "$1"; then
- realname="$1"
+ realname=$1
shift
- srcname="$realname"
- test -n "$relink_command" && srcname="$realname"T
+ srcname=$realname
+ test -n "$relink_command" && srcname=${realname}T
# Install the shared library and build the symlinks.
func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
'exit $?'
- tstripme="$stripme"
+ tstripme=$stripme
case $host_os in
cygwin* | mingw* | pw32* | cegcc*)
case $realname in
*.dll.a)
- tstripme=""
+ tstripme=
+ ;;
+ esac
+ ;;
+ os2*)
+ case $realname in
+ *_dll.a)
+ tstripme=
;;
esac
;;
@@ -3005,7 +4334,7 @@ func_mode_install ()
if test "$#" -gt 0; then
# Delete the old symlinks, and create new ones.
- # Try `ln -sf' first, because the `ln' binary might depend on
+ # Try 'ln -sf' first, because the 'ln' binary might depend on
# the symlink we replace! Solaris /bin/ln does not understand -f,
# so we also need to try rm && ln -s.
for linkname
@@ -3016,14 +4345,14 @@ func_mode_install ()
fi
# Do each command in the postinstall commands.
- lib="$destdir/$realname"
+ lib=$destdir/$realname
func_execute_cmds "$postinstall_cmds" 'exit $?'
fi
# Install the pseudo-library for information purposes.
func_basename "$file"
- name="$func_basename_result"
- instname="$dir/$name"i
+ name=$func_basename_result
+ instname=$dir/${name}i
func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
# Maybe install the static library, too.
@@ -3035,11 +4364,11 @@ func_mode_install ()
# Figure out destination file name, if it wasn't already specified.
if test -n "$destname"; then
- destfile="$destdir/$destname"
+ destfile=$destdir/$destname
else
func_basename "$file"
- destfile="$func_basename_result"
- destfile="$destdir/$destfile"
+ destfile=$func_basename_result
+ destfile=$destdir/$destfile
fi
# Deduce the name of the destination old-style object file.
@@ -3049,11 +4378,11 @@ func_mode_install ()
staticdest=$func_lo2o_result
;;
*.$objext)
- staticdest="$destfile"
+ staticdest=$destfile
destfile=
;;
*)
- func_fatal_help "cannot copy a libtool object to \`$destfile'"
+ func_fatal_help "cannot copy a libtool object to '$destfile'"
;;
esac
@@ -3062,7 +4391,7 @@ func_mode_install ()
func_show_eval "$install_prog $file $destfile" 'exit $?'
# Install the old object if enabled.
- if test "$build_old_libs" = yes; then
+ if test yes = "$build_old_libs"; then
# Deduce the name of the old-style object file.
func_lo2o "$file"
staticobj=$func_lo2o_result
@@ -3074,23 +4403,23 @@ func_mode_install ()
*)
# Figure out destination file name, if it wasn't already specified.
if test -n "$destname"; then
- destfile="$destdir/$destname"
+ destfile=$destdir/$destname
else
func_basename "$file"
- destfile="$func_basename_result"
- destfile="$destdir/$destfile"
+ destfile=$func_basename_result
+ destfile=$destdir/$destfile
fi
# If the file is missing, and there is a .exe on the end, strip it
# because it is most likely a libtool script we actually want to
# install
- stripped_ext=""
+ stripped_ext=
case $file in
*.exe)
if test ! -f "$file"; then
func_stripname '' '.exe' "$file"
file=$func_stripname_result
- stripped_ext=".exe"
+ stripped_ext=.exe
fi
;;
esac
@@ -3118,19 +4447,19 @@ func_mode_install ()
# Check the variables that should have been set.
test -z "$generated_by_libtool_version" && \
- func_fatal_error "invalid libtool wrapper script \`$wrapper'"
+ func_fatal_error "invalid libtool wrapper script '$wrapper'"
- finalize=yes
+ finalize=:
for lib in $notinst_deplibs; do
# Check to see that each library is installed.
libdir=
if test -f "$lib"; then
func_source "$lib"
fi
- libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
+ libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'`
if test -n "$libdir" && test ! -f "$libfile"; then
- func_warning "\`$lib' has not been installed in \`$libdir'"
- finalize=no
+ func_warning "'$lib' has not been installed in '$libdir'"
+ finalize=false
fi
done
@@ -3138,29 +4467,29 @@ func_mode_install ()
func_source "$wrapper"
outputname=
- if test "$fast_install" = no && test -n "$relink_command"; then
+ if test no = "$fast_install" && test -n "$relink_command"; then
$opt_dry_run || {
- if test "$finalize" = yes; then
+ if $finalize; then
tmpdir=`func_mktempdir`
func_basename "$file$stripped_ext"
- file="$func_basename_result"
- outputname="$tmpdir/$file"
+ file=$func_basename_result
+ outputname=$tmpdir/$file
# Replace the output file specification.
relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
- $opt_silent || {
+ $opt_quiet || {
func_quote_for_expand "$relink_command"
eval "func_echo $func_quote_for_expand_result"
}
if eval "$relink_command"; then :
else
- func_error "error: relink \`$file' with the above command before installing it"
+ func_error "error: relink '$file' with the above command before installing it"
$opt_dry_run || ${RM}r "$tmpdir"
continue
fi
- file="$outputname"
+ file=$outputname
else
- func_warning "cannot relink \`$file'"
+ func_warning "cannot relink '$file'"
fi
}
else
@@ -3197,15 +4526,17 @@ func_mode_install ()
for file in $staticlibs; do
func_basename "$file"
- name="$func_basename_result"
+ name=$func_basename_result
# Set up the ranlib parameters.
- oldlib="$destdir/$name"
+ oldlib=$destdir/$name
+ func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+ tool_oldlib=$func_to_tool_file_result
func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
if test -n "$stripme" && test -n "$old_striplib"; then
- func_show_eval "$old_striplib $oldlib" 'exit $?'
+ func_show_eval "$old_striplib $tool_oldlib" 'exit $?'
fi
# Do each command in the postinstall commands.
@@ -3213,18 +4544,18 @@ func_mode_install ()
done
test -n "$future_libdirs" && \
- func_warning "remember to run \`$progname --finish$future_libdirs'"
+ func_warning "remember to run '$progname --finish$future_libdirs'"
if test -n "$current_libdirs"; then
# Maybe just do a dry run.
$opt_dry_run && current_libdirs=" -n$current_libdirs"
- exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+ exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs'
else
exit $EXIT_SUCCESS
fi
}
-test "$opt_mode" = install && func_mode_install ${1+"$@"}
+test install = "$opt_mode" && func_mode_install ${1+"$@"}
# func_generate_dlsyms outputname originator pic_p
@@ -3232,16 +4563,17 @@ test "$opt_mode" = install && func_mode_install ${1+"$@"}
# a dlpreopen symbol table.
func_generate_dlsyms ()
{
- $opt_debug
- my_outputname="$1"
- my_originator="$2"
- my_pic_p="${3-no}"
- my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
+ $debug_cmd
+
+ my_outputname=$1
+ my_originator=$2
+ my_pic_p=${3-false}
+ my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'`
my_dlsyms=
- if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+ if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
if test -n "$NM" && test -n "$global_symbol_pipe"; then
- my_dlsyms="${my_outputname}S.c"
+ my_dlsyms=${my_outputname}S.c
else
func_error "not configured to extract global symbols from dlpreopened files"
fi
@@ -3252,7 +4584,7 @@ func_generate_dlsyms ()
"") ;;
*.c)
# Discover the nlist of each of the dlfiles.
- nlist="$output_objdir/${my_outputname}.nm"
+ nlist=$output_objdir/$my_outputname.nm
func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
@@ -3260,34 +4592,36 @@ func_generate_dlsyms ()
func_verbose "creating $output_objdir/$my_dlsyms"
$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
-/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
-/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
+/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */
+/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */
#ifdef __cplusplus
extern \"C\" {
#endif
-#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
+#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
#endif
/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
relocations are performed -- see ld's documentation on pseudo-relocs. */
# define LT_DLSYM_CONST
-#elif defined(__osf__)
+#elif defined __osf__
/* This system does not cope well with relocations in const data. */
# define LT_DLSYM_CONST
#else
# define LT_DLSYM_CONST const
#endif
+#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)
+
/* External symbol declarations for the compiler. */\
"
- if test "$dlself" = yes; then
- func_verbose "generating symbol list for \`$output'"
+ if test yes = "$dlself"; then
+ func_verbose "generating symbol list for '$output'"
$opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
@@ -3295,7 +4629,7 @@ extern \"C\" {
progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
for progfile in $progfiles; do
func_to_tool_file "$progfile" func_convert_file_msys_to_w32
- func_verbose "extracting global C symbols from \`$func_to_tool_file_result'"
+ func_verbose "extracting global C symbols from '$func_to_tool_file_result'"
$opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
done
@@ -3315,10 +4649,10 @@ extern \"C\" {
# Prepare the list of exported symbols
if test -z "$export_symbols"; then
- export_symbols="$output_objdir/$outputname.exp"
+ export_symbols=$output_objdir/$outputname.exp
$opt_dry_run || {
$RM $export_symbols
- eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+ eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
case $host in
*cygwin* | *mingw* | *cegcc* )
eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
@@ -3328,7 +4662,7 @@ extern \"C\" {
}
else
$opt_dry_run || {
- eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+ eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
eval '$MV "$nlist"T "$nlist"'
case $host in
@@ -3342,22 +4676,22 @@ extern \"C\" {
fi
for dlprefile in $dlprefiles; do
- func_verbose "extracting global C symbols from \`$dlprefile'"
+ func_verbose "extracting global C symbols from '$dlprefile'"
func_basename "$dlprefile"
- name="$func_basename_result"
+ name=$func_basename_result
case $host in
*cygwin* | *mingw* | *cegcc* )
# if an import library, we need to obtain dlname
if func_win32_import_lib_p "$dlprefile"; then
func_tr_sh "$dlprefile"
eval "curr_lafile=\$libfile_$func_tr_sh_result"
- dlprefile_dlbasename=""
+ dlprefile_dlbasename=
if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
# Use subshell, to avoid clobbering current variable values
dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
- if test -n "$dlprefile_dlname" ; then
+ if test -n "$dlprefile_dlname"; then
func_basename "$dlprefile_dlname"
- dlprefile_dlbasename="$func_basename_result"
+ dlprefile_dlbasename=$func_basename_result
else
# no lafile. user explicitly requested -dlpreopen <import library>.
$sharedlib_from_linklib_cmd "$dlprefile"
@@ -3365,7 +4699,7 @@ extern \"C\" {
fi
fi
$opt_dry_run || {
- if test -n "$dlprefile_dlbasename" ; then
+ if test -n "$dlprefile_dlbasename"; then
eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
else
func_warning "Could not compute DLL name from $name"
@@ -3421,6 +4755,11 @@ extern \"C\" {
echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
fi
+ func_show_eval '$RM "${nlist}I"'
+ if test -n "$global_symbol_to_import"; then
+ eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I'
+ fi
+
echo >> "$output_objdir/$my_dlsyms" "\
/* The mapping between symbol names and symbols. */
@@ -3429,11 +4768,30 @@ typedef struct {
void *address;
} lt_dlsymlist;
extern LT_DLSYM_CONST lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[];
+lt_${my_prefix}_LTX_preloaded_symbols[];\
+"
+
+ if test -s "$nlist"I; then
+ echo >> "$output_objdir/$my_dlsyms" "\
+static void lt_syminit(void)
+{
+ LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols;
+ for (; symbol->name; ++symbol)
+ {"
+ $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms"
+ echo >> "$output_objdir/$my_dlsyms" "\
+ }
+}"
+ fi
+ echo >> "$output_objdir/$my_dlsyms" "\
LT_DLSYM_CONST lt_dlsymlist
lt_${my_prefix}_LTX_preloaded_symbols[] =
-{\
- { \"$my_originator\", (void *) 0 },"
+{ {\"$my_originator\", (void *) 0},"
+
+ if test -s "$nlist"I; then
+ echo >> "$output_objdir/$my_dlsyms" "\
+ {\"@INIT@\", (void *) &lt_syminit},"
+ fi
case $need_lib_prefix in
no)
@@ -3470,14 +4828,12 @@ static const void *lt_preloaded_setup() {
# linked before any other PIC object. But we must not use
# pic_flag when linking with -static. The problem exists in
# FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
- *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+ *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
*-*-hpux*)
pic_flag_for_symtable=" $pic_flag" ;;
*)
- if test "X$my_pic_p" != Xno; then
- pic_flag_for_symtable=" $pic_flag"
- fi
+ $my_pic_p && pic_flag_for_symtable=" $pic_flag"
;;
esac
;;
@@ -3494,10 +4850,10 @@ static const void *lt_preloaded_setup() {
func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
# Clean up the generated files.
- func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
+ func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"'
# Transform the symbol file into the correct name.
- symfileobj="$output_objdir/${my_outputname}S.$objext"
+ symfileobj=$output_objdir/${my_outputname}S.$objext
case $host in
*cygwin* | *mingw* | *cegcc* )
if test -f "$output_objdir/$my_outputname.def"; then
@@ -3515,7 +4871,7 @@ static const void *lt_preloaded_setup() {
esac
;;
*)
- func_fatal_error "unknown suffix for \`$my_dlsyms'"
+ func_fatal_error "unknown suffix for '$my_dlsyms'"
;;
esac
else
@@ -3529,6 +4885,32 @@ static const void *lt_preloaded_setup() {
fi
}
+# func_cygming_gnu_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is a GNU/binutils-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_gnu_implib_p ()
+{
+ $debug_cmd
+
+ func_to_tool_file "$1" func_convert_file_msys_to_w32
+ func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
+ test -n "$func_cygming_gnu_implib_tmp"
+}
+
+# func_cygming_ms_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is an MS-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_ms_implib_p ()
+{
+ $debug_cmd
+
+ func_to_tool_file "$1" func_convert_file_msys_to_w32
+ func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
+ test -n "$func_cygming_ms_implib_tmp"
+}
+
# func_win32_libid arg
# return the library type of file 'arg'
#
@@ -3538,8 +4920,9 @@ static const void *lt_preloaded_setup() {
# Despite the name, also deal with 64 bit binaries.
func_win32_libid ()
{
- $opt_debug
- win32_libid_type="unknown"
+ $debug_cmd
+
+ win32_libid_type=unknown
win32_fileres=`file -L $1 2>/dev/null`
case $win32_fileres in
*ar\ archive\ import\ library*) # definitely import
@@ -3549,16 +4932,29 @@ func_win32_libid ()
# Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
$EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
- func_to_tool_file "$1" func_convert_file_msys_to_w32
- win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
- $SED -n -e '
+ case $nm_interface in
+ "MS dumpbin")
+ if func_cygming_ms_implib_p "$1" ||
+ func_cygming_gnu_implib_p "$1"
+ then
+ win32_nmres=import
+ else
+ win32_nmres=
+ fi
+ ;;
+ *)
+ func_to_tool_file "$1" func_convert_file_msys_to_w32
+ win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
+ $SED -n -e '
1,100{
/ I /{
- s,.*,import,
+ s|.*|import|
p
q
}
}'`
+ ;;
+ esac
case $win32_nmres in
import*) win32_libid_type="x86 archive import";;
*) win32_libid_type="x86 archive static";;
@@ -3590,7 +4986,8 @@ func_win32_libid ()
# $sharedlib_from_linklib_result
func_cygming_dll_for_implib ()
{
- $opt_debug
+ $debug_cmd
+
sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
}
@@ -3607,7 +5004,8 @@ func_cygming_dll_for_implib ()
# specified import library.
func_cygming_dll_for_implib_fallback_core ()
{
- $opt_debug
+ $debug_cmd
+
match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
$OBJDUMP -s --section "$1" "$2" 2>/dev/null |
$SED '/^Contents of section '"$match_literal"':/{
@@ -3643,8 +5041,8 @@ func_cygming_dll_for_implib_fallback_core ()
/./p' |
# we now have a list, one entry per line, of the stringified
# contents of the appropriate section of all members of the
- # archive which possess that section. Heuristic: eliminate
- # all those which have a first or second character that is
+ # archive that possess that section. Heuristic: eliminate
+ # all those that have a first or second character that is
# a '.' (that is, objdump's representation of an unprintable
# character.) This should work for all archives with less than
# 0x302f exports -- but will fail for DLLs whose name actually
@@ -3655,30 +5053,6 @@ func_cygming_dll_for_implib_fallback_core ()
$SED -e '/^\./d;/^.\./d;q'
}
-# func_cygming_gnu_implib_p ARG
-# This predicate returns with zero status (TRUE) if
-# ARG is a GNU/binutils-style import library. Returns
-# with nonzero status (FALSE) otherwise.
-func_cygming_gnu_implib_p ()
-{
- $opt_debug
- func_to_tool_file "$1" func_convert_file_msys_to_w32
- func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
- test -n "$func_cygming_gnu_implib_tmp"
-}
-
-# func_cygming_ms_implib_p ARG
-# This predicate returns with zero status (TRUE) if
-# ARG is an MS-style import library. Returns
-# with nonzero status (FALSE) otherwise.
-func_cygming_ms_implib_p ()
-{
- $opt_debug
- func_to_tool_file "$1" func_convert_file_msys_to_w32
- func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
- test -n "$func_cygming_ms_implib_tmp"
-}
-
# func_cygming_dll_for_implib_fallback ARG
# Platform-specific function to extract the
# name of the DLL associated with the specified
@@ -3692,16 +5066,17 @@ func_cygming_ms_implib_p ()
# $sharedlib_from_linklib_result
func_cygming_dll_for_implib_fallback ()
{
- $opt_debug
- if func_cygming_gnu_implib_p "$1" ; then
+ $debug_cmd
+
+ if func_cygming_gnu_implib_p "$1"; then
# binutils import library
sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
- elif func_cygming_ms_implib_p "$1" ; then
+ elif func_cygming_ms_implib_p "$1"; then
# ms-generated import library
sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
else
# unknown
- sharedlib_from_linklib_result=""
+ sharedlib_from_linklib_result=
fi
}
@@ -3709,10 +5084,11 @@ func_cygming_dll_for_implib_fallback ()
# func_extract_an_archive dir oldlib
func_extract_an_archive ()
{
- $opt_debug
- f_ex_an_ar_dir="$1"; shift
- f_ex_an_ar_oldlib="$1"
- if test "$lock_old_archive_extraction" = yes; then
+ $debug_cmd
+
+ f_ex_an_ar_dir=$1; shift
+ f_ex_an_ar_oldlib=$1
+ if test yes = "$lock_old_archive_extraction"; then
lockfile=$f_ex_an_ar_oldlib.lock
until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
func_echo "Waiting for $lockfile to be removed"
@@ -3721,7 +5097,7 @@ func_extract_an_archive ()
fi
func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
'stat=$?; rm -f "$lockfile"; exit $stat'
- if test "$lock_old_archive_extraction" = yes; then
+ if test yes = "$lock_old_archive_extraction"; then
$opt_dry_run || rm -f "$lockfile"
fi
if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
@@ -3735,22 +5111,23 @@ func_extract_an_archive ()
# func_extract_archives gentop oldlib ...
func_extract_archives ()
{
- $opt_debug
- my_gentop="$1"; shift
+ $debug_cmd
+
+ my_gentop=$1; shift
my_oldlibs=${1+"$@"}
- my_oldobjs=""
- my_xlib=""
- my_xabs=""
- my_xdir=""
+ my_oldobjs=
+ my_xlib=
+ my_xabs=
+ my_xdir=
for my_xlib in $my_oldlibs; do
# Extract the objects.
case $my_xlib in
- [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+ [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;;
*) my_xabs=`pwd`"/$my_xlib" ;;
esac
func_basename "$my_xlib"
- my_xlib="$func_basename_result"
+ my_xlib=$func_basename_result
my_xlib_u=$my_xlib
while :; do
case " $extracted_archives " in
@@ -3762,7 +5139,7 @@ func_extract_archives ()
esac
done
extracted_archives="$extracted_archives $my_xlib_u"
- my_xdir="$my_gentop/$my_xlib_u"
+ my_xdir=$my_gentop/$my_xlib_u
func_mkdir_p "$my_xdir"
@@ -3775,22 +5152,23 @@ func_extract_archives ()
cd $my_xdir || exit $?
darwin_archive=$my_xabs
darwin_curdir=`pwd`
- darwin_base_archive=`basename "$darwin_archive"`
+ func_basename "$darwin_archive"
+ darwin_base_archive=$func_basename_result
darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
if test -n "$darwin_arches"; then
darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
darwin_arch=
func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
- for darwin_arch in $darwin_arches ; do
- func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
- $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
- cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
- func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+ for darwin_arch in $darwin_arches; do
+ func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch"
+ $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive"
+ cd "unfat-$$/$darwin_base_archive-$darwin_arch"
+ func_extract_an_archive "`pwd`" "$darwin_base_archive"
cd "$darwin_curdir"
- $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+ $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive"
done # $darwin_arches
## Okay now we've a bunch of thin objects, gotta fatten them up :)
- darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
+ darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u`
darwin_file=
darwin_files=
for darwin_file in $darwin_filelist; do
@@ -3812,7 +5190,7 @@ func_extract_archives ()
my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
done
- func_extract_archives_result="$my_oldobjs"
+ func_extract_archives_result=$my_oldobjs
}
@@ -3827,7 +5205,7 @@ func_extract_archives ()
#
# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
# variable will take. If 'yes', then the emitted script
-# will assume that the directory in which it is stored is
+# will assume that the directory where it is stored is
# the $objdir directory. This is a cygwin/mingw-specific
# behavior.
func_emit_wrapper ()
@@ -3838,7 +5216,7 @@ func_emit_wrapper ()
#! $SHELL
# $output - temporary wrapper script for $objdir/$outputname
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
#
# The $output program cannot be directly executed until all the libtool
# libraries that it depends on are installed.
@@ -3895,9 +5273,9 @@ _LTECHO_EOF'
# Very basic option parsing. These options are (a) specific to
# the libtool wrapper, (b) are identical between the wrapper
-# /script/ and the wrapper /executable/ which is used only on
+# /script/ and the wrapper /executable/ that is used only on
# windows platforms, and (c) all begin with the string "--lt-"
-# (application programs are unlikely to have options which match
+# (application programs are unlikely to have options that match
# this pattern).
#
# There are only two supported options: --lt-debug and
@@ -3930,7 +5308,7 @@ func_parse_lt_options ()
# Print the debug banner immediately:
if test -n \"\$lt_option_debug\"; then
- echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2
+ echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2
fi
}
@@ -3941,7 +5319,7 @@ func_lt_dump_args ()
lt_dump_args_N=1;
for lt_arg
do
- \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\"
+ \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\"
lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
done
}
@@ -3955,7 +5333,7 @@ func_exec_program_core ()
*-*-mingw | *-*-os2* | *-cegcc*)
$ECHO "\
if test -n \"\$lt_option_debug\"; then
- \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2
+ \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2
func_lt_dump_args \${1+\"\$@\"} 1>&2
fi
exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
@@ -3965,7 +5343,7 @@ func_exec_program_core ()
*)
$ECHO "\
if test -n \"\$lt_option_debug\"; then
- \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2
+ \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2
func_lt_dump_args \${1+\"\$@\"} 1>&2
fi
exec \"\$progdir/\$program\" \${1+\"\$@\"}
@@ -3982,14 +5360,17 @@ func_exec_program_core ()
# launches target application with the remaining arguments.
func_exec_program ()
{
- for lt_wr_arg
- do
- case \$lt_wr_arg in
- --lt-*) ;;
- *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
- esac
- shift
- done
+ case \" \$* \" in
+ *\\ --lt-*)
+ for lt_wr_arg
+ do
+ case \$lt_wr_arg in
+ --lt-*) ;;
+ *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
+ esac
+ shift
+ done ;;
+ esac
func_exec_program_core \${1+\"\$@\"}
}
@@ -4037,13 +5418,13 @@ func_exec_program ()
test -n \"\$absdir\" && thisdir=\"\$absdir\"
"
- if test "$fast_install" = yes; then
+ if test yes = "$fast_install"; then
$ECHO "\
program=lt-'$outputname'$exeext
progdir=\"\$thisdir/$objdir\"
if test ! -f \"\$progdir/\$program\" ||
- { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+ { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\
test \"X\$file\" != \"X\$progdir/\$program\"; }; then
file=\"\$\$-\$program\"
@@ -4060,7 +5441,7 @@ func_exec_program ()
if test -n \"\$relink_command\"; then
if relink_command_output=\`eval \$relink_command 2>&1\`; then :
else
- $ECHO \"\$relink_command_output\" >&2
+ \$ECHO \"\$relink_command_output\" >&2
$RM \"\$progdir/\$file\"
exit 1
fi
@@ -4095,7 +5476,7 @@ func_exec_program ()
fi
# Export our shlibpath_var if we have one.
- if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+ if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
$ECHO "\
# Add our own library path to $shlibpath_var
$shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
@@ -4115,7 +5496,7 @@ func_exec_program ()
fi
else
# The program doesn't exist.
- \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+ \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2
\$ECHO \"This script is just a wrapper for \$program.\" 1>&2
\$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
exit 1
@@ -4134,7 +5515,7 @@ func_emit_cwrapperexe_src ()
cat <<EOF
/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
- Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+ Generated by $PROGRAM (GNU $PACKAGE) $VERSION
The $output program cannot be directly executed until all the libtool
libraries that it depends on are installed.
@@ -4169,47 +5550,45 @@ EOF
#include <fcntl.h>
#include <sys/stat.h>
+#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)
+
/* declarations of non-ANSI functions */
-#if defined(__MINGW32__)
+#if defined __MINGW32__
# ifdef __STRICT_ANSI__
int _putenv (const char *);
# endif
-#elif defined(__CYGWIN__)
+#elif defined __CYGWIN__
# ifdef __STRICT_ANSI__
char *realpath (const char *, char *);
int putenv (char *);
int setenv (const char *, const char *, int);
# endif
-/* #elif defined (other platforms) ... */
+/* #elif defined other_platform || defined ... */
#endif
/* portability defines, excluding path handling macros */
-#if defined(_MSC_VER)
+#if defined _MSC_VER
# define setmode _setmode
# define stat _stat
# define chmod _chmod
# define getcwd _getcwd
# define putenv _putenv
# define S_IXUSR _S_IEXEC
-# ifndef _INTPTR_T_DEFINED
-# define _INTPTR_T_DEFINED
-# define intptr_t int
-# endif
-#elif defined(__MINGW32__)
+#elif defined __MINGW32__
# define setmode _setmode
# define stat _stat
# define chmod _chmod
# define getcwd _getcwd
# define putenv _putenv
-#elif defined(__CYGWIN__)
+#elif defined __CYGWIN__
# define HAVE_SETENV
# define FOPEN_WB "wb"
-/* #elif defined (other platforms) ... */
+/* #elif defined other platforms ... */
#endif
-#if defined(PATH_MAX)
+#if defined PATH_MAX
# define LT_PATHMAX PATH_MAX
-#elif defined(MAXPATHLEN)
+#elif defined MAXPATHLEN
# define LT_PATHMAX MAXPATHLEN
#else
# define LT_PATHMAX 1024
@@ -4228,8 +5607,8 @@ int setenv (const char *, const char *, int);
# define PATH_SEPARATOR ':'
#endif
-#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
- defined (__OS2__)
+#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \
+ defined __OS2__
# define HAVE_DOS_BASED_FILE_SYSTEM
# define FOPEN_WB "wb"
# ifndef DIR_SEPARATOR_2
@@ -4262,10 +5641,10 @@ int setenv (const char *, const char *, int);
#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type)))
#define XFREE(stale) do { \
- if (stale) { free ((void *) stale); stale = 0; } \
+ if (stale) { free (stale); stale = 0; } \
} while (0)
-#if defined(LT_DEBUGWRAPPER)
+#if defined LT_DEBUGWRAPPER
static int lt_debug = 1;
#else
static int lt_debug = 0;
@@ -4294,11 +5673,16 @@ void lt_dump_script (FILE *f);
EOF
cat <<EOF
-volatile const char * MAGIC_EXE = "$magic_exe";
+#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5)
+# define externally_visible volatile
+#else
+# define externally_visible __attribute__((externally_visible)) volatile
+#endif
+externally_visible const char * MAGIC_EXE = "$magic_exe";
const char * LIB_PATH_VARNAME = "$shlibpath_var";
EOF
- if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+ if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
func_to_host_path "$temp_rpath"
cat <<EOF
const char * LIB_PATH_VALUE = "$func_to_host_path_result";
@@ -4322,7 +5706,7 @@ const char * EXE_PATH_VALUE = "";
EOF
fi
- if test "$fast_install" = yes; then
+ if test yes = "$fast_install"; then
cat <<EOF
const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
EOF
@@ -4351,12 +5735,12 @@ main (int argc, char *argv[])
char *actual_cwrapper_name;
char *target_name;
char *lt_argv_zero;
- intptr_t rval = 127;
+ int rval = 127;
int i;
program_name = (char *) xstrdup (base_name (argv[0]));
- newargz = XMALLOC (char *, argc + 1);
+ newargz = XMALLOC (char *, (size_t) argc + 1);
/* very simple arg parsing; don't want to rely on getopt
* also, copy all non cwrapper options to newargz, except
@@ -4365,10 +5749,10 @@ main (int argc, char *argv[])
newargc=0;
for (i = 1; i < argc; i++)
{
- if (strcmp (argv[i], dumpscript_opt) == 0)
+ if (STREQ (argv[i], dumpscript_opt))
{
EOF
- case "$host" in
+ case $host in
*mingw* | *cygwin* )
# make stdout use "unix" line endings
echo " setmode(1,_O_BINARY);"
@@ -4379,12 +5763,12 @@ EOF
lt_dump_script (stdout);
return 0;
}
- if (strcmp (argv[i], debug_opt) == 0)
+ if (STREQ (argv[i], debug_opt))
{
lt_debug = 1;
continue;
}
- if (strcmp (argv[i], ltwrapper_option_prefix) == 0)
+ if (STREQ (argv[i], ltwrapper_option_prefix))
{
/* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
namespace, but it is not one of the ones we know about and
@@ -4407,7 +5791,7 @@ EOF
EOF
cat <<EOF
/* The GNU banner must be the first non-error debug message */
- lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n");
+ lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE) $VERSION\n");
EOF
cat <<"EOF"
lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
@@ -4518,7 +5902,7 @@ EOF
cat <<"EOF"
/* execv doesn't actually work on mingw as expected on unix */
newargz = prepare_spawn (newargz);
- rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+ rval = (int) _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
if (rval == -1)
{
/* failed to start process */
@@ -4563,7 +5947,7 @@ base_name (const char *name)
{
const char *base;
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
/* Skip over the disk name in MSDOS pathnames. */
if (isalpha ((unsigned char) name[0]) && name[1] == ':')
name += 2;
@@ -4622,7 +6006,7 @@ find_executable (const char *wrapper)
const char *p_next;
/* static buffer for getcwd */
char tmp[LT_PATHMAX + 1];
- int tmp_len;
+ size_t tmp_len;
char *concat_name;
lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
@@ -4632,7 +6016,7 @@ find_executable (const char *wrapper)
return NULL;
/* Absolute path? */
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
{
concat_name = xstrdup (wrapper);
@@ -4650,7 +6034,7 @@ find_executable (const char *wrapper)
return concat_name;
XFREE (concat_name);
}
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
}
#endif
@@ -4673,7 +6057,7 @@ find_executable (const char *wrapper)
for (q = p; *q; q++)
if (IS_PATH_SEPARATOR (*q))
break;
- p_len = q - p;
+ p_len = (size_t) (q - p);
p_next = (*q == '\0' ? q : q + 1);
if (p_len == 0)
{
@@ -4792,7 +6176,7 @@ strendzap (char *str, const char *pat)
if (patlen <= len)
{
str += len - patlen;
- if (strcmp (str, pat) == 0)
+ if (STREQ (str, pat))
*str = '\0';
}
return str;
@@ -4857,7 +6241,7 @@ lt_setenv (const char *name, const char *value)
char *str = xstrdup (value);
setenv (name, str, 1);
#else
- int len = strlen (name) + 1 + strlen (value) + 1;
+ size_t len = strlen (name) + 1 + strlen (value) + 1;
char *str = XMALLOC (char, len);
sprintf (str, "%s=%s", name, value);
if (putenv (str) != EXIT_SUCCESS)
@@ -4874,8 +6258,8 @@ lt_extend_str (const char *orig_value, const char *add, int to_end)
char *new_value;
if (orig_value && *orig_value)
{
- int orig_value_len = strlen (orig_value);
- int add_len = strlen (add);
+ size_t orig_value_len = strlen (orig_value);
+ size_t add_len = strlen (add);
new_value = XMALLOC (char, add_len + orig_value_len + 1);
if (to_end)
{
@@ -4906,10 +6290,10 @@ lt_update_exe_path (const char *name, const char *value)
{
char *new_value = lt_extend_str (getenv (name), value, 0);
/* some systems can't cope with a ':'-terminated path #' */
- int len = strlen (new_value);
- while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+ size_t len = strlen (new_value);
+ while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
{
- new_value[len-1] = '\0';
+ new_value[--len] = '\0';
}
lt_setenv (name, new_value);
XFREE (new_value);
@@ -5057,9 +6441,15 @@ void lt_dump_script (FILE* f)
{
EOF
func_emit_wrapper yes |
- $SED -e 's/\([\\"]\)/\\\1/g' \
- -e 's/^/ fputs ("/' -e 's/$/\\n", f);/'
-
+ $SED -n -e '
+s/^\(.\{79\}\)\(..*\)/\1\
+\2/
+h
+s/\([\\"]\)/\\\1/g
+s/$/\\n/
+s/\([^\n]*\).*/ fputs ("\1", f);/p
+g
+D'
cat <<"EOF"
}
EOF
@@ -5070,27 +6460,47 @@ EOF
# True if ARG is an import lib, as indicated by $file_magic_cmd
func_win32_import_lib_p ()
{
- $opt_debug
+ $debug_cmd
+
case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
*import*) : ;;
*) false ;;
esac
}
+# func_suncc_cstd_abi
+# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!!
+# Several compiler flags select an ABI that is incompatible with the
+# Cstd library. Avoid specifying it if any are in CXXFLAGS.
+func_suncc_cstd_abi ()
+{
+ $debug_cmd
+
+ case " $compile_command " in
+ *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*)
+ suncc_use_cstd_abi=no
+ ;;
+ *)
+ suncc_use_cstd_abi=yes
+ ;;
+ esac
+}
+
# func_mode_link arg...
func_mode_link ()
{
- $opt_debug
+ $debug_cmd
+
case $host in
*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
# It is impossible to link a dll without this setting, and
# we shouldn't force the makefile maintainer to figure out
- # which system we are compiling for in order to pass an extra
+ # what system we are compiling for in order to pass an extra
# flag for every libtool invocation.
# allow_undefined=no
# FIXME: Unfortunately, there are problems with the above when trying
- # to make a dll which has undefined symbols, in which case not
+ # to make a dll that has undefined symbols, in which case not
# even a static library is built. For now, we need to specify
# -no-undefined on the libtool link line when we can be certain
# that all symbols are satisfied, otherwise we get a static library.
@@ -5134,10 +6544,11 @@ func_mode_link ()
module=no
no_install=no
objs=
+ os2dllname=
non_pic_objects=
precious_files_regex=
prefer_static_libs=no
- preload=no
+ preload=false
prev=
prevarg=
release=
@@ -5149,7 +6560,7 @@ func_mode_link ()
vinfo=
vinfo_number=no
weak_libs=
- single_module="${wl}-single_module"
+ single_module=$wl-single_module
func_infer_tag $base_compile
# We need to know -static, to get the right output filenames.
@@ -5157,15 +6568,15 @@ func_mode_link ()
do
case $arg in
-shared)
- test "$build_libtool_libs" != yes && \
- func_fatal_configuration "can not build a shared library"
+ test yes != "$build_libtool_libs" \
+ && func_fatal_configuration "cannot build a shared library"
build_old_libs=no
break
;;
-all-static | -static | -static-libtool-libs)
case $arg in
-all-static)
- if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+ if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then
func_warning "complete static linking is impossible in this configuration"
fi
if test -n "$link_static_flag"; then
@@ -5198,7 +6609,7 @@ func_mode_link ()
# Go through the arguments, transforming them on the way.
while test "$#" -gt 0; do
- arg="$1"
+ arg=$1
shift
func_quote_for_eval "$arg"
qarg=$func_quote_for_eval_unquoted_result
@@ -5215,21 +6626,21 @@ func_mode_link ()
case $prev in
bindir)
- bindir="$arg"
+ bindir=$arg
prev=
continue
;;
dlfiles|dlprefiles)
- if test "$preload" = no; then
+ $preload || {
# Add the symbol object into the linking commands.
func_append compile_command " @SYMFILE@"
func_append finalize_command " @SYMFILE@"
- preload=yes
- fi
+ preload=:
+ }
case $arg in
*.la | *.lo) ;; # We handle these cases below.
force)
- if test "$dlself" = no; then
+ if test no = "$dlself"; then
dlself=needless
export_dynamic=yes
fi
@@ -5237,9 +6648,9 @@ func_mode_link ()
continue
;;
self)
- if test "$prev" = dlprefiles; then
+ if test dlprefiles = "$prev"; then
dlself=yes
- elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+ elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then
dlself=yes
else
dlself=needless
@@ -5249,7 +6660,7 @@ func_mode_link ()
continue
;;
*)
- if test "$prev" = dlfiles; then
+ if test dlfiles = "$prev"; then
func_append dlfiles " $arg"
else
func_append dlprefiles " $arg"
@@ -5260,14 +6671,14 @@ func_mode_link ()
esac
;;
expsyms)
- export_symbols="$arg"
+ export_symbols=$arg
test -f "$arg" \
- || func_fatal_error "symbol file \`$arg' does not exist"
+ || func_fatal_error "symbol file '$arg' does not exist"
prev=
continue
;;
expsyms_regex)
- export_symbols_regex="$arg"
+ export_symbols_regex=$arg
prev=
continue
;;
@@ -5285,7 +6696,13 @@ func_mode_link ()
continue
;;
inst_prefix)
- inst_prefix_dir="$arg"
+ inst_prefix_dir=$arg
+ prev=
+ continue
+ ;;
+ mllvm)
+ # Clang does not use LLVM to link, so we can simply discard any
+ # '-mllvm $arg' options when doing the link step.
prev=
continue
;;
@@ -5309,21 +6726,21 @@ func_mode_link ()
if test -z "$pic_object" ||
test -z "$non_pic_object" ||
- test "$pic_object" = none &&
- test "$non_pic_object" = none; then
- func_fatal_error "cannot find name of object for \`$arg'"
+ test none = "$pic_object" &&
+ test none = "$non_pic_object"; then
+ func_fatal_error "cannot find name of object for '$arg'"
fi
# Extract subdirectory from the argument.
func_dirname "$arg" "/" ""
- xdir="$func_dirname_result"
+ xdir=$func_dirname_result
- if test "$pic_object" != none; then
+ if test none != "$pic_object"; then
# Prepend the subdirectory the object is found in.
- pic_object="$xdir$pic_object"
+ pic_object=$xdir$pic_object
- if test "$prev" = dlfiles; then
- if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+ if test dlfiles = "$prev"; then
+ if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then
func_append dlfiles " $pic_object"
prev=
continue
@@ -5334,7 +6751,7 @@ func_mode_link ()
fi
# CHECK ME: I think I busted this. -Ossama
- if test "$prev" = dlprefiles; then
+ if test dlprefiles = "$prev"; then
# Preload the old-style object.
func_append dlprefiles " $pic_object"
prev=
@@ -5342,23 +6759,23 @@ func_mode_link ()
# A PIC object.
func_append libobjs " $pic_object"
- arg="$pic_object"
+ arg=$pic_object
fi
# Non-PIC object.
- if test "$non_pic_object" != none; then
+ if test none != "$non_pic_object"; then
# Prepend the subdirectory the object is found in.
- non_pic_object="$xdir$non_pic_object"
+ non_pic_object=$xdir$non_pic_object
# A standard non-PIC object
func_append non_pic_objects " $non_pic_object"
- if test -z "$pic_object" || test "$pic_object" = none ; then
- arg="$non_pic_object"
+ if test -z "$pic_object" || test none = "$pic_object"; then
+ arg=$non_pic_object
fi
else
# If the PIC object exists, use it instead.
# $xdir was prepended to $pic_object above.
- non_pic_object="$pic_object"
+ non_pic_object=$pic_object
func_append non_pic_objects " $non_pic_object"
fi
else
@@ -5366,7 +6783,7 @@ func_mode_link ()
if $opt_dry_run; then
# Extract subdirectory from the argument.
func_dirname "$arg" "/" ""
- xdir="$func_dirname_result"
+ xdir=$func_dirname_result
func_lo2o "$arg"
pic_object=$xdir$objdir/$func_lo2o_result
@@ -5374,24 +6791,29 @@ func_mode_link ()
func_append libobjs " $pic_object"
func_append non_pic_objects " $non_pic_object"
else
- func_fatal_error "\`$arg' is not a valid libtool object"
+ func_fatal_error "'$arg' is not a valid libtool object"
fi
fi
done
else
- func_fatal_error "link input file \`$arg' does not exist"
+ func_fatal_error "link input file '$arg' does not exist"
fi
arg=$save_arg
prev=
continue
;;
+ os2dllname)
+ os2dllname=$arg
+ prev=
+ continue
+ ;;
precious_regex)
- precious_files_regex="$arg"
+ precious_files_regex=$arg
prev=
continue
;;
release)
- release="-$arg"
+ release=-$arg
prev=
continue
;;
@@ -5403,7 +6825,7 @@ func_mode_link ()
func_fatal_error "only absolute run-paths are allowed"
;;
esac
- if test "$prev" = rpath; then
+ if test rpath = "$prev"; then
case "$rpath " in
*" $arg "*) ;;
*) func_append rpath " $arg" ;;
@@ -5418,7 +6840,7 @@ func_mode_link ()
continue
;;
shrext)
- shrext_cmds="$arg"
+ shrext_cmds=$arg
prev=
continue
;;
@@ -5458,7 +6880,7 @@ func_mode_link ()
esac
fi # test -n "$prev"
- prevarg="$arg"
+ prevarg=$arg
case $arg in
-all-static)
@@ -5472,7 +6894,7 @@ func_mode_link ()
-allow-undefined)
# FIXME: remove this flag sometime in the future.
- func_fatal_error "\`-allow-undefined' must not be used because it is the default"
+ func_fatal_error "'-allow-undefined' must not be used because it is the default"
;;
-avoid-version)
@@ -5504,7 +6926,7 @@ func_mode_link ()
if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
func_fatal_error "more than one -exported-symbols argument is not allowed"
fi
- if test "X$arg" = "X-export-symbols"; then
+ if test X-export-symbols = "X$arg"; then
prev=expsyms
else
prev=expsyms_regex
@@ -5538,9 +6960,9 @@ func_mode_link ()
func_stripname "-L" '' "$arg"
if test -z "$func_stripname_result"; then
if test "$#" -gt 0; then
- func_fatal_error "require no space between \`-L' and \`$1'"
+ func_fatal_error "require no space between '-L' and '$1'"
else
- func_fatal_error "need path for \`-L' option"
+ func_fatal_error "need path for '-L' option"
fi
fi
func_resolve_sysroot "$func_stripname_result"
@@ -5551,8 +6973,8 @@ func_mode_link ()
*)
absdir=`cd "$dir" && pwd`
test -z "$absdir" && \
- func_fatal_error "cannot determine absolute directory name of \`$dir'"
- dir="$absdir"
+ func_fatal_error "cannot determine absolute directory name of '$dir'"
+ dir=$absdir
;;
esac
case "$deplibs " in
@@ -5587,7 +7009,7 @@ func_mode_link ()
;;
-l*)
- if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+ if test X-lc = "X$arg" || test X-lm = "X$arg"; then
case $host in
*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
# These systems don't actually have a C or math library (as such)
@@ -5595,11 +7017,11 @@ func_mode_link ()
;;
*-*-os2*)
# These systems don't actually have a C library (as such)
- test "X$arg" = "X-lc" && continue
+ test X-lc = "X$arg" && continue
;;
- *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
# Do not include libc due to us having libc/libc_r.
- test "X$arg" = "X-lc" && continue
+ test X-lc = "X$arg" && continue
;;
*-*-rhapsody* | *-*-darwin1.[012])
# Rhapsody C and math libraries are in the System framework
@@ -5608,16 +7030,16 @@ func_mode_link ()
;;
*-*-sco3.2v5* | *-*-sco5v6*)
# Causes problems with __ctype
- test "X$arg" = "X-lc" && continue
+ test X-lc = "X$arg" && continue
;;
*-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
# Compiler inserts libc in the correct place for threads to work
- test "X$arg" = "X-lc" && continue
+ test X-lc = "X$arg" && continue
;;
esac
- elif test "X$arg" = "X-lc_r"; then
+ elif test X-lc_r = "X$arg"; then
case $host in
- *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+ *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
# Do not include libc_r directly, use -pthread flag.
continue
;;
@@ -5627,6 +7049,11 @@ func_mode_link ()
continue
;;
+ -mllvm)
+ prev=mllvm
+ continue
+ ;;
+
-module)
module=yes
continue
@@ -5643,7 +7070,8 @@ func_mode_link ()
continue
;;
- -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
+ -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
func_append compiler_flags " $arg"
func_append compile_command " $arg"
func_append finalize_command " $arg"
@@ -5655,7 +7083,7 @@ func_mode_link ()
;;
-multi_module)
- single_module="${wl}-multi_module"
+ single_module=$wl-multi_module
continue
;;
@@ -5669,8 +7097,8 @@ func_mode_link ()
*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
# The PATH hackery in wrapper scripts is required on Windows
# and Darwin in order for the loader to find any dlls it needs.
- func_warning "\`-no-install' is ignored for $host"
- func_warning "assuming \`-no-fast-install' instead"
+ func_warning "'-no-install' is ignored for $host"
+ func_warning "assuming '-no-fast-install' instead"
fast_install=no
;;
*) no_install=yes ;;
@@ -5688,6 +7116,11 @@ func_mode_link ()
continue
;;
+ -os2dllname)
+ prev=os2dllname
+ continue
+ ;;
+
-o) prev=output ;;
-precious-files-regex)
@@ -5775,14 +7208,14 @@ func_mode_link ()
func_stripname '-Wc,' '' "$arg"
args=$func_stripname_result
arg=
- save_ifs="$IFS"; IFS=','
+ save_ifs=$IFS; IFS=,
for flag in $args; do
- IFS="$save_ifs"
+ IFS=$save_ifs
func_quote_for_eval "$flag"
func_append arg " $func_quote_for_eval_result"
func_append compiler_flags " $func_quote_for_eval_result"
done
- IFS="$save_ifs"
+ IFS=$save_ifs
func_stripname ' ' '' "$arg"
arg=$func_stripname_result
;;
@@ -5791,15 +7224,15 @@ func_mode_link ()
func_stripname '-Wl,' '' "$arg"
args=$func_stripname_result
arg=
- save_ifs="$IFS"; IFS=','
+ save_ifs=$IFS; IFS=,
for flag in $args; do
- IFS="$save_ifs"
+ IFS=$save_ifs
func_quote_for_eval "$flag"
func_append arg " $wl$func_quote_for_eval_result"
func_append compiler_flags " $wl$func_quote_for_eval_result"
func_append linker_flags " $func_quote_for_eval_result"
done
- IFS="$save_ifs"
+ IFS=$save_ifs
func_stripname ' ' '' "$arg"
arg=$func_stripname_result
;;
@@ -5822,7 +7255,7 @@ func_mode_link ()
# -msg_* for osf cc
-msg_*)
func_quote_for_eval "$arg"
- arg="$func_quote_for_eval_result"
+ arg=$func_quote_for_eval_result
;;
# Flags to be passed through unchanged, with rationale:
@@ -5834,25 +7267,46 @@ func_mode_link ()
# -m*, -t[45]*, -txscale* architecture-specific flags for GCC
# -F/path path to uninstalled frameworks, gcc on darwin
# -p, -pg, --coverage, -fprofile-* profiling flags for GCC
+ # -fstack-protector* stack protector flags for GCC
# @file GCC response files
# -tp=* Portland pgcc target processor selection
# --sysroot=* for sysroot support
- # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+ # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+ # -stdlib=* select c++ std lib with clang
-64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
-t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
- -O*|-flto*|-fwhopr*|-fuse-linker-plugin)
+ -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*)
func_quote_for_eval "$arg"
- arg="$func_quote_for_eval_result"
+ arg=$func_quote_for_eval_result
func_append compile_command " $arg"
func_append finalize_command " $arg"
func_append compiler_flags " $arg"
continue
;;
+ -Z*)
+ if test os2 = "`expr $host : '.*\(os2\)'`"; then
+ # OS/2 uses -Zxxx to specify OS/2-specific options
+ compiler_flags="$compiler_flags $arg"
+ func_append compile_command " $arg"
+ func_append finalize_command " $arg"
+ case $arg in
+ -Zlinker | -Zstack)
+ prev=xcompiler
+ ;;
+ esac
+ continue
+ else
+ # Otherwise treat like 'Some other compiler flag' below
+ func_quote_for_eval "$arg"
+ arg=$func_quote_for_eval_result
+ fi
+ ;;
+
# Some other compiler flag.
-* | +*)
func_quote_for_eval "$arg"
- arg="$func_quote_for_eval_result"
+ arg=$func_quote_for_eval_result
;;
*.$objext)
@@ -5873,21 +7327,21 @@ func_mode_link ()
if test -z "$pic_object" ||
test -z "$non_pic_object" ||
- test "$pic_object" = none &&
- test "$non_pic_object" = none; then
- func_fatal_error "cannot find name of object for \`$arg'"
+ test none = "$pic_object" &&
+ test none = "$non_pic_object"; then
+ func_fatal_error "cannot find name of object for '$arg'"
fi
# Extract subdirectory from the argument.
func_dirname "$arg" "/" ""
- xdir="$func_dirname_result"
+ xdir=$func_dirname_result
- if test "$pic_object" != none; then
+ test none = "$pic_object" || {
# Prepend the subdirectory the object is found in.
- pic_object="$xdir$pic_object"
+ pic_object=$xdir$pic_object
- if test "$prev" = dlfiles; then
- if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+ if test dlfiles = "$prev"; then
+ if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then
func_append dlfiles " $pic_object"
prev=
continue
@@ -5898,7 +7352,7 @@ func_mode_link ()
fi
# CHECK ME: I think I busted this. -Ossama
- if test "$prev" = dlprefiles; then
+ if test dlprefiles = "$prev"; then
# Preload the old-style object.
func_append dlprefiles " $pic_object"
prev=
@@ -5906,23 +7360,23 @@ func_mode_link ()
# A PIC object.
func_append libobjs " $pic_object"
- arg="$pic_object"
- fi
+ arg=$pic_object
+ }
# Non-PIC object.
- if test "$non_pic_object" != none; then
+ if test none != "$non_pic_object"; then
# Prepend the subdirectory the object is found in.
- non_pic_object="$xdir$non_pic_object"
+ non_pic_object=$xdir$non_pic_object
# A standard non-PIC object
func_append non_pic_objects " $non_pic_object"
- if test -z "$pic_object" || test "$pic_object" = none ; then
- arg="$non_pic_object"
+ if test -z "$pic_object" || test none = "$pic_object"; then
+ arg=$non_pic_object
fi
else
# If the PIC object exists, use it instead.
# $xdir was prepended to $pic_object above.
- non_pic_object="$pic_object"
+ non_pic_object=$pic_object
func_append non_pic_objects " $non_pic_object"
fi
else
@@ -5930,7 +7384,7 @@ func_mode_link ()
if $opt_dry_run; then
# Extract subdirectory from the argument.
func_dirname "$arg" "/" ""
- xdir="$func_dirname_result"
+ xdir=$func_dirname_result
func_lo2o "$arg"
pic_object=$xdir$objdir/$func_lo2o_result
@@ -5938,7 +7392,7 @@ func_mode_link ()
func_append libobjs " $pic_object"
func_append non_pic_objects " $non_pic_object"
else
- func_fatal_error "\`$arg' is not a valid libtool object"
+ func_fatal_error "'$arg' is not a valid libtool object"
fi
fi
;;
@@ -5954,11 +7408,11 @@ func_mode_link ()
# A libtool-controlled library.
func_resolve_sysroot "$arg"
- if test "$prev" = dlfiles; then
+ if test dlfiles = "$prev"; then
# This library was specified with -dlopen.
func_append dlfiles " $func_resolve_sysroot_result"
prev=
- elif test "$prev" = dlprefiles; then
+ elif test dlprefiles = "$prev"; then
# The library was specified with -dlpreopen.
func_append dlprefiles " $func_resolve_sysroot_result"
prev=
@@ -5973,7 +7427,7 @@ func_mode_link ()
# Unknown arguments in both finalize_command and compile_command need
# to be aesthetically quoted because they are evaled later.
func_quote_for_eval "$arg"
- arg="$func_quote_for_eval_result"
+ arg=$func_quote_for_eval_result
;;
esac # arg
@@ -5985,9 +7439,9 @@ func_mode_link ()
done # argument parsing loop
test -n "$prev" && \
- func_fatal_help "the \`$prevarg' option requires an argument"
+ func_fatal_help "the '$prevarg' option requires an argument"
- if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+ if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then
eval arg=\"$export_dynamic_flag_spec\"
func_append compile_command " $arg"
func_append finalize_command " $arg"
@@ -5996,20 +7450,23 @@ func_mode_link ()
oldlibs=
# calculate the name of the file, without its directory
func_basename "$output"
- outputname="$func_basename_result"
- libobjs_save="$libobjs"
+ outputname=$func_basename_result
+ libobjs_save=$libobjs
if test -n "$shlibpath_var"; then
# get the directories listed in $shlibpath_var
- eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
+ eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\`
else
shlib_search_path=
fi
eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+ # Definition is injected by LT_CONFIG during libtool generation.
+ func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH"
+
func_dirname "$output" "/" ""
- output_objdir="$func_dirname_result$objdir"
+ output_objdir=$func_dirname_result$objdir
func_to_tool_file "$output_objdir/"
tool_output_objdir=$func_to_tool_file_result
# Create the object directory.
@@ -6032,7 +7489,7 @@ func_mode_link ()
# Find all interdependent deplibs by searching for libraries
# that are linked more than once (e.g. -la -lb -la)
for deplib in $deplibs; do
- if $opt_preserve_dup_deps ; then
+ if $opt_preserve_dup_deps; then
case "$libs " in
*" $deplib "*) func_append specialdeplibs " $deplib" ;;
esac
@@ -6040,7 +7497,7 @@ func_mode_link ()
func_append libs " $deplib"
done
- if test "$linkmode" = lib; then
+ if test lib = "$linkmode"; then
libs="$predeps $libs $compiler_lib_search_path $postdeps"
# Compute libraries that are listed more than once in $predeps
@@ -6072,7 +7529,7 @@ func_mode_link ()
case $file in
*.la) ;;
*)
- func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
+ func_fatal_help "libraries can '-dlopen' only libtool libraries: $file"
;;
esac
done
@@ -6080,7 +7537,7 @@ func_mode_link ()
prog)
compile_deplibs=
finalize_deplibs=
- alldeplibs=no
+ alldeplibs=false
newdlfiles=
newdlprefiles=
passes="conv scan dlopen dlpreopen link"
@@ -6092,29 +7549,29 @@ func_mode_link ()
for pass in $passes; do
# The preopen pass in lib mode reverses $deplibs; put it back here
# so that -L comes before libs that need it for instance...
- if test "$linkmode,$pass" = "lib,link"; then
+ if test lib,link = "$linkmode,$pass"; then
## FIXME: Find the place where the list is rebuilt in the wrong
## order, and fix it there properly
tmp_deplibs=
for deplib in $deplibs; do
tmp_deplibs="$deplib $tmp_deplibs"
done
- deplibs="$tmp_deplibs"
+ deplibs=$tmp_deplibs
fi
- if test "$linkmode,$pass" = "lib,link" ||
- test "$linkmode,$pass" = "prog,scan"; then
- libs="$deplibs"
+ if test lib,link = "$linkmode,$pass" ||
+ test prog,scan = "$linkmode,$pass"; then
+ libs=$deplibs
deplibs=
fi
- if test "$linkmode" = prog; then
+ if test prog = "$linkmode"; then
case $pass in
- dlopen) libs="$dlfiles" ;;
- dlpreopen) libs="$dlprefiles" ;;
+ dlopen) libs=$dlfiles ;;
+ dlpreopen) libs=$dlprefiles ;;
link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
esac
fi
- if test "$linkmode,$pass" = "lib,dlpreopen"; then
+ if test lib,dlpreopen = "$linkmode,$pass"; then
# Collect and forward deplibs of preopened libtool libs
for lib in $dlprefiles; do
# Ignore non-libtool-libs
@@ -6135,25 +7592,26 @@ func_mode_link ()
esac
done
done
- libs="$dlprefiles"
+ libs=$dlprefiles
fi
- if test "$pass" = dlopen; then
+ if test dlopen = "$pass"; then
# Collect dlpreopened libraries
- save_deplibs="$deplibs"
+ save_deplibs=$deplibs
deplibs=
fi
for deplib in $libs; do
lib=
- found=no
+ found=false
case $deplib in
- -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)
- if test "$linkmode,$pass" = "prog,link"; then
+ -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+ if test prog,link = "$linkmode,$pass"; then
compile_deplibs="$deplib $compile_deplibs"
finalize_deplibs="$deplib $finalize_deplibs"
else
func_append compiler_flags " $deplib"
- if test "$linkmode" = lib ; then
+ if test lib = "$linkmode"; then
case "$new_inherited_linker_flags " in
*" $deplib "*) ;;
* ) func_append new_inherited_linker_flags " $deplib" ;;
@@ -6163,13 +7621,13 @@ func_mode_link ()
continue
;;
-l*)
- if test "$linkmode" != lib && test "$linkmode" != prog; then
- func_warning "\`-l' is ignored for archives/objects"
+ if test lib != "$linkmode" && test prog != "$linkmode"; then
+ func_warning "'-l' is ignored for archives/objects"
continue
fi
func_stripname '-l' '' "$deplib"
name=$func_stripname_result
- if test "$linkmode" = lib; then
+ if test lib = "$linkmode"; then
searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
else
searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
@@ -6177,31 +7635,22 @@ func_mode_link ()
for searchdir in $searchdirs; do
for search_ext in .la $std_shrext .so .a; do
# Search the libtool library
- lib="$searchdir/lib${name}${search_ext}"
+ lib=$searchdir/lib$name$search_ext
if test -f "$lib"; then
- if test "$search_ext" = ".la"; then
- found=yes
+ if test .la = "$search_ext"; then
+ found=:
else
- found=no
+ found=false
fi
break 2
fi
done
done
- if test "$found" != yes; then
- # deplib doesn't seem to be a libtool library
- if test "$linkmode,$pass" = "prog,link"; then
- compile_deplibs="$deplib $compile_deplibs"
- finalize_deplibs="$deplib $finalize_deplibs"
- else
- deplibs="$deplib $deplibs"
- test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
- fi
- continue
- else # deplib is a libtool library
+ if $found; then
+ # deplib is a libtool library
# If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
# We need to do some special things here, and not later.
- if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ if test yes = "$allow_libtool_libs_with_static_runtimes"; then
case " $predeps $postdeps " in
*" $deplib "*)
if func_lalib_p "$lib"; then
@@ -6209,19 +7658,19 @@ func_mode_link ()
old_library=
func_source "$lib"
for l in $old_library $library_names; do
- ll="$l"
+ ll=$l
done
- if test "X$ll" = "X$old_library" ; then # only static version available
- found=no
+ if test "X$ll" = "X$old_library"; then # only static version available
+ found=false
func_dirname "$lib" "" "."
- ladir="$func_dirname_result"
+ ladir=$func_dirname_result
lib=$ladir/$old_library
- if test "$linkmode,$pass" = "prog,link"; then
+ if test prog,link = "$linkmode,$pass"; then
compile_deplibs="$deplib $compile_deplibs"
finalize_deplibs="$deplib $finalize_deplibs"
else
deplibs="$deplib $deplibs"
- test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+ test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs"
fi
continue
fi
@@ -6230,15 +7679,25 @@ func_mode_link ()
*) ;;
esac
fi
+ else
+ # deplib doesn't seem to be a libtool library
+ if test prog,link = "$linkmode,$pass"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ deplibs="$deplib $deplibs"
+ test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs"
+ fi
+ continue
fi
;; # -l
*.ltframework)
- if test "$linkmode,$pass" = "prog,link"; then
+ if test prog,link = "$linkmode,$pass"; then
compile_deplibs="$deplib $compile_deplibs"
finalize_deplibs="$deplib $finalize_deplibs"
else
deplibs="$deplib $deplibs"
- if test "$linkmode" = lib ; then
+ if test lib = "$linkmode"; then
case "$new_inherited_linker_flags " in
*" $deplib "*) ;;
* ) func_append new_inherited_linker_flags " $deplib" ;;
@@ -6251,18 +7710,18 @@ func_mode_link ()
case $linkmode in
lib)
deplibs="$deplib $deplibs"
- test "$pass" = conv && continue
+ test conv = "$pass" && continue
newdependency_libs="$deplib $newdependency_libs"
func_stripname '-L' '' "$deplib"
func_resolve_sysroot "$func_stripname_result"
func_append newlib_search_path " $func_resolve_sysroot_result"
;;
prog)
- if test "$pass" = conv; then
+ if test conv = "$pass"; then
deplibs="$deplib $deplibs"
continue
fi
- if test "$pass" = scan; then
+ if test scan = "$pass"; then
deplibs="$deplib $deplibs"
else
compile_deplibs="$deplib $compile_deplibs"
@@ -6273,13 +7732,13 @@ func_mode_link ()
func_append newlib_search_path " $func_resolve_sysroot_result"
;;
*)
- func_warning "\`-L' is ignored for archives/objects"
+ func_warning "'-L' is ignored for archives/objects"
;;
esac # linkmode
continue
;; # -L
-R*)
- if test "$pass" = link; then
+ if test link = "$pass"; then
func_stripname '-R' '' "$deplib"
func_resolve_sysroot "$func_stripname_result"
dir=$func_resolve_sysroot_result
@@ -6297,7 +7756,7 @@ func_mode_link ()
lib=$func_resolve_sysroot_result
;;
*.$libext)
- if test "$pass" = conv; then
+ if test conv = "$pass"; then
deplibs="$deplib $deplibs"
continue
fi
@@ -6308,21 +7767,26 @@ func_mode_link ()
case " $dlpreconveniencelibs " in
*" $deplib "*) ;;
*)
- valid_a_lib=no
+ valid_a_lib=false
case $deplibs_check_method in
match_pattern*)
set dummy $deplibs_check_method; shift
match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
| $EGREP "$match_pattern_regex" > /dev/null; then
- valid_a_lib=yes
+ valid_a_lib=:
fi
;;
pass_all)
- valid_a_lib=yes
+ valid_a_lib=:
;;
esac
- if test "$valid_a_lib" != yes; then
+ if $valid_a_lib; then
+ echo
+ $ECHO "*** Warning: Linking the shared library $output against the"
+ $ECHO "*** static library $deplib is not portable!"
+ deplibs="$deplib $deplibs"
+ else
echo
$ECHO "*** Warning: Trying to link with static lib archive $deplib."
echo "*** I have the capability to make that library automatically link in when"
@@ -6330,18 +7794,13 @@ func_mode_link ()
echo "*** shared version of the library, which you do not appear to have"
echo "*** because the file extensions .$libext of this argument makes me believe"
echo "*** that it is just a static archive that I should not use here."
- else
- echo
- $ECHO "*** Warning: Linking the shared library $output against the"
- $ECHO "*** static library $deplib is not portable!"
- deplibs="$deplib $deplibs"
fi
;;
esac
continue
;;
prog)
- if test "$pass" != link; then
+ if test link != "$pass"; then
deplibs="$deplib $deplibs"
else
compile_deplibs="$deplib $compile_deplibs"
@@ -6352,10 +7811,10 @@ func_mode_link ()
esac # linkmode
;; # *.$libext
*.lo | *.$objext)
- if test "$pass" = conv; then
+ if test conv = "$pass"; then
deplibs="$deplib $deplibs"
- elif test "$linkmode" = prog; then
- if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+ elif test prog = "$linkmode"; then
+ if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then
# If there is no dlopen support or we're linking statically,
# we need to preload.
func_append newdlprefiles " $deplib"
@@ -6368,22 +7827,20 @@ func_mode_link ()
continue
;;
%DEPLIBS%)
- alldeplibs=yes
+ alldeplibs=:
continue
;;
esac # case $deplib
- if test "$found" = yes || test -f "$lib"; then :
- else
- func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
- fi
+ $found || test -f "$lib" \
+ || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'"
# Check to see that this really is a libtool archive.
func_lalib_unsafe_p "$lib" \
- || func_fatal_error "\`$lib' is not a valid libtool archive"
+ || func_fatal_error "'$lib' is not a valid libtool archive"
func_dirname "$lib" "" "."
- ladir="$func_dirname_result"
+ ladir=$func_dirname_result
dlname=
dlopen=
@@ -6413,30 +7870,30 @@ func_mode_link ()
done
fi
dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
- if test "$linkmode,$pass" = "lib,link" ||
- test "$linkmode,$pass" = "prog,scan" ||
- { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+ if test lib,link = "$linkmode,$pass" ||
+ test prog,scan = "$linkmode,$pass" ||
+ { test prog != "$linkmode" && test lib != "$linkmode"; }; then
test -n "$dlopen" && func_append dlfiles " $dlopen"
test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
fi
- if test "$pass" = conv; then
+ if test conv = "$pass"; then
# Only check for convenience libraries
deplibs="$lib $deplibs"
if test -z "$libdir"; then
if test -z "$old_library"; then
- func_fatal_error "cannot find name of link library for \`$lib'"
+ func_fatal_error "cannot find name of link library for '$lib'"
fi
# It is a libtool convenience library, so add in its objects.
func_append convenience " $ladir/$objdir/$old_library"
func_append old_convenience " $ladir/$objdir/$old_library"
- elif test "$linkmode" != prog && test "$linkmode" != lib; then
- func_fatal_error "\`$lib' is not a convenience library"
+ elif test prog != "$linkmode" && test lib != "$linkmode"; then
+ func_fatal_error "'$lib' is not a convenience library"
fi
tmp_libs=
for deplib in $dependency_libs; do
deplibs="$deplib $deplibs"
- if $opt_preserve_dup_deps ; then
+ if $opt_preserve_dup_deps; then
case "$tmp_libs " in
*" $deplib "*) func_append specialdeplibs " $deplib" ;;
esac
@@ -6450,26 +7907,26 @@ func_mode_link ()
# Get the name of the library we link against.
linklib=
if test -n "$old_library" &&
- { test "$prefer_static_libs" = yes ||
- test "$prefer_static_libs,$installed" = "built,no"; }; then
+ { test yes = "$prefer_static_libs" ||
+ test built,no = "$prefer_static_libs,$installed"; }; then
linklib=$old_library
else
for l in $old_library $library_names; do
- linklib="$l"
+ linklib=$l
done
fi
if test -z "$linklib"; then
- func_fatal_error "cannot find name of link library for \`$lib'"
+ func_fatal_error "cannot find name of link library for '$lib'"
fi
# This library was specified with -dlopen.
- if test "$pass" = dlopen; then
- if test -z "$libdir"; then
- func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
- fi
+ if test dlopen = "$pass"; then
+ test -z "$libdir" \
+ && func_fatal_error "cannot -dlopen a convenience library: '$lib'"
if test -z "$dlname" ||
- test "$dlopen_support" != yes ||
- test "$build_libtool_libs" = no; then
+ test yes != "$dlopen_support" ||
+ test no = "$build_libtool_libs"
+ then
# If there is no dlname, no dlopen support or we're linking
# statically, we need to preload. We also need to preload any
# dependent libraries so libltdl's deplib preloader doesn't
@@ -6483,40 +7940,40 @@ func_mode_link ()
# We need an absolute path.
case $ladir in
- [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+ [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;;
*)
abs_ladir=`cd "$ladir" && pwd`
if test -z "$abs_ladir"; then
- func_warning "cannot determine absolute directory name of \`$ladir'"
+ func_warning "cannot determine absolute directory name of '$ladir'"
func_warning "passing it literally to the linker, although it might fail"
- abs_ladir="$ladir"
+ abs_ladir=$ladir
fi
;;
esac
func_basename "$lib"
- laname="$func_basename_result"
+ laname=$func_basename_result
# Find the relevant object directory and library name.
- if test "X$installed" = Xyes; then
+ if test yes = "$installed"; then
if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
- func_warning "library \`$lib' was moved."
- dir="$ladir"
- absdir="$abs_ladir"
- libdir="$abs_ladir"
+ func_warning "library '$lib' was moved."
+ dir=$ladir
+ absdir=$abs_ladir
+ libdir=$abs_ladir
else
- dir="$lt_sysroot$libdir"
- absdir="$lt_sysroot$libdir"
+ dir=$lt_sysroot$libdir
+ absdir=$lt_sysroot$libdir
fi
- test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+ test yes = "$hardcode_automatic" && avoidtemprpath=yes
else
if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
- dir="$ladir"
- absdir="$abs_ladir"
+ dir=$ladir
+ absdir=$abs_ladir
# Remove this search path later
func_append notinst_path " $abs_ladir"
else
- dir="$ladir/$objdir"
- absdir="$abs_ladir/$objdir"
+ dir=$ladir/$objdir
+ absdir=$abs_ladir/$objdir
# Remove this search path later
func_append notinst_path " $abs_ladir"
fi
@@ -6525,11 +7982,11 @@ func_mode_link ()
name=$func_stripname_result
# This library was specified with -dlpreopen.
- if test "$pass" = dlpreopen; then
- if test -z "$libdir" && test "$linkmode" = prog; then
- func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
+ if test dlpreopen = "$pass"; then
+ if test -z "$libdir" && test prog = "$linkmode"; then
+ func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'"
fi
- case "$host" in
+ case $host in
# special handling for platforms with PE-DLLs.
*cygwin* | *mingw* | *cegcc* )
# Linker will automatically link against shared library if both
@@ -6573,9 +8030,9 @@ func_mode_link ()
if test -z "$libdir"; then
# Link the convenience library
- if test "$linkmode" = lib; then
+ if test lib = "$linkmode"; then
deplibs="$dir/$old_library $deplibs"
- elif test "$linkmode,$pass" = "prog,link"; then
+ elif test prog,link = "$linkmode,$pass"; then
compile_deplibs="$dir/$old_library $compile_deplibs"
finalize_deplibs="$dir/$old_library $finalize_deplibs"
else
@@ -6585,14 +8042,14 @@ func_mode_link ()
fi
- if test "$linkmode" = prog && test "$pass" != link; then
+ if test prog = "$linkmode" && test link != "$pass"; then
func_append newlib_search_path " $ladir"
deplibs="$lib $deplibs"
- linkalldeplibs=no
- if test "$link_all_deplibs" != no || test -z "$library_names" ||
- test "$build_libtool_libs" = no; then
- linkalldeplibs=yes
+ linkalldeplibs=false
+ if test no != "$link_all_deplibs" || test -z "$library_names" ||
+ test no = "$build_libtool_libs"; then
+ linkalldeplibs=:
fi
tmp_libs=
@@ -6604,14 +8061,14 @@ func_mode_link ()
;;
esac
# Need to link against all dependency_libs?
- if test "$linkalldeplibs" = yes; then
+ if $linkalldeplibs; then
deplibs="$deplib $deplibs"
else
# Need to hardcode shared library paths
# or/and link against static libraries
newdependency_libs="$deplib $newdependency_libs"
fi
- if $opt_preserve_dup_deps ; then
+ if $opt_preserve_dup_deps; then
case "$tmp_libs " in
*" $deplib "*) func_append specialdeplibs " $deplib" ;;
esac
@@ -6621,15 +8078,15 @@ func_mode_link ()
continue
fi # $linkmode = prog...
- if test "$linkmode,$pass" = "prog,link"; then
+ if test prog,link = "$linkmode,$pass"; then
if test -n "$library_names" &&
- { { test "$prefer_static_libs" = no ||
- test "$prefer_static_libs,$installed" = "built,yes"; } ||
+ { { test no = "$prefer_static_libs" ||
+ test built,yes = "$prefer_static_libs,$installed"; } ||
test -z "$old_library"; }; then
# We need to hardcode the library path
- if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+ if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then
# Make sure the rpath contains only unique directories.
- case "$temp_rpath:" in
+ case $temp_rpath: in
*"$absdir:"*) ;;
*) func_append temp_rpath "$absdir:" ;;
esac
@@ -6658,9 +8115,9 @@ func_mode_link ()
esac
fi # $linkmode,$pass = prog,link...
- if test "$alldeplibs" = yes &&
- { test "$deplibs_check_method" = pass_all ||
- { test "$build_libtool_libs" = yes &&
+ if $alldeplibs &&
+ { test pass_all = "$deplibs_check_method" ||
+ { test yes = "$build_libtool_libs" &&
test -n "$library_names"; }; }; then
# We only need to search for static libraries
continue
@@ -6669,19 +8126,19 @@ func_mode_link ()
link_static=no # Whether the deplib will be linked statically
use_static_libs=$prefer_static_libs
- if test "$use_static_libs" = built && test "$installed" = yes; then
+ if test built = "$use_static_libs" && test yes = "$installed"; then
use_static_libs=no
fi
if test -n "$library_names" &&
- { test "$use_static_libs" = no || test -z "$old_library"; }; then
+ { test no = "$use_static_libs" || test -z "$old_library"; }; then
case $host in
- *cygwin* | *mingw* | *cegcc*)
+ *cygwin* | *mingw* | *cegcc* | *os2*)
# No point in relinking DLLs because paths are not encoded
func_append notinst_deplibs " $lib"
need_relink=no
;;
*)
- if test "$installed" = no; then
+ if test no = "$installed"; then
func_append notinst_deplibs " $lib"
need_relink=yes
fi
@@ -6691,24 +8148,24 @@ func_mode_link ()
# Warn about portability, can't link against -module's on some
# systems (darwin). Don't bleat about dlopened modules though!
- dlopenmodule=""
+ dlopenmodule=
for dlpremoduletest in $dlprefiles; do
if test "X$dlpremoduletest" = "X$lib"; then
- dlopenmodule="$dlpremoduletest"
+ dlopenmodule=$dlpremoduletest
break
fi
done
- if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
+ if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then
echo
- if test "$linkmode" = prog; then
+ if test prog = "$linkmode"; then
$ECHO "*** Warning: Linking the executable $output against the loadable module"
else
$ECHO "*** Warning: Linking the shared library $output against the loadable module"
fi
$ECHO "*** $linklib is not portable!"
fi
- if test "$linkmode" = lib &&
- test "$hardcode_into_libs" = yes; then
+ if test lib = "$linkmode" &&
+ test yes = "$hardcode_into_libs"; then
# Hardcode the library path.
# Skip directories that are in the system default run-time
# search path.
@@ -6736,43 +8193,43 @@ func_mode_link ()
# figure out the soname
set dummy $library_names
shift
- realname="$1"
+ realname=$1
shift
libname=`eval "\\$ECHO \"$libname_spec\""`
# use dlname if we got it. it's perfectly good, no?
if test -n "$dlname"; then
- soname="$dlname"
+ soname=$dlname
elif test -n "$soname_spec"; then
# bleh windows
case $host in
- *cygwin* | mingw* | *cegcc*)
+ *cygwin* | mingw* | *cegcc* | *os2*)
func_arith $current - $age
major=$func_arith_result
- versuffix="-$major"
+ versuffix=-$major
;;
esac
eval soname=\"$soname_spec\"
else
- soname="$realname"
+ soname=$realname
fi
# Make a new name for the extract_expsyms_cmds to use
- soroot="$soname"
+ soroot=$soname
func_basename "$soroot"
- soname="$func_basename_result"
+ soname=$func_basename_result
func_stripname 'lib' '.dll' "$soname"
newlib=libimp-$func_stripname_result.a
# If the library has no export list, then create one now
if test -f "$output_objdir/$soname-def"; then :
else
- func_verbose "extracting exported symbol list from \`$soname'"
+ func_verbose "extracting exported symbol list from '$soname'"
func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
fi
# Create $newlib
if test -f "$output_objdir/$newlib"; then :; else
- func_verbose "generating import library for \`$soname'"
+ func_verbose "generating import library for '$soname'"
func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
fi
# make sure the library variables are pointing to the new library
@@ -6780,58 +8237,58 @@ func_mode_link ()
linklib=$newlib
fi # test -n "$old_archive_from_expsyms_cmds"
- if test "$linkmode" = prog || test "$opt_mode" != relink; then
+ if test prog = "$linkmode" || test relink != "$opt_mode"; then
add_shlibpath=
add_dir=
add=
lib_linked=yes
case $hardcode_action in
immediate | unsupported)
- if test "$hardcode_direct" = no; then
- add="$dir/$linklib"
+ if test no = "$hardcode_direct"; then
+ add=$dir/$linklib
case $host in
- *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
- *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+ *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;;
+ *-*-sysv4*uw2*) add_dir=-L$dir ;;
*-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
- *-*-unixware7*) add_dir="-L$dir" ;;
+ *-*-unixware7*) add_dir=-L$dir ;;
*-*-darwin* )
- # if the lib is a (non-dlopened) module then we can not
+ # if the lib is a (non-dlopened) module then we cannot
# link against it, someone is ignoring the earlier warnings
if /usr/bin/file -L $add 2> /dev/null |
- $GREP ": [^:]* bundle" >/dev/null ; then
+ $GREP ": [^:]* bundle" >/dev/null; then
if test "X$dlopenmodule" != "X$lib"; then
$ECHO "*** Warning: lib $linklib is a module, not a shared library"
- if test -z "$old_library" ; then
+ if test -z "$old_library"; then
echo
echo "*** And there doesn't seem to be a static archive available"
echo "*** The link will probably fail, sorry"
else
- add="$dir/$old_library"
+ add=$dir/$old_library
fi
elif test -n "$old_library"; then
- add="$dir/$old_library"
+ add=$dir/$old_library
fi
fi
esac
- elif test "$hardcode_minus_L" = no; then
+ elif test no = "$hardcode_minus_L"; then
case $host in
- *-*-sunos*) add_shlibpath="$dir" ;;
+ *-*-sunos*) add_shlibpath=$dir ;;
esac
- add_dir="-L$dir"
- add="-l$name"
- elif test "$hardcode_shlibpath_var" = no; then
- add_shlibpath="$dir"
- add="-l$name"
+ add_dir=-L$dir
+ add=-l$name
+ elif test no = "$hardcode_shlibpath_var"; then
+ add_shlibpath=$dir
+ add=-l$name
else
lib_linked=no
fi
;;
relink)
- if test "$hardcode_direct" = yes &&
- test "$hardcode_direct_absolute" = no; then
- add="$dir/$linklib"
- elif test "$hardcode_minus_L" = yes; then
- add_dir="-L$dir"
+ if test yes = "$hardcode_direct" &&
+ test no = "$hardcode_direct_absolute"; then
+ add=$dir/$linklib
+ elif test yes = "$hardcode_minus_L"; then
+ add_dir=-L$absdir
# Try looking first in the location we're being installed to.
if test -n "$inst_prefix_dir"; then
case $libdir in
@@ -6840,10 +8297,10 @@ func_mode_link ()
;;
esac
fi
- add="-l$name"
- elif test "$hardcode_shlibpath_var" = yes; then
- add_shlibpath="$dir"
- add="-l$name"
+ add=-l$name
+ elif test yes = "$hardcode_shlibpath_var"; then
+ add_shlibpath=$dir
+ add=-l$name
else
lib_linked=no
fi
@@ -6851,7 +8308,7 @@ func_mode_link ()
*) lib_linked=no ;;
esac
- if test "$lib_linked" != yes; then
+ if test yes != "$lib_linked"; then
func_fatal_configuration "unsupported hardcode properties"
fi
@@ -6861,15 +8318,15 @@ func_mode_link ()
*) func_append compile_shlibpath "$add_shlibpath:" ;;
esac
fi
- if test "$linkmode" = prog; then
+ if test prog = "$linkmode"; then
test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
test -n "$add" && compile_deplibs="$add $compile_deplibs"
else
test -n "$add_dir" && deplibs="$add_dir $deplibs"
test -n "$add" && deplibs="$add $deplibs"
- if test "$hardcode_direct" != yes &&
- test "$hardcode_minus_L" != yes &&
- test "$hardcode_shlibpath_var" = yes; then
+ if test yes != "$hardcode_direct" &&
+ test yes != "$hardcode_minus_L" &&
+ test yes = "$hardcode_shlibpath_var"; then
case :$finalize_shlibpath: in
*":$libdir:"*) ;;
*) func_append finalize_shlibpath "$libdir:" ;;
@@ -6878,33 +8335,33 @@ func_mode_link ()
fi
fi
- if test "$linkmode" = prog || test "$opt_mode" = relink; then
+ if test prog = "$linkmode" || test relink = "$opt_mode"; then
add_shlibpath=
add_dir=
add=
# Finalize command for both is simple: just hardcode it.
- if test "$hardcode_direct" = yes &&
- test "$hardcode_direct_absolute" = no; then
- add="$libdir/$linklib"
- elif test "$hardcode_minus_L" = yes; then
- add_dir="-L$libdir"
- add="-l$name"
- elif test "$hardcode_shlibpath_var" = yes; then
+ if test yes = "$hardcode_direct" &&
+ test no = "$hardcode_direct_absolute"; then
+ add=$libdir/$linklib
+ elif test yes = "$hardcode_minus_L"; then
+ add_dir=-L$libdir
+ add=-l$name
+ elif test yes = "$hardcode_shlibpath_var"; then
case :$finalize_shlibpath: in
*":$libdir:"*) ;;
*) func_append finalize_shlibpath "$libdir:" ;;
esac
- add="-l$name"
- elif test "$hardcode_automatic" = yes; then
+ add=-l$name
+ elif test yes = "$hardcode_automatic"; then
if test -n "$inst_prefix_dir" &&
- test -f "$inst_prefix_dir$libdir/$linklib" ; then
- add="$inst_prefix_dir$libdir/$linklib"
+ test -f "$inst_prefix_dir$libdir/$linklib"; then
+ add=$inst_prefix_dir$libdir/$linklib
else
- add="$libdir/$linklib"
+ add=$libdir/$linklib
fi
else
# We cannot seem to hardcode it, guess we'll fake it.
- add_dir="-L$libdir"
+ add_dir=-L$libdir
# Try looking first in the location we're being installed to.
if test -n "$inst_prefix_dir"; then
case $libdir in
@@ -6913,10 +8370,10 @@ func_mode_link ()
;;
esac
fi
- add="-l$name"
+ add=-l$name
fi
- if test "$linkmode" = prog; then
+ if test prog = "$linkmode"; then
test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
else
@@ -6924,43 +8381,43 @@ func_mode_link ()
test -n "$add" && deplibs="$add $deplibs"
fi
fi
- elif test "$linkmode" = prog; then
+ elif test prog = "$linkmode"; then
# Here we assume that one of hardcode_direct or hardcode_minus_L
# is not unsupported. This is valid on all known static and
# shared platforms.
- if test "$hardcode_direct" != unsupported; then
- test -n "$old_library" && linklib="$old_library"
+ if test unsupported != "$hardcode_direct"; then
+ test -n "$old_library" && linklib=$old_library
compile_deplibs="$dir/$linklib $compile_deplibs"
finalize_deplibs="$dir/$linklib $finalize_deplibs"
else
compile_deplibs="-l$name -L$dir $compile_deplibs"
finalize_deplibs="-l$name -L$dir $finalize_deplibs"
fi
- elif test "$build_libtool_libs" = yes; then
+ elif test yes = "$build_libtool_libs"; then
# Not a shared library
- if test "$deplibs_check_method" != pass_all; then
+ if test pass_all != "$deplibs_check_method"; then
# We're trying link a shared library against a static one
# but the system doesn't support it.
# Just print a warning and add the library to dependency_libs so
# that the program can be linked against the static library.
echo
- $ECHO "*** Warning: This system can not link to static lib archive $lib."
+ $ECHO "*** Warning: This system cannot link to static lib archive $lib."
echo "*** I have the capability to make that library automatically link in when"
echo "*** you link to this library. But I can only do this if you have a"
echo "*** shared version of the library, which you do not appear to have."
- if test "$module" = yes; then
+ if test yes = "$module"; then
echo "*** But as you try to build a module library, libtool will still create "
echo "*** a static module, that should work as long as the dlopening application"
echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
if test -z "$global_symbol_pipe"; then
echo
echo "*** However, this would only work if libtool was able to extract symbol"
- echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+ echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
echo "*** not find such a program. So, this module is probably useless."
- echo "*** \`nm' from GNU binutils and a full rebuild may help."
+ echo "*** 'nm' from GNU binutils and a full rebuild may help."
fi
- if test "$build_old_libs" = no; then
+ if test no = "$build_old_libs"; then
build_libtool_libs=module
build_old_libs=yes
else
@@ -6973,11 +8430,11 @@ func_mode_link ()
fi
fi # link shared/static library?
- if test "$linkmode" = lib; then
+ if test lib = "$linkmode"; then
if test -n "$dependency_libs" &&
- { test "$hardcode_into_libs" != yes ||
- test "$build_old_libs" = yes ||
- test "$link_static" = yes; }; then
+ { test yes != "$hardcode_into_libs" ||
+ test yes = "$build_old_libs" ||
+ test yes = "$link_static"; }; then
# Extract -R from dependency_libs
temp_deplibs=
for libdir in $dependency_libs; do
@@ -6991,12 +8448,12 @@ func_mode_link ()
*) func_append temp_deplibs " $libdir";;
esac
done
- dependency_libs="$temp_deplibs"
+ dependency_libs=$temp_deplibs
fi
func_append newlib_search_path " $absdir"
# Link against this library
- test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+ test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
# ... and its dependency_libs
tmp_libs=
for deplib in $dependency_libs; do
@@ -7006,7 +8463,7 @@ func_mode_link ()
func_resolve_sysroot "$func_stripname_result";;
*) func_resolve_sysroot "$deplib" ;;
esac
- if $opt_preserve_dup_deps ; then
+ if $opt_preserve_dup_deps; then
case "$tmp_libs " in
*" $func_resolve_sysroot_result "*)
func_append specialdeplibs " $func_resolve_sysroot_result" ;;
@@ -7015,12 +8472,12 @@ func_mode_link ()
func_append tmp_libs " $func_resolve_sysroot_result"
done
- if test "$link_all_deplibs" != no; then
+ if test no != "$link_all_deplibs"; then
# Add the search paths of all dependency libraries
for deplib in $dependency_libs; do
path=
case $deplib in
- -L*) path="$deplib" ;;
+ -L*) path=$deplib ;;
*.la)
func_resolve_sysroot "$deplib"
deplib=$func_resolve_sysroot_result
@@ -7028,12 +8485,12 @@ func_mode_link ()
dir=$func_dirname_result
# We need an absolute path.
case $dir in
- [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+ [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;;
*)
absdir=`cd "$dir" && pwd`
if test -z "$absdir"; then
- func_warning "cannot determine absolute directory name of \`$dir'"
- absdir="$dir"
+ func_warning "cannot determine absolute directory name of '$dir'"
+ absdir=$dir
fi
;;
esac
@@ -7041,35 +8498,35 @@ func_mode_link ()
case $host in
*-*-darwin*)
depdepl=
- eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
- if test -n "$deplibrary_names" ; then
- for tmp in $deplibrary_names ; do
+ eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+ if test -n "$deplibrary_names"; then
+ for tmp in $deplibrary_names; do
depdepl=$tmp
done
- if test -f "$absdir/$objdir/$depdepl" ; then
- depdepl="$absdir/$objdir/$depdepl"
- darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+ if test -f "$absdir/$objdir/$depdepl"; then
+ depdepl=$absdir/$objdir/$depdepl
+ darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
if test -z "$darwin_install_name"; then
- darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+ darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
fi
- func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
- func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}"
+ func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl"
+ func_append linker_flags " -dylib_file $darwin_install_name:$depdepl"
path=
fi
fi
;;
*)
- path="-L$absdir/$objdir"
+ path=-L$absdir/$objdir
;;
esac
else
- eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+ eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
test -z "$libdir" && \
- func_fatal_error "\`$deplib' is not a valid libtool archive"
+ func_fatal_error "'$deplib' is not a valid libtool archive"
test "$absdir" != "$libdir" && \
- func_warning "\`$deplib' seems to be moved"
+ func_warning "'$deplib' seems to be moved"
- path="-L$absdir"
+ path=-L$absdir
fi
;;
esac
@@ -7081,23 +8538,23 @@ func_mode_link ()
fi # link_all_deplibs != no
fi # linkmode = lib
done # for deplib in $libs
- if test "$pass" = link; then
- if test "$linkmode" = "prog"; then
+ if test link = "$pass"; then
+ if test prog = "$linkmode"; then
compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
else
compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
fi
fi
- dependency_libs="$newdependency_libs"
- if test "$pass" = dlpreopen; then
+ dependency_libs=$newdependency_libs
+ if test dlpreopen = "$pass"; then
# Link the dlpreopened libraries before other libraries
for deplib in $save_deplibs; do
deplibs="$deplib $deplibs"
done
fi
- if test "$pass" != dlopen; then
- if test "$pass" != conv; then
+ if test dlopen != "$pass"; then
+ test conv = "$pass" || {
# Make sure lib_search_path contains only unique directories.
lib_search_path=
for dir in $newlib_search_path; do
@@ -7107,12 +8564,12 @@ func_mode_link ()
esac
done
newlib_search_path=
- fi
+ }
- if test "$linkmode,$pass" != "prog,link"; then
- vars="deplibs"
- else
+ if test prog,link = "$linkmode,$pass"; then
vars="compile_deplibs finalize_deplibs"
+ else
+ vars=deplibs
fi
for var in $vars dependency_libs; do
# Add libraries to $var in reverse order
@@ -7170,62 +8627,93 @@ func_mode_link ()
eval $var=\"$tmp_libs\"
done # for var
fi
+
+ # Add Sun CC postdeps if required:
+ test CXX = "$tagname" && {
+ case $host_os in
+ linux*)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*) # Sun C++ 5.9
+ func_suncc_cstd_abi
+
+ if test no != "$suncc_use_cstd_abi"; then
+ func_append postdeps ' -library=Cstd -library=Crun'
+ fi
+ ;;
+ esac
+ ;;
+
+ solaris*)
+ func_cc_basename "$CC"
+ case $func_cc_basename_result in
+ CC* | sunCC*)
+ func_suncc_cstd_abi
+
+ if test no != "$suncc_use_cstd_abi"; then
+ func_append postdeps ' -library=Cstd -library=Crun'
+ fi
+ ;;
+ esac
+ ;;
+ esac
+ }
+
# Last step: remove runtime libs from dependency_libs
# (they stay in deplibs)
tmp_libs=
- for i in $dependency_libs ; do
+ for i in $dependency_libs; do
case " $predeps $postdeps $compiler_lib_search_path " in
*" $i "*)
- i=""
+ i=
;;
esac
- if test -n "$i" ; then
+ if test -n "$i"; then
func_append tmp_libs " $i"
fi
done
dependency_libs=$tmp_libs
done # for pass
- if test "$linkmode" = prog; then
- dlfiles="$newdlfiles"
+ if test prog = "$linkmode"; then
+ dlfiles=$newdlfiles
fi
- if test "$linkmode" = prog || test "$linkmode" = lib; then
- dlprefiles="$newdlprefiles"
+ if test prog = "$linkmode" || test lib = "$linkmode"; then
+ dlprefiles=$newdlprefiles
fi
case $linkmode in
oldlib)
- if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
- func_warning "\`-dlopen' is ignored for archives"
+ if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
+ func_warning "'-dlopen' is ignored for archives"
fi
case " $deplibs" in
*\ -l* | *\ -L*)
- func_warning "\`-l' and \`-L' are ignored for archives" ;;
+ func_warning "'-l' and '-L' are ignored for archives" ;;
esac
test -n "$rpath" && \
- func_warning "\`-rpath' is ignored for archives"
+ func_warning "'-rpath' is ignored for archives"
test -n "$xrpath" && \
- func_warning "\`-R' is ignored for archives"
+ func_warning "'-R' is ignored for archives"
test -n "$vinfo" && \
- func_warning "\`-version-info/-version-number' is ignored for archives"
+ func_warning "'-version-info/-version-number' is ignored for archives"
test -n "$release" && \
- func_warning "\`-release' is ignored for archives"
+ func_warning "'-release' is ignored for archives"
test -n "$export_symbols$export_symbols_regex" && \
- func_warning "\`-export-symbols' is ignored for archives"
+ func_warning "'-export-symbols' is ignored for archives"
# Now set the variables for building old libraries.
build_libtool_libs=no
- oldlibs="$output"
+ oldlibs=$output
func_append objs "$old_deplibs"
;;
lib)
- # Make sure we only generate libraries of the form `libNAME.la'.
+ # Make sure we only generate libraries of the form 'libNAME.la'.
case $outputname in
lib*)
func_stripname 'lib' '.la' "$outputname"
@@ -7234,10 +8722,10 @@ func_mode_link ()
eval libname=\"$libname_spec\"
;;
*)
- test "$module" = no && \
- func_fatal_help "libtool library \`$output' must begin with \`lib'"
+ test no = "$module" \
+ && func_fatal_help "libtool library '$output' must begin with 'lib'"
- if test "$need_lib_prefix" != no; then
+ if test no != "$need_lib_prefix"; then
# Add the "lib" prefix for modules if required
func_stripname '' '.la' "$outputname"
name=$func_stripname_result
@@ -7251,8 +8739,8 @@ func_mode_link ()
esac
if test -n "$objs"; then
- if test "$deplibs_check_method" != pass_all; then
- func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
+ if test pass_all != "$deplibs_check_method"; then
+ func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs"
else
echo
$ECHO "*** Warning: Linking the shared library $output against the non-libtool"
@@ -7261,21 +8749,21 @@ func_mode_link ()
fi
fi
- test "$dlself" != no && \
- func_warning "\`-dlopen self' is ignored for libtool libraries"
+ test no = "$dlself" \
+ || func_warning "'-dlopen self' is ignored for libtool libraries"
set dummy $rpath
shift
- test "$#" -gt 1 && \
- func_warning "ignoring multiple \`-rpath's for a libtool library"
+ test 1 -lt "$#" \
+ && func_warning "ignoring multiple '-rpath's for a libtool library"
- install_libdir="$1"
+ install_libdir=$1
oldlibs=
if test -z "$rpath"; then
- if test "$build_libtool_libs" = yes; then
+ if test yes = "$build_libtool_libs"; then
# Building a libtool convenience library.
- # Some compilers have problems with a `.al' extension so
+ # Some compilers have problems with a '.al' extension so
# convenience libraries should have the same extension an
# archive normally would.
oldlibs="$output_objdir/$libname.$libext $oldlibs"
@@ -7284,20 +8772,20 @@ func_mode_link ()
fi
test -n "$vinfo" && \
- func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
+ func_warning "'-version-info/-version-number' is ignored for convenience libraries"
test -n "$release" && \
- func_warning "\`-release' is ignored for convenience libraries"
+ func_warning "'-release' is ignored for convenience libraries"
else
# Parse the version information argument.
- save_ifs="$IFS"; IFS=':'
+ save_ifs=$IFS; IFS=:
set dummy $vinfo 0 0 0
shift
- IFS="$save_ifs"
+ IFS=$save_ifs
test -n "$7" && \
- func_fatal_help "too many parameters to \`-version-info'"
+ func_fatal_help "too many parameters to '-version-info'"
# convert absolute version numbers to libtool ages
# this retains compatibility with .la files and attempts
@@ -7305,41 +8793,42 @@ func_mode_link ()
case $vinfo_number in
yes)
- number_major="$1"
- number_minor="$2"
- number_revision="$3"
+ number_major=$1
+ number_minor=$2
+ number_revision=$3
#
# There are really only two kinds -- those that
# use the current revision as the major version
# and those that subtract age and use age as
# a minor version. But, then there is irix
- # which has an extra 1 added just for fun
+ # that has an extra 1 added just for fun
#
case $version_type in
- darwin|linux|osf|windows|none)
+ # correct linux to gnu/linux during the next big refactor
+ darwin|freebsd-elf|linux|osf|windows|none)
func_arith $number_major + $number_minor
current=$func_arith_result
- age="$number_minor"
- revision="$number_revision"
+ age=$number_minor
+ revision=$number_revision
;;
- freebsd-aout|freebsd-elf|qnx|sunos)
- current="$number_major"
- revision="$number_minor"
- age="0"
+ freebsd-aout|qnx|sunos)
+ current=$number_major
+ revision=$number_minor
+ age=0
;;
irix|nonstopux)
func_arith $number_major + $number_minor
current=$func_arith_result
- age="$number_minor"
- revision="$number_minor"
+ age=$number_minor
+ revision=$number_minor
lt_irix_increment=no
;;
esac
;;
no)
- current="$1"
- revision="$2"
- age="$3"
+ current=$1
+ revision=$2
+ age=$3
;;
esac
@@ -7347,30 +8836,30 @@ func_mode_link ()
case $current in
0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
*)
- func_error "CURRENT \`$current' must be a nonnegative integer"
- func_fatal_error "\`$vinfo' is not valid version information"
+ func_error "CURRENT '$current' must be a nonnegative integer"
+ func_fatal_error "'$vinfo' is not valid version information"
;;
esac
case $revision in
0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
*)
- func_error "REVISION \`$revision' must be a nonnegative integer"
- func_fatal_error "\`$vinfo' is not valid version information"
+ func_error "REVISION '$revision' must be a nonnegative integer"
+ func_fatal_error "'$vinfo' is not valid version information"
;;
esac
case $age in
0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
*)
- func_error "AGE \`$age' must be a nonnegative integer"
- func_fatal_error "\`$vinfo' is not valid version information"
+ func_error "AGE '$age' must be a nonnegative integer"
+ func_fatal_error "'$vinfo' is not valid version information"
;;
esac
if test "$age" -gt "$current"; then
- func_error "AGE \`$age' is greater than the current interface number \`$current'"
- func_fatal_error "\`$vinfo' is not valid version information"
+ func_error "AGE '$age' is greater than the current interface number '$current'"
+ func_fatal_error "'$vinfo' is not valid version information"
fi
# Calculate the version variables.
@@ -7385,26 +8874,36 @@ func_mode_link ()
# verstring for coding it into the library header
func_arith $current - $age
major=.$func_arith_result
- versuffix="$major.$age.$revision"
+ versuffix=$major.$age.$revision
# Darwin ld doesn't like 0 for these options...
func_arith $current + 1
minor_current=$func_arith_result
- xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+ xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision"
verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+ # On Darwin other compilers
+ case $CC in
+ nagfor*)
+ verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision"
+ ;;
+ *)
+ verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+ ;;
+ esac
;;
freebsd-aout)
- major=".$current"
- versuffix=".$current.$revision";
+ major=.$current
+ versuffix=.$current.$revision
;;
freebsd-elf)
- major=".$current"
- versuffix=".$current"
+ func_arith $current - $age
+ major=.$func_arith_result
+ versuffix=$major.$age.$revision
;;
irix | nonstopux)
- if test "X$lt_irix_increment" = "Xno"; then
+ if test no = "$lt_irix_increment"; then
func_arith $current - $age
else
func_arith $current - $age + 1
@@ -7415,69 +8914,74 @@ func_mode_link ()
nonstopux) verstring_prefix=nonstopux ;;
*) verstring_prefix=sgi ;;
esac
- verstring="$verstring_prefix$major.$revision"
+ verstring=$verstring_prefix$major.$revision
# Add in all the interfaces that we are compatible with.
loop=$revision
- while test "$loop" -ne 0; do
+ while test 0 -ne "$loop"; do
func_arith $revision - $loop
iface=$func_arith_result
func_arith $loop - 1
loop=$func_arith_result
- verstring="$verstring_prefix$major.$iface:$verstring"
+ verstring=$verstring_prefix$major.$iface:$verstring
done
- # Before this point, $major must not contain `.'.
+ # Before this point, $major must not contain '.'.
major=.$major
- versuffix="$major.$revision"
+ versuffix=$major.$revision
;;
- linux)
+ linux) # correct to gnu/linux during the next big refactor
func_arith $current - $age
major=.$func_arith_result
- versuffix="$major.$age.$revision"
+ versuffix=$major.$age.$revision
;;
osf)
func_arith $current - $age
major=.$func_arith_result
- versuffix=".$current.$age.$revision"
- verstring="$current.$age.$revision"
+ versuffix=.$current.$age.$revision
+ verstring=$current.$age.$revision
# Add in all the interfaces that we are compatible with.
loop=$age
- while test "$loop" -ne 0; do
+ while test 0 -ne "$loop"; do
func_arith $current - $loop
iface=$func_arith_result
func_arith $loop - 1
loop=$func_arith_result
- verstring="$verstring:${iface}.0"
+ verstring=$verstring:$iface.0
done
# Make executables depend on our current version.
- func_append verstring ":${current}.0"
+ func_append verstring ":$current.0"
;;
qnx)
- major=".$current"
- versuffix=".$current"
+ major=.$current
+ versuffix=.$current
+ ;;
+
+ sco)
+ major=.$current
+ versuffix=.$current
;;
sunos)
- major=".$current"
- versuffix=".$current.$revision"
+ major=.$current
+ versuffix=.$current.$revision
;;
windows)
# Use '-' rather than '.', since we only want one
- # extension on DOS 8.3 filesystems.
+ # extension on DOS 8.3 file systems.
func_arith $current - $age
major=$func_arith_result
- versuffix="-$major"
+ versuffix=-$major
;;
*)
- func_fatal_configuration "unknown library version type \`$version_type'"
+ func_fatal_configuration "unknown library version type '$version_type'"
;;
esac
@@ -7491,42 +8995,45 @@ func_mode_link ()
verstring=
;;
*)
- verstring="0.0"
+ verstring=0.0
;;
esac
- if test "$need_version" = no; then
+ if test no = "$need_version"; then
versuffix=
else
- versuffix=".0.0"
+ versuffix=.0.0
fi
fi
# Remove version info from name if versioning should be avoided
- if test "$avoid_version" = yes && test "$need_version" = no; then
+ if test yes,no = "$avoid_version,$need_version"; then
major=
versuffix=
- verstring=""
+ verstring=
fi
# Check to see if the archive will have undefined symbols.
- if test "$allow_undefined" = yes; then
- if test "$allow_undefined_flag" = unsupported; then
- func_warning "undefined symbols not allowed in $host shared libraries"
- build_libtool_libs=no
- build_old_libs=yes
+ if test yes = "$allow_undefined"; then
+ if test unsupported = "$allow_undefined_flag"; then
+ if test yes = "$build_old_libs"; then
+ func_warning "undefined symbols not allowed in $host shared libraries; building static only"
+ build_libtool_libs=no
+ else
+ func_fatal_error "can't build $host shared library unless -no-undefined is specified"
+ fi
fi
else
# Don't allow undefined symbols.
- allow_undefined_flag="$no_undefined_flag"
+ allow_undefined_flag=$no_undefined_flag
fi
fi
- func_generate_dlsyms "$libname" "$libname" "yes"
+ func_generate_dlsyms "$libname" "$libname" :
func_append libobjs " $symfileobj"
- test "X$libobjs" = "X " && libobjs=
+ test " " = "$libobjs" && libobjs=
- if test "$opt_mode" != relink; then
+ if test relink != "$opt_mode"; then
# Remove our outputs, but don't remove object files since they
# may have been created when compiling PIC objects.
removelist=
@@ -7535,8 +9042,8 @@ func_mode_link ()
case $p in
*.$objext | *.gcno)
;;
- $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
- if test "X$precious_files_regex" != "X"; then
+ $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*)
+ if test -n "$precious_files_regex"; then
if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
then
continue
@@ -7552,11 +9059,11 @@ func_mode_link ()
fi
# Now set the variables for building old libraries.
- if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+ if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then
func_append oldlibs " $output_objdir/$libname.$libext"
# Transform .lo files to .o files.
- oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
+ oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP`
fi
# Eliminate all temporary directories.
@@ -7577,13 +9084,13 @@ func_mode_link ()
*) func_append finalize_rpath " $libdir" ;;
esac
done
- if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+ if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then
dependency_libs="$temp_xrpath $dependency_libs"
fi
fi
# Make sure dlfiles contains only unique files that won't be dlpreopened
- old_dlfiles="$dlfiles"
+ old_dlfiles=$dlfiles
dlfiles=
for lib in $old_dlfiles; do
case " $dlprefiles $dlfiles " in
@@ -7593,7 +9100,7 @@ func_mode_link ()
done
# Make sure dlprefiles contains only unique files
- old_dlprefiles="$dlprefiles"
+ old_dlprefiles=$dlprefiles
dlprefiles=
for lib in $old_dlprefiles; do
case "$dlprefiles " in
@@ -7602,7 +9109,7 @@ func_mode_link ()
esac
done
- if test "$build_libtool_libs" = yes; then
+ if test yes = "$build_libtool_libs"; then
if test -n "$rpath"; then
case $host in
*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
@@ -7626,7 +9133,7 @@ func_mode_link ()
;;
*)
# Add libc to deplibs on all other systems if necessary.
- if test "$build_libtool_need_lc" = "yes"; then
+ if test yes = "$build_libtool_need_lc"; then
func_append deplibs " -lc"
fi
;;
@@ -7642,9 +9149,9 @@ func_mode_link ()
# I'm not sure if I'm treating the release correctly. I think
# release should show up in the -l (ie -lgmp5) so we don't want to
# add it in twice. Is that correct?
- release=""
- versuffix=""
- major=""
+ release=
+ versuffix=
+ major=
newdeplibs=
droppeddeps=no
case $deplibs_check_method in
@@ -7673,20 +9180,20 @@ EOF
-l*)
func_stripname -l '' "$i"
name=$func_stripname_result
- if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ if test yes = "$allow_libtool_libs_with_static_runtimes"; then
case " $predeps $postdeps " in
*" $i "*)
func_append newdeplibs " $i"
- i=""
+ i=
;;
esac
fi
- if test -n "$i" ; then
+ if test -n "$i"; then
libname=`eval "\\$ECHO \"$libname_spec\""`
deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
set dummy $deplib_matches; shift
deplib_match=$1
- if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+ if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
func_append newdeplibs " $i"
else
droppeddeps=yes
@@ -7716,20 +9223,20 @@ EOF
$opt_dry_run || $RM conftest
if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
ldd_output=`ldd conftest`
- if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ if test yes = "$allow_libtool_libs_with_static_runtimes"; then
case " $predeps $postdeps " in
*" $i "*)
func_append newdeplibs " $i"
- i=""
+ i=
;;
esac
fi
- if test -n "$i" ; then
+ if test -n "$i"; then
libname=`eval "\\$ECHO \"$libname_spec\""`
deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
set dummy $deplib_matches; shift
deplib_match=$1
- if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+ if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
func_append newdeplibs " $i"
else
droppeddeps=yes
@@ -7766,24 +9273,24 @@ EOF
-l*)
func_stripname -l '' "$a_deplib"
name=$func_stripname_result
- if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ if test yes = "$allow_libtool_libs_with_static_runtimes"; then
case " $predeps $postdeps " in
*" $a_deplib "*)
func_append newdeplibs " $a_deplib"
- a_deplib=""
+ a_deplib=
;;
esac
fi
- if test -n "$a_deplib" ; then
+ if test -n "$a_deplib"; then
libname=`eval "\\$ECHO \"$libname_spec\""`
if test -n "$file_magic_glob"; then
libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
else
libnameglob=$libname
fi
- test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob`
+ test yes = "$want_nocaseglob" && nocaseglob=`shopt -p nocaseglob`
for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
- if test "$want_nocaseglob" = yes; then
+ if test yes = "$want_nocaseglob"; then
shopt -s nocaseglob
potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
$nocaseglob
@@ -7801,25 +9308,25 @@ EOF
# We might still enter an endless loop, since a link
# loop can be closed while we follow links,
# but so what?
- potlib="$potent_lib"
+ potlib=$potent_lib
while test -h "$potlib" 2>/dev/null; do
- potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+ potliblink=`ls -ld $potlib | $SED 's/.* -> //'`
case $potliblink in
- [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
- *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
+ [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;;
+ *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";;
esac
done
if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
$SED -e 10q |
$EGREP "$file_magic_regex" > /dev/null; then
func_append newdeplibs " $a_deplib"
- a_deplib=""
+ a_deplib=
break 2
fi
done
done
fi
- if test -n "$a_deplib" ; then
+ if test -n "$a_deplib"; then
droppeddeps=yes
echo
$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
@@ -7827,7 +9334,7 @@ EOF
echo "*** you link to this library. But I can only do this if you have a"
echo "*** shared version of the library, which you do not appear to have"
echo "*** because I did check the linker path looking for a file starting"
- if test -z "$potlib" ; then
+ if test -z "$potlib"; then
$ECHO "*** with $libname but no candidates were found. (...for file magic test)"
else
$ECHO "*** with $libname and none of the candidates passed a file format test"
@@ -7850,30 +9357,30 @@ EOF
-l*)
func_stripname -l '' "$a_deplib"
name=$func_stripname_result
- if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ if test yes = "$allow_libtool_libs_with_static_runtimes"; then
case " $predeps $postdeps " in
*" $a_deplib "*)
func_append newdeplibs " $a_deplib"
- a_deplib=""
+ a_deplib=
;;
esac
fi
- if test -n "$a_deplib" ; then
+ if test -n "$a_deplib"; then
libname=`eval "\\$ECHO \"$libname_spec\""`
for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
for potent_lib in $potential_libs; do
- potlib="$potent_lib" # see symlink-check above in file_magic test
+ potlib=$potent_lib # see symlink-check above in file_magic test
if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
$EGREP "$match_pattern_regex" > /dev/null; then
func_append newdeplibs " $a_deplib"
- a_deplib=""
+ a_deplib=
break 2
fi
done
done
fi
- if test -n "$a_deplib" ; then
+ if test -n "$a_deplib"; then
droppeddeps=yes
echo
$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
@@ -7881,7 +9388,7 @@ EOF
echo "*** you link to this library. But I can only do this if you have a"
echo "*** shared version of the library, which you do not appear to have"
echo "*** because I did check the linker path looking for a file starting"
- if test -z "$potlib" ; then
+ if test -z "$potlib"; then
$ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
else
$ECHO "*** with $libname and none of the candidates passed a file format test"
@@ -7897,18 +9404,18 @@ EOF
done # Gone through all deplibs.
;;
none | unknown | *)
- newdeplibs=""
+ newdeplibs=
tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
- if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
- for i in $predeps $postdeps ; do
+ if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+ for i in $predeps $postdeps; do
# can't use Xsed below, because $i might contain '/'
- tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
+ tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"`
done
fi
case $tmp_deplibs in
*[!\ \ ]*)
echo
- if test "X$deplibs_check_method" = "Xnone"; then
+ if test none = "$deplibs_check_method"; then
echo "*** Warning: inter-library dependencies are not supported in this platform."
else
echo "*** Warning: inter-library dependencies are not known to be supported."
@@ -7932,8 +9439,8 @@ EOF
;;
esac
- if test "$droppeddeps" = yes; then
- if test "$module" = yes; then
+ if test yes = "$droppeddeps"; then
+ if test yes = "$module"; then
echo
echo "*** Warning: libtool could not satisfy all declared inter-library"
$ECHO "*** dependencies of module $libname. Therefore, libtool will create"
@@ -7942,12 +9449,12 @@ EOF
if test -z "$global_symbol_pipe"; then
echo
echo "*** However, this would only work if libtool was able to extract symbol"
- echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+ echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
echo "*** not find such a program. So, this module is probably useless."
- echo "*** \`nm' from GNU binutils and a full rebuild may help."
+ echo "*** 'nm' from GNU binutils and a full rebuild may help."
fi
- if test "$build_old_libs" = no; then
- oldlibs="$output_objdir/$libname.$libext"
+ if test no = "$build_old_libs"; then
+ oldlibs=$output_objdir/$libname.$libext
build_libtool_libs=module
build_old_libs=yes
else
@@ -7958,14 +9465,14 @@ EOF
echo "*** automatically added whenever a program is linked with this library"
echo "*** or is declared to -dlopen it."
- if test "$allow_undefined" = no; then
+ if test no = "$allow_undefined"; then
echo
echo "*** Since this library must not contain undefined symbols,"
echo "*** because either the platform does not support them or"
echo "*** it was explicitly requested with -no-undefined,"
echo "*** libtool will only create a static version of it."
- if test "$build_old_libs" = no; then
- oldlibs="$output_objdir/$libname.$libext"
+ if test no = "$build_old_libs"; then
+ oldlibs=$output_objdir/$libname.$libext
build_libtool_libs=module
build_old_libs=yes
else
@@ -8011,7 +9518,7 @@ EOF
*) func_append new_libs " $deplib" ;;
esac
done
- deplibs="$new_libs"
+ deplibs=$new_libs
# All the library-specific variables (install_libdir is set above).
library_names=
@@ -8019,20 +9526,25 @@ EOF
dlname=
# Test again, we may have decided not to build it any more
- if test "$build_libtool_libs" = yes; then
- if test "$hardcode_into_libs" = yes; then
+ if test yes = "$build_libtool_libs"; then
+ # Remove $wl instances when linking with ld.
+ # FIXME: should test the right _cmds variable.
+ case $archive_cmds in
+ *\$LD\ *) wl= ;;
+ esac
+ if test yes = "$hardcode_into_libs"; then
# Hardcode the library paths
hardcode_libdirs=
dep_rpath=
- rpath="$finalize_rpath"
- test "$opt_mode" != relink && rpath="$compile_rpath$rpath"
+ rpath=$finalize_rpath
+ test relink = "$opt_mode" || rpath=$compile_rpath$rpath
for libdir in $rpath; do
if test -n "$hardcode_libdir_flag_spec"; then
if test -n "$hardcode_libdir_separator"; then
func_replace_sysroot "$libdir"
libdir=$func_replace_sysroot_result
if test -z "$hardcode_libdirs"; then
- hardcode_libdirs="$libdir"
+ hardcode_libdirs=$libdir
else
# Just accumulate the unique libdirs.
case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
@@ -8050,19 +9562,15 @@ EOF
elif test -n "$runpath_var"; then
case "$perm_rpath " in
*" $libdir "*) ;;
- *) func_apped perm_rpath " $libdir" ;;
+ *) func_append perm_rpath " $libdir" ;;
esac
fi
done
# Substitute the hardcoded libdirs into the rpath.
if test -n "$hardcode_libdir_separator" &&
test -n "$hardcode_libdirs"; then
- libdir="$hardcode_libdirs"
- if test -n "$hardcode_libdir_flag_spec_ld"; then
- eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
- else
- eval dep_rpath=\"$hardcode_libdir_flag_spec\"
- fi
+ libdir=$hardcode_libdirs
+ eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
fi
if test -n "$runpath_var" && test -n "$perm_rpath"; then
# We should set the runpath_var.
@@ -8075,8 +9583,8 @@ EOF
test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
fi
- shlibpath="$finalize_shlibpath"
- test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+ shlibpath=$finalize_shlibpath
+ test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath
if test -n "$shlibpath"; then
eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
fi
@@ -8086,19 +9594,19 @@ EOF
eval library_names=\"$library_names_spec\"
set dummy $library_names
shift
- realname="$1"
+ realname=$1
shift
if test -n "$soname_spec"; then
eval soname=\"$soname_spec\"
else
- soname="$realname"
+ soname=$realname
fi
if test -z "$dlname"; then
dlname=$soname
fi
- lib="$output_objdir/$realname"
+ lib=$output_objdir/$realname
linknames=
for link
do
@@ -8112,7 +9620,7 @@ EOF
delfiles=
if test -n "$export_symbols" && test -n "$include_expsyms"; then
$opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
- export_symbols="$output_objdir/$libname.uexp"
+ export_symbols=$output_objdir/$libname.uexp
func_append delfiles " $export_symbols"
fi
@@ -8121,31 +9629,31 @@ EOF
cygwin* | mingw* | cegcc*)
if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
# exporting using user supplied symfile
- if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
+ func_dll_def_p "$export_symbols" || {
# and it's NOT already a .def file. Must figure out
# which of the given symbols are data symbols and tag
# them as such. So, trigger use of export_symbols_cmds.
# export_symbols gets reassigned inside the "prepare
# the list of exported symbols" if statement, so the
# include_expsyms logic still works.
- orig_export_symbols="$export_symbols"
+ orig_export_symbols=$export_symbols
export_symbols=
always_export_symbols=yes
- fi
+ }
fi
;;
esac
# Prepare the list of exported symbols
if test -z "$export_symbols"; then
- if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
- func_verbose "generating symbol list for \`$libname.la'"
- export_symbols="$output_objdir/$libname.exp"
+ if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then
+ func_verbose "generating symbol list for '$libname.la'"
+ export_symbols=$output_objdir/$libname.exp
$opt_dry_run || $RM $export_symbols
cmds=$export_symbols_cmds
- save_ifs="$IFS"; IFS='~'
+ save_ifs=$IFS; IFS='~'
for cmd1 in $cmds; do
- IFS="$save_ifs"
+ IFS=$save_ifs
# Take the normal branch if the nm_file_list_spec branch
# doesn't work or if tool conversion is not needed.
case $nm_file_list_spec~$to_tool_file_cmd in
@@ -8159,7 +9667,7 @@ EOF
try_normal_branch=no
;;
esac
- if test "$try_normal_branch" = yes \
+ if test yes = "$try_normal_branch" \
&& { test "$len" -lt "$max_cmd_len" \
|| test "$max_cmd_len" -le -1; }
then
@@ -8170,7 +9678,7 @@ EOF
output_la=$func_basename_result
save_libobjs=$libobjs
save_output=$output
- output=${output_objdir}/${output_la}.nm
+ output=$output_objdir/$output_la.nm
func_to_tool_file "$output"
libobjs=$nm_file_list_spec$func_to_tool_file_result
func_append delfiles " $output"
@@ -8193,8 +9701,8 @@ EOF
break
fi
done
- IFS="$save_ifs"
- if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
+ IFS=$save_ifs
+ if test -n "$export_symbols_regex" && test : != "$skipped_export"; then
func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
fi
@@ -8202,16 +9710,16 @@ EOF
fi
if test -n "$export_symbols" && test -n "$include_expsyms"; then
- tmp_export_symbols="$export_symbols"
- test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+ tmp_export_symbols=$export_symbols
+ test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols
$opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
fi
- if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
+ if test : != "$skipped_export" && test -n "$orig_export_symbols"; then
# The given exports_symbols file has to be filtered, so filter it.
- func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+ func_verbose "filter symbol list for '$libname.la' to tag DATA exports"
# FIXME: $output_objdir/$libname.filter potentially contains lots of
- # 's' commands which not all seds can handle. GNU sed should be fine
+ # 's' commands, which not all seds can handle. GNU sed should be fine
# though. Also, the filter scales superlinearly with the number of
# global variables. join(1) would be nice here, but unfortunately
# isn't a blessed tool.
@@ -8230,11 +9738,11 @@ EOF
;;
esac
done
- deplibs="$tmp_deplibs"
+ deplibs=$tmp_deplibs
if test -n "$convenience"; then
if test -n "$whole_archive_flag_spec" &&
- test "$compiler_needs_object" = yes &&
+ test yes = "$compiler_needs_object" &&
test -z "$libobjs"; then
# extract the archives, so we have objects to list.
# TODO: could optimize this to just extract one archive.
@@ -8245,7 +9753,7 @@ EOF
eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
test "X$libobjs" = "X " && libobjs=
else
- gentop="$output_objdir/${outputname}x"
+ gentop=$output_objdir/${outputname}x
func_append generated " $gentop"
func_extract_archives $gentop $convenience
@@ -8254,18 +9762,18 @@ EOF
fi
fi
- if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+ if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then
eval flag=\"$thread_safe_flag_spec\"
func_append linker_flags " $flag"
fi
# Make a backup of the uninstalled library when relinking
- if test "$opt_mode" = relink; then
+ if test relink = "$opt_mode"; then
$opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
fi
# Do each of the archive commands.
- if test "$module" = yes && test -n "$module_cmds" ; then
+ if test yes = "$module" && test -n "$module_cmds"; then
if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
eval test_cmds=\"$module_expsym_cmds\"
cmds=$module_expsym_cmds
@@ -8283,7 +9791,7 @@ EOF
fi
fi
- if test "X$skipped_export" != "X:" &&
+ if test : != "$skipped_export" &&
func_len " $test_cmds" &&
len=$func_len_result &&
test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
@@ -8316,8 +9824,8 @@ EOF
last_robj=
k=1
- if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
- output=${output_objdir}/${output_la}.lnkscript
+ if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then
+ output=$output_objdir/$output_la.lnkscript
func_verbose "creating GNU ld script: $output"
echo 'INPUT (' > $output
for obj in $save_libobjs
@@ -8329,14 +9837,14 @@ EOF
func_append delfiles " $output"
func_to_tool_file "$output"
output=$func_to_tool_file_result
- elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
- output=${output_objdir}/${output_la}.lnk
+ elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then
+ output=$output_objdir/$output_la.lnk
func_verbose "creating linker input file list: $output"
: > $output
set x $save_libobjs
shift
firstobj=
- if test "$compiler_needs_object" = yes; then
+ if test yes = "$compiler_needs_object"; then
firstobj="$1 "
shift
fi
@@ -8351,7 +9859,7 @@ EOF
else
if test -n "$save_libobjs"; then
func_verbose "creating reloadable object files..."
- output=$output_objdir/$output_la-${k}.$objext
+ output=$output_objdir/$output_la-$k.$objext
eval test_cmds=\"$reload_cmds\"
func_len " $test_cmds"
len0=$func_len_result
@@ -8363,13 +9871,13 @@ EOF
func_len " $obj"
func_arith $len + $func_len_result
len=$func_arith_result
- if test "X$objlist" = X ||
+ if test -z "$objlist" ||
test "$len" -lt "$max_cmd_len"; then
func_append objlist " $obj"
else
# The command $test_cmds is almost too long, add a
# command to the queue.
- if test "$k" -eq 1 ; then
+ if test 1 -eq "$k"; then
# The first file doesn't have a previous command to add.
reload_objs=$objlist
eval concat_cmds=\"$reload_cmds\"
@@ -8379,10 +9887,10 @@ EOF
reload_objs="$objlist $last_robj"
eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
fi
- last_robj=$output_objdir/$output_la-${k}.$objext
+ last_robj=$output_objdir/$output_la-$k.$objext
func_arith $k + 1
k=$func_arith_result
- output=$output_objdir/$output_la-${k}.$objext
+ output=$output_objdir/$output_la-$k.$objext
objlist=" $obj"
func_len " $last_robj"
func_arith $len0 + $func_len_result
@@ -8394,9 +9902,9 @@ EOF
# files will link in the last one created.
test -z "$concat_cmds" || concat_cmds=$concat_cmds~
reload_objs="$objlist $last_robj"
- eval concat_cmds=\"\${concat_cmds}$reload_cmds\"
+ eval concat_cmds=\"\$concat_cmds$reload_cmds\"
if test -n "$last_robj"; then
- eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
+ eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
fi
func_append delfiles " $output"
@@ -8404,9 +9912,9 @@ EOF
output=
fi
- if ${skipped_export-false}; then
- func_verbose "generating symbol list for \`$libname.la'"
- export_symbols="$output_objdir/$libname.exp"
+ ${skipped_export-false} && {
+ func_verbose "generating symbol list for '$libname.la'"
+ export_symbols=$output_objdir/$libname.exp
$opt_dry_run || $RM $export_symbols
libobjs=$output
# Append the command to create the export file.
@@ -8415,16 +9923,16 @@ EOF
if test -n "$last_robj"; then
eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
fi
- fi
+ }
test -n "$save_libobjs" &&
func_verbose "creating a temporary reloadable object file: $output"
# Loop through the commands generated above and execute them.
- save_ifs="$IFS"; IFS='~'
+ save_ifs=$IFS; IFS='~'
for cmd in $concat_cmds; do
- IFS="$save_ifs"
- $opt_silent || {
+ IFS=$save_ifs
+ $opt_quiet || {
func_quote_for_expand "$cmd"
eval "func_echo $func_quote_for_expand_result"
}
@@ -8432,7 +9940,7 @@ EOF
lt_exit=$?
# Restore the uninstalled library and exit
- if test "$opt_mode" = relink; then
+ if test relink = "$opt_mode"; then
( cd "$output_objdir" && \
$RM "${realname}T" && \
$MV "${realname}U" "$realname" )
@@ -8441,7 +9949,7 @@ EOF
exit $lt_exit
}
done
- IFS="$save_ifs"
+ IFS=$save_ifs
if test -n "$export_symbols_regex" && ${skipped_export-false}; then
func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
@@ -8449,18 +9957,18 @@ EOF
fi
fi
- if ${skipped_export-false}; then
+ ${skipped_export-false} && {
if test -n "$export_symbols" && test -n "$include_expsyms"; then
- tmp_export_symbols="$export_symbols"
- test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+ tmp_export_symbols=$export_symbols
+ test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols
$opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
fi
if test -n "$orig_export_symbols"; then
# The given exports_symbols file has to be filtered, so filter it.
- func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+ func_verbose "filter symbol list for '$libname.la' to tag DATA exports"
# FIXME: $output_objdir/$libname.filter potentially contains lots of
- # 's' commands which not all seds can handle. GNU sed should be fine
+ # 's' commands, which not all seds can handle. GNU sed should be fine
# though. Also, the filter scales superlinearly with the number of
# global variables. join(1) would be nice here, but unfortunately
# isn't a blessed tool.
@@ -8469,7 +9977,7 @@ EOF
export_symbols=$output_objdir/$libname.def
$opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
fi
- fi
+ }
libobjs=$output
# Restore the value of output.
@@ -8483,7 +9991,7 @@ EOF
# value of $libobjs for piecewise linking.
# Do each of the archive commands.
- if test "$module" = yes && test -n "$module_cmds" ; then
+ if test yes = "$module" && test -n "$module_cmds"; then
if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
cmds=$module_expsym_cmds
else
@@ -8505,7 +10013,7 @@ EOF
# Add any objects from preloaded convenience libraries
if test -n "$dlprefiles"; then
- gentop="$output_objdir/${outputname}x"
+ gentop=$output_objdir/${outputname}x
func_append generated " $gentop"
func_extract_archives $gentop $dlprefiles
@@ -8513,11 +10021,12 @@ EOF
test "X$libobjs" = "X " && libobjs=
fi
- save_ifs="$IFS"; IFS='~'
+ save_ifs=$IFS; IFS='~'
for cmd in $cmds; do
- IFS="$save_ifs"
+ IFS=$sp$nl
eval cmd=\"$cmd\"
- $opt_silent || {
+ IFS=$save_ifs
+ $opt_quiet || {
func_quote_for_expand "$cmd"
eval "func_echo $func_quote_for_expand_result"
}
@@ -8525,7 +10034,7 @@ EOF
lt_exit=$?
# Restore the uninstalled library and exit
- if test "$opt_mode" = relink; then
+ if test relink = "$opt_mode"; then
( cd "$output_objdir" && \
$RM "${realname}T" && \
$MV "${realname}U" "$realname" )
@@ -8534,10 +10043,10 @@ EOF
exit $lt_exit
}
done
- IFS="$save_ifs"
+ IFS=$save_ifs
# Restore the uninstalled library and exit
- if test "$opt_mode" = relink; then
+ if test relink = "$opt_mode"; then
$opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
if test -n "$convenience"; then
@@ -8557,39 +10066,39 @@ EOF
done
# If -module or -export-dynamic was specified, set the dlname.
- if test "$module" = yes || test "$export_dynamic" = yes; then
+ if test yes = "$module" || test yes = "$export_dynamic"; then
# On all known operating systems, these are identical.
- dlname="$soname"
+ dlname=$soname
fi
fi
;;
obj)
- if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
- func_warning "\`-dlopen' is ignored for objects"
+ if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
+ func_warning "'-dlopen' is ignored for objects"
fi
case " $deplibs" in
*\ -l* | *\ -L*)
- func_warning "\`-l' and \`-L' are ignored for objects" ;;
+ func_warning "'-l' and '-L' are ignored for objects" ;;
esac
test -n "$rpath" && \
- func_warning "\`-rpath' is ignored for objects"
+ func_warning "'-rpath' is ignored for objects"
test -n "$xrpath" && \
- func_warning "\`-R' is ignored for objects"
+ func_warning "'-R' is ignored for objects"
test -n "$vinfo" && \
- func_warning "\`-version-info' is ignored for objects"
+ func_warning "'-version-info' is ignored for objects"
test -n "$release" && \
- func_warning "\`-release' is ignored for objects"
+ func_warning "'-release' is ignored for objects"
case $output in
*.lo)
test -n "$objs$old_deplibs" && \
- func_fatal_error "cannot build library object \`$output' from non-libtool objects"
+ func_fatal_error "cannot build library object '$output' from non-libtool objects"
libobj=$output
func_lo2o "$libobj"
@@ -8597,7 +10106,7 @@ EOF
;;
*)
libobj=
- obj="$output"
+ obj=$output
;;
esac
@@ -8610,17 +10119,19 @@ EOF
# the extraction.
reload_conv_objs=
gentop=
- # reload_cmds runs $LD directly, so let us get rid of
- # -Wl from whole_archive_flag_spec and hope we can get by with
- # turning comma into space..
- wl=
-
+ # if reload_cmds runs $LD directly, get rid of -Wl from
+ # whole_archive_flag_spec and hope we can get by with turning comma
+ # into space.
+ case $reload_cmds in
+ *\$LD[\ \$]*) wl= ;;
+ esac
if test -n "$convenience"; then
if test -n "$whole_archive_flag_spec"; then
eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
- reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+ test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+ reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags
else
- gentop="$output_objdir/${obj}x"
+ gentop=$output_objdir/${obj}x
func_append generated " $gentop"
func_extract_archives $gentop $convenience
@@ -8629,12 +10140,12 @@ EOF
fi
# If we're not building shared, we need to use non_pic_objs
- test "$build_libtool_libs" != yes && libobjs="$non_pic_objects"
+ test yes = "$build_libtool_libs" || libobjs=$non_pic_objects
# Create the old-style object.
- reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+ reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs
- output="$obj"
+ output=$obj
func_execute_cmds "$reload_cmds" 'exit $?'
# Exit if we aren't doing a library object file.
@@ -8646,7 +10157,7 @@ EOF
exit $EXIT_SUCCESS
fi
- if test "$build_libtool_libs" != yes; then
+ test yes = "$build_libtool_libs" || {
if test -n "$gentop"; then
func_show_eval '${RM}r "$gentop"'
fi
@@ -8656,12 +10167,12 @@ EOF
# $show "echo timestamp > $libobj"
# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
exit $EXIT_SUCCESS
- fi
+ }
- if test -n "$pic_flag" || test "$pic_mode" != default; then
+ if test -n "$pic_flag" || test default != "$pic_mode"; then
# Only do commands if we really have different PIC objects.
reload_objs="$libobjs $reload_conv_objs"
- output="$libobj"
+ output=$libobj
func_execute_cmds "$reload_cmds" 'exit $?'
fi
@@ -8678,16 +10189,14 @@ EOF
output=$func_stripname_result.exe;;
esac
test -n "$vinfo" && \
- func_warning "\`-version-info' is ignored for programs"
+ func_warning "'-version-info' is ignored for programs"
test -n "$release" && \
- func_warning "\`-release' is ignored for programs"
+ func_warning "'-release' is ignored for programs"
- test "$preload" = yes \
- && test "$dlopen_support" = unknown \
- && test "$dlopen_self" = unknown \
- && test "$dlopen_self_static" = unknown && \
- func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
+ $preload \
+ && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \
+ && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support."
case $host in
*-*-rhapsody* | *-*-darwin1.[012])
@@ -8701,11 +10210,11 @@ EOF
*-*-darwin*)
# Don't allow lazy linking, it breaks C++ global constructors
# But is supposedly fixed on 10.4 or later (yay!).
- if test "$tagname" = CXX ; then
+ if test CXX = "$tagname"; then
case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
10.[0123])
- func_append compile_command " ${wl}-bind_at_load"
- func_append finalize_command " ${wl}-bind_at_load"
+ func_append compile_command " $wl-bind_at_load"
+ func_append finalize_command " $wl-bind_at_load"
;;
esac
fi
@@ -8741,7 +10250,7 @@ EOF
*) func_append new_libs " $deplib" ;;
esac
done
- compile_deplibs="$new_libs"
+ compile_deplibs=$new_libs
func_append compile_command " $compile_deplibs"
@@ -8765,7 +10274,7 @@ EOF
if test -n "$hardcode_libdir_flag_spec"; then
if test -n "$hardcode_libdir_separator"; then
if test -z "$hardcode_libdirs"; then
- hardcode_libdirs="$libdir"
+ hardcode_libdirs=$libdir
else
# Just accumulate the unique libdirs.
case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
@@ -8788,7 +10297,7 @@ EOF
fi
case $host in
*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
- testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
+ testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'`
case :$dllsearchpath: in
*":$libdir:"*) ;;
::) dllsearchpath=$libdir;;
@@ -8805,10 +10314,10 @@ EOF
# Substitute the hardcoded libdirs into the rpath.
if test -n "$hardcode_libdir_separator" &&
test -n "$hardcode_libdirs"; then
- libdir="$hardcode_libdirs"
+ libdir=$hardcode_libdirs
eval rpath=\" $hardcode_libdir_flag_spec\"
fi
- compile_rpath="$rpath"
+ compile_rpath=$rpath
rpath=
hardcode_libdirs=
@@ -8816,7 +10325,7 @@ EOF
if test -n "$hardcode_libdir_flag_spec"; then
if test -n "$hardcode_libdir_separator"; then
if test -z "$hardcode_libdirs"; then
- hardcode_libdirs="$libdir"
+ hardcode_libdirs=$libdir
else
# Just accumulate the unique libdirs.
case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
@@ -8841,45 +10350,43 @@ EOF
# Substitute the hardcoded libdirs into the rpath.
if test -n "$hardcode_libdir_separator" &&
test -n "$hardcode_libdirs"; then
- libdir="$hardcode_libdirs"
+ libdir=$hardcode_libdirs
eval rpath=\" $hardcode_libdir_flag_spec\"
fi
- finalize_rpath="$rpath"
+ finalize_rpath=$rpath
- if test -n "$libobjs" && test "$build_old_libs" = yes; then
+ if test -n "$libobjs" && test yes = "$build_old_libs"; then
# Transform all the library objects into standard objects.
compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
fi
- func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
+ func_generate_dlsyms "$outputname" "@PROGRAM@" false
# template prelinking step
if test -n "$prelink_cmds"; then
func_execute_cmds "$prelink_cmds" 'exit $?'
fi
- wrappers_required=yes
+ wrappers_required=:
case $host in
*cegcc* | *mingw32ce*)
# Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
- wrappers_required=no
+ wrappers_required=false
;;
*cygwin* | *mingw* )
- if test "$build_libtool_libs" != yes; then
- wrappers_required=no
- fi
+ test yes = "$build_libtool_libs" || wrappers_required=false
;;
*)
- if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
- wrappers_required=no
+ if test no = "$need_relink" || test yes != "$build_libtool_libs"; then
+ wrappers_required=false
fi
;;
esac
- if test "$wrappers_required" = no; then
+ $wrappers_required || {
# Replace the output file specification.
compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
- link_command="$compile_command$compile_rpath"
+ link_command=$compile_command$compile_rpath
# We have no uninstalled library dependencies, so finalize right now.
exit_status=0
@@ -8892,12 +10399,12 @@ EOF
fi
# Delete the generated files.
- if test -f "$output_objdir/${outputname}S.${objext}"; then
- func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
+ if test -f "$output_objdir/${outputname}S.$objext"; then
+ func_show_eval '$RM "$output_objdir/${outputname}S.$objext"'
fi
exit $exit_status
- fi
+ }
if test -n "$compile_shlibpath$finalize_shlibpath"; then
compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
@@ -8927,9 +10434,9 @@ EOF
fi
fi
- if test "$no_install" = yes; then
+ if test yes = "$no_install"; then
# We don't need to create a wrapper script.
- link_command="$compile_var$compile_command$compile_rpath"
+ link_command=$compile_var$compile_command$compile_rpath
# Replace the output file specification.
link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
# Delete the old output file.
@@ -8946,27 +10453,28 @@ EOF
exit $EXIT_SUCCESS
fi
- if test "$hardcode_action" = relink; then
- # Fast installation is not supported
- link_command="$compile_var$compile_command$compile_rpath"
- relink_command="$finalize_var$finalize_command$finalize_rpath"
+ case $hardcode_action,$fast_install in
+ relink,*)
+ # Fast installation is not supported
+ link_command=$compile_var$compile_command$compile_rpath
+ relink_command=$finalize_var$finalize_command$finalize_rpath
- func_warning "this platform does not like uninstalled shared libraries"
- func_warning "\`$output' will be relinked during installation"
- else
- if test "$fast_install" != no; then
- link_command="$finalize_var$compile_command$finalize_rpath"
- if test "$fast_install" = yes; then
- relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
- else
- # fast_install is set to needless
- relink_command=
- fi
- else
- link_command="$compile_var$compile_command$compile_rpath"
- relink_command="$finalize_var$finalize_command$finalize_rpath"
- fi
- fi
+ func_warning "this platform does not like uninstalled shared libraries"
+ func_warning "'$output' will be relinked during installation"
+ ;;
+ *,yes)
+ link_command=$finalize_var$compile_command$finalize_rpath
+ relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
+ ;;
+ *,no)
+ link_command=$compile_var$compile_command$compile_rpath
+ relink_command=$finalize_var$finalize_command$finalize_rpath
+ ;;
+ *,needless)
+ link_command=$finalize_var$compile_command$finalize_rpath
+ relink_command=
+ ;;
+ esac
# Replace the output file specification.
link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
@@ -9023,8 +10531,8 @@ EOF
func_dirname_and_basename "$output" "" "."
output_name=$func_basename_result
output_path=$func_dirname_result
- cwrappersource="$output_path/$objdir/lt-$output_name.c"
- cwrapper="$output_path/$output_name.exe"
+ cwrappersource=$output_path/$objdir/lt-$output_name.c
+ cwrapper=$output_path/$output_name.exe
$RM $cwrappersource $cwrapper
trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
@@ -9045,7 +10553,7 @@ EOF
trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
$opt_dry_run || {
# note: this script will not be executed, so do not chmod.
- if test "x$build" = "x$host" ; then
+ if test "x$build" = "x$host"; then
$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
else
func_emit_wrapper no > $func_ltwrapper_scriptname_result
@@ -9068,25 +10576,27 @@ EOF
# See if we need to build an old-fashioned archive.
for oldlib in $oldlibs; do
- if test "$build_libtool_libs" = convenience; then
- oldobjs="$libobjs_save $symfileobj"
- addlibs="$convenience"
- build_libtool_libs=no
- else
- if test "$build_libtool_libs" = module; then
- oldobjs="$libobjs_save"
+ case $build_libtool_libs in
+ convenience)
+ oldobjs="$libobjs_save $symfileobj"
+ addlibs=$convenience
build_libtool_libs=no
- else
+ ;;
+ module)
+ oldobjs=$libobjs_save
+ addlibs=$old_convenience
+ build_libtool_libs=no
+ ;;
+ *)
oldobjs="$old_deplibs $non_pic_objects"
- if test "$preload" = yes && test -f "$symfileobj"; then
- func_append oldobjs " $symfileobj"
- fi
- fi
- addlibs="$old_convenience"
- fi
+ $preload && test -f "$symfileobj" \
+ && func_append oldobjs " $symfileobj"
+ addlibs=$old_convenience
+ ;;
+ esac
if test -n "$addlibs"; then
- gentop="$output_objdir/${outputname}x"
+ gentop=$output_objdir/${outputname}x
func_append generated " $gentop"
func_extract_archives $gentop $addlibs
@@ -9094,13 +10604,13 @@ EOF
fi
# Do each command in the archive commands.
- if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+ if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then
cmds=$old_archive_from_new_cmds
else
# Add any objects from preloaded convenience libraries
if test -n "$dlprefiles"; then
- gentop="$output_objdir/${outputname}x"
+ gentop=$output_objdir/${outputname}x
func_append generated " $gentop"
func_extract_archives $gentop $dlprefiles
@@ -9121,7 +10631,7 @@ EOF
:
else
echo "copying selected object files to avoid basename conflicts..."
- gentop="$output_objdir/${outputname}x"
+ gentop=$output_objdir/${outputname}x
func_append generated " $gentop"
func_mkdir_p "$gentop"
save_oldobjs=$oldobjs
@@ -9130,7 +10640,7 @@ EOF
for obj in $save_oldobjs
do
func_basename "$obj"
- objbase="$func_basename_result"
+ objbase=$func_basename_result
case " $oldobjs " in
" ") oldobjs=$obj ;;
*[\ /]"$objbase "*)
@@ -9152,6 +10662,8 @@ EOF
esac
done
fi
+ func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+ tool_oldlib=$func_to_tool_file_result
eval cmds=\"$old_archive_cmds\"
func_len " $cmds"
@@ -9197,18 +10709,18 @@ EOF
else
# the above command should be used before it gets too long
oldobjs=$objlist
- if test "$obj" = "$last_oldobj" ; then
+ if test "$obj" = "$last_oldobj"; then
RANLIB=$save_RANLIB
fi
test -z "$concat_cmds" || concat_cmds=$concat_cmds~
- eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+ eval concat_cmds=\"\$concat_cmds$old_archive_cmds\"
objlist=
len=$len0
fi
done
RANLIB=$save_RANLIB
oldobjs=$objlist
- if test "X$oldobjs" = "X" ; then
+ if test -z "$oldobjs"; then
eval cmds=\"\$concat_cmds\"
else
eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
@@ -9225,7 +10737,7 @@ EOF
case $output in
*.la)
old_library=
- test "$build_old_libs" = yes && old_library="$libname.$libext"
+ test yes = "$build_old_libs" && old_library=$libname.$libext
func_verbose "creating $output"
# Preserve any variables that may affect compiler behavior
@@ -9240,30 +10752,31 @@ EOF
fi
done
# Quote the link command for shipping.
- relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+ relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
- if test "$hardcode_automatic" = yes ; then
+ if test yes = "$hardcode_automatic"; then
relink_command=
fi
# Only create the output if not a dry run.
$opt_dry_run || {
for installed in no yes; do
- if test "$installed" = yes; then
+ if test yes = "$installed"; then
if test -z "$install_libdir"; then
break
fi
- output="$output_objdir/$outputname"i
+ output=$output_objdir/${outputname}i
# Replace all uninstalled libtool libraries with the installed ones
newdependency_libs=
for deplib in $dependency_libs; do
case $deplib in
*.la)
func_basename "$deplib"
- name="$func_basename_result"
- eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+ name=$func_basename_result
+ func_resolve_sysroot "$deplib"
+ eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
test -z "$libdir" && \
- func_fatal_error "\`$deplib' is not a valid libtool archive"
+ func_fatal_error "'$deplib' is not a valid libtool archive"
func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
;;
-L*)
@@ -9279,23 +10792,23 @@ EOF
*) func_append newdependency_libs " $deplib" ;;
esac
done
- dependency_libs="$newdependency_libs"
+ dependency_libs=$newdependency_libs
newdlfiles=
for lib in $dlfiles; do
case $lib in
*.la)
func_basename "$lib"
- name="$func_basename_result"
- eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+ name=$func_basename_result
+ eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
test -z "$libdir" && \
- func_fatal_error "\`$lib' is not a valid libtool archive"
+ func_fatal_error "'$lib' is not a valid libtool archive"
func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
;;
*) func_append newdlfiles " $lib" ;;
esac
done
- dlfiles="$newdlfiles"
+ dlfiles=$newdlfiles
newdlprefiles=
for lib in $dlprefiles; do
case $lib in
@@ -9305,34 +10818,34 @@ EOF
# didn't already link the preopened objects directly into
# the library:
func_basename "$lib"
- name="$func_basename_result"
- eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+ name=$func_basename_result
+ eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
test -z "$libdir" && \
- func_fatal_error "\`$lib' is not a valid libtool archive"
+ func_fatal_error "'$lib' is not a valid libtool archive"
func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
;;
esac
done
- dlprefiles="$newdlprefiles"
+ dlprefiles=$newdlprefiles
else
newdlfiles=
for lib in $dlfiles; do
case $lib in
- [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+ [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;;
*) abs=`pwd`"/$lib" ;;
esac
func_append newdlfiles " $abs"
done
- dlfiles="$newdlfiles"
+ dlfiles=$newdlfiles
newdlprefiles=
for lib in $dlprefiles; do
case $lib in
- [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+ [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;;
*) abs=`pwd`"/$lib" ;;
esac
func_append newdlprefiles " $abs"
done
- dlprefiles="$newdlprefiles"
+ dlprefiles=$newdlprefiles
fi
$RM $output
# place dlname in correct position for cygwin
@@ -9348,10 +10861,9 @@ EOF
case $host,$output,$installed,$module,$dlname in
*cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
# If a -bindir argument was supplied, place the dll there.
- if test "x$bindir" != x ;
- then
+ if test -n "$bindir"; then
func_relative_path "$install_libdir" "$bindir"
- tdlname=$func_relative_path_result$dlname
+ tdlname=$func_relative_path_result/$dlname
else
# Otherwise fall back on heuristic.
tdlname=../bin/$dlname
@@ -9360,7 +10872,7 @@ EOF
esac
$ECHO > $output "\
# $outputname - a libtool library file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
#
# Please DO NOT delete this file!
# It is necessary for linking the library.
@@ -9374,7 +10886,7 @@ library_names='$library_names'
# The name of the static archive.
old_library='$old_library'
-# Linker flags that can not go in dependency_libs.
+# Linker flags that cannot go in dependency_libs.
inherited_linker_flags='$new_inherited_linker_flags'
# Libraries that this one depends upon.
@@ -9400,7 +10912,7 @@ dlpreopen='$dlprefiles'
# Directory that this library needs to be installed in:
libdir='$install_libdir'"
- if test "$installed" = no && test "$need_relink" = yes; then
+ if test no,yes = "$installed,$need_relink"; then
$ECHO >> $output "\
relink_command=\"$relink_command\""
fi
@@ -9415,27 +10927,29 @@ relink_command=\"$relink_command\""
exit $EXIT_SUCCESS
}
-{ test "$opt_mode" = link || test "$opt_mode" = relink; } &&
- func_mode_link ${1+"$@"}
+if test link = "$opt_mode" || test relink = "$opt_mode"; then
+ func_mode_link ${1+"$@"}
+fi
# func_mode_uninstall arg...
func_mode_uninstall ()
{
- $opt_debug
- RM="$nonopt"
+ $debug_cmd
+
+ RM=$nonopt
files=
- rmforce=
+ rmforce=false
exit_status=0
# This variable tells wrapper scripts just to set variables rather
# than running their programs.
- libtool_install_magic="$magic"
+ libtool_install_magic=$magic
for arg
do
case $arg in
- -f) func_append RM " $arg"; rmforce=yes ;;
+ -f) func_append RM " $arg"; rmforce=: ;;
-*) func_append RM " $arg" ;;
*) func_append files " $arg" ;;
esac
@@ -9448,18 +10962,18 @@ func_mode_uninstall ()
for file in $files; do
func_dirname "$file" "" "."
- dir="$func_dirname_result"
- if test "X$dir" = X.; then
- odir="$objdir"
+ dir=$func_dirname_result
+ if test . = "$dir"; then
+ odir=$objdir
else
- odir="$dir/$objdir"
+ odir=$dir/$objdir
fi
func_basename "$file"
- name="$func_basename_result"
- test "$opt_mode" = uninstall && odir="$dir"
+ name=$func_basename_result
+ test uninstall = "$opt_mode" && odir=$dir
# Remember odir for removal later, being careful to avoid duplicates
- if test "$opt_mode" = clean; then
+ if test clean = "$opt_mode"; then
case " $rmdirs " in
*" $odir "*) ;;
*) func_append rmdirs " $odir" ;;
@@ -9474,11 +10988,11 @@ func_mode_uninstall ()
elif test -d "$file"; then
exit_status=1
continue
- elif test "$rmforce" = yes; then
+ elif $rmforce; then
continue
fi
- rmfiles="$file"
+ rmfiles=$file
case $name in
*.la)
@@ -9492,7 +11006,7 @@ func_mode_uninstall ()
done
test -n "$old_library" && func_append rmfiles " $odir/$old_library"
- case "$opt_mode" in
+ case $opt_mode in
clean)
case " $library_names " in
*" $dlname "*) ;;
@@ -9503,12 +11017,12 @@ func_mode_uninstall ()
uninstall)
if test -n "$library_names"; then
# Do each command in the postuninstall commands.
- func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+ func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1'
fi
if test -n "$old_library"; then
# Do each command in the old_postuninstall commands.
- func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+ func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1'
fi
# FIXME: should reinstall the best remaining shared library.
;;
@@ -9524,21 +11038,19 @@ func_mode_uninstall ()
func_source $dir/$name
# Add PIC object to the list of files to remove.
- if test -n "$pic_object" &&
- test "$pic_object" != none; then
+ if test -n "$pic_object" && test none != "$pic_object"; then
func_append rmfiles " $dir/$pic_object"
fi
# Add non-PIC object to the list of files to remove.
- if test -n "$non_pic_object" &&
- test "$non_pic_object" != none; then
+ if test -n "$non_pic_object" && test none != "$non_pic_object"; then
func_append rmfiles " $dir/$non_pic_object"
fi
fi
;;
*)
- if test "$opt_mode" = clean ; then
+ if test clean = "$opt_mode"; then
noexename=$name
case $file in
*.exe)
@@ -9565,12 +11077,12 @@ func_mode_uninstall ()
# note $name still contains .exe if it was in $file originally
# as does the version of $file that was added into $rmfiles
- func_append rmfiles " $odir/$name $odir/${name}S.${objext}"
- if test "$fast_install" = yes && test -n "$relink_command"; then
+ func_append rmfiles " $odir/$name $odir/${name}S.$objext"
+ if test yes = "$fast_install" && test -n "$relink_command"; then
func_append rmfiles " $odir/lt-$name"
fi
- if test "X$noexename" != "X$name" ; then
- func_append rmfiles " $odir/lt-${noexename}.c"
+ if test "X$noexename" != "X$name"; then
+ func_append rmfiles " $odir/lt-$noexename.c"
fi
fi
fi
@@ -9579,7 +11091,7 @@ func_mode_uninstall ()
func_show_eval "$RM $rmfiles" 'exit_status=1'
done
- # Try to remove the ${objdir}s in the directories where we deleted files
+ # Try to remove the $objdir's in the directories where we deleted files
for dir in $rmdirs; do
if test -d "$dir"; then
func_show_eval "rmdir $dir >/dev/null 2>&1"
@@ -9589,16 +11101,17 @@ func_mode_uninstall ()
exit $exit_status
}
-{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } &&
- func_mode_uninstall ${1+"$@"}
+if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then
+ func_mode_uninstall ${1+"$@"}
+fi
test -z "$opt_mode" && {
- help="$generic_help"
+ help=$generic_help
func_fatal_help "you must specify a MODE"
}
test -z "$exec_cmd" && \
- func_fatal_help "invalid operation mode \`$opt_mode'"
+ func_fatal_help "invalid operation mode '$opt_mode'"
if test -n "$exec_cmd"; then
eval exec "$exec_cmd"
@@ -9609,7 +11122,7 @@ exit $exit_status
# The TAGs below are defined such that we never get into a situation
-# in which we disable both kinds of libraries. Given conflicting
+# where we disable both kinds of libraries. Given conflicting
# choices, we go for a static library, that is the most portable,
# since we can't tell whether shared libraries were disabled because
# the user asked for that or because the platform doesn't support
@@ -9632,5 +11145,3 @@ build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
# mode:shell-script
# sh-indentation:2
# End:
-# vi:sw=2
-
diff --git a/3rdparty/libjpeg/makefile.ansi b/3rdparty/libjpeg/makefile.ansi
index 7d0499f8f49..8b980b6fe40 100644
--- a/3rdparty/libjpeg/makefile.ansi
+++ b/3rdparty/libjpeg/makefile.ansi
@@ -60,23 +60,23 @@ INCLUDES= jdct.h jerror.h jinclude.h jmemsys.h jmorecfg.h jpegint.h \
DOCS= README install.txt usage.txt cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 \
wrjpgcom.1 wizard.txt example.c libjpeg.txt structure.txt \
coderules.txt filelist.txt change.log
-MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \
- makefile.mc6 makefile.dj makefile.wat makefile.vc makejdsw.vc6 \
- makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \
- makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \
- maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \
- makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \
- makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \
- makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \
- makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \
- makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \
- makefile.mms makefile.vms makvms.opt
+MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.b32 \
+ makefile.bcc makefile.mc6 makefile.dj makefile.wat makefile.vc \
+ makejdsw.vc6 makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 \
+ makecdep.vc6 makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 \
+ makedmak.vc6 maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 \
+ makerdsp.vc6 makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 \
+ makejsln.v10 makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 \
+ makecfil.v10 makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 \
+ makervcx.v10 makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac \
+ makcjpeg.st makdjpeg.st makljpeg.st maktjpeg.st makefile.manx \
+ makefile.sas makefile.mms makefile.vms makvms.opt
CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \
jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \
jconfig.vms
-CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp missing
-OTHERFILES= jconfig.txt ckconfig.c ansi2knr.c ansi2knr.1 jmemdosa.asm \
- libjpeg.map
+CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp \
+ missing ar-lib
+OTHERFILES= jconfig.txt ckconfig.c jmemdosa.asm libjpeg.map
TESTFILES= testorig.jpg testimg.ppm testimg.bmp testimg.jpg testprog.jpg \
testimgp.jpg
DISTFILES= $(DOCS) $(MKFILES) $(CONFIGFILES) $(SOURCES) $(INCLUDES) \
diff --git a/3rdparty/libjpeg/makefile.b32 b/3rdparty/libjpeg/makefile.b32
new file mode 100644
index 00000000000..ae189b0d410
--- /dev/null
+++ b/3rdparty/libjpeg/makefile.b32
@@ -0,0 +1,243 @@
+# Makefile for Independent JPEG Group's software
+
+# This makefile is suitable for Borland C on MS-DOS.
+# It works with Borland C++ 32-bit for DOS, revision 5.0 or later.
+# Thanks to Tom Wright and Ge' Weijers (original DOS) and
+# Joe Slater for adding 32-bit additions (needed for Borland
+# revision 5.5).
+
+# Read installation instructions before saying "make" !!
+
+# The name of your C compiler:
+CC= bcc32
+
+# You may need to adjust these cc options:
+CFLAGS= -O2 -w-par -w-stu -w-ccc -w-rch -w-aus
+# -w-par suppresses warnings about unused function parameters
+# -w-stu suppresses warnings about incomplete structures
+# -w-ccc suppresses warnings about compile-time-constant conditions
+# -w-rch suppresses warnings about unreachable code
+# Generally, we recommend defining any configuration symbols in jconfig.h,
+# NOT via -D switches here.
+
+# Link-time cc options:
+LDFLAGS=
+# -lc case-significant link
+
+# Put here the object file name for the correct system-dependent memory
+# manager file.
+# SYSDEPMEMLIB must list the same files with "+" signs for the librarian.
+SYSDEPMEM= jmemnobs.obj
+SYSDEPMEMLIB= +jmemnobs.obj
+
+# End of configurable options.
+
+
+# source files: JPEG library proper
+LIBSOURCES= jaricom.c jcapimin.c jcapistd.c jcarith.c jccoefct.c jccolor.c \
+ jcdctmgr.c jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c \
+ jcomapi.c jcparam.c jcprepct.c jcsample.c jctrans.c jdapimin.c \
+ jdapistd.c jdarith.c jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c \
+ jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdmaster.c \
+ jdmerge.c jdpostct.c jdsample.c jdtrans.c jerror.c jfdctflt.c \
+ jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c jquant1.c \
+ jquant2.c jutils.c jmemmgr.c
+# memmgr back ends: compile only one of these into a working library
+SYSDEPSOURCES= jmemansi.c jmemname.c jmemnobs.c jmemdos.c jmemmac.c
+# source files: cjpeg/djpeg/jpegtran applications, also rdjpgcom/wrjpgcom
+APPSOURCES= cjpeg.c djpeg.c jpegtran.c rdjpgcom.c wrjpgcom.c cdjpeg.c \
+ rdcolmap.c rdswitch.c transupp.c rdppm.c wrppm.c rdgif.c wrgif.c \
+ rdtarga.c wrtarga.c rdbmp.c wrbmp.c rdrle.c wrrle.c
+SOURCES= $(LIBSOURCES) $(SYSDEPSOURCES) $(APPSOURCES)
+# files included by source files
+INCLUDES= jdct.h jerror.h jinclude.h jmemsys.h jmorecfg.h jpegint.h \
+ jpeglib.h jversion.h cdjpeg.h cderror.h transupp.h
+# documentation, test, and support files
+DOCS= README install.txt usage.txt cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 \
+ wrjpgcom.1 wizard.txt example.c libjpeg.txt structure.txt \
+ coderules.txt filelist.txt change.log
+MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.b32 \
+ makefile.bcc makefile.mc6 makefile.dj makefile.wat makefile.vc \
+ makejdsw.vc6 makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 \
+ makecdep.vc6 makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 \
+ makedmak.vc6 maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 \
+ makerdsp.vc6 makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 \
+ makejsln.v10 makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 \
+ makecfil.v10 makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 \
+ makervcx.v10 makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac \
+ makcjpeg.st makdjpeg.st makljpeg.st maktjpeg.st makefile.manx \
+ makefile.sas makefile.mms makefile.vms makvms.opt
+CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \
+ jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \
+ jconfig.vms
+CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp \
+ missing ar-lib
+OTHERFILES= jconfig.txt ckconfig.c jmemdosa.asm libjpeg.map
+TESTFILES= testorig.jpg testimg.ppm testimg.bmp testimg.jpg testprog.jpg \
+ testimgp.jpg
+DISTFILES= $(DOCS) $(MKFILES) $(CONFIGFILES) $(SOURCES) $(INCLUDES) \
+ $(CONFIGUREFILES) $(OTHERFILES) $(TESTFILES)
+# library object files common to compression and decompression
+COMOBJECTS= jaricom.obj jcomapi.obj jutils.obj jerror.obj jmemmgr.obj $(SYSDEPMEM)
+# compression library object files
+CLIBOBJECTS= jcapimin.obj jcapistd.obj jcarith.obj jctrans.obj jcparam.obj \
+ jdatadst.obj jcinit.obj jcmaster.obj jcmarker.obj jcmainct.obj \
+ jcprepct.obj jccoefct.obj jccolor.obj jcsample.obj jchuff.obj \
+ jcdctmgr.obj jfdctfst.obj jfdctflt.obj jfdctint.obj
+# decompression library object files
+DLIBOBJECTS= jdapimin.obj jdapistd.obj jdarith.obj jdtrans.obj jdatasrc.obj \
+ jdmaster.obj jdinput.obj jdmarker.obj jdhuff.obj jdmainct.obj \
+ jdcoefct.obj jdpostct.obj jddctmgr.obj jidctfst.obj jidctflt.obj \
+ jidctint.obj jdsample.obj jdcolor.obj jquant1.obj jquant2.obj \
+ jdmerge.obj
+# These objectfiles are included in libjpeg.lib
+LIBOBJECTS= $(CLIBOBJECTS) $(DLIBOBJECTS) $(COMOBJECTS)
+# object files for sample applications (excluding library files)
+COBJECTS= cjpeg.obj rdppm.obj rdgif.obj rdtarga.obj rdrle.obj rdbmp.obj \
+ rdswitch.obj cdjpeg.obj
+DOBJECTS= djpeg.obj wrppm.obj wrgif.obj wrtarga.obj wrrle.obj wrbmp.obj \
+ rdcolmap.obj cdjpeg.obj
+TROBJECTS= jpegtran.obj rdswitch.obj cdjpeg.obj transupp.obj
+
+
+all: libjpeg.lib cjpeg.exe djpeg.exe jpegtran.exe rdjpgcom.exe wrjpgcom.exe
+
+libjpeg.lib: $(LIBOBJECTS)
+ - del libjpeg.lib
+ tlib libjpeg.lib /E /C @&&|
++jcapimin.obj +jcapistd.obj +jcarith.obj +jctrans.obj +jcparam.obj &
++jdatadst.obj +jcinit.obj +jcmaster.obj +jcmarker.obj +jcmainct.obj &
++jcprepct.obj +jccoefct.obj +jccolor.obj +jcsample.obj +jchuff.obj &
++jcdctmgr.obj +jfdctfst.obj +jfdctflt.obj +jfdctint.obj +jdapimin.obj &
++jdapistd.obj +jdarith.obj +jdtrans.obj +jdatasrc.obj +jdmaster.obj &
++jdinput.obj +jdmarker.obj +jdhuff.obj +jdmainct.obj +jdcoefct.obj &
++jdpostct.obj +jddctmgr.obj +jidctfst.obj +jidctflt.obj +jidctint.obj &
++jdsample.obj +jdcolor.obj +jquant1.obj +jquant2.obj +jdmerge.obj &
++jaricom.obj +jcomapi.obj +jutils.obj +jerror.obj +jmemmgr.obj &
+$(SYSDEPMEMLIB)
+|
+
+cjpeg.exe: $(COBJECTS) libjpeg.lib
+ $(CC) $(LDFLAGS) -ecjpeg.exe $(COBJECTS) libjpeg.lib
+
+djpeg.exe: $(DOBJECTS) libjpeg.lib
+ $(CC) $(LDFLAGS) -edjpeg.exe $(DOBJECTS) libjpeg.lib
+
+jpegtran.exe: $(TROBJECTS) libjpeg.lib
+ $(CC) $(LDFLAGS) -ejpegtran.exe $(TROBJECTS) libjpeg.lib
+
+rdjpgcom.exe: rdjpgcom.c
+ $(CC) $(CFLAGS) rdjpgcom.c
+
+wrjpgcom.exe: wrjpgcom.c
+ $(CC) $(CFLAGS) wrjpgcom.c
+
+# This "{}" syntax allows Borland Make to "batch" source files.
+# In this way, each run of the compiler can build many modules.
+.c.obj:
+ $(CC) $(CFLAGS) -c{ $<}
+
+jconfig.h: jconfig.txt
+ echo You must prepare a system-dependent jconfig.h file.
+ echo Please read the installation directions in install.txt.
+ exit 1
+
+clean:
+ - del *.obj
+ - del libjpeg.lib
+ - del cjpeg.exe
+ - del djpeg.exe
+ - del jpegtran.exe
+ - del rdjpgcom.exe
+ - del wrjpgcom.exe
+ - del testout*.*
+
+test: cjpeg.exe djpeg.exe jpegtran.exe
+ - del testout*.*
+ djpeg -dct int -ppm -outfile testout.ppm testorig.jpg
+ djpeg -dct int -bmp -colors 256 -outfile testout.bmp testorig.jpg
+ cjpeg -dct int -outfile testout.jpg testimg.ppm
+ djpeg -dct int -ppm -outfile testoutp.ppm testprog.jpg
+ cjpeg -dct int -progressive -opt -outfile testoutp.jpg testimg.ppm
+ jpegtran -outfile testoutt.jpg testprog.jpg
+ echo n > n.tmp
+ comp testimg.ppm testout.ppm < n.tmp
+ comp testimg.bmp testout.bmp < n.tmp
+ comp testimg.jpg testout.jpg < n.tmp
+ comp testimg.ppm testoutp.ppm < n.tmp
+ comp testimgp.jpg testoutp.jpg < n.tmp
+ comp testorig.jpg testoutt.jpg < n.tmp
+ del n.tmp
+
+
+jaricom.obj: jaricom.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jcapimin.obj: jcapimin.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jcapistd.obj: jcapistd.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jcarith.obj: jcarith.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jccoefct.obj: jccoefct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jccolor.obj: jccolor.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jcdctmgr.obj: jcdctmgr.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h
+jchuff.obj: jchuff.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jcinit.obj: jcinit.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jcmainct.obj: jcmainct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jcmarker.obj: jcmarker.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jcmaster.obj: jcmaster.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jcomapi.obj: jcomapi.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jcparam.obj: jcparam.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jcprepct.obj: jcprepct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jcsample.obj: jcsample.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jctrans.obj: jctrans.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jdapimin.obj: jdapimin.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jdapistd.obj: jdapistd.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jdarith.obj: jdarith.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jdatadst.obj: jdatadst.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h
+jdatasrc.obj: jdatasrc.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h
+jdcoefct.obj: jdcoefct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jdcolor.obj: jdcolor.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jddctmgr.obj: jddctmgr.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h
+jdhuff.obj: jdhuff.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jdinput.obj: jdinput.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jdmainct.obj: jdmainct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jdmarker.obj: jdmarker.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jdmaster.obj: jdmaster.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jdmerge.obj: jdmerge.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jdpostct.obj: jdpostct.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jdsample.obj: jdsample.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jdtrans.obj: jdtrans.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jerror.obj: jerror.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jversion.h jerror.h
+jfdctflt.obj: jfdctflt.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h
+jfdctfst.obj: jfdctfst.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h
+jfdctint.obj: jfdctint.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h
+jidctflt.obj: jidctflt.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h
+jidctfst.obj: jidctfst.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h
+jidctint.obj: jidctint.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jdct.h
+jquant1.obj: jquant1.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jquant2.obj: jquant2.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jutils.obj: jutils.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
+jmemmgr.obj: jmemmgr.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h
+jmemansi.obj: jmemansi.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h
+jmemname.obj: jmemname.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h
+jmemnobs.obj: jmemnobs.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h
+jmemdos.obj: jmemdos.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h
+jmemmac.obj: jmemmac.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jmemsys.h
+cjpeg.obj: cjpeg.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h jversion.h
+djpeg.obj: djpeg.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h jversion.h
+jpegtran.obj: jpegtran.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h transupp.h jversion.h
+rdjpgcom.obj: rdjpgcom.c jinclude.h jconfig.h
+wrjpgcom.obj: wrjpgcom.c jinclude.h jconfig.h
+cdjpeg.obj: cdjpeg.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h
+rdcolmap.obj: rdcolmap.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h
+rdswitch.obj: rdswitch.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h
+transupp.obj: transupp.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h transupp.h
+rdppm.obj: rdppm.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h
+wrppm.obj: wrppm.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h
+rdgif.obj: rdgif.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h
+wrgif.obj: wrgif.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h
+rdtarga.obj: rdtarga.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h
+wrtarga.obj: wrtarga.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h
+rdbmp.obj: rdbmp.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h
+wrbmp.obj: wrbmp.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h
+rdrle.obj: rdrle.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h
+wrrle.obj: wrrle.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h
+jmemdosa.obj: jmemdosa.asm
+ tasm /mx jmemdosa.asm
diff --git a/3rdparty/libjpeg/makefile.bcc b/3rdparty/libjpeg/makefile.bcc
index d89e09bd012..b573c901054 100644
--- a/3rdparty/libjpeg/makefile.bcc
+++ b/3rdparty/libjpeg/makefile.bcc
@@ -87,23 +87,23 @@ INCLUDES= jdct.h jerror.h jinclude.h jmemsys.h jmorecfg.h jpegint.h \
DOCS= README install.txt usage.txt cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 \
wrjpgcom.1 wizard.txt example.c libjpeg.txt structure.txt \
coderules.txt filelist.txt change.log
-MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \
- makefile.mc6 makefile.dj makefile.wat makefile.vc makejdsw.vc6 \
- makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \
- makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \
- maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \
- makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \
- makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \
- makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \
- makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \
- makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \
- makefile.mms makefile.vms makvms.opt
+MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.b32 \
+ makefile.bcc makefile.mc6 makefile.dj makefile.wat makefile.vc \
+ makejdsw.vc6 makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 \
+ makecdep.vc6 makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 \
+ makedmak.vc6 maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 \
+ makerdsp.vc6 makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 \
+ makejsln.v10 makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 \
+ makecfil.v10 makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 \
+ makervcx.v10 makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac \
+ makcjpeg.st makdjpeg.st makljpeg.st maktjpeg.st makefile.manx \
+ makefile.sas makefile.mms makefile.vms makvms.opt
CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \
jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \
jconfig.vms
-CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp missing
-OTHERFILES= jconfig.txt ckconfig.c ansi2knr.c ansi2knr.1 jmemdosa.asm \
- libjpeg.map
+CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp \
+ missing ar-lib
+OTHERFILES= jconfig.txt ckconfig.c jmemdosa.asm libjpeg.map
TESTFILES= testorig.jpg testimg.ppm testimg.bmp testimg.jpg testprog.jpg \
testimgp.jpg
DISTFILES= $(DOCS) $(MKFILES) $(CONFIGFILES) $(SOURCES) $(INCLUDES) \
diff --git a/3rdparty/libjpeg/makefile.dj b/3rdparty/libjpeg/makefile.dj
index 37b6ee7672a..e145d6a15cb 100644
--- a/3rdparty/libjpeg/makefile.dj
+++ b/3rdparty/libjpeg/makefile.dj
@@ -60,23 +60,23 @@ INCLUDES= jdct.h jerror.h jinclude.h jmemsys.h jmorecfg.h jpegint.h \
DOCS= README install.txt usage.txt cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 \
wrjpgcom.1 wizard.txt example.c libjpeg.txt structure.txt \
coderules.txt filelist.txt change.log
-MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \
- makefile.mc6 makefile.dj makefile.wat makefile.vc makejdsw.vc6 \
- makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \
- makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \
- maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \
- makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \
- makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \
- makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \
- makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \
- makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \
- makefile.mms makefile.vms makvms.opt
+MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.b32 \
+ makefile.bcc makefile.mc6 makefile.dj makefile.wat makefile.vc \
+ makejdsw.vc6 makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 \
+ makecdep.vc6 makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 \
+ makedmak.vc6 maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 \
+ makerdsp.vc6 makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 \
+ makejsln.v10 makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 \
+ makecfil.v10 makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 \
+ makervcx.v10 makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac \
+ makcjpeg.st makdjpeg.st makljpeg.st maktjpeg.st makefile.manx \
+ makefile.sas makefile.mms makefile.vms makvms.opt
CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \
jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \
jconfig.vms
-CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp missing
-OTHERFILES= jconfig.txt ckconfig.c ansi2knr.c ansi2knr.1 jmemdosa.asm \
- libjpeg.map
+CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp \
+ missing ar-lib
+OTHERFILES= jconfig.txt ckconfig.c jmemdosa.asm libjpeg.map
TESTFILES= testorig.jpg testimg.ppm testimg.bmp testimg.jpg testprog.jpg \
testimgp.jpg
DISTFILES= $(DOCS) $(MKFILES) $(CONFIGFILES) $(SOURCES) $(INCLUDES) \
diff --git a/3rdparty/libjpeg/makefile.manx b/3rdparty/libjpeg/makefile.manx
index 471f4082828..9f15d6a0c99 100644
--- a/3rdparty/libjpeg/makefile.manx
+++ b/3rdparty/libjpeg/makefile.manx
@@ -61,23 +61,23 @@ INCLUDES= jdct.h jerror.h jinclude.h jmemsys.h jmorecfg.h jpegint.h \
DOCS= README install.txt usage.txt cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 \
wrjpgcom.1 wizard.txt example.c libjpeg.txt structure.txt \
coderules.txt filelist.txt change.log
-MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \
- makefile.mc6 makefile.dj makefile.wat makefile.vc makejdsw.vc6 \
- makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \
- makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \
- maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \
- makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \
- makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \
- makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \
- makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \
- makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \
- makefile.mms makefile.vms makvms.opt
+MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.b32 \
+ makefile.bcc makefile.mc6 makefile.dj makefile.wat makefile.vc \
+ makejdsw.vc6 makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 \
+ makecdep.vc6 makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 \
+ makedmak.vc6 maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 \
+ makerdsp.vc6 makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 \
+ makejsln.v10 makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 \
+ makecfil.v10 makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 \
+ makervcx.v10 makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac \
+ makcjpeg.st makdjpeg.st makljpeg.st maktjpeg.st makefile.manx \
+ makefile.sas makefile.mms makefile.vms makvms.opt
CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \
jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \
jconfig.vms
-CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp missing
-OTHERFILES= jconfig.txt ckconfig.c ansi2knr.c ansi2knr.1 jmemdosa.asm \
- libjpeg.map
+CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp \
+ missing ar-lib
+OTHERFILES= jconfig.txt ckconfig.c jmemdosa.asm libjpeg.map
TESTFILES= testorig.jpg testimg.ppm testimg.bmp testimg.jpg testprog.jpg \
testimgp.jpg
DISTFILES= $(DOCS) $(MKFILES) $(CONFIGFILES) $(SOURCES) $(INCLUDES) \
diff --git a/3rdparty/libjpeg/makefile.mc6 b/3rdparty/libjpeg/makefile.mc6
index 1ee83be0cc7..890eb422875 100644
--- a/3rdparty/libjpeg/makefile.mc6
+++ b/3rdparty/libjpeg/makefile.mc6
@@ -58,23 +58,23 @@ INCLUDES= jdct.h jerror.h jinclude.h jmemsys.h jmorecfg.h jpegint.h \
DOCS= README install.txt usage.txt cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 \
wrjpgcom.1 wizard.txt example.c libjpeg.txt structure.txt \
coderules.txt filelist.txt change.log
-MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \
- makefile.mc6 makefile.dj makefile.wat makefile.vc makejdsw.vc6 \
- makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \
- makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \
- maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \
- makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \
- makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \
- makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \
- makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \
- makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \
- makefile.mms makefile.vms makvms.opt
+MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.b32 \
+ makefile.bcc makefile.mc6 makefile.dj makefile.wat makefile.vc \
+ makejdsw.vc6 makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 \
+ makecdep.vc6 makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 \
+ makedmak.vc6 maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 \
+ makerdsp.vc6 makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 \
+ makejsln.v10 makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 \
+ makecfil.v10 makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 \
+ makervcx.v10 makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac \
+ makcjpeg.st makdjpeg.st makljpeg.st maktjpeg.st makefile.manx \
+ makefile.sas makefile.mms makefile.vms makvms.opt
CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \
jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \
jconfig.vms
-CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp missing
-OTHERFILES= jconfig.txt ckconfig.c ansi2knr.c ansi2knr.1 jmemdosa.asm \
- libjpeg.map
+CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp \
+ missing ar-lib
+OTHERFILES= jconfig.txt ckconfig.c jmemdosa.asm libjpeg.map
TESTFILES= testorig.jpg testimg.ppm testimg.bmp testimg.jpg testprog.jpg \
testimgp.jpg
DISTFILES= $(DOCS) $(MKFILES) $(CONFIGFILES) $(SOURCES) $(INCLUDES) \
diff --git a/3rdparty/libjpeg/makefile.mms b/3rdparty/libjpeg/makefile.mms
index 6019dfa43eb..9a5fb9a58f9 100644
--- a/3rdparty/libjpeg/makefile.mms
+++ b/3rdparty/libjpeg/makefile.mms
@@ -47,23 +47,23 @@ INCLUDES= jdct.h jerror.h jinclude.h jmemsys.h jmorecfg.h jpegint.h \
DOCS= README install.txt usage.txt cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 \
wrjpgcom.1 wizard.txt example.c libjpeg.txt structure.txt \
coderules.txt filelist.txt change.log
-MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \
- makefile.mc6 makefile.dj makefile.wat makefile.vc makejdsw.vc6 \
- makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \
- makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \
- maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \
- makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \
- makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \
- makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \
- makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \
- makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \
- makefile.mms makefile.vms makvms.opt
+MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.b32 \
+ makefile.bcc makefile.mc6 makefile.dj makefile.wat makefile.vc \
+ makejdsw.vc6 makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 \
+ makecdep.vc6 makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 \
+ makedmak.vc6 maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 \
+ makerdsp.vc6 makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 \
+ makejsln.v10 makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 \
+ makecfil.v10 makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 \
+ makervcx.v10 makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac \
+ makcjpeg.st makdjpeg.st makljpeg.st maktjpeg.st makefile.manx \
+ makefile.sas makefile.mms makefile.vms makvms.opt
CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \
jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \
jconfig.vms
-CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp missing
-OTHERFILES= jconfig.txt ckconfig.c ansi2knr.c ansi2knr.1 jmemdosa.asm \
- libjpeg.map
+CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp \
+ missing ar-lib
+OTHERFILES= jconfig.txt ckconfig.c jmemdosa.asm libjpeg.map
TESTFILES= testorig.jpg testimg.ppm testimg.bmp testimg.jpg testprog.jpg \
testimgp.jpg
DISTFILES= $(DOCS) $(MKFILES) $(CONFIGFILES) $(SOURCES) $(INCLUDES) \
diff --git a/3rdparty/libjpeg/makefile.sas b/3rdparty/libjpeg/makefile.sas
index 252f8fbad03..cd513d53d47 100644
--- a/3rdparty/libjpeg/makefile.sas
+++ b/3rdparty/libjpeg/makefile.sas
@@ -69,23 +69,23 @@ INCLUDES= jdct.h jerror.h jinclude.h jmemsys.h jmorecfg.h jpegint.h \
DOCS= README install.txt usage.txt cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 \
wrjpgcom.1 wizard.txt example.c libjpeg.txt structure.txt \
coderules.txt filelist.txt change.log
-MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \
- makefile.mc6 makefile.dj makefile.wat makefile.vc makejdsw.vc6 \
- makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \
- makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \
- maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \
- makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \
- makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \
- makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \
- makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \
- makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \
- makefile.mms makefile.vms makvms.opt
+MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.b32 \
+ makefile.bcc makefile.mc6 makefile.dj makefile.wat makefile.vc \
+ makejdsw.vc6 makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 \
+ makecdep.vc6 makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 \
+ makedmak.vc6 maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 \
+ makerdsp.vc6 makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 \
+ makejsln.v10 makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 \
+ makecfil.v10 makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 \
+ makervcx.v10 makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac \
+ makcjpeg.st makdjpeg.st makljpeg.st maktjpeg.st makefile.manx \
+ makefile.sas makefile.mms makefile.vms makvms.opt
CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \
jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \
jconfig.vms
-CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp missing
-OTHERFILES= jconfig.txt ckconfig.c ansi2knr.c ansi2knr.1 jmemdosa.asm \
- libjpeg.map
+CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp \
+ missing ar-lib
+OTHERFILES= jconfig.txt ckconfig.c jmemdosa.asm libjpeg.map
TESTFILES= testorig.jpg testimg.ppm testimg.bmp testimg.jpg testprog.jpg \
testimgp.jpg
DISTFILES= $(DOCS) $(MKFILES) $(CONFIGFILES) $(SOURCES) $(INCLUDES) \
diff --git a/3rdparty/libjpeg/makefile.unix b/3rdparty/libjpeg/makefile.unix
index eaadfc1db86..8d5ea883907 100644
--- a/3rdparty/libjpeg/makefile.unix
+++ b/3rdparty/libjpeg/makefile.unix
@@ -64,23 +64,23 @@ INCLUDES= jdct.h jerror.h jinclude.h jmemsys.h jmorecfg.h jpegint.h \
DOCS= README install.txt usage.txt cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 \
wrjpgcom.1 wizard.txt example.c libjpeg.txt structure.txt \
coderules.txt filelist.txt change.log
-MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \
- makefile.mc6 makefile.dj makefile.wat makefile.vc makejdsw.vc6 \
- makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \
- makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \
- maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \
- makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \
- makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \
- makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \
- makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \
- makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \
- makefile.mms makefile.vms makvms.opt
+MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.b32 \
+ makefile.bcc makefile.mc6 makefile.dj makefile.wat makefile.vc \
+ makejdsw.vc6 makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 \
+ makecdep.vc6 makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 \
+ makedmak.vc6 maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 \
+ makerdsp.vc6 makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 \
+ makejsln.v10 makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 \
+ makecfil.v10 makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 \
+ makervcx.v10 makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac \
+ makcjpeg.st makdjpeg.st makljpeg.st maktjpeg.st makefile.manx \
+ makefile.sas makefile.mms makefile.vms makvms.opt
CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \
jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \
jconfig.vms
-CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp missing
-OTHERFILES= jconfig.txt ckconfig.c ansi2knr.c ansi2knr.1 jmemdosa.asm \
- libjpeg.map
+CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp \
+ missing ar-lib
+OTHERFILES= jconfig.txt ckconfig.c jmemdosa.asm libjpeg.map
TESTFILES= testorig.jpg testimg.ppm testimg.bmp testimg.jpg testprog.jpg \
testimgp.jpg
DISTFILES= $(DOCS) $(MKFILES) $(CONFIGFILES) $(SOURCES) $(INCLUDES) \
diff --git a/3rdparty/libjpeg/makefile.vc b/3rdparty/libjpeg/makefile.vc
index d4df9d4c52e..b9b82071b49 100644
--- a/3rdparty/libjpeg/makefile.vc
+++ b/3rdparty/libjpeg/makefile.vc
@@ -57,23 +57,23 @@ INCLUDES= jdct.h jerror.h jinclude.h jmemsys.h jmorecfg.h jpegint.h \
DOCS= README install.txt usage.txt cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 \
wrjpgcom.1 wizard.txt example.c libjpeg.txt structure.txt \
coderules.txt filelist.txt change.log
-MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \
- makefile.mc6 makefile.dj makefile.wat makefile.vc makejdsw.vc6 \
- makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \
- makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \
- maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \
- makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \
- makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \
- makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \
- makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \
- makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \
- makefile.mms makefile.vms makvms.opt
+MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.b32 \
+ makefile.bcc makefile.mc6 makefile.dj makefile.wat makefile.vc \
+ makejdsw.vc6 makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 \
+ makecdep.vc6 makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 \
+ makedmak.vc6 maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 \
+ makerdsp.vc6 makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 \
+ makejsln.v10 makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 \
+ makecfil.v10 makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 \
+ makervcx.v10 makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac \
+ makcjpeg.st makdjpeg.st makljpeg.st maktjpeg.st makefile.manx \
+ makefile.sas makefile.mms makefile.vms makvms.opt
CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \
jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \
jconfig.vms
-CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp missing
-OTHERFILES= jconfig.txt ckconfig.c ansi2knr.c ansi2knr.1 jmemdosa.asm \
- libjpeg.map
+CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp \
+ missing ar-lib
+OTHERFILES= jconfig.txt ckconfig.c jmemdosa.asm libjpeg.map
TESTFILES= testorig.jpg testimg.ppm testimg.bmp testimg.jpg testprog.jpg \
testimgp.jpg
DISTFILES= $(DOCS) $(MKFILES) $(CONFIGFILES) $(SOURCES) $(INCLUDES) \
diff --git a/3rdparty/libjpeg/makefile.wat b/3rdparty/libjpeg/makefile.wat
index a3e652bc2da..d90026110a6 100644
--- a/3rdparty/libjpeg/makefile.wat
+++ b/3rdparty/libjpeg/makefile.wat
@@ -59,23 +59,23 @@ INCLUDES= jdct.h jerror.h jinclude.h jmemsys.h jmorecfg.h jpegint.h &
DOCS= README install.txt usage.txt cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 &
wrjpgcom.1 wizard.txt example.c libjpeg.txt structure.txt &
coderules.txt filelist.txt change.log
-MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc &
- makefile.mc6 makefile.dj makefile.wat makefile.vc makejdsw.vc6 &
- makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 &
- makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 &
- maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 &
- makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 &
- makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 &
- makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 &
- makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st &
- makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas &
- makefile.mms makefile.vms makvms.opt
+MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.b32 &
+ makefile.bcc makefile.mc6 makefile.dj makefile.wat makefile.vc &
+ makejdsw.vc6 makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 &
+ makecdep.vc6 makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 &
+ makedmak.vc6 maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 &
+ makerdsp.vc6 makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 &
+ makejsln.v10 makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 &
+ makecfil.v10 makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 &
+ makervcx.v10 makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac &
+ makcjpeg.st makdjpeg.st makljpeg.st maktjpeg.st makefile.manx &
+ makefile.sas makefile.mms makefile.vms makvms.opt
CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat &
jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas &
jconfig.vms
-CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp missing
-OTHERFILES= jconfig.txt ckconfig.c ansi2knr.c ansi2knr.1 jmemdosa.asm &
- libjpeg.map
+CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp &
+ missing ar-lib
+OTHERFILES= jconfig.txt ckconfig.c jmemdosa.asm libjpeg.map
TESTFILES= testorig.jpg testimg.ppm testimg.bmp testimg.jpg testprog.jpg &
testimgp.jpg
DISTFILES= $(DOCS) $(MKFILES) $(CONFIGFILES) $(SOURCES) $(INCLUDES) &
diff --git a/3rdparty/libjpeg/missing b/3rdparty/libjpeg/missing
index 28055d2ae6f..f62bbae306c 100644
--- a/3rdparty/libjpeg/missing
+++ b/3rdparty/libjpeg/missing
@@ -1,11 +1,10 @@
#! /bin/sh
-# Common stub for a few missing GNU programs while installing.
+# Common wrapper for a few potentially missing GNU programs.
-scriptversion=2009-04-28.21; # UTC
+scriptversion=2013-10-28.13; # UTC
-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
-# 2008, 2009 Free Software Foundation, Inc.
-# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -26,69 +25,40 @@ scriptversion=2009-04-28.21; # UTC
# the same distribution terms that you use for the rest of that program.
if test $# -eq 0; then
- echo 1>&2 "Try \`$0 --help' for more information"
+ echo 1>&2 "Try '$0 --help' for more information"
exit 1
fi
-run=:
-sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
-sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
-
-# In the cases where this matters, `missing' is being run in the
-# srcdir already.
-if test -f configure.ac; then
- configure_ac=configure.ac
-else
- configure_ac=configure.in
-fi
+case $1 in
-msg="missing on your system"
+ --is-lightweight)
+ # Used by our autoconf macros to check whether the available missing
+ # script is modern enough.
+ exit 0
+ ;;
-case $1 in
---run)
- # Try to run requested program, and just exit if it succeeds.
- run=
- shift
- "$@" && exit 0
- # Exit code 63 means version mismatch. This often happens
- # when the user try to use an ancient version of a tool on
- # a file that requires a minimum version. In this case we
- # we should proceed has if the program had been absent, or
- # if --run hadn't been passed.
- if test $? = 63; then
- run=:
- msg="probably too old"
- fi
- ;;
+ --run)
+ # Back-compat with the calling convention used by older automake.
+ shift
+ ;;
-h|--h|--he|--hel|--help)
echo "\
$0 [OPTION]... PROGRAM [ARGUMENT]...
-Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
-error status if there is no known handling for PROGRAM.
+Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
+to PROGRAM being missing or too old.
Options:
-h, --help display this help and exit
-v, --version output version information and exit
- --run try to run the given command, and emulate it if it fails
Supported PROGRAM values:
- aclocal touch file \`aclocal.m4'
- autoconf touch file \`configure'
- autoheader touch file \`config.h.in'
- autom4te touch the output file, or create a stub one
- automake touch all \`Makefile.in' files
- bison create \`y.tab.[ch]', if possible, from existing .[ch]
- flex create \`lex.yy.c', if possible, from existing .c
- help2man touch the output file
- lex create \`lex.yy.c', if possible, from existing .c
- makeinfo touch the output file
- tar try tar, gnutar, gtar, then tar without non-portable flags
- yacc create \`y.tab.[ch]', if possible, from existing .[ch]
+ aclocal autoconf autoheader autom4te automake makeinfo
+ bison yacc flex lex help2man
-Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
-\`g' are ignored when checking the name.
+Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
+'g' are ignored when checking the name.
Send bug reports to <bug-automake@gnu.org>."
exit $?
@@ -100,272 +70,141 @@ Send bug reports to <bug-automake@gnu.org>."
;;
-*)
- echo 1>&2 "$0: Unknown \`$1' option"
- echo 1>&2 "Try \`$0 --help' for more information"
+ echo 1>&2 "$0: unknown '$1' option"
+ echo 1>&2 "Try '$0 --help' for more information"
exit 1
;;
esac
-# normalize program name to check for.
-program=`echo "$1" | sed '
- s/^gnu-//; t
- s/^gnu//; t
- s/^g//; t'`
-
-# Now exit if we have it, but it failed. Also exit now if we
-# don't have it and --version was passed (most likely to detect
-# the program). This is about non-GNU programs, so use $1 not
-# $program.
-case $1 in
- lex*|yacc*)
- # Not GNU programs, they don't have --version.
- ;;
-
- tar*)
- if test -n "$run"; then
- echo 1>&2 "ERROR: \`tar' requires --run"
- exit 1
- elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
- exit 1
- fi
- ;;
-
- *)
- if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
- # We have it, but it failed.
- exit 1
- elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
- # Could not run --version or --help. This is probably someone
- # running `$TOOL --version' or `$TOOL --help' to check whether
- # $TOOL exists and not knowing $TOOL uses missing.
- exit 1
- fi
- ;;
-esac
-
-# If it does not exist, or fails to run (possibly an outdated version),
-# try to emulate it.
-case $program in
- aclocal*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified \`acinclude.m4' or \`${configure_ac}'. You might want
- to install the \`Automake' and \`Perl' packages. Grab them from
- any GNU archive site."
- touch aclocal.m4
- ;;
-
- autoconf*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified \`${configure_ac}'. You might want to install the
- \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
- archive site."
- touch configure
- ;;
-
- autoheader*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified \`acconfig.h' or \`${configure_ac}'. You might want
- to install the \`Autoconf' and \`GNU m4' packages. Grab them
- from any GNU archive site."
- files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
- test -z "$files" && files="config.h"
- touch_files=
- for f in $files; do
- case $f in
- *:*) touch_files="$touch_files "`echo "$f" |
- sed -e 's/^[^:]*://' -e 's/:.*//'`;;
- *) touch_files="$touch_files $f.in";;
- esac
- done
- touch $touch_files
- ;;
-
- automake*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
- You might want to install the \`Automake' and \`Perl' packages.
- Grab them from any GNU archive site."
- find . -type f -name Makefile.am -print |
- sed 's/\.am$/.in/' |
- while read f; do touch "$f"; done
- ;;
-
- autom4te*)
- echo 1>&2 "\
-WARNING: \`$1' is needed, but is $msg.
- You might have modified some files without having the
- proper tools for further handling them.
- You can get \`$1' as part of \`Autoconf' from any GNU
- archive site."
-
- file=`echo "$*" | sed -n "$sed_output"`
- test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
- if test -f "$file"; then
- touch $file
- else
- test -z "$file" || exec >$file
- echo "#! /bin/sh"
- echo "# Created by GNU Automake missing as a replacement of"
- echo "# $ $@"
- echo "exit 0"
- chmod +x $file
- exit 1
- fi
- ;;
-
- bison*|yacc*)
- echo 1>&2 "\
-WARNING: \`$1' $msg. You should only need it if
- you modified a \`.y' file. You may need the \`Bison' package
- in order for those modifications to take effect. You can get
- \`Bison' from any GNU archive site."
- rm -f y.tab.c y.tab.h
- if test $# -ne 1; then
- eval LASTARG="\${$#}"
- case $LASTARG in
- *.y)
- SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
- if test -f "$SRCFILE"; then
- cp "$SRCFILE" y.tab.c
- fi
- SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
- if test -f "$SRCFILE"; then
- cp "$SRCFILE" y.tab.h
- fi
- ;;
- esac
- fi
- if test ! -f y.tab.h; then
- echo >y.tab.h
- fi
- if test ! -f y.tab.c; then
- echo 'main() { return 0; }' >y.tab.c
- fi
- ;;
-
- lex*|flex*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified a \`.l' file. You may need the \`Flex' package
- in order for those modifications to take effect. You can get
- \`Flex' from any GNU archive site."
- rm -f lex.yy.c
- if test $# -ne 1; then
- eval LASTARG="\${$#}"
- case $LASTARG in
- *.l)
- SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
- if test -f "$SRCFILE"; then
- cp "$SRCFILE" lex.yy.c
- fi
- ;;
- esac
- fi
- if test ! -f lex.yy.c; then
- echo 'main() { return 0; }' >lex.yy.c
- fi
- ;;
-
- help2man*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified a dependency of a manual page. You may need the
- \`Help2man' package in order for those modifications to take
- effect. You can get \`Help2man' from any GNU archive site."
-
- file=`echo "$*" | sed -n "$sed_output"`
- test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
- if test -f "$file"; then
- touch $file
- else
- test -z "$file" || exec >$file
- echo ".ab help2man is required to generate this page"
- exit $?
- fi
- ;;
-
- makeinfo*)
- echo 1>&2 "\
-WARNING: \`$1' is $msg. You should only need it if
- you modified a \`.texi' or \`.texinfo' file, or any other file
- indirectly affecting the aspect of the manual. The spurious
- call might also be the consequence of using a buggy \`make' (AIX,
- DU, IRIX). You might want to install the \`Texinfo' package or
- the \`GNU make' package. Grab either from any GNU archive site."
- # The file to touch is that specified with -o ...
- file=`echo "$*" | sed -n "$sed_output"`
- test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
- if test -z "$file"; then
- # ... or it is the one specified with @setfilename ...
- infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
- file=`sed -n '
- /^@setfilename/{
- s/.* \([^ ]*\) *$/\1/
- p
- q
- }' $infile`
- # ... or it is derived from the source name (dir/f.texi becomes f.info)
- test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
- fi
- # If the file does not exist, the user really needs makeinfo;
- # let's fail without touching anything.
- test -f $file || exit 1
- touch $file
- ;;
-
- tar*)
- shift
-
- # We have already tried tar in the generic part.
- # Look for gnutar/gtar before invocation to avoid ugly error
- # messages.
- if (gnutar --version > /dev/null 2>&1); then
- gnutar "$@" && exit 0
- fi
- if (gtar --version > /dev/null 2>&1); then
- gtar "$@" && exit 0
- fi
- firstarg="$1"
- if shift; then
- case $firstarg in
- *o*)
- firstarg=`echo "$firstarg" | sed s/o//`
- tar "$firstarg" "$@" && exit 0
- ;;
- esac
- case $firstarg in
- *h*)
- firstarg=`echo "$firstarg" | sed s/h//`
- tar "$firstarg" "$@" && exit 0
- ;;
- esac
- fi
-
- echo 1>&2 "\
-WARNING: I can't seem to be able to run \`tar' with the given arguments.
- You may want to install GNU tar or Free paxutils, or check the
- command line arguments."
- exit 1
- ;;
-
- *)
- echo 1>&2 "\
-WARNING: \`$1' is needed, and is $msg.
- You might have modified some files without having the
- proper tools for further handling them. Check the \`README' file,
- it often tells you about the needed prerequisites for installing
- this package. You may also peek at any GNU archive site, in case
- some other package would contain this missing \`$1' program."
- exit 1
- ;;
-esac
+# Run the given program, remember its exit status.
+"$@"; st=$?
+
+# If it succeeded, we are done.
+test $st -eq 0 && exit 0
+
+# Also exit now if we it failed (or wasn't found), and '--version' was
+# passed; such an option is passed most likely to detect whether the
+# program is present and works.
+case $2 in --version|--help) exit $st;; esac
+
+# Exit code 63 means version mismatch. This often happens when the user
+# tries to use an ancient version of a tool on a file that requires a
+# minimum version.
+if test $st -eq 63; then
+ msg="probably too old"
+elif test $st -eq 127; then
+ # Program was missing.
+ msg="missing on your system"
+else
+ # Program was found and executed, but failed. Give up.
+ exit $st
+fi
-exit 0
+perl_URL=http://www.perl.org/
+flex_URL=http://flex.sourceforge.net/
+gnu_software_URL=http://www.gnu.org/software
+
+program_details ()
+{
+ case $1 in
+ aclocal|automake)
+ echo "The '$1' program is part of the GNU Automake package:"
+ echo "<$gnu_software_URL/automake>"
+ echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
+ echo "<$gnu_software_URL/autoconf>"
+ echo "<$gnu_software_URL/m4/>"
+ echo "<$perl_URL>"
+ ;;
+ autoconf|autom4te|autoheader)
+ echo "The '$1' program is part of the GNU Autoconf package:"
+ echo "<$gnu_software_URL/autoconf/>"
+ echo "It also requires GNU m4 and Perl in order to run:"
+ echo "<$gnu_software_URL/m4/>"
+ echo "<$perl_URL>"
+ ;;
+ esac
+}
+
+give_advice ()
+{
+ # Normalize program name to check for.
+ normalized_program=`echo "$1" | sed '
+ s/^gnu-//; t
+ s/^gnu//; t
+ s/^g//; t'`
+
+ printf '%s\n' "'$1' is $msg."
+
+ configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
+ case $normalized_program in
+ autoconf*)
+ echo "You should only need it if you modified 'configure.ac',"
+ echo "or m4 files included by it."
+ program_details 'autoconf'
+ ;;
+ autoheader*)
+ echo "You should only need it if you modified 'acconfig.h' or"
+ echo "$configure_deps."
+ program_details 'autoheader'
+ ;;
+ automake*)
+ echo "You should only need it if you modified 'Makefile.am' or"
+ echo "$configure_deps."
+ program_details 'automake'
+ ;;
+ aclocal*)
+ echo "You should only need it if you modified 'acinclude.m4' or"
+ echo "$configure_deps."
+ program_details 'aclocal'
+ ;;
+ autom4te*)
+ echo "You might have modified some maintainer files that require"
+ echo "the 'autom4te' program to be rebuilt."
+ program_details 'autom4te'
+ ;;
+ bison*|yacc*)
+ echo "You should only need it if you modified a '.y' file."
+ echo "You may want to install the GNU Bison package:"
+ echo "<$gnu_software_URL/bison/>"
+ ;;
+ lex*|flex*)
+ echo "You should only need it if you modified a '.l' file."
+ echo "You may want to install the Fast Lexical Analyzer package:"
+ echo "<$flex_URL>"
+ ;;
+ help2man*)
+ echo "You should only need it if you modified a dependency" \
+ "of a man page."
+ echo "You may want to install the GNU Help2man package:"
+ echo "<$gnu_software_URL/help2man/>"
+ ;;
+ makeinfo*)
+ echo "You should only need it if you modified a '.texi' file, or"
+ echo "any other file indirectly affecting the aspect of the manual."
+ echo "You might want to install the Texinfo package:"
+ echo "<$gnu_software_URL/texinfo/>"
+ echo "The spurious makeinfo call might also be the consequence of"
+ echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
+ echo "want to install GNU make:"
+ echo "<$gnu_software_URL/make/>"
+ ;;
+ *)
+ echo "You might have modified some files without having the proper"
+ echo "tools for further handling them. Check the 'README' file, it"
+ echo "often tells you about the needed prerequisites for installing"
+ echo "this package. You may also peek at any GNU archive site, in"
+ echo "case some other package contains this missing '$1' program."
+ ;;
+ esac
+}
+
+give_advice "$1" | sed -e '1s/^/WARNING: /' \
+ -e '2,$s/^/ /' >&2
+
+# Propagate the correct exit status (expected to be 127 for a program
+# not found, 63 for a program that failed due to version mismatch).
+exit $st
# Local variables:
# eval: (add-hook 'write-file-hooks 'time-stamp)
diff --git a/3rdparty/libjpeg/rdjpgcom.1 b/3rdparty/libjpeg/rdjpgcom.1
index 97611df813c..d7741fb9489 100644
--- a/3rdparty/libjpeg/rdjpgcom.1
+++ b/3rdparty/libjpeg/rdjpgcom.1
@@ -1,4 +1,4 @@
-.TH RDJPGCOM 1 "02 April 2009"
+.TH RDJPGCOM 1 "13 September 2013"
.SH NAME
rdjpgcom \- display text comments from a JPEG file
.SH SYNOPSIS
diff --git a/3rdparty/libjpeg/rdswitch.c b/3rdparty/libjpeg/rdswitch.c
index 7a839af7a4f..b5aba83cb8a 100644
--- a/3rdparty/libjpeg/rdswitch.c
+++ b/3rdparty/libjpeg/rdswitch.c
@@ -2,6 +2,7 @@
* rdswitch.c
*
* Copyright (C) 1991-1996, Thomas G. Lane.
+ * Modified 2003-2015 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -347,8 +348,9 @@ set_sample_factors (j_compress_ptr cinfo, char *arg)
return FALSE;
if ((ch1 != 'x' && ch1 != 'X') || ch2 != ',') /* syntax check */
return FALSE;
- if (val1 <= 0 || val1 > 4 || val2 <= 0 || val2 > 4) {
- fprintf(stderr, "JPEG sampling factors must be 1..4\n");
+ if (val1 <= 0 || val1 > MAX_SAMP_FACTOR ||
+ val2 <= 0 || val2 > MAX_SAMP_FACTOR) {
+ fprintf(stderr, "JPEG sampling factors must be 1..%d\n", MAX_SAMP_FACTOR);
return FALSE;
}
cinfo->comp_info[ci].h_samp_factor = val1;
diff --git a/3rdparty/libjpeg/structure.txt b/3rdparty/libjpeg/structure.txt
index fe88701e31a..98e20c7c67b 100644
--- a/3rdparty/libjpeg/structure.txt
+++ b/3rdparty/libjpeg/structure.txt
@@ -1,6 +1,6 @@
IJG JPEG LIBRARY: SYSTEM ARCHITECTURE
-Copyright (C) 1991-2009, Thomas G. Lane, Guido Vollbeding.
+Copyright (C) 1991-2013, Thomas G. Lane, Guido Vollbeding.
This file is part of the Independent JPEG Group's software.
For conditions of distribution and use, see the accompanying README file.
@@ -20,7 +20,7 @@ In this document, JPEG-specific terminology follows the JPEG standard:
A "component" means a color channel, e.g., Red or Luminance.
A "sample" is a single component value (i.e., one number in the image data).
A "coefficient" is a frequency coefficient (a DCT transform output number).
- A "block" is an 8x8 group of samples or coefficients.
+ A "block" is an array of samples or coefficients.
An "MCU" (minimum coded unit) is an interleaved set of blocks of size
determined by the sampling factors, or a single block in a
noninterleaved scan.
@@ -43,13 +43,8 @@ command-line user interface and I/O routines for several uncompressed image
formats. This document concentrates on the library itself.
We desire the library to be capable of supporting all JPEG baseline, extended
-sequential, and progressive DCT processes. Hierarchical processes are not
-supported.
-
-The library does not support the lossless (spatial) JPEG process. Lossless
-JPEG shares little or no code with lossy JPEG, and would normally be used
-without the extensive pre- and post-processing provided by this library.
-We feel that lossless JPEG is better handled by a separate library.
+sequential, and progressive DCT processes. The library does not support the
+hierarchical or lossless processes defined in the standard.
Within these limits, any set of compression parameters allowed by the JPEG
spec should be readable for decompression. (We can be more restrictive about
@@ -175,16 +170,16 @@ can be simplified a little if they work on padded data: it's not necessary to
have special cases at the right and bottom edges. Therefore the interface
buffer is always an integral number of blocks wide and high, and we expect
compression preprocessing to pad the source data properly. Padding will occur
-only to the next block (8-sample) boundary. In an interleaved-scan situation,
-additional dummy blocks may be used to fill out MCUs, but the MCU assembly and
-disassembly logic will create or discard these blocks internally. (This is
-advantageous for speed reasons, since we avoid DCTing the dummy blocks.
-It also permits a small reduction in file size, because the compressor can
-choose dummy block contents so as to minimize their size in compressed form.
-Finally, it makes the interface buffer specification independent of whether
-the file is actually interleaved or not.) Applications that wish to deal
-directly with the downsampled data must provide similar buffering and padding
-for odd-sized images.
+only to the next block (block_size-sample) boundary. In an interleaved-scan
+situation, additional dummy blocks may be used to fill out MCUs, but the MCU
+assembly and disassembly logic will create or discard these blocks internally.
+(This is advantageous for speed reasons, since we avoid DCTing the dummy
+blocks. It also permits a small reduction in file size, because the
+compressor can choose dummy block contents so as to minimize their size
+in compressed form. Finally, it makes the interface buffer specification
+independent of whether the file is actually interleaved or not.)
+Applications that wish to deal directly with the downsampled data must
+provide similar buffering and padding for odd-sized images.
*** Poor man's object-oriented programming ***
@@ -350,9 +345,10 @@ The objects shown above are:
require context rows above and below the current row group; the
preprocessing controller is responsible for supplying these rows via proper
buffering. The downsampler is responsible for edge expansion at the right
- edge (i.e., extending each sample row to a multiple of 8 samples); but the
- preprocessing controller is responsible for vertical edge expansion (i.e.,
- duplicating the bottom sample row as needed to make a multiple of 8 rows).
+ edge (i.e., extending each sample row to a multiple of block_size samples);
+ but the preprocessing controller is responsible for vertical edge expansion
+ (i.e., duplicating the bottom sample row as needed to make a multiple of
+ block_size rows).
* Coefficient controller: buffer controller for the DCT-coefficient data.
This controller handles MCU assembly, including insertion of dummy DCT
@@ -385,8 +381,9 @@ objects:
* Data destination manager: writes the output JPEG datastream to its final
destination (e.g., a file). The destination manager supplied with the
- library knows how to write to a stdio stream; for other behaviors, the
- surrounding application may provide its own destination manager.
+ library knows how to write to a stdio stream or to a memory buffer;
+ for other behaviors, the surrounding application may provide its own
+ destination manager.
* Memory manager: allocates and releases memory, controls virtual arrays
(with backing store management, where required).
@@ -504,9 +501,9 @@ objects:
* Marker reading: decodes JPEG markers (except for RSTn).
* Data source manager: supplies the input JPEG datastream. The source
- manager supplied with the library knows how to read from a stdio stream;
- for other behaviors, the surrounding application may provide its own source
- manager.
+ manager supplied with the library knows how to read from a stdio stream
+ or from a memory buffer; for other behaviors, the surrounding application
+ may provide its own source manager.
* Memory manager: same as for compression library.
@@ -654,9 +651,9 @@ contain quantized coefficients everywhere outside the DCT/IDCT subsystems.
(This latter decision may need to be revisited to support variable
quantization a la JPEG Part 3.)
-Notice that the allocation unit is now a row of 8x8 blocks, corresponding to
-eight rows of samples. Otherwise the structure is much the same as for
-samples, and for the same reasons.
+Notice that the allocation unit is now a row of 8x8 coefficient blocks,
+corresponding to block_size rows of samples. Otherwise the structure
+is much the same as for samples, and for the same reasons.
On machines where malloc() can't handle a request bigger than 64Kb, this data
structure limits us to rows of less than 512 JBLOCKs, or a picture width of
diff --git a/3rdparty/libjpeg/testimg.bmp b/3rdparty/libjpeg/testimg.bmp
index 012223eb67e..11aa0cbf411 100644
--- a/3rdparty/libjpeg/testimg.bmp
+++ b/3rdparty/libjpeg/testimg.bmp
Binary files differ
diff --git a/3rdparty/libjpeg/testimg.ppm b/3rdparty/libjpeg/testimg.ppm
index bd78ef8eec1..1377eef27ef 100644
--- a/3rdparty/libjpeg/testimg.ppm
+++ b/3rdparty/libjpeg/testimg.ppm
@@ -1,4 +1,4 @@
P6
227 149
255
-0/-0/-10.21/51.51.62/72.83/83/83/:3-:3-:3-:3-:3-:2/91.91.80-80-91.91.:2/80-80-80-80-80-80-80-80-6.+6.+6.+5-*5-*4,)4,)4,)4,)4,)4,)4,)4,)4,)4,)4,).+$/,%/,%0-&1.'2/(30)30)63,63,74-85.85.96/:70:70A;/B<0D>2F@2IA4JB5KC6KD4MD5MD5MD3NB2OC3OC3PD4QE5T>1Y?2b@4nB5}E6ŒG8šG9¥E7²F9ºF9¿E8ÆF;ÉF>ËF?ÌG@ÌG@íCNíCLíCLíDKíDIïBFñ>Bõ<Aø;Aø9@ö9?ð;@ë>@â?@×?<Ñ=;µ@.µ@.µ@.´?-´?-³@-²?-°?-­@,ªA.¦A-¢B,A*›A)˜@*—A*’?/’?/’?/‘>,‘>,’<+’<+’<+”?+”?+”=*”=*”=*•>+–?+—@,”?:•>7—=4Ÿ?1©B3³D3¼D3¿D4º?/¶@2­E8žH;‡H9mB2T8*D3#:659549547326216005//50-72/72/72/61-61-50,50,50,.0-.0-.0-//-//-0/-2.-3--5,-4+,4*+4(*7(+=.1E69L<?n@B|HJ‹MN–NO¢VZ¬cl­n s’|£„°}‡¼|‰¾pz­`aTLuRCjSKcOG_MH\TR`fdo|}‚‘™ž˜£©Ÿ¤¨š¡’’{|jhgUXWERO>UPdUPdUPd0/-0/-10.10.40-51.62/72.83/83/83/:3-:3-:3-:3-:3-91.91.80-80-80-80-91.91.80-80-80-80-80-80-80-80-6.+6.+5-*5-*5-*4,)4,)4,)5-*5-*5-*5-*5-*5-*5-*5-*/,%0-&0-&1.'2/(30)41*41*63,63,74-74-85.96/:70:70@:.A;/C=1E?3H@3IA4JB5JC3LC4LC4KB3MA1MA1NB2OC3PD4P>0U?1^A3jC4xD6†D4“D5žB3¨B3°@2¶@4¼B7ÂC:ÄE<ÆF=ÇG>èAKèAIèCIêDHíDGïBDó@D÷>Cø;Aø9@ö9?ð<?é?@à@@Õ@<Î=8µ@.µ@.´?-´?-´?-²?,°?-¯@-­@,©@-¦A-¡A+A*›@+˜@*—A*’?/’?/‘>.‘>.‘>,=+’<+’<+”>-“>*“>*”=*”=*•>+–?,—@-“@8•>5˜>3Ÿ?1«A3µD4½D3ÁC4¼A2¸B6­E8œI;…G:kA3S9*D4$<66;55:4493382271161.61.72/72/72/61-61-50,50,50,.0-.0-.0-//-//-0/-2.-2.-3--5,-4*+4(*5)+<-0C47I:=h<;vDC†JI’LJST§`h¨k{rŽ‘{¢„°|†»y†½lv«[\ŒQHsQBkOFaOFaNI_RN_[Yfnotƒ‡ˆ”™•™ž—š ”™‘ƒ~ojk[]\JVUCXQaXQaXQa/.,/.,0/-10.40-40-51.51.72.72.72.92,92,92,92,92,91.80-7/,7/,7/,7/,80-91.80-80-80-80-80-80-80-80-6.+5-*5-*5-*4,)4,)4,)4,)5-*5-*5-*5-*5-*5-*5-*5-*1.'1.'2/(30)30)41*41*52+63,63,63,74-85.96/96/:70?9-@:.B<0D>2G?4H@3H@3H@3I@1I@1I@1K?1K?/L@0MA1NB2MA1QA2YB2dC2qC3|C2‰A2“@0™<+ :+©;,¯>0¶@4¼C8¿F=ÀG>à?Eá@FãBGæCFêDFðCEõADù?Dú;@û:?÷:@ñ=@è@@ÜA=Ñ@;É>7³@-³@-³@-²?,²?,²?-¯>,®?,ª?-©@-¥@,¡A+A,˜@*—A*–@)’?/‘>.‘>.‘>.=+=+=+’<+“=,“=,’<+’=)“>*“>*”?+•@,”B7–?5š>3£>2­A4¹C5¿D5ÂC4ÂD6ºF9¯I=›I=‚F;gA4P:,B6&=77=77<66:4493383072/72/62/62/62/52-52-41,41,41,,1-,1-.0-.0-//-//-0/-2.-5//4..5,-4*+4*+9-/>24C79_83l?:|E@ˆIB’NK›Z^œft”n‡Œwž€~¯zƒºs¹dm¤UU‰NEtO?lMBbPEcQHcMH^NK\[[estx…‰ˆ‡Œ†Š†…†Š|xzlghXZ[KVTEZT`ZT`ZT`.-+/.,/.,0/-10.40-40-40-51.61-61-61-81+81+81+81+50-50-4/,4/,4/,4/,50-50-61.61.61.61.61.61.61.61.3.+3.+3.+2-*2-*2-*1,)1,)4/,4/,4/,4/,4/,4/,4/,4/,30+30+30+41,41,52-52-52-52-52-63.74/850850961961>8,?9-@:.B<0E=2E=2F>1F>1G=1G>/F=.I=/I=/J>0L@0L@0JD4NE4TD4^D3hE2sB1~A/‡>-Œ9'”9'9)£<-¬@3³E8·I<ºJ>Ù@CÚACÝCEâDEçCDîACô@Cø>Aü;@û:?÷:>ð=@åA?ÚB=ËA7Ã>5°@,°@,°@,°?-¯>,¯>,®?,¬>-ª?-¦?,£@-Ÿ@,œ@+˜@*–@)”@(‘>.‘>.‘>.=-=-=-<*<*=+=+<*<*=+“=,”>-”>-”B6–?5›?2¦@2²B4½C6ÂB5ÄB5ÄF:½H>­K@˜J@|F:aA4K;.?9+@86@86?75>64:5294183073062/62/62/32.32-21,21,21,-2.-2.-2./1./1.00.00.10.5106005//5,-4+,6,-:01>45W6-b<3qA7}D9„H@ŒRQŽ_i‹iƒs˜|z¬u~·myµ^g¢RQŠMDyM?rN@dPEgQFfLC^GBVNLZ^^fjnquzvx}vz€vwzokoa`bUWYKTUG]V^]V^]V^.-+.-+.-+/.,0/-10.3/,40-3/,4/+4/+4/+4/+6/)6/)6/)4/,4/,3.+3.+3.+3.+4/,4/,50-50-50-50-50-50-50-50-3.+3.+2-*2-*2-*1,)1,)1,)4/,4/,4/,4/,4/,4/,4/,4/,41,41,41,41,41,52-52-52-52-52-63.63.74/850961961<5+=6,?8.@9/B:/C;0C;0C;.D:.D:.D:.G;-H<.I=/J>0K?1GH6KH7PG6XG5aF3jD1uB/|?,‚;)‹:'’;(š=,£B2«G7±K<´M>ÒDBÔDCØDBÝEBâC@ê@@ð>>÷:>û:=ú9<õ;>í?>áB>ÓC:ÅA5º?0¯@-®?,®?,®?,­>+­>+¬>-ª?-¨?,¤?-¢?,ž?+š?*–?+”?*“>)?.?.>->->-Ž=,Ž=,Ž=,Ž=,Ž=,Ž=,Ž=,<,=-‘>.‘>.”B4—A4@1ª@3¶B5ÁC7ÆA8Å@7ÁB;¸G?©KCJ@uE;Y>3C9-78*@86@86?75>64=53:5294173062/43/43/32.23.12-12,12,,2.-2.-2.-2./1./1.00.00.3205105104..2,,4+,7./901P5*Y9,e>/n@1tB7|KGƒYcƒg~p—xx¬s{¹js¶]e¦TT”OG‚LAyPAjPAhMAeJA`GBYHEXKKWMPU^bc`fbcha`f\Z`TWZOUYKWYL`WZ`WZ`WZ,,,,,,---.-+/.,0/-10.3/,2.+2.+3.*3.*3.*3.*3.*3.*3.+3.+2-*1,)1,)2-*3.+3.+3.+3.+3.+3.+3.+3.+3.+3.+2-*2-*2-*2-*1,)1,)1,)0+(3.+3.+3.+3.+3.+3.+3.+3.+41,41,41,41,41,41,41,41,41,52-52-63.74/850850850;4*<5+=6,>7-@7.A8/A9.A9.C9/C9-C9-F:.G;/H<.J>0K?1FI8GH6MH5TG6[F3dC0lA.t?-{<*‚;)Š;*“=,šA1£F5ªJ:­M=ÉE@ËFAÑFAÖE@ÞC?å@>í==ó9<ø:<÷9;ó;=ë?=ÝB=ÌD8¼A2±>,«@,«@,¬?+¬>-¬>-©>,©>,¨>.¥>-¢?, ?,›>,—?+•>*“>)‘?)>->->->-Ž=,Ž=,Ž=,<+Ž=,<+‹<+‹<+‹<+Œ=.>/Ž?0’C2—A2 @2­A5»B9ÃC:Ç@:Å@9»@9³H@¥NGNEoG=R@4?;039-A75A75@64>63<4194083/74/63.43.34/23.13.02-02-02--3/-3/-3/.3/.3/02/02/11/11/32032040/2.-1-,4..5//H4)M5)X8+a<,f>2nGBzYb‚lƒ€uŸ{|´u|Àmu¾bi±[[¡SLLBQAnN?jI=cH>`HB^FCX@BO<?HBGJFLJJQJJQIIQFKQGOUISYMaXSaXSaXS++++++,,,---/.,/.,0/-0/-1-*1-*1-*2-)2-)2-)2-)2-)2-*2-*1,)1,)1,)1,)2-*2-*1,)1,)1,)1,)1,)1,)1,)1,)2-*2-*2-*1,)1,)1,)0+(0+(3.+3.+3.+3.+3.+3.+3.+3.+41,41,41,30+30+30+30+30+41,41,52-63.74/74/850850:3+;4,<5-=6.?6-?6-?6-?6-B8.B8.C9/E9-G;/H<0J>2K?3DG6EF6KE5PD4VC2^C2e@.m>,v=,|;)ƒ:)Š;*“=.›B2¢F7¦I:¿D<ÂF>ÇG>ÏF>ØE>âC?ì@>ó<>õ9:ó9:ï;<å@<×B;ÆD6´A/¨=)©@-©@-©@-¨?,¨?,¨>.§=-¥>-£>, ?.ž?-š?,—>,“>*‘?*>)>->->-Œ=,Œ=,Œ=,‹<-‹<-‹<-‹<-‰<,‰<,Š=-‹=0‹=0Œ>1‘D2–C1¡A3®B6¼C:ÅA<ÇB=ÃB=»EA³PJ¥XPŽZOqSIVI@BD97A6A83@72?61=60<4194083/63.43.43.34.13.13.02-.3-.3--3/-3/-3/.3/.3/.3/02/02/00.11/22021/0/-/.,2.-3/.?0)C1'K3'T8,Z<2dGCw]hƒsˆ­„„À|ƒËszÈkq¿ed°VSšJC‡N>kK<gG;cG=`FB]DBX?AP;?H:BE?HGDMHGQIGQHJRGNVKRZOaYNaYNaYN++++++,,,,,,---/.,0/-0/-/.,1-*1-*1-*2-)2-)2-)2-)1-,0,+0,+/+*/+*0,+0,+1-,/+*/+*/+*/+*/+*/+*/+*/+*1-,1-,1-,0,+0,+/+*/+*/+*1-,1-,1-,1-,1-,1-,1-,1-,3/,3/,3/,3/,3/,3/,3/,3/,40-40-51.62/62/73084184192,:3-;4,<5->5.>5.>5.>5,B8/B8/C9/E8/G:1I<3J=4K?3EC6FB6IC5NB4TA3\@2b>0h=-q<.w9*}8)…7*Œ:,•=/›B2 D5µE9¸F;ÀG<ÈH=ÒH>ßF@èC?ð@@î:9î:9é=;àA;ÑD:¾E4¬A-¢?(¦A-¦A-¥@.¥@.¦?.¥>-¤?-¤>/¢>.Ÿ@.œ?.˜?-•>+‘?*>)>+>->->-Œ=,Œ=.Š=-Š=-Š=-Š</ˆ<.ˆ<.ˆ<.ˆ<.‰=0Š>1‹?2‘D2–C1¢B4®B6¼C;ÄC>ÄC>¾D?»PJ²[T¥e\‘f]s_TYUJFNC>KA@70@72>71=6094.83-63,63.43.34.34.13.13..3-.3-.3--3/-3/-3/.3/.3/.3/.3/02/.0-00.22022000.0/-0/-10.8,,;,)B1*K7.S<4^IHtbn‡z–Џ‹Ê‚ˆÒy€ÐrwÈik¸XV¡GD‹I<gG<fD<aC>^C@[ABV>DP>EMGQSKWUQ^WU`XS_UR^TT^SV`UaZHaZHaZH,-/,-/------------.-+.-+/.,/.,1-*0,)0,)0,)/+(0+'/+*/+*/+*/+*/+*/+*/+*0,+/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*0,+0,+1-,1-,2.-1-,1-,1-,1-,1-,1-,1-,1-,0,)1-*2.+3/,3/,3/,3/,3/,3/,3/,3/,3/,40-51.62/73081+92,:3-;4.=4/>5.>5.>5.?4.?5,@6-C6.D7.F90G:1H;2F?5H@5J@6N@5R>3W<1\:0a7+k9.t8-|8+…9,;/“=0˜?1›?2¨@3¬B5´D8¾E:ÊG=ÕF>ßD?çB>ë?=íA?çD?ÜE>ÉC8¶C1§B.¡B,¢A.¡@-¢?,¢?,¡=-¡=-¢>. ?.œ<,š=,˜=+•>-“=,=+Ž=*Œ>*‹<+‹<+‹<+‰<,‰<,‰<,‡;-‡;-‰=/†</†</‡=0‡?1ˆ@4‰A5ŠB6‘F3–E4£F7³H>½F@¾C>¾DA»KG·XR¯f]£qfth|rfik^S_SCSHQJBLE=D=5<8/95,74-63,33+43.34.23-13.02--2,,1+,1+-2.-2.-2.-2.-2.-2./1./1.02/02/11/11/11/11/11/11/5*2;/3A32C4/J;6]OOymy‹…Ÿ’‘½”–Ӕ݂‰×tzÈjn¸_b©YZPHmHBdA>]>>X?AVBHVLU^U`bbqnn}xv†|p€ulyoguh_k_T`Ta[Eb\Fc]G,-/,-/,-/,-/---------.-+/.,.-+.-+0,)/+(/+(/+(/+(.*).*).*).*)/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*0,+0,+0,+1-,1-,1-,1-,1-,1-,1-,1-,1-,1-,0,)0,)1-*2.+3/,3/,2.+2.+2.+2.+2.+2.+3/,40-51.62/80-91.:2/;30=4/>50>50=4-?4.?4.?4.B5-C6.E80G:2H;3H>5J=5L=6O>6Q=4V;2Z90_7/h8.p7.y6-‚8-‰9.’;1–<1š>1¢@3¦A5ªB5³E8¾E:ÉF<ÔE=ÜC=âC?ãD@ßF@ÕF>ÄF8±C2£B/›C-ŸB0 A/Ÿ@.ž?-ž?-Ÿ>-ž>.ž>.š=,™=.–=-“=,=+>-Œ=,‹>,Š=+Š=+‰<,‰<,‰<,‡;-‡;-…<-†</…=/…=1ƒ=1„>4†@6‡A7ˆB8‘H7•F7£G:±I@¹HB¹FAºJFµTM²dZªreŸ~op~|mlteYgZJZOPLAKI=EC7@>2=:1:7.44*11)23+23-12,/1,/1,.0+.0+.0-/1./1./1./1./1./1./1./1.02/11/11/11/11/11/11/11/5*:9-9<15?53H?:^VTxszŠˆž‘“º”—Εׄ‹ÓxÆpyºkt¯en¥__yXZsSUjRWjU]j\gmguvr‚v‡€‘‡ƒ•‰}v†yp€sfteXfW_YA`ZBb\D,-/,-/,-/,-/,-/---------.-+.-+.-+-,*/+(.*'.*'.*'.*+.*+.*+.*+-)*-)*-)*-)*/+,/+,/+,/+,/+,/+,/+,/+,.*+.*+/+,/+,/+,0,-0,-0,-0,-0,-0,-1-.1-.1-.1-.1-.0,+0,+1-,2.-2.-2.-2.-1-,1-,1-,1-,1-,2.-3/.40/51080-91.:2/;30=31=31=4/=4/?40?4.?4.A4.C60D7/F91G:2H;5J;6K<7N=6P;6S:5V72[60c60k6.t5,}7/‡9/Ž:0”<0˜<1œ@3ž@4¢@3§A3±C6¼C8ÇD:ÎC<ÖF>ÚG@×HBÍH?¾E:­C3ŸB0™B.B/œA.›@-›>-›>-›>-›>-œ?0˜<-–=-”=,“=.>-Œ=,Š=+Š=+‰<*‰<,‰<,‡;+‡;+…<-„;,ƒ;-„<0‚<0‚<2‚>3ƒ?4…A8†C:‡D;“K<–H; H>­JDµIF´KG´SM¯_V®rg¥qœz{Šwr€ocqbVdWPQCMN@HI;DD8@@4::055+/0(01)01+/0*/0+./*./*//-//-//-//-//-//-//-//-//-//-00.00.00.00.00.00.00.00.6*>6+;8.6;63HE>_^Yyz|Šœ“²’–ÃŽ•Ë„Æ}ˆ¾{‰¸|‹´|Œ°ˆ—yƒq~‡o|‚n}€o‚€yއƒ™‹¡”‘¨˜¦”ˆŠƒ–ƒ|{j{iXiW\V<^X>`Z@-.0-.0-.0-.0-.0-.0......---.-+-,*-,*,+).*'.*'.*',*++)*+)*+)*+)**()*()*(),*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*+-+,-+,-+,-+,.,-.,-.,-.,-/-./-./-./+*0,+1-,1-,1-,1-,0,+0,+0,+0,+0,+0,+1-,2.-3/.40/91/:20;31<42=31=31=31=31>3/>3/>3/@3-A4.C60D71E82G83H94I:5L:6M:6N94Q83T50^72e60o6/x8/ƒ90Š:/’;1•=1™?4™?4›?2@1¥A2­C5¸D7ÀD:ÉF<ÌG>ÌIAÄH>¶F:©C4B0—B.˜A.˜A.˜?-—>,™>,™=.™=.™=.•<,”<.“=.=-Ž<.Š=-Š=-ˆ<,ˆ;)ˆ;+‡;+‡;+„;,„;,ƒ;-‚:,;/€<1€<1>5ƒ@7ƒC:…E<†F=’M>•I<œH>¨IC¯LG¯PL¯\Tªj^§€o y˜š‚Žœƒ„–€z‹ym{lam_UYHQUDKO@EI:@D6;=057,13(01)/0*/.).-).-).-+/.,0/-/.,/.,/.,/.,/.,/.,/.,/.,0/-0/-0/-0/-0/-0/-0/-0/-8*A6):3-1961HJ=bfX{€y‰‘“Œ“£–²Œ”¸ƒ³±…™²¤¶ªµ•§§¤£Œ ž‡ž–‚™}˜‰œ‹ˆ£”°š–²›”­—‹£‹…›†’~k|iUfSXT7ZV9^Z=+/2+/2-.0-.0-.0-.0-.0...------.-+-,*-,*,+),+),+),*+,*+,*++)*+)**()*()*(),*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*++)*+)*+)*,*+-+,-+,.,-.,-/-./-./-./+*0,+0,+0,+0,+0,+/+*.*)/+*/+*/+*/+*0,+1-,3/.40/91/:20;31<42=32=32<20<20=20=2.=2.?1.@2/A4.B5/C60D63C84D95G96G96H94K84N51V72_60h70r7/}:1†<1=2>2˜?7—?5—?5—?3šA3£C5ªD6³E8ºE;¿F=ÀG>»F=°D8¤B5™@0–@/–A-–A-–?,•>+•<,•<,–=-–=/”<.’<-=-Ž<.‹<-‰<,ˆ<,ˆ<,‡;+†:*†:*†:*ƒ:+‚:+‚:,€:.;0€<1€=4?6‚B9ƒD;†G@‡HALA’H?˜HA¤KGªOLªWQªf]¥wh¡Œw˜›€’¥‰Š¤‡„ž…|’}t‚qlte\eRV_LMVCEL<?F6<@27;-68-01)00(.-(/+(/+(/+*2,,3--1-,1-,1-,1-,1-,1-,1-,1-,0/-0/-0/-0/-0/-0/-0/-0/-9*?5)73*-66*GL6_iPx„nˆ“…—–™¢™§†–¥‡›¤ª©šº¯ŸÁ±š¶¨š¶§›·¨˜¸£‘±š‰«’‰«²”’³”•´•­ˆ¢…ƒ›{’xgzdQcMTS5VU7XW9,03,03,03,03./1./1./1///..........-+.-+.-+-,*-,*-+,-+,-+,,*++)**()*()*()+)*+)*+)*+)*+)*+)*+)*+)*,*+,*++)*+)*+)**()*()*(),*+,*+,*+-+,.,-.,-/-./-./+*/+*0,+0,+/+*/+*.*)-)(0,+0,+/+*0,+1-,2.-3/.40/:12:12;23<42=32<21<21;1/=20<1/<1->0-?1.@2/A30A30?61@72@93A96A96B94E74G51O61W6/a6/j8/u9.€</‡=0Š>0•>7•>5“?5’@4•B4™C4ŸC4¥D4ªB5²C8´E:±E;©C7 @4˜?1•?2“A,’?-“=,“=,“<+“<+”<.”<.“;-’</<.;-Š;,‰<,‡;-…<-†:*†:*…9)ƒ:)ƒ:+9+:+9-€<1<3?5A8‚C<…F?†JB‡JEJAG@—HC¡NJ©VRª_Y©pe£„r›•{’¢…‹ªŠ„©ˆ€¡„~–~z‡uszjcqZ]iSR^JHT@BK:>E5:@29<134,22*1.)/+(/*'0**3*+4+,1++1++1++1++1++1++1++0,+1-,1-,1-,1-,1-,1-,1-,/.,;(;5(23+(56$CL-\hDt„`…”wŽ›‰’ž”Ÿšž–¥—•µ¡Æ¤¦Ð¨¥É¯¦Ê°§Ë¯¢Éª—¿‹³ˆ°‹³ŽŽ²Ž²¬Š„¢€€™{wŽrdx]MaHQQ5QQ5RR6,03,03,03,03./1./1./1./1/////////0/-/.,/.,.-+.-+/-..,-.,--+,,*++)*+)**()+)*+)*+)*+)*+)*+)*+)*+)*+)*+)*+)**()*()*())'()'(+)*+)*,*+-+,.,-.,-/-./-./+*/+*/+*/+*/+*.*)-)(,('0,+0,+0,+0,+1-,2.-40/40/:12;23;23<34=32<21<21;10<1/<1/<1/=/,>0->0-?1.@2/;60;62;83<94=:5=:5?82A60F5.O4-W5+b6+n8,x:-<,„<.’:6‘<5=5Ž@4A4‘B3•B2™@0Ÿ?1¦@4ªB7ªB9¥@6?5—=2•?2‘@-’?-‘>,’<+‘;*‘;,“;-“;-‘;,<.;-‹<-‰;.‡;-„;,„;,…9)…9)…9)‚9*‚9*9+~8,}9,=1€=4€@7B9„E>…HCˆKFŠMHŒIAŽGA˜JF¢SOª\X«h`©{n£Žy—Ž©ˆ…¯‹«ˆ~£„€˜€‹w{nixacr[ZhQP]IIUACL;>D6<?467/44,30+0+(1)'1()3)*5+,2)*2)*2)*2)*2)*0**0**0**1++1++0,+0,+0,+0,+0,+0,+;&57(/4-%46?I$Ue8pT‚’kœ}‘Ÿ†’¡Œ¡ˆ¨‡•¹žÉ“¢Ò”©Ò°¨Ò®¥Ñ­ŸÌ¥‘¾•ƒ°…‚­‚†±„†¯ƒŒ±ˆ‰¬„Ÿ{{”tqˆk_sWJ^CMM1LL0KK/,03,03,03,03./1./1./1./10000000000/-0/-0/-/.,/.,0.//-./-..,--+,,*++)*+)*+)*+)*+)*+)*+)*+)*+)*+)*+)*+)*+)**()*())'()'((&'*()+)*,*+,*+-+,.,-/-./-./+*/+*/+*/+*.*)-)(,(',('1-,1-,1-,1-,2.-3/.40/510;23;23<34<34=34<21;10;10<1/<1/;0.=/.=/,>0-?1.?1.96/:729839839:4:94;83>71A2+I2*S2)^4(j6)s8*|:*~;+84:5=4Œ@3‹B3A1@/”>-˜<-Ÿ=0¥@4¦A7¢@7œ>4—=4•=3‘@-?,=+<*‘;*‘;,‘;,’<-‘;.<.;-Š;,ˆ:-‡;-„;,„;,…9)…9)‚9(‚9*9*€8*~8,}9,€>2?5€@7‚C<ƒG?†IDˆMGŠOIŒICHD˜MJ¥UT¬a^­ng«s¤•€–¡ƒŠ¬‰‚°‹|«‡|£„™y‚ql{dgv__nWXeQP\HIRAAG9=@579.66.41,1,)1)'2()3)*4*+2)*2)*2)*2)*2)*2)*2)*0**1++1++1++0,+0,+0,+0,+0,+:&27(+4."47=HRb1l~J€’b‰™rŽ|Ÿ‚ŠŸ~Ч{·€˜Æ…œÎ…œÉ¢šÉŸ™Èž”׉¸Š®€‚°‹¶ˆ‚¬~ˆ¯ƒ‡ª€~œvuml„dZnRG[?IL/GJ-DG*/0*/0*/0*01+01+01+21,21,32-63.63.63.52-50,4/+4/+8.,7/,6.+5-+4,*2-*1++0,-0,-.,/--/-,1,+0*+/)*.()./(0/(//(//(//(//)-.)-.*+/+,-,*-,(.-).-)-.(./)./)--/--/---.../-.0/-2.+3.+2-)4,)5.(7.)8/(;0*;1(<2)<5+=4+>5.>5.>5.=4-<3.<1-=2.<1-<1/;0.=/.>0/>0/?11H-&C1';5)2:++=-(=.-;.45-?-+H()R%(X((Z.+Z8.[A2\G6wC-{B.„C1A3’?1•;0–:/”8+“;-‘>.‘B1‘D0‘D0B.?,<*Ÿ63›83”:2Œ<1…@1B0|A/|A/‚C2„A1ˆ>1‰=0‰;/ˆ:.‡9-‡9-v:/|@5u=0n9)s@/s@/t<+{@0{<-ƒ?4ˆD9‹H?ˆLA„NBQC€RC—HK•TRd]…ue{…lw’sz|€£ƒ‰¦ˆŽ¥‰’¤Œ‘¥Œ‡¤ˆy¢‚kŸ{awhŽea†]\zV[sS]mR[cLVTEPH=J;6G53B,/=&,:#+:#-9#/8".#/-#-,$-,&*+))+-(.1'/2'/4'06&14'14'13'32(32(30(3.)-0,-0,)//'=>0WZErx\‹gœs‹žpŒ¢qŒ§r‹¨r‰ªs³{›¾†£¿Ž ¾Œ›¹‡’²€‹­{†ªz„ª{…ª~„§}…¥€€ž|z“vr‰oi{e[jWLZIKO@CG8>B3/0*01+01+01+12,12,21,32-43.63.74/74/63.61-50,50,7/,7/,6.+6.,5-+2-*1++0,+0,-/-./-0--/-,1+*/)*.()-/(//(//(//(//)-/)-.*+.*+/+*-,*.-).-)/.*./)./)./)..0....../-./.,/.,1-*3.+3.*5.(6/)8/(90);0*<2)=3*>5,>5,>5.>5.>5.=4-<3,=2.=2.<1-;0.;0.;0.=/.>0/?10F/'D0)A3*=4+96-85.83-<1-?-+D*)K)(P*'U.)[4-_:1c?3s@+xA-€A0‰?2‘?4”;3”:1“;19.‹<-Š>.ŠA0‹B1B/ŽA/@/š93—:3’;2‹=1„?0‚@0@/?/„A1†>0‰=0‰;/‡;.„:-‚:,‚:,w9.x<1s9-n9)r?.s>.q9*u:,}=1„@5‰E:‹H?‰K@†MB„PCQC›DJ›QR–d]vfƒ‡p}”w~ ƒ¦…ˆ§ˆŽ§Š’¦‹“¥Œ£‰‚Ÿƒwœ}o˜xa•g\`VƒZU}XWyXWpSPbJKVECI;@A998340-0,+/+,.)--(,*,+)+***,+),-(,/)-2(03(03(02(02(10)1/*1-*1,+3,+32-12./0,)--%9:,TWBox[€‹i‡–o†™l†žnˆ£p†¤p„¥pŠ­w“¶€›¹‡˜¶„“³Œ®{†«xƒ§w‚¨yƒ¨|ƒ¦|„¤{x’uqˆnh{eYjWL[HGK<@D5:>/12,12,12,12,23-23-43.43.54/74/85085085083/72.61-80-80-7/,6.,6.,3.+2,,1-,1-./-.0.1..0--/,+0+*/*).1'//(//(//)-/)-/)-.*+.*+0,+0,+/.*/.*/.*0/*/0*/0*/////////0./0/-1-,1-*2-)4/+70*90+:1*<1+=3*>4+?5,?6-?6-@7.@70?6/>5.=4->3/=2.<1-;0.;0.;0.;0.<1/=20C2*E0+H/+L,-N+/M*.J*/E+.A-,@.*@/(C/(M/'Y0*d1-j30i;+o;-w;0=4‰<4Ž;5Ž94:4‹;2‡=2†>2…@1†A2‰A3ŒB5C6‘=2=1Œ>1Š>0†>/…=.…=.†=.ˆ<.‰;.ˆ:-‡9,„;,€;+~=+z=*}=3z<1v:/u;-x@1x@1v<.v;-?3„B6ŠF=‹H?ŠJA‡KA‡NC†PDDHQQšc^’ug‰„n‘t~}€¥ƒ„©‡ˆª‰©Œ“§Œ‘£‰‹ƒ„˜€”{a›k[•eXaV‰`W…`W]QtVMiPC[E=RA6F9/<2*5-&1+%.)$-(1&*1&*1&*1&*1&*1(-2).1+//*0-+0,+0+,0),1(-1&.1&.14.24.0.*'**"66*PUAmv[~‰i€k~“h™jƒŸn€ n~ m€¥q‡¬xŽ®|‹­zˆªw„©v§t€¦u¦w€¥y¤y€¢}}›yw’sp‡mh{eYkUL[HEG:=?28:-23-23-34.34.34.45/54/54/650961961:72:72:51940940:2/91.91.80-7/-4/,4/,3/.3/.3/01/01/00.1..0--/,,.2).2).2).0*.0*,0*,0*,/+*1-,1-*0/+0/+10+10+10+10+11111100010.10.2.+2.+3.*91.92,;2+<3,>4+@6-@6-A7.A8/A8/B90A8/A81@70>5.?4.=2.=2.<1-;0.;0.<1/=20=20?5,E2.O-.W(0]#/\"0W#/L'.C/.:3-55);5)E1(U.'c+*l*+e;/j;1s=3}<6…;8‰;9Š;7ˆ:6‰>9†?9…B9ƒC9…B9†B9‡A9‰@7†B/†B/‡@.‡@.‡>-ˆ<,‰:+‹9+‹8*‹8*ˆ9*…9)€<)z=(w?(t@(ƒ=3{7,x8,z</v;-w=/{A5{?4€B7„D:‡G=‰I@ˆI@ˆLB‰NF‹PH“OL”YS’f[sb„€g}Œmz˜v{¡|©ƒ«‡†«‰‰«Š‹¦‡Šžƒ†˜~„”zm˜mi”iegdefŒgc†e]~_Zw[PhPI_J@Q?8D60:/-5**/(),%7$(7$(5%(4%(1&*1(+/+,.,-*+-(,-'--%-/%-/$./$./$./1(+1+-0+(.+$88,PUAiqYvƒe{Œhyf{–iœn}Ÿmyžkz m¥r‚§s€¥q}¤o}£p}¥s~¦t~¥v}¤w|¡x}Ÿzz™wuqn‡jg{bWkRK]GGE9?=1:8,45/45/45/560560560761761872:72;83<94<94=84<73<73<41<41;30;3083072/61.61.5106216213122011/00.//-.4+.4+.4+.4+.2,.2,,2,,2,,3/,3/,3/,10,21,21,32-32-22222032032032.51.61-61-;4.<5-=4-@6-A7.B8/E8/E8/C:1C:1E;2D:1C90B71@5/@5/>3/>3/=2.=2.=20=20>31>31>7/C41O/2Y*2_%3`#2Y%1N+1B3077-39+68*?5)N1)]-)e+)c;3h<3r=7z=:‚<<†<=‡;;…;:‚;9>8€A:C;‚C<ƒB<…@9„?8E/D/C.ƒ@-†=,‰<,‹9+Œ9+Œ6)Š7)†9)‚;)~=)w?(sA(qB(…6/|/'8/ƒ?4w5)s5*}A6}C7E9G<ƒI>„J?…K@‡LDŠOGŒSJycL~hSoYu]}bˆi„•u‚ |¥~|©€~¬…­†€ª„¥€|ž}{˜yn}ŽlyŒlwŒkwŒmt‰joƒgl~dbqZ[hTSZHIK=B@4=6,8/&5+":&(8%'6&'2&&0(&-)(++)).*'+*&,*&,*'+*'+,)*,**,**,-#$2*(50,85,BC5UZFfpWn}^tˆcqŠbt‘ex˜iw›ks™hs›iwŸmz¢mx lwŸkv¡ly£q{¥u{¥w|£wxžuzœww–tqŽom†hd{_WkPJ^CFB9>:195,560560671671782782872872983<94=:5>;6>;6?:6>95>95?74?74>63=52;62:5294194184184195484373243132021/6-.6-.6-.6-.6-.4..4/,4/,40-40-40-52-32-32-43.43.431431542540841850940:5/=60?6/@7.B8/C9/F90G:1H;2F<3F<3F<3F<3E;2C90B71A60@5/@51>50=4/=4/>42?53?53=82A64I35Q16V.6U-5R/5J22A62::08<.9;-?9)H6*P4)U3)]2+c4.k62t76}77‚89ƒ7978}75{:6|=8{?7@9ƒ@:…@;†?;|E0}D0€C0‚A/…=.‡;-‰:-ˆ9,‡8+…9+‚:+<+{>+x?+uA+tB+‹2,‹2,¡LE§XQŠA8|90‚F;€J>yH:zJ<{M@|NA~NB‚PE‡UJYN_uNgwRtzX€{^Š|b“i›s›—|™zˆ |ƒ¨¬ƒ|¬‚x¨~t£yq vŠpˆo†nƒŽp€p}px‹ms‡kk~bgu\_iQWZGPM<H@3B6*>0%:,+7,*5+)1,(-,'+.').((/().(+-*,,*/+*3)*6',7&,9&,2)$<3,E>4JF:QR@]bLgqVizXmƒ]j…\j‰]p‘bq•eo•do—eršhu krhq›itžlx¢rz¤vy¢vyŸvvštw™tu”rokj…fc|^UlOJ^BHA9@91;4,671782782782893893983:94:94=:5>;6?<7?<7@;7@;7@;7B:7B:7A96@85=84=84<73<73<74<74<74;74:6395284173080.80.80.80.80.80.61.61.61-52-52-52-63.63.54/54/540540651952:72=84=82@93?80A8/C90D:0E;1H;2I=1I=1H>4H>4H>4G=4F<3D:1B8/A60B71@70@72?61?61@72@72A83=84@85B86D97E:8G96G96E:4C90B90B:/B:-D;,F:*H;*H;*].&b0)n3/x73ƒ98‰;;Š<<‰>;‹A>†A<?6}=4~;3‚;5ˆ=8Œ>:~C3€B3€A2ƒ?2ƒ=1„<0ƒ;/;/;.|=.{=.|>/|>/|>/}>/}>/—.*£;8ÎkfÙ~y­ZTŒC<ˆLAN@tJ:qM=pQ?qR@tSB{VD‚[J‰_OUOe€Uz~[‘y_¥ra³of»rk»xo¶…vªz ›~•£€Œ¦ƒ¦~}¢yyŸvŒr‹rˆ‘r„“r€•t|–sv”ps’pl‹ig„eby\\lQU_GMP;ED0A<)>3-<3,92*41(01).1(+1'+0)/0*2/*6,*:*+@'+D%+G$+H#+A7+LC4WP@[XE`bLgmQiwVj{Wl‚[g‚Wf†WjŽ^n”an”an–bršfržko›hnšiqœnw¡sy¢vxžuu›ts—su—ts’pn‹li„cb{[TmMH`@MD=E<5@707827828938938939:4:94:94;:5>;6?<7@=8@=8A<8A<8A<8A<8A<8A<8@;7?:6>95>95=84>95>95>95>95=84<73:51940:0.:0.:0.91.91.91.91.72.61-61-63.63.63.74/74/74/540651961;83<94?:4@;5B;3A8/B90C9/E;1H<0I=1J>2K=2K>5K>5J=4J=4F<3E;2C90B8/B92B92A81@72@72@93A:4A:4?74>95=<7>?7?@8@@6D@5J=4J70N5.Q6-Q6+O8*M:+I<)H=)l3(r6,~;3‰@:•DA›HDŸJGŸLH QJ—MDD;„;2‚8-…7-Œ91;4…?7…?7†=6…<5ƒ=5€=4|>3y?3vA3uA3uA3y?3}=3ƒ:3‡83Š73Ÿ%$´<;í{zþ•’Åhc–G@‰K@wI:mN<gR=dU>fW@jX@r\E}aL„eQj{O{{U™w\´l`Ì^_ÚR\áM[àO^êmuÜxxÎ…~¿€²–€§—}ž•x˜“u•Žr”r‘‘u”u‡–u—s{–sx–rq‘lp‹hiadtW]gLVX@LJ3GB.L40H3.D3,?2*:1(70&40'40'81):/+?-+C++H(+M%-O$-Q#-PE1[P:d^FgfJilOnuTm{Wl~Vk„Zg„Vg‡Vm]p•ap—br™dvhrœlo™km—ip™mwtyŸxw›wt–us•tu”tsqoŠki„cb{[TmMGa>SJCKB;F=69:49:49:49:49:4:;5=<7=<7=<7?<7@=8@=8A>9C>:D?;D?;E@<E@<E@<D?;D?9C>8C>8D=7B;5B;5B;5B;5B;5B;5A:4A:4A83A83A83@72@72>71>71>71<71<71;60:5/85085074/74/761961961:72<71=82A:2B;1C:1E;1F<2J>2K?3L@2N@3N@3M@7M@7L?6K>5I<3F<2E;2E;2B90A81A81?80?80?82@93@93<5/LE?IB:E<5OB:K:2J3+\>6Z5-`5.`4+^/'\0%b8,g@1gB2‹I;G;–I?žLAŸF>›>7š=6žD;¥ND£QE¨VH«YK£PBš@5˜:0ž=4’9;9:Œ67†54„96ƒ@:{@8o?3oC6lB4m?2u:274Œ35’-3–(1ÏEEèbaÅEDÍWUáyv«VO†F<‚WGlS=f\CedFgfHgbEm_DyeL†nVŽdK­p]ÍphÞW]å8Kð(Dü&Hþ+Lþ<WðG\éXeånrà|zÙ}Ö†؉‚¸„wµ…w³ˆx®‹x¨x£ŽyŸy›‘xއmŽƒm~i‰taƒgY{YMtLBpE<r;>d02b22\31L)'D'#I2,J70F5.E2,E0+H0.I-,I)*O+-V24VK/`W:f_BgdEkoLu}Xu„]oWj„WlˆXnŽ]q“`s•bu˜bušdv›eq–ks˜ms˜oq•os•rw™xz™zy–zx•yqŽrm‡jj„ghƒdazZTnKIc@TKBSJAPG>9:49:49:49:4:;5;<6>=8?>9>=8@=8A>9A>9B?:D?;D?;D?;FA;E@:E@:E@:D?9D?9E>8E>8E>8E>6E>6D=5C<4D;4D;4C:3B92B92B92B92A81A81@91@93>71<71;60;60:5/85.74-74-96196/96/;60<8/>:1A:0C:1C;0E;1G=1J>0L@2M?2NA1NA1N@5N@5M?6J=4I<3H;2E;1E;2C:1B90A81@91@91@91?;2?;2C:3G81I0,V..j68u99{;;†ECƒD?„H@…I?†G>ŽJA›NH£PL¥MK’E3”C2šB4 B6 >36-7+¡<0£C5›@.™@. E3¦F6©E5¯H9¸N@´KR¯GN¥@F™9=‘8:Š?<€A:r@5k?2uK=€NC@:‚,-“(0µ8FÒK\àJIáMMÌ>=Ã>?Ò_\µXQ„@5€UDvbJa]@Z_?ekIonOshJ{fK†kPÌ]VÚ][êSZó<Nü'EÿDÿHÿ!Kÿ(Nÿ.Nù9RöF[òM^ëO]êO]ëS`ÝakÛclÚgnØkpÓnrÑstÎvuËwwÌ{zÌwzËuxËotÊirËcnÊ^kÊ\iÆ`n´Ra¦JWšGQDK„FIk79FS2-L0,F2+I6/J91I;2M>7SD=]P.dY9ga?ifCnrMz‚[z‰bt†^r‰]oŠ]oŒ^qŽ^u’bw•cw•cw•cr’mw—rz˜vy–w~˜}ƒ„…‡ƒ›…™ƒz’|q‰ql„jhc`yYTnKJdAWQEVPDUOC8938938939:4;<6<=7?>9@?:@?:B?:C@;C@;C@;D?;D?;D?;FA;FA;FA;E@:E@:G@:G@8F?7IB:HA9H?8G>5F=4E<3E<3D;2D:1D:1D:1C:1D;2D;4D;4C<4?80?80<71;60:5/:5/94.94.96/96/96/;7.<8/@9/A:0C;0E;1F<0I=/K?1M@0M@0NA1M@0N@5M?4L>3K=2I<3H;2E;1D:0C:1C:1A:0A:2?;2@<3@<3A=4SE<P40g35AG°JWÇS`Ï[fÇ^c›B>–I?•MA›OB¬RJÃSRÏNSÒENœE2B0 @0¥?1¦:-¥7*¦8+§=/¬E4¡>+˜7$:%¥>+®@/³B2¹C5§/8±9B¹DL¾KR¸NRªLL“B>}:1u;/q9,s5*2-›47º<GØEWéLaåFCÒ41Ò:9À21ÉMKÈb]”J?‹\JzdLebCbfEpqOysS~iL‹iNœrZûW`úNZû@Qþ3Iÿ-Hÿ-Nÿ*Mÿ&Hÿ-Mÿ,Ký.Jü2Lù1Kù.Kû.Lþ1Oø=Z÷?[öB]ôFaòJcñMfïQhíSkêPhéOiéLgêKiîKjôLoùOsüQuþh…ô_|æZtÖUkÎYlÊdr¨R[r-0]''X1,T<2N@5?<-7:)<C1GP=[N,aW4e_=heBstR†d~ŒhwˆdxŒgsŒer‹cr‹ctcwfz‘gz‘e~•x„›ˆŸ… Š‘¤—¨–˜©™–§—‘¢’‡˜†zyn„mg~b^wYTmMKfCXUFXUFYVG7827828939:4;<6=>8@?:A@;BA<DA<DA<DA<DA<E@<E@<E@<GB<GB<GB<FA;FA;HA9HA9HA9LC:KB9JA8I@7H>4G=3F<2E;1D:0D:0E;1E;1D;2E<3E<3E<3@91?80?80<71;60:5/:5/:5/96/96-;7.;7.=9.@9/C;0D<1F<0F=.J>0L?/M@0M@0O?/O?/O>4O>4N=3K=2J<1G:1G:1D:0D;2D;2B;1B;1@<3A=4A>5A>5Q9/X+&‰:?ÅP`ãOeñOfíPcÐGO¢20”:/Ž?.–C3®F=ËFGÞ>Hã2B§H6§F5©B3®@3°?1²>1³B4´D6²G5«B/£<)¤;&©<(­:(¯5&®3$¸7<»8>½7>½6=¿<BÅJMÄTS»ZT—@7ˆ6+….%œ62ÃHKÞNXå@Qà0Eß:4Ð-(Õ74Ê64ÈD@É\U©WKXFtX@rgIysS|qQhJdK©oYÂ~kÿGVÿAPú9Jû8Iÿ=Nÿ@Qþ:Nö5Hÿ@Sû:Mú4Ký3Kÿ0Jÿ-Iÿ-Lÿ1Sÿ1Tÿ1Tÿ3Wÿ3Wÿ6Zÿ9\ý;^ü<aþ@fü=fû<eû<gý<iÿ?mÿBpÿEsÿLuÿNuÿRvøPqëRnè`xÙdv·Wb|15h0/U3*L:,BA/:C.5G/5L2VH+_T6i`CokN||`ˆŽr‡‘v}‹qzq|s|szozŠm}Œmƒ’s‰–x•£Œœ©•£®¦±¡ª´©±¸°°·°­´­¡«¢” ”ƒ‘‚s„qh|c]tWSlLLgDVWEWXFYZH671671782893:;5<=7?>9@?:BA<DA<DA<DA<DA<FA=FA=FA=FC<GB<GB<HC=HC=JC;JC;JC9LC:KB9KA7J@6H>4G=1H<0G;/E;/E;/E;/E;1E;1D<1D;2D;2@9/@91@91?82<71;60;60:5/;7.;7.;7.<8-?8.A;/C;0D</G=1I=/K?/M@0M@/P@0O?/O?/O>4N=3N=3J<1I;0G;/F90D:0D<1D;2B;1@<1A=2A>5B?6C@7_4-t42¯KSâYiðH_ð:Qá2C½#+¬/)š9(;&•=)¬@3ÈA=Ý:?ä0;¨D4¨B3«?2®>2´?5¹C7½G;»J<¬>/ª?-¨=+¨:)ª9'²:*¹;-¼</ËEBÏCBÒ=?Ñ6:Ö7<àAFâLNÜRPÁD>ÃLDËTLÑTNÙKJÝ>Cã3>è.<Ù5+Û7.Ò0+Ò94Á82µ@9µ[P”UDxO9~dI„lPbF]F®eTÍqdÛsjü<Iô9Dì8Aç<DæCHäHKäJLåIMðLSïDMð:Iö5Hû1Gÿ-Fÿ0Jÿ5Pÿ7Vÿ7Xÿ7Xÿ8Zÿ:[ÿ<_ÿ>bÿ?eÿAiÿBkÿBmÿAmÿ@oÿ@oÿ@qÿAqÿBnÿ=hÿEmÿJpöGhíMièZrÛbs½YcŒ@D]($M-"PC2PR=CO76H.WH1eYCujT€{gŽy˜œ‹”Œ‡”ƒ~‰—ˆŽœŒ™ˆ‡’‚Š“‚—žŽ¤¨—²¶§¸¼®¿Á¶ÀÁ¹ÂþÅÅÃÃÃþ¾¾²´³¢©¢—Žy‡vh{e\sWTmONiHTYBUZCW\E560560671782893:;5=<7>=8@?:B?:C@;DA<EB=FA=GB>GB>GD=GD=HC=ID>IE<KD<KD<MD;LC:KC8LB8KA5L@4K?3J>0I=/G>/G>/F<0F<0E;/E;1D<1C:1B90A:2@91@91?82<71;60;60;7.;7.;7,<8-?8.A;/D</F<0H?0J>0K?/M@0NA0P@0O?/O@-P>2N>1M<2L;1I;0H:/F90C9/C;0B<0B;1@<1A=2A?3B@4C@7t50–FEÆY_ßUbã@Qä5FÚ0;À*+¯1%Ÿ9#•;!”: ¡=&·=.Æ90Ê2- :,¢:-¥9-¨6,°91¸A9»E;·E:­?2«@0§<,¤6'ª6)·=0ÄD9ÊG=¾9*Î@4áD=ïA@ö<?ø7<ï05á-.Þ63âH@èTJåNEÜ=7Ü0.å.0ñ27Ö3$Þ</Í,"Ñ7/Á2,±6/Ég\¶m^ŒXC„\CW?‰R=©\LÑjaãfbáUTúAIñ>Dâ<@×?>ÎC>ÍJB×RMåZWéPRìELï;Gõ6F÷2Dø/Bû1Gÿ6Lø:Tø:Tø:Tû:Wþ=\ÿ?aÿBeÿDiû<eû>hú?júAm÷@nõ?oò>mï=mÿFnÿ:aÿ>dÿInÿJløMmòSoæXnëp‚Å_j˜ILt:6\6-O9+OD2SN:`PArdWˆ|p”Ž‚Ÿœ“¦§¡¡¦ ”˜”Ÿ›¨¤¦¯¬¦¬ª¤¦¥§§¥µ´°ÄÀ½ÍÉÀÒÍÇÕÐÌ×ÏÍÖÍÐ×ÎÓÑÊÑËÆÌ¿½À°²±˜Ÿ˜€Œ€m~k^u[VoQSlNU_DV`EWaF560560560560671893:94;:5=<7@=8A>9C@;DA<GB>HC?HC?GD=HE>ID>ID>JF=LE=MF<NE<ME:MC9MC7OC7NB6MA3MA3N@3JA2JA2I@1H>2G=1F<0D<1D<1C:1B;1A:2@91?82?82<71<71<8/<8-<8->7-@:.B:/D</F<0H?0K?/M@0NA0NA0P@0O@-O@-O=1O=1M=0L;1I;0G9.E9-C9/B:/A;/A:0?;0?=1@>2B@4@@4+)¨JKÁSV¾=BÀ/6Ç.3Ä./»0)ª1 £9!›=!–=˜= ¡=#¥;#¦6"6- 8/¢5.¦3,®71·@:¹B<²@6±B7­A5¨</¦8+¯:0½B:ÄC=Ä@;Â@(Í?+Ù5)ä)$ñ #ÿ")ÿ'/ÿ-2ò((é.)ã2*ß4*à4*ä1*é0+î.+Õ6#×5&Ò2$Ð6,Æ6.½>7È`UÑq¤eSŽWC‡N:¡XGÊe[ãa_ëPTëBIùDKí@DÞ@?ÑB<ÅB8ÁB9ÌIAßPLìKPô@Kù9Hý7Hþ5Hø3Eö7G÷=K÷9R÷9Rø7Rú7Uý7Xÿ9]ÿ<aÿ=gÿ@kÿ@nÿBqÿDtÿCuûCuùCv÷BuÿFgúAaþEeÿJlÿJkÿUtÿ^zö\vôi~éo~Önw¯]a„CAh6/hB7vTHwf_Œ}v£–¬¤¡²®­¶¶¸²µºª¯µ°·¿¶½Å½ÁÊÂÂÌÃÂÊËÅÏÕÎÖßÕÞäÙÕèÝÛéÝÝæÚÞåØßä×àáÔÞÙÏØËÄË»¹¼¤¦£ˆ’‡t‚qexb[tWXqS\iK\iK[hJ560560560560560671872983<;6?<7@=8B?:DA<GB>HC?ID@HE>HE>ID>JE?JF=MF>MF<OF=NF;OE;ND8PD8PD6PD6QC6QC6OC5MD5KB3JA2H>2G=1E=2D<1C:1C:1A:2A:2@93?82<71<71<8-<8-<8-?8.@:.B:/D</F<0I@1K?/M@0NA0P@0PA.O@-O@-O=1O=1M=0L;1H:/G9.E9-C9/A9.@:.@9/?;0?=1@>2??3@@4”67Á]_ÈZ[¯78®,,µ/,±,#°0#¯8$®B(©G* G'šF$šF$–C!”? Ÿ81£;2¦92¨50°:6¹B>¹D=±>7«<3¨<2¦</«<1¸F<ÆKDÄE>»72»:Ê<$á:*ñ.(ÿ$&ÿ'ÿ'ÿ%ÿ%(ù,)ñ2*ë5*è3(è2'ê/&ì-%Ü=(Ñ2Þ>0Ñ5)Ê7/Â?7¯C9Çqd²m]–YF™VE¿i\ÝlfãSSë@Hù?Lï<Bä:=×<:Í@9Á>4¹6,½4.Î44ïBHø8Gÿ2Fÿ3Hÿ5Iú7Gö<JöBNÿ>Yÿ=Xÿ:Wÿ6Wÿ5Yÿ5\ÿ6_ÿ7eÿ;kÿ:mÿ;oÿ<rÿ<rþ=tû>tû>vôEbýNkÿTqúIfð?\ÿRqÿfƒÿf€ô^wêbváky×s{Ärvªfe”ZV‰TN’€~¨™–¾°°Ä»¼ÆÁÅÈÇÍÅÈÑÀÄÏÆÌØÈËÚËÍÜÓÐáÚÖåäÜëêßïîáòòäãõççöçêóâèñàêïßêìÜéå×äÓÉÒþά©—y‡vi|f`w[\uWbqRapQ`oP201312423653875984984983;:5<<4==5??5AA7CC9EE9EE9HH@HH>HH<HI9KJ6LK6MM5MM5LK7IG8EE;HGELIPKIWFCVA=TQF4NC1JA0KB1MD5LB6F>3B90E<5C:5@85?74@86?67>56:44F85E76B87@78>:;<:=<<>==????A@<DA:HB6JA2M@-P?+O?(CB0F?/K:2O62Q35Q28N5;F:<??=-=3)A1.J4/G-,?#5B&GP3Ô`S»J<§7)¢7'£:'ž9%ž;&£@)Ÿ;$£='¬?+¯?+²:)±6&³4%´2$Ÿ8'Ÿ8'Ÿ:(£>,§B0©D2©D0©B/¨?,«>*­<*µ=-¾C4ÅF7À>0·3&Í6+Ì8,Ì:-Ì=/Ï=.Ô</Ý90æ5/ï/,õ--ø.,ó0,ë4,à9)Ø=)Ó>(Þ9%Ô4Ï4 Î9%Å8&¾6&Æ@4ÕQEÒIAÜMIïUUüVXýJPø9Aü4?ÿ9DäCHßCFÓAAÆ?;¹=3®=/ª?/ª@0¿Q@ÉQCÑLCØC=å??÷@Eÿ>Gÿ8CúGMúENûEQþESüARú=Sü>XÿCbÿGiÿBhù<fô;gô=køDsûIyýK}ÿMyýNwóRtçTqÝQkáQlø[xÿdˆÿY…ÿ?lÿMxöX{ÍYp¿yƒca„}sª½§™ÑŹÚ×ÎÛÝÚÙÜáÞÜéåÙíëÔîôÓðùÔóýÙóüßóøæòõìñóïðøõðøõð÷òïôîîðêêíäçèßäæÝâÖÐÔÍÉÊ»¹º¤¤¢Š|zt|qpzo~…sy€nv}k0./1/0320542653762873872:94;;3==5??5AA7CC9DD8EE9HH@HH>HH<JH9KJ6LK6MM5NM8KJ6KI<KJEQORWU`ZWhVTjQNiSI@ND;H?6F=6G>7H?8F=6C:5C<6A:4?74?74@85>95=84;63>3/=4/>42<74=98<;9=<:>=;@?;C@9G@6J@4L@0O@-P?+P>(=B,?A,E=0H92K63J46F35A57>=;8=69?5?A4C=-J9)^B4sRC¼K=¬;- 2#¡6&£:'8$ž9%£?(¡;%¦=(­@,³@-¶=,·9*¸6(¹5(¦;+¤:*£9)¥;+¦?.©B/«B/«@.­?.«:(±<+¿E6ÆH9Á?1¼8+½7+Ï5+Ï7,Î:.Ï;/Ó=/×;/ß8/ç4/ð0-õ--÷-+ò/+ê4)ß8(Ö;'Ï=&á:'Ù7"×8%Ô=*Ì;*Á5&Ã;/ÍG<ÐG?ÙJFèPOóPQôGKò;@÷:Aÿ?GàDGÜDCÓB?Å>8·;1¬;-ª<-©>.µF5ÅM?ÓNEÜGCã?@ñ>Bý>Fÿ>H÷DJ÷CLúDPÿFTýBSú=Sü>XÿBaÿFhÿCiü?iù@lùBpûGvüJzþL|ÿIxÿHtõKpðRsò]zö`{ùXwýMqÿCkÿAlóCjÝJgÉ^p®pugNI†‚v´”‡Ì²¥äÔÇëäÜèéäéêîéçòíáõöâûýàüÿâýÿçþÿìÿÿòþÿ÷üþúûþûöýúõü÷ôúôôøïðôëîñèëïæëäÞâÜÖØÊÆÅ²²°ž ›Ž“Œˆ…ˆ…–†‰€†}/.,0/-10.21/43/540762761:94::2<<4>>4@@6BB8CC9DD8IF=IG;JH;KJ8MJ7NL7NL7OL9KI:NKBTSQ_^dihxmm…lkŠihˆcYd[QZQGPJ@IH>FG>CC=A@:<A;;?:7<73<73=82>:1>:1=90:3-94.;60=82=:3>;4?<5?<3C?4F@4I?3L@2O?0P?-Q>-P>*3@&7?'<=+A;-B8/A62>42;31=85B:7H94O2.[+)o-.Š:= EJª9+¢2$Ÿ1"¤9'¥<)ž7$8$¢<&¤;&¨=)±A-¶A/¹>.»<-¾:-À:.®>0¬<.©9+¨:+ª<+¬>-­>-¬=,²?-®9(¸>/ÊL=ÊH:¼6*º2&Å;0Ó5*Ô6+Ò8,Ô:.×;/Û9.â7/é2,ñ/-õ.+õ.+ñ0)ç2'Ý6&Ó8$Ì:#à7$Ü5#Û8'Û>-Ó=.Æ7)Å8.ËA7Ç<5Ì?8ÙEAåKIìIJëCCí?Að@CÜDC×C?ÏB;Â=4¶:.­9*ª;*«<+ª9)¿E8ÔNEÝIEâ?@ë<AùAIÿFPôAGô@IùCOýGTþEUû@Uü>Xÿ@_ÿDfÿCiþDmÿFpÿIwÿK{ÿL|ýK{ÿCvÿGwÿJtúNtþZ|ÿa€ýUvòCdüHkÿRvÞ=\ÎH`Úz†µ}~\F;„r³‹Õ³§óÛÑúíåøóðøøú÷ôýôëüüêÿÿéÿÿëÿÿíÿÿòÿÿ÷ÿÿûÿÿýþÿþúÿýùÿûøÿøöþõöýòöûðôúïóðçêåßáÓÏξ½¹­®¨¢¥œ£™£—¤ªœŸ¥—œ¢”/.,/.,0/-10,21-32.54/650872991;;3==3??5AA7BB8CC9IE<JF;KG;OI9PK8QL8QL8OL;LJ=SPK^]bmlzzz’£€‚©~«|u–rkŒe^}YSoRMdMEZG@PB<HD?F@;?<87;62;7.<8-=9-<8,880991;;1><0?=1@<0?<-A;+F?/H?.K?/M@/O?/P?/Q>/P=.<@)=?*?>,?<-?;0=:3;:5:94<94D95N43[*-o&--8¨3C¶7H§7)¥7&§9(ª?-¨?, 9&Ÿ9#¤;&¥:&«<)³>,¹@/½>/Â<0Å=/Ç=0¹@5¶=2²:,®8*¯9+°:,²:,²:*¶;,¹;-ÄB4ËE9Ç?3¾1'À2(Ê:1Ú3+Ø4*Ù7,Ú8-Ü8.ß7,æ3,ì1,ó0,õ.+õ.)ï0(æ1&Ú4$Ñ6 Ê8Ü/Ú0Ú4$Ý;,Ø</Ð9.Ï<2ÒC;Ã6/Ä70Ê;5ÖE@âMIåLGÞC?Ù;8ÑA9Ï@8Ç>4¾</µ:+°8*®:+°<-¬4&½?3ÏHBÙHEßABæ@DôELÿLUð?Eð?GöBKþHUþHWüBWû?Wý@\ÿBbÿCfÿFmÿIsÿMyÿO|ÿL{þJyÿ@tÿL~ÿQ}ÿJrúLoÿUwÿUuùLjòEcïKfÒ>Vßetû §Í‘]=2aP@©wlÑ¥œöÔËþêãÿôòÿþÿÿüÿùóÿüïÿÿïÿÿðÿÿòÿÿôÿÿ÷þÿûýÿüûÿýùÿüøÿúøÿù÷ÿö÷ÿôøÿôøþó÷öëïìãäÚÔÔÉź¹´³´¬±´©²µª¶¾³°¸­¬´©10,10,0/+0/+10,21,43.54/77/880991;;1==3??5AA7BB8KD:LF:OG:QJ:RK9SL9RM:QK=OKBVTUfdowx††¨»“ÃŽ‘ÆŠÀ‡‚¸{w©rlœid_[~UPnNJaJGXEBM?=B;7696196-86*86)581692891;;/><-?<+C<)D<'I>*J?+L?,M@/M@0M?2M?4L>3M?4K?3F<2B90=909:25<44>57<5>:1H3.\0/{48œ;D¯9E²2Aª<+ª<+«@.¬A/©@-¥<'¥<'©>*§8%­:'µ<+¼=.Á;/Å;.Ê<0Ì<1ÁA6¾>3º:/·7,·7,¸8+¸8+º8+»7+ÇA5ÍC8Å8.Á1&Æ3)Ë7-Í6-à2+ß3)á5+â6,ã5,ç4-ê2*ð/*ö/,ø.*ô/)ì0'ã1#Ù4!Î6É7Ú/Ù/Ù2"Ù5)Ù9-Ô:0Ö?6ØE=ÕF>Í@9Ç<5Ë@9ÖKDÙNGÐF<Å;1Å=1Ä<0À</º;,·9*´:+µ=-¹?2µ9-½=4É@:ÒC?ÛBDãDHîIOöOVí>Cí>EóBJûJTÿJYýFXúCYýB]ù@_ûBdþFjÿJsÿOxÿOzÿLyýIxÿGwÿRÿQ}ÿIqûImÿStÿVtøNiëD^äF]èYkÿ—¢ÿ¶¼î žˆKFd2)©jcÍ–ôÇÁÿãÞÿòðÿüýÿýÿú÷ÿý÷ÿÿöÿÿöÿÿøÿÿùÿÿüÿÿýýÿýúÿüøÿûøÿúøÿø÷ÿ÷øÿõ÷ÿôøÿôøýñóóéêäÜÚÖÑÍÍÊÃÉÉ¿É˾ËÍÀÇÑȾȿ·Á¸84163.52-30+30+41,52-63,85.96/:70<90>;2@=4B?6B?6KC8ME:PF:SJ9TK:UL;SL<RL@QLHZW^kj|~Œº–™Î˜žÚ™žÞ™˜Þ“’Ö‹ŠÌ†„Ã~·xv¨ml–fe‡]ZwVTiMKXDAH><=;:6;8396/267465672880<:-A<)D>(G?(I?&J?)IA,JA0IA4IA6HA9G@:R9<N8;I68A57:65384.93+;12?517+=3'X:0{D=•GCž>?ž46§<*¨=+ª?-ª?-©>,©>*¬?+¯@-«8%²9(¹:+¿:+Ã9,É9.Î:0Ò;2É>7Æ;4Ã81Â8.Â8.Ã9/Â8.Ã6,Ä7-ÑC9Ò?5Ä0&Ã,#Ð7/Ö<4Î4,æ1*æ1*ç2)è3*ê3+í2+ð/*ó.(ø.*÷-)ò/)ì2&ã3$Ø5"Ï7 Ì7Ü5#Ù3#Ø2$Ö2&Õ5)Õ7,Õ;3Ö?8ìYRáRJÓHAÊD;ÉF<ÊJ?ÅG;½?3¼;(¼;(º;*¹:)·:(¸:+¼>0¿A3ÁA6Á<5Å<6ÏA?×EEÝGIãJMèMQëADì?EðCIúJTþN[üJZüF\üF]øA]ùBaýEiÿJpÿNwÿOzÿMxÿKxÿR{ÿR{þOvýOtÿVwÿ]{ÿSoîD^øUjîQd÷dtÿ’žÿ‹“òƒ‰Ç`c­KL²keÏŽˆñ¼¶ÿÞÙÿðìÿúúÿüþýûÿüûÿþûÿÿûÿÿûÿÿüÿÿûýÿûûÿûøÿûøÿüùÿûùÿûúÿøúÿöøÿòõÿðóûìïòææçÝÛߨÒÛ×ÎÝÛÏàÞÑàáÓÚãÞÏØÓÅÎÉ<94;8385052-41*41*52+63,74-85.96/;8/=:1?<3A>5B?6KA7MC7RF8UI9WK;WK;UL=SJASJK[Xcnl‚‚‚¨‘”Çš Þž§ì¡©ò¡¤óž í™›æ•˜ß”•Ö̈‰¿‚ƒ±zz rq‘fd|XWiPN\IGRFCJDBG=?K==G;:?;:8<92A;-D=*F@*F@(GA)GB.ED2CC7BC=AC@>BAG9HH<JG?LGDODGN@JL;II:ID?KA<@2F=.bH9QB‰K<Œ@2Ž;-¨=+©>,©>,ª?+­@,¯@-°?-°=*±8'¶8)½9*Ã9,È8-Ì8.Ò91Õ;3Î;4Í:3Ë81Ë81Ì92Í:2Ì70Ë6/Ó<3Õ>5Ò91Ì2*Ð3*Ù;2Ú<3Ó5,è0(é1)ì1*î1+ñ0+ò/)ô-(ö,(÷-)õ.)ñ0)ê2(â5%Ù6#Ò7!Í8 Õ8%Õ8%Õ5%Ñ4%Ò4(Ô6+Ô7.Ð7/ãNGèXPçZQØRIËH>ÃE9¼B5·?1¹<&¹<&¹<(¸;'¸9(º;*À>0Ä@4ÉD;Æ?9É@:ÑFCÕIHÖHG×IHÛJMìCFêADíDIöKSüQZýN]ûL]üJ`öD^÷DaùFfýIlÿNuÿOxÿOxÿNyðYzðWvóVuüYxÿ]{ÿZuûQkòI`ýWköUgêN\ö^kâKZçSaçSaåQ_¸jfÉ‚~窧ÿÓÑÿëèÿôòÿøùÿÿÿùýÿùüÿûüÿüüþüúûýùøüøõü÷ôÿú÷ÿûøÿüúÿûúÿøøÿòõýîñúëîðââëÝÝäÙÕâÙÒæßÕëçÛñîßóñâêóðÜåâÏØÕ@=6=:3:7074-52+52+52+63,74-74-96/;8/=:1?<3@=4A>5M@7OC7RF8WJ:XK:YL<WK=TICSJM^Xfpmˆ‚„­‘–Íœ£ç£¬ù¥°ÿª±ÿ¦«ü¡§õž¤îŸ£ê ã™›Ø•–Î’’ĉˆ´yyŸji‹`]|XUpSOhPLcMJeKG^FBS@=H?;<?:4B<0A>-C@-CB.BC3AE7>E=<EB;EF9DF:D]@JcHTjR]oXdt\fp]dj`ac`[W]LDgI>€UE’YFL7A+“A+«@,®A-®A-®A-°A.²A/²=+°7&µ7(¼8)Â8+È8-Í6-Ñ7/Õ8/Ù;2Ò73Ñ61Ñ61Ò72Ô94Ô94Õ81Ó6/ÞA:Ö8/Ñ3*Ø7/Þ=5Þ=5Û8/Ù6-ë0'ì0'ï0(ò/)õ.)ø-)ø+(ø+(ø-)ô/)ð1)é4)á5'Ù8&Ó8$Ï8#Í8$Î9%Î7$Ï6&Ð7)Ô8,Ó7+Î4*Ì3+ãNGôd\ë`YÔOFÂB9¸<2´:/·?&¸>&·=&¸;%º9&½9*Á;/Ä>3ÌC9ÊA9ÎE?ÕKHÓLIÎGDÌFEÐJIéFGæCDéDHòMSùRZùR\ùN^úOaõG^õGbøGdûIiÿNrÿRvÿRyÿRyå[uë\xõ`}ü_|øUpõMgùPgÿYnÿ[mÿbsóL]úSdøM_ÿRgüI_ýE]³d`¾tqÚš˜ûÈÅÿåãÿîëÿõôÿÿÿûÿÿùÿÿùÿÿúÿÿüþýýüúýùöýøõÿøõÿùöÿúøÿúùÿööþððøêêõåæìÜÝèÚÙæØÕèÞÕðèÝùóåþûêÿþíòûúâëêÔÝÜA>5@=4?<3=:1;8/96-74+63*52)52)63*74-:70=:3@=6B?8J@6OC7RF8VI9WJ9XK;ZL?[NHTIMXR`gd|}©’Ì—Ÿçž©ù¤°ÿª³ÿª³ÿ¬³ÿ«³þª±ùª®õ¨«î§«êŸ¡Ü™šÒÁ±ur¡he’]Z…XR~YP{YQxVOpOG_E?M?:@?;8@@6>>2@B5@F:>E=:C>9CB<GI?MP:YvKh†[udunx‘|zq‚|`n†]eX[œXU¥WM¥M?A,š:"Ÿ;#©<(«>*®?,±@.³@.´?-¶=,¹;,º6'¿5(Ä6*Ë7-Ñ7-Ö8/Ú91Û81×84Ø95Ù:6Ú85Ø61Ø61Û83Ý:3æC<à=6Ú70ã@7þ[Rÿlcÿ]Tã@7é1'î2)ò1*ô/)õ*&÷'%ø(&ú*(ø-)ó0*í2)ã1%Ú0#Ó1"Ò5$Õ:(É=&É=&Ë=)Ï<*Ñ;,Ò9+Ô8,Ó6-Ú@8Ð71ÜGAôc^ãXQÉB<Å@9·3.´<#¶<$¹<&º<&½:(¿:)Ä<.Ç=2È>4ÌC;ÙPJßXTÓOJÁ@;¿@:ÊKEäFEäFEèJKïPTòQWïNVïKVñL\ùRdøOf÷Ke÷JfüMnÿRsÿRvÿPtê[wêZuðZuú[wÿ]xÿZsÿWnÿViÿctþVgÿ\mÿYlõDXùBXÿMeÿIb·nh­hcËŽ‹èµ²ùÑÏÿêéýïîúù÷øþüøÿÿøÿÿøÿþúþýþþüÿûøþöôþùõÿû÷ÿùöÿöôÿööÿõõöèèçרäÔÔÞÐÍãÖÐñçÝüôçÿøèÿüéÿÿí÷ÿÿèñðØáàC?4B>3A=2?;0=90;7.:6-95,73*73*73*83-:5/=82@;5B=7I?5LB6QE7UH8VI8YI9YK>ZMEUKLXP_ebyz¦‰É”œäš§ö ¯ÿ«´ÿ¬µÿ­·ÿ¯·ÿ¯·ÿ¯¶ü¯³ú¯²÷§ªí¢£ä˜˜ØŒŠÉ€~½uq®ie¢b^›cVŽbU‹]TƒWOtNHdFCTBAIAAA;=8@C<DG@BD??A@BCGMNSWW_Vl“gyŸw¥€€¢Ž œ}œ£qŒ¥_w¯XkºTa¾OU¼FD¶=4±9(±:$°<#§8%¨7%©8&­:(°8'²9(µ7(¹5&»3%Â4(Ë7-Ó;0Ù<3Þ=5à;5à;5á>9ß<7ß<7â=9æA=èC=éB<èA;ç@:èA9ä@7Ü8/Õ1'Ø6+ëI>þ\Qô?4î6,ê+#î)#ù,)ÿ./þ,-ø((ú0.õ4/ï7/ç6,Ü4)Ö2&Ó3%Ò5&Å='Ç<'É<(Ì;(Í:(Ï7)Ï6(Ð4(Õ8/Ï5-Õ<6åPJçSOÛLHÏA?º/,¹=%º>&»='½<'¾9(À8(Ã9,Ä:/È>4ËB:ÕOFÜWPÒQKÃD=¿B<ÆKDáIFáIFåMLëSRíTVëPVéNVìOZ÷VføUhùSiúRküRmÿSqÿStÿRsïNoøTvÿ\|ÿ^{ÿ[vÿUoýQgûReüUføQbÿZhÿZjôM^úRcÿWiôI\§ha™\W·€{Ù©¥ïÇÅýáÞùêçýøõøýùøÿÿ÷ÿÿöÿýùÿýÿÿýÿûûÿö÷üùòþùõþùõþöóÿ÷õÿõõøêéêÜÛäÖÓÝÐÊáÔÌïåÙüõåÿùçÿýéÿÿì÷ÿýèñîÙâßEA5EA6C?4A=2?;0=9.<8-;7.84+84+73*83-:5/=82?:4A<6G>5JB7ND8RF6TG6WG7YI:YKBWKKXP[b^wsuž…ŠÂ™Þ—¤ó¬ÿª´û¬¶ý®¸ÿ±¹ÿ²ºÿ´»ÿ³ºÿµ¹ÿ¯²ùª­ô££ë™—àŽŒÕ‚€Éxt¾qm·l`¢i]dY“^V‡VQyNKhEDV@@J76;?=>HBBKABN?BYFJmX_}fnt¤}¬§‚®¬}§´w ¾p—Âc…ÃRpÅE^ÔI\×EPÊ9<¾3,»7(¸;%³; ¯<*¯<*°;)³;*·<,»<-À<-Ä<.Ä6*Ë8.Ô<1Û>5á@8á>7à<3á:2Ü73Ù40Ø3/à93èA;ìE?êA<å<5ã<4Û4,Ø4*Û7-Ô2'Ì, Ö6*èH<÷I>ò@6ï4-ð-)÷+*ý+,ý+,ø*,ñ))ì/+è3,â5.Ü4+Ö2(Ô2'Ô2'Ç:&È;'Ê<(Î;)Ñ;*Ò:,Ô8+Ô8,Ñ4+Ø;4Õ:5Õ<7çONîXYÙEEÅ02¾=(¿<(¿<(¿:'Á9)À8*Á7*Á7,Æ>2ÇA6ÏJAØUKÑRIÄH>¿E:ÃH@ÚIDÙHCÝLGäSPåSSâPQâMQåNWòXdöZhý[pþZrýUoûQlýPnÿRpÿFmÿOvÿZ}ÿ[{ÿVqÿSkÿVkÿ[mûYhúYhü`mö`kî\fñenífmÚT[’cY}ND™lfØ’ß¹¶ñÓÑôàßþöôøú÷÷ÿý÷ÿÿöÿýùÿýÿþÿÿýÿÿ÷ûúúòüùôüùôýøôÿùöÿøöùîìñãâçÙÖÝÐÈÜÒÈîäØýöäÿûèÿýçÿÿè÷ýùêðìÝãßIE9HD8FB6D@4B>2@<1?;0>:/:6-95,95,94.:5/<71>93@;5E>6HA7LD7QE5RE4UF3WG7WI<XMIXNW_Zppp–€†ºŒ•Ö”¢íšªø¨°ø©±ù¬´ü¯·ÿ±¸ÿ²¹ÿ´¸ÿ´¸ÿ®²ü«­ø¥§ôŸžì—–䌋قÏ{zÈxl´pf«h_ _Z’YW†QQwGGc@?Q<6DF9BS>C_@EmDJ€OU•]f¦jrÇe˜ÍkœÏl›Ïf‘Í]…ÎTyÌFgË8UÌ0Hß>PäBMÔ:<Æ7/Ã@.ºB*®<!­5$­5$®5$±6&¶7(¼8)Ã;-È</Ó@6×@5Ú@6Ý?6ß<5Þ:1Ý6.Û4,Ò/(Ò-'Ó.(Ú3-á:4ä;4á81Ý4-Ü5,Ò+"Í)Ù7,âB4Ü?0Ð4%Ê.éF7óI<ýH?ü<9ö,,ó"%÷&)û/2ñ-.ë/-ä2.Þ3,Ù2*×0(Ö/'Ö/)Ð8*Ò9+Ô;-Ö=-Ú>/Û?0Ü@3Ü@3Ò6*èKBåJEÎ50àFFóZ\áHKØ?BÆ=-Ä;+Ã:*Ã:*Ã:*Ã9,Á9+À8,Â<0Â>2ÈF9ÏOBÎPDÄH<¿C7¾D7ÑF?ÑF?ÕJCÛPKÝROÙMLÚKMÜKPëX`ó[hüaqÿauûWoõOgõMgúPkÿJuÿOyÿSwÿRqÿSmþ[pÿcuÿixÿguüaoôbmìelàglÔjjÉjh¼c_dVeH:_Tª‡Í«©åÇÇïÚÙÿóóùøöøþü÷ÿÿ÷ÿÿûÿÿÿþÿÿüÿÿ÷þûüôúûóûúõþûöÿýùÿûøþôòøíéêßÙÞÔËÝÓÇíæÖÿøåÿþèÿÿæÿÿçõúóêïèáæßLI:KH9JG8HD8FB6D@4B>3A=2=9.<8/;7.;60;60<71>93?:4B?8EA8JD8NE4PE1TE0VG4XH9ZMEVMR[Whkl‹~‚²‰“Ð’Ÿå™§ò§­÷©¯ù«±û­³ý°´þ°´þ°´þ¯³ý«®û¨«ø¥§ô ¢ïšœé“•⊌ل†Ó…É{u½mj­dd _a”X[†QQsNHbUFY_CRlBLEO˜LV¬U]¼[dÅ]fçJuéNxæPuàLn×FcÒ?YÍ5JÊ+?Ú5EçAMéFKÙ><Í>6ÊH8¿J6°B)·>-¸=-º<-½>/Ã?2ÊB4ÐD7ÕE:ÙE9ÚB7Û>5Û:2Ù6-Ù5,Ú3+Ù2*Ô1*×4-Û60Ý90ß80Þ7/Ý6.Ü5,Ö/&Ù5+Ø6)Ï2#Í1"Ò9)Õ>-Ó<+Ö=-æD7÷KAÿD?û56÷)-÷)-ù.2ø67í55â30Ú1,×/,×/,Ù0-Û/-ã80â:1â:1â<0à<0ß=0Ü?0Ú>1Ñ7+ïWLù`XÓ;6Ó;:èOQÞEHèOTÍ=2Ê:/Æ8,Æ8,Æ:-Å;.Ã;-À:.¾:-¾<.ÁB3ÇH9ÇI:ÂD6¾@2¼>0ÊE<ÊE<ÎI@ÕPI×RMÔNKÓKK×LOçZ`ð^hüfrÿhxü]qóOgóMeùQjÿPzÿQxÿQpûSmø\qûhxûjw÷epüfró_kí_kêkrÝsu¿lh¦f\¡l^ujXVI8kXJ–{t¾ŸœßÁÁïÕØþîïûõõúüûúÿÿùÿÿýþÿÿýÿÿûÿÿ÷ÿýÿ÷ûþõûüöÿþùÿÿúÿþúÿûõÿ÷òñèáäÜÑáÙÌðé×ÿúæÿÿæÿÿãÿÿäöùðíðççêáQK=PJ<OI;MG9KE9IC7GA5G@6B;1A:2@91?82?82?82A:4B:7@?:EB;IE9MF6PE1RF0UF1WG7YLCUKLZTbii…|«‰’É“žÞ—¦ë¨«ú©¬û«®ý­°ý®±þ®±þ­°ý­°ý©­÷§«õ¤¨ò¢¦ðŸ£íšžè•™â‘•Þ’’Ú‰‰Ï|€Àrx´nu«lpŸhhŽj_x`x‚WjO_¥OZ½R\ÑR[ÚOVÛHPñ:Pî=QéAPàCLØCIÑ?BË9:Ê45åIJèHHã@AÕ76Î93ÌB8ÅE8º@1ÃE6ÃE6ÅF7ÉE8ÌG8ÑG:ÖH<ÛG;Ö>3Õ;1Ö8/Õ4*Ö3*Ø4+Û4,Ü5-Ú9/Ý<2à=4ß<3Ý90Ü5-Ü5,Ý6-Ò.$Ý;.Ü<.Í1"Å.Í8$Ð=)Ì;&Ë:'Ò9+á:1ó=9ÿ@@ÿ;?ÿ27ô+1ê,.ß+,×+)Ó+(×/.Þ44ä88è:;ó55ò64î73é6/ã7-Ý5*×5(Ñ5&Í5'çPEÿmcÛHAÈ42×CCÓ>BêUYÙB;Ô=6Ì70Æ6-Ç9/Æ<1Ã=1Á=.»9)»<+½@.¿B0¿B0¾?.¼=,»<+ÃC8ÄD9ÈH=ÏPGÒSLÐOIÐOJÔOPç_cîaiûitÿm|ÿdu÷UjõRgýWoÿSxÿUtûWpð_pñoyôy~êmsÞXaïamò`mïaoðs{숊ɂ|¥wjšyhhpYMO:^WGƒqg±•’Ý¿¿ñÔØýéëþôõýûþûÿÿúþÿýþÿÿýÿÿûÿÿöÿüÿøùÿõúýôÿÿúÿÿúÿÿúÿý÷ÿþöùðçíåÚéâÒôïÜÿûåÿþåÿÿãÿÿâøúíòôçîðãSM=RL<QK=OI;MG9KE9JD8IB8E>4D=5B;3A:4@93A:4A96B:7@A;CC;IE:NG7QF2RF.UF/WH5XJ=RHFXR\jh€}§‹’Æ’žÚ–¤å¥¦ù¦§ú©ªý«¬þ¬­ÿ­®þ¬­ý«®û¨¬ö¦ªó¤¨ñ£§î¡¨î §ë¤è›¢æ™žâ’šÛŠ”Ò…Ê‚ŽÂ‚‰·‚©‡yšŽmˆšczªWi¾P]ÓKWäGPí?Hñ9Aî;6é<5âB6ÙH7ÎJ5ÅG1ÂD.Å@/ãUGàG?Ú;7Ø64Ø88Ö:;Ï98Ê66¼=.¾<.¿;.À;,Â8+Ä6*Æ3)È1&Í5*Ð3*Ñ3(Õ2)×3*Ù5,Ý6.Þ7/Ü>3Ý<2Ü;1Û8/Û7.Ú6,Ø4*×3)Õ3&Ó3%Ñ4%Ï6&Ò=)Ñ>*Ê9$À2Æ;(È5%Ó3'ç60ü;<ÿ=@ÿ7=ù27ê-1à..×--Õ0.Ü44ã9:é;=ë;>ý.4ú/3ö01î1/æ1*Þ2(Õ1%Ï3$È2#Ð>/új_ãTLÈ95Ð@@Ë:=ãRUçJEÝB=Ò93Ê5.Æ8.Å;0Â<0¿=-¹<*¼?-½@.¼?-º;(º;(½<)¾=*º>2º>2ÀD8ÈLBÌPFÊNFÌMGÐNLçbcêbføhqÿo{ÿhxøYm÷Ujþ[pÿXsü\tìbqãktç€í‰‡ãyyØ_dñhrÿl|öcsíkwø‘•餟À–Š¥‹z\pWFR<UVFtg^¤ŒˆÜ¾ÀóÔÙùâèÿóøÿúþýþÿüýÿýüÿÿüÿÿúÿÿôÿûÿøøÿõ÷ýóýÿùÿÿúÿýöÿý÷ÿÿöÿùïõïãòìÜúõáÿþçÿþâþÿàÿÿãýþðùúì÷øêUO?TN>RL<PJ<NH:LF:KE9JC9G@6F?7D=5B;5A:4A:4B:7C;8@A<DD<IG;MG7OG2RF.VG0WH3VH;RGCWRYjh~~‚§Œ”Å’žØ–¤ã¡ž÷£ ÷¦£ú©§û©ªýª«ýª«ûª¬ù§«õ¥©ò£§î §ë¢ªë£«ì¢ªë¡©è˜¡ä–¡á”ŸÝ“ŸÙјǒ‘¹™Š«‘m‰£c{´WjÇM\ÚBNë;Eø6>ÿ4:èB*âD)ÙH)ÎN+ÃO(¹L%¶H%»D&ÛWBÚF8Ú;5æ>>íBHé>Fß5>×08ÈF8ÇE7ÈD7ÉA3Ç=0Æ8,Æ3)Ç0%Ê0&Î1(Ó2(Ö3*Ù5,Ù5,Û4,Û4,áC8Û=2Ø7-Ø7-Ü:/Ý9/Ù5+Õ1'Ù7*Ð0"Ì0!Ð9&Ì9%Æ5 Ç9#ÑE.Á:&É:)Õ7+â3.í//÷05þ5;ÿ;BÿIMúGJîDDæ@@ä>>ã9:ã28á.4þ'/û(/ø*.ó-.ë0+ã2*Û5)Ô7(Æ0!¾/óeYê]TÌA<ÓEDÊ;=ÝNRïPMäFCÕ:6Ê5/Æ8.Ä:/À</»<+»>,¼A/½B0º=)·8%º9&¾;)Á>,²8+²8+¸>1ÁG<ÅK@ÄIAÆICÊJGå`aæ^bñdlÿlxÿix÷ZköTiýZoú^tòcuãgqØqrÝ…é”ꋇåruùq{ÿxˆõ`sßXgóŠ‘ý¶´Ö«¢¬•…TnSAS;PTCkaWž†‚Ý¿ÁõÖÛøßåÿóùÿûÿÿþÿüýÿýüÿÿüÿÿúÿÿôÿùÿø÷ÿôöüòüÿøýþøüüôÿýöÿÿöÿþôûõç÷ñáüúåÿþåþýáýþßÿÿãÿÿñýþîüýíXO@XO@WN?VM>TK<SJ;RI:QH9MD5LC4KB3I@1H?0H?0H?0H?0FC<GE9JG8NI6RJ5UJ4UJ4VK9XNDULMXTbii…{~©‰ŽÆ‘™Ú— å¦¢ù¦¡û¢¡þ¡¡ÿŸ£ÿŸ¨ÿ «ÿ¡­ÿŸ«÷ ªï¡©ê§¨ë«¨ï²§õµ¦ù¶¤ú—«ÿ“¨ùŒ£ç£Ö¢¦Ë´ ¹½„“ÆbnÑEPé:Gõ5Bø4>ñ8>æ=@ÙD@ÑHBå;Dà;BÞCGÉ99ÌB@ËD@½/-ÞHIëHKîAGï;Dì8Aé:?â<>Ú<;Ô<9ÏA=É>9ÊC=ÑLCËK@¼>2³7+¹;-¹9,¾8-Å7-Ê3,Ï0,Ô/-Ý11á34çA1à9)Ü1 á1"é8(ê;*ã6%×2Ñ2Ì4Ê5Ç4 É3"Ì3%Ñ3(Ô3)Í.(Ï2+Î6+Ì8*Ë8(Í7&Ð7%Ø6'ß3'é2,ð31ò01ð+2í*2í+4ï-6ú+1÷*/ñ+,î.-ë4.ä8,Ú7(Ð5#Ã.Ä3 çXHèZLÊ<2ÞOGÄ5/ÚIFÝQRÚLKÒDBË<8È80Ç7,È9+Ê;+È;)Å:'À9%½:&»<)º=+¸=+¶=,³9.µ;.¹=1½?1½?1¿@1Â@2ÅA4ïk_õqeêd[ômiùroécbðjiútuÿk|ûivñdmï_hòaføgjõnkîqk÷|wÿ}ƒþYjÿ[wîZpû¬±«°œaŸz]sMIZ6LR6snX£–†Ë·®íÕÓÿîðÿõ÷ÿ÷ûþøüüüþþÿÿþÿÿþÿÿýþÿæÿòàÿëâýêìÿð÷ÿôûÿôþÿóÿþñÿýïÿûîÿùèÿùæÿøãÿùãÿùáþúáýÿþþÿÿþÿÿYPAXO@XO@VM>UL=TK<SJ;RI:NE6MD5LC4KB3JA2JA2JA2JA2FC<GE9JG8OH6RJ5UJ4VK5VK9XNDUMKYUciiƒ{}¦†‹Â•Ô“œß œðŸñžžöžŸû¢þŸ¦ÿ ªÿ¡¬ü ¬ô «íŸ§æ¢¦æ¦£èª¢í« ïªï™ªü—§ô˜£åžžÒ¬šÂºª½r†ÃUbÓCMå;Dð7?ñ6=í8=ã=?ÛAAÕDAä:CÜ8?Û@DË;;ÊC@ÈA=¿41åOPäDFé>Dë:Bè7?ä7;Ü89Õ:8Ð;7ÓF?Ç<5Å<4ÌG>ÌLAÁC7¶;,·9+¹7*½7+Å7-Ë4-Ñ2.Ø3/á53æ66á?0ß<-Þ6)à4&á6%á6%Û4"Ó4Ð:"Ê:"Æ:#Æ;&É<*Í;,Ì8,Ì5*Ö3.Ö5-Ñ7-Î8*É6&Ç4"Ë4!Ð3"Ø2$ß1(å/+ç.,è,-æ,1æ-3ç.4î*,î,-í0.é2.á3*Û5'×7'Ò9'Ó@,»*ÔE5Î?1ÙF>êWPØC?ØBAåWVâRRÛKJÔC>Í=5É9.È9+Ç8(È;)Ä;(Á:'¾;'½>+º?-¹@/¶>-²9.µ;0·=0¹=1º?0½?1ÁB3ÅC6ëi\òmdçb[ðkfõolèbañklûuvÿp€ÿo|öirë^fêY^òadøqnù|vöyuÿx~ùRdÿUríXnö¥«¥¨“X”n[tLN_;QZ;us\ª×úøàÜÿôóÿúûÿúûÿûüüüþúþÿûÿÿúþÿûüþçÿñáÿêáýçéÿìóÿòøÿóýÿòÿÿóÿýïÿýíÿúëÿöåûóàúòÝûõßý÷ßúúøüüúÿÿýZQBYPAYPAWN?VM>UL=TK<TK<QH9PG8OF7MD5MD5MD5MD5MD5GD;JF;MG9PI7SK6VK5VK5VK9WMCVNL\Vbkiy{¢…ˆ»‹‘Í—Ø™—à™˜ä˜™éšœï›Ÿö£ùŸ§ø ©ö ªïž§èœ¤âœ¢àžŸàžáŸ™ãž—ä㖛ݠ–Ү¼ƒ®Ær“ÇZqÇCQ×AJá>Cæ<?è;=æ<?ã=Aá>Cß>Câ;CØ7=Õ?AÏA@ÉD?Â=8Ã96ëWWàBCæ=Bé:Aæ7<Þ58Ö66Ñ96Ì;6ÕHAÅ:3¾5+ÅA5ËK>ÆH:»=/¶8)¹7)¿7+Æ8,Î7.Õ60Þ63æ87ë;;Ó5)Ö6*Ú6*Ü6*Ý5(Ý7)Ú:*Ö?,Ã5¼5¸6 ¸7"»9)¼8+¼4(º0&é=;å>8Þ=5Ô</Ì9)Æ8$È7"Ì7#Ò7%Ö2&Ù.&Ú-'Ü-*Ü.-Û//Û//Þ*)á/+á4.Ý5,Õ3&Ð5#Ð9&Ñ>*ÓB/Â1 æTEÐ<0ÚA;ÞC?èJIòTSèVVçSSãOMÝIEÖC;Ï<2Ê8+Å6&Ä7&À7%¼7$»:'¹<*·>-µ=,²=,°:.±;/²<.µ=/·=.º?0ÀB4ÃE7Ü\Oêg]äaYñlgöpoçabìfgòkoäP`ï^kôhqòemñ`eödgûqqúzwövsÿnuõJ]ÿMjïUmñœ¡ŸžŠPˆcVoEOd=Va?ww]¯¤’âÐÄÿíæÿ÷óÿûøÿýûÿþüûÿüûÿýûÿýùÿû÷ýùãÿëÜþãÚøÞàúáèûåïüèöýëýþîýúëÿúêÿ÷èúñàòê×ðèÕôìÙùñÜýùöÿûøÿþû\PB\PB[OAZN@YM?YM?XL>XL>UI;TH:SG9RF8RF8RF8RF8RF8JF=KG<OI;RK9TL7WL6WL6WL:VL@UMJ\V`jh~yy‚„´ˆÄŽ”Ð””Ò”•Õ••Û–˜ã˜›ê˜žìš¢í›£ëœ¥æ˜¢ß–ŸØ“œÕ“™Õ“—×’“ÖÖ†½Ž„¹£~²¸r¤Êe‘ÖTzÙDa×:Kà@HÞBCÞC?ÞC?áAAä?Cè=Fë;Fã?FÖ:>Ó>@ÐFCÅA<¸71Å>:ê[WÝABä?Cç=@ã:=Û89Ó97Î=8ÌA:ÏE;Ã9/»2(À</ÇE7ÄE6½>/¸9(¼8)Â8+É:,Ò:/Ù80á83è;7ì=:Ô3+Ö3,Ù5,Ý4-Þ6-Þ7.Ú:.Ô>/Æ9(Á<)½>-¹>.»=/½=2Á>6Ã>7ó?>î?<æ?7Ù=1Í:*Æ9%Æ;$È<%Ï<(Ï8'Ï2#Ñ1%Ó2(Õ4,Ñ2,Ï0*Ñ3*Ó5*Ñ7+Ï7)Ê7'É8%Ê<(Ì>*Ê<(Î=,ô^PàF<Ò3/Ò.-è?BþUXÿvuÿroÿjgö^YçPIÕA7Ç5(½.Ä8'À9&»8&¹:)¶=,µ=-±>,°<-­<.­<.®=/°<-±;-¶>0¼B3ÁE9ÉMAß`Wâa[ôpløtrå`aä]aå^dÙFVçYeógpôgo÷dlýjpÿstúxvõssûenóCXÿEbðRkë’˜œ—ƒN‚\Ql?Ri?ZhDy|_°ª”èÛËÿôêÿùðÿúóÿýöýÿùûÿúùÿúöÿøòüóîøïÔüÚÎóÒÊëÌÏìÎ×îÒàïØéòÝóöãöõãûõåüõãõìÛíáÑéÝÍíáÑóç×úõïü÷ñþùó\PB\PB[OA[OAZN@YM?YM?YM?WK=VJ<UI;UI;TH:UI;UI;UI;LH=OI=QI<TK:WL8XM7YM7XM;UK?UKI\U]hexut“|~§„ˆ¸ŒÄŽÁŽ‘Æ’Í’“Ô’•Ü“—à”˜á•šÞ•Ü’›ÔŒ•̇‘ƃŒÃ‡Ã}‚ÂzÁ|vš‹q–¦h‘Ä[†ÚKvè>cî7Uí8IçAEßFAØIAØIAÞFCæAGð;Jõ9JãDI×>AÐ@?ÏJE¾?8²3,ÇD<âTPÜDCáACä>@â>?Ü>=Ô@<ÏE;ÌH<Ç=2Á7,½5'½9*¿=-¿=-»<+½<)À;*Ç;,Î<-Õ;/Û8/à70ç83ë95ã:7â64â22å31æ42ä50Û2+Ò1)É2'Ç9-Ä<0¿90¼5/¿52È<;ÒDCó57î66å61Ø5,Ë5&Ã6"Á9#Ã;#É>'Ê9&Ë5$Í5'Ñ9,Ó;0Ò:/Ï8-Í?1É;-Ä8'Ã7&Ã:'Å<)Å='Æ;&Í>-Í:*Ø>2ãB:Ö.+æ::á14å26Ò73Ö;7ÞC>åJEêQIêSHèTHäUGË?0Æ>.¾<,º<-¶>.³@.°?/®?.«=0«=.¬<.¬<.­<,±=.·A3¼D6ÆLAÞbZâc]ðnlôrrå`cå`eæ`gúixûozõltí`hñ^fÿkqÿw{ÿ{|öpqø^hö@Wý>]óOh懠•ƒX†aXuE\vIgwP‚ˆfµ±–éáÌÿùéÿüíÿýñþÿóûÿôøÿöôÿóíûìäòãÝëÜÁëŻ㾺޺¿Þ¼ÆáÀÍâÃØæÌãëÓìîÙôñÞøñßóêÛìàÒèÚÍìÜÏñáÔòçáòçáóèâ[OA[OA[OAZN@ZN@YM?YM?YM?XL>XL>WK=VJ<VJ<WK=WK=XL>PI?QI>SK>UL;XM9YM7YM7XM;WK=ULGYSWc_nmkƒtt–|~§ƒ†³†‰²‡Š·ŠŒ¿‹ÈŽÏŽŽÔÕÓ”Ó‹Ê‚‰¿{‚¶u|²ov­gp«ck©€n~ey­ZvÏMoê?cú2Vÿ0Lû6Gð@CâGBÙLB×MCÝIGèCJõ<Nü8NàFH×CCÌA>ÍID¸<4¯5*ÉI@ÕLF×CAÜ>=Ý:;Û;;Ù?=ÔE=ÌH<ÇI;Á7*Á7*À8(¾9(¼9'º9&½:(À;(Ä;)Ê=,Ò<-×;.Ü8.á6.ä6/è5.ê24è.1ê+0ð/2ö37÷69î45æ21Ø/,×31Ô63Ï42Î/3Ð/5Û5?ä=Gõ,2ñ.2è2/Ü3,Ñ5(É8'Æ;&Æ>(Ä9$Æ8$Ë8&Ò:,Ø?1ÛA5ÚB5ÙA6ÎI8ÇB1¿<*½:&Á<)Ã?*Å<)Ä9&Ì;*Î6)Î0'çB<Ý1/ñ>Aå.2à'-Ò3-Ó4.Ö71Ö92Ò8.Í5*Æ2&À1#ÎE5ÆA2¼=.µ:+±9)®:+ª:,ª:,ª</«=.¬>/«=.«<+¬=,°?/µA4ÉSGàg^ßd_èkiînoæchðjqõoxüp}ýt~õmwîcj÷dlÿqzÿw|ûsuökpöXfûAYÿ:[õKfâ}…©˜†l”ojŠXo‰ZxŠ`—r¶·˜âÜÂúôÞüúåÿÿïûÿïõÿïîÿëçúäÜïÙÐãÍÉÛū٫¨Ó¦¨Ñ¥¯Ô©¶Ô®¼Ö±ÇÚºÒßÁàæÌêéÔòíÚòéÚïáÖìÛÑëØÑíÚÓèÛÒæÙÐåØÏZN>ZN>ZN>ZN>YM=YM=YM=YM=XL<XL<WK;WK;WK;XL<XL<YM=RJ?TJ@UL=XL<YN:ZN8ZN8ZM:YM?VKEXOP^Xbd_sifƒqp’yyŸ|¢~€§‚°ƒ„¼††Äˆ‡Ë‰ˆÎ‰ˆÌˆˆÈƒ„½{~µux­or§jm¤eg acž…ac“X^±O\×H\ó=Vÿ1Kÿ/Dÿ7Bö>@çE@ÝJBÚKCÞHGéBLó<Nú8PØDDÕEDÈA=ÈIB³:/°7,ÌPFÉB<Î=8Ñ64Ï10Ð51Ó>8ÏE;ÆF9¿E6Á8(Ã:*Â:*¿:'½8%½:&¿:'Á:&Ä9&Ë:)Ò;*Ù9+Ý7+á5+ä3+ç4-í)-ò)/ù,3ÿ.4ÿ07ÿ18ÿ28ý58ú7;õ8<ò9?ò9Aô9D÷6Gû6Hü5Jø)1õ,2î02ã4/Ø7-Ï9*Í<+Ì=,È7&Ï9*Ø</Þ>2á?4â>4â?6â?6ÑN<ÍH7ÇB1Â=,¿:'Á:'Å9(È9)Ç3%Ó9/á@8ëD>Þ0/á-.ì38í38×4-×6.Ù80Ø:1Õ;1Ó;0Î:.Ê:/ÖL?ÌF:¿?2´9*¯7)«7*©8*¨8*ª<-¬>/­?0­=/«<+«<+­<,¯>0ÀKAÚc[Ýc^èkiðosëhnõrzüvïer÷oyør{öjsÿlvÿvÿu}öioõfl÷RbÿA[ÿ6YôFaÝt{²›‰€¤~z›f{—f€–h‘u­±ŽÌË­áàÄéëÓî÷ÜåóÙÙíÑÎçÉÅÞÀ¼Õ·´Ë®®Å¨•Ã’”‘˜Ä“¡È™§Ë¬Ë¡µÎ§ÁÒ®ÎÙ»ÙÝÄåãÎìåÕïáÖëÚÒçÒÍäÏÊÞÐÇÚÌÃÕǾ[N>ZM=ZM=ZM=ZM=ZM=YL<YL<ZM=YL<YL<XK;XK;YL<ZM=ZM=TJ@TJ>XL>YN<ZM:ZN8ZN8ZM:[O?WMDWMKZSZ^Xfb]sjfspvw–xxœ|{§~µ„¿‡Çˆ‚ʉƒÉ‚}¿~zµzu­vq§vo¥sl¢og ldŸ‹PH•JE²FF×EOò@Lÿ7Dÿ3@ÿ8>ø<=íA=äE?àGBãDHèAKï=Mô:OÒBAÑGDÅA<ÂH=¯;.°</ÐVKÃ>5É83È.,Ç)&É.*Í:3ÌC9ÂD6¸@0Ã:(Ã<)Ã<)Á:'À;(Á=(Â;'Ã8%Ä6"Ê7%Ô8)Ù7*Ý5(á3(å3)è3*û03ÿ58ÿ7<ÿ38ÿ,2ÿ&-ÿ'-ÿ)1ÿ,3ù'0ô%/ú'6ÿ+=ÿ(Aÿ:ú2ö".ô&0î+1æ0/Ú1,Ò4+Ï5)Ð6*Ô6+Ü90æ>5ì>7ë:4é61è50é61ØL?×K<ÒF7Ê>/Ä6(Â3%È6)Í9-Í5*Ô6-æC<à74à21Ò ì89ê35Ó2(Ô3)Ò4)Ñ5)Ï5+Ì5*È5+Å7+ãYNØRFÊH;¾@4¶</´;0³=1³=1®:-°</±=0±=.­<,«:*«:*¬;-±<2ÐYQÜb]ìppôvyîltõrzör}ÿy…ÿ‰ýz‚òiqøeoÿp|ÿt}ýntó`j÷Naÿ@^ÿ3WôA^Ûnt¹ž‹Ž®‡~¡i}›g—hœq¡©‚µ¹–ÉÌ­ÕܽÌÙ»ÁÔ´²Ì©¥ÃŸž¼˜˜¶–²Œ”®‰…¶~†µ~ºƒ•À‹›Ã¡Ã‘¨Å—²ÉŸ¾ÎªÉÒµÚÚÂæßÍêÞÒéÖÐáÌÉÝÅÃÓºνµÈ·¯ZM=ZM=ZM=ZM=ZM=ZM=ZM=ZM=XK;XK;XK;YL<YL<ZM=ZM=ZM=YMAYM?ZM=[N=[N;\O<\P:\O<ZM=YMAWLHXNOXQX]Ub`Yka\pifƒokŽsp›vq§{u³ƒ}ʂˊƒÉˆŠ~¼‡z²ƒr¨†r§Œu­…l¥z^˜™G9¡C7´A:ÍC@á?=ì89ø:<ÿBCú<<ó=<ì>=ê@AéBIêCMëANê>NÌA<Å@9¾?6µ?3®=/±=0¿E8ÒMDÇ61Ô;6Ï1.Í2.ÖC<Ç?3´6'·?.½6#Á:'Ã<)Â;'À9%Á:&Ã:'Ç:&Ë:'Ð9(Ô7(Ö3$Ú."à/%ì7.ô=5ø72ù30ú.-û)(ý%&ÿ#%ÿ"'ÿ"'ÿ$*ù )ú!,ÿ%7ÿ'<ÿ;ÿ4ÿ3ý)7ð".ç"+ä*-Ý--Ó+(Ò-)Ü41â62é54ï64ó55ó12ñ-.ï+,í++Õ<4Ò91Ñ:1ëTK»"Ä+#ßF>È.&Ì/(Þ<7èE@â:7Ø/,Û.*ã41é:7Ý?3×;.Ï5)Ë3&Ì5*Î:.Ë;0Æ8.ìbWàZOÈD8¹6,º:/·9-¯3)²6,¯1%°2&®2&®4'¯7'²:,²<.³=/°:.ºC;Ö\Wìppñsvøv~ûyƒõq|ÿ{„ûx€øu}üs{ÿr~ÿq}ÿlxûisøbmôI\ÿ=\ÿ8[ñ:VÖek²–‡¦}~¡i|šd}•c‡—j”ŸuŸ¥ ¨ƒœ¨„’£Š£|€Ÿvx›qw›o|r t„£w¯uƒ³y‰¹½„“¾†—¾‡œ¾‹¢½§¼“¯½š¾Â§Ï̹ßÓÇãÒËÜÇÄÖ¾¾Ê»´Á²«¹ª£ZM<ZM<ZM<ZM<ZM<ZM<ZM<ZM<XK:XK:XK:YL;YL;ZM<ZM<ZM<ZL?ZL?ZM=]M=]N;^O<^O<\O<]P?[OA[NFYNJZPQ\SX_U^_Wbb\xibƒng‘qjžvp®€y½‡€ÆŠ€Å€Ã~ºt­Œn¢—q¤¡uªši ŒY‘©;.¨7)°6)À>1ÐB6Ü?6è?8ôA=ö=;ø:<÷:@ô<Dï?IèAIâ@KÜ?HÃ>7½=4¶<1°</ª:,¬;+¼B5ÐJAÚG@ÜA=Õ63Ò41Õ@9ÍC8¹:+¯6%¿8%Â;(Ä=*Ä=*Ä;(Ä;(Ç:(È:&Ï9(Ñ5&Ô2%Ú2%ã5*ê8.ï80ñ91ä2&æ0%ê.#ñ,$ö+%û+'ÿ,+ÿ-,þ)-ú%+û#.ÿ&5ÿ$9ÿ5ÿ1ÿ 0ð .ù-9ö2<å*1Û(,Ü.0Þ02Ý*.ò9>õ6;ú3:û06ú-2û.3ý14þ36×4/Ü:5Ù72æDAæDAÎ/+Ñ2.Á"Ö41á?<èE@à=8Ø3-Ù2,Ý60à91Ò<-Ï9*É5'È4&Ê8+Ë;0Ê<2Æ9/ícYáXNÉ@8¼3+À:1Á;2½7.À:1Á4+¾4*½4*»5*¸6(´6(²7(°6)´;0»B9ÓYTèllïqtöw~þ|†øv€ÿ|„ûyøv~þuÿsÿo}ÿiwùeqùanöI]ÿ<\ÿ9\ô=YÕdh«y€œsu˜`t’\w]cŠ•k—p‹•p…”mp†_lˆ_fŠ\g^j_q•ey›i}l€­r„²tЏz»}½‘½‚–½„›»‰›µ†¡³­¶—¾½¨ÏÆ·ØÇ¿ÖÁ¾ÒººÅ·¶º¬«²¤£\L<\L<\L<\L<\L<\L<\L<\L<ZJ:ZJ:ZJ:[K;[K;\L<\L<\L<\L?\L=\L=]M=]N;^O<^O<^O<_RA^QA\PD[NFZOK[PN]QS]ST_RlcXvh]…jb“sk¦}w·†}Àˆ}¿—…Ù€¹›v©ŸoŸ¯t¢»v¥µi˜¤U…Ä92¾5-¹5)½>/ÇE5ÐG7ÚC8ä?9ó=<ú9>ü9Aú:Eò>GæAH×@EÏ@B¿<4¸90±8-«:*¨9(«:*»?3ÏF<ÙD>Ø96Ú65Ü:7ÜC=ÝOEÍI<²4%À9&Á:'Ã<)Æ=+Ç>,È=*É:)Ì9)Ï8'Ï2#Ó/#ß4*î=3ô?6ñ91í2+Ú7&Ý6&à3#å/"é-"î+%ñ,&ò+(ó++ð(+ò'-ú(5þ%8ÿ5þ2ÿ3ð(5ô.;ô4?ò8Cï;Dð<Eé5>å+6ñ1<ô/9ù-8ù+5ù,3ø-1ö.1ö01Ù1.ä<9Û64à;9ÿljæBAÒ.-Ð.,Û97á?<àA=Û<6Õ7.Ô6+Ô6+Ó5*Å8&Ã6%Ã6%Ä8)Ç;.Æ<1Æ<2Å;1ëaWáTMÉ<3¿0(Ë;3Ï?6Î;3Ñ>6Ú=8×<7Ô=4Ï<2É;/Â:.»7*¶6)·;/»@8ÏTMãgeíorøz~ÿˆý{…ý{ƒùzúx€ÿwÿsÿl}ÿftøbnø]kõG^ÿ:Zÿ9\÷AZÐ_c›gkŠ^e†Oh…Ol„Rt…X{ˆ\}ˆ^x„\q‚X`yO_P`†UeYm•`uœg{ j€£m­p…±tˆ¶v‹¹y‹¹yŒºz‘º~”º‘±•¬€›©†©­’ºµ¢Ç¹°Ë¸²Ì´²¶­®ª¡¢ —˜[K;[K;[K;[K;[K;[K;[K;[K;ZJ:ZJ:ZJ:[K;[K;\L<\L<\L<]K=]K=]L<^M=^M;^O<^O<^O<`P@^Q@]P@\NC\NE[NF\OI]PJ`NdcSmfX{g^‰ohœzu¯„|¸†{µ™…º¥…´¯€ªºy¡ÈxŸÓušÍc‹¾OyêAFà@@ÕA=ÌF;ÈJ;ÉJ;ÐF9ÜB:î@?ø;Aþ:Dü<Gñ@HâAFÑAAÅ?<¾?6¶<1¯9+ª;*©:)­9*º?0ÎD:Õ<7Ö21â:9æA?áD?çTLÞVH½;+Á9)¾6&¿8%Ä;)É=,Ê=,Ë9*Î8)Ï3&Ò2&Ù3'å9/ñ>7õ>8ð50è-&×:)Ú8)Ý5(à2'æ/'é.'é,(é,*ç+*å(,è)1ï+7õ';ö";ú=ÿ"A÷8Gä(6ç/;ÿP\ÿ`lÿP\ò<Ió9Gé)8ï)8ô,9õ0:ô17ì01â*(Ü&#Õ2-Ú64Õ1/æBAÿrp÷TUÝ==æFFÛ=:Ú<9Õ:5Ò80Ñ7-Ï7*Ì4&É1#º7#¹6"»8&¿;,À</¿9.À:/Å<4åXQÜMGÊ70Ç/*×<7ÞA:Ú;5Þ=5ë<9ê=9æ?9â?8Ù?5Ð<0Ç;.¿9-»9,»<3ËOGàc_ìnoú|ÿƒŠý~…úx€øy€ùzÿx‚ÿt‚ÿl}ÿdtö_nóXhõE\ÿ6Vÿ7ZùC\ÇYZ‡mRWxIXv@\yCdzIl}PtVw‚XrXoWl‡Zl^o•buh{¤l¨o„ªq‡ªr„­q‡±rˆ´u‰·v‰·v‰·vЏw¹z‘´|«z’¤|¤…­«–¾²¦È·¯Ë¶±¯¬³¡ž¥•’™[K;[K;[K;[K;[K;[K;[K;[K;ZJ:ZJ:ZJ:[K;[K;\L<\L<\L<^K=^K<]L<^M=^M;_N<^O<^O<^O<^N>^N>^N?^N?_OB`PC`OEbM\cPdcUodZle‘vr¤~w«‚v¦“~©¬†«Â‰©ÐžÛw“âk‡ÝXuÓFfÿ=MüDPðJNÞJHÌG>ÇG<ÍG<ÙD>èBBó>Cù>Gø@HðCIÞDDÍB=À?9½A5µ=/®:+ª;*©:)­9*º<.Ì?6áFBä<;ïABíAAÞ:8ãJBæXLÔL>È@0À8(»3#Á8(È<-É:*Ë7)Ð8+Î0%×3)à8/é;4ï:3î50ë0+è+'Û4,ß4-ä2.ë31ð43õ45ö58õ6;é/4ç.6ê0=î2Cò.Fõ*Gý,Lÿ1Tð<Hå3?ð@Mÿ_lÿlzÿWfõCSõ>Pî3Dî2Aî3>ê5<æ89Ü73Ð3*Ç/$Ì2*È-(Ñ61óXT÷\ZóXVÜ@AâHHÜB@Õ<7Î70Í6-Ï8-Í9+Ê7'Æ3!³:%²9$´;(¸=-¹;-¶6)»8.Ä>5ÛNGÙEAÎ50Ð1-á>9è?:ã81ä71ð/0ï11ì42é73â92Ø:/Ð9.È:.¾6*º7-ÈIBÜ_Yënlû}€ÿ…‰ýƒõv}õx~ùzÿx‚ÿsÿj{ÿdtö_nðUeôF]ÿ6Vÿ7ZúF_ÀTRvaBJo<Us?[vCdzIn~QtVy„Zyˆ_wŒay”gv›hy¡l|§o«p„«r…«p†ªm‡­rˆ°r‰³tˆµt‡¶r…·r‡¹tЏw·{Œ­x¤x™¤‚«­•À¹§ÎÀµÖüººÆªª¶œœ¨ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8[L9[L9\M:\M:\M:^K<^K<^K<_L=^M;_N<^O<^O<]N;]N;^O<_P=_P=aP@bQAbQAeKTdN[aPc`Usga…rp˜xvž|r—Žv–®ƒžÌ‹ŸÝ‚“çr‚ïbsìObå>Rÿ-Hÿ:QþCTéDKÒ@AËA>ÎDAÖEBãEFêAFï@EïBFçDEÚEAÉC:¿?4º@3±;-©8(¨9(©:)®9(º:-Ë;3èIEë??î;>æ68Û2/ÞA:îZPõg[ÙQCÉA3¾4'À6)Ç9+Ê8+Í6+Ò8,Ñ0&Ü5-æ;4ë:4ê40è/,ê-+í-,ó4;õ3;ø3<þ2=ÿ1>þ0=ý0?ù0@ô1Añ2Dò5Kó5Oó0Põ-Qþ1Xÿ:dá7B÷O\ÿanÿ`nþXfùQbòEXé8Jó@Sê:GÝ2;Ò/2È3-Á9-º=+µ>(Æ9/¿2(ÙJBúkcÝLGáPMÍ<9Ï;9àLJÔ@<Ê7/Ê7-Î</Í<+Ë:'Ê9&®>(«;%­=)²?-±9)®4'º:1ÊC=ÕHAØC?Ô72×2.ç;7ì:6è2.ë2-÷)+÷+,ô.-ð3/é61â:1Ú<1Ò>2Â6)º4)ÅB:×XRçjhú|}ÿ†‰þ€„õv}öyú{‚ÿx„ÿqÿh{ýbtõ^oîSe÷I`ÿ9Xÿ9[ûI_ºQNmZ:Em8ZvCa|InSv†Y|‡]Šbg‚—lœl{ m|¤o}¨p~ªo‚ªnƒ©l…©lˆ«qˆ®qˆ°r†³r„³oƒµn„¸p‡¹t‹µv‰¬tŒ¦wš¨„°´™ÈïØÌ¾àÏŽÃÓ«±Á›¡±ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8[L9[L9\M:\M:\M:`J<`J<^K<_L=^M;_N<_N<^O<^O<_P;_P;aP<aP<aP<aP<bP<fLOdMUaO]_Vkgb€sr’yx˜}t‘ŽvŽ­’Ά’á}…ñowýbjýOXö>Hÿ$Hÿ0Qÿ;Uñ<MÞ<GÖAEÓEDÔBCÜCEàBCäADäABÞDBÔC>ÇA6¾>1·?1¯9+¨7'¨:)¬=*²=,À>1Ñ>7ß=:ç79æ/3ã/0á32Û94åNEülaïj[ÙQCÆ</Æ:-È:.É7*Í6+Õ8/Õ4,Þ7/æ93é62é1/ê.,î1/ó32ÿ0Eÿ/Eÿ-Dÿ*Bÿ%@ÿ"=þ:ø:÷'Aó+Gô/Mó0Rò+Rô)Vÿ1bÿ=nêHSÿ`mÿiu÷VeíKZñL]êCUÚ1DéARÝ7CÉ,3¹)(®0$¨9&£A&ŸD'¼=.º;,ÜZMá\SÍG>ÍD>Á61É;7ãUQÕF@É91È8-É:,È9(È:&É;%ªB)¦<&¦<&¬=*©8(¬3(¼=4ÒMFÕGCÝEBÛ96Ü30é73í41ì/+ó2-ÿ)/ÿ*/ý--ö0/ï4/è7/ß;1Ø>2É:,¼4(À;2ÏNHßb^÷yzÿˆŠÿ„†ùzú}ƒü}„ÿx„ÿn~ÿdwù^pò[léN`öHaÿ8Wÿ7YøH]²JGcS1Al6ZtDf~NuˆZŽc…f‡’jˆ—n‰žs‡¤t‚§t§r}¨p}©n©mƒ©l…©k†§n‡ªp†¬o…¯o°l³k‚¶n…·p‡´s‡­rŒ¨wœ¬…²¹šÈƱ×οÞÐÅ·¿Ò¤¬¿’š­ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8[L9[L9\M:\M:\M:`J<`J<^K<_L=^M=_N<_N<^O<`Q>aR=bQ=bQ=bR;bP:aO9`N8jNMgNRbQ[cWkjfuv’}}™y‘’{¯ŒËƒ‡ã{|ùqsÿgjÿTXÿAGÿ#Mÿ.Tÿ7Wù9Pé>NàEM×EHÑ?B×BDÚACÜ@AÛA?ØC?ÏB9Å?4¿=0·?1¯9+©8(«=,°A.·B1ÇC7×D=Ú64å57ã,0ç02è88Ó0+Ï5-éUKÿznæ^RÎD7É=0Ê<0É6,Í6+Ö90Ú70ß82ä71ç40é1/í10ò53ø87ÿ=ÿ>ÿ>ÿ>ÿ=ÿ=ÿ<ü=ò:ï@ð$Ið&Nï$Qó%Uÿ0eÿ=sÿgrþalôXeîR_ïQ`îM]â?RÖ1Bß:JÑ4?¿-0±-(¦5'ž>&–C%E"¯7&²9(ÒWHº<0ÁA8º7/º3/ÍC@ãXSÕHAÈ91Ä6*Å6&Ä5$Ä6"Ç9#¦B*¢<%£:%§<*¦7&©3'½A7ØSLØIEáGEÞ:8ß2.ê41î1-ï.)ù4.ÿ'-ÿ',ÿ)+ö*)í-(ä1*Ü5,Õ9-Ð>1½3(¼7.ÉHBÙ\Xôwuÿ‰‰ÿ‡‰ý~…ý€†þ†ÿx„ÿl|ý`sõZlïXiãHZóE^û4Sÿ3RóCX«E@\L*?j4Uo?d|LwŠ\†“h‹–l˜pŽtŽ£xŽ«{†«x©t|¨mz¦i}¥g¥h‚¦h…¤k…¦m„ªm‚¬l®j}±i€´lƒ·oˆ·sˆ°tެxœ®„²¹šÄ«ÐǶÖÈ»²½Óž©¿‹–¬]K7]K7]K7]K7]K7]K7]K7]K7^L8^L8^L8^L8^L8^L8^L8^L8\J>]K?]M@\L=ZM=ZO=\Q?^SA_T@_R?^Q@aQAcRBdQCdNAcM@pKEjKIfOUgZknl„v|ž}†¯ƒŠ´Š…®Ÿ‰­¸Š¦Ìƒ”Þ{~îumøl]ûfRðN[æDQä>LéANïCQí>Ké:Gê<Få:Bá;?Û;;Ö<:Ï?7È>4Á;/¼8+ :$¬C0¬=,®6(Â?5ÑD=Ð;5Ó61Û83Ü71Ý6-Ý7)Ü9(Ý='Ù;"Õ7à74õPLõXOÛD9Ç8(Ì?.ÒC3Ñ;-Ò4+ðGDâ.1ï4;ö4?ï+9ÿ@Qí(9þ&+ÿ*-ÿ*-÷"û#$ÿ()þ((òð"ú+1ì )î&1ò.<ç$5ÿYnë+@ÿ`jÿ^iÿYcûT[öPTìHIÛ@;Ê:1ÅA2½F2®D.Ÿ;$”5–7#˜;)œ=+§81«83ÁEC¿;9¾23Æ45È44×CAÜKFÚKEÑD;È:0Ä4+È4*Ì3+Ì2*·?1³9,®.#­'¶,"Æ7/ÓC:ÚG=äPFßE;Ù80Ü1*ç/-ô01ý/3ÿ.4ò14ó12ô01ó/0ó0.î1+é4+à8-Ö=/¾2#¾?0·>3Õ`Wçtqÿù…†ôŠŒþ…Œÿwˆÿe}ÿ[wÿXuÿSoûJgûDcö7Y÷9]ç>[Ú]k„C=PI/F`;Xw<e‡Ku—[zcz e|¤h¨l€©o¨l~§k~¦j}¥g}£f£e£e€¢e}¥p~§o«n¬k~­g¯e±e„²g‡µjеpвs°z–¶‡£¿™«Ä¤¬Å§¦±µ˜œz…‰]K7]K7]K7]K7]K7]K7]K7]K7^L8^L8^L8^L8^L8^L8^L8^L8\J<^L>^N?^N?[N>ZO=\Q?^SA_TB]QA]P@_OB`NBbPFcOFcOFkLGjMOgS\h_rnoŽw~ª~ˆ»…ŠÁ›–Ì¢Œ»«£»wŽÕx‚í|x÷uhöjYüZgóN\ìFRòHUöJVõERï?Jë;Eä9Aà:>Ú::Õ=:Î?7Ç>4À</º;,¥>+ª?-¨9(²:,ÁA6Å<4Ç7/Õ<7Ó40×4-Ø4*Ø4(Ú7&Û:&Û;%Ù;"Þ52æA;ëMDàI>Ð>/Ç8(Ê8)Ó;.Ý<2öJFæ/1ò5<ø6Aò.<ÿ?Pì'8ö$'÷%(û),ý+,ü*+ù'(ø((ø*,ð$'í%(ê%,þ:DÚ'ð4CüATÞ#6ÿluÿblþZcüW]õOSæBCÙ;8Ñ>6¾8,¾E4¹H6¨?,–1)Ž()ž-'°:6ÑTRÎHGÃ54Æ45Ò<=ëWUØGBÖGAÏB9Ç9/Ä4+Ê6,Ð7/Ò5.Â?5À:1À5.Â3+É4.Ð83Ø?9ÞE=ãJBÞA8Ù6/Ü1*æ0-ó11ü03ÿ.3ò14ó12ô01õ/0ó0.î1+é4+à8-×>0¿3$¼=.¶=2Ó^Uévsÿù…†õ‡Šþ‚Šÿu…ÿe|ÿ[vÿWtÿQoþIhúAaö8Zö=_æF`ÅQ\{?7NH.Ga>Yx=e‡Ks•Yx›awbz¢f|¥i}¦j|¥i|¥i|¤h{£e{¡d}¡c}¡c¡d{¤l}¦n}©l}ªi}ªe}­c¯c‚±cƒ±f‡²k‡¯pˆ«u‹«|¬„©‰‹¤†z…‡doqR]_]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8^K<_N>aP@`P@]P?[O?[O?[RC[QE[QE\OF\OG_PKcQOfTRhTUiTQiVXi]kmi„sv¡zƒ¼ŠÍ‰Ö—‘ÙŸ‹Êª‚¶º}ŸÒ‘烅ð~tïveÿ`k÷S\íGQðFQöHR÷EQô@Kî=Gå6=à7:Ù99Ô<7Í@7ÅA4½?0¸=-©@-¨=+ª;*¸B4ÅI?À;2»0)Ì92Í6/Ò5.Õ7,Ù7*Ù7(Ú7$Ü:%Þ<'ß3/Û4.âA9éOCÜH:Ç6%Æ3#Ù@2á>5õHDé13ó4;ú6@ø4@ÿES÷3Añ),í"&î#&û03÷--ï''í%%÷12ì(*ø7:è+1â)1ë3?ÿR^ï=KÿYiúafñV\îOTðMRêEIÞ:;Õ74Ô?9À6,¿?2»C5²>1ª8-¥3)Ÿ,%œ' ˜% §0*ÆFCÂ::¼,,È44×ABô^]Ò>:ÒC;ÐA9Ë=3Ì9/Ô=4Ú@8Ý@9ÙA>×=;Ü>=ãA?ã?>à;9ã?=ëIDàA;Û=4Ø5,Û2+å2-ð31÷12ú/2ó04ô02ö01õ/0õ/.ð0+é4+à8-Ø?1À4%¸9*´;0Ð[Rízwÿ’’û‡ˆøƒ‹ü~‰ÿr‚ÿcyÿZtÿTqÿMmÿFgü=_ø:^ôBbåQg§?Fn<1OK2KcA[z?h‡Lr“Zu˜^tš_wŸc{£gz£gy¢fy¢fy¡cx byŸb{Ÿa| b}Ÿby¢j{¤j{§h{¨e{©azª^|­^®`…³hеnвs‰¬t†¦w‚žvy“pn‡gVb`COM4@>^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^L6`N:aP<`Q>]P?ZN>YPAXPEXOH[RM_UTcWYeX_iYcl\fm]hlbclemolrtšx¶~†Ï„ŒßŠŽç‹‡ÞŠÙ¬‰É³­½y’Í{ßyê†vÿnrÿbgùU\öLUöFPöBMó>Gð;Dæ5;á7:Û97Ò=7ËA6ÄB4»B1·?.©;,­=/¯>0»G:ËRGÇH?¹6.º1)È91Í81Ó;0Ú<0Û;-Ù6%Ü6&à9'á40Û2-à=4ëOCãK=Ñ;,Ð8*àB6Þ7.ð>:é/0ò16÷4<ü8BÿNZÿKWý>Cò38â$&í/1ê,,ð22ç+*é0.ò::Ñæ37Ü-2ç9BïENÿYcôLYÔ?AÚADßCFá>CÞ9=Ü89Ø88Ó:5É83Â91½:2ÀA:ÍNHÖVSÐNNÆAB¯82µ:5ÏKGØNLãQRïYZêRQñYXÉ51Î>6ÑC9Ð@7Ó?5ÚA9àC<àA;í<Bê7=í8?õ>Cñ:?é58í=?øLJà93Ú70Ø4+Ü3,ã5.ì30ò21ô01ô04ô02ö01ö.0õ/.ñ0+ê3+à8-Ù@2Â6'µ6'²9.ÉWMî}yÿ“’û‰‰þ€‹ý{‡üoücwÿXqÿNmÿFhÿ?cþ8\ù=`íIdÙYhˆ25d<0SQ8TgG`}Ej‰Ps’Yt•\u˜^wby¡ey¢fw dv awŸavž`xŸ`zž`{Ÿa| by¢hz£g|¦fz§bz¨_z¨]|«]~­_†²eеmŒ³rŠ­s†¦u€œstŽii_RaZDSL8G@^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;_K2_M5aO9_P;\O>ZN@XPEXQKYQO^X\g`hnfsshysg{sg}tfnnzor…rw•v|¬y‚Ã~†×ƒŠåˆ‹ì’뛌ߞƒÆžt¢¡kƒ®mq¾vjÈ{iþllÿklÿfiÿ]`üQWöEMð;Bí5=è59ã68Ý98Õ>7ÎA7ÅC5¼C0¶A-¬8+´@3¯;.°;1ÇRHÓ]SÈNCº;2¾90Á7,Ì9/Ö>1Ý=1Ú6*Ü4'á7(á2-ã60ä=5åE9âF9ÜC3ÝA2á?2Û0&ì62ì0/ð-1ò-4ú7?ÿOYÿZdÿ[_ÿOSá.1ã03ß--÷EEè66Ü,,Û-.ë>@Û25Ù37ÿchÞ=CÊ*2Ê-4¾()Ô;=àAEÚ7:Ù37á8;Ü89Î..Ì43Í<9ÓHEÝSSì`c÷hnõdkî[e¿B<ÆE@å^[÷igÿopÿjjåKK×=;É4.Ñ>7ÕE<ÖC;Ó?5Ö<4Ø93Ø7/ö0=ò,9ó+6õ-8ò*5î+3õ8<þJKà3/Û4.Ø4+Ü4+â5.ê40ï4/ð3/ö/4ö/2÷/1ø-0ö..ñ0+ê3+â7-Û?2Å9*²3$±8-ÃNEî}yÿ’‘üŠŠÿ}‹ÿw…ùl|öatùUmÿHgÿ>bÿ8_þ4\õ@aâMcÂWap/+\A0XX>]lMbIl‰St’\u–_v™_xžcy¡ex buŸ`uŸ`u_vž_wž_zž`{Ÿa| by£d{¥f|¦dz¨`y§^y¨Z{ªZ}¬\€¬_…¯g‡®m‡ªp…¥sƒ t{•nrŠffvi[k^RbU_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<`L1aM2`N6^O:[N>YOE[RMZTT_ZahbprmzuŒ{t“yr“zp“yo”ov’pyšt}¨w€·zƒÈ~…Õƒ‰á‹‹å”ã—ŠÒ™„¼¡ƒ§ª„“«~yŸl[ŽX>ÈH?ÕPIäVRìVUòRRôJMî=Cè38ì7<ç9;à;9Ø=8ÑA8ÈC4¿B0¹@-³9.ºA6«5+£.$¼J?Øh\×eZÊVI·=2¸6)¾4)Î:0Ù;0Ü5,ß3)ä6+á/+å61ã;2Ü:/Ü?0ãF7ãC3ß9+ß1&ê3-ð31ï-.î*.ô17ÿEJÿS[ÿ_dÿ\aâ9<â9<Õ+.ôJKâ89×//Û55Ì()Ë(+÷YZÛ?BÔ9=Ð7:· %Ã))Û=>åBEÝ49Ù,2Þ17Ú/5Í(,Ò37äKNöaeûhnùcl÷_kû_mý_nÒNIÔOJè]ZêVTçMMãGHÑ32Î31ÙA<àKDãPHßKAØA8×:3×50Õ2+ÿ,;þ+:ü(7ø%4÷'4û/:ÿ=CÿILà1.Ü3,Û4,Ü5,á4-ç4-ì5/ï4/ö/4÷/2ù.1ù-0ø..ò/+ë3+â7-Ù=0É;-³1#°7,¹D;ìyvÿþŠ‹ÿyŠþqõhxó`söTlüCcÿ7^ÿ3_ÿ3\óDcÒM^ JMb6+TE0W[@^kMc~Kk‡Tt‘[w•_x™`{ždz cvž`s›]s›\s›\tœ]v^wž_{Ÿa| by¡bz¤b|§b{¦_x¦[x§Yz©Y{ªZ~ª]ƒ­e…¬i†ªm‰§s‰¥u„s|•mv‡unmfwe_P=_P=_P=_P=_P=_P=_P=_P=^O<^O<^O<^O<^O<^O<^O<^O<cP2cO4aO7^O<[OA[RK^UV_Zakgvso†}z™‚~£|¥}w¥{u¥{t§pz«s}°w‚¸{ƒÁ~†Ç„‰Í‹ŽÓ“’Ô˜“Í ”«›¸¼¦³Ç®ªÅ¦”ªˆlmJ©?/¯A2¶@4ÄA9ØGBëMLñHKí?Aî;?ê:=å;;ß=:ØA:ÏA5Ç?1Á=.»;2¾?8¯4,¦1'ºJ>ÏcWÔh[ÔfYÁPB¹?2¹5)Ç7,Ô:0Ù5,ß2+ç6.ã0,ã4/â7/Ü8.à>1åC4â?0Þ4'æ4*é1)ò2/ð..ï-.ò14ô68ü?CðOTúY^éFKõRW×47ëFJÝ8<åBEÚ7:Î.0Ð15ãIKÑ8;Î8:¸#%Ñ<>Ü89ä;>ê=Aç6<â-4Þ)2â19ç<DñLSû^eÿksÿisú`l÷YhùXhûXkðgaèZVèWTØ@?Ï10Ô44Ó41áC@ãJDéRKèSLáJAØ?7Ø93Û81Ü71ý)8ÿ/>ÿ/>ý)7ÿ-:ÿ9CÿAHûABã1/ß4-Ü5,Ý5,á4-æ3,ì5/ð50÷.4ù.2ú.1ù-0ø..ò/+ë3+ã7-Ø:.Ì>0´2$±7,±<3çtqþŠŠþŠ‹ÿr†ýj}ñbtð]pôRjûBbÿ6`ÿ5aÿ8_ïKfÁN[z;6Y?.LH/TZ@]cIbzJj„TrŽ[v”^yšc{ždxžas›\p˜Yp˜Yq™Zq™Zt›\uœ]y_zž`x¡_y¢^z¥^y¤\x¤Wv¥Uw¦V{§X~ª]‚¬d„«h†¨l‡¥o†¢r€šmx‘gr„lk}ecu]_O?_O?_O?_O?_O?_O?_O?_O?^N>^N>^N>^N>^N>^N>^N>^N>eQ6cR8aP<]P@ZPG\TR_Zab^otrŠyx˜€¨ƒ°~~²yx±wv°xw³t}Âw€Ã}…Æ‚ˆÆ…ŠÂÀ—–¾ ¼¬§»¶¬´¾³¯È¸©Ð¿¥Õ¡ϼ”Dz‡·kS®\F¤G5©=0ÂH=áVQðVTòNOì?Aë=?è<<ä<;ß=:×=5Ï;1Ë8.¿82Á<5¹:3·>5ÀPDÅYMÅ]PÎgXÐdWÁM@º:-Å8.Ò91Ø3-ß2,è50æ40á2-à5-ã<3çC7æC4â:-à3%ê5*è-&ð0+ð.,ò21ò44ç.,è00áEIõY]öW\ÿpuåDJéHNÞ=Cü[aÿouÝ>Cÿ~‚ÿmqêQTÔ>@Å02Ñ<>øEIî9>ð7=ø=Fô6@è-8ö>Jÿ\hÿmwÿitÿdl÷]gú^kÿapÿ]nüWhî_YãOKâJGÕ74Ò0.Ù54Ó/.Ø95ßD?ãJDáJAÙ@8Ó6/Ö5-Ü71â94ð$0ý/<ÿ1=ø*6û/:ÿ>Eÿ>Cì44â3.Þ5.Ý6-Ý5,á3*è3,ï4/ò5/÷.4ù.2ú.1ù-0ø..ô.+í2+ä6-×9-Ï@2µ1$²6,°7/èpoþˆˆÿŠŒÿkƒücxð]pïZnôPiýAdÿ7aÿ8dý=bæPi°QW^2'RG3DH/PV<X\C_vHi€Rq‹[v’_z˜b|dxœ_r™Zn—Un—Un—Uo˜Vr™Xt›\uœ]y_vŸ[x¡[y£[w£Xv¢Uv¢Sw£Ty¥Vz¤X~¦_¦c¡d~œf{—frŒ_k‚V`uVZoPRgH\L<^N>`P@`P@_O?_O?_O?aQAbRB_O?]M=]M=aQAcSCbRB`P@eS;aP<_O?^QH[QOZSZeapsq‰xxšz|¥~€±€¹}¼xy¹rs¶no²qwÏv{̓̋Ȗ—䤾²±¹½¸²ÌŲÓÍ­ÙЩÛУÛÑ ÝÑ¡ØÌšÒÆ”Õ¦Š·gŸ_FËzgØte¾G?ØQMøbaìILç>Aä79æ9;ã99Ü75Ù61Û94È95À50ÇB;¹=5¾I?ÄXK·PAËeVÎdVÊYKÃG;Ä:/Í6-Ù6/â5/å3/á/-ß2,â70ä=4à<0Û8)Ý5(å8*å/$ê/(î.)ð0-ï20ë40è51æ40Ó8<åJNõY]ëOS×7?×6>ùX`ÿ~†ÿ~†ÿowÿgoÿipÿfjõ\_ïY[ô^`ÿRYÿCKü8Bü7A÷1>ï+9î/>ñ=IÿS_ÿ`kÿgpÿepþboÿbpÿ`oÿ[lìTOßFA×85×31Ù10×/.Ú21Ü86áD=ÜB:Ø?7Ö<4×90Û81á83ä84ô5=ó4;õ3;÷4<ø5;ó49ë33ã1/Þ3,Ý6-Þ7.à5+ä3+é2,ñ1,õ2.ø/5ø03ú/2ú.1ù//õ/,î3,å7.à@4Ë9,½7+®/&·<5ÒXWÿ˜šù~ÿhÿe|ö]rîRhòHeÿAeÿ9bÿ5`üJlÕRd‰==K. >>&?I.IO5]]EWlAcxMqˆZx’by–`t•\r–Xq˜Wl•Sm–Rn—So˜Vr™Xt›\uœ]uœ]tœVtWv Xw¡Wv¢Uv¢Uu¡Tt S{¥[{£\zŸ\u—Zn‹Uc}MXrCSj>AW1?U/<R,[K;^N>`P@`P@`P@_O?`P@aQAbRB`P@_O?`P@bRBcSCbRB`P@fVF_QD\OF_TRcZ_f`nmkƒwv˜wy¢{}°}¸x|»qt·lo¶ln¸oq»suÙ|}Ù‰ˆÔ˜—Ш§Æ¹¶½ÉƵÓÏ©Ý×£âÜžçßžæÞäÜžâÙ ÙÒœÑʖѼ¸€¦~dÄ‹wÉ}m¶VJÓ`Y÷qnîZZêJLä>@é<>ì>@è:;ã56á34Õ=:Ë73Ê?8¹6.·>3¼L@³I;Å^OÛp`ÒaSÄH<½5)Ä0&Ö5-Ý4-Ü/)â43å95å<7à<3Ü8.Ù5)Ý5(ã5*í6.ï4-î1+ë0+ç0,ã2,á4.Þ5.Ò9;×>AäIMóW[ü\dü\dþ]eÿ`kôR]ïMXñQ[ÿ_gÿjqÿflô[`ëRU÷07ó+5ô+5ù-9ó&5è/ç'6í7DüP\ÿ[dÿclÿemÿepÿdoý[hõP^åFBÞ<9Û64ß63á53Þ20Û2/Û62à>9Û>7Ö<2×:1Ú91ß82å95è96é9;ê7:ë7:î79î79ì57å31Þ3,Û4,Û7-Þ7.á6,å2+ì1*ó0,ø1.÷05÷03ú/2ù.1ù//õ/,î3,ç6.ß=2Ò>2Â8-µ2*·82ØZ[ÿ“õw{ÿa{ÿ^v÷WqöOkøFfý=bÿ:cú=cëLhºJVw<8F5#7=#9C(DH/UP<Tf>`rJnƒXw_v“]t“Zp”Vn•Tk’Ok”Pl•Qm–Ro˜Vr™Zsš[sš[tœVuWuŸWuŸUtžTržQqPq›Qn˜Pl”NhŒLbFXu?Nh8F]/@W+@W-@W-AX.YL<[N>^QA^QA^QA^QA_RB`SCaTD`SC_RB`SCaTDaTD`SC^QAbUM^QK[QPcYakesqm„vu•y{¤y{®y~¶w}»ns·ei°bf°jn¸rvÀ}zᇃᖔߩ§Ù¼¸ÏÍÊÃÝØ¸çá­êå¡ïéŸðêžíæžéá¢âÛ¤×Ï ËĘ´°“¦œ˜„k§„p¥p`œRG»]UÞmi÷usð^_çHLæ@Dí@Dí=@ë7:ç36Ü>;Ô;6ÔA:Â70·7.µ?3­=/µG8Új\Þj[×\MÊB6Å2(Ñ4+Ú6-Ú1*Þ44éA>ìGCà=6Õ2)Õ1'Ú2'Þ0%è3*é1)ç.)æ/)ã2,â7/á=4âA7Ã-,Ê43ÜCEðVXú^bùYaóS]òP[èFQêHSðNYü\fÿmvÿmtôY_ÜAGó*2õ,4ý1<ÿ1>÷*9ï&6ö6EÿJX÷ISõOY÷W_ü_fÿdkÿai÷Q[éBJÞ95Þ63ã75é<8ë<9ç85â51Ý60Ý:3Ù;2Ö90×90Û81á83ç:6ì:8à;9â:9ã99ç98è88å84à40Ú3+Ú6,Ú8-Ü8,á6,å3)ì/)õ/,ú0.ô15õ13ø02ù.1÷//ó0,î3,ç6.Ý9/ÛD9Æ9/»4.´0,â`bÿƒˆônuÿ_zþWsúPmþLlýDfø8_ö9_ðGf×ReDJi=4K@,7@%8@(ED/LE2N^9YkEg|Qr‰[tZqUmRkMi‘Kh‘Ki’Lk”Pm–To–Up—Xq—ZuWuWtœUrœTpšRm—Mk•Kj”LdGaˆE\~AUt;Li3E_/AX*>U'B\/E_2Ic6WJ:ZM=\O?^QA]P@^QA_RBaTD`SC`SC`SCaTDaTD`SC_RB]P@YNR[PVbXcjcsqm†vu•xz£z|­w|´sy·mr¶bi±]c­ag±lr¾v|È‹‡æ”‘褡淴áÇÄ×ÕÒËáÞ¿èå²ëç¨ïê¦îé¥éã¥ãܨÛÒ§Ëß¾µ–Ÿ§˜š…‰v—‚q—se™cW³i`Ïrmû‹‰õutë[[çKNéCGî?Dî;?í8=ß:8Ý;8ßD?ÓC;Ã:0¹;/¯7)¦2#¾J;ÚbRék]ÛSGÉ9.Í3)Ö5+Ø4+Ù33ñMLý[XíKFÙ80Ö3*Û4+Þ2(à-&á,%á,%ß,'Ý0)Ú6-Ø<0×?2À0(Ä4,Î:6ÙCBßFHàEKäGPìLVñQ]öVbøXdû[gÿgpÿmuôY_Ø=Cñ.2ò-4ô-4ò*4í%2ì(6û<KÿS_í?IçBIèGMòQVþ[`ÿX]ôGMä5<á51ä73ê;8ó?>ô@?ð<;ç85à72Ü92Ø:1×90Ù80Ü71ã73ê86ì87Þ<9ß;9â:7ä;8æ:8ä84Þ5.Ø4+Ù7,Ú8-Ü8,á7*å3)ì/)ô/)ù/+ó25ô23õ12÷/1÷//ó0,î3,ç6.Ü8.ßG<É90¾3.´-*îfjÿy€ójrÿ`{ýTqþKkÿFjÿ=cö3[î<^äPhÄXe…DBbE7WP=DH1@D-JH3JB/IW4Sc?btLmƒUp‹XoŒRkŽNiŽKgIg‘Ih‘Kj“Mk”Pm–To–Wp–YtœVs›Uq™Sn—Qj”Lg‘IeŽHdG`‡D]AWy=Rq8Mi6Lf6Ne7Pe:Lf6Oi9Sm=UH8WJ:[N>\O?]P@]P@_RBaTD_RB`SCaTDaTD`SC_RB_RB_RBTLY`Xgnf{tp‰xt•xw¡xz«y{´sy·jqµ`g¯\b¬`f°kq»v|Æ~„Ε”äžžè­­é½¼æËÉßÕÓÔÝÜÊãàÁåâ¹çã¶æß³àØ³ÚÑ´ÐůÀ´¤¯¥™”œ‰ˆ†y‰}qwk›sk§ngºoi扄î~ósróedòVYòLNðCEî>Aå95â:7äB=ÞE?Ì<3Æ=3ÂB5­1%¬1"ÇI;ÛYKÖN@Ì=/Î8*Ò6*Ñ3'Ö34õUUÿkhú]XâE>Ü;3ß;2ã80â4-ä1,â1+Ý0)Ö/'Ì0$Æ/$Â0#Ã9,À4'Á3)Ë:5×CAÛEGÛBGÛ@HàDOìOZóVaòVaú^iÿgoóYaÝDIð88í55ï26ð18ò3;÷9CÿHSÿVaä6?Ý4;Ý7;êAFøKOüIMô;@ê05å61ë95ñ;8ó;9ó;9ð:7é73â70ß;2Ü;1Ù;2Û:2ß82ä73è64ì65á<8ã;8ä;8è:9è;7æ95á6/Û4,Ú8-Û9,Ý9-á7*å3)ë0'ò/)÷0+ð45ñ33ô22ô01ö0/ò1,î3,ç6.Þ7.ÞD:Ê7/¿1-¾21÷jpÿrzøhrû]vúPmÿCfÿ<dÿ7cù6^éDbØ[m©W[uF>_L;_ZFQP;KI4PI6MB0DR1M[8[kFf|Nm…SmŠPlŒMhHfŽGgHg‘Ii’Lj“Ol•Sn•Vo•Xt™Vq˜Un–Pj’LfIcŒFaŠF_ˆDZ@X|?St;Pn8Pj:Tk=XmB[pEUp=Vq>Wr?RE5UH8XK;ZM=[N>\O?^QA`SC`SCaTDaTDaTD`SC`SCbUEdWG]Ulje|yu}yœzy£wyªvx±sw¶lqµcj²[c¬]e®hp¹w}LjІՙܡ¦à¯²å»¿åÆÇãÍÏÞÔÓØ×ÖÑÙ×ËÙÕÉ×ÑÅÒÉÂÌÂÀŹ»´§®¥˜¡‡Œ†xzuwvqulg~mfŒoib[œa[¾sm×zuï{ü|yÿrpýccöSTîHHñB=ê>:ã<6àA;Ñ:1ÒD:ÝTJÂ>2¸6)¼:,Â=.È?/ÏA3×C5×?1Ñ8*Ð23èLMú_]ñXSßD?Ø;4Û81à70æ92ç92ç92â92Ú9/Ñ9.È9+Ä8)®)¸3"È@2ÓI>ÒE>Ë;:Ì7;Ð9@Ï8AâHTïUaðYbõ^g÷`iêU[ØCIè?:ë?;ñAAúGJÿMRÿQYÿT]ÿV^á4:Ú/5Ú03ç7:ô=Aù:?ø48÷/2é61ï95ð95í41í1/ê20ç40á4.ã<4à=4Þ=3Þ;2à93ä73è43ë33æ:8ç98ê88ì89ì87é75ã4/Ü4+Û7-Û9,Ý9-ß7*ã2(è0&ï0(õ0*î45ð43ó32ó11ô1/ò1,î3,è5.à90Ù<3Ì70Á0-ÑAAÿnuýku÷coïSkóIfÿ;cÿ1`ÿ3bÿ<dçMgÇ]i†IFeH:YN<\WCXQ>RJ7QF4MB0AL.GU4Sc>`rHgMj‡MjŠKh‹GeFfŽGfHgJi’Nk”Rl”Um“Vq–So”Qj‘NgŽKcŒH`‰E_ˆF_†G\‚E[~DWxAVr?Uo?YpB]rG_tKYtAYtAXs@NB2QE5UI9WK;XL<ZN>\P@^RBaUEbVFbVFaUE_SCaUEfZJj^Nkg‚up|x›{y¡wx¨vw­pt±jo±ah®^f¯_g°em¶pxÁ~…͉ؖܙ¡Ï ¨Öª±Û´¹ßº¿ß¾ÂßÂÄÝÅÆÛÆÃÖÅÁÒÁºÌ¼³Æ»¯Å´¨¾¦˜±—‰¢†‡‰qqstpqogevhe†nj`Y”e_š[T·g`×tnî{vÿ{wÿwsÿhfù[ZÿQKöGBè=6èC=Ø;4ÛG=ê\RÅ;0Ä<0½7+¾6(Ç>.ÑD3ÔC2ÔA1×A0Ò8:Ø>@ÜDCÛC@Ö=8Ó91Ø7/Þ7/å:3æ93å:3â;3Û>5ÕA5ÑE6ÌG8¬.¼;%ÌK8ÑL=Æ=3»0+¿10Ë8>ÕBJáKVëU`ðZeð]eìYaßLRÐ?DÑ4+Ö8/ß<7ê@@ñDFôEJñBIî?Fâ5;ß26ã36ï8<õ79ù14þ-2ÿ.4ë40ð95ò64ì0.è,*è/,è2.á2-ä=5à=4ß>4ß<3ã:5ç85ì65í55ì57ì57í57ï56ï56ì42å2.Þ1*Þ7.Ü:-Ý:+Þ8*á3(ç1&í1(ò1*í55î53ñ42ó11ó1/ò1,î3,è5.ã;2Ò4+Ò;4Æ20çUVÿpxùcnñ[gãKbóEfÿ7bÿ+]ÿ1bÿ@hÞKe­RYd8/ZI7SN:UN;[P>VI8M@0MA1=H*CN.K[6Xj@ayGf‚HhˆIgŠFeŠDc‹BcEeŽHgLh‘Oi‘Rj’Tn“Pl‘NhLd‹Jb‰H_ˆF_‡H`‡H_…H_‚H]~I]yH]wH`wKcxOdyP[vA[vAZu@MA1PD4SG7VJ:WK;YM=[O?]QAcWGdXHdXHbVFaUEcWGj^NpdTvq‘yu˜xvtsŸrr¤su®lp¯bg«Za©^f¯em¸lt½u}ƈДڕœâš¤ÈŸ©Í¦°Ô¬´Ù°µÛ±µÚ²´ÚµµÛ³±Ö²®Ñ®¦Ë«¡ÄªžÂ¦˜»™‹®‹{Ÿ|y€dbgidhbY\g[[xeauXRe]ˆOHŸVO»aY×jcóvpÿ}zÿwuÿljÿZUÿPJñD>ôMGàB9ßF>êWOº,"¼2'½5'Ç=0ÑE6Ë>-Á2!É8%ÙF4ÞDFÒ9;Ë32Ë62Ó;6×<7Û<6á<6æ;4å82à5.Ø4+Ï5+Ê8+Ä<.Â>/ÑU;ÅI/»='½;+Ã=2Ä;5Â65Â37ÜKRÞLVâOYåS]éWaæU\ÝLSÒCGÉ5)Ð8-Õ81Ú64Ý55ß58á4:ß28å8<å6;ì9=ö<?ú6:ú,0ÿ).ÿ.4ë4.ò94ô86í0.é,*ë/-ê40ã5.ä;4à=4à=4á=4ä;4è96í76ï56í36î15ï05ð24ñ35ì31æ0-Ý/(ß7.Ý9-Ý:+Þ8*à4&æ1&ì1(ñ2*ì65í53ð42ò21ó1/ñ1,î3,è5.å=4Í/&×>8É53øceÿpyô\hêR_ÞHaõGhÿ:eÿ*]ÿ/aÿ@hÓE]–AFQ-!UJ8PN9OH5\O>YH8L<-NB2:D)?J*GU2Rd:]sBcEf†GeˆDcˆBa‰@a‹CcŒFeŽJfMgPhRlPkOfLcŠIaˆG_‡H_‡H`†I\‚G]€H]~I`|Ka{Ld{Of{Rg|S]xC^yD_zEAC8CE:IF=OH@RGAWI@]M>`O=aQ:aS9`T>_VGaZTfaeljwro€wožzt¢~wªzu«ro¨hf¥a`¢^^¦ba­hg·qoÃ|xÏ…€Ú‰ã—í–ó¢žÙ£ŸÚ¥¡Ü¦¢Ý§¡Ý¦¡Û¥ Ú¦žÙ¥Ö£œÒ¢™Ð¡˜Íž–É—ÁŒ‚´ƒy«mrvghlc_`e[ZlYUtUP€ULVK–RG¨ZN²ZP½\SÔmdç|tò…~üˆðxyõyyæabÜPQ×EEñYVÎ61È1(Ç5(Ä7&Â6%Ã8%Æ9'Ì:+Ð<.Õ?1Ô8+Ö=/Ø?1Ó;-Í5'Í4&Ø:.ã?5à90á90Þ7.×7+Ï7)È;)Ä@+ÁC,Ä;3È?7ÍD<ÏF>ÌC;Å<4»2*µ,$Ä>5ÍG>×QHÞXOá[RßYPÖPGËE<Ì<!Ò<$Û:(å4,ë--ó'0÷%2û$6ÿ(@ÿ'@ÿ'Bÿ&Bÿ%Bÿ$Bÿ!Aÿ!Aÿ:ÿ"<ÿ'>ÿ)<ö*6í.6ç48å;;Ü94Ü:5Ý<4à;5ã:5æ93é73é62ì25ì44ë54è64ä71ß7.Ú6,Ø6)Û9*Û:(Û:&Ü9&ß8%á8%â7#â7#í41ï4/ñ4.ó3.ó4,ï5)ê6(å8*à:.Ø7/×96Ý>BÿlyÿasþRlöGdÿIjû5Yÿ5]ÿ;eú=cãPj©LVT)":1 9<)EF4RL>PH;BC39E15K4FGHJ#MQ,U\:\jGcuOf}QeNc…Hb‡BaŠ>cŒ@eDjIl‘Nm‘Qj’IiFgŒFf‹Ff‹Hf‰Ic…Ic‚GdƒJdIc~Gc~Gd€FfFe~Dc|BX}8[€;^ƒ><?4?A6FC<JE?OF?TG>[K>^M;`O;`Q:^S?^WGa\Vhcinlyrqƒtnšvpžtp¢pm¢gfŸaaŸ]^Ÿ\\¤ed°kjºtrÅ}{φ‚ÙŽˆà”Žè˜’ì›—Òœ˜Ó™Öžš×™Ö—Õœ–Ò•Ñž–Ñœ”Íœ“Ê›’Ç™‘Ä“‰»ˆ®€w¦tmtkdkf]`e[YiZSoWMzVJŠVI›UK°\RºYRÁXRÓf_Þqjãvoêwý‡…ÿˆ‡÷uuðfdäTSíYUÇ2+Â/%Æ7)Ã7&À7%Á8%Ä9&É:*Ï;-Ó=/Ö8,Õ9,Ó:,Ò:,Ñ9+Ñ9+Ô8+Ø8,ß;1à90Ü8.Ø8,Ð8*Ç:(¿;&¼;%¿4-Á80Æ=5É@8ÊA9È?7Å<4Â91¾5-Ç>6ÑH@ØOGÚQI×NFÌC;À7/Ê8Ñ9"Û8)å4,ï./ö*3û(7ÿ(:ÿ+Bÿ*Bÿ)Aÿ&Aÿ$@ÿ >ÿ=ÿ<ÿ8ÿ9ÿ$;ÿ);÷-9ï29ê7;å;;Ü94Ü:5Ý;6à;5ã:5æ93é73é62ì25í36ë54è64ä71ß7.Ü5,Ø6)Û9*Û:(Û:&Ü9&Þ9%á8%â7#â7#é4-ê3-ì4,ì4*ì4*ë5(æ6)á7*Þ</Ó5,Ó52óTYÿesÿ[põGbüKhÿ@dÿ:`ÿ1[ÿ7aùImÐJb‰8?O,&=7'3:(:=,C@1F@0@?-;C.:H1@CKP'\b<eoLhvRezSd~Qd‚LaƒFa†@aŠ>cŒ@eDiŽHkMlPl’IjGhGf‹Ff‹Hf‰Id†JdƒHe„KdIc€HdHeGeGfEd}C\<_„?b‡B69.:<1??7E@:KB=OE<VH=[K<^O<\O<\TA_WLc^[helol}sq†sm™qk™jg–c`•\[”ZZ˜\]ž\_¦hjµno¿wxÊÒ†„Ø‹‡ÜŠà’Œâ“’Γ’Γ‘ЕДѓŽÐ“ŒÏ’‹Î•ŒÍ“‹Ç“‹Ä”‹À“‹¼Œ„³ƒz¥{r€dpt_fiZ]c\Vc\ReYKqWH„TF£ZQ¾_YË[YÐXWÛcbßliÝpkàwqûІÿІÿ…ÿ|yømhï`ZÄ4+À2&Ä8)Á:'¾:%À9%Â9&Ç:)Ì:+Î:,Ù9-Ó5)Î5'Ð8*Ô>/Ô>/Î6(Ë/"Ú:.Û7-Ù7,Ö8,Ñ9+É:)Â9&¼8#¾4*À6,Â8.Ä:0Ç=3Ê@6ËA7ÌB8Å;1Ê@6ÏE;ÐF<ÒH>ÑG=Ê@6Â8.Í6!Ô7&ß7,é3/ñ03ø,5ý*9ÿ*<ü'=ü'=û%=ù#;û!:ü8ü7þ7ÿ6ÿ6ÿ#8ý*;ù1<ñ6=é9;ã;:Ü86Ü:5Þ;6à;5ã:5ç85é73é62ï26î47í55ê65å61ß6/Ü5,×5(Ù9)Ù9)Ú9'Û8%Ý8%Þ7$à7$à7$â4+â4)å4*å5(ã6(â7&Þ7'Û8)Ý=1Ï2+×98ÿltÿ]nþPið=[ÿJlÿ5\ÿ=eü4[ô<`êTq«?Oa#(H1+79+-8'18&:;)B=*A<(@>)@B*?GY`4s~T€Œfw‡bi~Ub|MaI`ƒC`…?aŠ>cŒ@hŽEjJkMlPn”Kk‘HhGgŒGgŒIh‹KfˆKf…Je„Ke‚Jc€HeGf‚Hf‚GeFcDb‡BeŠEhH06*58-;<4A>9G@:KB;RE<VJ<XL<YN<YRB^WOc_`igrom‚ppˆpm˜jg”`^WW‹TUŽWY–\_¢ad«ko¹qtÃ{|Ì‚ƒÕˆ†ÙŠˆÛŒ‰ÚŠÛÍŽŽÌÎŽ‹ÎŠÑŽˆÐ‡Ï…Î†ÊŽ…ÆŽ†Á‡¼‡¶‰‚«€xxq“‹[i}WbmWYa]T\`Q\^IhYF}SCŸULÂZYÔW[ÝV\çbeçkkàplâysê}vì{uýƒ~ÿ†€ÿ{õkaÉ<2Â9)Â;(¿:'¾<&½;%Á:&Å:'È9)Ë9*Û9.Ö6*Ð4'Î8)Ñ>.Ð?.Ë8(Ç/!Ò6)Ó5)Ô4(Ò6)Ñ9+Í<+È=*Ä;(Æ9/Æ9/Æ9/Æ9/Ç:0È;1É<2Ê=3ÒE;ÒE;ÐB8Ë=3Ë=3ÏA7ÏA7Ë=3Ñ4#Ø6)â5.ë31ò/5÷+6û(7ü)<ù&9÷&;÷&;ø'<û&<ý%<ÿ$:ÿ#:ÿ!7ÿ"7ü%7ù-9÷5>ñ:?ç9:à87Ü86Ü:5Þ;6à;5å95ç85ê65ë54ñ27ð37î66ê65æ72á6/Ü5,×5(Ø8*Ø8(Ø9&Ù8&Ú7$Ü7$Ý6#Ý6#Ù6'Ú7(Û8'Ü9(Ü9(Û:(×:'Ö:+Õ;/Î3.éIKÿo{ÿVjøDaö=_ÿCiÿ/[ÿ7`û=cëLlÆOe€0=G >3--3'+8'2=,=B.B@+C;$G="MA'R_*q}MŸp—¨|ƒ˜mj„W_{J]~E_ƒCa†@b‹?fCk‘Hl‘Lm‘Qm‘So•Ll’IiŽHhHhJiŒLhŠMiˆMf…LdƒJdGe‚Hf„Hh„If‚EeDf‹FiŽIl‘L-3'17-7:3<;6B=9G?<MD=QG=SI=SK>UOCZUQa_dhgukkƒllˆjg’baXV‡PP†QQXYš`cªfj´orÁuxÉ|Ѓ„Ö†‡×‰ˆØŠ‰×Œ‰ØŒŒÌ‹‹ËŠ‰Í‰‡Ð‰…ш„ÑŠƒÓ‰‚ÐŒ„Ï‹„È…Á†º†²‡¥}x–vpŠ“ScƒQ\qUT`^RVcOTbH_]DvUB’LB¼RRÖPWàPYé\dèejâljâwqâvláphõ~vÿ‚{ÿ‡~ôkaÉ?2À8(À;(¿='¾='¿='Â;'Å:'Ç8(Ê8)Ü8/Ú7.Ô8,Ï9+Ê;+È;*Ç:)É7(Ï9+Ñ7+Ô8,Ó7+Ï7*Ì8*Ë<,Ë>-É=0Ê<0Ê<0É;/È:.Æ8,Å7+Å5*Ð@5Ð@5Í=2Ë8.Ë8.Î;1Í:0É6,Ò.$Ù0)ä2.î23ô/8ù-9û+;ü+>ü-?û.?ú0@ü/@þ/Aÿ.?ÿ-?ÿ->ÿ)9ý)8ø*7õ0:ó6=ì9=ã77Ú53Ü86Ü:5Þ;6â:7å95ç85ê65ë54ò38ñ48ï56í76æ74á6/Ú6,×5*Ö9*Ö9*Ö9(Ø9&Ø9&Ù8&Ú7$Ú7$Ô9%Õ:&Ô<'Õ=(Ô=(Ô=(Ó>*Ó=.Ð8-Ù;8ÿ^eÿaqÿPi÷;\ÿAiû6aÿ/]ÿ.WøIjÛYq•>NX'-?+,730*1)-9-5@/:B+<<"B;VG(iV6v‡P£lª¾‹¨¾Ž¥wo‹[aK^F`…BcˆBeŽBj“Go•Lp•Po“So“Uo•Ll‘KiŽHgŒGiŒJiŒLi‹NhŠNf…Je„IdƒHfƒIg…Ih†Hg…Gf„FgIi‘Kl”N*2%.4*470894<;7B=:HA;KD<NH<NH<OKBUTR_^ffewggfg†ba[YŠQQ…NO‡RS“[^£ei³lo¾sxÊx}ÑÖƒ…؆‡Ù†‡×ˆ‡Õ‰ˆÔ‡ˆÈ†‡È……Ë…ƒÎ„Ð…€Ô…€Ô‡Ò„ÓŒ…Ë…Á…¸‹…«„{vŒrn•N\ƒNTqTPa_PWgMReI\`EsXCOCºTRÔSXàPZëYcé`gähjçqqê{rärhö}tòsjþxmæ\QÄ:-¾5#À<'À>(À>(Á=(Ä;(È;)Ì9)Î8*Ú3+Ù6-Ö:.Î:,Ç:)Â9'Ä;)É=,Í>.Ö@2ÙA4×=1Ï7*Ê4&Ê8)Ë<,È:,È:,É;-Ê;-Ê;-È9+È6)Ç5(Ê6*Ï;/Ò>2Õ>3Ö?4Õ>3Î7,Å.#Õ)%Ü-*ç02ñ29ø0;ü/>þ/?ý0Aú0@÷1@ö2@ö0=÷/:ù-9ú,8ü*7ý/<ù/;õ0:ñ2:í6;æ68ß55Ù42Ü86Ý:5ß:6â:7æ87é77ê67ë54õ49ó49ð69í76æ74ß6/Ú6-Ö6*Õ7+Ô8)Ô8)Ô9'Õ8'Õ8%×8%×8%Ï:$Î<%Î>&Í?'ÍA(ÍA*Î@,Ï=.Ð71éIKÿgrÿOdÿHfû7]ÿAmý/_ÿ1^ø1XåOj¹Wfh39@*,?994443524925>-2<#29ECl`8Ž}R™±u©Á‡µÎ—­È•’®}v”be†Q_ƒF`…Bc‰@gDo•Jr˜Or—Rq•Up”Vo•Ll‘KhGf‹Fh‹IiŒLi‹Ni‹Og†Kf…Je„If…IhˆIjˆJi‡Gg…EhJk“Mn–P(0#*2'/4-350664<87@<9C>8IE<HE<KHCQQQ[[eabvab~`a€_]ŽZXŠTTŠTT\] gi´psÄtyÍ{Ø~‚Û…Þ„†Ýƒ…؃„Ö…„Ò†…Óƒ‡Ç„…ȃƒË‚̓Ó„€Õ†€Øˆ€Õ„Õ‹„Ê‹ƒ¾‹ƒ²ˆ‚¤|’uqlirŒOVNQpUNc`OYgMVfI]dEo]EˆTF²[TÌXYÙSZæYaé\dèaeðknñ|rìsj÷xoÞYPå[QÒD8Ã5'Æ:)Ã:'Ã<(Ä='Æ=*É<*Í:*Ð8*Ó7+Ö/'Õ2)Ò8,Í;,Å<*À;(À;(Ã<)Ç;*ÕC4áK=ßG:Ô</Ê4&É5'Í;,È9)È9)È9)È9)Ê8)Ê8)Ë7)Ë7)Í7)Ó;.×?2Ù?3Ú@4ÝA5×;/Ï3'Þ..å12î49÷5>û3>ú0>ú0@ø/?ò.<ï/<í/9í07í.5ï,2ò+2ò)/õ1;õ3<ò5;ì59ç47á55Þ65Û75Ü86Ý97ß:6ã:7æ87é77ê67ë46ö5:ô5:ñ7:î87æ74à72Ù6-Ô6+Ñ8*Ð8*Ð9(Ð9(Ð9(Ñ8&Ñ8&Ó8&È:"Ç;"È>$Ç?%ÇA(Ç@*Ê>-Î;1Õ:6üU\ÿ_oÿGcÿ>bÿ8cÿ6gÿ0cÿ4\òCbÈMa…BIL44:97<<>948>58<7379+3="8DS[,ƒPª£o«Èˆ¯ËŽ¯Ì’¦Ã‘¯}{™ggˆQ^‚E^ƒ@c‰@iDo•Js™Ps˜Sq•Uo“Un“MkJgŒGeŠEgŠHh‹Ki‹Ni‹NfˆLd†Id†Ig‡Hi‰JjŠIi‰FhˆEi“Kl–No™Q&.!(0%-2+130333756:97>;6GD=DD<GFAOOQZZd_`t^_{\]|`^\ZŒYX‘\\œgg¯qrÂz|Ó}܄ゅ䃆ㄅႄۂՂ҃‚ЄˆÈƒ†É„„̃‚Î…Õ†‚׈‚Ø‹ƒØ…ÒŒƒÆ‹‚¹‰‚«…›xˆsntjfgSPuRLjWIe`MafO\gI`cFn`FxR?[M·ZSÆRRÚUZåV\ëX`ö`iótkïof÷qhÑD;ÔA9Å1%È4&ÔC2Ç9%Ç:&È;'Ë=)Î;+Ó:,Ø8,Ù7,Ð,#Ð/%Î6)Ë<,Ç@-Á>*½<'»8$¾5#ÑB2ãOAäN@ØB4Í7)Ë7)Ð>/Ê;+É:*Ç8(È6'È6'Ê6(Î8*Ð8+Ó;.Õ;/Õ9-Ó5*Õ7,Ü;1Ý<2Ú9/ë7:ñ8=÷:Aü8Bü4A÷.>ò,;ï,:í/;é19è38é58í57ñ48ô36ö45î49ï6;í9<é69â45Ý33Ý86ß;9Ü86Þ97á98å99æ89é69ê67ë46ö5:ô5:ñ7:î79ç85ß82Ø7/Ó7+Ð8+Í9+Í:*Ì;*Í:*Í:*Í:(Ï9(Ä: Â: Ã=$Á?%Â@(Ä@+É=.Í81ß<?ÿ[hÿQhÿHhÿ7]ÿ<jü,]ÿ7iì;XéYp§LUX00?<5<E@99;B3:G08F21?9+<E(DW*at=Žœ_²»|®ÌŒ«É‹¥Ä‰œº„ެzy™gf‡PZ|@]‚?a‡>hŽCo•Jr˜Or—Rp”Tn’To“MkIgŠFeˆFf‰Gh‹Ki‹Ni‹NfˆKe‡Jd‡GeˆHgŠHh‹Gh‹GfŠDj”Lm—OpšR(0!'/"(-&+-*.0/333775:94==5?@8DE?JLKQQYVWiZ\s]^|YW†[Y‹^]–ee¥nn¸wxÊ€Ú„„䊌ðŠŒðŠŠì†‡ä‚‚Ü€Ô‚€Óƒ‚Ò€„ĄǃƒÉ„„ΆƒÒˆƒÕ‹ƒÖŒƒÒŠ€ÇŠ€½‰±…~ €xwpxkeec^XpZMm[Mi\Kf^Kd_IcaHfbGl`FlR;„UA£^O¿aYÑYXßPTñQ[ÿXbôkcæYRÔD<Î70Ñ7/×;/Ø</Ô;+Ï9(Í:(Í:(Ð:)Ô8)Ù7,Ü5,ß4,Ð/'Ï2)Ì8,Ê>/Å@/Á@-¾=*¼9'Â9)¾0"êVJáJ?Å.#Ñ=1Î</Ç8*Ê;*É:)È9(É8'É6&É6&Ë5&Ì4&Ð7)×;.Ü>2Ü<0Ù7,Û7-â>4éE;øAFó8?ð3:ö4?ö2>ñ-;ï,:í2=ì7@æ5;ã68å78é99ð:9ñ86ò65ï==î<<ê:<æ89á77ß76Ü75Ü75Þ97á98ã99æ::é9;ì9<í9<ï8<÷6;ô5:ñ7:í9:è:9à;5×90Ï7,Ë7+È9)Ç:)Ç:)Ç:)Ç:)È;*È;)Á9!Ä>%½;#µ5»:$ÈE3Í@6Ê0.ÿ^eÿVgÿHcÿ;\ú0Xø/[ý5cÿ<jã\m¯EOo33G6.9C8:E==9:B+3P-4N00D7'CJ)Wo=}›_œ¹v«Å~«ËŒŸ¾‚˜·~”²~‚ nf„RXvBY{?]€>c‡?iDn”Im•Ll”Nk’Qj‘RjŽHfŠDc†Bc†Df‰Gh‹Kg‰LdˆJg‹MhŒNg‹Kf‹HeŠEf‹EjIm“Jp›SrUtŸW*0")/#).'+-(-/.222553782;<4>@5BC;HJGOPTSUaXYm[[s\Z‚^]‰da–kj¦us¼}Ї‡á‹‹íŒòŒ‹ñ‰‰í…„ ڀ~Ò€σ€Ï…†Æ†‡È‡ˆË‰ˆÎ‹‡ÑŒ†Ð…ÎŽ„ÉŠ€½‰³†{£‚x‘{s€tknkd^e\SbaLb`Ke^Kh]Ii\Ij^Hk_Gm_EraG{]CŽ[Fª[LÆWPàQS÷PXÿS`ìWQãKFÛ>9×50Ú5/Ý90Ü8,Ø8*Ó8&Ñ8&Ñ8&Ô8)×7)Ü5,à3,ã2,Ë1'Ë4)È9+Æ=-ÄA/Á@-¾=*¾9(Â9)Ë<.åQEÜH<È4(Ì:-È:,Á5&Ê=+Ê=+Ê;*Ì;*Ë:)Î8)Ï7)Ï6(Ó7*Ö8,Ù7,×3)Õ1'Ø1(ß7.å=4ûBHò7>í07ï/:ò0;î.;ì1<ê6?ã6<Ü36×32ß:8îEB÷JFøEAõ?<è:9æ:8å97â96á85à85á98á98à87â88å99ç9:é9;ì9<í8=ì7<ô5:ò59î68ê88æ:8Ý:5Ó91Ë7-Æ8*Ã:*Â:*À;*À;*Á<+Á<+Á<+½9"Á?)¹;$²5¸;'À</É:2Ø<=ÿ]iÿOdÿ@[ü6Yù5[ø:`ö=fô@g¡EJ„>>];2@>/3A05?4E=:X;?T-0X51ZI7bjEu[бpšÄ|žÈ|š¹}š¹€™·ƒ©yr`YuESq?\{B_>b†>iCm“Fl”Kk“Mh‘MhQhŒFeˆDc†Bc†DgŠHiŒLhŒNg‹MiOiMiŽKgŒGgŒGfŽGj’Im•LnœQoRr U-1"-1#,/&,.).0-11/34/45-9;0<>1@B5EH?KMLQRWUTbXWi\Yx^]fcŽpm¢zx¹…‚ÏŠáíŽñŽŒïŠˆé‡ƒá~Õ|Í}È}Ç…‡ÄˆˆÆŠŠÊŒŠËŒŠËŒ‡ÇŒ„À‹‚¹‰€¯†|¡€v‘{p€ujpod`i_Ue\MXeK]bKa_Jh[HmZIp[Hq\Go]EtcItZ?‚V= WDÅYMäTSûNTÿIUß@<Þ<9Ý84ß61á6/á6.Þ6+Ú7(Ö6&Ó8&Ó8&Õ8'Ø6)Ý5,á3,ä1,Ç5(Å6(Â9)Á<+Á@-Á@-À=+À8(Ã5'ÜJ=ÜE:ÕA5Î</Ä6(Ä;+¼7&Æ:)Ç:)Ç:)É:*Ê8)Ë7)Í5(Í3'Ö8-×6,Ö3*×3*Û2+ß6/å:3è=6ò;?í4:ë07î0:ð2<í3>ë7@ê=CÜ7;áAAìNK÷ZUüZUùRLïB>è62à72à74à74ß74à85á96ã;8ä::á77ä88æ89è8;é9<ë8<ì7<ì7<ò38î47ì57ç77â:7Ù:4Ï8/Ç7,Â8+¿:+½;+»<+»<+»<+»<+»<+º9$¾@*³9$°7$¶;+´2%Ã40îOTÿZiÿH`ù8Uó6Vó>]ñFfçHfÞEat?9e?6QA2@C04?.29)>5,O61K*#W:,j\Bˆ_«t”½{“ÃyÃv•²|œ¸…™µ…€šm\uKHa7Nh9[xB_}?c„?hŒBl’Ej“Gh’JgLeMe‰Cd‡Cc†BeˆFh‹IjŽNkOjŽNkOkOiMhJgHi‘Hl•Ip™Ms¡Vt¢Wv¤Y25$13&02'01+12-23.34.46+9;-;>-?B1DF9IJBNNNRQWTR]XVd\Zoda~nl”zw®„ÄŒ‰Ø‘Žå”‘ì“펋扅ڂÎ{Å|¿‚}¿ƒƒ¿……Á‰ˆÂŠÃ‹ˆ¿‹„¸‡®…}¦…{€vŽzm~sfmoa`k^Vi[NgZJVdJZbJa_JjZJpYIsYJtZIs]FqY?tU9†T;§ZFÌ\PæRNóEGù:AØ3/Ü41á51ä50ã5.â4+à6)Û8)Ö7$Ó8$Ñ8&Ô9'Ø6)Ý5*à3,ã2,Â8+¿7)»7(¼:*¿=-Â>/Ã;-Ä8+Æ3)ëTKÔ;3Ì8.ÑA6¾4'À<-½>-Ã7&Ä8'Æ9(Ç:)Ê8)Ë7)Ì6(Í3'Ó5*Ô3)Ö2)Û4,ã:3é>7ì?9ë>8è47ì59ï6;î5;ê2:æ39ä7=á<@óUVûc`ÿnjÿidóVQäA<ß61à3/Þ71Þ71Þ71ß82á85â96å97æ::å78æ89è8;é9<ë8<ë8<ë8<ë8<ñ48î68ê67æ87à;7Ö<4Ì9/Å8.½9,º;,¶;+µ<+´<+´<+³;*³;*³:'·@,­8&¬9'±;-«+"Ã54ÿ_gÿSdýE]ó;Uí<XéG_áOdÐP_ÄKZcPAVI8JE2CF1AF0<?*<7#>1B2SE*okHŠ“f•¬t´t‹¹q‹½t¡¹‰¡¸Š§}l‚\K_:BV1Lc7Yq?_{@dƒ@i‹Ak‘Di’Fg‘IdJbLc†Bc†Bd‡CgŠHjMkOm‘Qn’Rj‘Pj‘Nj’Li‘Jg‘Gi“Gm—KqœMu¥Yv¦Zx¨\78(78*66,56056156167/68+;>-=@+@C.DG4IK=NNFQPNSQTVUSYY[a_lkius›€}´ˆ…ÈŒ‰Ö•’ã”äÞ‹‡Ó„Æ}º|µ€{±~¸‚º‡„»‰…¸Š„²†¨z›€xs‡znzrfjm_\j[Tk[NjZKjYI^bK_aKe^Kk[KpZLtZKw\Kz[G{WAƒS=—U?³XFÍSFÝF?å76ê01Û2-ß3/â5/å4.ã2*à2'ß5(Ü9(Ô7$Ð9$Ï:$Ñ:'Ô8)Ù7*Ý5,à3,½>-¹:)µ6%·8'½;+Â=.Ç;.É6,Ñ80ö\T×=5Ë4+ÏA5¸3$·:(¹@-Â9)Ã:*Æ:+È:,Ê;-Ì:-Ï8-Ñ7-Ñ3*Ò1)Ö1+Þ71ç;7ë>:è;7æ74é77ï;<ð<?ê69ä15ã6:èBFìNOÿxwÿqnða[ÛKCÐ83Ñ2.Ü73è?<à93à93ß82à72à72ã75å76å78æ68ç79è8;ë8<ë8<ë8>ê7=ê7=ð69î79ê7:ä::ß=:Ö=7Ë;2Ã;/¸9*´;*±<*¯<)­=)¬<(¬<(¬<(«:(¬=*¤9'¥:*©9-«0)ËAAÿgr÷L^÷E[ðBYèF[ÛN^ÈT]´VW§SQSU@LN9JG4JE1FD-AA'>C#@G%MU.^g<xTŒ˜f‘¤m©n޲r’¼z µŒ’§€u†dRcC?O2BS3Oa;Vl=b{Be‚@iŠCjEi’Fe‘FbH`Ie…Bd‡CgŠFiŒJkŽNlPn’Ro“Sj‘Pk’Oj“Mi“Ki“Ik•InšKržOu¥Yv¦Zw§[?>,?=.==1==5=<7;<6;=2;=/?B-@D+CG,GI1KM8NOASPITQLYXDZ[M_^Zgepqo‡{y¡ƒ€·‡…ƌӋՊъ…ǃ€¹~z­zw¤{u¡zw°|y°€|®~©‚~£y•|t‰zrvkqrffm`Zl[QlZNl[KmZKmZIg^Mi]Mi]Mj]Mn]Ms^My^M€[I“`OšWG§N@¹I=Æ@5Ð6.Ù0)á0*á51â5/ã4/â4-à2)ß3'Ü6&Ú;(Ð9$Í;$Ì<$Í<'Ñ:)Õ9*Ù7,Ü5,ºA.´;(¯6#°5#¹:)Â=.É;/Í6-Û>7ùZTåHAÐ90Ì@3¸6&«4 ±>)¿7'¿7'À7'Ã7(Å7)É7*Î7,Ð8-Ù<3Û:2Þ93å<7ê>:ê=9ç85ã41è96ë<9ê::è8:ì>@øORÿccÿqpùheàUPÈ=8¿2+È5.Ö;7à<:â:9à<3á:2á:4á83ã73ä65å55æ68é69é69ê7;ë8<ë8>è7=è7=ç6<ð8:ì8;è8:ã;:Ý>:Ó>7É<2À</´9)°;*¬;)ª;(©<(¦;'¥:&¥:&£<)Ÿ:(Ÿ<)ž:*¡7*´?8ÛTXüdpðK\ñH]ìI\ÝL[ÉRX±WVœ\R^OAP9FN9NI5K>+>467>O#Jh4gTt•\„›c‹™dŽ›f‘¢l•¬t•²x„”pn}\Q`C=J09F,BO3O_;Xi=czDgBkŠDk‘Dh’Fe‘F`G`Gf†Ci‰FjKlMlOkOm‘Ql“Rm”Qm”Qm–Pl–Lk—Jm™JržOu¢Qy¬]y¬]x«\CB0DB3DB6EB9CC;CC;BB8AD3CG0EH-GJ-JM0OO7RQ?TREURI[\:\\@\]Kaa_ihvrq{z¦~µ†‚¿ˆƒÃˆ„Á„¸{­ysŸtp•qmŽol£rn¡tq wršwrtoƒskxrilmb^l_Vj\OlZLn[Lo\Kq\Kq\KrZNq[Nn\Nl_Ol`PqaQy_N†[KŸ_S¦OE°A8½:2È5-Ï1(Ø1(Ý5*â70á6/á4-á3*à4(ß5(Ù6%Ô9#Í;"Ê<$È>$Ê>'Í<'Ò;*Õ9,Ø8,·D/±<(¬5!­4!¸9(Ä<.Ì9/Ï5-Ú83ñNIòSMÙB9ÌB5½@.¥2¬?(À;,Á9+À8*À6)Å7+É9.Ï;1Ô;3áD=ãA<ä?;ç>;é=;é;:è88ç77æ93æ95å84é;:ôJJÿ\[ÿdc÷caË=9¿82»4.Ã81ÓB=ÞE@ß=;Ù42â;3â;3â92ä84å84æ66é77é77ê69ë6;ë6;ë8<ë8>è7=è7=ç6<í68ê69æ89à;9Û>9Ñ>6Æ<1¾<.²8)®;)ª;(¦;'¤;&¡;%¡:' 9&ž?-”7%š=,—:)˜3'ÂQKíkmï\fïN^ìI\àHWÎJU·SS¡]RŒfQ‚jP=S<CL7JB/L7$F5FH!Tq;c–Txµo€µo‚¦f~‘Y…ŒX–cŒ–d|YXeGGT89E-8A,:C.?I0JX7Wh>g{Fh‚Cl‹Ek‘Di“Gc‘Fa‘G^Gi‰FlŒImNn‘OlOjŽNkOk’Qp—Tp™SpšRo›Po›NqNv£Rw¦Uz­^z­^y¬]GD3HE6HF9HE<GG?GG?FF:FG5GI1HK.JM.LO0QQ7SR=VSDWSG[\4Z\7[[C\\Rcbhmkusšzx©~{´€|·‚¸€|¯zw¢so”mj‰kf„gb˜hd—lf”lh‹lhleuibij`^g]Th\NjZJl[Io\Ks^Ms^Ms\LzWQvYQp\Ql`PkbQpcR{aPŠ\OžUL§D>±61Á3/Î5/Ö5+Ù7*Û8)ß6/ß4-à3,à4*â6*Þ7'Ø7%Ï7 Ì<"È>"Æ>$Ç?'Ê>'Ï<*Ó:,Õ9,µE/­='¨3¬3 ·8'Å;.Ì9/Ò5.Ò/*ä?;ûYTàI@ÎD7ÆI7¥5®D,ËF7ÉD5ÉA3É?2Í?3ÒB7ÚF<àG?ßB;à>9à;7à74â64ä65ç77é99é>7ç:4ä73è<:ñIHñMLØ=;¹(%¸-(¼5/Å@9ÌC=ÐA;Ö=8Ý>;ã?>á:2á:2â92ä84æ95è96ë99í9:ë7:ë6;ì7<ë8<ë8>è7=ç6<æ7<ì59è58å78ß:8Ù<7Ï<4Ä<0º:-°8(«:(¨;'¤;&¡:'Ÿ:&Ÿ:&ž9%š?,4"—>,“:*“1&Ì\X÷y|æT_ðTbèI[ØDRÃGO®SPšbS†lS{rSC[C?H3B7%O6"_K0prJ€£iˆÇ€yÃt{¾qu¢]oƒHy}J‡†Xy|O\d5:D)3=$4>&<E2=D2:B+EP2Ve<g{HiƒDl‹Em’Ei“Gd’Ga‘G^Gk‹HnŽKo’Po’PlOiMjŽNj‘PsšWsœVsUržSržQu¡Rw¦U{ªYt§Xs¦Wq¤USJ;SJ;SJ;SJ;SJ;SJ;SJ;SJ;VM>WN?XO@YPAZQB\SD]TE]TEcZKbYJbXNcXRg\Zmacsfmwjs|n{~p}s€s€~p}wjtobli\fcb]a`[a^W_\U_[R^ZOa[ObZMe\Kg\Ji\Ii]Gk\El]Fm]Dm]D_gOkiTqZH{M@•RI©WL®TI³WH¦N:¢G2¢?*ª;(¾:.Ò72à23å,1Þ7.Þ7.Þ7.Ü8.Ü8.Û7-Ø6+Ø6+×7+Õ7+Õ7+Õ7+Ô8+Ô8+Ô8+Ô8+¸=.·=.°8(§2!ª2!´;*½>/Â:,Æ6+Í6-Ô:2ÜB8àI>ÖG9Ç;,¹1!ßOGÙIAÔE=ÓE;ØH?ÜG@àC>á<:ã54ê67ï8:í9:ç77à72Ý:3Ü>5ÎKAÈE;½=0µ7)°5&³8)¹>.ÀA2Á;/Ê<2Õ>5ß=8ç;9î79ò67ô68æ7>æ7>æ7<å8:å99å97ã:5ã:3Þ5.ß6/ã81ä84å97ç98ç9:ç9:ë;>ç9;á99Ü<<ÖA=ÌC;ÀB6´@3¦;+¢=+>,™<*–;(•:'”9&“8%‡F2‡>/†/%”-(ÀIKèkoçlqÊWZ¶OP©TQŸVO˜YP•[P–]R™^Vœ`XMb!:O3JOf x’I˜²h¡½r »t™²pƒ›akN\lEWdHS\GHN@=C9;<,AB4=?2:=2<B6:C2AN4Rc?\tBgƒHpKo“Il’Gj’Ij’KgJlUm‘To“Ul“Pk“Lk”Hl—Hm˜FpJoŸIp Jr¢Ns¥Pv§UyªYz«Z{¤jo˜^dSWN?WN?WN?WN?WN?WN?WN?WN?XO@YPAYPA[RC\SD]TE^UF_VGd[JcZIcYMcYOf[Uj_]nbdpcjrentgpvirvirsfom`ggZacW[\\T\YRYVOWTKXTIXTI\VJ^VIb[Ic[Hf[Gh[Hi]Gj^Fm^Gm^G]eNmhTt]M‚RFšVM­VM²QH¶QE®H9ªC2©>,¯:)½9,Ì70Ø42Þ22Ý6-Þ7.Ü8.Ü8.Û7-Ú8-Ù7,×7+×7+Õ7+Õ7+Ô8+Ô8+Ô8+Ô8+Ò9+¸>/·=.®9(¥2 ¦3 ²:)»=.¿;,Æ:-È4*Ì3+Ó;0ÜE:ßPBÞRCÚQAÝE@Ø@;Ñ<6Ð;5Õ>7Ø=8Û96Ý33é69í68ï79í68é77å97â=9á?:ÆC9¿?2¸:,±6'¯5&²8)¸=-¿@1ÅA4ÍA4×@7ß=8å97ê67ï56ô68ç6<ç6<ç7:æ89æ87å97å95ã:3â92ã:3ã:3ä;6æ:8æ:8å99å99æ9;ä:=à<=Ú?=Ñ@;Å?6¸<2¬;-¥;+ <,œ=+—<)–;(’:&‘8&7%z;)€8)‰5*ž;5ÁQPÚceÔ]a¹MM­NL¤SOYP˜\R—^S—^U˜_V™^VSg*Sg(^r3zO—°l¥¾z™²nˆ¡`j‚Fau@Sf9IY5FP7?H59?358/;<,AB4=?2:=2;A5:C2@M3Rc?]uCgƒHqLp”Jm“Hk“Jk“Lh‘Km‘Tn’To“Sm”Qk“Lj”Hl—Hm˜HpJnžJp Ls£Ou¦Tx©Xx©Xx©Zm–\b‹QY‚H]TE]TE]TE]TE]TE]TE]TE]TE[RC\SD]TE^UF_VG`WHaXIaXIe]He]Jd[Jd[Le[Qf[Uh]Yh\\i]]j^`k_ak__i]]f[YbWU`USYVMWTKTQHRNCQMBSOCWQCXRB^WG^WEaYFc[Fg\Hi^Hk`Jk`J^cOmhUy_PˆXN¤[T³VQ´HE¸E>¹@7¸>3·<-·9*¼8+Ã9.Ê:/Ï;1Û7-Û7-Û7-Ü8.Ú8-Ù7,Ø8,×7+Õ7+Õ7+Õ7+Ô8+Ô8+Ô8+Ò9+Ò9+º@1¶>.®9(£2 ¢3ª:&µ=,»=.Ä?0Å7+Æ2(Ê3(Ð<0ØF9ÛM?ÝQBÜ87Ø43Ô20Ô52Ù:7à>;å=<é;<ï8<ï5:ì27ê24é56å97á<8à=8¹;-·9+±6'®4%­5%°8(µ<+»=.ÈD7ÏC6ÖB8Ü=7â96è64í55ò67ê5:é6:é69ç79ç77æ95å:3å:3ã:3ä;4ã<6ã<6ã;8â:9á99à88Ý9:Þ;<Û@>ÕA=É>7º:1­7+¥7(¡;,œ=+˜=*”<(’;(9&8%Ž7$u8%y6%ˆ9,¢E=ºROÂVT¹OO¬HH¤LHœSL˜ZO—^S–bU—aW˜_V˜]UgxB{ŒU“¦n¥¸€«À‡ž³zz‘YYp:?R$AS)AQ-?L0:C.6<.690581:;+@A3=?29<1;A59B1@M3Qb>_wEi…Js’Nr–Lo•Jm•Lm•Nk”Np”Vq•Uo–Sn–Pl”Kk•Il—HmšIpJpJp Lu¤Sx©Xyª[u¦Wq¡U_ˆNVEOx>aXIaXIaXIaXIaXIaXIaXIaXI_VG`WH`WHaXIbYJcZKd[Ld[Le]Ff^Gf^Ig_Lg^Of\Pf\Rf\Sh]Wh]Wh^Uh^Ug]Se[QdZNdZN]YNZVKVRFRNBPL@PM>RO@UO?WQAYTA[VC^WDaZGd]Jf`JgaKadSleUt]O‹[Q«b\»YXºDD¾9:Æ;8É:6Ç80Â8-½8)¼:*½@.¾C1Ù7*Ù7*Ú8+Ú8+Ú8+Ø8*Ø8*Õ8)Õ8)Õ8)Ô8)Ô8)Ô8)Ò9)Ò9)Ò9)»A2¶>.¬9'¡4 2¢8"¬=)µ@.¼>/Á9+Ä6*Ç4*Ë7+Í;.Î</Í>0å26á14Ý02Ý34à88å;<ë=?î;?ï6<í38ì/5é05ç47ã77Û64Õ30±7(°6'®6&¬7&¬7&®9'²:)µ:*ÃA3ËA4ÔA7Ü?8â:7ç85í76ð67í6:í6:í68ë76ê86è94ç:4æ;4â92á:2ß:4à;7Þ:8Ý98Û97Û89Ö<:Õ@<ÓB?ÊA;»;2¯6+¥5'ž7(œ;*—<)“<)‘<(:&8$Œ7#Œ6%z@,v5#6'™E;¬OH¬MI©LG¨PLPH–VL“ZO“_R“bT•aV—aW™`W~‹]™©z­½Ž¦·Š¡ts†YN`8/A->3B%:F.=F3;A3:=2;<4<=79:*?@2<>19<1:@49B1?L2Pa=`xFj†Kt“Os—Mq—Lo—No—Pm–Pp—Tq˜Up˜Ro—Pm•Ll–Jn™JoœKqžMrŸNt£Sy¨X|«]w§[mSd”J[„LS|DNw?cZKcZKcZKcZKcZKcZKcZKcZKcZKcZKd[Ld[Le\Mf]Nf]Nf]Nf_Eg`Fh`IiaLiaNi`Oh_Ng^OjaRi`Qi`Qh_Nh`Mh`Mh`KiaLb_P^[LYVGTQBPM>NK<NK:NK:PM<RO>TQ>VS@YVC\YF^[H^]I`aSf^QmWJ†[R­hcÁb`ÄLMÌ@CÔ:<×79Ö74Î70Á9+·>)²D+°H-×7)×7)Ø8*Ù9+Ù9+Ö9*Ö9*Õ8)Ô8)Ô8)Ô8)Ò9)Ò9)Ò9)Ò9)Ò9)¼A2¶>.«:( 7"™5š7 ¢>&¯B-±<*º;*Â:,È8-Ë8.Î:.Ð<0Ò>2ò5<î3:é27ã36â46â46â46ä15ì5:ì39ê38ê5:æ8:Ü66Ñ2/Ç,(®9(­:(­:(«:(«:(«:(¬9&¯7&¸:+Á<-Í?3Ø?7à=8æ:6ê86ì87ï56î66î66í74ë84ê93ç:3æ;3á:2ß;2Þ=5Ü=9Û=:Ù><Ø=;×==ÌA<ËB<ÆA:»<3­7-£5(ž7(š;)–;)“<)=(Œ;(Š9&‰8%ˆ7$‡6#}C/s4"y4$“G:¤RG¡NFžNE¡WN˜UL’XL[NŒ\NŽ^R”`U—aW›bYƒŽd˜¤|©ƒ€Žj]kJDS42@&$2-:&0;*5=.9?3<?6=>6:;3::29:*>?1;=08;09?38A0>K1Pa=ayGk‡Lu”Pt˜Nr˜Mq™Pq™Ro˜RršSršSršQp˜Om—Km˜Ip›LržOt Qv¢Sx§Y{©^z¨_qŸVd’JY‡?]†NVGQzBe\Me\Me\Me\Me\Me\Me\Me\Me\Mf]Nf]Nf]Ng^Og^Oh_Ph_Pg`Fh`IiaJjbMjbMjbOjbOjbOjbOiaNh`Kh`Ih`IhaGibHjcGe`Mb]J^XHXRBSM=MJ9KH7IH6KJ8LK9LM;NO=PQ?QTASVESVEYYM]WKcQEzXN¡ha¸eaÇUUÛORÞ=Cã8>à67Õ62È:.¹@+­E*¦I*Ô7(Ô7(Õ8)Ö9*Ö9*Õ9*Õ9*Ô8)Ô8)Ò9)Ò9)Ò9)Ò9)Ò9)Ò9)Ñ:)¼@4µ=/«<+ :$—7’6š<#¦B*°C.¹@/¿;,Ã7*Å2(Ë4+Ó:2Ù@8ó1<ð2<î5=ë8>ç:>å;>ä:=ã9<á48ä5:å8<ä;>Þ;<Ò86Å1-¼-'«<+«=,«>*©>*¨=)©<(©:'«8%¯6%¹7)Å;.Ñ=3Ù<5à;7ä;8è;7ð75ï75ï75î84ì94é;4è;4å=4â>5à?7ÞA:ÚA;ÙA>ÕA?Ñ??Ñ??¾B:»@8µ<3ª8-¡5(›5'˜8(•<*‘;*<)Š<(‡:&†9'„7%ƒ6$‚5#y<)r3!}:*—OA£YLœRG•OE–VJ”ZN[MŒ[M‹[OŽ\Q”^T™`Yœa[s}Xyƒ`r|ZU`B9F,/;'0;+1;03=44;35<4:?8?B9?A6<<277+89)>?1:</7:/8>27@/=J0O`<ayGk‡Lu”Pu™Os™Nq™PršSp™Sr›OrœPq›Oo™Mn™Jp›LsžOu¡Ry¥X{§Z|¨]x¦]qŸWg”O]ŠEVƒ@`‡PY€ISzCg^Og^Og^Og^Og^Og^Og^Og^Og^Og^Og^Oh_Ph_Ph_Ph_Pi`QjbOjbOjbOjbOiaNiaNiaNiaNiaLh`Kh`Ih`IhaGhaEhaEhaEf_Le^Kb[H\WDWR?PM:LI6IH6GH6GH8GJ9GK:HL;IM>HO?HO?PPDVRGYOChREYM˜UL³RLØXWàGJç<Bå79Ý54Ñ:1¿@-°D*¥D$Ò6'Ó7(Ô8)Ó:*Ó:*Ó:*Ó:*Ó:*Ò9)Ò9)Ò9)Ñ:)Ñ:)Ñ:)Ñ:)Ñ:)½?3¶</¬=,£<)—9 6”:  B)¬C-¶A/¿=/Â6)Â/%È/'Ð6.Ú=6ð0;ð5>ï:Aì?CæBCáACÞ@AÚ>?Ï12Ñ56Ô::Ò<;Ê;7¾73µ4.¯3+¥>+¥>+¥>+¦?,¥>+¤>(¥<'¨;'ª7$²7'¼8+Å8.Ì8.Ö92Þ<7ä?;î85î85î84ì94ë:4è;4å=4â>4âA7ÝC9ÚC<ÕB;ÐA=Ê?<Ç=;Ã<9®>3©:/¢8+œ6(˜7'”8)‘:)Œ;(‹=)ˆ=*…<)ƒ:'‚9&€7&6%~5$v4$x5%…B2˜UEœXK“QCPD•ZL’ZM[NŽ]OŽ\Q’\R•\U˜[V™\W`hCX_=JS4>G,6?*2=-4>35?74=88>:=B<CF?EG<CC7@>/;9*78(=>0:</7:/8>26?.=J0N_;`xFk‡Lu”Pu™Os™NršQršSp™SqœMrNqœMp›LošKrNu¡Ry¥X«`~©az¥]qœUf‘L_‰G[ˆE\‰Hb‰RY€ISzCh_Ph_Ph_Ph_Ph_Ph_Ph_Ph_Pg^Oh_Ph_Ph_Ph_Ph_Pi`Qi`QmcWlbVjaRi`Qh_Pg^Og^Mh_NiaNiaLiaLiaJh`IhaGhaGhaGh`Kg_Je_Ib[H\WCUR?PM:ML:EF4DG6DH7BI9BI9BJ;BJ;BJ;JJ@QQERPAUN<bM:qF6“I>ÄYSÛQOãCEå8:ß55×:3Ê>/¸>)¬<$Ï8'Ï8'Ð9(Ò;*Ò;*Ò;*Ò;*Ò;*Ñ:)Ñ:)Ñ:)Ñ:)Ñ:)Ñ:)Ñ:)Ñ:)½=2¶:.­<,¥>+˜9#Œ59ž@' :$¯<)¾?0È;1Ì8.Ñ7/Ù<5àA;ð;Bï>FëBGãCEÖ@?Ê;7À50»1.·0,¼51¾:5»<6³:2©9.£9,¡9,Ÿ>+Ÿ>+ ?,¡@-¡@-¡A+£>*¤=*©<(­:(²7(¹5)Á4*Ë80Ö?8ÝD>é:5é:5è;4è;4ç<4ä=4á?4Þ@5ÝC9ØD:ÒC;ÊA9Ä?:¼;6¸85´73ž9-™7*•5'’6'‘:)<*‰:)„9&†=*„=+=*€<)~:'|7'{6&{6&y1#€8*ŒG8–RE’PB‹K?ŽSE™_SXKZN’\R–]T—\V˜[V˜YT—XSV^7EM(6@8A&>G2<D53=2-7/1737>7@E>GJ?GI;BC1?>);;#78(=>09;.69.8>26?.<I/N_;`xFj†Ku”Pt˜Ns™NršQršSp™SqœJqœLpLoœKo›LržOw£V{§\‚­e€«dx£^j•P]‡EYƒC^ˆHeOcŠUZLSzEi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qj_Yj_Yj`Wj`Wj`Vj`Vj`TjaRjaPjaPjbOjbOjbOjbMjbMjbMg_Jg_Jf^Ie_Ib]I\WCSP=ML:HI7EH7AE6>E5>F7?G8=H8<G7HJ=HL>AE4HK6YS;_F0€K9Àj]Ýf`åSSçDEè@@ã?=Ö=5É=0Â>/É3$Ë5&Ì6'Í7(Í7(Î8)Ñ;,Ó=.Ò<-Ò<-Ò<-Ò<-Ñ;,Ñ;,Ñ;,Ñ;,¸3,·7.±;-¦;)˜8"‘7’8š:"«B-±<+¹7)Á4*Í6/×<7âC?êHCëBGéDHÝCCÉ:6»61´80®8.§5+ª:/¨9.¤8. 8-›9,–:+’<+>-˜=*˜=*™>+š?,›@-œA.žB-¡@-¡<*¥:(«7(°6)¶6+¾8-Å;1Ê=4ß:4á<6â?6ã@7âA7ßA6Ú@4×@5ÚG=ÒE;ÇA6»;2±6.ª3-¤1,¢1+”;-’:,:+:*‰:)ˆ;)…<+„=+~:'|9(|9({:({:(z9'x6&w4$z, A4˜NC“MAŽL>RE‘VHŽRG˜\R˜\R‘UMTL™ZU—XS–WR `^R[0IQ(AK&BK,>H/7@-2=-4>34;3HPEX^RW[LLO<DF.AA'==!:;+>?1;=0:=29?34=,;H.Pa=bzHlˆMu”Ps—Mq—Lp˜OršSqšTpJqžKrŸLrŸNsŸPv¢U{§\ªb‚­fx£^i”O_‰G]‡G`ŠJfŽOhRd‰U[€LTyEi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qj^^j_]j_]j_[j_Yj`Wj`Vj`Vj`TjaRjaRjaRjaRjaRjaRjaRj_Kh`Kg_Jg_Jd]J^YEUR?ON<IJ8EH7AE6>E5?E7>F7>F7=E6BF8>E5=F1DN5HK0PB'yS<¹ubÉdXà_YíUTêFGä>>â@=Û>9Ñ82Ì:+Î<-Ï=.Ð<.Ï;-Î:,Í9+Í9+Î:,Î:,Î:,Ð:,Ð:,Ð:,Ð:,Ð:,È?9ÆA:½A7®=/6#•2•2™3¦5#²7(Á;0ÑA8ÞE?æIDéJFìJGÞBCÛEDÎC@¼;5®9/¨>1¢A1œ?.œ@1™@0–>0’?/Œ?-ˆ?.„A.ƒB.‘;*‘;*’<+“=,”?+”?+–?,™>+Ÿ@.¡=-¤:,§9*¬8+±8-¶:0¹:1Ð90Ò;2Õ>5ÕA7×C7ÖD7ÔD9ÑE8ÊB6ÃA4¹=1°:0¨8-¢5.5,œ5.Ž=,Œ=,Š;,ˆ;+†:*„;*<,€=,~;*|;)y:)y:)x9(w8'u6't5&„1)‘C9˜NC‘K?ŒJ>PD’TIRG“SJšWQ˜UO™UR\X”WTŽSO—\XT]0Zc8_j@[eBIT66C)4@*<G6MXGYbQ_fTW\FJN5BE*?@!<=9:*=>0:</9<1:@45>-;H.Pa=c{IlˆMu”Pt˜Nq—Lq™PršSqšTq¡Kp LpJqžMt Qx¤W|§_ªc{¦aošUcŒJ]…Fa‰JeNeNc‹Ld‰U[€LTyEi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qj^`j^`j^^j_]j_[j_Yj`Wj`Vj`Vj`Tj`Tj`Tj`Tj`Vj`Vj`VlaMk`LiaLiaNf_La\I[VCTQ@ML:HI9DG6AE6AE6?E7>D6=C5=F57@-?H3EM5AA%QA']E³u`³WHÙbZðebîRSéEFìFHèBDÝ79È9+É:,É:,É:,É:,Ê8+È6)È6)Ê8+Ë7+Ë7+Ë7+Ë7+Ì8,Ì8,Î7,Â3/¾5/¸5-¬3( 0"›0Ÿ1 ¥4$»A2ÇC7ÖG?ãKFçLGéJFåFBâC?ÕCCÏDAÁ@:°;1£=/žC1™F4•G3’E3E2ŒC2‰B0ƒB0B/{B.xD.Š8*‹9+‰:)Š;*‹<+<+Ž=,<*–?.–=-›;+9* 8+¥9-©:/«;/¼7.¾90Á;0Ä>3Å?3Æ@4Ä@3ÁA4¸:,²:,ª9+£7+7+™7,–8.–91‰=-ˆ<,…<+„;,‚:+€;+<+<,};+z;*z;,w9*v8)u7(t6's5&Œ91”F<—MBŽJ?ˆH<OD‘SH”QI“NGšSOšSOšVSœ]X“YUZT—f_wƒS~Š\€‹`lxPJX46D#=J.MZ@eqYeoW\fMNW<DJ.?D&=@!:=89);<.8:-9<1;A56?.<I/Pa=c{Im‰Nv•Qt˜Nr˜Mq™PršSp™Ss£Mp LnLpŸOu¤V{§\}¨`|§bošUfM\„E\„EdŒMhQeN_†GcˆUZLSxEi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`QjaRjaRjaRjaRjaRjaRjaRjaRk_ak__k__k`^k`\kaXkaWkaWkaUkaUkaUkaWkaWkaWkaXkaXncQmbPjbOjbOhaNe^L_ZGYVERO>MK<GH8DF8CE7AE6@D5>B3;I27C-EJ3IG0K<%mN9—dO§`NŸA5ÆSLçc_ð^^îRUíJMêDHç>CÉ;/Ç9-Å7+Å7+Ç9-Ê:/Ë;0Ë;0Ñ>4Ñ>4Ñ>4Ò>4Ó?5Ó?5Ó?5Ó?5Ó?=ÑB>ÍD>ÆF=ÁG<ÂI>ÆN@ÎPDÙSJÞOGäLGäIEåFCâC?àA=ß@<ÔFDÊC?º?7«<1ž>.—D2“H3‘J6‹G4ŠF3‡D3„C1B0zA.wC.uB/†8+…9+…9+†:,†:,‡;-‡;+ˆ;+‰:+‹:)Ž8)8*•9,™<-=/ž>0«9/­8.®9/°:.°:.²:,¯9+®8*¨7)¥7*ž7(›6*•7+’8-9/;0†=.…<-ƒ;,9*:+~9*}:*};-|:,z;,y;,w9,s8*q6(q7)q7)B8”G=‘K?ŠH<‡I<‹OD“UJ—TL—PLSP˜QO–RO—\X_Xh^žzn™k…’fu‚VYh=CR)?O(P`<crQetS\iKNY;CL/?E)>B'=A&;>#78(:;-79,9<1;A57@/<I/O`<ayGlˆMv•Qu™Os™NršQršSp™Sq¡MoŸKožMs¢Rz¨]|ªaz¥^u [bŒJ^†G[ƒD_‡HgŽMj‘PfL`‡Fb‡TY~KRwDi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`QjaRjaRjaRjaRjaRjaRjaRjaRk`^k`^k`\k`ZkaXkaWkaUkbSkbSkbSkbSkaUkaWkaWkaXkaXocSnbRmaQkbQkbQhaOd]M`ZJVSBRO>MK<IG8EF6DE5BC3@A19K1>H/JH1Q?+e>-”ZL¬`S›>6œ4+µ@9ØXUóigödeëRUèINìKQ×J@ÓF<Í@6Ë>4Í@6ÒD:ÕG=×G>ÚJAÚJAÝJBÝJBÞKCßJCàKDàKDëRTéSTãTPÜSMØSLØSLÛTNàUNàLHâHFäEBäB@äB@äB@ãEBãEBØJHËD@¹>7ª>2žA2–C1F3I6‰F3‡D3†C3ƒ@0@1}?0y@/x@1ƒ9.ƒ9.‚:.‚:.ƒ;/ƒ;-ƒ;-ƒ;-9*‚9*…9+‡9,‰:+;-<.=/›;/œ:/ž9- :.¡9,¢8*¢8*¢8*Ÿ8)œ8)˜8(”8)9*Œ:,ˆ:-‡;-ƒ;-‚:,9+~9*}8)}7+|8+{9+z8*y9-x:-t9+q5*o5)q7+r:-G;ŽH<‰I=„I;…K=ŒRF“WMšWO˜QMžTQ™RP•VQ’`YˆbW‚h[ŠwhivKZi>JY.AR&IZ0Wi?dvLj|TXjDL\8?M,:D)<D,>C-=@-:=*89):;-68+8;0<B67@/;H.L]9^vDi…Jt“Ot˜Ns™NršQs›TqšTmŸJmžLp¡Px§Y|ª_z¨`rXi“QYƒC\„E`ˆIeŒKgŽMgŽKfJd‹Hc…SY{IRtBi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`QkbSkbSkbSkbSkbSkbSkbSkbSla[lbYlbYlbXlcTlcRldQldQldQldQlcRlcTlbVlbXlbXlbYocSnbRmaQlcTlcTkbSg`Pd]M]WGYSCSM=MJ9KH7HE6DB3B@16J.>H-NC-b=-„D:¯VP¶MJ¡++´:9º=;ÑTPòpnýwvñehêY^ò]cáVOÚOHÒG@ÎC<ÑD=ÔG@ÖGAÖGAÙHCÚIDÚIDÝIEÞJFÞJFàKGàKGãGJáGIÝGHÙGG×HD×HDØGDÝEBàBAåABé@CêBBèBBäB@ßA>ÜA=ÚJIÌB@»<6®>3¢@3—A2B0D3‰A2ˆ@2ˆ>1…=1‚<2€<1=1}=1ƒ:3;3;1;1€<1€<1=/=/=/€</€=-€;,€;,9+9+8)Œ:/9.9/“;/—;.š=.=/ž>.™9)•9*“:*Ž;+Š;,‡;+ƒ;,€;+‚:,9+7)~6*{5){5)z6)z6+x6*x8,w9.s7,o5)o5)r:-u=0ŽL>‰K>„J<‚M=…QC‹VH’XM—WN”MIœRQšTR•[We\y_PcXFb]IBP,?M)?O(K\2_qGk~QcyKVk@M_7@R,6E&7D*=F1=D4:=27:19:*:;-68+8;0<B67@/9F,IZ6Zr@eFr‘Ms—Mr˜MršQs›TqšTlKo Os¤Ux¨\z¨_s [i“Q`ŠJX‚B^†GdŒMgŽMfJeŒIgŒGhHaƒQXzHQsAi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`QkbSkbSkbSkbSkbSkbSkbSkbSlbXlbVlcTlcRldQldOldMldMldMldMldOldQlcRlcTlbVlbXocUmaSkbSlcTmdUlcTi`Qf_Ob[K^WGWQARL<OI9LF6IC3F@02K+>G*SA+{E9¦NL¸EH»5<¾19Ë@EÄ?@ÊJIÞb`îrpïopçbeáZ^ÛRJÕLDÏD=ÍB;ÏD=ÒE>ÐC<Î?9ÒC=ÓB=ÔC>×C?×C?ØD@ÙEAÚEAà?Dß@DÞDFßFHßIHàJIãIIæFHçACëADîAEîACéAAâ@>Ù>:Ö=8ÛEGË=<»73°;4¦@4˜?1>0ŽA1‰=/Š<0‰;1‰92‡81†93…:4„;4:4:4€<3€<3<3}=3}=3|<0{=0{=0{=.{<-z;,y:+z8*z8*€:0‚:.„:-ˆ:.Œ:.‘;.”<.–=-’9)‘:):*Š;*‡;+ƒ;,<+}<*€8,€8,~6*}5)|4(z4(z4*y5*u3'v6,v8-r6+n4(n5*s:/v@4‹PB†N?N=R@…VF‰XIŽUJ‘RI“NI™RP”SO‘\VŠfZl\LML7BL3@O.KZ9WgC`rJezOdzLVl=G]/AV+7I#0A!5C*=F5<D98=7796:;+;<.68+9<1=C77@/7D*FW3Um;a}BoŽJq•Kr˜MršQtœUr›UnŸNq¢Qu¦Wv¦\s¡Yj—R`J[…E^†G`ˆIbŠKeŒKfJhHf‹EeŠD`‚PWyGPr@i`Qi`Qi`Qi`Qi`Qi`Qi`Qi`QkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcRldQldOldMleKleIleIleKldMldOlcRlcTlbVlbVnbTmaSkbSkbSmdUlcTjaRh_Pd]M`YIZSCUN>QJ:MG7IC3GA13M*>G*[B.PGºVVº7?»'3ÜBNÐ:CÄ9>»;:ÂHGÓ][ßgf×[]ÇILÓJDÏF@ÌC=ÎC>ÒGBÒGBÐB>Ë=9ÒC?ÓB?ÔC@ÕDAØDBÙECÙECÚFDá>Cà?DÞBEßEGáGGàFFàBCâ=AëADí>Cì;Aê<>æ>>ãA?ßD@ßFAÙ@CÉ78¹30±:4§?4š>1=/Ž?2Š;.‹9.‹80‹61Š71Š73‰84‰:5:3:3:3~;3|<3|<2{=2{=2u9.v;-w<.w<.x=-x=-y;,y;,{;1};/~8,7*„6)‡5'‰6(‹5&7(‹8(‹:)ˆ;)…<+<,~=+{<*€8,7+~6*|4(|4({2)y3)y5*t1(u5+v8-r6+n4)n5*t;0xB6ŒTE„Q@P>‚UB„YHˆYI‰SGNG˜SN˜RPPKˆVO‚bUeZHFK4;K0IX;[jKgxVewQYnCSi;Me5I`28M"-B*;2@):E7;B;8<;7;<<=-<=/79,9<1=C77@/6C)DU1Rj8_{@mŒHp”Jq—LršQtœUr›Uq¢Qt¥Vu¥Ys£Ym›Sd‘N\‰HZ„DdŒNa‰J`‡HcŠIfJiŽIeŠDa‡>`‚PWyGPr@i`Qi`Qi`QjaRjaRkbSkbSkbSjaRjaRjaRjaRjaRjaRjaRjaRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlcTo\Nq_QtdUrdWnbTj`Th`ShbTgaSebQa^K[VBVQ;TN6NH.GA'RD)N=#cI2iV²zm·ng³[W¸PQ¶BEÁ@EÉ@GÑBFÖDGÚEIÜGIÝGIÔBEÔBE×BDÙEEØDBÒC;ÎD:ÌH;ÄF7ÃH9ÆH:ÊG?ÐEB×BDÜ?FÞ=EâBDâBDâBDâDEâDEãEDãEDãEDâDAâC@áB?â@>ã?=ã?=ã?=å@>ÎE?Ä?8¶:2©80Ÿ:0•>4Œ@3ƒ?2A4|@5}?4<3ƒ:3‡83Š73Œ72…<-…<-…<-„;,ƒ;-‚:,‚:,‚:,9-9-9-~:/~:/~:/~:/~:/~80~80}90}90}90}90|90|90|90|90z:0y9/y9/x8.w9.w9.w8/w8/v7.t8.s7-r6,q5+p6+l2'q7,m4)l3(o6+m4)q8-H=ULƒTL†QK‹PJNJ•NL˜NM—PL”SM‹UK†\NdOkaFTW8JX5N_;gT`zMWpFTkARg@O`<IX7DQ39C*5=&49%7:)=>0CA4B@4@<12:/2:/4:.5;-9=.<?.>A,>D*T^<bqHq…TtVt”UršSsSržQv^¦g¦gq˜YcŠK_†G_†G^…F`‡Hb‰Jd‹LfNeŒMcŠK`‡H^…F_OTvDKm;i`Qi`Qi`QjaRjaRkbSkbSkbSjaRjaRjaRjaRjaRjaRjaRjaRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlcTsaSr`RrbUqcVrfZpfZmeZjdXgdUkhYmjYlgThcOd^H[U=RL4PJ0F?%P@)kP;WG„NB‰D=–C?´VT»SR¾PQÂNOÄLMÆLKÅKHÆJHÔRTËFGÄ<<Ç;:ÑA@ÔE?ÏB9Ç>4ÉE9ÈF9ÊG=ÍG>ÒGDØCEÜAEß?GáCDáCDáCDâDEâDEáFDáFDáFDàEAáC@àB?ßA>àA=àA=â@=ãA>ÑFAÉB<¼=6¬:0 90“;/‰=0=0A4|@5}?4<3ƒ:3†91Š71Œ72…<-…<-„;,„;,ƒ;-‚:,‚:,‚:,9-9-9-~:/~:/~:/~:/~:/}90}90}90}90}90}90|90|90|90z:0z:0y9/y9/x:/w9.w9.w8/w8/t8.s7-r6,r6,p6+p6+k1&q7,m4)l3(o6+l3(p7,~H<‚SK„TJˆQJ‹PJ‘PL•OM–PN–RO‹OG…SH€[K{ePsiPhkLdrOgxT\uKXoEPf?Ka:K_:K\:GV7CP4<F-8@)6;'7:)<=/?@2@>2><03;03;05;/6<09=/<?.>A,>D*Q[9^mDmPpŒRr’Sq™RsSsŸRxža|¢exžak‘T`†I]ƒF]ƒF\‚E`†Ia‡Jc‰Le‹NdŠMbˆK`†I^„G]MRtBIk9i`Qi`Qi`QjaRjaRkbSkbSkbSjaRjaRjaRjaRjaRjaRjaRjaRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlcTtbTo_Pm]Pm_ToeYog\keYhbVfbVpl`{xi~{jzgzuapiVf`JPV<DF.A?(MB.S@/U8(^6*m=3p7.x71:3‰@9•HBžOH¦WPª\RÁ[W»RO¸FE½A?ÉCBÑFCÓD@Ð?:ÐA9ÐC:ÐE>ÔG@ÖGCÚFFÛEFÝDGáCDßCDßCDßCDàDEßECßECßECÞDBÞE@ÝD?ÜC>ÜC=ÜC=ÝB=ÝB=ÕF@ÎE=ÃC:³>5¢:/’8-ˆ9,<-€A2~@3}?2=1ƒ:1†91ˆ81‹80…<-„;,„;,„;,‚:,‚:,‚:,€:.9-9-9-~:/~:/~:/~:/~:/}90}90}90}90|90{8/{8/{8/{;1{;1z:0y;0x:/x:/x:/x:/t8.t8.s7-s7-r6,q5+o5*o5*k1&o6+m4)k2'n5*i3'm7+}G;†QI‡PIŠQJŽQL‘RM“RN•TP’UPVO‡[P^OtbNoiQnrWjwYfwWPf@K_:EY6BV3EV6GV7FU8ER8?I1<D-9>*7;*:<.<>0<=/:;-5<45<46<26<09=/<>0=@-=C)MV7Zi@h|KlˆNpOq™RuŸSt Sz cw`n”Wc‰L\‚E\‚E\‚EZ€C_…Ha‡JbˆKdŠMc‰La‡J_…H]ƒF[}KPr@Gi7i`Qi`Qi`QjaRjaRkbSkbSkbSjaRjaRjaRjaRjaRjaRjaRjaRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlcTtdWqaTm_Rk_SkaWlcZle[jf]jf]wuiˆ„y‘•’Œ|‰‚r€ygZfNLV>AI2CF1ED0D?,I=-TD5M:+O8*R6*T7)X8+];/a?3eA5‹KAœSL­UQ¶NK½EDÇABÓCCÛEF×?>Ø@=×B>ØD@ÙEAÚFDÛEDÛEDßCDßCDÞDDÞDDÞDDÝEDÝEBÜGCÛFBÚE?ØE>ØE>×D=×D=ØE=ØE=ÖC<ÔE?ÊE>»@8§;/–8,‹9+…;.‚@2@1~?0=/;/„:/‡9/‰90„;,„;,ƒ;-‚:,‚:,‚:,9+9-9-9-~:/~:/~:/~:/~:/~:/}90|90|90{8/{8/{8/y9/x8.{;1y;0y;0y;0x:/x:/v:/v:/s7-s7-s7-r6,p6+o5*o5*n4)j1&o6+l3(h2&k5)h2&l6*|F:ŠOGŒPHQIRMSN’UPWPŽYQ‰]R…aUy_PiZGd_IciOZgKN]@EU8AQ4=M0<K.?M3CQ7FR:GS;BK6>G2:A/7>,9=,9=.8<-7;,6=66=66;46<29<1;=/<?,<A*JS4Ve>dxGj†LpOs›Tw¡Uw£T{¡dr˜[e‹N\‚EZ€C\‚E\‚EZ€C_…H`†Ia‡JbˆKa‡J`†I^„G]ƒFY{INp>Ef7i`Qi`Qi`QjaRjaRkbSkbSkbSjaRjaRjaRjaRjaRjaRjaRjaRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlcTseXugZsg[mcYjaXle]snhzwp~w† –©¥œ«§œª£™£‘œ”‰v~i`hSLSADK9AJ7>G4>G4BI7GN<FJ9CF5?@0=;,<:+<9*<9*U5(lD8‹PHŸPL°HIÂEIÏDIÖAEÙ>BÛ?@ÛAAÛC@ÚEAÚEAÚEAÚEAÞDFÞDFÞDFÞDDÝEDÝEDÛEDÙEAÚFB×FAÕF>ÔE=ÓF=ÓF=ÓF=ÔG>×@9ÕB;ÏD=ÁB9®>3œ:-‘;.‰=/„?0?/~?0=/<-„:-†:-ˆ:.ƒ;-ƒ;-‚:,‚:,‚:,9+9-9-9-~:/~:/~:/~:/}:1}:1}:1|90|90|90{8/y9/x8.x8.v8-y;0y;0x:/v:/v:/u9.u9.u9.s7/r6.q6.p5-o4,n3+m4+m4+j1(o6-j4*h2(j4*g1'k5+zF;MGNH‘PJ’SLUOŽWPŠZP…ZQ{YMv\OkZJ]UBYXDY^HOYA>L3;G18D.5A+5A+8D.=I3AM7EN;BK8?H5<E29B/7@/7>.5<,4;+5;75<56;56;48;2:</;>-;@)GP1Ra:buGi…Kq‘PuVy£Wx¤Uzcn‘W`ƒIZ}C[~D^G^G]€F`ƒIa„Jb…Kb…Ka„J`ƒI_‚H^GW{KLp@Bf6haQhaQhaQibRibRjcSjcSjcSibRibRibRibRibRibRibRibRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlcTmaUndXpf\lcZkd\rmg„|‘‹¥¤ ³²®ÄÁ¼ÉÆÁÉľÅÀºÀ¹±¹²ª¤œˆ‚tfcTPQAEI8=F38E18G45F35F44E36D58D6;E:?G<@H=<6(L</b@7EA£OOÁW[ÎOVÍBI×DJÚDFÝDFÝEBÝEBÞE@ÝD?ÞC?ÞDFÞDFÞDFÞDFÜDCÜDCÚDCÙECÙEA×FAÕF@ÓF=ÐF<ÏF<ÐG=ÐG=Ø=8×@9ÑB:ÆC9¶A7¤>0–=/Œ=.†>/‚?/€>.=-<-ƒ;,„;,‡;-‚:,‚:,‚:,‚:,9+9-9-~8,~:/~:/~:/~:/}:1}:1}:1}:1z:1z:1y90y90x8/v7.v7.v7.u9/u9/u9/s9.s9.s9.r8-r8-q6.q6.p5-o4,n3+m4+l3*l3*h2(l6,i3)f2'h4)e1&i5*xD9’KE’MF“PJTLVO‡XNYO|\Os\Nk[L_XFUTBPS@JQ?@I64@,3<+2;*09(09(2;*5>-9B1<E4?H7=H7<G6:E48C25A-3?+1=)3973954954937:19;0;>-;@*CL/O^7_rDi„Mr’SwŸXy£Wv¢Us–\f‰OZ}CX{A\E]€F]€F^G`ƒI`ƒI`ƒI`ƒI`ƒI_‚H^G]€FVzLJn@Ae7haQhaQhaQibRibRjcSjcSjcSibRibRibRibRibRibRibRibRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlcTiaVjbWkdZmf^upjˆ…€Ÿžš°°®ÂÂÀÓÒÐâáßéåäçãàãÞÚÞÖÓ×ÏÌÒº°º¤™˜†zym__YIKL:>F19E1<K8;J79G68D68@57<57947836A3>>2J91`94ˆHH²\_È_dÍVZÐOSÕMOÚLKÜJJàHEáFBãDAåA?ÞDFÞDFÞDFÝCEÝCEÜBBÛCBÛCBÚDCØD@ÔE?ÓF?ÐF<ÏF<ÐG=ÎH=Ý>8Ú?:ÒB9ÉC:¼C8«A4™<-Œ9)‡>-ƒ>.>-€=,€=,<,ƒ;,…<-‚:,‚:,‚:,9+9-9-~8,}9.~:/~:/~:/}:1}:1}:1}:1}:1y:1y:1x90x90w8/t8.s7-s7-s9.s9.r8-r8-q8-p7,p7,p7,p5-o6-n5,n5,m4+l3*i3)i3)g1'k7,h4)e1&h4)d0%f4)uC8•JE“LH“PJTL‰WNYOx[Mp]Nj^N]WGPQAKN=CJ:9B12:+08)36-17-06,/5+/5)17+2:-4<-9D4;F6=H7<I7:G56C/3@,1>*0640641622716929;0:<.:?)?H+KY5]pChƒLs“TwŸYw¡WržQiŒT^IUx@WzB[~F[~F[~F]€H_‚J_‚J_‚J_‚J^I^I]€H]€HUvKJk@@a6haQhaQhaQibRibRjcSjcSjcSibRibRibRibRibRibRibRibRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlcToh^ng_lh_tqj…„¡ ž¼¼ºÏÏÏÎÏÑààâòòòúøùû÷öøòòñìéêåâïÍÃàÀµÅ©¥€sbaZGML7CH2AI4AH6BF7BD7C@9D<9C98C772?5;@9@93H/+c76QR³giÇmmÂ[\ÉYWÑUS×QNÝKKåGFèBBê@AÞCGÞDFÞDFÞBEÞBEÝADÜBBÜBBÜDCÙCB×C?ÔC>ÒE>ÐE>ÏF<ÐG=â@;Ý@9Õ@9ÌC9ÀD:°B5›;-‹5&Š=-…=.>-€=,€=,<,ƒ<*„=+‚:,‚:,€:.9-9-~8,}9.}9.~:/~:/}:1}:1}:1}:1}:1{;2w;1w;1v:0u9/t8.s9.r8-q7,r8-q8-p7,p7,n8,m7+m7+m7+o6-o6-n5,m4+j4*j4*i3)h4)f2'k7,h4)c1&e3(b0%e3(uC8”JG“NIQJ‹TM„XOzZMq[Mh\LXUDHK:=D4=E69A208+/7*5=056157257247005.06,08-19,6A3:E5=J9>K9;J77F12A,0?*.42.420511605818:/:<.:?+<E*IW4[nAg‚Mr‘UvZuŸWo›Pb…MX{CSv>WzB[~FY|DY|D\G_‚J_‚J^I^I^I]€H]€H]€HSsJHh?>^5icSicSicSicSicSicSicSicSicSicSicSicSicSicSicSicSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUmdUmdUmdUmdUmdUmdUfc\gd]vsn“’ޝ¯­ÄÆÅÚÛÝìíïóôöö÷ùüüþÿÿÿÿþÿÿûúüööùôñÿÞÏöÖÇãÈ·É´Ÿ­ž‡ŠƒicbFGG-EG/DF0GD3IC5H;3F42G34M797@;;@:@;8G85cGF‘kjŔ譩ҋ‡ÇtnÀ]XÆSNÖNNâIKëEIðCGÜFHáHKÜCFÕ:>Ø>@âFIàDGÖ:;Ú@@Ú@@ÙA@ÖB>ÔC>ÑB<ÏB;ÏB;ãA<Ý@9Ô?8ËA7¾B8°@4;.8*‹>.†>/‚?.>-€=,<+=*=*9-9-9-~8,~8,|8-|8-|8-}9.|90|90|90z:1z:1z:1z:1x=5w<4v;3u:2t91r7/p7.p7.o6-m7-m7-m7-m7-l8-l8-l8-i2+m6/p92o81k4-g2*g2*h3+e0(i7.d2)^,#`0&_/%b2(p@6’LJOKŠQJ‚QJ}YMv_QfYIRO>CF5=F58C35@02=/3;04:04:077577566446135016/05..6+.9+2=/6C29H5:I68G42D./A+,20,2.-2..3-36/780:</:?+6>&DR1YkCh‚Ru”[wž_r›Wj•N\}HXyDTu@Tu@WxCZ{F[|GZ{F^JbƒNbƒN^J\}H_€K`L^JTrNFd@:X4icSicSicSicSicSicSicSicSicSicSicSicSicSicSicSicSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUmdUmdUmdUmdUmdUmdUed_onj…†¤¤¢ÁÃÂÖÚÛêîï÷ûþ÷ûþøüÿüýÿþþþÿþÿÿýüÿüùÿûøÿïÚüêÒîÞÅØÍ±À»¤£„‚ƒcgkJMP1II/EC,HA/J>2L93M85Q99;;9BA?MHE\RQyjg¢‹Ì³®åÇ¿ÿÙÏ괪̃|Àc\ÌVTÛPSãFMâ=DÕEEÕEEÙGHÞIKÛEGÖ<>Ö<>Ü@CÚ>?Ù??Ú@@ÙA@ÖB>ÓB=ÒA<ÐA;ß@:Û@;Ô?8ÌA:¿C9±A6 ;/‘9+Œ=.‡>/ƒ>.>-€=,<+€=,<,9-9-9-~8,}9.|8-|8-|8-|90|90|90z:1z:1{;2{;2{;2v=4u<3t;2s:1r90p7.m7-m7-m7-l8-l8-l8-l8-j8-j8-j8-l5.n70n91n91l7/i4,g2*e3*c1(e3*_/%^.$b2(^.$`0&n?5„IEˆQLˆWRWOrVKdRDQJ:>?/:A16A14A02>02<14<15;17:388677577557446116005./7,.8-1<.4A07E49H58G44E22D.062.40.3--2,14-45-8:-9=,7?'DQ3YkEh‚Sv”`wbp˜YfNZzHWwETtBTtBVvDYyGYyGYyG[{I_M_M\|J[{I^~L^~L\|JTmOF_A9R4icSicSicSicSicSicSicSicSicSicSicSicSicSicSicSicSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUmdUmdUmdUneVneVneVddby{x—™˜²¶µÍÑÒäéìôùüúÿÿûÿÿûÿÿûÿÿýÿþþþüÿÿûÿÿúÿÿúÿüßúùÛïðÐáåÄÒØ´¼Äž©‡’j`hCRW7DG,EC.KD4MC9N?8L=8C:;SJKi`a€xv›“¼µ¯×ÐÈçÝÓúêÝÿôéÿåÛ画Äec¸ACËBIáNVÚVRÒLIËDAÎBAÔFE×EFÙCDÛBD×=?Ø>>Ù??Ø@?×A@ÕA=ÓB=ÒA<Ü?:Ù@:ÔA:ÍD<ÀD<²B7¡<2“9.Œ=0‡=0ƒ>/>.€=-<+€=,€=,9-9-9-}9.}9.|8-|8-{8/}:1}:1{;2{;2{;2{;2{;2{;2t;2s:1p:0o9/n8.m7-k7,k7,l8-l8-j8-j8-j8-j8-i9-i9-n91m80m80m80m80i7.f4+c1(c3)a1']-#_0&c4*\-#_0&sD:OK‚UPXQqSK^J?OC7?<-37(2:+/<+0<.2=/4<15;17:37:388688668557257227016/08-.8-0;-2?.6C27E48G48G48G46=53:2/4-,1*.1(13(57*6:)6>'DQ5[lHk„Zy–fwœfl”X^‡KWwEUuCRr@Rr@TtBVvDWwEWwEXxF[{I]}K[{I[{I]}K\|JXxFPfOAW@3I2icSicSicSicSicSicSicSicSicSicSicSicSicSicSicSicSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUmdUneVneVneVneVofWgklƒ‡ˆ£§¨¹¾ÁÐÕØåíðóûþõýÿùÿÿûÿÿüÿÿüþûýþùþýøÿþ÷ÿÿöóÿâñÿÞëùÖäòÎÛêÃÌÛ²³Â™ ¬„}‰cdnKLS4EI0HJ5KI:GE9D@7QEEk__‹€¤š™µ°­ÊÇÂÜÜÔççÝ÷óèÿýñÿøíÿÝÕú·±èŽŽÌbd±>CÃPIÉTMÉOJÃF@ÊFBÔMJØJIÑ??Ò>>Ô>?Õ?>Ö@?ÕA?ÓB?ÓB?ÒC?×>8×?:ÒC=ÌE?ÀE>±B9¢=5•;2Œ<1‡=0ƒ=1=0=-~<,€=-€=-~:/~:/~:/}9.}9.|8-{8/{8/~;2|<3|<3{;2{;2z;4z;4z;4p:0o9/o9/m9.l8-k7,j6+h6+i7,i7,h8,h8,h8,h8,h8,h8,o:4j81h6/i70j81j81e4-a0)e4-b1*].&a2*b3+Y*"_3*zNE~]XvWRiNGWC:J<3@:.:;-8<.08)/:,1<.2=/5=25;169078079468368349338138119.19..9+/:,1<.2?.5B18E4:I6;J7;C87?428.-3)-0%/1&24'48)4<'ER8_pPr‹d}šnwœifXT}EUrBTqASp@Sp@TqAUrBVsCVsCWtD[xH]zJ\yI^{K_|L\yIVsCK\J<M;.?-gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUmdUneVneVofWofWpgXmru‡Œ¤©­·¿ÂÍÕØãíïòüþôþÿøÿÿøÿþúÿüûÿúûþõúüñùùíù÷ëòÿçñÿäîÿßëúÙçõÒÝéÅÈÒ­´¾™œ¤|ƒbX_@GL5DL7DK;AG9>D8f\Z†|z«¡ŸÁ·µËÃÁÕÐÍãâÞîïé÷øðùöíüòèÿóéÿóíÿäß즤´if«K=³QDÁYNÇ[QÆQH¿D=ÂA<ËD@Ë@=Ï?>Ð@?ÑB>ÒC?ÒC?ÑC?ÑC?Ö>9Ô@<ÒD@ÉE@½D<¯@9 >5•<4Œ<3‡=2ƒ=1=0=/~<.=/€</~:/~:/~:/}9.}9.{8/{8/{8/~;2|<3|<3{;2z;4y:3y:3y:3m80m80l7/l7/k6.h6-h6-h6-h8.h8.h8.h8.g8.g8.g8.g8.k92h6/f4-g5.i70h70e4-b1*b3+b3+_0(_0(]1(V*!b6-SJn[U`OHN?8A7.=6,;9-9;.7=12:-3;.4</6<06<07:167/56.49249238139/39/2:/19.19,.9+.9+/:,0;+2?.6C29F5;H7=E6:B35;-06(/3%/1$13&15&29'GS;dtWwm~šrq•g\‚QIq?Qn>Qn>Qn>Qn>Qn>Qn>Sp@Sp@WtD[xH]zJ]zJ_|L_|LZwGQn>ESF6D7(6)gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUneVneVofWpgXpgXpgXinrz‚…“š «´¹ÄÍÒÜåêì÷ùôþÿôþýöÿüúÿúûÿ÷ûþóøúìõöæòóãòþêôýèôüåóøáòöÛëëÏØ×¹ÅÄ¥±°’ŽregOMP;EL:EM>EODGSG~zqŸ›’ƽ¸ÙÎÌáÓÒçÛÛôêéü÷ôðïëûüöÿÿöÿþôÿúñÿôêÿçÞÿÚÒß‘}·fS¢K:²UF½WKµF;·@8ÈKEÇC>ÊC?ÌB?ÎC@ÎC>ÍD>ÍD>ÌC=Ô@<ÒC=ÎE?ÅD?¸A;ª=8ž;5•<4Œ<3‡=4ƒ=3=2=1~<0=1=/~:/~:/~:/}9.|90{8/{8/{8/|<3{;2{;2y:3y:3x92w81w81m80l7/j8/j8/i7.i7.g7-g7-g7-g7-f7-f7-f7-f7-f7-d8-i70h6/g5.f5.g6/h70g6/e6.a2*e6.^2)\0'`4+a5,i=4|PGQJBE>6:6-85,99/8:/47,36+4:.5;/5;/69.69.68-57,46+19,19,19,19,19,19,19,19,08+.9+.9+/:*0;+3>.6A17B2<E4:C28?/5<,37)24'13%04%07%HT>gw]umv‘nf‰_RwKAh;Mj:Nk;Pm=Pm=Nk;Nk;Ol<Qn>VsCZwG]zJ^{K_|L_|LVsCLi9=H@/:2#.&gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUneVneVofWpgXqhYqhYcjpmtz„’£¬±¾ÉÍÓÞâåðòðüüòüûõþùøÿ÷úÿôüÿòúýìøùçöøãööìù÷ëúöêýöæÿôâøëØçØÁÖÆ¯À±šŸ“}vn[ZWFOQCQWKYcZbme–˜‹²²¦ÕÎÆêÜÙõããüéëÿñôÿ÷ùÿýýýþùøûôõûñúýòÿÿóÿÿóÿÿñÿãÊ¹q[¨WD¬SCµQB¹MA¿JAÂG@ÆE?ÉE@ÊE@ÊE>ÉD=ÈC<ÈC<ÒC?ÒD@ÌEAÂC=³=9¦;5œ;5•<6Œ<5‡<6ƒ=5=4<3~<0=1€<1~:/~:/~:/}9.|90{8/{8/y90{;2{;2z:1x92w81v70v70u6/k90j8/j8/j8/j8/h8.h8.h8.g7-f7-f7-f7-d8-d8-d8-d8-h6/h70i81i81h70i81j;3l=5g80k<4b6-a5,oC:xLCtI@uJA:=647036/7:18;247.14+25,58-58-57,46+46+46+46+46)/7(08)08)08)08)08)08+08+19,08+08+/7*08+19,3;.4</9B/:C0;B0:A19=.68*24&/3$29'IU?eu[m„ghƒbWyTInE>e9Jg9Li;Nk=Nk=Li;Li;Mj<Ol>UrDYvH[xJ]zL^{M\yKQn@Eb47@;+4/!*%gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUneVofWpgXpgXqhYriZhowmt|‚‹’¥®µÂÍÑÔßãäïñòþþóýüôÿùöÿ÷úÿôüÿñýÿíýÿêýÿêÿöñÿøóÿ÷ïÿ÷íÿöëÿïáöÜÍäʹƯ§”ƒ€sce]P[YM_bYovo|…€¦­¾À³ÚÖÍñãàÿìíÿñôÿñ÷ÿñ÷ÿ÷ûûúøøÿøøÿúôÿõîÿïòÿï÷ÿóÿñÖÿðÖÿȰÅ}g¢O=®Q@¸RD³C8ÀIAÄH@ÇF@ÇF@ÈE=ÇD<ÆC;ÆC;ÓD@ÐE@ÊE@¾A=±;7£74š93•<6Œ<5‡<6ƒ=5=4<3~;2<3=1~:/~:/~:/}9.|90{8/{8/y90z:1z:1y90w81v70u6/u6/t5.k90k90j8/j8/j8/i9/i9/h8.f7-f7-f7-d8-d8-d8-d8-d8-f5.i81l;4k:3j92j92m>6qB:n?7pD;g;2g;2SJŒaXTKpE<6=52913:27<5492/5+25,9<345-35*24)13(13(35(46)57*,7',7'-8(-8(-8(-8(-8(/7(19*08)08+/7*/7*/7*08+08+7@+9B-=D2=D2=A29;-35'/3$3:*JVBcr[f}a\wVLnICgA=c:He7Kh:Nk=Nk=Kh:Jg9Li;Nk=TqCWtFZwI[xJ]zLZwINk=A^05;9*0.!'%heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheTheVhdYkd\kd\md]meZmfVg`MjeOnlWnl]ff^eeeqqy‡‘“–ž¡«³¶ÃÈËÙÝàìíï÷÷÷ûùúþýûÿþúÿÿûýþøûüöùüóúýôùÿõùúõùúôøúïúûëûýèöùÞäçÈÒÖµ¶¼š”›ymvW\fK`lTq~lƒ‘€žŽ··µËËÉââàïïíôôòøøöúúøùù÷þþüþþüþþüþþüþþüþþüþþüþþüæÿÿðÿÿûÿÿýïîЪ§ a\™D=¸MEÄKBÈC:ÊA7ÎD:ÑH>ÏJAÉI>ÆG>ÁJ2¿K4¹L5¯K4 H2”F2ŒE3‡E5‚D5C6€@4‚>3…;2‡9/Š7/6-~:1~:1}90|8/{7.z7.y6-x5,w7-w7-x8.x8.v8-u7,s5*q3(h91h91h91g80h70g6/g6/g6/f5.h6/i70j81i70h6/f4-g2,k1-k4/n70m80k9.j:.i>.iB1dC2gJ8aJ8raOyn\ƒ|j…‚qOL;4:04:04:039/39/39/28.28.17-17-17-06,06,/5+/5+/5+/4./4./4./4./4./4./4./4.05//4./4..3-.3-/4./4.05/0;32=55A77C98D86B64@22?.3@.DQ=WeN\jSSaHHV=DR8FT:Ic>Ke@Ke@Ke>Je<Je<Lg>OjAUpGYtK\vO]wR]wTWpPHaC8Q3).2&+/$)-heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheTheVhdYkd\kd\md]meZmfVjcPlgQmkVlj[gg_lll~~†’ž§±³¹ÁÄÏ×Úâçêðô÷ûüþÿÿÿÿþÿþýûÿþúÿÿûþÿùûüôøûòøûò÷ýóøùóøùñøúíøùéùûåòõÚáâÃÌЯ´¸—‘–vkrSYaI_kUtoŒ˜Š›©œÀÀ¾ÓÓÑççåóóñ÷÷õûûùüüúûûùþþüþþüþþüþþüþþüþþüþþüþþüîÿÿôÿÿüÿÿÿüúÿíêñ¿¸Ã}u¢J@³K@»J<ÅK>ÈJ>ÄD9½=2¿?6ÃD;ÂH3ÃJ7½M9³J7¦G5™C4D6‹F7ƒC7C8A7>5‚<4„:1†91‡81}:2}:2|91z:1y90x8/w7.v7.u6-v7.t8.t8.t8.r6,p4*o3)i81i81i81h70h70h70g6/g6/e3,e3,g5.h6/j81j81j81k92k60l71m80l:1k;/l>1j@0iD2hG6kP=gR?ufSvd‹†s†ƒrML:4:039/39/39/28.28.28.17-17-17-17-06,06,/5+/5+/5+/4./4./4./4./4./4./4./4.05//4..3-.3-.3-.3-/4.05/-80/:21=34@66B66B66B45B16C1CP<P]IR`IIW>AO6BP7FT:Ic@Jd?Ke@Ke>Ic<Hc:Id;Je<SnEXrK\vQ]wT[tTTmOC\>3L/).2',0$)-heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheTheVhdYkd\kd\md]meZmfVmhTmhRmkVjk[jkcvxw‘‘™¨ª¶¾ÈÊÓÛÞêòõ÷üÿüÿÿþÿÿÿÿÿÿþÿþýûÿþúÿÿúýþøúûóõøïóöëñ÷ëô÷îöøíöøêö÷åõ÷áîîÔÛÛ¿ÉÊ«°±’“–yuy^kpZt{iˆ§œ¬¶­ÎÎÌÞÞÜïïíøøöûûùþþüþþüýýûþþüþþüþþüþþüþþüþþüþþüþþü÷ÿÿùÿÿþÿÿÿüúÿúôÿöíÿÑÄÙž•L=§Q@¬K;ª>1¸G9ÑXMÐTJ¾?6ÆD6ÇH9ÄJ=¹I=ªB7?5•A7’E=‡A9„A9@:>8~>5<4<4€;4x<2x<2w;1w;1v:0u9/t:/t:/s9.r9.r9.r9.q8-n8,l6*k5)j81j81j81j81i70i70i70h6/g5.g5.g5.g6/h70i81k:3k:3l;4k:3i:0j;1k?2lB4iD2fE2fI7lVAjYEviV†l‘Ž{€mEF439/28.28.28.17-17-17-06,17-17-17-06,06,/5+/5+/5+/4./4./4./4./4./4./4./4./4./4..3--2,-2,.3-/4./4.*5-+6.-9//;12>24@46B47D38E3?L:ER>CQ:;I28F->L3ES:H`>Jb@LdBKc?Ia=G`9F_8G`9RkDXpL]uS^vVZqTPgK=T8,C)).2',0%*.heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheTheVjcYkd\kd\md]meZmfVniUljSlkVlm]pqi€‚ž¡¨º¼ÈÃÍÏÜäçóûþûÿÿúþÿüýÿýýýüûùÿþüÿÿûÿþùûüôõöîîñæëîãçíáíñãðôåñôãòôßðòÜêêÐÙØ¼ÈÇ«²±•¡¡‡‘“}‘’€œžª­¢¶»´ÀÅ¿ÜÜÚééçööôûûùýýûÿÿýÿÿýýýûþþüþþüþþüþþüþþüþþüþþüþþüüúÿÿþÿÿþÿöòïûôîÿýóÿûíÿõäêı·ƒn”Q>¡P=¸XH¸L?¸D7ÀG<Ç>4ÉD;ÈH?¿F>°?9¢;6š=8–A>?;‡@<@<}@;z?9y@9x?8v?8v=4v=4v=4u<3s=3r<2r<2q;1o;0o;0o;0l:/k9.j8-j8-i7,n72n72m61l71l71k60i70i70l:3j92h70g6/f7/f7/h91h91j?6f>4e=1f>2hC3iE5gF3cG2cJ6hV@k\GskV‡‚nŽzor_9>*28.28.17-17-17-06,06,06,17-17-17-06,06,/5+/5+/5+.3-.3-.3-.3-.3-.3-.3-.3-.3-.3--2,-2,-2,-2,.3-.3-)4,)4,*6,+7-.:01=14@25A36C2:G5<I58E12@)2@)8F/?M4DX<G\=K`ALa@K`?I_;H^:H^:SiEZoN`uV`tXZnSNbI9M4(;%',/%*-$),heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheTheVjcYkd\kd\md]meZmfVlgSkiRnmXop`svmƒ‡†£¨®¿ÃÎÍ×Ùçïòùÿÿûÿÿùýÿýþÿÿÿÿþýûÿÿûÿÿúþýø÷øðïñæçêßâæØÞäÖçëÚêïÛíðÛíïÙîîÖéçÎÚØ¿Îʱ½§¹´ ±®¶´§Á¾µÉÈÃÒÓÎÙÙ×èèæòòðúúøüüúýýûÿÿýÿÿýüüúþþüþþüþþüþþüþþüþþüþþüþþüÿûÿÿûÿÿúúûûùûÿùûÿøüÿôýÿíÿÿìõàËÈœcP–K8§L:¶O@»M>Æ=7ÈA;ÈD?ÀC?´<;©98 9:›==‘==Š>>„@?|A=xA<sB=rC=pC=s>6s>6s>6r=5p>5p>5p>5n>4n>4m=3l<2j;1j;1i:0i:0i:0p62p62p62o51m61m61k60i70l;4k:3h91e90e90e90e:1f;2dB6cA5cC4dD5fG5eH6cH3_I2^L6eV?jbKrmW„ƒn„‡r[`L3;&28.28.17-17-17-06,06,06,17-17-17-06,06,/5+/5+/5+.3-.3-.3-.3-.3-.3-.3-.3--2,-2,,1+,1+,1+,1+-2,-2,,6.+5-*4,*4++5,.8-0:/2=/2=-5@06A05A-1=)1=)5A+9E/=O5AS9FY=I\@J]?J]=K^>L_?TgG\oQcvZbtZYkSK]G6G4$5"&+.$),"'*heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheTheVjcYkd\lc\md]meZlfVlgSljSlnXorasvm…„Ÿ¤ª¸¿ÉÖßäîöùùÿÿûÿÿùýÿþÿÿÿÿÿþýûÿÿûÿÿúüüôóõêëíâãçÙßãÕÜãÓäéÒçìÕéíÖêìÔëëÓèæÏßÚÄÔθÔÍºÍÆ¶ËøÐÉÁÙÒÌàÛØëååòîïòòðùù÷ýýûýýûýýûÿÿýþþüüüúþþüþþüþþüþþüþþüþþüþþüþþüÿøüÿöùÿýýþÿý÷ÿýïÿøëÿõòÿøëúçÿÿíÿïÛ̧”£lX£ZG­VCªM;ÁA8ÃB<ÃD>¿D?·?>­;;£99œ:;–<<Ž>?…?=}@=wB<pC=mE=lF=q?8q?8q?8q?8p?8o>7o>7n?7o@8n?7m>6i=4h<3h<3h<3i=4r73q62q62p62o51m61l71j81h70g80e90e:1d<2f>4f@5gA6]C4aG8cL:dM;cM8`K6]K3]M4]Q9`Y?miPss[€„mt|eFO:2>(39/28.28.28.17-17-17-06,17-17-17-06,06,/5+/5+/5+-2,-2,-2,-2,-2,-2,-2,-2,-2,,1++0*+0*+0*+0*,1+-2,,6.,6.*4,*4+*4++5*-7,.9+-8*0;+4?/5@/4?.3>-3?+4@,7F/;J3@P6DT:GW<JZ?M]@O_BUeJ^nSdtZbqZXgRIXE4B1$2!&+.$),"'*heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheTjdVjcYkd\lc\md]meZlfVljUllTkmWjn]lrhy}•œ¢¯¶ÀÒÛàëòøùÿÿùþÿ÷ûþþÿÿÿÿÿúù÷ÿÿûþýøùùññóèéëÞãçØáåÖàç×äêÐçíÓèìÑçéÑèèÐçåÎáÚÇ×оÛÒÃÚÐÆÞÔËçÜØîäãóéêúñôÿøýùù÷þþüÿÿýýýûýýûÿÿýÿÿýüüúþþüþþüþþüþþüþþüþþüþþüþþüÿ÷÷ÿùùÿýýüÿÿôÿþêÿûíÿÿíÿýñÿúðûíÿþíÿûèôλ­va‘P:¦^H»I>ºH=ºH>ºG@·F@°C@¦=:97—<;‘=;ˆ>;€A<wB:sD<nF<lH<q?8q?8q?8q?8p?8p?8p?8p?8qB:pA9n?7j>5i=4j>5j>5k?6s63r73q62p62n72l71j81i81d8/d90c;1d>3d@4cA5cA5bB5VG4^O<gVBhWCbS<^O8[O5\R7]V<]Y>mmSsw^z‚jcmU2>(5C,4:039/39/39/28.28.28.17-17-17-17-06,06,/5+/5+/5+-2,-2,-2,-2,-2,-2,-2,-2,,1+,1++0**/)*/)+0*,1+,1++5-+5-*4,*4,+5,+5,,6+-7,,7)/:,2=/6A17B27B25@/4?.2?+5B.:G3>L5AO6ES:JX?M[BTbI]kTcqZ_lXUbPERA2>0#/#(..&,,$**heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVjdTjdVjcYkd\lc\md]lfZlfVomXmmUimVgkZembr{xŽ—œ¨±ºÊÓØäëñöþÿ÷üÿøüÿþÿÿÿÿÿúù÷ÿÿúýýõøøîðòåéëÝåéÚåéØåìÚæíÎèïÐéîÐæéÎèæÏèãÏáÚÈÙÏÃÚÍÄßÒÌìÞÛúììÿôöÿõùÿõûÿøþýýûÿÿýÿÿýþþüþþüÿÿýÿÿýýýûþþüþþüþþüþþüþþüþþüþþüþþüÿüúÿýúÿûøùýüøÿÿôÿÿðÿÿêþüðÿûùÿûÿÿôÿöæÿôßÿãÍ×­”¢sY°SA®Q?®N>°O?±OB¯J@¥C:š<4—<7‘>8‰?6ƒ@7{B7tD6qE8nG8s>:s>:s>:q>:q>:q>:q>:p?:sB=rA<p?:m>8l=7l=7m>8n?9r73r73q73n72m82j81i81f:1f;2d>3d@4bB5`C5]A3\@2[?1QI4[S>f^Gg_H`Y?ZS9ZS7\W:ZV;WW;knSrx^u}eUaI%37E.4:04:04:039/39/39/28.28.17-17-17-06,06,/5+/5+/5+-2,-2,-2,-2,-2,-2,-2,-2,,1++0*+0**/)*/)+0*+0*,1+)3+)3+*4,+5-+5,,6--7.-7,,6+.8-2=/6A39D69D67B46A1/<*2?-5B09F2<J3@N7FT=JXAR`I[iRanZ\iWQ^MBN@/;/!-!+1/(.,&,*heVheVheVheVheVheVheVheVifWifWifWifWifWifWifWifWkeUkeWkdZle]md]ne^mg[mgWqoZkmUkoXkr`jrgozv†‘•Ÿ©²»ÄÉÑØÞèðóöûÿúþÿþÿÿÿÿÿþýùÿÿúþþöúúîöøêô÷æðôãìñÝçïÚð÷ÖíòÒëîÑììÒèæÏáÜÉÝÕÈÞÔÊáÔÎèÚ×òääúëîÿñöÿ÷ûÿùÿÿúÿþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿþùÿþùþþüýÿþûÿÿúÿÿøÿÿúÿÿüÿÿÿÿÿÿü÷ÿüñÿýìÿûåÿóÛÿíÑÁe¦cI—O7 T=ªYF¤Q?ŸI:¢L?;0Œ=0‡=0=/x=/t?/rC3sE5s<9s<9t=:s>:u@<u@<t?;q>:s@<r?;q@;q@;p?:o>9o>9o>9n72n72n93m;4l;4j;3g<3d<2c?3^>1dG9cG9T=-O8(M8'D/TR;PN7KI0MK2]Y>ieJeaDVU7XX<]`CosXz€fcmT=I1,:#1?(5;15;14:04:04:039/39/39/39/39/39/28.17-17-17-06,16016005/05//4./4./4./4.,1+,1+,1+,1+,1+,1++0*+0*.5.-4--4-,3,-4--4-.5-.5-+2*-4,08-5=29A6=E:?G<AI>7B25@03>-1<+2>*9E/BN8IU?O[EVbN]hWYdTLWI<F;/90)3*)/-(.,'-+heVheVheVheVheVheVheVheVifWifWifWifWifWifWifWifWkeUkeWkdZmd]md]mf^mg[khWonYjlTjoXkr`jtiq|x‰”˜¡®¶¾ÇÌÓÚàéðö÷üÿûÿÿþÿÿþþüþýùÿÿúþþôûûï÷ùëô÷æðõáìñÛæî×êðÎæëËäçÊææÌãáÌßÙÉÝÕÊßÔÎçÙØíßßöçêýîóÿôøÿ÷ûÿúÿÿûÿþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüúÿùûÿúýÿüþþþÿýÿÿüÿÿúÿÿúÿÿûÿÿûÿÿúùÿüõÿþñÿÿìÿüãúöÛÿéÌß²•§uZ‘[A–ZB›YCœUAšQ>F5F4‰D4…D2}B0yB.s@-o?+v?:t=8u>9v?:t?9q<6r=7sA:q?8q?8q?8o>7o>7n=6n=6n=6l;4m<5m>6k?6j?6h@6eA5cA5dG9[A2^G7\I8N=+F7$G8%A4!IM4GK2DG,BE*MM1[[?abC`aBYY=dgJsw\sy_X`H8D,/;%6D-7=36<26<26<25;15;15;15;15;15;15;14:04:039/39/39/27127127116016016005/05/.3-.3--2,-2,,1+,1++0*+0**1**1*)0))0))0)*1*+2+,3,.5--4,.5-07/4;39@8?F>BIA:G69F56C13@.2?+5B.;I2?M6KXDR_KXeSVcRKWI<H<0<2*6,+1-*0,)/+heVheVheVheVheVheVheVheVifWifWifWifWifWifWifWifWkeUkeWlcZmd]md]mf^mg[khWmlWimTjoXktaiuiq}yŠ˜›¤³ºÀÉÐÕÜâëòø÷üÿúþÿýþÿþþüþýùÿÿ÷ýýóúûí÷úéô÷äïôÞéîØãëÓâèÆÞáÂÛÞÁÞÞÆÞÛÈÞÖËßÖÏäÙ×îâäóçëúîòÿôøÿ÷ûÿøüÿúýÿüÿþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü÷ÿúøÿüúÿþþþÿÿûÿÿúÿÿøÿÿ÷ÿÿøÿÿùÿÿúúÿýøÿÿôÿÿñüÿíöþçÿóÙÿùÞÿíÓâÀ¥«ƒj‡YA…Q;“[D—]GR=€F2w=)t=)t@+vC.xE2s>8p;5q<6vA;sA:p>7r@9xG@n=6n=6n=6m>6l=5l=5l=5l=5g?5h@6gA6gC7eC7cC6`C5^D5aL;UB1ZI7`S@RG3C;&E=(GA+>G,BH.@F*<@%?B%LO2_`AijKaaEnqTvz_gmSHP84<%4=(=F18>48>48>48>47=37=37=36<28>48>47=37=37=36<26<26<25:449349349338238238227105/05//4..3--2,,1++0*+0*(/((/((/((/((/()0)*1*+2+070.5.+2++2+.5.5<5<C<AHA?L;>K:<I78E34A-2?+3A*5C,DQ=KXDQ^LQ^MHTF<H<2>4-9/-3/-3/,2.gdUgdUheVheVheVheVifWifWifWifWifWifWifWifWifWifWleUldWlcZmd]md]mf^mg[khWmlWimThpXht`hthm|wˆ—𥴻ÀÉÐÔÛáéðööûÿúþÿýþÿÿÿýÿþúþþöýýñúûí÷úéô÷âîóÝçìÕàèÐÜà¿×Ú»ÖÖ¼Ù×ÂÝ×ÉßÖÍåÛÙìàâøìðüïöÿõûÿùþÿúýÿûûÿûûÿýúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüöÿþ÷ÿþúÿþþþÿÿüÿÿùÿÿøÿÿ÷þÿøÿÿøüÿùùÿýúÿÿøþÿøúÿõöÿóÿþìÿýéÿòßÿñÛÿðÚñÒ½³zyS<tJ2uH1wI2{M6~O;zK7o@.e8%{LBsD:qB8sD:qB8g;0d8-h<1j>3i?3i?3i?3f>2f>2f>2f>2aA4`C5`C5_C5^D5[D4ZE4VE3XI6OB/\T?oiSc^HMK4IG0LJ3;E*?H->G*<B&<A#FI,VY:deFmmQxx\tw\[_F@D-6;%8@+<D/9?59?59?58>48>47=37=37=39?58>48>48>48>48>48>48>47<67<67<66;56;56;55:45:438238216005//4.-2,,1+,1++0,+0,*/+*/++0,,1--2.-2.051.3/+0,+0,-2.2738=9<A=?L;@M<@M;=J88E13@,1?(0>'<I5BO;HUCIVEDPB;G;2>4.:0.5..5.-4-gdUgdUgdUheVheVifWifWifWifWifWifWifWifWifWifWifWleUldWlcZmd]md]mf^mg[khWkmWjnUiqYgs_drejyt…”—¡²¹¾ÇÎÓÚâèïõôùýùýÿýþÿÿÿýÿÿúÿÿøÿÿóþÿñûþë÷úåðõÞèîÔàéÎÛܽÕÕ¹ÑÑ·ÔѾÚÔÈáØÓêàßôéíþóùÿöþÿûÿÿýÿÿþÿÿþúÿþúþÿùþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüøÿÿøÿÿûÿÿþþþÿýþÿûüÿûúÿúúÿùùÿù÷ÿù÷ÿüùÿÿûþÿûûÿüùÿûùôîÿÿöÿþôÿýóÿüîÿ÷çùçÓéӾϴŸ¶š„•u`yVBlI5mH6rM;uP>mF7iB3gB2jE5nI9oJ:pK;oK;eA1eA1cB1cB1cB1cB1cB1bC1\G6\G6\G6ZG6YH6WH5TG4RG3PH3MH2fdM~~fprZVX@IM4HL3;E*<F+?H+AG+AF(DG*MN/TU6xw[{z^nnTUU=AC-?A,>A.;>+9?59?59?58>48>47=37=37=38>48>48>48>48>48>48>48>49>89>89>88=78=78=77<67<66;55:449338227105//4./4.-2.-2.,1-+0,+0,,1--2.-2.,1-,1-,1-,1-.21043376598:H7=L9@O<@O:<K67F/4C,2A*6E.:I4@O<BP??M>8F91?2,9/.5.-4-,3,fcTfcTgdUheVheVifWjgXjgXifWifWifWifWifWifWifWifWleUldWlcZmd]md]mf^mg[khWkmWioUiqYgs_bpcgxr‚”– ³¹ÁÊÑÕÜäéðöõúþùýÿýÿþÿÿýÿÿúÿÿöÿÿôÿÿñÿÿïúýèò÷àéïÕàéÎÙÚ»ÑѵÍË´Î˺ÖÏÅßÕÓìâãøíóÿöþÿùÿÿüÿÿýÿÿÿýþÿúýÿ÷þÿøþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýÿýþÿýþÿýÿþþþüþÿùþÿ÷ÿÿõýýóýýõþýøþýùÿþüÿýÿÿýÿÿþÿþùÿÿüÿÿúþúöõýøôÿþöÿþñÿþïÿûéÿóàöåÓåÓ¿Ò»©¹ŸŸƒuŽrd|]I}^JrVAaE0W;&Y=(Z?*X=(`E0`E0_F0_F0`G1`G1^H1^H1[L9ZM:ZM:XM9XM9UM8RL6QL6NL5QQ9ikS|€glrXSY?DM2>G,:G+<F+?H+DJ.EJ,DG*HI*ML.yx\tsWfdKTR;LJ5KJ6FE3<=+:@69?59?59?58>48>48>48>47=37=38>48>48>48>49?59?5:?9:?9:?9:?99>89>89>88=78=78=77<66;55:4493382382/40.3/-2.,1-+0,+0,+0,+0,+/.,0/-10.21/32/32/32.210A.5F3;M7>P:=O7:L47I/6H.3E-6H0:L6<M::K95F6/?2*:--4,-4,,3+fcTfcTgdUheVheVifWjgXjgXifWifWifWifWifWifWifWifWleUldWlcZmd]md]mf^mg[jiWjlVhnThrYfs_aqdhys…—™¤·½ÈÑØÛâêîõûøýÿúþÿýÿþÿÿýÿþùÿÿõÿÿóÿÿðüÿêøüåïõÛäêÐÛäÇÖÕ¹Î̳ÇŰÊÄ´ÐÉÁÚÒÐêßãöìôÿ÷ÿÿúÿÿýÿÿþÿÿÿýûÿùüÿøûÿöþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿûÿÿüÿþýÿýÿþúÿúøÿ÷÷ÿó÷ÿò÷ÿòøÿóûÿøýÿúÿýþÿüÿÿûÿÿúÿýõÿÿúÿÿüÿÿýÿÿþÿýýûúûõ÷ùìÿÿóÿÿïÿÿïÿþíÿýíÿöçÿîâüêÞúäÍýçÐáË´¥xt^GdP8aM5\H0\J2\J2\J2]K3\L3]M4]M4]M4WO:WO:VP:VP:TO9QO8PN7NN6MO7PT;`fLfoTU^CEO4AK0:G+=J.?I.CL/HN2HM/FI,OP1YX:qmRjfKa]D[V@YT@TQ>MJ9EB1;A7;A7;A7;A7:@6:@6:@69?58>48>48>49?59?5:@6:@6:@6;@:;@:;@::?9:?99>89>89>8:?9:?99>89>88=78=77<67<6495273162/40-2.,1-+0,+/.,0/,0/-10.21.21.23-12,01):'/@-6H2;M5=O7<N4:L2:L25G-7I1:L6<M::K96G70@3+;..5--4,,3+fcTfcTgdUheVheVifWjgXjgXifWifWifWifWifWifWifWifWleUldWlcZmd]md]mf^kg[jiWikUhnThrYgt`brej{u‰›©¼ÂÎ×Þàçïòùÿúÿÿûÿÿýÿþþþüþýøúúðúúîúûë÷úåó÷àéïÕÞäÈÕÞÁÓÒ¶ÊȯÂÀ«Å¿±ËļÖÎÌæÝâôêòÿöÿÿùÿÿþÿÿÿÿýÿúûÿùûÿöûÿôþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿùÿÿúÿÿüÿûÿþøÿúôÿõóÿòñÿðòÿñõÿóøÿöüÿûÿþÿÿüÿÿùÿÿøÿÿùÿÿúÿÿûÿÿýÿýýÿùýÿúÿûüÿúöüðùýîûüìýûìÿúìÿúîÿýñÿüñÿðÖÿûáíÜŸŽtaP6RB(XH.XH.[M2[M2\N3\N3[P4[P4\Q5\Q5TO9TO9TO9QO8PN7NN6KM5IM4JN5LR8S\AOY>?I.9F*?L0=J.AN2DN3HQ4LR6IN0JM0ZY;miLhdIc]C_YA_ZD`[GZUBQN=LI8=C9=C9=C9<B8<B8<B8;A7;A79?59?59?5:@6:@6;A7;A7;A7;@:;@:;@::?9:?99>89>89>8;@:;@:;@:;@::?9:?9:?9:?99>:8=95:6384162/40.3/.21.21.21-10-12,01,01-12-12$5"*<&3E/9K3<N6;M3;M3;M38J09K3;M7<M:<M;7H81B2,<//6..5--4,ZgM[hN\hP_iQakSckTfkWhkXfgUhgUheVheVjdVldWldYmeZjgVkhYkg[kg^kg^jf]hfZgeVfiVfkUenYbo^dqhsƒ‚–§®¶ÈÒÓÚàäéíò÷ú÷ýýùþúúÿøüÿôüþñöùèùúèø÷åòñÝïìÙìéÖáÞË×Ò¿Úͼ̿¯À²¥¿²©Â·³ÍÁÁÜÑ×êàèúòýüöÿþûÿÿþÿþýÿüýÿüýÿüýÿþþþþþþþþþþþþþþþþþþÿþüÿþüÿþüÿýúÿüùÿüùÿüùÿýùÿþúÿþúÿþýÿýüÿüûÿýþÿþÿÿþÿÿýþýûüÿþÿÿúúÿûøÿýøÿüöÿúòÿøïÿùñÿûÿÿýÿÿýþÿÿýÿÿûýÿüýÿþüýÿþÿÿÿþÿÿüÿÿýþÿý÷ÿþîÿÿæÿÿâööÜýûâãâÆ‰nTO2UN1RL,SJ+WN/UO/UN1TO1SO2QP4QP4PP6QM2PO3QO6PP6MO7KO6HM6EM5HQ6FO4AJ-?F'@G&EK)GM)FL(ST2RS3MN.JK,TT8bbHccIZZB[YB\ZC][B][B[Z>XW9UT6SR3KE/JD.FA-D?,A>/@>1??3>@5<=5;>59?59A67B48C57C57D3:B79A69A68@58@59A69A6:B7:B7:B79A6:B7;C8<D9=E:>F;7B:7C97A66A16?.4<-39-270.5./51-7/-9+-<%.B3J7O7Z 8Y$8W+:U2:R8;P==O?>O=:L6@R8EX:EZ;DY:>U93J0(>'.5-,3++2*ZgM[hN\hP_iQakSckTglXhkXghVihVifWifWkeWmeXmeZnf[khWkhYkg[kg^jf]jf]hfZgeVgjWglVfoZerajwnzЉ𫲷ÉÓÑØÞáéìò÷úøþþùþúúÿøûþóúüï÷úé÷øæõôâíìØéæÓåâÏÜ×ÄÑ̹˾­Á´¤º¬Ÿ¼¯§Á¶²ÌÀÀÛÐÖèÞæûóþý÷ÿþûÿÿþÿþýÿüýÿüýÿüýÿþþþþþþþþþþþþþþþþþþÿþüÿþüÿþüÿýúÿýúÿüùÿüùÿýùÿýùÿþúÿþýÿýüÿüûÿýþÿþÿÿþÿÿýþýûüÿþÿÿýýÿüùÿøóøíçòåÝöèßÿïçÿûÿÿýÿÿýþÿÿýÿÿûýÿüýÿþüýÿýþÿþýÿÿýÿÿýþÿý÷ÿþîÿÿæÿÿâ÷÷ßýûââàÇ‹‡lRM0TM0QK+SJ+WN/UO/UN1TO1SO2QP4QP4PP6QM2PO3PN5PP6MO7KO6HM6EM5HQ6EN3BK.AH)BI(GM+JP,KQ-NR/PT1VZ9^aBaaE[[?VV<UU=VV>VV>XV=YW>XW;XW9WV8VU7QK5OI3LG3ID1DA2B@3??3>@5<=5;>59?59A67B48C57C57D3:B79A69A68@58@59A69A6:B7:B7:B7:B7:B7;C8<D9=E:>F;<G?<H><F;;F6<E4:B39?38=67>76<83=51=/3B+9M*BY-Ia1Nq7Mn9Ji=Fa>AY?<Q>:L<:K9=O9DV<K^@LaBLaBF]A:Q7/E.-4,+2*)0(ZgM[hN\hP`jRakSdlUglXilYijXkjXkhYkhYlfXmgYnf[og\khWkhYkg[jf]jf]ie\hfZhfWgjWejTdmXgtco|sŽ›¬³³ÅÏÎÕÛÞåëñöúøþþúÿûùþ÷øûòõ÷êòõäðñßêé×áàÌÜÙÆ×ÔÁÐ˸ÆÁ®À³¢½° ½¯¤Ã¶®ËÀ¼ÖÊÌãØÞíãëüôÿý÷ÿþûÿÿþÿþýÿüýÿüýÿýÿþþþþþþþþþþþþþþþþþþþÿþüÿþüÿþüÿýúÿýúÿýúÿüùÿüøÿüøÿüøÿýüÿüûÿûúþüýÿþÿÿþÿÿýþþüýÿþÿÿýýÿýúüóîêßÙâÕÍëÝÔüëãÿûÿÿýÿÿýþÿÿýÿÿûýÿúýÿþüýÿýþÿþýÿÿþÿÿþÿÿý÷ÿýíÿþåÿþáøøàþüåá߯‰…jPK.RK.QJ-SJ+VM.UO/UN1UP2TP3QP4QP4OO3QM2ON2PN5OO5MO7KO6IN7FN6HQ6FO4CL/EL-FM,KQ/OU1SY5QY0W_8jpLy]qvVY^@LO4MO7QQ9QQ9QQ9SQ8TR9UT8WV:ZV;XR<VP:RM9NI6HE6DB5AA5?A6<=5;>5:@69A67B47B47C57D3:B7:B79A69A69A69A6:B7:B7:B7:B7:B7:B7;C8<D9>F;>F;>IA>J@?I>>I9?H7>F7>D8=B;>E>;A=6@85A39H1BV3Pg;ZrB]€F\}HVuIMhEBZ@9N;5G74E3<N8EW=NaCRgHShILcG@W=4J3180/6.-4,YgM[hN\hP^jRblTemVhmYjmZklZklZlj[liZnhZnhZog\ph]liXkhYjfZjf]ie\ie\hfZhfWehUbgQajUerao|s~Ž”¥¬¨ºÄÈÏ×Úáçìô÷öûþ÷ýûõúôóöíïñäèêÜãäÒÜÛÉÔѾÎË¸ËÆ³Ã¾«¼·¤Ä·¦ÇºªÎÀµÖÉÁßÔÐêÞàóèîúðùýõÿþøÿÿüÿþýÿýüÿüýÿüþýýÿþþþþþþþþþþþþþþþþþþþÿþüÿþüþýûÿýúÿýúÿýúÿýúÿüøÿû÷ÿû÷ÿýüÿüûþúùýûüÿýþÿþÿÿýþþüýÿüýÿýýÿýúýôïíâÜæÙÑðâÙÿðèÿûÿÿýÿÿýþÿÿýÿÿûýÿúýÿüüýÿýþÿþýÿÿþÿÿþýÿþõÿýíÿýäÿüßûûãÿþçâàÇŠ†mPJ0SL0SL/UL-VM.UO/VO2UP2TP3QP4PO3NN2PL1NM1OM4NN4LN6KO6JO8HP8JS8GP5GP3KR3MT3PV4V\8]c?fsGtU‡”i›s…lnuTZaBRV;LN6NN6MM5NL5OM6TP7WS:YU<ZT>XR<TO;QL9KH9GE8CC7@B7=>6<?6:@69A67B47B46B46C2;C8:B79A69A69A69A6:B7;C8;C8:B7:B7;C8;C8=E:>F;?G<<G?<H>>H=>I9?H7>F7>D8=B;=D=;A=6@85A39H1DX5Ri=]uEY|BXyDRqEIdA<T:2G4.@0->,6H2@R8L_AQfGShIMdH@W=4J329107/-4,YgMZhN\hP^jRblTemVgoZjo[lo\lm[mk\mj[nhZnhZoi]ph]liXkhYjfZie\ie\ie\ig[igXfiVchRajUerao|s{‹ŠŽŸ¦Ÿ±»ÂËÒÕÜäéðöòúüôúøñöðíðçéëÞáãÕÚÛËÒÑ¿ÌɶÉıþ«¾¹¦»´¢Ë¾®ÓŸÝÏÄæÙÑíâà÷ëíÿôúÿøÿÿ÷ÿÿúÿÿüÿþýÿýüÿûüþüþýþÿÿþþþþþþþþþþþþþþþþþþÿþüÿþüþýûÿüùÿýúÿýúÿýúÿû÷ÿúöþùõÿýüÿûúýùøüúûþüýÿýþÿþÿÿýþÿüýÿüüÿüùÿøó÷ìæòåÝøêáÿóëÿûÿÿýÿÿýþÿÿûÿÿûýÿúýÿüüýÿüýÿþýÿÿþÿÿþýÿþõÿüìÿüãÿúÝþýèÿÿëåãÌŒˆoRL2UN2TM0WN1VM.UO/WP3VQ3UQ4QP2ON2MM1PL1NM1NL3MM3LN6LP7KP9JR:LU:IR7JS6QX9SZ9U[9]c?gmI€”a’¦sŸ±š«’¡xˆ”pr|Z\bFLP7KM7LK6KI4NI5PK7TM:VP:WQ;VP:SN:QL9LI:IG:EE9CE:=>6<?6:@69A67B47B46B46C2;C8;C8:B79A69A6:B7;C8;C8;C8;C8;C8;C8<D9=E:>F;?G<<G?<H>=G<=H8>G6=E6=C7=B;:A:9?;5?75A39H1BV3Ne9Wo?Sv<St?NmAE`=8P6-B/*<,+<*1C-<N4H[=OdERgHLcG@W=3I2.5-+2*'.& \ No newline at end of file
+0/-0/-10.21/51.51.62/72.83/83/83/:3-:3-:3-:3-:3-:2/91.91.80-80-91.91.:2/80-80-80-80-80-80-80-80-6.+6.+6.+5-*5-*4,)4,)4,)4,)4,)4,)4,)4,)4,)4,)4,).+$/,%/,%0-&1.'2/(30)30)63,63,74-85.85.96/:70:70A;/B<0D>2F@2IA4JB5KC6KD4MD5MD5MD3NB2OC3OC3PD4QE5T>1Y?2b@4nB5}E6ŒG8šG9¥E7²F9ºF9¿E8ÆF;ÉF>ËF?ÌG@ÌG@íCNíCLíCLíDKíDIïBFñ>Bõ<Aø;Aø9@ö9?ð;@ë>@â?@×?<Ñ=;µ@.µ@.µ@.´?-´?-³@-²?-°?-­@,ªA.¦A-¢B,A*›A)˜@*—A*’?/’?/’?/‘>,‘>,’<+’<+’<+”?+”?+”=*”=*”=*•>+–?+—@,”?:•>7—=4Ÿ?1©B3³D3¼D3¿D4º?/¶@2­E8žH;‡H9mB2T8*D3#:659549547326216005//50-72/72/72/61-61-50,50,50,.0-.0-.0-//-//-0/-2.-3--5,-4+,4*+4(*7(+=.1E69L<?n@B|HJ‹MN–NO¢VZ¬cl­n s’|£„°}‡¼|‰¾pz­`aTLuRCjSKcOG_MH\TR`fdo|}‚‘™ž˜£©Ÿ¤¨š¡’’{|jhgUXWERO>UPdUPdUPd0/-0/-10.10.40-51.62/72.83/83/83/:3-:3-:3-:3-:3-91.91.80-80-80-80-91.91.80-80-80-80-80-80-80-80-6.+6.+5-*5-*5-*4,)4,)4,)5-*5-*5-*5-*5-*5-*5-*5-*/,%0-&0-&1.'2/(30)41*41*63,63,74-74-85.96/:70:70@:.A;/C=1E?3H@3IA4JB5JC3LC4LC4KB3MA1MA1NB2OC3PD4P>0U?1^A3jC4xD6†D4“D5žB3¨B3°@2¶@4¼B7ÂC:ÄE<ÆF=ÇG>èAKèAIèCIêDHíDGïBDó@D÷>Cø;Aø9@ö9?ð<?é?@à@@Õ@<Î=8µ@.µ@.´?-´?-´?-²?,°?-¯@-­@,©@-¦A-¡A+A*›@+˜@*—A*’?/’?/‘>.‘>.‘>,=+’<+’<+”>-“>*“>*”=*”=*•>+–?,—@-“@8•>5˜>3Ÿ?1«A3µD4½D3ÁC4¼A2¸B6­E8œI;…G:kA3S9*D4$<66;55:4493382271161.61.72/72/72/61-61-50,50,50,.0-.0-.0-//-//-0/-2.-2.-3--5,-4*+4(*5)+<-0C47I:=h<;vDC†JI’LJST§`h¨k{rŽ‘{¢„°|†»y†½lv«[\ŒQHsQBkOFaOFaNI_RN_[Yfnotƒ‡ˆ”™•™ž—š ”™‘ƒ~ojk[]\JVUCXQaXQaXQa/.,/.,0/-10.40-40-51.51.72.72.72.92,92,92,92,92,91.80-7/,7/,7/,7/,80-91.80-80-80-80-80-80-80-80-6.+5-*5-*5-*4,)4,)4,)4,)5-*5-*5-*5-*5-*5-*5-*5-*1.'1.'2/(30)30)41*41*52+63,63,63,74-85.96/96/:70?9-@:.B<0D>2G?4H@3H@3H@3I@1I@1I@1K?1K?/L@0MA1NB2MA1QA2YB2dC2qC3|C2‰A2“@0™<+ :+©;,¯>0¶@4¼C8¿F=ÀG>à?Eá@FãBGæCFêDFðCEõADù?Dú;@û:?÷:@ñ=@è@@ÜA=Ñ@;É>7³@-³@-³@-²?,²?,²?-¯>,®?,ª?-©@-¥@,¡A+A,˜@*—A*–@)’?/‘>.‘>.‘>.=+=+=+’<+“=,“=,’<+’=)“>*“>*”?+•@,”B7–?5š>3£>2­A4¹C5¿D5ÂC4ÂD6ºF9¯I=›I=‚F;gA4P:,B6&=77=77<66:4493383072/72/62/62/62/52-52-41,41,41,,1-,1-.0-.0-//-//-0/-2.-5//4..5,-4*+4*+9-/>24C79_83l?:|E@ˆIB’NK›Z^œft”n‡Œwž€~¯zƒºs¹dm¤UU‰NEtO?lMBbPEcQHcMH^NK\[[estx…‰ˆ‡Œ†Š†…†Š|xzlghXZ[KVTEZT`ZT`ZT`.-+/.,/.,0/-10.40-40-40-51.61-61-61-81+81+81+81+50-50-4/,4/,4/,4/,50-50-61.61.61.61.61.61.61.61.3.+3.+3.+2-*2-*2-*1,)1,)4/,4/,4/,4/,4/,4/,4/,4/,30+30+30+41,41,52-52-52-52-52-63.74/850850961961>8,?9-@:.B<0E=2E=2F>1F>1G=1G>/F=.I=/I=/J>0L@0L@0JD4NE4TD4^D3hE2sB1~A/‡>-Œ9'”9'9)£<-¬@3³E8·I<ºJ>Ù@CÚACÝCEâDEçCDîACô@Cø>Aü;@û:?÷:>ð=@åA?ÚB=ËA7Ã>5°@,°@,°@,°?-¯>,¯>,®?,¬>-ª?-¦?,£@-Ÿ@,œ@+˜@*–@)”@(‘>.‘>.‘>.=-=-=-<*<*=+=+<*<*=+“=,”>-”>-”B6–?5›?2¦@2²B4½C6ÂB5ÄB5ÄF:½H>­K@˜J@|F:aA4K;.?9+@86@86?75>64:5294183073062/62/62/32.32-21,21,21,-2.-2.-2./1./1.00.00.10.5106005//5,-4+,6,-:01>45W6-b<3qA7}D9„H@ŒRQŽ_i‹iƒs˜|z¬u~·myµ^g¢RQŠMDyM?rN@dPEgQFfLC^GBVNLZ^^fjnquzvx}vz€vwzokoa`bUWYKTUG]V^]V^]V^.-+.-+.-+/.,0/-10.3/,40-3/,4/+4/+4/+4/+6/)6/)6/)4/,4/,3.+3.+3.+3.+4/,4/,50-50-50-50-50-50-50-50-3.+3.+2-*2-*2-*1,)1,)1,)4/,4/,4/,4/,4/,4/,4/,4/,41,41,41,41,41,52-52-52-52-52-63.63.74/850961961<5+=6,?8.@9/B:/C;0C;0C;.D:.D:.D:.G;-H<.I=/J>0K?1GH6KH7PG6XG5aF3jD1uB/|?,‚;)‹:'’;(š=,£B2«G7±K<´M>ÒDBÔDCØDBÝEBâC@ê@@ð>>÷:>û:=ú9<õ;>í?>áB>ÓC:ÅA5º?0¯@-®?,®?,®?,­>+­>+¬>-ª?-¨?,¤?-¢?,ž?+š?*–?+”?*“>)?.?.>->->-Ž=,Ž=,Ž=,Ž=,Ž=,Ž=,Ž=,<,=-‘>.‘>.”B4—A4@1ª@3¶B5ÁC7ÆA8Å@7ÁB;¸G?©KCJ@uE;Y>3C9-78*@86@86?75>64=53:5294173062/43/43/32.23.12-12,12,,2.-2.-2.-2./1./1.00.00.3205105104..2,,4+,7./901P5*Y9,e>/n@1tB7|KGƒYcƒg~p—xx¬s{¹js¶]e¦TT”OG‚LAyPAjPAhMAeJA`GBYHEXKKWMPU^bc`fbcha`f\Z`TWZOUYKWYL`WZ`WZ`WZ,,,,,,---.-+/.,0/-10.3/,2.+2.+3.*3.*3.*3.*3.*3.*3.+3.+2-*1,)1,)2-*3.+3.+3.+3.+3.+3.+3.+3.+3.+3.+2-*2-*2-*2-*1,)1,)1,)0+(3.+3.+3.+3.+3.+3.+3.+3.+41,41,41,41,41,41,41,41,41,52-52-63.74/850850850;4*<5+=6,>7-@7.A8/A9.A9.C9/C9-C9-F:.G;/H<.J>0K?1FI8GH6MH5TG6[F3dC0lA.t?-{<*‚;)Š;*“=,šA1£F5ªJ:­M=ÉE@ËFAÑFAÖE@ÞC?å@>í==ó9<ø:<÷9;ó;=ë?=ÝB=ÌD8¼A2±>,«@,«@,¬?+¬>-¬>-©>,©>,¨>.¥>-¢?, ?,›>,—?+•>*“>)‘?)>->->->-Ž=,Ž=,Ž=,<+Ž=,<+‹<+‹<+‹<+Œ=.>/Ž?0’C2—A2 @2­A5»B9ÃC:Ç@:Å@9»@9³H@¥NGNEoG=R@4?;039-A75A75@64>63<4194083/74/63.43.34/23.13.02-02-02--3/-3/-3/.3/.3/02/02/11/11/32032040/2.-1-,4..5//H4)M5)X8+a<,f>2nGBzYb‚lƒ€uŸ{|´u|Àmu¾bi±[[¡SLLBQAnN?jI=cH>`HB^FCX@BO<?HBGJFLJJQJJQIIQFKQGOUISYMaXSaXSaXS++++++,,,---/.,/.,0/-0/-1-*1-*1-*2-)2-)2-)2-)2-)2-*2-*1,)1,)1,)1,)2-*2-*1,)1,)1,)1,)1,)1,)1,)1,)2-*2-*2-*1,)1,)1,)0+(0+(3.+3.+3.+3.+3.+3.+3.+3.+41,41,41,30+30+30+30+30+41,41,52-63.74/74/850850:3+;4,<5-=6.?6-?6-?6-?6-B8.B8.C9/E9-G;/H<0J>2K?3DG6EF6KE5PD4VC2^C2e@.m>,v=,|;)ƒ:)Š;*“=.›B2¢F7¦I:¿D<ÂF>ÇG>ÏF>ØE>âC?ì@>ó<>õ9:ó9:ï;<å@<×B;ÆD6´A/¨=)©@-©@-©@-¨?,¨?,¨>.§=-¥>-£>, ?.ž?-š?,—>,“>*‘?*>)>->->-Œ=,Œ=,Œ=,‹<-‹<-‹<-‹<-‰<,‰<,Š=-‹=0‹=0Œ>1‘D2–C1¡A3®B6¼C:ÅA<ÇB=ÃB=»EA³PJ¥XPŽZOqSIVI@BD97A6A83@72?61=60<4194083/63.43.43.34.13.13.02-.3-.3--3/-3/-3/.3/.3/.3/02/02/00.11/22021/0/-/.,2.-3/.?0)C1'K3'T8,Z<2dGCw]hƒsˆ­„„À|ƒËszÈkq¿ed°VSšJC‡N>kK<gG;cG=`FB]DBX?AP;?H:BE?HGDMHGQIGQHJRGNVKRZOaYNaYNaYN++++++,,,,,,---/.,0/-0/-/.,1-*1-*1-*2-)2-)2-)2-)1-,0,+0,+/+*/+*0,+0,+1-,/+*/+*/+*/+*/+*/+*/+*/+*1-,1-,1-,0,+0,+/+*/+*/+*1-,1-,1-,1-,1-,1-,1-,1-,3/,3/,3/,3/,3/,3/,3/,3/,40-40-51.62/62/73084184192,:3-;4,<5->5.>5.>5.>5,B8/B8/C9/E8/G:1I<3J=4K?3EC6FB6IC5NB4TA3\@2b>0h=-q<.w9*}8)…7*Œ:,•=/›B2 D5µE9¸F;ÀG<ÈH=ÒH>ßF@èC?ð@@î:9î:9é=;àA;ÑD:¾E4¬A-¢?(¦A-¦A-¥@.¥@.¦?.¥>-¤?-¤>/¢>.Ÿ@.œ?.˜?-•>+‘?*>)>+>->->-Œ=,Œ=.Š=-Š=-Š=-Š</ˆ<.ˆ<.ˆ<.ˆ<.‰=0Š>1‹?2‘D2–C1¢B4®B6¼C;ÄC>ÄC>¾D?»PJ²[T¥e\‘f]s_TYUJFNC>KA@70@72>71=6094.83-63,63.43.34.34.13.13..3-.3-.3--3/-3/-3/.3/.3/.3/.3/02/.0-00.22022000.0/-0/-10.8,,;,)B1*K7.S<4^IHtbn‡z–Џ‹Ê‚ˆÒy€ÐrwÈik¸XV¡GD‹I<gG<fD<aC>^C@[ABV>DP>EMGQSKWUQ^WU`XS_UR^TT^SV`UaZHaZHaZH,-/,-/------------.-+.-+/.,/.,1-*0,)0,)0,)/+(0+'/+*/+*/+*/+*/+*/+*/+*0,+/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*0,+0,+1-,1-,2.-1-,1-,1-,1-,1-,1-,1-,1-,0,)1-*2.+3/,3/,3/,3/,3/,3/,3/,3/,3/,40-51.62/73081+92,:3-;4.=4/>5.>5.>5.?4.?5,@6-C6.D7.F90G:1H;2F?5H@5J@6N@5R>3W<1\:0a7+k9.t8-|8+…9,;/“=0˜?1›?2¨@3¬B5´D8¾E:ÊG=ÕF>ßD?çB>ë?=íA?çD?ÜE>ÉC8¶C1§B.¡B,¢A.¡@-¢?,¢?,¡=-¡=-¢>. ?.œ<,š=,˜=+•>-“=,=+Ž=*Œ>*‹<+‹<+‹<+‰<,‰<,‰<,‡;-‡;-‰=/†</†</‡=0‡?1ˆ@4‰A5ŠB6‘F3–E4£F7³H>½F@¾C>¾DA»KG·XR¯f]£qfth|rfik^S_SCSHQJBLE=D=5<8/95,74-63,33+43.34.23-13.02--2,,1+,1+-2.-2.-2.-2.-2.-2./1./1.02/02/11/11/11/11/11/11/5*2;/3A32C4/J;6]OOymy‹…Ÿ’‘½”–Ӕ݂‰×tzÈjn¸_b©YZPHmHBdA>]>>X?AVBHVLU^U`bbqnn}xv†|p€ulyoguh_k_T`Ta[Eb\Fc]G,-/,-/,-/,-/---------.-+/.,.-+.-+0,)/+(/+(/+(/+(.*).*).*).*)/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*/+*0,+0,+0,+1-,1-,1-,1-,1-,1-,1-,1-,1-,1-,0,)0,)1-*2.+3/,3/,2.+2.+2.+2.+2.+2.+3/,40-51.62/80-91.:2/;30=4/>50>50=4-?4.?4.?4.B5-C6.E80G:2H;3H>5J=5L=6O>6Q=4V;2Z90_7/h8.p7.y6-‚8-‰9.’;1–<1š>1¢@3¦A5ªB5³E8¾E:ÉF<ÔE=ÜC=âC?ãD@ßF@ÕF>ÄF8±C2£B/›C-ŸB0 A/Ÿ@.ž?-ž?-Ÿ>-ž>.ž>.š=,™=.–=-“=,=+>-Œ=,‹>,Š=+Š=+‰<,‰<,‰<,‡;-‡;-…<-†</…=/…=1ƒ=1„>4†@6‡A7ˆB8‘H7•F7£G:±I@¹HB¹FAºJFµTM²dZªreŸ~op~|mlteYgZJZOPLAKI=EC7@>2=:1:7.44*11)23+23-12,/1,/1,.0+.0+.0-/1./1./1./1./1./1./1./1.02/11/11/11/11/11/11/11/5*:9-9<15?53H?:^VTxszŠˆž‘“º”—Εׄ‹ÓxÆpyºkt¯en¥__yXZsSUjRWjU]j\gmguvr‚v‡€‘‡ƒ•‰}v†yp€sfteXfW_YA`ZBb\D,-/,-/,-/,-/,-/---------.-+.-+.-+-,*/+(.*'.*'.*'.*+.*+.*+.*+-)*-)*-)*-)*/+,/+,/+,/+,/+,/+,/+,/+,.*+.*+/+,/+,/+,0,-0,-0,-0,-0,-0,-1-.1-.1-.1-.1-.0,+0,+1-,2.-2.-2.-2.-1-,1-,1-,1-,1-,2.-3/.40/51080-91.:2/;30=31=31=4/=4/?40?4.?4.A4.C60D7/F91G:2H;5J;6K<7N=6P;6S:5V72[60c60k6.t5,}7/‡9/Ž:0”<0˜<1œ@3ž@4¢@3§A3±C6¼C8ÇD:ÎC<ÖF>ÚG@×HBÍH?¾E:­C3ŸB0™B.B/œA.›@-›>-›>-›>-›>-œ?0˜<-–=-”=,“=.>-Œ=,Š=+Š=+‰<*‰<,‰<,‡;+‡;+…<-„;,ƒ;-„<0‚<0‚<2‚>3ƒ?4…A8†C:‡D;“K<–H; H>­JDµIF´KG´SM¯_V®rg¥qœz{Šwr€ocqbVdWPQCMN@HI;DD8@@4::055+/0(01)01+/0*/0+./*./*//-//-//-//-//-//-//-//-//-//-00.00.00.00.00.00.00.00.6*>6+;8.6;63HE>_^Yyz|Šœ“²’–ÃŽ•Ë„Æ}ˆ¾{‰¸|‹´|Œ°ˆ—yƒq~‡o|‚n}€o‚€yއƒ™‹¡”‘¨˜¦”ˆŠƒ–ƒ|{j{iXiW\V<^X>`Z@-.0-.0-.0-.0-.0-.0......---.-+-,*-,*,+).*'.*'.*',*++)*+)*+)*+)**()*()*(),*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*+-+,-+,-+,-+,.,-.,-.,-.,-/-./-./-./+*0,+1-,1-,1-,1-,0,+0,+0,+0,+0,+0,+1-,2.-3/.40/91/:20;31<42=31=31=31=31>3/>3/>3/@3-A4.C60D71E82G83H94I:5L:6M:6N94Q83T50^72e60o6/x8/ƒ90Š:/’;1•=1™?4™?4›?2@1¥A2­C5¸D7ÀD:ÉF<ÌG>ÌIAÄH>¶F:©C4B0—B.˜A.˜A.˜?-—>,™>,™=.™=.™=.•<,”<.“=.=-Ž<.Š=-Š=-ˆ<,ˆ;)ˆ;+‡;+‡;+„;,„;,ƒ;-‚:,;/€<1€<1>5ƒ@7ƒC:…E<†F=’M>•I<œH>¨IC¯LG¯PL¯\Tªj^§€o y˜š‚Žœƒ„–€z‹ym{lam_UYHQUDKO@EI:@D6;=057,13(01)/0*/.).-).-).-+/.,0/-/.,/.,/.,/.,/.,/.,/.,/.,0/-0/-0/-0/-0/-0/-0/-0/-8*A6):3-1961HJ=bfX{€y‰‘“Œ“£–²Œ”¸ƒ³±…™²¤¶ªµ•§§¤£Œ ž‡ž–‚™}˜‰œ‹ˆ£”°š–²›”­—‹£‹…›†’~k|iUfSXT7ZV9^Z=+/2+/2-.0-.0-.0-.0-.0...------.-+-,*-,*,+),+),+),*+,*+,*++)*+)**()*()*(),*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*+,*++)*+)*+)*,*+-+,-+,.,-.,-/-./-./-./+*0,+0,+0,+0,+0,+/+*.*)/+*/+*/+*/+*0,+1-,3/.40/91/:20;31<42=32=32<20<20=20=2.=2.?1.@2/A4.B5/C60D63C84D95G96G96H94K84N51V72_60h70r7/}:1†<1=2>2˜?7—?5—?5—?3šA3£C5ªD6³E8ºE;¿F=ÀG>»F=°D8¤B5™@0–@/–A-–A-–?,•>+•<,•<,–=-–=/”<.’<-=-Ž<.‹<-‰<,ˆ<,ˆ<,‡;+†:*†:*†:*ƒ:+‚:+‚:,€:.;0€<1€=4?6‚B9ƒD;†G@‡HALA’H?˜HA¤KGªOLªWQªf]¥wh¡Œw˜›€’¥‰Š¤‡„ž…|’}t‚qlte\eRV_LMVCEL<?F6<@27;-68-01)00(.-(/+(/+(/+*2,,3--1-,1-,1-,1-,1-,1-,1-,1-,0/-0/-0/-0/-0/-0/-0/-0/-9*?5)73*-66*GL6_iPx„nˆ“…—–™¢™§†–¥‡›¤ª©šº¯ŸÁ±š¶¨š¶§›·¨˜¸£‘±š‰«’‰«²”’³”•´•­ˆ¢…ƒ›{’xgzdQcMTS5VU7XW9,03,03,03,03./1./1./1///..........-+.-+.-+-,*-,*-+,-+,-+,,*++)**()*()*()+)*+)*+)*+)*+)*+)*+)*+)*,*+,*++)*+)*+)**()*()*(),*+,*+,*+-+,.,-.,-/-./-./+*/+*0,+0,+/+*/+*.*)-)(0,+0,+/+*0,+1-,2.-3/.40/:12:12;23<42=32<21<21;1/=20<1/<1->0-?1.@2/A30A30?61@72@93A96A96B94E74G51O61W6/a6/j8/u9.€</‡=0Š>0•>7•>5“?5’@4•B4™C4ŸC4¥D4ªB5²C8´E:±E;©C7 @4˜?1•?2“A,’?-“=,“=,“<+“<+”<.”<.“;-’</<.;-Š;,‰<,‡;-…<-†:*†:*…9)ƒ:)ƒ:+9+:+9-€<1<3?5A8‚C<…F?†JB‡JEJAG@—HC¡NJ©VRª_Y©pe£„r›•{’¢…‹ªŠ„©ˆ€¡„~–~z‡uszjcqZ]iSR^JHT@BK:>E5:@29<134,22*1.)/+(/*'0**3*+4+,1++1++1++1++1++1++1++0,+1-,1-,1-,1-,1-,1-,1-,/.,;(;5(23+(56$CL-\hDt„`…”wŽ›‰’ž”Ÿšž–¥—•µ¡Æ¤¦Ð¨¥É¯¦Ê°§Ë¯¢Éª—¿‹³ˆ°‹³ŽŽ²Ž²¬Š„¢€€™{wŽrdx]MaHQQ5QQ5RR6,03,03,03,03./1./1./1./1/////////0/-/.,/.,.-+.-+/-..,-.,--+,,*++)*+)**()+)*+)*+)*+)*+)*+)*+)*+)*+)*+)*+)**()*()*())'()'(+)*+)*,*+-+,.,-.,-/-./-./+*/+*/+*/+*/+*.*)-)(,('0,+0,+0,+0,+1-,2.-40/40/:12;23;23<34=32<21<21;10<1/<1/<1/=/,>0->0-?1.@2/;60;62;83<94=:5=:5?82A60F5.O4-W5+b6+n8,x:-<,„<.’:6‘<5=5Ž@4A4‘B3•B2™@0Ÿ?1¦@4ªB7ªB9¥@6?5—=2•?2‘@-’?-‘>,’<+‘;*‘;,“;-“;-‘;,<.;-‹<-‰;.‡;-„;,„;,…9)…9)…9)‚9*‚9*9+~8,}9,=1€=4€@7B9„E>…HCˆKFŠMHŒIAŽGA˜JF¢SOª\X«h`©{n£Žy—Ž©ˆ…¯‹«ˆ~£„€˜€‹w{nixacr[ZhQP]IIUACL;>D6<?467/44,30+0+(1)'1()3)*5+,2)*2)*2)*2)*2)*0**0**0**1++1++0,+0,+0,+0,+0,+0,+;&57(/4-%46?I$Ue8pT‚’kœ}‘Ÿ†’¡Œ¡ˆ¨‡•¹žÉ“¢Ò”©Ò°¨Ò®¥Ñ­ŸÌ¥‘¾•ƒ°…‚­‚†±„†¯ƒŒ±ˆ‰¬„Ÿ{{”tqˆk_sWJ^CMM1LL0KK/,03,03,03,03./1./1./1./10000000000/-0/-0/-/.,/.,0.//-./-..,--+,,*++)*+)*+)*+)*+)*+)*+)*+)*+)*+)*+)*+)*+)**()*())'()'((&'*()+)*,*+,*+-+,.,-/-./-./+*/+*/+*/+*.*)-)(,(',('1-,1-,1-,1-,2.-3/.40/510;23;23<34<34=34<21;10;10<1/<1/;0.=/.=/,>0-?1.?1.96/:729839839:4:94;83>71A2+I2*S2)^4(j6)s8*|:*~;+84:5=4Œ@3‹B3A1@/”>-˜<-Ÿ=0¥@4¦A7¢@7œ>4—=4•=3‘@-?,=+<*‘;*‘;,‘;,’<-‘;.<.;-Š;,ˆ:-‡;-„;,„;,…9)…9)‚9(‚9*9*€8*~8,}9,€>2?5€@7‚C<ƒG?†IDˆMGŠOIŒICHD˜MJ¥UT¬a^­ng«s¤•€–¡ƒŠ¬‰‚°‹|«‡|£„™y‚ql{dgv__nWXeQP\HIRAAG9=@579.66.41,1,)1)'2()3)*4*+2)*2)*2)*2)*2)*2)*2)*0**1++1++1++0,+0,+0,+0,+0,+:&27(+4."47=HRb1l~J€’b‰™rŽ|Ÿ‚ŠŸ~Ч{·€˜Æ…œÎ…œÉ¢šÉŸ™Èž”׉¸Š®€‚°‹¶ˆ‚¬~ˆ¯ƒ‡ª€~œvuml„dZnRG[?IL/GJ-DG*/0*/0*/0*01+01+01+21,21,32-63.63.63.52-50,4/+4/+8.,7/,6.+5-+4,*2-*1++0,-0,-.,/--/-,1,+0*+/)*.()./(0/(//(//(//(//)-.)-.*+/+,-,*-,(.-).-)-.(./)./)--/--/---.../-.0/-2.+3.+2-)4,)5.(7.)8/(;0*;1(<2)<5+=4+>5.>5.>5.=4-<3.<1-=2.<1-<1/;0.=/.>0/>0/?11H-&C1';5)2:++=-(=.-;.45-?-+H()R%(X((Z.+Z8.[A2\G6wC-{B.„C1A3’?1•;0–:/”8+“;-‘>.‘B1‘D0‘D0B.?,<*Ÿ63›83”:2Œ<1…@1B0|A/|A/‚C2„A1ˆ>1‰=0‰;/ˆ:.‡9-‡9-v:/|@5u=0n9)s@/s@/t<+{@0{<-ƒ?4ˆD9‹H?ˆLA„NBQC€RC—HK•TRd]…ue{…lw’sz|€£ƒ‰¦ˆŽ¥‰’¤Œ‘¥Œ‡¤ˆy¢‚kŸ{awhŽea†]\zV[sS]mR[cLVTEPH=J;6G53B,/=&,:#+:#-9#/8".#/-#-,$-,&*+))+-(.1'/2'/4'06&14'14'13'32(32(30(3.)-0,-0,)//'=>0WZErx\‹gœs‹žpŒ¢qŒ§r‹¨r‰ªs³{›¾†£¿Ž ¾Œ›¹‡’²€‹­{†ªz„ª{…ª~„§}…¥€€ž|z“vr‰oi{e[jWLZIKO@CG8>B3/0*01+01+01+12,12,21,32-43.63.74/74/63.61-50,50,7/,7/,6.+6.,5-+2-*1++0,+0,-/-./-0--/-,1+*/)*.()-/(//(//(//(//)-/)-.*+.*+/+*-,*.-).-)/.*./)./)./)..0....../-./.,/.,1-*3.+3.*5.(6/)8/(90);0*<2)=3*>5,>5,>5.>5.>5.=4-<3,=2.=2.<1-;0.;0.;0.=/.>0/?10F/'D0)A3*=4+96-85.83-<1-?-+D*)K)(P*'U.)[4-_:1c?3s@+xA-€A0‰?2‘?4”;3”:1“;19.‹<-Š>.ŠA0‹B1B/ŽA/@/š93—:3’;2‹=1„?0‚@0@/?/„A1†>0‰=0‰;/‡;.„:-‚:,‚:,w9.x<1s9-n9)r?.s>.q9*u:,}=1„@5‰E:‹H?‰K@†MB„PCQC›DJ›QR–d]vfƒ‡p}”w~ ƒ¦…ˆ§ˆŽ§Š’¦‹“¥Œ£‰‚Ÿƒwœ}o˜xa•g\`VƒZU}XWyXWpSPbJKVECI;@A998340-0,+/+,.)--(,*,+)+***,+),-(,/)-2(03(03(02(02(10)1/*1-*1,+3,+32-12./0,)--%9:,TWBox[€‹i‡–o†™l†žnˆ£p†¤p„¥pŠ­w“¶€›¹‡˜¶„“³Œ®{†«xƒ§w‚¨yƒ¨|ƒ¦|„¤{x’uqˆnh{eYjWL[HGK<@D5:>/12,12,12,12,23-23-43.43.54/74/85085085083/72.61-80-80-7/,6.,6.,3.+2,,1-,1-./-.0.1..0--/,+0+*/*).1'//(//(//)-/)-/)-.*+.*+0,+0,+/.*/.*/.*0/*/0*/0*/////////0./0/-1-,1-*2-)4/+70*90+:1*<1+=3*>4+?5,?6-?6-@7.@70?6/>5.=4->3/=2.<1-;0.;0.;0.;0.<1/=20C2*E0+H/+L,-N+/M*.J*/E+.A-,@.*@/(C/(M/'Y0*d1-j30i;+o;-w;0=4‰<4Ž;5Ž94:4‹;2‡=2†>2…@1†A2‰A3ŒB5C6‘=2=1Œ>1Š>0†>/…=.…=.†=.ˆ<.‰;.ˆ:-‡9,„;,€;+~=+z=*}=3z<1v:/u;-x@1x@1v<.v;-?3„B6ŠF=‹H?ŠJA‡KA‡NC†PDDHQQšc^’ug‰„n‘t~}€¥ƒ„©‡ˆª‰©Œ“§Œ‘£‰‹ƒ„˜€”{a›k[•eXaV‰`W…`W]QtVMiPC[E=RA6F9/<2*5-&1+%.)$-(1&*1&*1&*1&*1&*1(-2).1+//*0-+0,+0+,0),1(-1&.1&.14.24.0.*'**"66*PUAmv[~‰i€k~“h™jƒŸn€ n~ m€¥q‡¬xŽ®|‹­zˆªw„©v§t€¦u¦w€¥y¤y€¢}}›yw’sp‡mh{eYkUL[HEG:=?28:-23-23-34.34.34.45/54/54/650961961:72:72:51940940:2/91.91.80-7/-4/,4/,3/.3/.3/01/01/00.1..0--/,,.2).2).2).0*.0*,0*,0*,/+*1-,1-*0/+0/+10+10+10+10+11111100010.10.2.+2.+3.*91.92,;2+<3,>4+@6-@6-A7.A8/A8/B90A8/A81@70>5.?4.=2.=2.<1-;0.;0.<1/=20=20?5,E2.O-.W(0]#/\"0W#/L'.C/.:3-55);5)E1(U.'c+*l*+e;/j;1s=3}<6…;8‰;9Š;7ˆ:6‰>9†?9…B9ƒC9…B9†B9‡A9‰@7†B/†B/‡@.‡@.‡>-ˆ<,‰:+‹9+‹8*‹8*ˆ9*…9)€<)z=(w?(t@(ƒ=3{7,x8,z</v;-w=/{A5{?4€B7„D:‡G=‰I@ˆI@ˆLB‰NF‹PH“OL”YS’f[sb„€g}Œmz˜v{¡|©ƒ«‡†«‰‰«Š‹¦‡Šžƒ†˜~„”zm˜mi”iegdefŒgc†e]~_Zw[PhPI_J@Q?8D60:/-5**/(),%7$(7$(5%(4%(1&*1(+/+,.,-*+-(,-'--%-/%-/$./$./$./1(+1+-0+(.+$88,PUAiqYvƒe{Œhyf{–iœn}Ÿmyžkz m¥r‚§s€¥q}¤o}£p}¥s~¦t~¥v}¤w|¡x}Ÿzz™wuqn‡jg{bWkRK]GGE9?=1:8,45/45/45/560560560761761872:72;83<94<94=84<73<73<41<41;30;3083072/61.61.5106216213122011/00.//-.4+.4+.4+.4+.2,.2,,2,,2,,3/,3/,3/,10,21,21,32-32-22222032032032.51.61-61-;4.<5-=4-@6-A7.B8/E8/E8/C:1C:1E;2D:1C90B71@5/@5/>3/>3/=2.=2.=20=20>31>31>7/C41O/2Y*2_%3`#2Y%1N+1B3077-39+68*?5)N1)]-)e+)c;3h<3r=7z=:‚<<†<=‡;;…;:‚;9>8€A:C;‚C<ƒB<…@9„?8E/D/C.ƒ@-†=,‰<,‹9+Œ9+Œ6)Š7)†9)‚;)~=)w?(sA(qB(…6/|/'8/ƒ?4w5)s5*}A6}C7E9G<ƒI>„J?…K@‡LDŠOGŒSJycL~hSoYu]}bˆi„•u‚ |¥~|©€~¬…­†€ª„¥€|ž}{˜yn}ŽlyŒlwŒkwŒmt‰joƒgl~dbqZ[hTSZHIK=B@4=6,8/&5+":&(8%'6&'2&&0(&-)(++)).*'+*&,*&,*'+*'+,)*,**,**,-#$2*(50,85,BC5UZFfpWn}^tˆcqŠbt‘ex˜iw›ks™hs›iwŸmz¢mx lwŸkv¡ly£q{¥u{¥w|£wxžuzœww–tqŽom†hd{_WkPJ^CFB9>:195,560560671671782782872872983<94=:5>;6>;6?:6>95>95?74?74>63=52;62:5294194184184195484373243132021/6-.6-.6-.6-.6-.4..4/,4/,40-40-40-52-32-32-43.43.431431542540841850940:5/=60?6/@7.B8/C9/F90G:1H;2F<3F<3F<3F<3E;2C90B71A60@5/@51>50=4/=4/>42?53?53=82A64I35Q16V.6U-5R/5J22A62::08<.9;-?9)H6*P4)U3)]2+c4.k62t76}77‚89ƒ7978}75{:6|=8{?7@9ƒ@:…@;†?;|E0}D0€C0‚A/…=.‡;-‰:-ˆ9,‡8+…9+‚:+<+{>+x?+uA+tB+‹2,‹2,¡LE§XQŠA8|90‚F;€J>yH:zJ<{M@|NA~NB‚PE‡UJYN_uNgwRtzX€{^Š|b“i›s›—|™zˆ |ƒ¨¬ƒ|¬‚x¨~t£yq vŠpˆo†nƒŽp€p}px‹ms‡kk~bgu\_iQWZGPM<H@3B6*>0%:,+7,*5+)1,(-,'+.').((/().(+-*,,*/+*3)*6',7&,9&,2)$<3,E>4JF:QR@]bLgqVizXmƒ]j…\j‰]p‘bq•eo•do—eršhu krhq›itžlx¢rz¤vy¢vyŸvvštw™tu”rokj…fc|^UlOJ^BHA9@91;4,671782782782893893983:94:94=:5>;6?<7?<7@;7@;7@;7B:7B:7A96@85=84=84<73<73<74<74<74;74:6395284173080.80.80.80.80.80.61.61.61-52-52-52-63.63.54/54/540540651952:72=84=82@93?80A8/C90D:0E;1H;2I=1I=1H>4H>4H>4G=4F<3D:1B8/A60B71@70@72?61?61@72@72A83=84@85B86D97E:8G96G96E:4C90B90B:/B:-D;,F:*H;*H;*].&b0)n3/x73ƒ98‰;;Š<<‰>;‹A>†A<?6}=4~;3‚;5ˆ=8Œ>:~C3€B3€A2ƒ?2ƒ=1„<0ƒ;/;/;.|=.{=.|>/|>/|>/}>/}>/—.*£;8ÎkfÙ~y­ZTŒC<ˆLAN@tJ:qM=pQ?qR@tSB{VD‚[J‰_OUOe€Uz~[‘y_¥ra³of»rk»xo¶…vªz ›~•£€Œ¦ƒ¦~}¢yyŸvŒr‹rˆ‘r„“r€•t|–sv”ps’pl‹ig„eby\\lQU_GMP;ED0A<)>3-<3,92*41(01).1(+1'+0)/0*2/*6,*:*+@'+D%+G$+H#+A7+LC4WP@[XE`bLgmQiwVj{Wl‚[g‚Wf†WjŽ^n”an”an–bršfržko›hnšiqœnw¡sy¢vxžuu›ts—su—ts’pn‹li„cb{[TmMH`@MD=E<5@707827828938938939:4:94:94;:5>;6?<7@=8@=8A<8A<8A<8A<8A<8A<8@;7?:6>95>95=84>95>95>95>95=84<73:51940:0.:0.:0.91.91.91.91.72.61-61-63.63.63.74/74/74/540651961;83<94?:4@;5B;3A8/B90C9/E;1H<0I=1J>2K=2K>5K>5J=4J=4F<3E;2C90B8/B92B92A81@72@72@93A:4A:4?74>95=<7>?7?@8@@6D@5J=4J70N5.Q6-Q6+O8*M:+I<)H=)l3(r6,~;3‰@:•DA›HDŸJGŸLH QJ—MDD;„;2‚8-…7-Œ91;4…?7…?7†=6…<5ƒ=5€=4|>3y?3vA3uA3uA3y?3}=3ƒ:3‡83Š73Ÿ%$´<;í{zþ•’Åhc–G@‰K@wI:mN<gR=dU>fW@jX@r\E}aL„eQj{O{{U™w\´l`Ì^_ÚR\áM[àO^êmuÜxxÎ…~¿€²–€§—}ž•x˜“u•Žr”r‘‘u”u‡–u—s{–sx–rq‘lp‹hiadtW]gLVX@LJ3GB.L40H3.D3,?2*:1(70&40'40'81):/+?-+C++H(+M%-O$-Q#-PE1[P:d^FgfJilOnuTm{Wl~Vk„Zg„Vg‡Vm]p•ap—br™dvhrœlo™km—ip™mwtyŸxw›wt–us•tu”tsqoŠki„cb{[TmMGa>SJCKB;F=69:49:49:49:49:4:;5=<7=<7=<7?<7@=8@=8A>9C>:D?;D?;E@<E@<E@<D?;D?9C>8C>8D=7B;5B;5B;5B;5B;5B;5A:4A:4A83A83A83@72@72>71>71>71<71<71;60:5/85085074/74/761961961:72<71=82A:2B;1C:1E;1F<2J>2K?3L@2N@3N@3M@7M@7L?6K>5I<3F<2E;2E;2B90A81A81?80?80?82@93@93<5/LE?IB:E<5OB:K:2J3+\>6Z5-`5.`4+^/'\0%b8,g@1gB2‹I;G;–I?žLAŸF>›>7š=6žD;¥ND£QE¨VH«YK£PBš@5˜:0ž=4’9;9:Œ67†54„96ƒ@:{@8o?3oC6lB4m?2u:274Œ35’-3–(1ÏEEèbaÅEDÍWUáyv«VO†F<‚WGlS=f\CedFgfHgbEm_DyeL†nVŽdK­p]ÍphÞW]å8Kð(Dü&Hþ+Lþ<WðG\éXeånrà|zÙ}Ö†؉‚¸„wµ…w³ˆx®‹x¨x£ŽyŸy›‘xއmŽƒm~i‰taƒgY{YMtLBpE<r;>d02b22\31L)'D'#I2,J70F5.E2,E0+H0.I-,I)*O+-V24VK/`W:f_BgdEkoLu}Xu„]oWj„WlˆXnŽ]q“`s•bu˜bušdv›eq–ks˜ms˜oq•os•rw™xz™zy–zx•yqŽrm‡jj„ghƒdazZTnKIc@TKBSJAPG>9:49:49:49:4:;5;<6>=8?>9>=8@=8A>9A>9B?:D?;D?;D?;FA;E@:E@:E@:D?9D?9E>8E>8E>8E>6E>6D=5C<4D;4D;4C:3B92B92B92B92A81A81@91@93>71<71;60;60:5/85.74-74-96196/96/;60<8/>:1A:0C:1C;0E;1G=1J>0L@2M?2NA1NA1N@5N@5M?6J=4I<3H;2E;1E;2C:1B90A81@91@91@91?;2?;2C:3G81I0,V..j68u99{;;†ECƒD?„H@…I?†G>ŽJA›NH£PL¥MK’E3”C2šB4 B6 >36-7+¡<0£C5›@.™@. E3¦F6©E5¯H9¸N@´KR¯GN¥@F™9=‘8:Š?<€A:r@5k?2uK=€NC@:‚,-“(0µ8FÒK\àJIáMMÌ>=Ã>?Ò_\µXQ„@5€UDvbJa]@Z_?ekIonOshJ{fK†kPÌ]VÚ][êSZó<Nü'EÿDÿHÿ!Kÿ(Nÿ.Nù9RöF[òM^ëO]êO]ëS`ÝakÛclÚgnØkpÓnrÑstÎvuËwwÌ{zÌwzËuxËotÊirËcnÊ^kÊ\iÆ`n´Ra¦JWšGQDK„FIk79FS2-L0,F2+I6/J91I;2M>7SD=]P.dY9ga?ifCnrMz‚[z‰bt†^r‰]oŠ]oŒ^qŽ^u’bw•cw•cw•cr’mw—rz˜vy–w~˜}ƒ„…‡ƒ›…™ƒz’|q‰ql„jhc`yYTnKJdAWQEVPDUOC8938938939:4;<6<=7?>9@?:@?:B?:C@;C@;C@;D?;D?;D?;FA;FA;FA;E@:E@:G@:G@8F?7IB:HA9H?8G>5F=4E<3E<3D;2D:1D:1D:1C:1D;2D;4D;4C<4?80?80<71;60:5/:5/94.94.96/96/96/;7.<8/@9/A:0C;0E;1F<0I=/K?1M@0M@0NA1M@0N@5M?4L>3K=2I<3H;2E;1D:0C:1C:1A:0A:2?;2@<3@<3A=4SE<P40g35AG°JWÇS`Ï[fÇ^c›B>–I?•MA›OB¬RJÃSRÏNSÒENœE2B0 @0¥?1¦:-¥7*¦8+§=/¬E4¡>+˜7$:%¥>+®@/³B2¹C5§/8±9B¹DL¾KR¸NRªLL“B>}:1u;/q9,s5*2-›47º<GØEWéLaåFCÒ41Ò:9À21ÉMKÈb]”J?‹\JzdLebCbfEpqOysS~iL‹iNœrZûW`úNZû@Qþ3Iÿ-Hÿ-Nÿ*Mÿ&Hÿ-Mÿ,Ký.Jü2Lù1Kù.Kû.Lþ1Oø=Z÷?[öB]ôFaòJcñMfïQhíSkêPhéOiéLgêKiîKjôLoùOsüQuþh…ô_|æZtÖUkÎYlÊdr¨R[r-0]''X1,T<2N@5?<-7:)<C1GP=[N,aW4e_=heBstR†d~ŒhwˆdxŒgsŒer‹cr‹ctcwfz‘gz‘e~•x„›ˆŸ… Š‘¤—¨–˜©™–§—‘¢’‡˜†zyn„mg~b^wYTmMKfCXUFXUFYVG7827828939:4;<6=>8@?:A@;BA<DA<DA<DA<DA<E@<E@<E@<GB<GB<GB<FA;FA;HA9HA9HA9LC:KB9JA8I@7H>4G=3F<2E;1D:0D:0E;1E;1D;2E<3E<3E<3@91?80?80<71;60:5/:5/:5/96/96-;7.;7.=9.@9/C;0D<1F<0F=.J>0L?/M@0M@0O?/O?/O>4O>4N=3K=2J<1G:1G:1D:0D;2D;2B;1B;1@<3A=4A>5A>5Q9/X+&‰:?ÅP`ãOeñOfíPcÐGO¢20”:/Ž?.–C3®F=ËFGÞ>Hã2B§H6§F5©B3®@3°?1²>1³B4´D6²G5«B/£<)¤;&©<(­:(¯5&®3$¸7<»8>½7>½6=¿<BÅJMÄTS»ZT—@7ˆ6+….%œ62ÃHKÞNXå@Qà0Eß:4Ð-(Õ74Ê64ÈD@É\U©WKXFtX@rgIysS|qQhJdK©oYÂ~kÿGVÿAPú9Jû8Iÿ=Nÿ@Qþ:Nö5Hÿ@Sû:Mú4Ký3Kÿ0Jÿ-Iÿ-Lÿ1Sÿ1Tÿ1Tÿ3Wÿ3Wÿ6Zÿ9\ý;^ü<aþ@fü=fû<eû<gý<iÿ?mÿBpÿEsÿLuÿNuÿRvøPqëRnè`xÙdv·Wb|15h0/U3*L:,BA/:C.5G/5L2VH+_T6i`CokN||`ˆŽr‡‘v}‹qzq|s|szozŠm}Œmƒ’s‰–x•£Œœ©•£®¦±¡ª´©±¸°°·°­´­¡«¢” ”ƒ‘‚s„qh|c]tWSlLLgDVWEWXFYZH671671782893:;5<=7?>9@?:BA<DA<DA<DA<DA<FA=FA=FA=FC<GB<GB<HC=HC=JC;JC;JC9LC:KB9KA7J@6H>4G=1H<0G;/E;/E;/E;/E;1E;1D<1D;2D;2@9/@91@91?82<71;60;60:5/;7.;7.;7.<8-?8.A;/C;0D</G=1I=/K?/M@0M@/P@0O?/O?/O>4N=3N=3J<1I;0G;/F90D:0D<1D;2B;1@<1A=2A>5B?6C@7_4-t42¯KSâYiðH_ð:Qá2C½#+¬/)š9(;&•=)¬@3ÈA=Ý:?ä0;¨D4¨B3«?2®>2´?5¹C7½G;»J<¬>/ª?-¨=+¨:)ª9'²:*¹;-¼</ËEBÏCBÒ=?Ñ6:Ö7<àAFâLNÜRPÁD>ÃLDËTLÑTNÙKJÝ>Cã3>è.<Ù5+Û7.Ò0+Ò94Á82µ@9µ[P”UDxO9~dI„lPbF]F®eTÍqdÛsjü<Iô9Dì8Aç<DæCHäHKäJLåIMðLSïDMð:Iö5Hû1Gÿ-Fÿ0Jÿ5Pÿ7Vÿ7Xÿ7Xÿ8Zÿ:[ÿ<_ÿ>bÿ?eÿAiÿBkÿBmÿAmÿ@oÿ@oÿ@qÿAqÿBnÿ=hÿEmÿJpöGhíMièZrÛbs½YcŒ@D]($M-"PC2PR=CO76H.WH1eYCujT€{gŽy˜œ‹”Œ‡”ƒ~‰—ˆŽœŒ™ˆ‡’‚Š“‚—žŽ¤¨—²¶§¸¼®¿Á¶ÀÁ¹ÂþÅÅÃÃÃþ¾¾²´³¢©¢—Žy‡vh{e\sWTmONiHTYBUZCW\E560560671782893:;5=<7>=8@?:B?:C@;DA<EB=FA=GB>GB>GD=GD=HC=ID>IE<KD<KD<MD;LC:KC8LB8KA5L@4K?3J>0I=/G>/G>/F<0F<0E;/E;1D<1C:1B90A:2@91@91?82<71;60;60;7.;7.;7,<8-?8.A;/D</F<0H?0J>0K?/M@0NA0P@0O?/O@-P>2N>1M<2L;1I;0H:/F90C9/C;0B<0B;1@<1A=2A?3B@4C@7t50–FEÆY_ßUbã@Qä5FÚ0;À*+¯1%Ÿ9#•;!”: ¡=&·=.Æ90Ê2- :,¢:-¥9-¨6,°91¸A9»E;·E:­?2«@0§<,¤6'ª6)·=0ÄD9ÊG=¾9*Î@4áD=ïA@ö<?ø7<ï05á-.Þ63âH@èTJåNEÜ=7Ü0.å.0ñ27Ö3$Þ</Í,"Ñ7/Á2,±6/Ég\¶m^ŒXC„\CW?‰R=©\LÑjaãfbáUTúAIñ>Dâ<@×?>ÎC>ÍJB×RMåZWéPRìELï;Gõ6F÷2Dø/Bû1Gÿ6Lø:Tø:Tø:Tû:Wþ=\ÿ?aÿBeÿDiû<eû>hú?júAm÷@nõ?oò>mï=mÿFnÿ:aÿ>dÿInÿJløMmòSoæXnëp‚Å_j˜ILt:6\6-O9+OD2SN:`PArdWˆ|p”Ž‚Ÿœ“¦§¡¡¦ ”˜”Ÿ›¨¤¦¯¬¦¬ª¤¦¥§§¥µ´°ÄÀ½ÍÉÀÒÍÇÕÐÌ×ÏÍÖÍÐ×ÎÓÑÊÑËÆÌ¿½À°²±˜Ÿ˜€Œ€m~k^u[VoQSlNU_DV`EWaF560560560560671893:94;:5=<7@=8A>9C@;DA<GB>HC?HC?GD=HE>ID>ID>JF=LE=MF<NE<ME:MC9MC7OC7NB6MA3MA3N@3JA2JA2I@1H>2G=1F<0D<1D<1C:1B;1A:2@91?82?82<71<71<8/<8-<8->7-@:.B:/D</F<0H?0K?/M@0NA0NA0P@0O@-O@-O=1O=1M=0L;1I;0G9.E9-C9/B:/A;/A:0?;0?=1@>2B@4@@4+)¨JKÁSV¾=BÀ/6Ç.3Ä./»0)ª1 £9!›=!–=˜= ¡=#¥;#¦6"6- 8/¢5.¦3,®71·@:¹B<²@6±B7­A5¨</¦8+¯:0½B:ÄC=Ä@;Â@(Í?+Ù5)ä)$ñ #ÿ")ÿ'/ÿ-2ò((é.)ã2*ß4*à4*ä1*é0+î.+Õ6#×5&Ò2$Ð6,Æ6.½>7È`UÑq¤eSŽWC‡N:¡XGÊe[ãa_ëPTëBIùDKí@DÞ@?ÑB<ÅB8ÁB9ÌIAßPLìKPô@Kù9Hý7Hþ5Hø3Eö7G÷=K÷9R÷9Rø7Rú7Uý7Xÿ9]ÿ<aÿ=gÿ@kÿ@nÿBqÿDtÿCuûCuùCv÷BuÿFgúAaþEeÿJlÿJkÿUtÿ^zö\vôi~éo~Önw¯]a„CAh6/hB7vTHwf_Œ}v£–¬¤¡²®­¶¶¸²µºª¯µ°·¿¶½Å½ÁÊÂÂÌÃÂÊËÅÏÕÎÖßÕÞäÙÕèÝÛéÝÝæÚÞåØßä×àáÔÞÙÏØËÄË»¹¼¤¦£ˆ’‡t‚qexb[tWXqS\iK\iK[hJ560560560560560671872983<;6?<7@=8B?:DA<GB>HC?ID@HE>HE>ID>JE?JF=MF>MF<OF=NF;OE;ND8PD8PD6PD6QC6QC6OC5MD5KB3JA2H>2G=1E=2D<1C:1C:1A:2A:2@93?82<71<71<8-<8-<8-?8.@:.B:/D</F<0I@1K?/M@0NA0P@0PA.O@-O@-O=1O=1M=0L;1H:/G9.E9-C9/A9.@:.@9/?;0?=1@>2??3@@4”67Á]_ÈZ[¯78®,,µ/,±,#°0#¯8$®B(©G* G'šF$šF$–C!”? Ÿ81£;2¦92¨50°:6¹B>¹D=±>7«<3¨<2¦</«<1¸F<ÆKDÄE>»72»:Ê<$á:*ñ.(ÿ$&ÿ'ÿ'ÿ%ÿ%(ù,)ñ2*ë5*è3(è2'ê/&ì-%Ü=(Ñ2Þ>0Ñ5)Ê7/Â?7¯C9Çqd²m]–YF™VE¿i\ÝlfãSSë@Hù?Lï<Bä:=×<:Í@9Á>4¹6,½4.Î44ïBHø8Gÿ2Fÿ3Hÿ5Iú7Gö<JöBNÿ>Yÿ=Xÿ:Wÿ6Wÿ5Yÿ5\ÿ6_ÿ7eÿ;kÿ:mÿ;oÿ<rÿ<rþ=tû>tû>vôEbýNkÿTqúIfð?\ÿRqÿfƒÿf€ô^wêbváky×s{Ärvªfe”ZV‰TN’€~¨™–¾°°Ä»¼ÆÁÅÈÇÍÅÈÑÀÄÏÆÌØÈËÚËÍÜÓÐáÚÖåäÜëêßïîáòòäãõççöçêóâèñàêïßêìÜéå×äÓÉÒþά©—y‡vi|f`w[\uWbqRapQ`oP201312423653875984984983;:5<<4==5??5AA7CC9EE9EE9HH@HH>HH<HI9KJ6LK6MM5MM5LK7IG8EE;HGELIPKIWFCVA=TQF4NC1JA0KB1MD5LB6F>3B90E<5C:5@85?74@86?67>56:44F85E76B87@78>:;<:=<<>==????A@<DA:HB6JA2M@-P?+O?(CB0F?/K:2O62Q35Q28N5;F:<??=-=3)A1.J4/G-,?#5B&GP3Ô`S»J<§7)¢7'£:'ž9%ž;&£@)Ÿ;$£='¬?+¯?+²:)±6&³4%´2$Ÿ8'Ÿ8'Ÿ:(£>,§B0©D2©D0©B/¨?,«>*­<*µ=-¾C4ÅF7À>0·3&Í6+Ì8,Ì:-Ì=/Ï=.Ô</Ý90æ5/ï/,õ--ø.,ó0,ë4,à9)Ø=)Ó>(Þ9%Ô4Ï4 Î9%Å8&¾6&Æ@4ÕQEÒIAÜMIïUUüVXýJPø9Aü4?ÿ9DäCHßCFÓAAÆ?;¹=3®=/ª?/ª@0¿Q@ÉQCÑLCØC=å??÷@Eÿ>Gÿ8CúGMúENûEQþESüARú=Sü>XÿCbÿGiÿBhù<fô;gô=køDsûIyýK}ÿMyýNwóRtçTqÝQkáQlø[xÿdˆÿY…ÿ?lÿMxöX{ÍYp¿yƒca„}sª½§™ÑŹÚ×ÎÛÝÚÙÜáÞÜéåÙíëÔîôÓðùÔóýÙóüßóøæòõìñóïðøõðøõð÷òïôîîðêêíäçèßäæÝâÖÐÔÍÉÊ»¹º¤¤¢Š|zt|qpzo~…sy€nv}k0./1/0320542653762873872:94;;3==5??5AA7CC9DD8EE9HH@HH>HH<JH9KJ6LK6MM5NM8KJ6KI<KJEQORWU`ZWhVTjQNiSI@ND;H?6F=6G>7H?8F=6C:5C<6A:4?74?74@85>95=84;63>3/=4/>42<74=98<;9=<:>=;@?;C@9G@6J@4L@0O@-P?+P>(=B,?A,E=0H92K63J46F35A57>=;8=69?5?A4C=-J9)^B4sRC¼K=¬;- 2#¡6&£:'8$ž9%£?(¡;%¦=(­@,³@-¶=,·9*¸6(¹5(¦;+¤:*£9)¥;+¦?.©B/«B/«@.­?.«:(±<+¿E6ÆH9Á?1¼8+½7+Ï5+Ï7,Î:.Ï;/Ó=/×;/ß8/ç4/ð0-õ--÷-+ò/+ê4)ß8(Ö;'Ï=&á:'Ù7"×8%Ô=*Ì;*Á5&Ã;/ÍG<ÐG?ÙJFèPOóPQôGKò;@÷:Aÿ?GàDGÜDCÓB?Å>8·;1¬;-ª<-©>.µF5ÅM?ÓNEÜGCã?@ñ>Bý>Fÿ>H÷DJ÷CLúDPÿFTýBSú=Sü>XÿBaÿFhÿCiü?iù@lùBpûGvüJzþL|ÿIxÿHtõKpðRsò]zö`{ùXwýMqÿCkÿAlóCjÝJgÉ^p®pugNI†‚v´”‡Ì²¥äÔÇëäÜèéäéêîéçòíáõöâûýàüÿâýÿçþÿìÿÿòþÿ÷üþúûþûöýúõü÷ôúôôøïðôëîñèëïæëäÞâÜÖØÊÆÅ²²°ž ›Ž“Œˆ…ˆ…–†‰€†}/.,0/-10.21/43/540762761:94::2<<4>>4@@6BB8CC9DD8IF=IG;JH;KJ8MJ7NL7NL7OL9KI:NKBTSQ_^dihxmm…lkŠihˆcYd[QZQGPJ@IH>FG>CC=A@:<A;;?:7<73<73=82>:1>:1=90:3-94.;60=82=:3>;4?<5?<3C?4F@4I?3L@2O?0P?-Q>-P>*3@&7?'<=+A;-B8/A62>42;31=85B:7H94O2.[+)o-.Š:= EJª9+¢2$Ÿ1"¤9'¥<)ž7$8$¢<&¤;&¨=)±A-¶A/¹>.»<-¾:-À:.®>0¬<.©9+¨:+ª<+¬>-­>-¬=,²?-®9(¸>/ÊL=ÊH:¼6*º2&Å;0Ó5*Ô6+Ò8,Ô:.×;/Û9.â7/é2,ñ/-õ.+õ.+ñ0)ç2'Ý6&Ó8$Ì:#à7$Ü5#Û8'Û>-Ó=.Æ7)Å8.ËA7Ç<5Ì?8ÙEAåKIìIJëCCí?Að@CÜDC×C?ÏB;Â=4¶:.­9*ª;*«<+ª9)¿E8ÔNEÝIEâ?@ë<AùAIÿFPôAGô@IùCOýGTþEUû@Uü>Xÿ@_ÿDfÿCiþDmÿFpÿIwÿK{ÿL|ýK{ÿCvÿGwÿJtúNtþZ|ÿa€ýUvòCdüHkÿRvÞ=\ÎH`Úz†µ}~\F;„r³‹Õ³§óÛÑúíåøóðøøú÷ôýôëüüêÿÿéÿÿëÿÿíÿÿòÿÿ÷ÿÿûÿÿýþÿþúÿýùÿûøÿøöþõöýòöûðôúïóðçêåßáÓÏξ½¹­®¨¢¥œ£™£—¤ªœŸ¥—œ¢”/.,/.,0/-10,21-32.54/650872991;;3==3??5AA7BB8CC9IE<JF;KG;OI9PK8QL8QL8OL;LJ=SPK^]bmlzzz’£€‚©~«|u–rkŒe^}YSoRMdMEZG@PB<HD?F@;?<87;62;7.<8-=9-<8,880991;;1><0?=1@<0?<-A;+F?/H?.K?/M@/O?/P?/Q>/P=.<@)=?*?>,?<-?;0=:3;:5:94<94D95N43[*-o&--8¨3C¶7H§7)¥7&§9(ª?-¨?, 9&Ÿ9#¤;&¥:&«<)³>,¹@/½>/Â<0Å=/Ç=0¹@5¶=2²:,®8*¯9+°:,²:,²:*¶;,¹;-ÄB4ËE9Ç?3¾1'À2(Ê:1Ú3+Ø4*Ù7,Ú8-Ü8.ß7,æ3,ì1,ó0,õ.+õ.)ï0(æ1&Ú4$Ñ6 Ê8Ü/Ú0Ú4$Ý;,Ø</Ð9.Ï<2ÒC;Ã6/Ä70Ê;5ÖE@âMIåLGÞC?Ù;8ÑA9Ï@8Ç>4¾</µ:+°8*®:+°<-¬4&½?3ÏHBÙHEßABæ@DôELÿLUð?Eð?GöBKþHUþHWüBWû?Wý@\ÿBbÿCfÿFmÿIsÿMyÿO|ÿL{þJyÿ@tÿL~ÿQ}ÿJrúLoÿUwÿUuùLjòEcïKfÒ>Vßetû §Í‘]=2aP@©wlÑ¥œöÔËþêãÿôòÿþÿÿüÿùóÿüïÿÿïÿÿðÿÿòÿÿôÿÿ÷þÿûýÿüûÿýùÿüøÿúøÿù÷ÿö÷ÿôøÿôøþó÷öëïìãäÚÔÔÉź¹´³´¬±´©²µª¶¾³°¸­¬´©10,10,0/+0/+10,21,43.54/77/880991;;1==3??5AA7BB8KD:LF:OG:QJ:RK9SL9RM:QK=OKBVTUfdowx††¨»“ÃŽ‘ÆŠÀ‡‚¸{w©rlœid_[~UPnNJaJGXEBM?=B;7696196-86*86)581692891;;/><-?<+C<)D<'I>*J?+L?,M@/M@0M?2M?4L>3M?4K?3F<2B90=909:25<44>57<5>:1H3.\0/{48œ;D¯9E²2Aª<+ª<+«@.¬A/©@-¥<'¥<'©>*§8%­:'µ<+¼=.Á;/Å;.Ê<0Ì<1ÁA6¾>3º:/·7,·7,¸8+¸8+º8+»7+ÇA5ÍC8Å8.Á1&Æ3)Ë7-Í6-à2+ß3)á5+â6,ã5,ç4-ê2*ð/*ö/,ø.*ô/)ì0'ã1#Ù4!Î6É7Ú/Ù/Ù2"Ù5)Ù9-Ô:0Ö?6ØE=ÕF>Í@9Ç<5Ë@9ÖKDÙNGÐF<Å;1Å=1Ä<0À</º;,·9*´:+µ=-¹?2µ9-½=4É@:ÒC?ÛBDãDHîIOöOVí>Cí>EóBJûJTÿJYýFXúCYýB]ù@_ûBdþFjÿJsÿOxÿOzÿLyýIxÿGwÿRÿQ}ÿIqûImÿStÿVtøNiëD^äF]èYkÿ—¢ÿ¶¼î žˆKFd2)©jcÍ–ôÇÁÿãÞÿòðÿüýÿýÿú÷ÿý÷ÿÿöÿÿöÿÿøÿÿùÿÿüÿÿýýÿýúÿüøÿûøÿúøÿø÷ÿ÷øÿõ÷ÿôøÿôøýñóóéêäÜÚÖÑÍÍÊÃÉÉ¿É˾ËÍÀÇÑȾȿ·Á¸84163.52-30+30+41,52-63,85.96/:70<90>;2@=4B?6B?6KC8ME:PF:SJ9TK:UL;SL<RL@QLHZW^kj|~Œº–™Î˜žÚ™žÞ™˜Þ“’Ö‹ŠÌ†„Ã~·xv¨ml–fe‡]ZwVTiMKXDAH><=;:6;8396/267465672880<:-A<)D>(G?(I?&J?)IA,JA0IA4IA6HA9G@:R9<N8;I68A57:65384.93+;12?517+=3'X:0{D=•GCž>?ž46§<*¨=+ª?-ª?-©>,©>*¬?+¯@-«8%²9(¹:+¿:+Ã9,É9.Î:0Ò;2É>7Æ;4Ã81Â8.Â8.Ã9/Â8.Ã6,Ä7-ÑC9Ò?5Ä0&Ã,#Ð7/Ö<4Î4,æ1*æ1*ç2)è3*ê3+í2+ð/*ó.(ø.*÷-)ò/)ì2&ã3$Ø5"Ï7 Ì7Ü5#Ù3#Ø2$Ö2&Õ5)Õ7,Õ;3Ö?8ìYRáRJÓHAÊD;ÉF<ÊJ?ÅG;½?3¼;(¼;(º;*¹:)·:(¸:+¼>0¿A3ÁA6Á<5Å<6ÏA?×EEÝGIãJMèMQëADì?EðCIúJTþN[üJZüF\üF]øA]ùBaýEiÿJpÿNwÿOzÿMxÿKxÿR{ÿR{þOvýOtÿVwÿ]{ÿSoîD^øUjîQd÷dtÿ’žÿ‹“òƒ‰Ç`c­KL²keÏŽˆñ¼¶ÿÞÙÿðìÿúúÿüþýûÿüûÿþûÿÿûÿÿûÿÿüÿÿûýÿûûÿûøÿûøÿüùÿûùÿûúÿøúÿöøÿòõÿðóûìïòææçÝÛߨÒÛ×ÎÝÛÏàÞÑàáÓÚãÞÏØÓÅÎÉ<94;8385052-41*41*52+63,74-85.96/;8/=:1?<3A>5B?6KA7MC7RF8UI9WK;WK;UL=SJASJK[Xcnl‚‚‚¨‘”Çš Þž§ì¡©ò¡¤óž í™›æ•˜ß”•Ö̈‰¿‚ƒ±zz rq‘fd|XWiPN\IGRFCJDBG=?K==G;:?;:8<92A;-D=*F@*F@(GA)GB.ED2CC7BC=AC@>BAG9HH<JG?LGDODGN@JL;II:ID?KA<@2F=.bH9QB‰K<Œ@2Ž;-¨=+©>,©>,ª?+­@,¯@-°?-°=*±8'¶8)½9*Ã9,È8-Ì8.Ò91Õ;3Î;4Í:3Ë81Ë81Ì92Í:2Ì70Ë6/Ó<3Õ>5Ò91Ì2*Ð3*Ù;2Ú<3Ó5,è0(é1)ì1*î1+ñ0+ò/)ô-(ö,(÷-)õ.)ñ0)ê2(â5%Ù6#Ò7!Í8 Õ8%Õ8%Õ5%Ñ4%Ò4(Ô6+Ô7.Ð7/ãNGèXPçZQØRIËH>ÃE9¼B5·?1¹<&¹<&¹<(¸;'¸9(º;*À>0Ä@4ÉD;Æ?9É@:ÑFCÕIHÖHG×IHÛJMìCFêADíDIöKSüQZýN]ûL]üJ`öD^÷DaùFfýIlÿNuÿOxÿOxÿNyðYzðWvóVuüYxÿ]{ÿZuûQkòI`ýWköUgêN\ö^kâKZçSaçSaåQ_¸jfÉ‚~窧ÿÓÑÿëèÿôòÿøùÿÿÿùýÿùüÿûüÿüüþüúûýùøüøõü÷ôÿú÷ÿûøÿüúÿûúÿøøÿòõýîñúëîðââëÝÝäÙÕâÙÒæßÕëçÛñîßóñâêóðÜåâÏØÕ@=6=:3:7074-52+52+52+63,74-74-96/;8/=:1?<3@=4A>5M@7OC7RF8WJ:XK:YL<WK=TICSJM^Xfpmˆ‚„­‘–Íœ£ç£¬ù¥°ÿª±ÿ¦«ü¡§õž¤îŸ£ê ã™›Ø•–Î’’ĉˆ´yyŸji‹`]|XUpSOhPLcMJeKG^FBS@=H?;<?:4B<0A>-C@-CB.BC3AE7>E=<EB;EF9DF:D]@JcHTjR]oXdt\fp]dj`ac`[W]LDgI>€UE’YFL7A+“A+«@,®A-®A-®A-°A.²A/²=+°7&µ7(¼8)Â8+È8-Í6-Ñ7/Õ8/Ù;2Ò73Ñ61Ñ61Ò72Ô94Ô94Õ81Ó6/ÞA:Ö8/Ñ3*Ø7/Þ=5Þ=5Û8/Ù6-ë0'ì0'ï0(ò/)õ.)ø-)ø+(ø+(ø-)ô/)ð1)é4)á5'Ù8&Ó8$Ï8#Í8$Î9%Î7$Ï6&Ð7)Ô8,Ó7+Î4*Ì3+ãNGôd\ë`YÔOFÂB9¸<2´:/·?&¸>&·=&¸;%º9&½9*Á;/Ä>3ÌC9ÊA9ÎE?ÕKHÓLIÎGDÌFEÐJIéFGæCDéDHòMSùRZùR\ùN^úOaõG^õGbøGdûIiÿNrÿRvÿRyÿRyå[uë\xõ`}ü_|øUpõMgùPgÿYnÿ[mÿbsóL]úSdøM_ÿRgüI_ýE]³d`¾tqÚš˜ûÈÅÿåãÿîëÿõôÿÿÿûÿÿùÿÿùÿÿúÿÿüþýýüúýùöýøõÿøõÿùöÿúøÿúùÿööþððøêêõåæìÜÝèÚÙæØÕèÞÕðèÝùóåþûêÿþíòûúâëêÔÝÜA>5@=4?<3=:1;8/96-74+63*52)52)63*74-:70=:3@=6B?8J@6OC7RF8VI9WJ9XK;ZL?[NHTIMXR`gd|}©’Ì—Ÿçž©ù¤°ÿª³ÿª³ÿ¬³ÿ«³þª±ùª®õ¨«î§«êŸ¡Ü™šÒÁ±ur¡he’]Z…XR~YP{YQxVOpOG_E?M?:@?;8@@6>>2@B5@F:>E=:C>9CB<GI?MP:YvKh†[udunx‘|zq‚|`n†]eX[œXU¥WM¥M?A,š:"Ÿ;#©<(«>*®?,±@.³@.´?-¶=,¹;,º6'¿5(Ä6*Ë7-Ñ7-Ö8/Ú91Û81×84Ø95Ù:6Ú85Ø61Ø61Û83Ý:3æC<à=6Ú70ã@7þ[Rÿlcÿ]Tã@7é1'î2)ò1*ô/)õ*&÷'%ø(&ú*(ø-)ó0*í2)ã1%Ú0#Ó1"Ò5$Õ:(É=&É=&Ë=)Ï<*Ñ;,Ò9+Ô8,Ó6-Ú@8Ð71ÜGAôc^ãXQÉB<Å@9·3.´<#¶<$¹<&º<&½:(¿:)Ä<.Ç=2È>4ÌC;ÙPJßXTÓOJÁ@;¿@:ÊKEäFEäFEèJKïPTòQWïNVïKVñL\ùRdøOf÷Ke÷JfüMnÿRsÿRvÿPtê[wêZuðZuú[wÿ]xÿZsÿWnÿViÿctþVgÿ\mÿYlõDXùBXÿMeÿIb·nh­hcËŽ‹èµ²ùÑÏÿêéýïîúù÷øþüøÿÿøÿÿøÿþúþýþþüÿûøþöôþùõÿû÷ÿùöÿöôÿööÿõõöèèçרäÔÔÞÐÍãÖÐñçÝüôçÿøèÿüéÿÿí÷ÿÿèñðØáàC?4B>3A=2?;0=90;7.:6-95,73*73*73*83-:5/=82@;5B=7I?5LB6QE7UH8VI8YI9YK>ZMEUKLXP_ebyz¦‰É”œäš§ö ¯ÿ«´ÿ¬µÿ­·ÿ¯·ÿ¯·ÿ¯¶ü¯³ú¯²÷§ªí¢£ä˜˜ØŒŠÉ€~½uq®ie¢b^›cVŽbU‹]TƒWOtNHdFCTBAIAAA;=8@C<DG@BD??A@BCGMNSWW_Vl“gyŸw¥€€¢Ž œ}œ£qŒ¥_w¯XkºTa¾OU¼FD¶=4±9(±:$°<#§8%¨7%©8&­:(°8'²9(µ7(¹5&»3%Â4(Ë7-Ó;0Ù<3Þ=5à;5à;5á>9ß<7ß<7â=9æA=èC=éB<èA;ç@:èA9ä@7Ü8/Õ1'Ø6+ëI>þ\Qô?4î6,ê+#î)#ù,)ÿ./þ,-ø((ú0.õ4/ï7/ç6,Ü4)Ö2&Ó3%Ò5&Å='Ç<'É<(Ì;(Í:(Ï7)Ï6(Ð4(Õ8/Ï5-Õ<6åPJçSOÛLHÏA?º/,¹=%º>&»='½<'¾9(À8(Ã9,Ä:/È>4ËB:ÕOFÜWPÒQKÃD=¿B<ÆKDáIFáIFåMLëSRíTVëPVéNVìOZ÷VføUhùSiúRküRmÿSqÿStÿRsïNoøTvÿ\|ÿ^{ÿ[vÿUoýQgûReüUføQbÿZhÿZjôM^úRcÿWiôI\§ha™\W·€{Ù©¥ïÇÅýáÞùêçýøõøýùøÿÿ÷ÿÿöÿýùÿýÿÿýÿûûÿö÷üùòþùõþùõþöóÿ÷õÿõõøêéêÜÛäÖÓÝÐÊáÔÌïåÙüõåÿùçÿýéÿÿì÷ÿýèñîÙâßEA5EA6C?4A=2?;0=9.<8-;7.84+84+73*83-:5/=82?:4A<6G>5JB7ND8RF6TG6WG7YI:YKBWKKXP[b^wsuž…ŠÂ™Þ—¤ó¬ÿª´û¬¶ý®¸ÿ±¹ÿ²ºÿ´»ÿ³ºÿµ¹ÿ¯²ùª­ô££ë™—àŽŒÕ‚€Éxt¾qm·l`¢i]dY“^V‡VQyNKhEDV@@J76;?=>HBBKABN?BYFJmX_}fnt¤}¬§‚®¬}§´w ¾p—Âc…ÃRpÅE^ÔI\×EPÊ9<¾3,»7(¸;%³; ¯<*¯<*°;)³;*·<,»<-À<-Ä<.Ä6*Ë8.Ô<1Û>5á@8á>7à<3á:2Ü73Ù40Ø3/à93èA;ìE?êA<å<5ã<4Û4,Ø4*Û7-Ô2'Ì, Ö6*èH<÷I>ò@6ï4-ð-)÷+*ý+,ý+,ø*,ñ))ì/+è3,â5.Ü4+Ö2(Ô2'Ô2'Ç:&È;'Ê<(Î;)Ñ;*Ò:,Ô8+Ô8,Ñ4+Ø;4Õ:5Õ<7çONîXYÙEEÅ02¾=(¿<(¿<(¿:'Á9)À8*Á7*Á7,Æ>2ÇA6ÏJAØUKÑRIÄH>¿E:ÃH@ÚIDÙHCÝLGäSPåSSâPQâMQåNWòXdöZhý[pþZrýUoûQlýPnÿRpÿFmÿOvÿZ}ÿ[{ÿVqÿSkÿVkÿ[mûYhúYhü`mö`kî\fñenífmÚT[’cY}ND™lfØ’ß¹¶ñÓÑôàßþöôøú÷÷ÿý÷ÿÿöÿýùÿýÿþÿÿýÿÿ÷ûúúòüùôüùôýøôÿùöÿøöùîìñãâçÙÖÝÐÈÜÒÈîäØýöäÿûèÿýçÿÿè÷ýùêðìÝãßIE9HD8FB6D@4B>2@<1?;0>:/:6-95,95,94.:5/<71>93@;5E>6HA7LD7QE5RE4UF3WG7WI<XMIXNW_Zppp–€†ºŒ•Ö”¢íšªø¨°ø©±ù¬´ü¯·ÿ±¸ÿ²¹ÿ´¸ÿ´¸ÿ®²ü«­ø¥§ôŸžì—–䌋قÏ{zÈxl´pf«h_ _Z’YW†QQwGGc@?Q<6DF9BS>C_@EmDJ€OU•]f¦jrÇe˜ÍkœÏl›Ïf‘Í]…ÎTyÌFgË8UÌ0Hß>PäBMÔ:<Æ7/Ã@.ºB*®<!­5$­5$®5$±6&¶7(¼8)Ã;-È</Ó@6×@5Ú@6Ý?6ß<5Þ:1Ý6.Û4,Ò/(Ò-'Ó.(Ú3-á:4ä;4á81Ý4-Ü5,Ò+"Í)Ù7,âB4Ü?0Ð4%Ê.éF7óI<ýH?ü<9ö,,ó"%÷&)û/2ñ-.ë/-ä2.Þ3,Ù2*×0(Ö/'Ö/)Ð8*Ò9+Ô;-Ö=-Ú>/Û?0Ü@3Ü@3Ò6*èKBåJEÎ50àFFóZ\áHKØ?BÆ=-Ä;+Ã:*Ã:*Ã:*Ã9,Á9+À8,Â<0Â>2ÈF9ÏOBÎPDÄH<¿C7¾D7ÑF?ÑF?ÕJCÛPKÝROÙMLÚKMÜKPëX`ó[hüaqÿauûWoõOgõMgúPkÿJuÿOyÿSwÿRqÿSmþ[pÿcuÿixÿguüaoôbmìelàglÔjjÉjh¼c_dVeH:_Tª‡Í«©åÇÇïÚÙÿóóùøöøþü÷ÿÿ÷ÿÿûÿÿÿþÿÿüÿÿ÷þûüôúûóûúõþûöÿýùÿûøþôòøíéêßÙÞÔËÝÓÇíæÖÿøåÿþèÿÿæÿÿçõúóêïèáæßLI:KH9JG8HD8FB6D@4B>3A=2=9.<8/;7.;60;60<71>93?:4B?8EA8JD8NE4PE1TE0VG4XH9ZMEVMR[Whkl‹~‚²‰“Ð’Ÿå™§ò§­÷©¯ù«±û­³ý°´þ°´þ°´þ¯³ý«®û¨«ø¥§ô ¢ïšœé“•⊌ل†Ó…É{u½mk­dd _a”X[†QQsNHbUFY_CRlBLEO˜LV¬U]¼[dÅ]fçJuéNxæPuàLn×FcÒ?YÍ5JÊ+?Ú5EçAMéFKÙ><Í>6ÊH8¿J6°B)·>-¸=-º<-½>/Ã?2ÊB4ÐD7ÕE:ÙE9ÚB7Û>5Û:2Ù6-Ù5,Ú3+Ù2*Ô1*×4-Û60Ý90ß80Þ7/Ý6.Ü5,Ö/&Ù5+Ø6)Ï2#Í1"Ò9)Õ>-Ó<+Ö=-æD7÷KAÿD?û56÷)-÷)-ù.2ø67í55â30Ú1,×/,×/,Ù0-Û/-ã80â:1â:1â<0à<0ß=0Ü?0Ú>1Ñ7+ïWLù`XÓ;6Ó;:èOQÞEHèOTÍ=2Ê:/Æ8,Æ8,Æ:-Å;.Ã;-À:.¾:-¾<.ÁB3ÇH9ÇI:ÂD6¾@2¼>0ÊE<ÊE<ÎI@ÕPI×RMÔNKÓKK×LOçZ`ð^hüfrÿhxü]qóOgóMeùQjÿPzÿQxÿQpûSmø\qûhxûjw÷epüfró_kí_kêkrÝsu¿lh¦f\¡l^ujXVI8kXJ–{t¾ŸœßÁÁïÕØþîïûõõúüûúÿÿùÿÿýþÿÿýÿÿûÿÿ÷ÿýÿ÷ûþõûüöÿþùÿÿúÿþúÿûõÿ÷òñèáäÜÑáÙÌðé×ÿúæÿÿæÿÿãÿÿäöùðíðççêáQK=PJ<OI;MG9KE9IC7GA5G@6B;1A:2@91?82?82?82A:4B:7@?:EB;IE9MF6PE1RF0UF1WG7YLCUKLZTbii…|«‰’É“žÞ—¦ë¨«ú©¬û«®ý­°ý®±þ®±þ­°ý­°ý©­÷§«õ¤¨ò¢¦ðŸ£íšžè•™â‘•Þ’’Ú‰‰Ï|€Àrx´nu«lpŸhhŽj_x`x‚WjO_¥OZ½R\ÑR[ÚOVÛHPñ:Pî=QéAPàCLØCIÑ?BË9:Ê45åIJèHHã@AÕ76Î93ÌB8ÅE8º@1ÃE6ÃE6ÅF7ÉE8ÌG8ÑG:ÖH<ÛG;Ö>3Õ;1Ö8/Õ4*Ö3*Ø4+Û4,Ü5-Ú9/Ý<2à=4ß<3Ý90Ü5-Ü5,Ý6-Ò.$Ý;.Ü<.Í1"Å.Í8$Ð=)Ì;&Ë:'Ò9+á:1ó=9ÿ@@ÿ;?ÿ27ô+1ê,.ß+,×+)Ó+(×/.Þ44ä88è:;ó55ò64î73é6/ã7-Ý5*×5(Ñ5&Í5'çPEÿmcÛHAÈ42×CCÓ>BêUYÙB;Ô=6Ì70Æ6-Ç9/Æ<1Ã=1Á=.»9)»<+½@.¿B0¿B0¾?.¼=,»<+ÃC8ÄD9ÈH=ÏPGÒSLÐOIÐOJÔOPç_cîaiûitÿm|ÿdu÷UjõRgýWoÿSxÿUtûWpð_pñoyôy~êmsÞXaïamò`mïaoðs{숊ɂ|¥wjšyhhpYMO:^WGƒqg±•’Ý¿¿ñÔØýéëþôõýûþûÿÿúþÿýþÿÿýÿÿûÿÿöÿüÿøùÿõúýôÿÿúÿÿúÿÿúÿý÷ÿþöùðçíåÚéâÒôïÜÿûåÿþåÿÿãÿÿâøúíòôçîðãSM=RL<QK=OI;MG9KE9JD8IB8E>4D=5B;3A:4@93A:4A96B:7@A;CC;IE:NG7QF2RF.UF/WH5XJ=RHFXR\jh€}§‹’Æ’žÚ–¤å¥¦ù¦§ú©ªý«¬þ¬­ÿ­®þ¬­ý«®û¨¬ö¦ªó¤¨ñ£§î¡¨î §ë¤è›¢æ™žâ’šÛŠ”Ò…Ê‚ŽÂ‚‰·‚©‡yšŽmˆšczªWi¾P]ÓKWäGPí?Hñ9Aî;6é<5âB6ÙH7ÎJ5ÅG1ÂD.Å@/ãUGàG?Ú;7Ø64Ø88Ö:;Ï98Ê66¼=.¾<.¿;.À;,Â8+Ä6*Æ3)È1&Í5*Ð3*Ñ3(Õ2)×3*Ù5,Ý6.Þ7/Ü>3Ý<2Ü;1Û8/Û7.Ú6,Ø4*×3)Õ3&Ó3%Ñ4%Ï6&Ò=)Ñ>*Ê9$À2Æ;(È5%Ó3'ç60ü;<ÿ=@ÿ7=ù27ê-1à..×--Õ0.Ü44ã9:é;=ë;>ý.4ú/3ö01î1/æ1*Þ2(Õ1%Ï3$È2#Ð>/új_ãTLÈ95Ð@@Ë:=ãRUçJEÝB=Ò93Ê5.Æ8.Å;0Â<0¿=-¹<*¼?-½@.¼?-º;(º;(½<)¾=*º>2º>2ÀD8ÈLBÌPFÊNFÌMGÐNLçbcêbføhqÿo{ÿhxøYm÷Ujþ[pÿXsü\tìbqãktç€í‰‡ãyyØ_dñhrÿl|öcsíkwø‘•餟À–Š¥‹z\pWFR<UVFtg^¤ŒˆÜ¾ÀóÔÙùâèÿóøÿúþýþÿüýÿýüÿÿüÿÿúÿÿôÿûÿøøÿõ÷ýóýÿùÿÿúÿýöÿý÷ÿÿöÿùïõïãòìÜúõáÿþçÿþâþÿàÿÿãýþðùúì÷øêUO?TN>RL<PJ<NH:LF:KE9JC9G@6F?7D=5B;5A:4A:4B:7C;8@A<DD<IG;MG7OG2RF.VG0WH3VH;RGCWRYjh~~‚§Œ”Å’žØ–¤ã¡ž÷£ ÷¦£ú©§û©ªýª«ýª«ûª¬ù§«õ¥©ò£§î §ë¢ªë£«ì¢ªë¡©è˜¡ä–¡á”ŸÝ“ŸÙјǒ‘¹™Š«‘m‰£c{´WjÇM\ÚBNë;Eø6>ÿ4:èB*âD)ÙH)ÎN+ÃO(¹L%¶H%»D&ÛWBÚF8Ú;5æ>>íBHé>Fß5>×08ÈF8ÇE7ÈD7ÉA3Ç=0Æ8,Æ3)Ç0%Ê0&Î1(Ó2(Ö3*Ù5,Ù5,Û4,Û4,áC8Û=2Ø7-Ø7-Ü:/Ý9/Ù5+Õ1'Ù7*Ð0"Ì0!Ð9&Ì9%Æ5 Ç9#ÑE.Á:&É:)Õ7+â3.í//÷05þ5;ÿ;BÿIMúGJîDDæ@@ä>>ã9:ã28á.4þ'/û(/ø*.ó-.ë0+ã2*Û5)Ô7(Æ0!¾/óeYê]TÌA<ÓEDÊ;=ÝNRïPMäFCÕ:6Ê5/Æ8.Ä:/À</»<+»>,¼A/½B0º=)·8%º9&¾;)Á>,²8+²8+¸>1ÁG<ÅK@ÄIAÆICÊJGå`aæ^bñdlÿlxÿix÷ZköTiýZoú^tòcuãgqØqrÝ…é”ꋇåruùq{ÿxˆõ`sßXgóŠ‘ý¶´Ö«¢¬•…TnSAS;PTCkaWž†‚Ý¿ÁõÖÛøßåÿóùÿûÿÿþÿüýÿýüÿÿüÿÿúÿÿôÿùÿø÷ÿôöüòüÿøýþøüüôÿýöÿÿöÿþôûõç÷ñáüúåÿþåþýáýþßÿÿãÿÿñýþîüýíXO@XO@WN?VM>TK<SJ;RI:QH9MD5LC4KB3I@1H?0H?0H?0H?0FC<GE9JG8NI6RJ5UJ4UJ4VK9XNDULMXTbii…{~©‰ŽÆ‘™Ú— å¦¢ù¦¡û¢¡þ¡¡ÿŸ£ÿŸ¨ÿ «ÿ¡­ÿŸ«÷ ªï¡©ê§¨ë«¨ï²§õµ¦ù¶¤ú—«ÿ“¨ùŒ£ç£Ö¢¦Ë´ ¹½„“ÆbnÑEPé:Gõ5Bø4>ñ8>æ=@ÙD@ÑHBå;Dà;BÞCGÉ99ÌB@ËD@½/-ÞHIëHKîAGï;Dì8Aé:?â<>Ú<;Ô<9ÏA=É>9ÊC=ÑLCËK@¼>2³7+¹;-¹9,¾8-Å7-Ê3,Ï0,Ô/-Ý11á34çA1à9)Ü1 á1"é8(ê;*ã6%×2Ñ2Ì4Ê5Ç4 É3"Ì3%Ñ3(Ô3)Í.(Ï2+Î6+Ì8*Ë8(Í7&Ð7%Ø6'ß3'é2,ð31ò01ð+2í*2í+4ï-6ú+1÷*/ñ+,î.-ë4.ä8,Ú7(Ð5#Ã.Ä3 çXHèZLÊ<2ÞOGÄ5/ÚIFÝQRÚLKÒDBË<8È80Ç7,È9+Ê;+È;)Å:'À9%½:&»<)º=+¸=+¶=,³9.µ;.¹=1½?1½?1¿@1Â@2ÅA4ïk_õqeêd[ômiùroécbðjiútuÿk|ûivñdmï_hòaføgjõnkîqk÷|wÿ}ƒþYjÿ[wîZpû¬±«°œaŸz]sMIZ6LR6snX£–†Ë·®íÕÓÿîðÿõ÷ÿ÷ûþøüüüþþÿÿþÿÿþÿÿýþÿæÿòàÿëâýêìÿð÷ÿôûÿôþÿóÿþñÿýïÿûîÿùèÿùæÿøãÿùãÿùáþúáýÿþþÿÿþÿÿYPAXO@XO@VM>UL=TK<SJ;RI:NE6MD5LC4KB3JA2JA2JA2JA2FC<GE9JG8OH6RJ5UJ4VK5VK9XNDUMKYUciiƒ{}¦†‹Â•Ô“œß œðŸñžžöžŸû¢þŸ¦ÿ ªÿ¡¬ü ¬ô «íŸ§æ¢¦æ¦£èª¢í« ïªï™ªü—§ô˜£åžžÒ¬šÂºª½r†ÃUbÓCMå;Dð7?ñ6=í8=ã=?ÛAAÕDAä:CÜ8?Û@DË;;ÊC@ÈA=¿41åOPäDFé>Dë:Bè7?ä7;Ü89Õ:8Ð;7ÓF?Ç<5Å<4ÌG>ÌLAÁC7¶;,·9+¹7*½7+Å7-Ë4-Ñ2.Ø3/á53æ66á?0ß<-Þ6)à4&á6%á6%Û4"Ó4Ð:"Ê:"Æ:#Æ;&É<*Í;,Ì8,Ì5*Ö3.Ö5-Ñ7-Î8*É6&Ç4"Ë4!Ð3"Ø2$ß1(å/+ç.,è,-æ,1æ-3ç.4î*,î,-í0.é2.á3*Û5'×7'Ò9'Ó@,»*ÔE5Î?1ÙF>êWPØC?ØBAåWVâRRÛKJÔC>Í=5É9.È9+Ç8(È;)Ä;(Á:'¾;'½>+º?-¹@/¶>-²9.µ;0·=0¹=1º?0½?1ÁB3ÅC6ëi\òmdçb[ðkfõolèbañklûuvÿp€ÿo|öirë^fêY^òadøqnù|vöyuÿx~ùRdÿUríXnö¥«¥¨“X”n[tLN_;QZ;us\ª×úøàÜÿôóÿúûÿúûÿûüüüþúþÿûÿÿúþÿûüþçÿñáÿêáýçéÿìóÿòøÿóýÿòÿÿóÿýïÿýíÿúëÿöåûóàúòÝûõßý÷ßúúøüüúÿÿýZQBYPAYPAWN?VM>UL=TK<TK<QH9PG8OF7MD5MD5MD5MD5MD5GD;JF;MG9PI7SK6VK5VK5VK9WMCVNL\Vbkiy{¢…ˆ»‹‘Í—Ø™—à™˜ä˜™éšœï›Ÿö£ùŸ§ø ©ö ªïž§èœ¤âœ¢àžŸàžáŸ™ãž—ä㖛ݠ–Ү¼ƒ®Ær“ÇZqÇCQ×AJá>Cæ<?è;=æ<?ã=Aá>Cß>Câ;CØ7=Õ?AÏA@ÉD?Â=8Ã96ëWWàBCæ=Bé:Aæ7<Þ58Ö66Ñ96Ì;6ÕHAÅ:3¾5+ÅA5ËK>ÆH:»=/¶8)¹7)¿7+Æ8,Î7.Õ60Þ63æ87ë;;Ó5)Ö6*Ú6*Ü6*Ý5(Ý7)Ú:*Ö?,Ã5¼5¸6 ¸7"»9)¼8+¼4(º0&é=;å>8Þ=5Ô</Ì9)Æ8$È7"Ì7#Ò7%Ö2&Ù.&Ú-'Ü-*Ü.-Û//Û//Þ*)á/+á4.Ý5,Õ3&Ð5#Ð9&Ñ>*ÓB/Â1 æTEÐ<0ÚA;ÞC?èJIòTSèVVçSSãOMÝIEÖC;Ï<2Ê8+Å6&Ä7&À7%¼7$»:'¹<*·>-µ=,²=,°:.±;/²<.µ=/·=.º?0ÀB4ÃE7Ü\Oêg]äaYñlgöpoçabìfgòkoäP`ï^kôhqòemñ`eödgûqqúzwövsÿnuõJ]ÿMjïUmñœ¡ŸžŠPˆcVoEOd=Va?ww]¯¤’âÐÄÿíæÿ÷óÿûøÿýûÿþüûÿüûÿýûÿýùÿû÷ýùãÿëÜþãÚøÞàúáèûåïüèöýëýþîýúëÿúêÿ÷èúñàòê×ðèÕôìÙùñÜýùöÿûøÿþû\PB\PB[OAZN@YM?YM?XL>XL>UI;TH:SG9RF8RF8RF8RF8RF8JF=KG<OI;RK9TL7WL6WL6WL:VL@UMJ\V`jh~yy‚„´ˆÄŽ”Ð””Ò”•Õ••Û–˜ã˜›ê˜žìš¢í›£ëœ¥æ˜¢ß–ŸØ“œÕ“™Õ“—×’“ÖÖ†½Ž„¹£~²¸r¤Êe‘ÖTzÙDa×:Kà@HÞBCÞC?ÞC?áAAä?Cè=Fë;Fã?FÖ:>Ó>@ÐFCÅA<¸71Å>:ê[WÝABä?Cç=@ã:=Û89Ó97Î=8ÌA:ÏE;Ã9/»2(À</ÇE7ÄE6½>/¸9(¼8)Â8+É:,Ò:/Ù80á83è;7ì=:Ô3+Ö3,Ù5,Ý4-Þ6-Þ7.Ú:.Ô>/Æ9(Á<)½>-¹>.»=/½=2Á>6Ã>7ó?>î?<æ?7Ù=1Í:*Æ9%Æ;$È<%Ï<(Ï8'Ï2#Ñ1%Ó2(Õ4,Ñ2,Ï0*Ñ3*Ó5*Ñ7+Ï7)Ê7'É8%Ê<(Ì>*Ê<(Î=,ô^PàF<Ò3/Ò.-è?BþUXÿvuÿroÿjgö^YçPIÕA7Ç5(½.Ä8'À9&»8&¹:)¶=,µ=-±>,°<-­<.­<.®=/°<-±;-¶>0¼B3ÁE9ÉMAß`Wâa[ôpløtrå`aä]aå^dÙFVçYeógpôgo÷dlýjpÿstúxvõssûenóCXÿEbðRkë’˜œ—ƒN‚\Ql?Ri?ZhDy|_°ª”èÛËÿôêÿùðÿúóÿýöýÿùûÿúùÿúöÿøòüóîøïÔüÚÎóÒÊëÌÏìÎ×îÒàïØéòÝóöãöõãûõåüõãõìÛíáÑéÝÍíáÑóç×úõïü÷ñþùó\PB\PB[OA[OAZN@YM?YM?YM?WK=VJ<UI;UI;TH:UI;UI;UI;LH=OI=QI<TK:WL8XM7YM7XM;UK?UKI\U]hexut“|~§„ˆ¸ŒÄŽÁŽ‘Æ’Í’“Ô’•Ü“—à”˜á•šÞ•Ü’›ÔŒ•̇‘ƃŒÃ‡Ã}‚ÂzÁ|vš‹q–¦h‘Ä[†ÚKvè>cî7Uí8IçAEßFAØIAØIAÞFCæAGð;Jõ8JãDI×>AÐ@?ÏJE¾?8²3,ÇD<âTPÜDCáACä>@â>?Ü>=Ô@<ÏE;ÌH<Ç=2Á7,½5'½9*¿=-¿=-»<+½<)À;*Ç;,Î<-Õ;/Û8/à70ç83ë95ã:7â64â22å31æ42ä50Û2+Ò1)É2'Ç9-Ä<0¿90¼5/¿52È<;ÒDCó57î66å61Ø5,Ë5&Ã6"Á9#Ã;#É>'Ê9&Ë5$Í5'Ñ9,Ó;0Ò:/Ï8-Í?1É;-Ä8'Ã7&Ã:'Å<)Å='Æ;&Í>-Í:*Ø>2ãB:Ö.+æ::á14å26Ò73Ö;7ÞC>åJEêQIêSHèTHäUGË?0Æ>.¾<,º<-¶>.³@.°?/®?.«=0«=.¬<.¬<.­<,±=.·A3¼D6ÆLAÞbZâc]ðnlôrrå`cå`eæ`gúixûozõltí`hñ^fÿkqÿw{ÿ{|öpqø^hö@Wý>]óOh懠•ƒX†aXuE\vIgwP‚ˆfµ±–éáÌÿùéÿüíÿýñþÿóûÿôøÿöôÿóíûìäòãÝëÜÁëŻ㾺޺¿Þ¼ÆáÀÍâÃØæÌãëÓìîÙôñÞøñßóêÛìàÒèÚÍìÜÏñáÔòçáòçáóèâ[OA[OA[OAZN@ZN@YM?YM?YM?XL>XL>WK=VJ<VJ<WK=WK=XL>PI?QI>SK>UL;XM9YM7YM7XM;WK=ULGYSWc_nmkƒtt–|~§ƒ†³†‰²‡Š·ŠŒ¿‹ÈŽÏŽŽÔÕÓ”Ó‹Ê‚‰¿{‚¶u|²ov­gp«ck©€n~ey­ZvÏMoê?cú2Vÿ0Lû6Gð@CâGBÙLB×MCÝIGèCJõ<Nü8NàFH×CCÌA>ÍID¸<4¯5*ÉI@ÕLF×CAÜ>=Ý:;Û;;Ù?=ÔE=ÌH<ÇI;Á7*Á7*À8(¾9(¼9'º9&½:(À;(Ä;)Ê=,Ò<-×;.Ü8.á6.ä6/è5.ê24è.1ê+0ð/2ö37÷69î45æ21Ø/,×31Ô63Ï42Î/3Ð/5Û5?ä=Gõ,2ñ.2è2/Ü3,Ñ5(É8'Æ;&Æ>(Ä9$Æ8$Ë8&Ò:,Ø?1ÛA5ÚB5ÙA6ÎI8ÇB1¿<*½:&Á<)Ã?*Å<)Ä9&Ì;*Î6)Î0'çB<Ý1/ñ>Aå.2à'-Ò3-Ó4.Ö71Ö92Ò8.Í5*Æ2&À1#ÎE5ÆA2¼=.µ:+±9)®:+ª:,ª:,ª</«=.¬>/«=.«<+¬=,°?/µA4ÉSGàg^ßd_èkiînoæchðjqõoxüp}ýt~õmwîcj÷dlÿqzÿw|ûsuökpöXfûAYÿ:[õKfâ}…©˜†l”ojŠXo‰ZxŠ`—r¶·˜âÜÂúôÞüúåÿÿïûÿïõÿïîÿëçúäÜïÙÐãÍÉÛū٫¨Ó¦¨Ñ¥¯Ô©¶Ô®¼Ö±ÇÚºÒßÁàæÌêéÔòíÚòéÚïáÖìÛÑëØÑíÚÓèÛÒæÙÐåØÏZN>ZN>ZN>ZN>YM=YM=YM=YM=XL<XL<WK;WK;WK;XL<XL<YM=RJ?TJ@UL=XL<YN:ZN8ZN8ZM:YM?VKEXOP^Xbd_sifƒqp’yyŸ|¢~€§‚°ƒ„¼††Äˆ‡Ë‰ˆÎ‰ˆÌˆˆÈƒ„½{~µux­or§jm¤eg acž…ac“X^±O\×H\ó=Vÿ1Kÿ/Dÿ7Bö>@çE@ÝJBÚKCÞHGéBLó<Nú8PØDDÕEDÈA=ÈIB³:/°7,ÌPFÉB<Î=8Ñ64Ï10Ð51Ó>8ÏE;ÆF9¿E6Á8(Ã:*Â:*¿:'½8%½:&¿:'Á:&Ä9&Ë:)Ò;*Ù9+Ý7+á5+ä3+ç4-í)-ò)/ù,3ÿ.4ÿ07ÿ18ÿ28ý58ú7;õ8<ò9?ò9Aô9D÷6Gû6Hü5Jø)1õ,2î02ã4/Ø7-Ï9*Í<+Ì=,È7&Ï9*Ø</Þ>2á?4â>4â?6â?6ÑN<ÍH7ÇB1Â=,¿:'Á:'Å9(È9)Ç3%Ó9/á@8ëD>Þ0/á-.ì38í38×4-×6.Ù80Ø:1Õ;1Ó;0Î:.Ê:/ÖL?ÌF:¿?2´9*¯7)«7*©8*¨8*ª<-¬>/­?0­=/«<+«<+­<,¯>0ÀKAÚc[Ýc^èkiðosëhnõrzüvïer÷oyør{öjsÿlvÿvÿu}öioõfl÷RbÿA[ÿ6YôFaÝt{²›‰€¤~z›f{—f€–h‘u­±ŽÌË­áàÄéëÓî÷ÜåóÙÙíÑÎçÉÅÞÀ¼Õ·´Ë®®Å¨•Ã’”‘˜Ä“¡È™§Ë¬Ë¡µÎ§ÁÒ®ÎÙ»ÙÝÄåãÎìåÕïáÖëÚÒçÒÍäÏÊÞÐÇÚÌÃÕǾ[N>ZM=ZM=ZM=ZM=ZM=YL<YL<ZM=YL<YL<XK;XK;YL<ZM=ZM=TJ@TJ>XL>YN<ZM:ZN8ZN8ZM:[O?WMDWMKZSZ^Xfb]sjfspvw–xxœ|{§~µ„¿‡Çˆ‚ʉƒÉ‚}¿~zµzu­vq§vo¥sl¢og ldŸ‹PH•JE²FF×EOò@Lÿ7Dÿ3@ÿ8>ø<=íA=äE?àGBãDHèAKï=Mô:OÒBAÑGDÅA<ÂH=¯;.°</ÐVKÃ>5É83È.,Ç)&É.*Í:3ÌC9ÂD6¸@0Ã:(Ã<)Ã<)Á:'À;(Á=(Â;'Ã8%Ä6"Ê7%Ô8)Ù7*Ý5(á3(å3)è3*û03ÿ58ÿ7<ÿ38ÿ,2ÿ&-ÿ'-ÿ)1ÿ,3ù'0ô%/ú'6ÿ+=ÿ(Aÿ:ú2ö".ô&0î+1æ0/Ú1,Ò4+Ï5)Ð6*Ô6+Ü90æ>5ì>7ë:4é61è50é61ØL?×K<ÒF7Ê>/Ä6(Â3%È6)Í9-Í5*Ô6-æC<à74à21Ò ì89ê35Ó2(Ô3)Ò4)Ñ5)Ï5+Ì5*È5+Å7+ãYNØRFÊH;¾@4¶</´;0³=1³=1®:-°</±=0±=.­<,«:*«:*¬;-±<2ÐYQÜb]ìppôvyîltõrzör}ÿy…ÿ‰ýz‚òiqøeoÿp|ÿt}ýntó`j÷Naÿ@^ÿ3WôA^Ûnt¹ž‹Ž®‡~¡i}›g—hœq¡©‚µ¹–ÉÌ­ÕܽÌÙ»ÁÔ´²Ì©¥ÃŸž¼˜˜¶–²Œ”®‰…¶~†µ~ºƒ•À‹›Ã¡Ã‘¨Å—²ÉŸ¾ÎªÉÒµÚÚÂæßÍêÞÒéÖÐáÌÉÝÅÃÓºνµÈ·¯ZM=ZM=ZM=ZM=ZM=ZM=ZM=ZM=XK;XK;XK;YL<YL<ZM=ZM=ZM=YMAYM?ZM=[N=[N;\O<\P:\O<ZM=YMAWLHXNOXQX]Ub`Yka\pifƒokŽsp›vq§{u³ƒ}ʂˊƒÉˆŠ~¼‡z²ƒr¨†r§Œu­…l¥z^˜™G9¡C7´A:ÍC@á?=ì89ø:<ÿBCú<<ó=<ì>=ê@AéBIêCMëANê>NÌA<Å@9¾?6µ?3®=/±=0¿E8ÒMDÇ61Ô;6Ï1.Í2.ÖC<Ç?3´6'·?.½6#Á:'Ã<)Â;'À9%Á:&Ã:'Ç:&Ë:'Ð9(Ô7(Ö3$Ú."à/%ì7.ô=5ø72ù30ú.-û)(ý%&ÿ#%ÿ"'ÿ"'ÿ$*ù )ú!,ÿ%7ÿ'<ÿ;ÿ4ÿ3ý)7ð".ç"+ä*-Ý--Ó+(Ò-)Ü41â62é54ï64ó55ó12ñ-.ï+,í++Õ<4Ò91Ñ:1ëTK»"Ä+#ßF>È.&Ì/(Þ<7èE@â:7Ø/,Û.*ã41é:7Ý?3×;.Ï5)Ë3&Ì5*Î:.Ë;0Æ8.ìbWàZOÈD8¹6,º:/·9-¯3)²6,¯1%°2&®2&®4'¯7'²:,²<.³=/°:.ºC;Ö\Wìppñsvøv~ûyƒõq|ÿ{„ûx€øu}üs{ÿr~ÿq}ÿlxûisøbmôI\ÿ=\ÿ8[ñ:VÖek²–‡¦}~¡i|šd}•c‡—j”ŸuŸ¥ ¨ƒœ¨„’£Š£|€Ÿvx›qw›o|r t„£w¯uƒ³y‰¹½„“¾†—¾‡œ¾‹¢½§¼“¯½š¾Â§Ï̹ßÓÇãÒËÜÇÄÖ¾¾Ê»´Á²«¹ª£ZM<ZM<ZM<ZM<ZM<ZM<ZM<ZM<XK:XK:XK:YL;YL;ZM<ZM<ZM<ZL?ZL?ZM=]M=]N;^O<^O<\O<]P?[OA[NFYNJZPQ\SX_U^_Wbb\xibƒng‘qjžvp®€y½‡€ÆŠ€Å€Ã~ºt­Œn¢—q¤¡uªši ŒY‘©;.¨7)°6)À>1ÐB6Ü?6è?8ôA=ö=;ø:<÷:@ô<Dï?IèAIâ@KÜ?HÃ>7½=4¶<1°</ª:,¬;+¼B5ÐJAÚG@ÜA=Õ63Ò41Õ@9ÍC8¹:+¯6%¿8%Â;(Ä=*Ä=*Ä;(Ä;(Ç:(È:&Ï9(Ñ5&Ô2%Ú2%ã5*ê8.ï80ñ91ä2&æ0%ê.#ñ,$ö+%û+'ÿ,+ÿ-,þ)-ú%+û#.ÿ&5ÿ$9ÿ5ÿ1ÿ 0ð .ù-9ö2<å*1Û(,Ü.0Þ02Ý*.ò9>õ6;ú3:û06ú-2û.3ý14þ36×4/Ü:5Ù72æDAæDAÎ/+Ñ2.Á"Ö41á?<èE@à=8Ø3-Ù2,Ý60à91Ò<-Ï9*É5'È4&Ê8+Ë;0Ê<2Æ9/ícYáXNÉ@8¼3+À:1Á;2½7.À:1Á4+¾4*½4*»5*¸6(´6(²7(°6)´;0»B9ÓYTèllïqtöw~þ|†øv€ÿ|„ûyøv~þuÿsÿo}ÿiwùeqùanöI]ÿ<\ÿ9\ô=YÕdh«y€œsu˜`t’\w]cŠ•k—p‹•p…”mp†_lˆ_fŠ\g^j_q•ey›i}l€­r„²tЏz»}½‘½‚–½„›»‰›µ†¡³­¶—¾½¨ÏÆ·ØÇ¿ÖÁ¾ÒººÅ·¶º¬«²¤£\L<\L<\L<\L<\L<\L<\L<\L<ZJ:ZJ:ZJ:[K;[K;\L<\L<\L<\L?\L=\L=]M=]N;^O<^O<^O<_RA^QA\PD[NFZOK[PN]QS]ST_RlcXvh]…jb“sk¦}w·†}Àˆ}¿—…Ù€¹›v©ŸoŸ¯t¢»v¥µi˜¤U…Ä92¾5-¹5)½>/ÇE5ÐG7ÚC8ä?9ó=<ú9>ü9Aú:Eò>GæAH×@EÏ@B¿<4¸90±8-«:*¨9(«:*»?3ÏF<ÙD>Ø96Ú65Ü:7ÜC=ÝOEÍI<²4%À9&Á:'Ã<)Æ=+Ç>,È=*É:)Ì9)Ï8'Ï2#Ó/#ß4*î=3ô?6ñ91í2+Ú7&Ý6&à3#å/"é-"î+%ñ,&ò+(ó++ð(+ò'-ú(5þ%8ÿ5þ2ÿ3ð(5ô.;ô4?ò8Cï;Dð<Eé5>å+6ñ1<ô/9ù-8ù+5ù,3ø-1ö.1ö01Ù1.ä<9Û64à;9ÿljæBAÒ.-Ð.,Û97á?<àA=Û<6Õ7.Ô6+Ô6+Ó5*Å8&Ã6%Ã6%Ä8)Ç;.Æ<1Æ<2Å;1ëaWáTMÉ<3¿0(Ë;3Ï?6Î;3Ñ>6Ú=8×<7Ô=4Ï<2É;/Â:.»7*¶6)·;/»@8ÏTMãgeíorøz~ÿˆý{…ý{ƒùzúx€ÿwÿsÿl}ÿftøbnø]kõG^ÿ:Zÿ9\÷AZÐ_c›gkŠ^e†Oh…Ol„Rt…X{ˆ\}ˆ^x„\q‚X`yO_P`†UeYm•`uœg{ j€£m­p…±tˆ¶v‹¹y‹¹yŒºz‘º~”º‘±•¬€›©†©­’ºµ¢Ç¹°Ë¸²Ì´²¶­®ª¡¢ —˜[K;[K;[K;[K;[K;[K;[K;[K;ZJ:ZJ:ZJ:[K;[K;\L<\L<\L<]K=]K=]L<^M=^M;^O<^O<^O<`P@^Q@]P@\NC\NE[NF\OI]PJ`NdcSmfX{g^‰ohœzu¯„|¸†{µ™…º¥…´¯€ªºy¡ÈxŸÓušÍc‹¾OyêAFà@@ÕA=ÌF;ÈJ;ÉJ;ÐF9ÜB:î@?ø;Aþ:Dü<Gñ@HâAFÑAAÅ?<¾?6¶<1¯9+ª;*©:)­9*º?0ÎD:Õ<7Ö21â:9æA?áD?çTLÞVH½;+Á9)¾6&¿8%Ä;)É=,Ê=,Ë9*Î8)Ï3&Ò2&Ù3'å9/ñ>7õ>8ð50è-&×:)Ú8)Ý5(à2'æ/'é.'é,(é,*ç+*å(,è)1ï+7õ';ö";ú=ÿ"A÷8Gä(6ç/;ÿP\ÿ`lÿP\ò<Ió9Gé)8ï)8ô,9õ0:ô17ì01â*(Ü&#Õ2-Ú64Õ1/æBAÿrp÷TUÝ==æFFÛ=:Ú<9Õ:5Ò80Ñ7-Ï7*Ì4&É1#º7#¹6"»8&¿;,À</¿9.À:/Å<4åXQÜMGÊ70Ç/*×<7ÞA:Ú;5Þ=5ë<9ê=9æ?9â?8Ù?5Ð<0Ç;.¿9-»9,»<3ËOGàc_ìnoú|ÿƒŠý~…úx€øy€ùzÿx‚ÿt‚ÿl}ÿdtö_nóXhõE\ÿ6Vÿ7ZùC\ÇYZ‡mRWxIXv@\yCdzIl}PtVw‚XrXoWl‡Zl^o•buh{¤l¨o„ªq‡ªr„­q‡±rˆ´u‰·v‰·v‰·vЏw¹z‘´|«z’¤|¤…­«–¾²¦È·¯Ë¶±¯¬³¡ž¥•’™[K;[K;[K;[K;[K;[K;[K;[K;ZJ:ZJ:ZJ:[K;[K;\L<\L<\L<^K=^K<]L<^M=^M;_N<^O<^O<^O<^N>^N>^N?^N?_OB`PC`OEbM\cPdcUodZle‘vr¤~w«‚v¦“~©¬†«Â‰©ÐžÛw“âk‡ÝXuÓFfÿ=MüDPðJNÞJHÌG>ÇG<ÍG<ÙD>èBBó>Cù>Gø@HðCIÞDDÍB=À?9½A5µ=/®:+ª;*©:)­9*º<.Ì?6áFBä<;ïABíAAÞ:8ãJBæXLÔL>È@0À8(»3#Á8(È<-É:*Ë7)Ð8+Î0%×3)à8/é;4ï:3î50ë0+è+'Û4,ß4-ä2.ë31ð43õ45ö58õ6;é/4ç.6ê0=î1Cò.Fõ*Gý,Lÿ1Tð<Hå3?ð@Mÿ_lÿlzÿWfõCSõ>Pî3Dî2Aî3>ê5<æ89Ü73Ð3*Ç/$Ì2*È-(Ñ61óXT÷\ZóXVÜ@AâHHÜB@Õ<7Î70Í6-Ï8-Í9+Ê7'Æ3!³:%²9$´;(¸=-¹;-¶6)»8.Ä>5ÛNGÙEAÎ50Ð1-á>9è?:ã81ä71ð/0ï11ì42é73â92Ø:/Ð9.È:.¾6*º7-ÈIBÜ_Yënlû}€ÿ…‰ýƒõv}õx~ùzÿx‚ÿsÿj{ÿdtö_nðUeôF]ÿ6Vÿ7ZúF_ÀTRvaBJo<Us?[vCdzIn~QtVy„Zyˆ_wŒay”gv›hy¡l|§o«p„«r…«p†ªm‡­rˆ°r‰³tˆµt‡¶r…·r‡¹tЏw·{Œ­x¤x™¤‚«­•À¹§ÎÀµÖüººÆªª¶œœ¨ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8[L9[L9\M:\M:\M:^K<^K<^K<_L=^M;_N<^O<^O<]N;]N;^O<_P=_P=aP@bQAbQAeKTdN[aPc`Usga…rp˜xvž|r—Žv–®ƒžÌ‹ŸÝ‚“çr‚ïbsìObå>Rÿ-Hÿ:QþCTéDKÒ@AËA>ÎDAÖEBãEFêAFï@EïBFçDEÚEAÉC:¿?4º@3±;-©8(¨9(©:)®9(º:-Ë;3èIEë??î;>æ68Û2/ÞA:îZPõg[ÙQCÉA3¾4'À6)Ç9+Ê8+Í6+Ò8,Ñ0&Ü5-æ;4ë:4ê40è/,ê-+í-,ó4;õ3;ø3<þ2=ÿ1>þ0=ý0?ù0@ô1Añ2Dò5Kó5Oó0Põ-Qþ1Xÿ:dá7B÷O\ÿanÿ`nþXfùQbòEXé8Jó@Sê:GÝ2;Ò/2È3-Á9-º=+µ>(Æ9/¿2(ÙJBúkcÝLGáPMÍ<9Ï;9àLJÔ@<Ê7/Ê7-Î</Í<+Ë:'Ê9&®>(«;%­=)²?-±9)®4'º:1ÊC=ÕHAØC?Ô72×2.ç;7ì:6è2.ë2-÷)+÷+,ô.-ð3/é61â:1Ú<1Ò>2Â6)º4)ÅB:×XRçjhú|}ÿ†‰þ€„õv}öyú{‚ÿx„ÿqÿh{ýbtõ^oîSe÷I`ÿ9Xÿ9[ûI_ºQNmZ:Em8ZvCa|InSv†Y|‡]Šbg‚—lœl{ m|¤o}¨p~ªo‚ªnƒ©l…©lˆ«qˆ®qˆ°r†³r„³oƒµn„¸p‡¹t‹µv‰¬tŒ¦wš¨„°´™ÈïØÌ¾àÏŽÃÓ«±Á›¡±ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8[L9[L9\M:\M:\M:`J<`J<^K<_L=^M;_N<_N<^O<^O<_P;_P;aP<aP<aP<aP<bP<fLOdMUaO]_Vkgb€sr’yx˜}t‘ŽvŽ­’Ά’á}…ñowýbjýOXö>Hÿ$Hÿ0Qÿ;Uñ<MÞ<GÖAEÓEDÔBCÜCEàBCäADäABÞDBÔC>ÇA6¾>1·?1¯9+¨7'¨:)¬=*²=,À>1Ñ>7ß=:ç79æ/3ã/0á32Û94åNEülaïj[ÙQCÆ</Æ:-È:.É7*Í6+Õ8/Õ4,Þ7/æ93é62é1/ê.,î1/ó32ÿ0Eÿ/Eÿ-Dÿ*Bÿ%@ÿ"=þ:ø:÷'Aó+Gô/Mó0Rò+Rô)Vÿ1bÿ=nêHSÿ`mÿiu÷VeíKZñL]êCUÚ1DéARÝ7CÉ,3¹)(®0$¨9&£A&ŸD'¼=.º;,ÜZMá\SÍG>ÍD>Á61É;7ãUQÕF@É91È8-É:,È9(È:&É;%ªB)¦<&¦<&¬=*©8(¬3(¼=4ÒMFÕGCÝEBÛ96Ü30é73í41ì/+ó2-ÿ)/ÿ*/ý--ö0/ï4/è7/ß;1Ø>2É:,¼4(À;2ÏNHßb^÷yzÿˆŠÿ„†ùzú}ƒü}„ÿx„ÿn~ÿdwù^pò[léN`öHaÿ8Wÿ7YøH]²JGcS1Al6ZtDf~NuˆZŽc…f‡’jˆ—n‰žs‡¤t‚§t§r}¨p}©n©mƒ©l…©k†§n‡ªp†¬o…¯o°l³k‚¶n…·p‡´s‡­rŒ¨wœ¬…²¹šÈƱ×οÞÐÅ·¿Ò¤¬¿’š­ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8ZK8[L9[L9\M:\M:\M:`J<`J<^K<_L=^M=_N<_N<^O<`Q>aR=bQ=bQ=bR;bP:aO9`N8jNMgNRbQ[cWkjfuv’}}™y‘’{¯ŒËƒ‡ã{|ùqsÿgjÿTXÿAGÿ#Mÿ.Tÿ7Wù9Pé>NàEM×EHÑ?B×BDÚACÜ@AÛA?ØC?ÏB9Å?4¿=0·?1¯9+©8(«=,°A.·B1ÇC7×D=Ú64å57ã,0ç02è88Ó0+Ï5-éUKÿznæ^RÎD7É=0Ê<0É6,Í6+Ö90Ú70ß82ä71ç40é1/í10ò53ø87ÿ=ÿ>ÿ>ÿ>ÿ=ÿ=ÿ<ü=ò:ï@ð$Ið&Nï$Qó%Uÿ0eÿ=sÿgrþalôXeîR_ïQ`îM]â?RÖ1Bß:JÑ4?¿-0±-(¦5'ž>&–C%E"¯7&²9(ÒWHº<0ÁA8º7/º3/ÍC@ãXSÕHAÈ91Ä6*Å6&Ä5$Ä6"Ç9#¦B*¢<%£:%§<*¦7&©3'½A7ØSLØIEáGEÞ:8ß2.ê41î1-ï.)ù4.ÿ'-ÿ',ÿ)+ö*)í-(ä1*Ü5,Õ9-Ð>1½3(¼7.ÉHBÙ\Xôwuÿ‰‰ÿ‡‰ý~…ý€†þ†ÿx„ÿl|ý`sõZlïXiãHZóE^û4Sÿ3RóCX«E@\L*?j4Uo?d|LwŠ\†“h‹–l˜pŽtŽ£xŽ«{†«x©t|¨mz¦i}¥g¥h‚¦h…¤k…¦m„ªm‚¬l®j}±i€´lƒ·oˆ·sˆ°tެxœ®„²¹šÄ«ÐǶÖÈ»²½Óž©¿‹–¬]K7]K7]K7]K7]K7]K7]K7]K7^L8^L8^L8^L8^L8^L8^L8^L8\J>]K?]M@\L=ZM=ZO=\Q?^SA_T@_R?^Q@aQAcRBdQCdNAcM@pKEjKIfOUgZknl„v|ž}†¯ƒŠ´Š…®Ÿ‰­¸Š¦Ìƒ”Þ{~îumøl]ûfRðN[æDQä>LéANïCQí>Ké:Gê<Få:Bá;?Û;;Ö<:Ï?7È>4Á;/¼8+ :$¬C0¬=,®6(Â?5ÑD=Ð;5Ó61Û83Ü71Ý6-Ý7)Ü9(Ý='Ù;"Õ7à74õPLõXOÛD9Ç8(Ì?.ÒC3Ñ;-Ò4+ðGDâ.1ï4;ö4?ï+9ÿ@Qí(9þ&+ÿ*-ÿ*-÷"û#$ÿ()þ((òð"ú+1ì )î&1ò.<ç$5ÿYnë+@ÿ`jÿ^iÿYcûT[öPTìHIÛ@;Ê:1ÅA2½F2®D.Ÿ;$”5–7#˜;)œ=+§81«83ÁEC¿;9¾23Æ45È44×CAÜKFÚKEÑD;È:0Ä4+È4*Ì3+Ì2*·?1³9,®.#­'¶,"Æ7/ÓC:ÚG=äPFßE;Ù80Ü1*ç/-ô01ý/3ÿ.4ò14ó12ô01ó/0ó0.î1+é4+à8-Ö=/¾2#¾?0·>3Õ`Wçtqÿù…†ôŠŒþ…Œÿwˆÿe}ÿ[wÿXuÿSoûJgûDcö7Y÷9]ç>[Ú]k„C=PI/F`;Xw<e‡Ku—[zcz e|¤h¨l€©o¨l~§k~¦j}¥g}£f£e£e€¢e}¥p~§o«n¬k~­g¯e±e„²g‡µjеpвs°z–¶‡£¿™«Ä¤¬Å§¦±µ˜œz…‰]K7]K7]K7]K7]K7]K7]K7]K7^L8^L8^L8^L8^L8^L8^L8^L8\J<^L>^N?^N?[N>ZO=\Q?^SA_TB]QA]P@_OB`NBbPFcOFcOFkLGjMOgS\h_rnoŽw~ª~ˆ»…ŠÁ›–Ì¢Œ»«£»wŽÕx‚í|x÷uhöjYüZgóN\ìFRòHUöJVõERï?Jë;Eä9Aà:>Ú::Õ=:Î?7Ç>4À</º;,¥>+ª?-¨9(²:,ÁA6Å<4Ç7/Õ<7Ó40×4-Ø4*Ø4(Ú7&Û:&Û;%Ù;"Þ52æA;ëMDàI>Ð>/Ç8(Ê8)Ó;.Ý<2öJFæ/1ò5<ø6Aò.<ÿ?Pì'8ö$'÷%(û),ý+,ü*+ù'(ø((ø*,ð$'í%(ê%,þ:DÚ'ð4CüATÞ#6ÿluÿblþZcüW]õOSæBCÙ;8Ñ>6¾8,¾E4¹H6¨?,–1)Ž()ž-'°:6ÑTRÎHGÃ54Æ45Ò<=ëWUØGBÖGAÏB9Ç9/Ä4+Ê6,Ð7/Ò5.Â?5À:1À5.Â3+É4.Ð83Ø?9ÞE=ãJBÞA8Ù6/Ü1*æ0-ó11ü03ÿ.3ò14ó12ô01õ/0ó0.î1+é4+à8-×>0¿3$¼=.¶=2Ó^Uévsÿù…†õ‡Šþ‚Šÿu…ÿe|ÿ[vÿWtÿQoþIhúAaö8Zö=_æF`ÅQ\{?7NH.Ga>Yx=e‡Ks•Yx›awbz¢f|¥i}¦j|¥i|¥i|¤h{£e{¡d}¡c}¡c¡d{¤l}¦n}©l}ªi}ªe}­c¯c‚±cƒ±f‡²k‡¯pˆ«u‹«|¬„©‰‹¤†z…‡doqR]_]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8]L8^K<_N>aP@`P@]P?[O?[O?[RC[QE[QE\OF\OG_PKcQOfTRhTUiTQiVXi]kmi„sv¡zƒ¼ŠÍ‰Ö—‘ÙŸ‹Êª‚¶º}ŸÒ‘烅ð~tïveÿ`k÷S\íGQðFQöHR÷EQô@Kî=Gå6=à7:Ù99Ô<7Í@7ÅA4½?0¸=-©@-¨=+ª;*¸B4ÅI?À;2»0)Ì92Í6/Ò5.Õ7,Ù7*Ù7(Ú7$Ü:%Þ<'ß3/Û4.âA9éOCÜH:Ç6%Æ3#Ù@2á>5õHDé13ó4;ú6@ø4@ÿES÷3Añ),í"&î#&û03÷--ï''í%%÷12ì(*ø7:è+1â)1ë3?ÿR^ï=KÿYiúafñV\îOTðMRêEIÞ:;Õ74Ô?9À6,¿?2»C5²>1ª8-¥3)Ÿ,%œ' ˜% §0*ÆFCÂ::¼,,È44×ABô^]Ò>:ÒC;ÐA9Ë=3Ì9/Ô=4Ú@8Ý@9ÙA>×=;Ü>=ãA?ã?>à;9ã?=ëIDàA;Û=4Ø5,Û2+å2-ð31÷12ú/2ó04ô02ö01õ/0õ/.ð0+é4+à8-Ø?1À4%¸9*´;0Ð[Rízwÿ’’û‡ˆøƒ‹ü~‰ÿr‚ÿcyÿZtÿTqÿMmÿFgü=_ø:^ôBbåQg§?Fn<1OK2KcA[z?h‡Lr“Zu˜^tš_wŸc{£gz£gy¢fy¢fy¡cx byŸb{Ÿa| b}Ÿby¢j{¤j{§h{¨e{©azª^|­^®`…³hеnвs‰¬t†¦w‚žvy“pn‡gVb`COM4@>^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^L6`N:aP<`Q>]P?ZN>YPAXPEXOH[RM_UTcWYeX_iYcl\fm]hlbclemolrtšx¶~†Ï„ŒßŠŽç‹‡ÞŠÙ¬‰É³­½y’Í{ßyê†vÿnrÿbgùU\öLUöFPöBMó>Gð;Dæ5;á7:Û97Ò=7ËA6ÄB4»B1·?.©;,­=/¯>0»G:ËRGÇH?¹6.º1)È91Í81Ó;0Ú<0Û;-Ù6%Ü6&à9'á40Û2-à=4ëOCãK=Ñ;,Ð8*àB6Þ7.ð>:é/0ò16÷4<ü8BÿNZÿKWý>Cò38â$&í/1ê,,ð22ç+*é0.ò::Ñæ37Ü-2ç9BïENÿYcôLYÔ?AÚADßCFá>CÞ9=Ü89Ø88Ó:5É83Â91½:2ÀA:ÍNHÖVSÐNNÆAB¯82µ:5ÏKGØNLãQRïYZêRQñYXÉ51Î>6ÑC9Ð@7Ó?5ÚA9àC<àA;í<Bê7=í8?õ>Cñ:?é58í=?øLJà93Ú70Ø4+Ü3,ã5.ì30ò21ô01ô04ô02ö01ö.0õ/.ñ0+ê3+à8-Ù@2Â6'µ6'²9.ÉWMî}yÿ“’û‰‰þ€‹ý{‡üoücwÿXqÿNmÿFhÿ?cþ8\ù=`íIdÙYhˆ25d<0SQ8TgG`}Ej‰Ps’Yt•\u˜^wby¡ey¢fw dv awŸavž`xŸ`zž`{Ÿa| by¢hz£g|¦fz§bz¨_z¨]|«]~­_†²eеmŒ³rŠ­s†¦u€œstŽii_RaZDSL8G@^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;^M;_K2_M5aO9_P;\O>ZN@XPEXQKYQO^X\g`hnfsshysg{sg}tfnnzor…rw•v|¬y‚Ã~†×ƒŠåˆ‹ì’뛌ߞƒÆžt¢¡kƒ®mq¾vjÈ{iþllÿklÿfiÿ]`üQWöEMð;Bí5=è59ã68Ý98Õ>7ÎA7ÅC5¼C0¶A-¬8+´@3¯;.°;1ÇRHÓ]SÈNCº;2¾90Á7,Ì9/Ö>1Ý=1Ú6*Ü4'á7(á2-ã60ä=5åE9âF9ÜC3ÝA2á?2Û0&ì62ì0/ð-1ò-4ú7?ÿOYÿZdÿ[_ÿOSá.1ã03ß--÷EEè66Ü,,Û-.ë>@Û25Ù37ÿchÞ=CÊ*2Ê-4¾()Ô;=àAEÚ7:Ù37á8;Ü89Î..Ì43Í<9ÓHEÝSSì`c÷hnõdkî[e¿B<ÆE@å^[÷igÿopÿjjåKK×=;É4.Ñ>7ÕE<ÖC;Ó?5Ö<4Ø93Ø7/ö0=ò,9ó+6õ-8ò*5î+3õ8<þJKà3/Û4.Ø4+Ü4+â5.ê40ï4/ð3/ö/4ö/2÷/1ø-0ö..ñ0+ê3+â7-Û?2Å9*²3$±8-ÃNEî}yÿ’‘üŠŠÿ}‹ÿw…ùl|öatùUmÿHgÿ>bÿ8_þ4\õ@aâMcÂWap/+\A0XX>]lMbIl‰St’\u–_v™_xžcy¡ex buŸ`uŸ`u_vž_wž_zž`{Ÿa| by£d{¥f|¦dz¨`y§^y¨Z{ªZ}¬\€¬_…¯g‡®m‡ªp…¥sƒ t{•nrŠffvi[k^RbU_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<_N<`L1aM2`N6^O:[N>YOE[RMZTT_ZahbprmzuŒ{t“yr“zp“yo”ov’pyšt}¨w€·zƒÈ~…Õƒ‰á‹‹å”ã—ŠÒ™„¼¡ƒ§ª„“«~yŸl[ŽX>ÈH?ÕPIäVRìVUòRRôJMî=Cè38ì7<ç9;à;9Ø=8ÑA8ÈC4¿B0¹@-³9.ºA6«5+£.$¼J?Øh\×eZÊVI·=2¸6)¾4)Î:0Ù;0Ü5,ß3)ä6+á/+å61ã;2Ü:/Ü?0ãF7ãC3ß9+ß1&ê3-ð31ï-.î*.ô17ÿEJÿS[ÿ_dÿ\aâ9<â9<Õ+.ôJKâ89×//Û55Ì()Ë(+÷YZÛ?BÔ9=Ð7:· %Ã))Û=>åBEÝ49Ù,2Þ17Ú/5Í(,Ò37äKNöaeûhnùcl÷_kû_mý_nÒNIÔOJè]ZêVTçMMãGHÑ32Î31ÙA<àKDãPHßKAØA8×:3×50Õ2+ÿ,;þ+:ü(7ø%4÷'4û/:ÿ=CÿILà1.Ü3,Û4,Ü5,á4-ç4-ì5/ï4/ö/4÷/2ù.1ù-0ø..ò/+ë3+â7-Ù=0É;-³1#°7,¹D;ìyvÿþŠ‹ÿyŠþqõhxó`söTlüCcÿ7^ÿ3_ÿ3\óDcÒM^ JMb6+TE0W[@^kMc~Kk‡Tt‘[w•_x™`{ždz cvž`s›]s›\s›\tœ]v^wž_{Ÿa| by¡bz¤b|§b{¦_x¦[x§Yz©Y{ªZ~ª]ƒ­e…¬i†ªm‰§s‰¥u„s|•mv‡unmfwe_P=_P=_P=_P=_P=_P=_P=_P=^O<^O<^O<^O<^O<^O<^O<^O<cP2cO4aO7^O<[OA[RK^UV_Zakgvso†}z™‚~£|¥}w¥{u¥{t§pz«s}°w‚¸{ƒÁ~†Ç„‰Í‹ŽÓ“’Ô˜“Í ”«›¸¼¦³Ç®ªÅ¦”ªˆlmJ©?/¯A2¶@4ÄA9ØGBëMLñHKí?Aî;?ê:=å;;ß=:ØA:ÏA5Ç?1Á=.»;2¾?8¯4,¦1'ºJ>ÏcWÔh[ÔfYÁPB¹?2¹5)Ç7,Ô:0Ù5,ß2+ç6.ã0,ã4/â7/Ü8.à>1åC4â?0Þ4'æ4*é1)ò2/ð..ï-.ò14ô68ü?CðOTúY^éFKõRW×47ëFJÝ8<åBEÚ7:Î.0Ð15ãIKÑ8;Î8:¸#%Ñ<>Ü89ä;>ê=Aç6<â-4Þ)2â19ç<DñLSû^eÿksÿisú`l÷YhùXhûXkðgaèZVèWTØ@?Ï10Ô44Ó41áC@ãJDéRKèSLáJAØ?7Ø93Û81Ü71ý)8ÿ/>ÿ/>ý)7ÿ-:ÿ9CÿAHûABã1/ß4-Ü5,Ý5,á4-æ3,ì5/ð50÷.4ù.2ú.1ù-0ø..ò/+ë3+ã7-Ø:.Ì>0´2$±7,±<3çtqþŠŠþŠ‹ÿr†ýj}ñbtð]pôRjûBbÿ6`ÿ5aÿ8_ïKfÁN[z;6Y?.LH/TZ@]cIbzJj„TrŽ[v”^yšc{ždxžas›\p˜Yp˜Yq™Zq™Zt›\uœ]y_zž`x¡_y¢^z¥^y¤\x¤Wv¥Uw¦V{§X~ª]‚¬d„«h†¨l‡¥o†¢r€šmx‘gr„lk}ecu]_O?_O?_O?_O?_O?_O?_O?_O?^N>^N>^N>^N>^N>^N>^N>^N>eQ6cR8aP<]P@ZPG\TR_Zab^otrŠyx˜€¨ƒ°~~²yx±wv°xw³t}Âw€Ã}…Æ‚ˆÆ…ŠÂÀ—–¾ ¼¬§»¶¬´¾³¯È¸©Ð¿¥Õ¡ϼ”Dz‡·kS®\F¤G5©=0ÂH=áVQðVTòNOì?Aë=?è<<ä<;ß=:×=5Ï;1Ë8.¿82Á<5¹:3·>5ÀPDÅYMÅ]PÎgXÐdWÁM@º:-Å8.Ò91Ø3-ß2,è50æ40á2-à5-ã<3çC7æC4â:-à3%ê5*è-&ð0+ð.,ò21ò44ç.,è00áEIõY]öW\ÿpuåDJéHNÞ=Cü[aÿouÝ>Cÿ~‚ÿmqêQTÔ>@Å02Ñ<>øEIî9>ð7=ø=Fô6@è-8ö>Jÿ\hÿmwÿitÿdl÷]gú^kÿapÿ]nüWhî_YãOKâJGÕ74Ò0.Ù54Ó/.Ø95ßD?ãJDáJAÙ@8Ó6/Ö5-Ü71â94ð$0ý/<ÿ1=ø*6û/:ÿ>Eÿ>Cì44â3.Þ5.Ý6-Ý5,á3*è3,ï4/ò5/÷.4ù.2ú.1ù-0ø..ô.+í2+ä6-×9-Ï@2µ1$²6,°7/èpoþˆˆÿŠŒÿkƒücxð]pïZnôPiýAdÿ7aÿ8dý=bæPi°QW^2'RG3DH/PV<X\C_vHi€Rq‹[v’_z˜b|dxœ_r™Zn—Un—Un—Uo˜Vr™Xt›\uœ]y_vŸ[x¡[y£[w£Xv¢Uv¢Sw£Ty¥Vz¤X~¦_¦c¡d~œf{—frŒ_k‚V`uVZoPRgH\L<^N>`P@`P@_O?_O?_O?aQAbRB_O?]M=]M=aQAcSCbRB`P@eS;aP<_O?^QH[QOZSZeapsq‰xxšz|¥~€±€¹}¼xy¹rs¶no²qwÏv{̓̋Ȗ—䤾²±¹½¸²ÌŲÓÍ­ÙЩÛУÛÑ ÝÑ¡ØÌšÒÆ”Õ¦Š·gŸ_FËzgØte¾G?ØQMøbaìILç>Aä79æ9;ã99Ü75Ù61Û94È95À50ÇB;¹=5¾I?ÄXK·PAËeVÎdVÊYKÃG;Ä:/Í6-Ù6/â5/å3/á/-ß2,â70ä=4à<0Û8)Ý5(å8*å/$ê/(î.)ð0-ï20ë40è51æ40Ó8<åJNõY]ëOS×7?×6>ùX`ÿ~†ÿ~†ÿowÿgoÿipÿfjõ\_ïY[ô^`ÿRYÿCKü8Bü7A÷1>ï+9î/>ñ=IÿS_ÿ`kÿgpÿepþboÿbpÿ`oÿ[lìTOßFA×85×31Ù10×/.Ú21Ü86áD=ÜB:Ø?7Ö<4×90Û81á83ä84ô5=ó4;õ3;÷4<ø5;ó49ë33ã1/Þ3,Ý6-Þ7.à5+ä3+é2,ñ1,õ2.ø/5ø03ú/2ú.1ù//õ/,î3,å7.à@4Ë9,½7+®/&·<5ÒXWÿ˜šù~ÿhÿe|ö]rîRhòHeÿAeÿ9bÿ5`üJlÕRd‰==K. >>&?I.IO5]]EWlAcxMqˆZx’by–`t•\r–Xq˜Wl•Sm–Rn—So˜Vr™Xt›\uœ]uœ]tœVtWv Xw¡Wv¢Uv¢Uu¡Tt S{¥[{£\zŸ\u—Zn‹Uc}MXrCSj>AW1?U/<R,[K;^N>`P@`P@`P@_O?`P@aQAbRB`P@_O?`P@bRBcSCbRB`P@fVF_QD\OF_TRcZ_f`nmkƒwv˜wy¢{}°}¸x|»qt·lo¶ln¸oq»suÙ|}Ù‰ˆÔ˜—Ш§Æ¹¶½ÉƵÓÏ©Ý×£âÜžçßžæÞäÜžâÙ ÙÒœÑʖѼ¸€¦~dÄ‹wÉ}m¶VJÓ`Y÷qnîZZêJLä>@é<>ì>@è:;ã56á34Õ=:Ë73Ê?8¹6.·>3¼L@³I;Å^OÛp`ÒaSÄH<½5)Ä0&Ö5-Ý4-Ü/)â43å95å<7à<3Ü8.Ù5)Ý5(ã5*í6.ï4-î1+ë0+ç0,ã2,á4.Þ5.Ò9;×>AäIMóW[ü\dü\dþ]eÿ`kôR]ïMXñQ[ÿ_gÿjqÿflô[`ëRU÷07ó+5ô+5ù-9ó&5è/ç'6í7DüP\ÿ[dÿclÿemÿepÿdoý[hõP^åFBÞ<9Û64ß63á53Þ20Û2/Û62à>9Û>7Ö<2×:1Ú91ß82å95è96é9;ê7:ë7:î79î79ì57å31Þ3,Û4,Û7-Þ7.á6,å2+ì1*ó0,ø1.÷05÷03ú/2ù.1ù//õ/,î3,ç6.ß=2Ò>2Â8-µ2*·82ØZ[ÿ“õw{ÿa{ÿ^v÷WqöOkøFfý=bÿ:cú=cëLhºJVw<8F5#7=#9C(DH/UP<Tf>`rJnƒXw_v“]t“Zp”Vn•Tk’Ok”Pl•Qm–Ro˜Vr™Zsš[sš[tœVuWuŸWuŸUtžTržQqPq›Qn˜Pl”NhŒLbFXu?Nh8F]/@W+@W-@W-AX.YL<[N>^QA^QA^QA^QA_RB`SCaTD`SC_RB`SCaTDaTD`SC^QAbUM^QK[QPcYakesqm„vu•y{¤y{®y~¶w}»ns·ei°bf°jn¸rvÀ}zᇃᖔߩ§Ù¼¸ÏÍÊÃÝØ¸çá­êå¡ïéŸðêžíæžéá¢âÛ¤×Ï ËĘ´°“¦œ˜„k§„p¥p`œRG»]UÞmi÷usð^_çHLæ@Dí@Dí=@ë7:ç36Ü>;Ô;6ÔA:Â70·7.µ?3­=/µG8Új\Þj[×\MÊB6Å2(Ñ4+Ú6-Ú1*Þ44éA>ìGCà=6Õ2)Õ1'Ú2'Þ0%è3*é1)ç.)æ/)ã2,â7/á=4âA7Ã-,Ê43ÜCEðVXú^bùYaóS]òP[èFQêHSðNYü\fÿmvÿmtôY_ÜAGó*2õ,4ý1<ÿ1>÷*9ï&6ö6EÿJX÷ISõOY÷W_ü_fÿdkÿai÷Q[éBJÞ95Þ63ã75é<8ë<9ç85â51Ý60Ý:3Ù;2Ö90×90Û81á83ç:6ì:8à;9â:9ã99ç98è88å84à40Ú3+Ú6,Ú8-Ü8,á6,å3)ì/)õ/,ú0.ô15õ13ø02ù.1÷//ó0,î3,ç6.Ý9/ÛD9Æ9/»4.´0,â`bÿƒˆônuÿ_zþWsúPmþLlýDfø8_ö9_ðGf×ReDJi=4K@,7@%8@(ED/LE2N^9YkEg|Qr‰[tZqUmRkMi‘Kh‘Ki’Lk”Pm–To–Up—Xq—ZuWuWtœUrœTpšRm—Mk•Kj”LdGaˆE\~AUt;Li3E_/AX*>U'B\/E_2Ic6WJ:ZM=\O?^QA]P@^QA_RBaTD`SC`SC`SCaTDaTD`SC_RB]P@YNR[PVbXcjcsqm†vu•xz£z|­w|´sy·mr¶bi±]c­ag±lr¾v|È‹‡æ”‘褡淴áÇÄ×ÕÒËáÞ¿èå²ëç¨ïê¦îé¥éã¥ãܨÛÒ§Ëß¾µ–Ÿ§˜š…‰v—‚q—se™cW³i`Ïrmû‹‰õutë[[çKNéCGî?Dî;?í8=ß:8Ý;8ßD?ÓC;Ã:0¹;/¯7)¦2#¾J;ÚbRék]ÛSGÉ9.Í3)Ö5+Ø4+Ù33ñMLý[XíKFÙ80Ö3*Û4+Þ2(à-&á,%á,%ß,'Ý0)Ú6-Ø<0×?2À0(Ä4,Î:6ÙCBßFHàEKäGPìLVñQ]öVbøXdû[gÿgpÿmuôY_Ø=Cñ.2ò-4ô-4ò*4í%2ì(6û<KÿS_í?IçBIèGMòQVþ[`ÿX]ôGMä5<á51ä73ê;8ó?>ô@?ð<;ç85à72Ü92Ø:1×90Ù80Ü71ã73ê86ì87Þ<9ß;9â:7ä;8æ:8ä84Þ5.Ø4+Ù7,Ú8-Ü8,á7*å3)ì/)ô/)ù/+ó25ô23õ12÷/1÷//ó0,î3,ç6.Ü8.ßG<É90¾3.´-*îfjÿy€ójrÿ`{ýTqþKkÿFjÿ=cö3[î<^äPhÄXe…DBbE7WP=DH1@D-JH3JB/IW4Sc?btLmƒUp‹XoŒRkŽNiŽKgIg‘Ih‘Kj“Mk”Pm–To–Wp–YtœVs›Uq™Sn—Qj”Lg‘IeŽHdG`‡D]AWy=Rq8Mi6Lf6Ne7Pe:Lf6Oi9Sm=UH8WJ:[N>\O?]P@]P@_RBaTD_RB`SCaTDaTD`SC_RB_RB_RBTLY`Xgnf{tp‰xt•xw¡xz«y{´sy·jqµ`g¯\b¬`f°kq»v|Æ~„Ε”äžžè­­é½¼æËÉßÕÓÔÝÜÊãàÁåâ¹çã¶æß³àØ³ÚÑ´ÐůÀ´¤¯¥™”œ‰ˆ†y‰}qwk›sk§ngºoi扄î~ósróedòVYòLNðCEî>Aå95â:7äB=ÞE?Ì<3Æ=3ÂB5­1%¬1"ÇI;ÛYKÖN@Ì=/Î8*Ò6*Ñ3'Ö34õUUÿkhú]XâE>Ü;3ß;2ã80â4-ä1,â1+Ý0)Ö/'Ì0$Æ/$Â0#Ã9,À4'Á3)Ë:5×CAÛEGÛBGÛ@HàDOìOZóVaòVaú^iÿgoóYaÝDIð88í55ï26ð18ò3;÷9CÿHSÿVaä6?Ý4;Ý7;êAFøKOüIMô;@ê05å61ë95ñ;8ó;9ó;9ð:7é73â70ß;2Ü;1Ù;2Û:2ß82ä73è64ì65á<8ã;8ä;8è:9è;7æ95á6/Û4,Ú8-Û9,Ý9-á7*å3)ë0'ò/)÷0+ð45ñ33ô22ô01ö0/ò1,î3,ç6.Þ7.ÞD:Ê7/¿1-¾21÷jpÿrzøhrû]vúPmÿCfÿ<dÿ7cù6^éDbØ[m©W[uF>_L;_ZFQP;KI4PI6MB0DR1M[8[kFf|Nm…SmŠPlŒMhHfŽGgHg‘Ii’Lj“Ol•Sn•Vo•Xt™Vq˜Un–Pj’LfIcŒFaŠF_ˆDZ@X|?St;Pn8Pj:Tk=XmB[pEUp=Vq>Wr?RE5UH8XK;ZM=[N>\O?^QA`SC`SCaTDaTDaTD`SC`SCbUEdWG]Ulje|yu}yœzy£wyªvx±sw¶lqµcj²[c¬]e®hp¹w}LjІՙܡ¦à¯²å»¿åÆÇãÍÏÞÔÓØ×ÖÑÙ×ËÙÕÉ×ÑÅÒÉÂÌÂÀŹ»´§®¥˜¡‡Œ†xzuwvqulg~mfŒoib[œa[¾sm×zuï{ü|yÿrpýccöSTîHHñB=ê>:ã<6àA;Ñ:1ÒD:ÝTJÂ>2¸6)¼:,Â=.È?/ÏA3×C5×?1Ñ8*Ð23èLMú_]ñXSßD?Ø;4Û81à70æ92ç92ç92â92Ú9/Ñ9.È9+Ä8)®)¸3"È@2ÓI>ÒE>Ë;:Ì7;Ð9@Ï8AâHTïUaðYbõ^g÷`iêU[ØCIè?:ë?;ñAAúGJÿMRÿQYÿT]ÿV^á4:Ú/5Ú03ç7:ô=Aù:?ø48÷/2é61ï95ð95í41í1/ê20ç40á4.ã<4à=4Þ=3Þ;2à93ä73è43ë33æ:8ç98ê88ì89ì87é75ã4/Ü4+Û7-Û9,Ý9-ß7*ã2(è0&ï0(õ0*î45ð43ó32ó11ô1/ò1,î3,è5.à90Ù<3Ì70Á0-ÑAAÿnuýku÷coïSkóIfÿ;cÿ1`ÿ3bÿ<dçMgÇ]i†IFeH:YN<\WCXQ>RJ7QF4MB0AL.GU4Sc>`rHgMj‡MjŠKh‹GeFfŽGfHgJi’Nk”Rl”Um“Vq–So”Qj‘NgŽKcŒH`‰E_ˆF_†G\‚E[~DWxAVr?Uo?YpB]rG_tKYtAYtAXs@NB2QE5UI9WK;XL<ZN>\P@^RBaUEbVFbVFaUE_SCaUEfZJj^Nkg‚up|x›{y¡wx¨vw­pt±jo±ah®^f¯_g°em¶pxÁ~…͉ؖܙ¡Ï ¨Öª±Û´¹ßº¿ß¾ÂßÂÄÝÅÆÛÆÃÖÅÁÒÁºÌ¼³Æ»¯Å´¨¾¦˜±—‰¢†‡‰qqstpqogevhe†nj`Y”e_š[T·g`×tnî{vÿ{wÿwsÿhfù[ZÿQKöGBè=6èC=Ø;4ÛG=ê\RÅ;0Ä<0½7+¾6(Ç>.ÑD3ÔC2ÔA1×A0Ò8:Ø>@ÜDCÛC@Ö=8Ó91Ø7/Þ7/å:3æ93å:3â;3Û>5ÕA5ÑE6ÌG8¬.¼;%ÌK8ÑL=Æ=3»0+¿10Ë8>ÕBJáKVëU`ðZeð]eìYaßLRÐ?DÑ4+Ö8/ß<7ê@@ñDFôEJñBIî?Fâ5;ß26ã36ï8<õ79ù14þ-2ÿ.4ë40ð95ò64ì0.è,*è/,è2.á2-ä=5à=4ß>4ß<3ã:5ç85ì65í55ì57ì57í57ï56ï56ì42å2.Þ1*Þ7.Ü:-Ý:+Þ8*á3(ç1&í1(ò1*í55î53ñ42ó11ó1/ò1,î3,è5.ã;2Ò4+Ò;4Æ20çUVÿpxùcnñ[gãKbóEfÿ7bÿ+]ÿ1bÿ@hÞKe­RYd8/ZI7SN:UN;[P>VI8M@0MA1=H*CN.K[6Xj@ayGf‚HhˆIgŠFeŠDc‹BcEeŽHgLh‘Oi‘Rj’Tn“Pl‘NhLd‹Jb‰H_ˆF_‡H`‡H_…H_‚H]~I]yH]wH`wKcxOdyP[vA[vAZu@MA1PD4SG7VJ:WK;YM=[O?]QAcWGdXHdXHbVFaUEcWGj^NpdTvq‘yu˜xvtsŸrr¤su®lp¯bg«Za©^f¯em¸lt½u}ƈДڕœâš¤ÈŸ©Í¦°Ô¬´Ù°µÛ±µÚ²´ÚµµÛ³±Ö²®Ñ®¦Ë«¡ÄªžÂ¦˜»™‹®‹{Ÿ|y€dbgidhbY\g[[xeauXRe]ˆOHŸVO»aY×jcóvpÿ}zÿwuÿljÿZUÿPJñD>ôMGàB9ßF>êWOº,"¼2'½5'Ç=0ÑE6Ë>-Á2!É8%ÙF4ÞDFÒ9;Ë32Ë62Ó;6×<7Û<6á<6æ;4å82à5.Ø4+Ï5+Ê8+Ä<.Â>/ÑU;ÅI/»='½;+Ã=2Ä;5Â65Â37ÜKRÞLVâOYåS]éWaæU\ÝLSÒCGÉ5)Ð8-Õ81Ú64Ý55ß58á4:ß28å8<å6;ì9=ö<?ú6:ú,0ÿ).ÿ.4ë4.ò94ô86í0.é,*ë/-ê40ã5.ä;4à=4à=4á=4ä;4è96í76ï56í36î15ï05ð24ñ35ì31æ0-Ý/(ß7.Ý9-Ý:+Þ8*à4&æ1&ì1(ñ2*ì65í53ð42ò21ó1/ñ1,î3,è5.å=4Í/&×>8É53øceÿpyô\hêR_ÞHaõGhÿ:eÿ*]ÿ/aÿ@hÓE]–AFQ-!UJ8PN9OH5\O>YH8L<-NB2:D)?J*GU2Rd:]sBcEf†GeˆDcˆBa‰@a‹CcŒFeŽJfMgPhRlPkOfLcŠIaˆG_‡H_‡H`†I\‚G]€H]~I`|Ka{Ld{Of{Rg|S]xC^yD_zEAC8CE:IF=OH@RGAWI@]M>`O=aQ:aS9`T>_VGaZTfaeljwro€wožzt¢~wªzu«ro¨hf¥a`¢^^¦ba­hg·qoÃ|xÏ…€Ú‰ã—í–ó¢žÙ£ŸÚ¥¡Ü¦¢Ý§¡Ý¦¡Û¥ Ú¦žÙ¥Ö£œÒ¢™Ð¡˜Íž–É—ÁŒ‚´ƒy«mrvghlc_`e[ZlYUtUP€ULVK–RG¨ZN²ZP½\SÔmdç|tò…~üˆðxyõyyæabÜPQ×EEñYVÎ61È1(Ç5(Ä7&Â6%Ã8%Æ9'Ì:+Ð<.Õ?1Ô8+Ö=/Ø?1Ó;-Í5'Í4&Ø:.ã?5à90á90Þ7.×7+Ï7)È;)Ä@+ÁC,Ä;3È?7ÍD<ÏF>ÌC;Å<4»2*µ,$Ä>5ÍG>×QHÞXOá[RßYPÖPGËE<Ì<!Ò<$Û:(å4,ë--ó'0÷%2û$6ÿ(@ÿ'@ÿ'Bÿ&Bÿ%Bÿ$Bÿ!Aÿ!Aÿ:ÿ"<ÿ'>ÿ)<ö*6í.6ç48å;;Ü94Ü:5Ý<4à;5ã:5æ93é73é62ì25ì44ë54è64ä71ß7.Ú6,Ø6)Û9*Û:(Û:&Ü9&ß8%á8%â7#â7#í41ï4/ñ4.ó3.ó4,ï5)ê6(å8*à:.Ø7/×96Ý>BÿlyÿasþRlöGdÿIjû5Yÿ5]ÿ;eú=cãPj©LVT)":1 9<)EF4RL>PH;BC39E15K4FGHJ#MQ,U\:\jGcuOf}QeNc…Hb‡BaŠ>cŒ@eDjIl‘Nm‘Qj’IiFgŒFf‹Ff‹Hf‰Ic…Ic‚GdƒJdIc~Gc~Gd€FfFe~Dc|BX}8[€;^ƒ><?4?A6FC<JE?OF?TG>[K>^M;`O;`Q:^S?^WGa\Vhcinlyrqƒtnšvpžtp¢pm¢gfŸaaŸ]^Ÿ\\¤ed°kjºtrÅ}{φ‚ÙŽˆà”Žè˜’ì›—Òœ˜Ó™Öžš×™Ö—Õœ–Ò•Ñž–Ñœ”Íœ“Ê›’Ç™‘Ä“‰»ˆ®€w¦tmtkdkf]`e[YiZSoWMzVJŠVI›UK°\RºYRÁXRÓf_Þqjãvoêwý‡…ÿˆ‡÷uuðfdäTSíYUÇ2+Â/%Æ7)Ã7&À7%Á8%Ä9&É:*Ï;-Ó=/Ö8,Õ9,Ó:,Ò:,Ñ9+Ñ9+Ô8+Ø8,ß;1à90Ü8.Ø8,Ð8*Ç:(¿;&¼;%¿4-Á80Æ=5É@8ÊA9È?7Å<4Â91¾5-Ç>6ÑH@ØOGÚQI×NFÌC;À7/Ê8Ñ9"Û8)å4,ï./ö*3û(7ÿ(:ÿ+Bÿ*Bÿ)Aÿ&Aÿ$@ÿ >ÿ=ÿ<ÿ8ÿ9ÿ$;ÿ);÷-9ï29ê7;å;;Ü94Ü:5Ý;6à;5ã:5æ93é73é62ì25í36ë54è64ä71ß7.Ü5,Ø6)Û9*Û:(Û:&Ü9&Þ9%á8%â7#â7#é4-ê3-ì4,ì4*ì4*ë5(æ6)á7*Þ</Ó5,Ó52óTYÿesÿ[põGbüKhÿ@dÿ:`ÿ1[ÿ7aùImÐJb‰8?O,&=7'3:(:=,C@1F@0@?-;C.:H1@CKP'\b<eoLhvRezSd~Qd‚LaƒFa†@aŠ>cŒ@eDiŽHkMlPl’IjGhGf‹Ff‹Hf‰Id†JdƒHe„KdIc€HdHeGeGfEd}C\<_„?b‡B69.:<1??7E@:KB=OE<VH=[K<^O<\O<\TA_WLc^[helol}sq†sm™qk™jg–c`•\[”ZZ˜\]ž\_¦hjµno¿wxÊÒ†„Ø‹‡ÜŠà’Œâ“’Γ’Γ‘ЕДѓŽÐ“ŒÏ’‹Î•ŒÍ“‹Ç“‹Ä”‹À“‹¼Œ„³ƒz¥{r€dpt_fiZ]c\Vc\ReYKqWH„TF£ZQ¾_YË[YÐXWÛcbßliÝpkàwqûІÿІÿ…ÿ|yømhï`ZÄ4+À2&Ä8)Á:'¾:%À9%Â9&Ç:)Ì:+Î:,Ù9-Ó5)Î5'Ð8*Ô>/Ô>/Î6(Ë/"Ú:.Û7-Ù7,Ö8,Ñ9+É:)Â9&¼8#¾4*À6,Â8.Ä:0Ç=3Ê@6ËA7ÌB8Å;1Ê@6ÏE;ÐF<ÒH>ÑG=Ê@6Â8.Í6!Ô7&ß7,é3/ñ03ø,5ý*9ÿ*<ü'=ü'=û%=ù#;û!:ü8ü7þ7ÿ6ÿ6ÿ#8ý*;ù1<ñ6=é9;ã;:Ü86Ü:5Þ;6à;5ã:5ç85é73é62ï26î47í55ê65å61ß6/Ü5,×5(Ù9)Ù9)Ú9'Û8%Ý8%Þ7$à7$à7$â4+â4)å4*å5(ã6(â7&Þ7'Û8)Ý=1Ï2+×98ÿltÿ]nþPið=[ÿJlÿ5\ÿ=eü4[ô<`êTq«?Oa#(H1+79+-8'18&:;)B=*A<(@>)@B*?GY`4s~T€Œfw‡bi~Ub|MaI`ƒC`…?aŠ>cŒ@hŽEjJkMlPn”Kk‘HhGgŒGgŒIh‹KfˆKf…Je„Ke‚Jc€HeGf‚Hf‚GeFcDb‡BeŠEhH06*58-;<4A>9G@:KB;RE<VJ<XL<YN<YRB^WOc_`igrom‚ppˆpm˜jg”`^WW‹TUŽWY–\_¢ad«ko¹qtÃ{|Ì‚ƒÕˆ†ÙŠˆÛŒ‰ÚŠÛÍŽŽÌÎŽŒÎŠÑŽˆÐ‡Ï…Î†ÊŽ…ÆŽ†Á‡¼‡¶‰‚«€xxq“‹[i}WbmWYa]T\`Q\^IhYF}SCŸULÂZYÔW[ÝV\çbeçkkàplâysê}vì{uýƒ~ÿ†€ÿ{õkaÉ<2Â9)Â;(¿:'¾<&½;%Á:&Å:'È9)Ë9*Û9.Ö6*Ð4'Î8)Ñ>.Ð?.Ë8(Ç/!Ò6)Ó5)Ô4(Ò6)Ñ9+Í<+È=*Ä;(Æ9/Æ9/Æ9/Æ9/Ç:0È;1É<2Ê=3ÒE;ÒE;ÐB8Ë=3Ë=3ÏA7ÏA7Ë=3Ñ4#Ø6)â5.ë31ò/5÷+6û(7ü)<ù&9÷&;÷&;ø'<û&<ý%<ÿ$:ÿ#:ÿ!7ÿ"7ü%7ù-9÷5>ñ:?ç9:à87Ü86Ü:5Þ;6à;5å95ç85ê65ë54ñ27ð37î66ê65æ72á6/Ü5,×5(Ø8*Ø8(Ø9&Ù8&Ú7$Ü7$Ý6#Ý6#Ù6'Ú7(Û8'Ü9(Ü9(Û:(×:'Ö:+Õ;/Î3.éIKÿo{ÿVjøDaö=_ÿCiÿ/[ÿ7`û=cëLlÆOe€0=G >3--3'+8'2=,=B.B@+C;$G="MA'R_*q}MŸp—¨|ƒ˜mj„W_{J]~E_ƒCa†@b‹?fCk‘Hl‘Lm‘Qm‘So•Ll’IiŽHhHhJiŒLhŠMiˆMf…LdƒJdGe‚Hf„Hh„If‚EeDf‹FiŽIl‘L-3'17-7:3<;6B=9G?<MD=QG=SI=SK>UOCZUQa_dhgukkƒllˆjg’baXV‡PP†QQXYš`cªfj´orÁuxÉ|Ѓ„Ö†‡×‰ˆØŠ‰×Œ‰ØŒŒÌ‹‹ËŠ‰Í‰‡Ð‰…ш„ÑŠƒÓ‰‚ÐŒ„Ï‹„È…Á†º†²‡¥}x–vpŠ“ScƒQ\qUT`^RVcOTbH_]DvUB’LB¼RRÖPWàPYé\dèejâljâwqâvláphõ~vÿ‚{ÿ‡~ôkaÉ?2À8(À;(¿='¾='¿='Â;'Å:'Ç8(Ê8)Ü8/Ú7.Ô8,Ï9+Ê;+È;*Ç:)É7(Ï9+Ñ7+Ô8,Ó7+Ï7*Ì8*Ë<,Ë>-É=0Ê<0Ê<0É;/È:.Æ8,Å7+Å5*Ð@5Ð@5Í=2Ë8.Ë8.Î;1Í:0É6,Ò.$Ù0)ä2.î23ô/8ù-9û+;ü+>ü-?û.?ú0@ü/@þ/Aÿ.?ÿ-?ÿ->ÿ)9ý)8ø*7õ0:ó6=ì9=ã77Ú53Ü86Ü:5Þ;6â:7å95ç85ê65ë54ò38ñ48ï56í76æ74á6/Ú6,×5*Ö9*Ö9*Ö9(Ø9&Ø9&Ù8&Ú7$Ú7$Ô9%Õ:&Ô<'Õ=(Ô=(Ô=(Ó>*Ó=.Ð8-Ù;8ÿ^eÿaqÿPi÷;\ÿAiû6aÿ/]ÿ.WøIjÛYq•>NX'-?+,730*1)-9-5@/:B+<<"B;VG(iV6v‡P£lª¾‹¨¾Ž¥wo‹[aK^F`…BcˆBeŽBj“Go•Lp•Po“So“Uo•Ll‘KiŽHgŒGiŒJiŒLi‹NhŠNf…Je„IdƒHfƒIg…Ih†Hg…Gf„FgIi‘Kl”N*2%.4*470894<;7B=:HA;KD<NH<NH<OKBUTR_^ffewggfg†ba[YŠQQ…NO‡RS“[^£ei³lo¾sxÊx}ÑÖƒ…؆‡Ù†‡×ˆ‡Õ‰ˆÔ‡ˆÈ†‡È……Ë…ƒÎ„Ð…€Ô…€Ô‡Ò„ÓŒ…Ë…Á…¸‹…«„{vŒrn•N\ƒNTqTPa_PWgMReI\`EsXCOCºTRÔSXàPZëYcé`gähjçqqê{rärhö}tòsjþxmæ\QÄ:-¾5#À<'À>(À>(Á=(Ä;(È;)Ì9)Î8*Ú3+Ù6-Ö:.Î:,Ç:)Â9'Ä;)É=,Í>.Ö@2ÙA4×=1Ï7*Ê4&Ê8)Ë<,È:,È:,É;-Ê;-Ê;-È9+È6)Ç5(Ê6*Ï;/Ò>2Õ>3Ö?4Õ>3Î7,Å.#Õ)%Ü-*ç02ñ29ø0;ü/>þ/?ý0Aú0@÷1@ö2@ö0=÷/:ù-9ú,8ü*7ý/<ù/;õ0:ñ2:í6;æ68ß55Ù42Ü86Ý:5ß:6â:7æ87é77ê67ë54õ49ó49ð69í76æ74ß6/Ú6-Ö6*Õ7+Ô8)Ô8)Ô9'Õ8'Õ8%×8%×8%Ï:$Î<%Î>&Í?'ÍA(ÍA*Î@,Ï=.Ð71éIKÿgrÿOdÿHfû7]ÿAmý/_ÿ1^ø1XåOj¹Wfh39@*,?994443524925>-2<#29ECl`8Ž}R™±u©Á‡µÎ—­È•’®}v”be†Q_ƒF`…Bc‰@gDo•Jr˜Or—Rq•Up”Vo•Ll‘KhGf‹Fh‹IiŒLi‹Ni‹Og†Kf…Je„If…IhˆIjˆJi‡Gg…EhJk“Mn–P(0#*2'/4-350664<87@<9C>8IE<HE<KHCQQQ[[eabvab~`a€_]ŽZXŠTTŠTT\] gi´psÄtyÍ{Ø~‚Û…Þ„†Ýƒ…؃„Ö…„Ò†…Óƒ‡Ç„…ȃƒË‚̓Ó„€Õ†€Øˆ€Õ„Õ‹„Ê‹ƒ¾‹ƒ²ˆ‚¤|’uqlirŒOVNQpUNc`OYgMVfI]dEo]EˆTF²[TÌXYÙSZæYaé\dèaeðknñ|rìsj÷xoÞYPå[QÒD8Ã5'Æ:)Ã:'Ã<(Ä='Æ=*É<*Í:*Ð8*Ó7+Ö/'Õ2)Ò8,Í;,Å<*À;(À;(Ã<)Ç;*ÕC4áK=ßG:Ô</Ê4&É5'Í;,È9)È9)È9)È9)Ê8)Ê8)Ë7)Ë7)Í7)Ó;.×?2Ù?3Ú@4ÝA5×;/Ï3'Þ..å12î49÷5>û3>ú0>ú0@ø/?ò.<ï/<í/9í07í.5ï,2ò+2ò)/õ1;õ3<ò5;ì59ç47á55Þ65Û75Ü86Ý97ß:6ã:7æ87é77ê67ë46ö5:ô5:ñ7:î87æ74à72Ù6-Ô6+Ñ8*Ð8*Ð9(Ð9(Ð9(Ñ8&Ñ8&Ó8&È:"Ç;"È>$Ç?%ÇA(Ç@*Ê>-Î;1Õ:6üU\ÿ_oÿGcÿ>bÿ8cÿ6gÿ0cÿ4\òCbÈMa…BIL44:97<<>948>58<7379+3="8DS[,ƒPª£o«Èˆ¯ËŽ¯Ì’¦Ã‘¯}{™ggˆQ^‚E^ƒ@c‰@iDo•Js™Ps˜Sq•Uo“Un“MkJgŒGeŠEgŠHh‹Ki‹Ni‹NfˆLd†Id†Ig‡Hi‰JjŠIi‰FhˆEi“Kl–No™Q&.!(0%-2+130333756:97>;6GD=DD<GFAOOQZZd_`t^_{\]|`^\ZŒYX‘\\œgg¯qrÂz|Ó}܄ゅ䃆ㄅႄۂՂ҃‚ЄˆÈƒ†É„„̃‚Î…Õ†‚׈‚Ø‹ƒØ…ÒŒƒÆ‹‚¹‰‚«…›xˆsntjfgSPuRLjWIe`MafO\gI`cFn`FxR?[M·ZSÆRRÚUZåV\ëX`ö`iótkïof÷qhÑD;ÔA9Å1%È4&ÔC2Ç9%Ç:&È;'Ë=)Î;+Ó:,Ø8,Ù7,Ð,#Ð/%Î6)Ë<,Ç@-Á>*½<'»8$¾5#ÑB2ãOAäN@ØB4Í7)Ë7)Ð>/Ê;+É:*Ç8(È6'È6'Ê6(Î8*Ð8+Ó;.Õ;/Õ9-Ó5*Õ7,Ü;1Ý<2Ú9/ë7:ñ8=÷:Aü8Bü4A÷.>ò,;ï,:í/;é19è38é58í57ñ48ô36ö45î49ï6;í9<é69â45Ý33Ý86ß;9Ü86Þ97á98å99æ89é69ê67ë46ö5:ô5:ñ7:î79ç85ß82Ø7/Ó7+Ð8+Í9+Í:*Ì;*Í:*Í:*Í:(Ï9(Ä: Â: Ã=$Á?%Â@(Ä@+É=.Í81ß<?ÿ[hÿQhÿHhÿ7]ÿ<jü,]ÿ7iì;XéYp§LUX00?<5<E@99;B3:G08F21?9+<E(DW*at=Žœ_²»|®ÌŒ«É‹¥Ä‰œº„ެzy™gf‡PZ|@]‚?a‡>hŽCo•Jr˜Or—Rp”Tn’To“MkIgŠFeˆFf‰Gh‹Ki‹Ni‹NfˆKe‡Jd‡GeˆHgŠHh‹Gh‹GfŠDj”Lm—OpšR(0!'/"(-&+-*.0/333775:94==5?@8DE?JLKQQYVWiZ\s]^|YW†[Y‹^]–ee¥nn¸wxÊ€Ú„„䊌ðŠŒðŠŠì†‡ä‚‚Ü€Ô‚€Óƒ‚Ò€„ĄǃƒÉ„„ΆƒÒˆƒÕ‹ƒÖŒƒÒŠ€ÇŠ€½‰±…~ €xwpxkeec^XpZMm[Mi\Kf^Kd_IcaHfbGl`FlR;„UA£^O¿aYÑYXßPTñQ[ÿXbôkcæYRÔD<Î70Ñ7/×;/Ø</Ô;+Ï9(Í:(Í:(Ð:)Ô8)Ù7,Ü5,ß4,Ð/'Ï2)Ì8,Ê>/Å@/Á@-¾=*¼9'Â9)¾0"êVJáJ?Å.#Ñ=1Î</Ç8*Ê;*É:)È9(É8'É6&É6&Ë5&Ì4&Ð7)×;.Ü>2Ü<0Ù7,Û7-â>4éE;øAFó8?ð3:ö4?ö2>ñ-;ï,:í2=ì7@æ5;ã68å78é99ð:9ñ86ò65ï==î<<ê:<æ89á77ß76Ü75Ü75Þ97á98ã99æ::é9;ì9<í9<ï8<÷6;ô5:ñ7:í9:è:9à;5×90Ï7,Ë7+È9)Ç:)Ç:)Ç:)Ç:)È;*È;)Á9!Ä>%½;#µ5»:$ÈE3Í@6Ê0.ÿ^eÿVgÿHcÿ;\ú0Xø/[ý5cÿ<jã\m¯EOo33G6.9C8:E==9:B+3P-4N00D7'CJ)Wo=}›_œ¹v«Å~«ËŒŸ¾‚˜·~”²~‚ nf„RXvBY{?]€>c‡?iDn”Im•Ll”Nk’Qj‘RjŽHfŠDc†Bc†Df‰Gh‹Kg‰LdˆJg‹MhŒNg‹Kf‹HeŠEf‹EjIm“Jp›SrUtŸW*0")/#).'+-(-/.222553782;<4>@5BC;HJGOPTSUaXYm[[s\Z‚^]‰da–kj¦us¼}Ї‡á‹‹íŒòŒ‹ñ‰‰í…„ ڀ~Ò€σ€Ï…†Æ†‡È‡ˆË‰ˆÎ‹‡ÑŒ†Ð…ÎŽ„ÉŠ€½‰³†{£‚x‘{s€tknkd^e\SbaLb`Ke^Kh]Ii\Ij^Hk_Gm_EraG{]CŽ[Fª[LÆWPàQS÷PXÿS`ìWQãKFÛ>9×50Ú5/Ý90Ü8,Ø8*Ó8&Ñ8&Ñ8&Ô8)×7)Ü5,à3,ã2,Ë1'Ë4)È9+Æ=-ÄA/Á@-¾=*¾9(Â9)Ë<.åQEÜH<È4(Ì:-È:,Á5&Ê=+Ê=+Ê;*Ì;*Ë:)Î8)Ï7)Ï6(Ó7*Ö8,Ù7,×3)Õ1'Ø1(ß7.å=4ûBHò7>í07ï/:ò0;î.;ì1<ê6?ã6<Ü36×32ß:8îEB÷JFøEAõ?<è:9æ:8å97â96á85à85á98á98à87â88å99ç9:é9;ì9<í8=ì7<ô5:ò59î68ê88æ:8Ý:5Ó91Ë7-Æ8*Ã:*Â:*À;*À;*Á<+Á<+Á<+½9"Á?)¹;$²5¸;'À</É:2Ø<=ÿ]iÿOdÿ@[ü6Yù5[ø:`ö=fô@g¡EJ„>>];2@>/3A05?4E=:X;?T-0X51ZI7bjEu[бpšÄ|žÈ|š¹}š¹€™·ƒ©yr`YuESq?\{B_>b†>iCm“Fl”Kk“Mh‘MhQhŒFeˆDc†Bc†DgŠHiŒLhŒNg‹MiOiMiŽKgŒGgŒGfŽGj’Im•LnœQoRr U-1"-1#,/&,.).0-11/34/45-9;0<>1@B5EH?KMLQRWUTbXWi\Yx^]fcŽpm¢zx¹…‚ÏŠáíŽñŽŒïŠˆé‡ƒá~Õ|Í}È}Ç…‡ÄˆˆÆŠŠÊŒŠËŒŠËŒ‡ÇŒ„À‹‚¹‰€¯†|¡€v‘{p€ujpod`i_Ue\MXeK]bKa_Jh[HmZIp[Hq\Go]EtcItZ?‚V= WDÅYMäTSûNTÿIUß@<Þ<9Ý84ß61á6/á6.Þ6+Ú7(Ö6&Ó8&Ó8&Õ8'Ø6)Ý5,á3,ä1,Ç5(Å6(Â9)Á<+Á@-Á@-À=+À8(Ã5'ÜJ=ÜE:ÕA5Î</Ä6(Ä;+¼7&Æ:)Ç:)Ç:)É:*Ê8)Ë7)Í5(Í3'Ö8-×6,Ö3*×3*Û2+ß6/å:3è=6ò;?í4:ë07î0:ð2<í3>ë7@ê=CÜ7;áAAìNK÷ZUüZUùRLïB>è62à72à74à74ß74à85á96ã;8ä::á77ä88æ89è8;é9<ë8<ì7<ì7<ò38î47ì57ç77â:7Ù:4Ï8/Ç7,Â8+¿:+½;+»<+»<+»<+»<+»<+º9$¾@*³9$°7$¶;+´2%Ã40îOTÿZiÿH`ù8Uó6Vó>]ñFfçHfÞEat?9e?6QA2@C04?.29)>5,O61K*#W:,j\Bˆ_«t”½{“ÃyÃv•²|œ¸…™µ…€šm\uKHa7Nh9[xB_}?c„?hŒBl’Ej“Gh’JgLeMe‰Cd‡Cc†BeˆFh‹IjŽNkOjŽNkOkOiMhJgHi‘Hl•Ip™Ms¡Vt¢Wv¤Y25$13&02'01+12-23.34.46+9;-;>-?B1DF9IJBNNNRQWTR]XVd\Zoda~nl”zw®„‚ÄŒ‰Ø‘Žå”‘ì“펋扅ڂÎ{Å}¿‚}¿ƒƒ¿……Á‰ˆÂŠÃ‹ˆ¿‹„¸‡®…}¦…{€vŽzm~sfmoa`k^Vi[NgZJVdJZbJa_JjZJpYIsYJtZIs]FqY?tU9†T;§ZFÌ\PæRNóEGù:AØ3/Ü41á51ä50ã5.â4+à6)Û8)Ö7$Ó8$Ñ8&Ô9'Ø6)Ý5*à3,ã2,Â8+¿7)»7(¼:*¿=-Â>/Ã;-Ä8+Æ3)ëTKÔ;3Ì8.ÑA6¾4'À<-½>-Ã7&Ä8'Æ9(Ç:)Ê8)Ë7)Ì6(Í3'Ó5*Ô3)Ö2)Û4,ã:3é>7ì?9ë>8è47ì59ï6;î5;ê2:æ39ä7=á<@óUVûc`ÿnjÿidóVQäA<ß61à3/Þ71Þ71Þ71ß82á85â96å97æ::å78æ89è8;é9<ë8<ë8<ë8<ë8<ñ48î68ê67æ87à;7Ö<4Ì9/Å8.½9,º;,¶;+µ<+´<+´<+³;*³;*³:'·@,­8&¬9'±;-«+"Ã54ÿ_gÿSdýE]ó;Uí<XéG_áOdÐP_ÄKZcPAVI8JE2CF1AF0<?*<7#>1B2SE*okHŠ“f•¬t´t‹¹q‹½t¡¹‰¡¸Š§}l‚\K_:BV1Lc7Yq?_{@dƒ@i‹Ak‘Di’Fg‘IdJbLc†Bc†Bd‡CgŠHjMkOm‘Qn’Rj‘Pj‘Nj’Li‘Jg‘Gi“Gm—KqœMu¥Yv¦Zx¨\78(78*66,56056156167/68+;>-=@+@C.DG4IK=NNFQPNSQTVUSYY[a_lkius›€}´ˆ†ÈŒ‰Ö•’ã”äÞ‹‡Ó„Æ}º|µ€{±~¸‚º‡„»‰…¸Š„²†¨z›€xs‡znzrfjm_\j[Tk[NjZKjYI^bK_aKe^Kk[KpZLtZKw\Kz[G{WAƒS=—U?³XFÍSFÝF?å76ê01Û2-ß3/â5/å4.ã2*à2'ß5(Ü9(Ô7$Ð9$Ï:$Ñ:'Ô8)Ù7*Ý5,à3,½>-¹:)µ6%·8'½;+Â=.Ç;.É6,Ñ80ö\T×=5Ë4+ÏA5¸3$·:(¹@-Â9)Ã:*Æ:+È:,Ê;-Ì:-Ï8-Ñ7-Ñ3*Ò1)Ö1+Þ71ç;7ë>:è;7æ74é77ï;<ð<?ê69ä15ã6:èBFìNOÿxwÿqnða[ÛKCÐ83Ñ2.Ü73è?<à93à93ß82à72à72ã75å76å78æ68ç79è8;ë8<ë8<ë8>ê7=ê7=ð69î79ê7:ä::ß=:Ö=7Ë;2Ã;/¸9*´;*±<*¯<)­=)¬<(¬<(¬<(«:(¬=*¤9'¥:*©9-«0)ËAAÿgr÷L^÷E[ðBYèF[ÛN^ÈT]´VW§SQSU@LN9JG4JE1FD-AA'>C#@G%MU.^g<xTŒ˜f‘¤m©n޲r’¼z µŒ’§€u†dRcC?O2BS3Oa;Vl=b{Be‚@iŠCjEi’Fe‘FbH`Ie…Bd‡CgŠFiŒJkŽNlPn’Ro“Sj‘Pk’Oj“Mi“Ki“Ik•InšKržOu¥Yv¦Zw§[?>,?=.==1==5=<7;<6;=2;=/?B-@D+CG,GI1KM8NOASPITQLYXDZ[M_^Zgepqo‡{y¡ƒ€·‡…ƌӋՊъ…ǃ€¹~z­zw¤{u¡zw°|y°€|®~©‚~£y•|t‰zrvkqrffm`Zl[QlZNl[KmZKmZIg^Mi]Mi]Mj]Mn]Ms^My^M€[I“`OšWG§N@¹I=Æ@5Ð6.Ù0)á0*á51â5/ã4/â4-à2)ß3'Ü6&Ú;(Ð9$Í;$Ì<$Í<'Ñ:)Õ9*Ù7,Ü5,ºA.´;(¯6#°5#¹:)Â=.É;/Í6-Û>7ùZTåHAÐ90Ì@3¸6&«4 ±>)¿7'¿7'À7'Ã7(Å7)É7*Î7,Ð8-Ù<3Û:2Þ93å<7ê>:ê=9ç85ã41è96ë<9ê::è8:ì>@øORÿccÿqpùheàUPÈ=8¿2+È5.Ö;7à<:â:9à<3á:2á:4á83ã73ä65å55æ68é69é69ê7;ë8<ë8>è7=è7=ç6<ð8:ì8;è8:ã;:Ý>:Ó>7É<2À</´9)°;*¬;)ª;(©<(¦;'¥:&¥:&£<)Ÿ:(Ÿ<)ž:*¡7*´?8ÛTXüdpðK\ñH]ìI\ÝL[ÉRX±WVœ\R^OAP9FN9NI5K>+>467>O#Jh4gTt•\„›c‹™dŽ›f‘¢l•¬t•²x„”pn}\Q`C=J09F,BO3O_;Xi=czDgBkŠDk‘Dh’Fe‘F`G`Gf†Ci‰FjKlMlOkOm‘Ql“Rm”Qm”Qm–Pl–Lk—Jm™JržOu¢Qy¬]y¬]x«\CB0DB3DB6EB9CC;CC;BB8AD3CG0EH-GJ-JM0OO7RQ?TREURI[\:\\@\]Kaa_ihvrq{z¦~µ†‚¿ˆƒÃˆ„Á„¸{­ysŸtp•qmŽol£rn¡tq wršwrtoƒskxrilmb^l_Vj\OlZLn[Lo\Kq\Kq\KrZNq[Nn\Nl_Ol`PqaQy_N†[KŸ_S¦OE°A8½:2È5-Ï1(Ø1(Ý5*â70á6/á4-á3*à4(ß5(Ù6%Ô9#Í;"Ê<$È>$Ê>'Í<'Ò;*Õ9,Ø8,·D/±<(¬5!­4!¸9(Ä<.Ì9/Ï5-Ú83ñNIòSMÙB9ÌB5½@.¥2¬?(À;,Á9+À8*À6)Å7+É9.Ï;1Ô;3áD=ãA<ä?;ç>;é=;é;:è88ç77æ93æ95å84é;:ôJJÿ\[ÿdc÷caË=9¿82»4.Ã81ÓB=ÞE@ß=;Ù42â;3â;3â92ä84å84æ66é77é77ê69ë6;ë6;ë8<ë8>è7=è7=ç6<í68ê69æ89à;9Û>9Ñ>6Æ<1¾<.²8)®;)ª;(¦;'¤;&¡;%¡:' 9&ž?-”7%š=,—:)˜3'ÂQKíkmï\fïN^ìI\àHWÎJU·SS¡]RŒfQ‚jP=S<CL7JB/L7$F5FH!Tq;c–Txµo€µo‚¦f~‘Y…ŒX–cŒ–d|YXeGGT89E-8A,:C.?I0JX7Wh>g{Fh‚Cl‹Ek‘Di“Gc‘Fa‘G^Gi‰FlŒImNn‘OlOjŽNkOk’Qp—Tp™SpšRo›Po›NqNv£Rw¦Uz­^z­^y¬]GD3HE6HF9HE<GG?GG?FF:FG5GI1HK.JM.LO0QQ7SR=VSDWSG[\4Z\7[[C\\Rcbhmkusšzx©~{´€|·‚¸€|¯zw¢so”mj‰kf„gb˜hd—lf”lh‹lhleuibij`^g]Th\NjZJl[Io\Ks^Ms^Ms\LzWQvYQp\Ql`PkbQpcR{aPŠ\OžUL§D>±61Á3/Î5/Ö5+Ù7*Û8)ß6/ß4-à3,à4*â6*Þ7'Ø7%Ï7 Ì<"È>"Æ>$Ç?'Ê>'Ï<*Ó:,Õ9,µE/­='¨3¬3 ·8'Å;.Ì9/Ò5.Ò/*ä?;ûYTàI@ÎD7ÆI7¥5®D,ËF7ÉD5ÉA3É?2Í?3ÒB7ÚF<àG?ßB;à>9à;7à74â64ä65ç77é99é>7ç:4ä73è<:ñIHñMLØ=;¹(%¸-(¼5/Å@9ÌC=ÐA;Ö=8Ý>;ã?>á:2á:2â92ä84æ95è96ë99í9:ë7:ë6;ì7<ë8<ë8>è7=ç6<æ7<ì59è58å78ß:8Ù<7Ï<4Ä<0º:-°8(«:(¨;'¤;&¡:'Ÿ:&Ÿ:&ž9%š?,4"—>,“:*“1&Ì\X÷y|æT_ðTbèI[ØDRÃGO®SPšbS†lS{rSC[C?H3B7%O6"_K0prJ€£iˆÇ€yÃt{¾qu¢]oƒHy}J‡†Xy|O\d5:D)3=$4>&<E2=D2:B+EP2Ve<g{HiƒDl‹Em’Ei“Gd’Ga‘G^Gk‹HnŽKo’Po’PlOiMjŽNj‘PsšWsœVsUržSržQu¡Rw¦U{ªYt§Xs¦Wq¤USJ;SJ;SJ;SJ;SJ;SJ;SJ;SJ;VM>WN?XO@YPAZQB\SD]TE]TEcZKbYJbXNcXRg\Zmacsfmwjs|n{~p}s€s€~p}wjtobli\fcb]a`[a^W_\U_[R^ZOa[ObZMe\Kg\Ji\Ii]Gk\El]Fm]Dm]D_gOkiTqZH{M@•RI©WL®TI³WH¦N:¢G2¢?*ª;(¾:.Ò72à23å,1Þ7.Þ7.Þ7.Ü8.Ü8.Û7-Ø6+Ø6+×7+Õ7+Õ7+Õ7+Ô8+Ô8+Ô8+Ô8+¸=.·=.°8(§2!ª2!´;*½>/Â:,Æ6+Í6-Ô:2ÜB8àI>ÖG9Ç;,¹1!ßOGÙIAÔE=ÓE;ØH?ÜG@àC>á<:ã54ê67ï8:í9:ç77à72Ý:3Ü>5ÎKAÈE;½=0µ7)°5&³8)¹>.ÀA2Á;/Ê<2Õ>5ß=8ç;9î79ò67ô68æ7>æ7>æ7<å8:å99å97ã:5ã:3Þ5.ß6/ã81ä84å97ç98ç9:ç9:ë;>ç9;á99Ü<<ÖA=ÌC;ÀB6´@3¦;+¢=+>,™<*–;(•:'”9&“8%‡F2‡>/†/%”-(ÀIKèkoçlqÊWZ¶OP©TQŸVO˜YP•[P–]R™^Vœ`XMb!:O3JOf x’I˜²h¡½r »t™²pƒ›akN\lEWdHS\GHN@=C9;<,AB4=?2:=2<B6:C2AN4Rc?\tBgƒHpKo“Il’Gj’Ij’KgJlUm‘To“Ul“Pk“Lk”Hl—Hm˜FpJoŸIp Jr¢Ns¥Pv§UyªYz«Z{¤jo˜^dSWN?WN?WN?WN?WN?WN?WN?WN?XO@YPAYPA[RC\SD]TE^UF_VGd[JcZIcYMcYOf[Uj_]nbdpcjrentgpvirvirsfom`ggZacW[\\T\YRYVOWTKXTIXTI\VJ^VIb[Ic[Hf[Gh[Hi]Gj^Fm^Gm^G]eNmhTt]M‚RFšVM­VM²QH¶QE®H9ªC2©>,¯:)½9,Ì70Ø42Þ22Ý6-Þ7.Ü8.Ü8.Û7-Ú8-Ù7,×7+×7+Õ7+Õ7+Ô8+Ô8+Ô8+Ô8+Ò9+¸>/·=.®9(¥2 ¦3 ²:)»=.¿;,Æ:-È4*Ì3+Ó;0ÜE:ßPBÞRCÚQAÝE@Ø@;Ñ<6Ð;5Õ>7Ø=8Û96Ý33é69í68ï79í68é77å97â=9á?:ÆC9¿?2¸:,±6'¯5&²8)¸=-¿@1ÅA4ÍA4×@7ß=8å97ê67ï56ô68ç6<ç6<ç7:æ89æ87å97å95ã:3â92ã:3ã:3ä;6æ:8æ:8å99å99æ9;ä:=à<=Ú?=Ñ@;Å?6¸<2¬;-¥;+ <,œ=+—<)–;(’:&‘8&7%z;)€8)‰5*ž;5ÁQPÚceÔ]a¹MM­NL¤SOYP˜\R—^S—^U˜_V™^VSg*Sg(^r3zO—°l¥¾z™²nˆ¡`j‚Fau@Sf9IY5FP7?H59?358/;<,AB4=?2:=2;A5:C2@M3Rc?]uCgƒHqLp”Jm“Hk“Jk“Lh‘Km‘Tn’To“Sm”Qk“Lj”Hl—Hm˜HpJnžJp Ls£Ou¦Tx©Xx©Xx©Zm–\b‹QY‚H]TE]TE]TE]TE]TE]TE]TE]TE[RC\SD]TE^UF_VG`WHaXIaXIe]He]Jd[Jd[Le[Qf[Uh]Yh\\i]]j^`k_ak__i]]f[YbWU`USYVMWTKTQHRNCQMBSOCWQCXRB^WG^WEaYFc[Fg\Hi^Hk`Jk`J^cOmhUy_PˆXN¤[T³VQ´HE¸E>¹@7¸>3·<-·9*¼8+Ã9.Ê:/Ï;1Û7-Û7-Û7-Ü8.Ú8-Ù7,Ø8,×7+Õ7+Õ7+Õ7+Ô8+Ô8+Ô8+Ò9+Ò9+º@1¶>.®9(£2 ¢3ª:&µ=,»=.Ä?0Å7+Æ2(Ê3(Ð<0ØF9ÛM?ÝQBÜ87Ø43Ô20Ô52Ù:7à>;å=<é;<ï8<ï5:ì27ê24é56å97á<8à=8¹;-·9+±6'®4%­5%°8(µ<+»=.ÈD7ÏC6ÖB8Ü=7â96è64í55ò67ê5:é6:é69ç79ç77æ95å:3å:3ã:3ä;4ã<6ã<6ã;8â:9á99à88Ý9:Þ;<Û@>ÕA=É>7º:1­7+¥7(¡;,œ=+˜=*”<(’;(9&8%Ž7$u8%y6%ˆ9,¢E=ºROÂVT¹OO¬HH¤LHœSL˜ZO—^S–bU—aW˜_V˜]UgxB{ŒU“¦n¥¸€«À‡ž³zz‘YYp:?R$AS)AQ-?L0:C.6<.690581:;+@A3=?29<1;A59B1@M3Qb>_wEi…Js’Nr–Lo•Jm•Lm•Nk”Np”Vq•Uo–Sn–Pl”Kk•Il—HmšIpJpJp Lu¤Sx©Xyª[u¦Wq¡U_ˆNVEOx>aXIaXIaXIaXIaXIaXIaXIaXI_VG`WH`WHaXIbYJcZKd[Ld[Le]Ff^Gf^Ig_Lg^Of\Pf\Rf\Sh]Wh]Wh^Uh^Ug]Se[QdZNdZN]YNZVKVRFRNBPL@PM>RO@UO?WQAYTA[VC^WDaZGd]Jf`JgaKadSleUt]O‹[Q«b\»YXºDD¾9:Æ;8É:6Ç80Â8-½8)¼:*½@.¾C1Ù7*Ù7*Ú8+Ú8+Ú8+Ø8*Ø8*Õ8)Õ8)Õ8)Ô8)Ô8)Ô8)Ò9)Ò9)Ò9)»A2¶>.¬9'¡4 2¢8"¬=)µ@.¼>/Á9+Ä6*Ç4*Ë7+Í;.Î</Í>0å26á14Ý02Ý34à88å;<ë=?î;?ï6<í38ì/5é05ç47ã77Û64Õ30±7(°6'®6&¬7&¬7&®9'²:)µ:*ÃA3ËA4ÔA7Ü?8â:7ç85í76ð67í6:í6:í68ë76ê86è94ç:4æ;4â92á:2ß:4à;7Þ:8Ý98Û97Û89Ö<:Õ@<ÓB?ÊA;»;2¯6+¥5'ž7(œ;*—<)“<)‘<(:&8$Œ7#Œ6%z@,v5#6'™E;¬OH¬MI©LG¨PLPH–VL“ZO“_R“bT•aV—aW™`W~‹]™©z­½Ž¦·Š¡ts†YN`8/A->3B%:F.=F3;A3:=2;<4<=79:*?@2<>19<1:@49B1?L2Pa=`xFj†Kt“Os—Mq—Lo—No—Pm–Pp—Tq˜Up˜Ro—Pm•Ll–Jn™JoœKqžMrŸNt£Sy¨X|«]w§[mSd”J[„LS|DNw?cZKcZKcZKcZKcZKcZKcZKcZKcZKcZKd[Ld[Le\Mf]Nf]Nf]Nf_Eg`Fh`IiaLiaNi`Oh_Ng^OjaRi`Qi`Qh_Nh`Mh`Mh`KiaLb_P^[LYVGTQBPM>NK<NK:NK:PM<RO>TQ>VS@YVC\YF^[H^]I`aSf^QmWJ†[R­hcÁb`ÄLMÌ@CÔ:<×79Ö74Î70Á9+·>)²D+°H-×7)×7)Ø8*Ù9+Ù9+Ö9*Ö9*Õ8)Ô8)Ô8)Ô8)Ò9)Ò9)Ò9)Ò9)Ò9)¼A2¶>.«:( 7"™5š7 ¢>&¯B-±<*º;*Â:,È8-Ë8.Î:.Ð<0Ò>2ò5<î3:é27ã36â46â46â46ä15ì5:ì39ê38ê5:æ8:Ü66Ñ2/Ç,(®9(­:(­:(«:(«:(«:(¬9&¯7&¸:+Á<-Í?3Ø?7à=8æ:6ê86ì87ï56î66î66í74ë84ê93ç:3æ;3á:2ß;2Þ=5Ü=9Û=:Ù><Ø=;×==ÌA<ËB<ÆA:»<3­7-£5(ž7(š;)–;)“<)=(Œ;(Š9&‰8%ˆ7$‡6#}C/s4"y4$“G:¤RG¡NFžNE¡WN˜UL’XL[NŒ\NŽ^R”`U—aW›bYƒŽd˜¤|©ƒ€Žj]kJDS42@&$2-:&0;*5=.9?3<?6=>6:;3::29:*>?1;=08;09?38A0>K1Pa=ayGk‡Lu”Pt˜Nr˜Mq™Pq™Ro˜RršSršSršQp˜Om—Km˜Ip›LržOt Qv¢Sx§Y{©^z¨_qŸVd’JY‡?]†NVGQzBe\Me\Me\Me\Me\Me\Me\Me\Me\Mf]Nf]Nf]Ng^Og^Oh_Ph_Pg`Fh`IiaJjbMjbMjbOjbOjbOjbOiaNh`Kh`Ih`IhaGibHjcGe`Mb]J^XHXRBSM=MJ9KH7IH6KJ8LK9LM;NO=PQ?QTASVESVEYYM]WKcQEzXN¡ha¸eaÇUUÛORÞ=Cã8>à67Õ62È:.¹@+­E*¦I*Ô7(Ô7(Õ8)Ö9*Ö9*Õ9*Õ9*Ô8)Ô8)Ò9)Ò9)Ò9)Ò9)Ò9)Ò9)Ñ:)¼@4µ=/«<+ :$—7’6š<#¦B*°C.¹@/¿;,Ã7*Å2(Ë4+Ó:2Ù@8ó1<ð2<î5=ë8>ç:>å;>ä:=ã9<á48ä5:å8<ä;>Þ;<Ò86Å1-¼-'«<+«=,«>*©>*¨=)©<(©:'«8%¯6%¹7)Å;.Ñ=3Ù<5à;7ä;8è;7ð75ï75ï75î84ì94é;4è;4å=4â>5à?7ÞA:ÚA;ÙA>ÕA?Ñ??Ñ??¾B:»@8µ<3ª8-¡5(›5'˜8(•<*‘;*<)Š<(‡:&†9'„7%ƒ6$‚5#y<)r3!}:*—OA£YLœRG•OE–VJ”ZN[MŒ[M‹[OŽ\Q”^T™`Yœa[s}Xyƒ`r|ZU`B9F,/;'0;+1;03=44;35<4:?8?B9?A6<<277+89)>?1:</7:/8>27@/=J0O`<ayGk‡Lu”Pu™Os™Nq™PršSp™Sr›OrœPq›Oo™Mn™Jp›LsžOu¡Ry¥X{§Z|¨]x¦]qŸWg”O]ŠEVƒ@`‡PY€ISzCg^Og^Og^Og^Og^Og^Og^Og^Og^Og^Og^Oh_Ph_Ph_Ph_Pi`QjbOjbOjbOjbOiaNiaNiaNiaNiaLh`Kh`Ih`IhaGhaEhaEhaEf_Le^Kb[H\WDWR?PM:LI6IH6GH6GH8GJ9GK:HL;IM>HO?HO?PPDVRGYOChREYM˜UL³RLØXWàGJç<Bå79Ý54Ñ:1¿@-°D*¥D$Ò6'Ó7(Ô8)Ó:*Ó:*Ó:*Ó:*Ó:*Ò9)Ò9)Ò9)Ñ:)Ñ:)Ñ:)Ñ:)Ñ:)½?3¶</¬=,£<)—9 6”:  B)¬C-¶A/¿=/Â6)Â/%È/'Ð6.Ú=6ð0;ð5>ï:Aì?CæBCáACÞ@AÚ>?Ï12Ñ56Ô::Ò<;Ê;7¾73µ4.¯3+¥>+¥>+¥>+¦?,¥>+¤>(¥<'¨;'ª7$²7'¼8+Å8.Ì8.Ö92Þ<7ä?;î85î85î84ì94ë:4è;4å=4â>4âA7ÝC9ÚC<ÕB;ÐA=Ê?<Ç=;Ã<9®>3©:/¢8+œ6(˜7'”8)‘:)Œ;(‹=)ˆ=*…<)ƒ:'‚9&€7&6%~5$v4$x5%…B2˜UEœXK“QCPD•ZL’ZM[NŽ]OŽ\Q’\R•\U˜[V™\W`hCX_=JS4>G,6?*2=-4>35?74=88>:=B<CF?EG<CC7@>/;9*78(=>0:</7:/8>26?.=J0N_;`xFk‡Lu”Pu™Os™NršQršSp™SqœMrNqœMp›LošKrNu¡Ry¥X«`~©az¥]qœUf‘L_‰G[ˆE\‰Hb‰RY€ISzCh_Ph_Ph_Ph_Ph_Ph_Ph_Ph_Pg^Oh_Ph_Ph_Ph_Ph_Pi`Qi`QmcWlbVjaRi`Qh_Pg^Og^Mh_NiaNiaLiaLiaJh`IhaGhaGhaGh`Kg_Je_Ib[H\WCUR?PM:ML:EF4DG6DH7BI9BI9BJ;BJ;BJ;JJ@QQERPAUN<bM:qF6“I>ÄYSÛQOãCEå8:ß55×:3Ê>/¸>)¬<$Ï8'Ï8'Ð9(Ò;*Ò;*Ò;*Ò;*Ò;*Ñ:)Ñ:)Ñ:)Ñ:)Ñ:)Ñ:)Ñ:)Ñ:)½=2¶:.­<,¥>+˜9#Œ59ž@' :$¯<)¾?0È;1Ì8.Ñ7/Ù<5àA;ð;Bï>FëBGãCEÖ@?Ê;7À50»1.·0,¼51¾:5»<6³:2©9.£9,¡9,Ÿ>+Ÿ>+ ?,¡@-¡@-¡A+£>*¤=*©<(­:(²7(¹5)Á4*Ë80Ö?8ÝD>é:5é:5è;4è;4ç<4ä=4á?4Þ@5ÝC9ØD:ÒC;ÊA9Ä?:¼;6¸85´73ž9-™7*•5'’6'‘:)<*‰:)„9&†=*„=+=*€<)~:'|7'{6&{6&y1#€8*ŒG8–RE’PB‹K?ŽSE™_SXKZN’\R–]T—\V˜[V˜YT—XSV^7EM(6@8A&>G2<D53=2-7/1737>7@E>GJ?GI;BC1?>);;#78(=>09;.69.8>26?.<I/N_;`xFj†Ku”Pt˜Ns™NršQršSp™SqœJqœLpLoœKo›LržOw£V{§\‚­e€«dx£^j•P]‡EYƒC^ˆHeOcŠUZLSzEi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qj_Yj_Yj`Wj`Wj`Vj`Vj`TjaRjaPjaPjbOjbOjbOjbMjbMjbMg_Jg_Jf^Ie_Ib]I\WCSP=ML:HI7EH7AE6>E5>F7?G8=H8<G7HJ=HL>AE4HK6YS;_F0€K9Àj]Ýf`åSSçDEè@@ã?=Ö=5É=0Â>/É3$Ë5&Ì6'Í7(Í7(Î8)Ñ;,Ó=.Ò<-Ò<-Ò<-Ò<-Ñ;,Ñ;,Ñ;,Ñ;,¸3,·7.±;-¦;)˜8"‘7’8š:"«B-±<+¹7)Á4*Í6/×<7âC?êHCëBGéDHÝCCÉ:6»61´80®8.§5+ª:/¨9.¤8. 8-›9,–:+’<+>-˜=*˜=*™>+š?,›@-œA.žB-¡@-¡<*¥:(«7(°6)¶6+¾8-Å;1Ê=4ß:4á<6â?6ã@7âA7ßA6Ú@4×@5ÚG=ÒE;ÇA6»;2±6.ª3-¤1,¢1+”;-’:,:+:*‰:)ˆ;)…<+„=+~:'|9(|9({:({:(z9'x6&w4$z, A4˜NC“MAŽL>RE‘VHŽRG˜\R˜\R‘UMTL™ZU—XS–WR `^R[0IQ(AK&BK,>H/7@-2=-4>34;3HPEX^RW[LLO<DF.AA'==!:;+>?1;=0:=29?34=,;H.Pa=bzHlˆMu”Ps—Mq—Lp˜OršSqšTpJqžKrŸLrŸNsŸPv¢U{§\ªb‚­fx£^i”O_‰G]‡G`ŠJfŽOhRd‰U[€LTyEi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qj^^j_]j_]j_[j_Yj`Wj`Vj`Vj`TjaRjaRjaRjaRjaRjaRjaRj_Kh`Kg_Jg_Jd]J^YEUR?ON<IJ8EH7AE6>E5?E7>F7>F7=E6BF8>E5=F1DN5HK0PB'yS<¹ubÉdXà_YíUTêFGä>>â@=Û>9Ñ82Ì:+Î<-Ï=.Ð<.Ï;-Î:,Í9+Í9+Î:,Î:,Î:,Ð:,Ð:,Ð:,Ð:,Ð:,È?9ÆA:½A7®=/6#•2•2™3¦5#²7(Á;0ÑA8ÞE?æIDéJFìJGÞBCÛEDÎC@¼;5®9/¨>1¢A1œ?.œ@1™@0–>0’?/Œ?-ˆ?.„A.ƒB.‘;*‘;*’<+“=,”?+”?+–?,™>+Ÿ@.¡=-¤:,§9*¬8+±8-¶:0¹:1Ð90Ò;2Õ>5ÕA7×C7ÖD7ÔD9ÑE8ÊB6ÃA4¹=1°:0¨8-¢5.5,œ5.Ž=,Œ=,Š;,ˆ;+†:*„;*<,€=,~;*|;)y:)y:)x9(w8'u6't5&„1)‘C9˜NC‘K?ŒJ>PD’TIRG“SJšWQ˜UO™UR\X”WTŽSO—\XT]0Zc8_j@[eBIT66C)4@*<G6MXGYbQ_fTW\FJN5BE*?@!<=9:*=>0:</9<1:@45>-;H.Pa=c{IlˆMu”Pt˜Nq—Lq™PršSqšTq¡Kp LpJqžMt Qx¤W|§_ªc{¦aošUcŒJ]…Fa‰JeNeNc‹Ld‰U[€LTyEi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`Qj^`j^`j^^j_]j_[j_Yj`Wj`Vj`Vj`Tj`Tj`Tj`Tj`Vj`Vj`VlaMk`LiaLiaNf_La\I[VCTQ@ML:HI9DG6AE6AE6?E7>D6=C5=F57@-?H3EM5AA%QA']E³u`³WHÙbZðebîRSéEFìFHèBDÝ79È9+É:,É:,É:,É:,Ê8+È6)È6)Ê8+Ë7+Ë7+Ë7+Ë7+Ì8,Ì8,Î7,Â3/¾5/¸5-¬3( 0"›0Ÿ1 ¥4$»A2ÇC7ÖG?ãKFçLGéJFåFBâC?ÕCCÏDAÁ@:°;1£=/žC1™F4•G3’E3E2ŒC2‰B0ƒB0B/{B.xD.Š8*‹9+‰:)Š;*‹<+<+Ž=,<*–?.–=-›;+9* 8+¥9-©:/«;/¼7.¾90Á;0Ä>3Å?3Æ@4Ä@3ÁA4¸:,²:,ª9+£7+7+™7,–8.–91‰=-ˆ<,…<+„;,‚:+€;+<+<,};+z;*z;,w9*v8)u7(t6's5&Œ91”F<—MBŽJ?ˆH<OD‘SH”QI“NGšSOšSOšVSœ]X“YUZT—f_wƒS~Š\€‹`lxPJX46D#=J.MZ@eqYeoW\fMNW<DJ.?D&=@!:=89);<.8:-9<1;A56?.<I/Pa=c{Im‰Nv•Qt˜Nr˜Mq™PršSp™Ss£Mp LnLpŸOu¤V{§\}¨`|§bošUfM\„E\„EdŒMhQeN_†GcˆUZLSxEi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`QjaRjaRjaRjaRjaRjaRjaRjaRk_ak__k__k`^k`\kaXkaWkaWkaUkaUkaUkaWkaWkaWkaXkaXncQmbPjbOjbOhaNe^L_ZGYVERO>MK<GH8DF8CE7AE6@D5>B3;I27C-EJ3IG0K<%mN9—dO§`NŸA5ÆSLçc_ð^^îRUíJMêDHç>CÉ;/Ç9-Å7+Å7+Ç9-Ê:/Ë;0Ë;0Ñ>4Ñ>4Ñ>4Ò>4Ó?5Ó?5Ó?5Ó?5Ó?=ÑB>ÍD>ÆF=ÁG<ÂI>ÆN@ÎPDÙSJÞOGäLGäIEåFCâC?àA=ß@<ÔFDÊC?º?7«<1ž>.—D2“H3‘J6‹G4ŠF3‡D3„C1B0zA.wC.uB/†8+…9+…9+†:,†:,‡;-‡;+ˆ;+‰:+‹:)Ž8)8*•9,™<-=/ž>0«9/­8.®9/°:.°:.²:,¯9+®8*¨7)¥7*ž7(›6*•7+’8-9/;0†=.…<-ƒ;,9*:+~9*}:*};-|:,z;,y;,w9,s8*q6(q7)q7)B8”G=‘K?ŠH<‡I<‹OD“UJ—TL—PLSP˜QO–RO—\X_Xh^žzn™k…’fu‚VYh=CR)?O(P`<crQetS\iKNY;CL/?E)>B'=A&;>#78(:;-79,9<1;A57@/<I/O`<ayGlˆMv•Qu™Os™NršQršSp™Sq¡MoŸKožMs¢Rz¨]|ªaz¥^u [bŒJ^†G[ƒD_‡HgŽMj‘PfL`‡Fb‡TY~KRwDi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`QjaRjaRjaRjaRjaRjaRjaRjaRk`^k`^k`\k`ZkaXkaWkaUkbSkbSkbSkbSkaUkaWkaWkaXkaXocSnbRmaQkbQkbQhaOd]M`ZJVSBRO>MK<IG8EF6DE5BC3@A19K1>H/JH1Q?+e>-”ZL¬`S›>6œ4+µ@9ØXUóigödeëRUèINìKQ×J@ÓF<Í@6Ë>4Í@6ÒD:ÕG=×G>ÚJAÚJAÝJBÝJBÞKCßJCàKDàKDëRTéSTãTPÜSMØSLØSLÛTNàUNàLHâHFäEBäB@äB@äB@ãEBãEBØJHËD@¹>7ª>2žA2–C1F3I6‰F3‡D3†C3ƒ@0@1}?0y@/x@1ƒ9.ƒ9.‚:.‚:.ƒ;/ƒ;-ƒ;-ƒ;-9*‚9*…9+‡9,‰:+;-<.=/›;/œ:/ž9- :.¡9,¢8*¢8*¢8*Ÿ8)œ8)˜8(”8)9*Œ:,ˆ:-‡;-ƒ;-‚:,9+~9*}8)}7+|8+{9+z8*y9-x:-t9+q5*o5)q7+r:-G;ŽH<‰I=„I;…K=ŒRF“WMšWO˜QMžTQ™RP•VQ’`YˆbW‚h[ŠwhivKZi>JY.AR&IZ0Wi?dvLj|TXjDL\8?M,:D)<D,>C-=@-:=*89):;-68+8;0<B67@/;H.L]9^vDi…Jt“Ot˜Ns™NršQs›TqšTmŸJmžLp¡Px§Y|ª_z¨`rXi“QYƒC\„E`ˆIeŒKgŽMgŽKfJd‹Hc…SY{IRtBi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`QkbSkbSkbSkbSkbSkbSkbSkbSla[lbYlbYlbXlcTlcRldQldQldQldQlcRlcTlbVlbXlbXlbYocSnbRmaQlcTlcTkbSg`Pd]M]WGYSCSM=MJ9KH7HE6DB3B@16J.>H-NC-b=-„D:¯VP¶MJ¡++´:9º=;ÑTPòpnýwvñehêY^ò]cáVOÚOHÒG@ÎC<ÑD=ÔG@ÖGAÖGAÙHCÚIDÚIDÝIEÞJFÞJFàKGàKGãGJáGIÝGHÙGG×HD×HDØGDÝEBàBAåABé@CêBBèBBäB@ßA>ÜA=ÚJIÌB@»<6®>3¢@3—A2B0D3‰A2ˆ@2ˆ>1…=1‚<2€<1=1}=1ƒ:3;3;1;1€<1€<1=/=/=/€</€=-€;,€;,9+9+8)Œ:/9.9/“;/—;.š=.=/ž>.™9)•9*“:*Ž;+Š;,‡;+ƒ;,€;+‚:,9+7)~6*{5){5)z6)z6+x6*x8,w9.s7,o5)o5)r:-u=0ŽL>‰K>„J<‚M=…QC‹VH’XM—WN”MIœRQšTR•[We\y_PcXFb]IBP,?M)?O(K\2_qGk~QcyKVk@M_7@R,6E&7D*=F1=D4:=27:19:*:;-68+8;0<B67@/9F,IZ6Zr@eFr‘Ms—Mr˜MršQs›TqšTlKo Os¤Ux¨\z¨_s [i“Q`ŠJX‚B^†GdŒMgŽMfJeŒIgŒGhHaƒQXzHQsAi`Qi`Qi`Qi`Qi`Qi`Qi`Qi`QkbSkbSkbSkbSkbSkbSkbSkbSlbXlbVlcTlcRldQldOldMldMldMldMldOldQlcRlcTlbVlbXocUmaSkbSlcTmdUlcTi`Qf_Ob[K^WGWQARL<OI9LF6IC3F@02K+>G*SA+{E9¦NL¸EH»5<¾19Ë@EÄ?@ÊJIÞb`îrpïopçbeáZ^ÛRJÕLDÏD=ÍB;ÏD=ÒE>ÐC<Î?9ÒC=ÓB=ÔC>×C?×C?ØD@ÙEAÚEAà?Dß@DÞDFßFHßIHàJIãIIæFHçACëADîAEîACéAAâ@>Ù>:Ö=8ÛEGË=<»73°;4¦@4˜?1>0ŽA1‰=/Š<0‰;1‰92‡81†93…:4„;4:4:4€<3€<3<3}=3}=3|<0{=0{=0{=.{<-z;,y:+z8*z8*€:0‚:.„:-ˆ:.Œ:.‘;.”<.–=-’9)‘:):*Š;*‡;+ƒ;,<+}<*€8,€8,~6*}5)|4(z4(z4*y5*u3'v6,v8-r6+n4(n5*s:/v@4‹PB†N?N=R@…VF‰XIŽUJ‘RI“NI™RP”SO‘\VŠfZl\LML7BL3@O.KZ9WgC`rJezOdzLVl=G]/AV+7I#0A!5C*=F5<D98=7796:;+;<.68+9<1=C77@/7D*FW3Um;a}BoŽJq•Kr˜MršQtœUr›UnŸNq¢Qu¦Wv¦\s¡Yj—R`J[…E^†G`ˆIbŠKeŒKfJhHf‹EeŠD`‚PWyGPr@i`Qi`Qi`Qi`Qi`Qi`Qi`Qi`QkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcRldQldOldMleKleIleIleKldMldOlcRlcTlbVlbVnbTmaSkbSkbSmdUlcTjaRh_Pd]M`YIZSCUN>QJ:MG7IC3GA13M*>G*[B.PGºVVº7?»'3ÜBNÐ:CÄ9>»;:ÂHGÓ][ßgf×[]ÇILÓJDÏF@ÌC=ÎC>ÒGBÒGBÐB>Ë=9ÒC?ÓB?ÔC@ÕDAØDBÙECÙECÚFDá>Cà?DÞBEßEGáGGàFFàBCâ=AëADí>Cì;Aê<>æ>>ãA?ßD@ßFAÙ@CÉ78¹30±:4§?4š>1=/Ž?2Š;.‹9.‹80‹61Š71Š73‰84‰:5:3:3:3~;3|<3|<2{=2{=2u9.v;-w<.w<.x=-x=-y;,y;,{;1};/~8,7*„6)‡5'‰6(‹5&7(‹8(‹:)ˆ;)…<+<,~=+{<*€8,7+~6*|4(|4({2)y3)y5*t1(u5+v8-r6+n4)n5*t;0xB6ŒTE„Q@P>‚UB„YHˆYI‰SGNG˜SN˜RPPKˆVO‚bUeZHFK4;K0IX;[jKgxVewQYnCSi;Me5I`28M"-B*;2@):E7;B;8<;7;<<=-<=/79,9<1=C77@/6C)DU1Rj8_{@mŒHp”Jq—LršQtœUr›Uq¢Qt¥Vu¥Ys£Ym›Sd‘N\‰HZ„DdŒNa‰J`‡HcŠIfJiŽIeŠDa‡>`‚PWyGPr@i`Qi`Qi`QjaRjaRkbSkbSkbSjaRjaRjaRjaRjaRjaRjaRjaRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlcTo\Nq_QtdUrdWnbTj`Th`ShbTgaSebQa^K[VBVQ;TN6NH.GA'RD)N=#cI2iV²zm·ng³[W¸PQ¶BEÁ@EÉ@GÑBFÖDGÚEIÜGIÝGIÔBEÔBE×BDÙEEØDBÒC;ÎD:ÌH;ÄF7ÃH9ÆH:ÊG?ÐEB×BDÜ?FÞ=EâBDâBDâBDâDEâDEãEDãEDãEDâDAâC@áB?â@>ã?=ã?=ã?=å@>ÎE?Ä?8¶:2©80Ÿ:0•>4Œ@3ƒ?2A4|@5}?4<3ƒ:3‡83Š73Œ72…<-…<-…<-„;,ƒ;-‚:,‚:,‚:,9-9-9-~:/~:/~:/~:/~:/~80~80}90}90}90}90|90|90|90|90z:0y9/y9/x8.w9.w9.w8/w8/v7.t8.s7-r6,q5+p6+l2'q7,m4)l3(o6+m4)q8-H=ULƒTL†QK‹PJNJ•NL˜NM—PL”SM‹UK†\NdOkaFTW8JX5N_;gT`zMWpFTkARg@O`<IX7DQ39C*5=&49%7:)=>0CA4B@4@<12:/2:/4:.5;-9=.<?.>A,>D*T^<bqHq…TtVt”UršSsSržQv^¦g¦gq˜YcŠK_†G_†G^…F`‡Hb‰Jd‹LfNeŒMcŠK`‡H^…F_OTvDKm;i`Qi`Qi`QjaRjaRkbSkbSkbSjaRjaRjaRjaRjaRjaRjaRjaRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlcTsaSr`RrbUqcVrfZpfZmeZjdXgdUkhYmjYlgThcOd^H[U=RL4PJ0F?%P@)kP;WG„NB‰D=–C?´VT»SR¾PQÂNOÄLMÆLKÅKHÆJHÔRTËFGÄ<<Ç;:ÑA@ÔE?ÏB9Ç>4ÉE9ÈF9ÊG=ÍG>ÒGDØCEÜAEß?GáCDáCDáCDâDEâDEáFDáFDáFDàEAáC@àB?ßA>àA=àA=â@=ãA>ÑFAÉB<¼=6¬:0 90“;/‰=0=0A4|@5}?4<3ƒ:3†91Š71Œ72…<-…<-„;,„;,ƒ;-‚:,‚:,‚:,9-9-9-~:/~:/~:/~:/~:/}90}90}90}90}90}90|90|90|90z:0z:0y9/y9/x:/w9.w9.w8/w8/t8.s7-r6,r6,p6+p6+k1&q7,m4)l3(o6+l3(p7,~H<‚SK„TJˆQJ‹PJ‘PL•OM–PN–RO‹OG…SH€[K{ePsiPhkLdrOgxT\uKXoEPf?Ka:K_:K\:GV7CP4<F-8@)6;'7:)<=/?@2@>2><03;03;05;/6<09=/<?.>A,>D*Q[9^mDmPpŒRr’Sq™RsSsŸRxža|¢exžak‘T`†I]ƒF]ƒF\‚E`†Ia‡Jc‰Le‹NdŠMbˆK`†I^„G]MRtBIk9i`Qi`Qi`QjaRjaRkbSkbSkbSjaRjaRjaRjaRjaRjaRjaRjaRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlcTtbTo_Pm]Pm_ToeYog\keYhbVfbVpl`{xi~{jzgzuapiVf`JPV<DF.A?(MB.S@/U8(^6*m=3p7.x71:3‰@9•HBžOH¦WPª\RÁ[W»RO¸FE½A?ÉCBÑFCÓD@Ð?:ÐA9ÐC:ÐE>ÔG@ÖGCÚFFÛEFÝDGáCDßCDßCDßCDàDEßECßECßECÞDBÞE@ÝD?ÜC>ÜC=ÜC=ÝB=ÝB=ÕF@ÎE=ÃC:³>5¢:/’8-ˆ9,<-€A2~@3}?2=1ƒ:1†91ˆ81‹80…<-„;,„;,„;,‚:,‚:,‚:,€:.9-9-9-~:/~:/~:/~:/~:/}90}90}90}90|90{8/{8/{8/{;1{;1z:0y;0x:/x:/x:/x:/t8.t8.s7-s7-r6,q5+o5*o5*k1&o6+m4)k2'n5*i3'm7+}G;†QI‡PIŠQJŽQL‘RM“RN•TP’UPVO‡[P^OtbNoiQnrWjwYfwWPf@K_:EY6BV3EV6GV7FU8ER8?I1<D-9>*7;*:<.<>0<=/:;-5<45<46<26<09=/<>0=@-=C)MV7Zi@h|KlˆNpOq™RuŸSt Sz cw`n”Wc‰L\‚E\‚E\‚EZ€C_…Ha‡JbˆKdŠMc‰La‡J_…H]ƒF[}KPr@Gi7i`Qi`Qi`QjaRjaRkbSkbSkbSjaRjaRjaRjaRjaRjaRjaRjaRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlcTtdWqaTm_Rk_SkaWlcZle[jf]jf]wuiˆ„y‘•’Œ|‰‚r€ygZfNLV>AI2CF1ED0D?,I=-TD5M:+O8*R6*T7)X8+];/a?3eA5‹KAœSL­UQ¶NK½EDÇABÓCCÛEF×?>Ø@=×B>ØD@ÙEAÚFDÛEDÛEDßCDßCDÞDDÞDDÞDDÝEDÝEBÜGCÛFBÚE?ØE>ØE>×D=×D=ØE=ØE=ÖC<ÔE?ÊE>»@8§;/–8,‹9+…;.‚@2@1~?0=/;/„:/‡9/‰90„;,„;,ƒ;-‚:,‚:,‚:,9+9-9-9-~:/~:/~:/~:/~:/~:/}90|90|90{8/{8/{8/y9/x8.{;1y;0y;0y;0x:/x:/v:/v:/s7-s7-s7-r6,p6+o5*o5*n4)j1&o6+l3(h2&k5)h2&l6*|F:ŠOGŒPHQIRMSN’UPWPŽYQ‰]R…aUy_PiZGd_IciOZgKN]@EU8AQ4=M0<K.?M3CQ7FR:GS;BK6>G2:A/7>,9=,9=.8<-7;,6=66=66;46<29<1;=/<?,<A*JS4Ve>dxGj†LpOs›Tw¡Uw£T{¡dr˜[e‹N\‚EZ€C\‚E\‚EZ€C_…H`†Ia‡JbˆKa‡J`†I^„G]ƒFY{INp>Ef7i`Qi`Qi`QjaRjaRkbSkbSkbSjaRjaRjaRjaRjaRjaRjaRjaRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlcTseXugZsg[mcYjaXle]snhzwp~w† –©¥œ«§œª£™£‘œ”‰v~i`hSLSADK9AJ7>G4>G4BI7GN<FJ9CF5?@0=;,<:+<9*<9*U5(lD8‹PHŸPL°HIÂEIÏDIÖAEÙ>BÛ?@ÛAAÛC@ÚEAÚEAÚEAÚEAÞDFÞDFÞDFÞDDÝEDÝEDÛEDÙEAÚFB×FAÕF>ÔE=ÓF=ÓF=ÓF=ÔG>×@9ÕB;ÏD=ÁB9®>3œ:-‘;.‰=/„?0?/~?0=/<-„:-†:-ˆ:.ƒ;-ƒ;-‚:,‚:,‚:,9+9-9-9-~:/~:/~:/~:/}:1}:1}:1|90|90|90{8/y9/x8.x8.v8-y;0y;0x:/v:/v:/u9.u9.u9.s7/r6.q6.p5-o4,n3+m4+m4+j1(o6-j4*h2(j4*g1'k5+zF;MGNH‘PJ’SLUOŽWPŠZP…ZQ{YMv\OkZJ]UBYXDY^HOYA>L3;G18D.5A+5A+8D.=I3AM7EN;BK8?H5<E29B/7@/7>.5<,4;+5;75<56;56;48;2:</;>-;@)GP1Ra:buGi…Kq‘PuVy£Wx¤Uzcn‘W`ƒIZ}C[~D^G^G]€F`ƒIa„Jb…Kb…Ka„J`ƒI_‚H^GW{KLp@Bf6haQhaQhaQibRibRjcSjcSjcSibRibRibRibRibRibRibRibRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlcTmaUndXpf\lcZkd\rmg„|‘‹¥¤ ³²®ÄÁ¼ÉÆÁÉľÅÀºÀ¹±¹²ª¤œˆ‚tfcTPQAEI8=F38E18G45F35F44E36D58D6;E:?G<@H=<6(L</b@7EA£OOÁW[ÎOVÍBI×DJÚDFÝDFÝEBÝEBÞE@ÝD?ÞC?ÞDFÞDFÞDFÞDFÜDCÜDCÚDCÙECÙEA×FAÕF@ÓF=ÐF<ÏF<ÐG=ÐG=Ø=8×@9ÑB:ÆC9¶A7¤>0–=/Œ=.†>/‚?/€>.=-<-ƒ;,„;,‡;-‚:,‚:,‚:,‚:,9+9-9-~8,~:/~:/~:/~:/}:1}:1}:1}:1z:1z:1y90y90x8/v7.v7.v7.u9/u9/u9/s9.s9.s9.r8-r8-q6.q6.p5-o4,n3+m4+l3*l3*h2(l6,i3)f2'h4)e1&i5*xD9’KE’MF“PJTLVO‡XNYO|\Os\Nk[L_XFUTBPS@JQ?@I64@,3<+2;*09(09(2;*5>-9B1<E4?H7=H7<G6:E48C25A-3?+1=)3973954954937:19;0;>-;@*CL/O^7_rDi„Mr’SwŸXy£Wv¢Us–\f‰OZ}CX{A\E]€F]€F^G`ƒI`ƒI`ƒI`ƒI`ƒI_‚H^G]€FVzLJn@Ae7haQhaQhaQibRibRjcSjcSjcSibRibRibRibRibRibRibRibRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlcTiaVjbWkdZmf^upjˆ…€Ÿžš°°®ÂÂÀÓÒÐâáßéåäçãàãÞÚÞÖÓ×ÏÌÒº°º¤™˜†zym__YIKL:>F19E1<K8;J79G68D68@57<57947836A3>>2J91`94ˆHH²\_È_dÍVZÐOSÕMOÚLKÜJJàHEáFBãDAåA?ÞDFÞDFÞDFÝCEÝCEÜBBÛCBÛCBÚDCØD@ÔE?ÓF?ÐF<ÏF<ÐG=ÎH=Ý>8Ú?:ÒB9ÉC:¼C8«A4™<-Œ9)‡>-ƒ>.>-€=,€=,<,ƒ;,…<-‚:,‚:,‚:,9+9-9-~8,}9.~:/~:/~:/}:1}:1}:1}:1}:1y:1y:1x90x90w8/t8.s7-s7-s9.s9.r8-r8-q8-p7,p7,p7,p5-o6-n5,n5,m4+l3*i3)i3)g1'k7,h4)e1&h4)d0%f4)uC8•JE“LH“PJTL‰WNYOx[Mp]Nj^N]WGPQAKN=CJ:9B12:+08)36-17-06,/5+/5)17+2:-4<-9D4;F6=H7<I7:G56C/3@,1>*0640641622716929;0:<.:?)?H+KY5]pChƒLs“TwŸYw¡WržQiŒT^IUx@WzB[~F[~F[~F]€H_‚J_‚J_‚J_‚J^I^I]€H]€HUvKJk@@a6haQhaQhaQibRibRjcSjcSjcSibRibRibRibRibRibRibRibRkbSkbSkbSkbSkbSkbSkbSkbSlcTlcTlcTlcTlcTlcTlcTlcToh^ng_lh_tqj…„¡ ž¼¼ºÏÏÏÎÏÑààâòòòúøùû÷öøòòñìéêåâïÍÃàÀµÅ©¥€sbaZGML7CH2AI4AH6BF7BD7C@9D<9C98C772?5;@9@93H/+c76QR³giÇmmÂ[\ÉYWÑUS×QNÝKKåGFèBBê@AÞCGÞDFÞDFÞBEÞBEÝADÜBBÜBBÜDCÙCB×C?ÔC>ÒE>ÐE>ÏF<ÐG=â@;Ý@9Õ@9ÌC9ÀD:°B5›;-‹5&Š=-…=.>-€=,€=,<,ƒ<*„=+‚:,‚:,€:.9-9-~8,}9.}9.~:/~:/}:1}:1}:1}:1}:1{;2w;1w;1v:0u9/t8.s9.r8-q7,r8-q8-p7,p7,n8,m7+m7+m7+o6-o6-n5,m4+j4*j4*i3)h4)f2'k7,h4)c1&e3(b0%e3(uC8”JG“NIQJ‹TM„XOzZMq[Mh\LXUDHK:=D4=E69A208+/7*5=056157257247005.06,08-19,6A3:E5=J9>K9;J77F12A,0?*.42.420511605818:/:<.:?+<E*IW4[nAg‚Mr‘UvZuŸWo›Pb…MX{CSv>WzB[~FY|DY|D\G_‚J_‚J^I^I^I]€H]€H]€HSsJHh?>^5icSicSicSicSicSicSicSicSicSicSicSicSicSicSicSicSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUmdUmdUmdUmdUmdUmdUfc\gd]vsn“’ޝ¯­ÄÆÅÚÛÝìíïóôöö÷ùüüþÿÿÿÿþÿÿûúüööùôñÿÞÏöÖÇãÈ·É´Ÿ­ž‡ŠƒicbFGG-EG/DF0GD3IC5H;3F42G34M797@;;@:@;8G85cGF‘kjŔ譩ҋ‡ÇtnÀ]XÆSNÖNNâIKëEIðCGÜFHáHKÜCFÕ:>Ø>@âFIàDGÖ:;Ú@@Ú@@ÙA@ÖB>ÔC>ÑB<ÏB;ÏB;ãA<Ý@9Ô?8ËA7¾B8°@4;.8*‹>.†>/‚?.>-€=,<+=*=*9-9-9-~8,~8,|8-|8-|8-}9.|90|90|90z:1z:1z:1z:1x=5w<4v;3u:2t91r7/p7.p7.o6-m7-m7-m7-m7-l8-l8-l8-i2+m6/p92o81k4-g2*g2*h3+e0(i7.d2)^,#`0&_/%b2(p@6’LJOKŠQJ‚QJ}YMv_QfYIRO>CF5=F58C35@02=/3;04:04:077577566446135016/05..6+.9+2=/6C29H5:I68G42D./A+,20,2.-2..3-36/780:</:?+6>&DR1YkCh‚Ru”[wž_r›Wj•N\}HXyDTu@Tu@WxCZ{F[|GZ{F^JbƒNbƒN^J\}H_€K`L^JTrNFd@:X4icSicSicSicSicSicSicSicSicSicSicSicSicSicSicSicSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUmdUmdUmdUmdUmdUmdUed_onj…†¤¤¢ÁÃÂÖÚÛêîï÷ûþ÷ûþøüÿüýÿþþþÿþÿÿýüÿüùÿûøÿïÚüêÒîÞÅØÍ±À»¤£„‚ƒcgkJMP1II/EC,HA/J>2L93M85Q99;;9BA?MHE\RQyjg¢‹Ì³®åÇ¿ÿÙÏ괪̃|Àc\ÌVTÛPSãFMâ=DÕEEÕEEÙGHÞIKÛEGÖ<>Ö<>Ü@CÚ>?Ù??Ú@@ÙA@ÖB>ÓB=ÒA<ÐA;ß@:Û@;Ô?8ÌA:¿C9±A6 ;/‘9+Œ=.‡>/ƒ>.>-€=,<+€=,<,9-9-9-~8,}9.|8-|8-|8-|90|90|90z:1z:1{;2{;2{;2v=4u<3t;2s:1r90p7.m7-m7-m7-l8-l8-l8-l8-j8-j8-j8-l5.n70n91n91l7/i4,g2*e3*c1(e3*_/%^.$b2(^.$`0&n?5„IEˆQLˆWRWOrVKdRDQJ:>?/:A16A14A02>02<14<15;17:388677577557446116005./7,.8-1<.4A07E49H58G44E22D.062.40.3--2,14-45-8:-9=,7?'DQ3YkEh‚Sv”`wbp˜YfNZzHWwETtBTtBVvDYyGYyGYyG[{I_M_M\|J[{I^~L^~L\|JTmOF_A9R4icSicSicSicSicSicSicSicSicSicSicSicSicSicSicSicSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUmdUmdUmdUneVneVneVddby{x—™˜²¶µÍÑÒäéìôùüúÿÿûÿÿûÿÿûÿÿýÿþþþüÿÿûÿÿúÿÿúÿüßúùÛïðÐáåÄÒØ´¼Äž©‡’j`hCRW7DG,EC.KD4MC9N?8L=8C:;SJKi`a€xv›“¼µ¯×ÐÈçÝÓúêÝÿôéÿåÛ画Äec¸ACËBIáNVÚVRÒLIËDAÎBAÔFE×EFÙCDÛBD×=?Ø>>Ù??Ø@?×A@ÕA=ÓB=ÒA<Ü?:Ù@:ÔA:ÍD<ÀD<²B7¡<2“9.Œ=0‡=0ƒ>/>.€=-<+€=,€=,9-9-9-}9.}9.|8-|8-{8/}:1}:1{;2{;2{;2{;2{;2{;2t;2s:1p:0o9/n8.m7-k7,k7,l8-l8-j8-j8-j8-j8-i9-i9-n91m80m80m80m80i7.f4+c1(c3)a1']-#_0&c4*\-#_0&sD:OK‚UPXQqSK^J?OC7?<-37(2:+/<+0<.2=/4<15;17:37:388688668557257227016/08-.8-0;-2?.6C27E48G48G48G46=53:2/4-,1*.1(13(57*6:)6>'DQ5[lHk„Zy–fwœfl”X^‡KWwEUuCRr@Rr@TtBVvDWwEWwEXxF[{I]}K[{I[{I]}K\|JXxFPfOAW@3I2icSicSicSicSicSicSicSicSicSicSicSicSicSicSicSicSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUmdUneVneVneVneVofWgklƒ‡ˆ£§¨¹¾ÁÐÕØåíðóûþõýÿùÿÿûÿÿüÿÿüþûýþùþýøÿþ÷ÿÿöóÿâñÿÞëùÖäòÎÛêÃÌÛ²³Â™ ¬„}‰cdnKLS4EI0HJ5KI:GE9D@7QEEk__‹€¤š™µ°­ÊÇÂÜÜÔççÝ÷óèÿýñÿøíÿÝÕú·±èŽŽÌbd±>CÃPIÉTMÉOJÃF@ÊFBÔMJØJIÑ??Ò>>Ô>?Õ?>Ö@?ÕA?ÓB?ÓB?ÒC?×>8×?:ÒC=ÌE?ÀE>±B9¢=5•;2Œ<1‡=0ƒ=1=0=-~<,€=-€=-~:/~:/~:/}9.}9.|8-{8/{8/~;2|<3|<3{;2{;2z;4z;4z;4p:0o9/o9/m9.l8-k7,j6+h6+i7,i7,h8,h8,h8,h8,h8,h8,o:4j81h6/i70j81j81e4-a0)e4-b1*].&a2*b3+Y*"_3*zNE~]XvWRiNGWC:J<3@:.:;-8<.08)/:,1<.2=/5=25;169078079468368349338138119.19..9+/:,1<.2?.5B18E4:I6;J7;C87?428.-3)-0%/1&24'48)4<'ER8_pPr‹d}šnwœifXT}EUrBTqASp@Sp@TqAUrBVsCVsCWtD[xH]zJ\yI^{K_|L\yIVsCK\J<M;.?-gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUmdUneVneVofWofWpgXmru‡Œ¤©­·¿ÂÍÕØãíïòüþôþÿøÿÿøÿþúÿüûÿúûþõúüñùùíù÷ëòÿçñÿäîÿßëúÙçõÒÝéÅÈÒ­´¾™œ¤|ƒbX_@GL5DL7DK;AG9>D8f\Z†|z«¡ŸÁ·µËÃÁÕÐÍãâÞîïé÷øðùöíüòèÿóéÿóíÿäß즤´if«K=³QDÁYNÇ[QÆQH¿D=ÂA<ËD@Ë@=Ï?>Ð@?ÑB>ÒC?ÒC?ÑC?ÑC?Ö>9Ô@<ÒD@ÉE@½D<¯@9 >5•<4Œ<3‡=2ƒ=1=0=/~<.=/€</~:/~:/~:/}9.}9.{8/{8/{8/~;2|<3|<3{;2z;4y:3y:3y:3m80m80l7/l7/k6.h6-h6-h6-h8.h8.h8.h8.g8.g8.g8.g8.k92h6/f4-g5.i70h70e4-b1*b3+b3+_0(_0(]1(V*!b6-SJn[U`OHN?8A7.=6,;9-9;.7=12:-3;.4</6<06<07:167/56.49249238139/39/2:/19.19,.9+.9+/:,0;+2?.6C29F5;H7=E6:B35;-06(/3%/1$13&15&29'GS;dtWwm~šrq•g\‚QIq?Qn>Qn>Qn>Qn>Qn>Qn>Sp@Sp@WtD[xH]zJ]zJ_|L_|LZwGQn>ESF6D7(6)gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUneVneVofWpgXpgXpgXinrz‚…“š «´¹ÄÍÒÜåêì÷ùôþÿôþýöÿüúÿúûÿ÷ûþóøúìõöæòóãòþêôýèôüåóøáòöÛëëÏØ×¹ÅÄ¥±°’ŽregOMP;EL:EM>EODGSG~zqŸ›’ƽ¸ÙÎÌáÓÒçÛÛôêéü÷ôðïëûüöÿÿöÿþôÿúñÿôêÿçÞÿÚÒß‘}·fS¢K:²UF½WKµF;·@8ÈKEÇC>ÊC?ÌB?ÎC@ÎC>ÍD>ÍD>ÌC=Ô@<ÒC=ÎE?ÅD?¸A;ª=8ž;5•<4Œ<3‡=4ƒ=3=2=1~<0=1=/~:/~:/~:/}9.|90{8/{8/{8/|<3{;2{;2y:3y:3x92w81w81m80l7/j8/j8/i7.i7.g7-g7-g7-g7-f7-f7-f7-f7-f7-d8-i70h6/g5.f5.g6/h70g6/e6.a2*e6.^2)\0'`4+a5,i=4|PGQJBE>6:6-85,99/8:/47,36+4:.5;/5;/69.69.68-57,46+19,19,19,19,19,19,19,19,08+.9+.9+/:*0;+3>.6A17B2<E4:C28?/5<,37)24'13%04%07%HT>gw]umv‘nf‰_RwKAh;Mj:Nk;Pm=Pm=Nk;Nk;Ol<Qn>VsCZwG]zJ^{K_|L_|LVsCLi9=H@/:2#.&gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUneVneVofWpgXqhYqhYcjpmtz„’£¬±¾ÉÍÓÞâåðòðüüòüûõþùøÿ÷úÿôüÿòúýìøùçöøãööìù÷ëúöêýöæÿôâøëØçØÁÖÆ¯À±šŸ“}vn[ZWFOQCQWKYcZbme–˜‹²²¦ÕÎÆêÜÙõããüéëÿñôÿ÷ùÿýýýþùøûôõûñúýòÿÿóÿÿóÿÿñÿãÊ¹q[¨WD¬SCµQB¹MA¿JAÂG@ÆE?ÉE@ÊE@ÊE>ÉD=ÈC<ÈC<ÒC?ÒD@ÌEAÂC=³=9¦;5œ;5•<6Œ<5‡<6ƒ=5=4<3~<0=1€<1~:/~:/~:/}9.|90{8/{8/y90{;2{;2z:1x92w81v70v70u6/k90j8/j8/j8/j8/h8.h8.h8.g7-f7-f7-f7-d8-d8-d8-d8-h6/h70i81i81h70i81j;3l=5g80k<4b6-a5,oC:xLCtI@uJA:=647036/7:18;247.14+25,58-58-57,46+46+46+46+46)/7(08)08)08)08)08)08+08+19,08+08+/7*08+19,3;.4</9B/:C0;B0:A19=.68*24&/3$29'IU?eu[m„ghƒbWyTInE>e9Jg9Li;Nk=Nk=Li;Li;Mj<Ol>UrDYvH[xJ]zL^{M\yKQn@Eb47@;+4/!*%gdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSgdSkbSkbSkbSlcTlcTmdUmdUmdUmdUmdUneVofWpgXpgXqhYriZhowmt|‚‹’¥®µÂÍÑÔßãäïñòþþóýüôÿùöÿ÷úÿôüÿñýÿíýÿêýÿêÿöñÿøóÿ÷ïÿ÷íÿöëÿïáöÜÍäʹƯ§”ƒ€sce]P[YM_bYovo|…€¦­¾À³ÚÖÍñãàÿìíÿñôÿñ÷ÿñ÷ÿ÷ûûúøøÿøøÿúôÿõîÿïòÿï÷ÿóÿñÖÿðÖÿȰÅ}g¢O=®Q@¸RD³C8ÀIAÄH@ÇF@ÇF@ÈE=ÇD<ÆC;ÆC;ÓD@ÐE@ÊE@¾A=±;7£74š93•<6Œ<5‡<6ƒ=5=4<3~;2<3=1~:/~:/~:/}9.|90{8/{8/y90z:1z:1y90w81v70u6/u6/t5.k90k90j8/j8/j8/i9/i9/h8.f7-f7-f7-d8-d8-d8-d8-d8-f5.i81l;4k:3j92j92m>6qB:n?7pD;g;2g;2SJŒaXTKpE<6=52913:27<5492/5+25,9<345-35*24)13(13(35(46)57*,7',7'-8(-8(-8(-8(-8(/7(19*08)08+/7*/7*/7*08+08+7@+9B-=D2=D2=A29;-35'/3$3:*JVBcr[f}a\wVLnICgA=c:He7Kh:Nk=Nk=Kh:Jg9Li;Nk=TqCWtFZwI[xJ]zLZwINk=A^05;9*0.!'%heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheTheVhdYkd\kd\md]meZmfVg`MjeOnlWnl]ff^eeeqqy‡‘“–ž¡«³¶ÃÈËÙÝàìíï÷÷÷ûùúþýûÿþúÿÿûýþøûüöùüóúýôùÿõùúõùúôøúïúûëûýèöùÞäçÈÒÖµ¶¼š”›ymvW\fK`lTq~lƒ‘€žŽ··µËËÉââàïïíôôòøøöúúøùù÷þþüþþüþþüþþüþþüþþüþþüþþüæÿÿðÿÿûÿÿýïîЪ§ a\™D=¸MEÄKBÈC:ÊA7ÎD:ÑH>ÏJAÉI>ÆG>ÁJ2¿K4¹L5¯K4 H2”F2ŒE3‡E5‚D5C6€@4‚>3…;2‡9/Š7/6-~:1~:1}90|8/{7.z7.y6-x5,w7-w7-x8.x8.v8-u7,s5*q3(h91h91h91g80h70g6/g6/g6/f5.h6/i70j81i70h6/f4-g2,k1-k4/n70m80k9.j:.i>.iB1dC2gJ8aJ8raOyn\ƒ|j…‚qOL;4:04:04:039/39/39/28.28.17-17-17-06,06,/5+/5+/5+/4./4./4./4./4./4./4./4.05//4./4..3-.3-/4./4.05/0;32=55A77C98D86B64@22?.3@.DQ=WeN\jSSaHHV=DR8FT:Ic>Ke@Ke@Ke>Je<Je<Lg>OjAUpGYtK\vO]wR]wTWpPHaC8Q3).2&+/$)-heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheTheVhdYkd\kd\md]meZmfVjcPlgQmkVlj[gg_lll~~†’ž§±³¹ÁÄÏ×Úâçêðô÷ûüþÿÿÿÿþÿþýûÿþúÿÿûþÿùûüôøûòøûò÷ýóøùóøùñøúíøùéùûåòõÚáâÃÌЯ´¸—‘–vkrSYaI_kUtoŒ˜Š›©œÀÀ¾ÓÓÑççåóóñ÷÷õûûùüüúûûùþþüþþüþþüþþüþþüþþüþþüþþüîÿÿôÿÿüÿÿÿüúÿíêñ¿¸Ã}u¢J@³K@»J<ÅK>ÈJ>ÄD9½=2¿?6ÃD;ÂH3ÃJ7½M9³J7¦G5™C4D6‹F7ƒC7C8A7>5‚<4„:1†91‡81}:2}:2|91z:1y90x8/w7.v7.u6-v7.t8.t8.t8.r6,p4*o3)i81i81i81h70h70h70g6/g6/e3,e3,g5.h6/j81j81j81k92k60l71m80l:1k;/l>1j@0iD2hG6kP=gR?ufSvd‹†s†ƒrML:4:039/39/39/28.28.28.17-17-17-17-06,06,/5+/5+/5+/4./4./4./4./4./4./4./4.05//4..3-.3-.3-.3-/4.05/-80/:21=34@66B66B66B45B16C1CP<P]IR`IIW>AO6BP7FT:Ic@Jd?Ke@Ke>Ic<Hc:Id;Je<SnEXrK\vQ]wT[tTTmOC\>3L/).2',0$)-heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheTheVhdYkd\kd\md]meZmfVmhTmhRmkVjk[jkcvxw‘‘™¨ª¶¾ÈÊÓÛÞêòõ÷üÿüÿÿþÿÿÿÿÿÿþÿþýûÿþúÿÿúýþøúûóõøïóöëñ÷ëô÷îöøíöøêö÷åõ÷áîîÔÛÛ¿ÉÊ«°±’“–yuy^kpZt{iˆ§œ¬¶­ÎÎÌÞÞÜïïíøøöûûùþþüþþüýýûþþüþþüþþüþþüþþüþþüþþüþþü÷ÿÿùÿÿþÿÿÿüúÿúôÿöíÿÑÄÙž•L=§Q@¬K;ª>1¸G9ÑXMÐTJ¾?6ÆD6ÇH9ÄJ=¹I=ªB7?5•A7’E=‡A9„A9@:>8~>5<4<4€;4x<2x<2w;1w;1v:0u9/t:/t:/s9.r9.r9.r9.q8-n8,l6*k5)j81j81j81j81i70i70i70h6/g5.g5.g5.g6/h70i81k:3k:3l;4k:3i:0j;1k?2lB4iD2fE2fI7lVAjYEviV†l‘Ž{€mEF439/28.28.28.17-17-17-06,17-17-17-06,06,/5+/5+/5+/4./4./4./4./4./4./4./4./4./4..3--2,-2,.3-/4./4.*5-+6.-9//;12>24@46B47D38E3?L:ER>CQ:;I28F->L3ES:H`>Jb@LdBKc?Ia=G`9F_8G`9RkDXpL]uS^vVZqTPgK=T8,C)).2',0%*.heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheTheVjcYkd\kd\md]meZmfVniUljSlkVlm]pqi€‚ž¡¨º¼ÈÃÍÏÜäçóûþûÿÿúþÿüýÿýýýüûùÿþüÿÿûÿþùûüôõöîîñæëîãçíáíñãðôåñôãòôßðòÜêêÐÙØ¼ÈÇ«²±•¡¡‡‘“}‘’€œžª­¢¶»´ÀÅ¿ÜÜÚééçööôûûùýýûÿÿýÿÿýýýûþþüþþüþþüþþüþþüþþüþþüþþüüúÿÿþÿÿþÿöòïûôîÿýóÿûíÿõäêı·ƒn”Q>¡P=¸XH¸L?¸D7ÀG<Ç>4ÉD;ÈH?¿F>°?9¢;6š=8–A>?;‡@<@<}@;z?9y@9x?8v?8v=4v=4v=4u<3s=3r<2r<2q;1o;0o;0o;0l:/k9.j8-j8-i7,n72n72m61l71l71k60i70i70l:3j92h70g6/f7/f7/h91h91j?6f>4e=1f>2hC3iE5gF3cG2cJ6hV@k\GskV‡‚nŽzor_9>*28.28.17-17-17-06,06,06,17-17-17-06,06,/5+/5+/5+.3-.3-.3-.3-.3-.3-.3-.3-.3-.3--2,-2,-2,-2,.3-.3-)4,)4,*6,+7-.:01=14@25A36C2:G5<I58E12@)2@)8F/?M4DX<G\=K`ALa@K`?I_;H^:H^:SiEZoN`uV`tXZnSNbI9M4(;%',/%*-$),heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheTheVjcYkd\kd\md]meZmfVlgSkiRnmXop`svmƒ‡†£¨®¿ÃÎÍ×Ùçïòùÿÿûÿÿùýÿýþÿÿÿÿþýûÿÿûÿÿúþýø÷øðïñæçêßâæØÞäÖçëÚêïÛíðÛíïÙîîÖéçÎÚØ¿Îʱ½§¹´ ±®¶´§Á¾µÉÈÃÒÓÎÙÙ×èèæòòðúúøüüúýýûÿÿýÿÿýüüúþþüþþüþþüþþüþþüþþüþþüþþüÿûÿÿûÿÿúúûûùûÿùûÿøüÿôýÿíÿÿìõàËÈœcP–K8§L:¶O@»M>Æ=7ÈA;ÈD?ÀC?´<;©98 9:›==‘==Š>>„@?|A=xA<sB=rC=pC=s>6s>6s>6r=5p>5p>5p>5n>4n>4m=3l<2j;1j;1i:0i:0i:0p62p62p62o51m61m61k60i70l;4k:3h91e90e90e90e:1f;2dB6cA5cC4dD5fG5eH6cH3_I2^L6eV?jbKrmW„ƒn„‡r[`L3;&28.28.17-17-17-06,06,06,17-17-17-06,06,/5+/5+/5+.3-.3-.3-.3-.3-.3-.3-.3--2,-2,,1+,1+,1+,1+-2,-2,,6.+5-*4,*4++5,.8-0:/2=/2=-5@06A05A-1=)1=)5A+9E/=O5AS9FY=I\@J]?J]=K^>L_?TgG\oQcvZbtZYkSK]G6G4$5"&+.$),"'*heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheTheVjcYkd\lc\md]meZlfVlgSljSlnXorasvm…„Ÿ¤ª¸¿ÉÖßäîöùùÿÿûÿÿùýÿþÿÿÿÿÿþýûÿÿûÿÿúüüôóõêëíâãçÙßãÕÜãÓäéÒçìÕéíÖêìÔëëÓèæÏßÚÄÔθÔÍºÍÆ¶ËøÐÉÁÙÒÌàÛØëååòîïòòðùù÷ýýûýýûýýûÿÿýþþüüüúþþüþþüþþüþþüþþüþþüþþüþþüÿøüÿöùÿýýþÿý÷ÿýïÿøëÿõòÿøëúçÿÿíÿïÛ̧”£lX£ZG­VCªM;ÁA8ÃB<ÃD>¿D?·?>­;;£99œ:;–<<Ž>?…?=}@=wB<pC=mE=lF=q?8q?8q?8q?8p?8o>7o>7n?7o@8n?7m>6i=4h<3h<3h<3i=4r73q62q62p62o51m61l71j81h70g80e90e:1d<2f>4f@5gA6]C4aG8cL:dM;cM8`K6]K3]M4]Q9`Y?miPss[€„mt|eFO:2>(39/28.28.28.17-17-17-06,17-17-17-06,06,/5+/5+/5+-2,-2,-2,-2,-2,-2,-2,-2,-2,,1++0*+0*+0*+0*,1+-2,,6.,6.*4,*4+*4++5*-7,.9+-8*0;+4?/5@/4?.3>-3?+4@,7F/;J3@P6DT:GW<JZ?M]@O_BUeJ^nSdtZbqZXgRIXE4B1$2!&+.$),"'*heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheTjdVjcYkd\lc\md]meZlfVljUllTkmWjn]lrhy}•œ¢¯¶ÀÒÛàëòøùÿÿùþÿ÷ûþþÿÿÿÿÿúù÷ÿÿûþýøùùññóèéëÞãçØáåÖàç×äêÐçíÓèìÑçéÑèèÐçåÎáÚÇ×оÛÒÃÚÐÆÞÔËçÜØîäãóéêúñôÿøýùù÷þþüÿÿýýýûýýûÿÿýÿÿýüüúþþüþþüþþüþþüþþüþþüþþüþþüÿ÷÷ÿùùÿýýüÿÿôÿþêÿûíÿÿíÿýñÿúðûíÿþíÿûèôλ­va‘P:¦^H»I>ºH=ºH>ºG@·F@°C@¦=:97—<;‘=;ˆ>;€A<wB:sD<nF<lH<q?8q?8q?8q?8p?8p?8p?8p?8qB:pA9n?7j>5i=4j>5j>5k?6s63r73q62p62n72l71j81i81d8/d90c;1d>3d@4cA5cA5bB5VG4^O<gVBhWCbS<^O8[O5\R7]V<]Y>mmSsw^z‚jcmU2>(5C,4:039/39/39/28.28.28.17-17-17-17-06,06,/5+/5+/5+-2,-2,-2,-2,-2,-2,-2,-2,,1+,1++0**/)*/)+0*,1+,1++5-+5-*4,*4,+5,+5,,6+-7,,7)/:,2=/6A17B27B25@/4?.2?+5B.:G3>L5AO6ES:JX?M[BTbI]kTcqZ_lXUbPERA2>0#/#(..&,,$**heVheVheVheVheVheVheVheVheVheVheVheVheVheVheVheVjdTjdVjcYkd\lc\md]lfZlfVomXmmUimVgkZembr{xŽ—œ¨±ºÊÓØäëñöþÿ÷üÿøüÿþÿÿÿÿÿúù÷ÿÿúýýõøøîðòåéëÝåéÚåéØåìÚæíÎèïÐéîÐæéÎèæÏèãÏáÚÈÙÏÃÚÍÄßÒÌìÞÛúììÿôöÿõùÿõûÿøþýýûÿÿýÿÿýþþüþþüÿÿýÿÿýýýûþþüþþüþþüþþüþþüþþüþþüþþüÿüúÿýúÿûøùýüøÿÿôÿÿðÿÿêþüðÿûùÿûÿÿôÿöæÿôßÿãÍ×­”¢sY°SA®Q?®N>°O?±OB¯J@¥C:š<4—<7‘>8‰?6ƒ@7{B7tD6qE8nG8s>:s>:s>:q>:q>:q>:q>:p?:sB=rA<p?:m>8l=7l=7m>8n?9r73r73q73n72m82j81i81f:1f;2d>3d@4bB5`C5]A3\@2[?1QI4[S>f^Gg_H`Y?ZS9ZS7\W:ZV;WW;knSrx^u}eUaI%37E.4:04:04:039/39/39/28.28.17-17-17-06,06,/5+/5+/5+-2,-2,-2,-2,-2,-2,-2,-2,,1++0*+0**/)*/)+0*+0*,1+)3+)3+*4,+5-+5,,6--7.-7,,6+.8-2=/6A39D69D67B46A1/<*2?-5B09F2<J3@N7FT=JXAR`I[iRanZ\iWQ^MBN@/;/!-!+1/(.,&,*heVheVheVheVheVheVheVheVifWifWifWifWifWifWifWifWkeUkeWkdZle]md]ne^mg[mgWqoZkmUkoXkr`jrgozv†‘•Ÿ©²»ÄÉÑØÞèðóöûÿúþÿþÿÿÿÿÿþýùÿÿúþþöúúîöøêô÷æðôãìñÝçïÚð÷ÖíòÒëîÑììÒèæÏáÜÉÝÕÈÞÔÊáÔÎèÚ×òääúëîÿñöÿ÷ûÿùÿÿúÿþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿþùÿþùþþüýÿþûÿÿúÿÿøÿÿúÿÿüÿÿÿÿÿÿü÷ÿüñÿýìÿûåÿóÛÿíÑÁe¦cI—O7 T=ªYF¤Q?ŸI:¢L?;0Œ=0‡=0=/x=/t?/rC3sE5s<9s<9t=:s>:u@<u@<t?;q>:s@<r?;q@;q@;p?:o>9o>9o>9n72n72n93m;4l;4j;3g<3d<2c?3^>1dG9cG9T=-O8(M8'D/TR;PN7KI0MK2]Y>ieJeaDVU7XX<]`CosXz€fcmT=I1,:#1?(5;15;14:04:04:039/39/39/39/39/39/28.17-17-17-06,16016005/05//4./4./4./4.,1+,1+,1+,1+,1+,1++0*+0*.5.-4--4-,3,-4--4-.5-.5-+2*-4,08-5=29A6=E:?G<AI>7B25@03>-1<+2>*9E/BN8IU?O[EVbN]hWYdTLWI<F;/90)3*)/-(.,'-+heVheVheVheVheVheVheVheVifWifWifWifWifWifWifWifWkeUkeWkdZmd]md]mf^mg[khWonYjlTjoXkr`jtiq|x‰”˜¡®¶¾ÇÌÓÚàéðö÷üÿûÿÿþÿÿþþüþýùÿÿúþþôûûï÷ùëô÷æðõáìñÛæî×êðÎæëËäçÊææÌãáÌßÙÉÝÕÊßÔÎçÙØíßßöçêýîóÿôøÿ÷ûÿúÿÿûÿþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüúÿùûÿúýÿüþþþÿýÿÿüÿÿúÿÿúÿÿûÿÿûÿÿúùÿüõÿþñÿÿìÿüãúöÛÿéÌß²•§uZ‘[A–ZB›YCœUAšQ>F5F4‰D4…D2}B0yB.s@-o?+v?:t=8u>9v?:t?9q<6r=7sA:q?8q?8q?8o>7o>7n=6n=6n=6l;4m<5m>6k?6j?6h@6eA5cA5dG9[A2^G7\I8N=+F7$G8%A4!IM4GK2DG,BE*MM1[[?abC`aBYY=dgJsw\sy_X`H8D,/;%6D-7=36<26<26<25;15;15;15;15;15;15;14:04:039/39/39/27127127116016016005/05/.3-.3--2,-2,,1+,1++0*+0**1**1*)0))0))0)*1*+2+,3,.5--4,.5-07/4;39@8?F>BIA:G69F56C13@.2?+5B.;I2?M6KXDR_KXeSVcRKWI<H<0<2*6,+1-*0,)/+heVheVheVheVheVheVheVheVifWifWifWifWifWifWifWifWkeUkeWlcZmd]md]mf^mg[khWmlWimTjoXktaiuiq}yŠ˜›¤³ºÀÉÐÕÜâëòø÷üÿúþÿýþÿþþüþýùÿÿ÷ýýóúûí÷úéô÷äïôÞéîØãëÓâèÆÞáÂÛÞÁÞÞÆÞÛÈÞÖËßÖÏäÙ×îâäóçëúîòÿôøÿ÷ûÿøüÿúýÿüÿþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþü÷ÿúøÿüúÿþþþÿÿûÿÿúÿÿøÿÿ÷ÿÿøÿÿùÿÿúúÿýøÿÿôÿÿñüÿíöþçÿóÙÿùÞÿíÓâÀ¥«ƒj‡YA…Q;“[D—]GR=€F2w=)t=)t@+vC.xE2s>8p;5q<6vA;sA:p>7r@9xG@n=6n=6n=6m>6l=5l=5l=5l=5g?5h@6gA6gC7eC7cC6`C5^D5aL;UB1ZI7`S@RG3C;&E=(GA+>G,BH.@F*<@%?B%LO2_`AijKaaEnqTvz_gmSHP84<%4=(=F18>48>48>48>47=37=37=36<28>48>47=37=37=36<26<26<25:449349349338238238227105/05//4..3--2,,1++0*+0*(/((/((/((/((/()0)*1*+2+070.5.+2++2+.5.5<5<C<AHA?L;>K:<I78E34A-2?+3A*5C,DQ=KXDQ^LQ^MHTF<H<2>4-9/-3/-3/,2.gdUgdUheVheVheVheVifWifWifWifWifWifWifWifWifWifWleUldWlcZmd]md]mf^mg[khWmlWimThpXht`hthm|wˆ—𥴻ÀÉÐÔÛáéðööûÿúþÿýþÿÿÿýÿþúþþöýýñúûí÷úéô÷âîóÝçìÕàèÐÜà¿×Ú»ÖÖ¼Ù×ÂÝ×ÉßÖÍåÛÙìàâøìðüïöÿõûÿùþÿúýÿûûÿûûÿýúþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüöÿþ÷ÿþúÿþþþÿÿüÿÿùÿÿøÿÿ÷þÿøÿÿøüÿùùÿýúÿÿøþÿøúÿõöÿóÿþìÿýéÿòßÿñÛÿðÚñÒ½³zyS<tJ2uH1wI2{M6~O;zK7o@.e8%{LBsD:qB8sD:qB8g;0d8-h<1j>3i?3i?3i?3f>2f>2f>2f>2aA4`C5`C5_C5^D5[D4ZE4VE3XI6OB/\T?oiSc^HMK4IG0LJ3;E*?H->G*<B&<A#FI,VY:deFmmQxx\tw\[_F@D-6;%8@+<D/9?59?59?58>48>47=37=37=39?58>48>48>48>48>48>48>47<67<67<66;56;56;55:45:438238216005//4.-2,,1+,1++0,+0,*/+*/++0,,1--2.-2.051.3/+0,+0,-2.2738=9<A=?L;@M<@M;=J88E13@,1?(0>'<I5BO;HUCIVEDPB;G;2>4.:0.5..5.-4-gdUgdUgdUheVheVifWifWifWifWifWifWifWifWifWifWifWleUldWlcZmd]md]mf^mg[khWkmWjnUiqYgs_drejyt…”—¡²¹¾ÇÎÓÚâèïõôùýùýÿýþÿÿÿýÿÿúÿÿøÿÿóþÿñûþë÷úåðõÞèîÔàéÎÛܽÕÕ¹ÑÑ·ÔѾÚÔÈáØÓêàßôéíþóùÿöþÿûÿÿýÿÿþÿÿþúÿþúþÿùþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüøÿÿøÿÿûÿÿþþþÿýþÿûüÿûúÿúúÿùùÿù÷ÿù÷ÿüùÿÿûþÿûûÿüùÿûùôîÿÿöÿþôÿýóÿüîÿ÷çùçÓéӾϴŸ¶š„•u`yVBlI5mH6rM;uP>mF7iB3gB2jE5nI9oJ:pK;oK;eA1eA1cB1cB1cB1cB1cB1bC1\G6\G6\G6ZG6YH6WH5TG4RG3PH3MH2fdM~~fprZVX@IM4HL3;E*<F+?H+AG+AF(DG*MN/TU6xw[{z^nnTUU=AC-?A,>A.;>+9?59?59?58>48>47=37=37=38>48>48>48>48>48>48>48>49>89>89>88=78=78=77<67<66;55:449338227105//4./4.-2.-2.,1-+0,+0,,1--2.-2.,1-,1-,1-,1-.21043376598:H7=L9@O<@O:<K67F/4C,2A*6E.:I4@O<BP??M>8F91?2,9/.5.-4-,3,fcTfcTgdUheVheVifWjgXjgXifWifWifWifWifWifWifWifWleUldWlcZmd]md]mf^mg[khWkmWioUiqYgs_bpcgxr‚”– ³¹ÁÊÑÕÜäéðöõúþùýÿýÿþÿÿýÿÿúÿÿöÿÿôÿÿñÿÿïúýèò÷àéïÕàéÎÙÚ»ÑѵÍË´Î˺ÖÏÅßÕÓìâãøíóÿöþÿùÿÿüÿÿýÿÿÿýþÿúýÿ÷þÿøþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüýýÿýþÿýþÿýÿþþþüþÿùþÿ÷ÿÿõýýóýýõþýøþýùÿþüÿýÿÿýÿÿþÿþùÿÿüÿÿúþúöõýøôÿþöÿþñÿþïÿûéÿóàöåÓåÓ¿Ò»©¹ŸŸƒuŽrd|]I}^JrVAaE0W;&Y=(Z?*X=(`E0`E0_F0_F0`G1`G1^H1^H1[L9ZM:ZM:XM9XM9UM8RL6QL6NL5QQ9ikS|€glrXSY?DM2>G,:G+<F+?H+DJ.EJ,DG*HI*ML.yx\tsWfdKTR;LJ5KJ6FE3<=+:@69?59?59?58>48>48>48>47=37=38>48>48>48>49?59?5:?9:?9:?9:?99>89>89>88=78=78=77<66;55:4493382382/40.3/-2.,1-+0,+0,+0,+0,+/.,0/-10.21/32/32/32.210A.5F3;M7>P:=O7:L47I/6H.3E-6H0:L6<M::K95F6/?2*:--4,-4,,3+fcTfcTgdUheVheVifWjgXjgXifWifWifWifWifWifWifWifWleUldWlcZmd]md]mf^mg[jiWjlVhnThrYfs_aqdhys…—™¤·½ÈÑØÛâêîõûøýÿúþÿýÿþÿÿýÿþùÿÿõÿÿóÿÿðüÿêøüåïõÛäêÐÛäÇÖÕ¹Î̳ÇŰÊÄ´ÐÉÁÚÒÐêßãöìôÿ÷ÿÿúÿÿýÿÿþÿÿÿýûÿùüÿøûÿöþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿûÿÿüÿþýÿýÿþúÿúøÿ÷÷ÿó÷ÿò÷ÿòøÿóûÿøýÿúÿýþÿüÿÿûÿÿúÿýõÿÿúÿÿüÿÿýÿÿþÿýýûúûõ÷ùìÿÿóÿÿïÿÿïÿþíÿýíÿöçÿîâüêÞúäÍýçÐáË´¥xt^GdP8aM5\H0\J2\J2\J2]K3\L3]M4]M4]M4WO:WO:VP:VP:TO9QO8PN7NN6MO7PT;`fLfoTU^CEO4AK0:G+=J.?I.CL/HN2HM/FI,OP1YX:qmRjfKa]D[V@YT@TQ>MJ9EB1;A7;A7;A7;A7:@6:@6:@69?58>48>48>49?59?5:@6:@6:@6;@:;@:;@::?9:?99>89>89>8:?9:?99>89>88=78=77<67<6495273162/40-2.,1-+0,+/.,0/,0/-10.21.21.23-12,01):'/@-6H2;M5=O7<N4:L2:L25G-7I1:L6<M::K96G70@3+;..5--4,,3+fcTfcTgdUheVheVifWjgXjgXifWifWifWifWifWifWifWifWleUldWlcZmd]md]mf^kg[jiWikUhnThrYgt`brej{u‰›©¼ÂÎ×Þàçïòùÿúÿÿûÿÿýÿþþþüþýøúúðúúîúûë÷úåó÷àéïÕÞäÈÕÞÁÓÒ¶ÊȯÂÀ«Å¿±ËļÖÎÌæÝâôêòÿöÿÿùÿÿþÿÿÿÿýÿúûÿùûÿöûÿôþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüþþüÿùÿÿúÿÿüÿûÿþøÿúôÿõóÿòñÿðòÿñõÿóøÿöüÿûÿþÿÿüÿÿùÿÿøÿÿùÿÿúÿÿûÿÿýÿýýÿùýÿúÿûüÿúöüðùýîûüìýûìÿúìÿúîÿýñÿüñÿðÖÿûáíÜŸŽtaP6RB(XH.XH.[M2[M2\N3\N3[P4[P4\Q5\Q5TO9TO9TO9QO8PN7NN6KM5IM4JN5LR8S\AOY>?I.9F*?L0=J.AN2DN3HQ4LR6IN0JM0ZY;miLhdIc]C_YA_ZD`[GZUBQN=LI8=C9=C9=C9<B8<B8<B8;A7;A79?59?59?5:@6:@6;A7;A7;A7;@:;@:;@::?9:?99>89>89>8;@:;@:;@:;@::?9:?9:?9:?99>:8=95:6384162/40.3/.21.21.21-10-12,01,01-12-12$5"*<&3E/9K3<N6;M3;M3;M38J09K3;M7<M:<M;7H81B2,<//6..5--4,ZgM[hN\hP_iQakSckTfkWhkXfgUhgUheVheVjdVldWldYmeZjgVkhYkg[kg^kg^jf]hfZgeVfiVfkUenYbo^dqhsƒ‚–§®¶ÈÒÓÚàäéíò÷ú÷ýýùþúúÿøüÿôüþñöùèùúèø÷åòñÝïìÙìéÖáÞË×Ò¿Úͼ̿¯À²¥¿²©Â·³ÍÁÁÜÑ×êàèúòýüöÿþûÿÿþÿþýÿüýÿüýÿüýÿþþþþþþþþþþþþþþþþþþÿþüÿþüÿþüÿýúÿüùÿüùÿüùÿýùÿþúÿþúÿþýÿýüÿüûÿýþÿþÿÿþÿÿýþýûüÿþÿÿúúÿûøÿýøÿüöÿúòÿøïÿùñÿûÿÿýÿÿýþÿÿýÿÿûýÿüýÿþüýÿþÿÿÿþÿÿüÿÿýþÿý÷ÿþîÿÿæÿÿâööÜýûâãâÆ‰nTO2UN1RL,SJ+WN/UO/UN1TO1SO2QP4QP4PP6QM2PO3QO6PP6MO7KO6HM6EM5HQ6FO4AJ-?F'@G&EK)GM)FL(ST2RS3MN.JK,TT8bbHccIZZB[YB\ZC][B][B[Z>XW9UT6SR3KE/JD.FA-D?,A>/@>1??3>@5<=5;>59?59A67B48C57C57D3:B79A69A68@58@59A69A6:B7:B7:B79A6:B7;C8<D9=E:>F;7B:7C97A66A16?.4<-39-270.5./51-7/-9+-<%.B3J7O7Z 8Y$8W+:U2:R8;P==O?>O=:L6@R8EX:EZ;DY:>U93J0(>'.5-,3++2*ZgM[hN\hP_iQakSckTglXhkXghVihVifWifWkeWmeXmeZnf[khWkhYkg[kg^jf]jf]hfZgeVgjWglVfoZerajwnzЉ𫲷ÉÓÑØÞáéìò÷úøþþùþúúÿøûþóúüï÷úé÷øæõôâíìØéæÓåâÏÜ×ÄÑ̹˾­Á´¤º¬Ÿ¼¯§Á¶²ÌÀÀÛÐÖèÞæûóþý÷ÿþûÿÿþÿþýÿüýÿüýÿüýÿþþþþþþþþþþþþþþþþþþÿþüÿþüÿþüÿýúÿýúÿüùÿüùÿýùÿýùÿþúÿþýÿýüÿüûÿýþÿþÿÿþÿÿýþýûüÿþÿÿýýÿüùÿøóøíçòåÝöèßÿïçÿûÿÿýÿÿýþÿÿýÿÿûýÿüýÿþüýÿýþÿþýÿÿýÿÿýþÿý÷ÿþîÿÿæÿÿâ÷÷ßýûââàÇ‹‡lRM0TM0QK+SJ+WN/UO/UN1TO1SO2QP4QP4PP6QM2PO3PN5PP6MO7KO6HM6EM5HQ6EN3BK.AH)BI(GM+JP,KQ-NR/PT1VZ9^aBaaE[[?VV<UU=VV>VV>XV=YW>XW;XW9WV8VU7QK5OI3LG3ID1DA2B@3??3>@5<=5;>59?59A67B48C57C57D3:B79A69A68@58@59A69A6:B7:B7:B7:B7:B7;C8<D9=E:>F;<G?<H><F;;F6<E4:B39?38=67>76<83=51=/3B+9M*BY-Ia1Nq7Mn9Ji=Fa>AY?<Q>:L<:K9=O9DV<K^@LaBLaBF]A:Q7/E.-4,+2*)0(ZgM[hN\hP`jRakSdlUglXilYijXkjXkhYkhYlfXmgYnf[og\khWkhYkg[jf]jf]ie\hfZhfWgjWejTdmXgtco|sŽ›¬³³ÅÏÎÕÛÞåëñöúøþþúÿûùþ÷øûòõ÷êòõäðñßêé×áàÌÜÙÆ×ÔÁÐ˸ÆÁ®À³¢½° ½¯¤Ã¶®ËÀ¼ÖÊÌãØÞíãëüôÿý÷ÿþûÿÿþÿþýÿüýÿüýÿýÿþþþþþþþþþþþþþþþþþþþÿþüÿþüÿþüÿýúÿýúÿýúÿüùÿüøÿüøÿüøÿýüÿüûÿûúþüýÿþÿÿþÿÿýþþüýÿþÿÿýýÿýúüóîêßÙâÕÍëÝÔüëãÿûÿÿýÿÿýþÿÿýÿÿûýÿúýÿþüýÿýþÿþýÿÿþÿÿþÿÿý÷ÿýíÿþåÿþáøøàþüåá߯‰…jPK.RK.QJ-SJ+VM.UO/UN1UP2TP3QP4QP4OO3QM2ON2PN5OO5MO7KO6IN7FN6HQ6FO4CL/EL-FM,KQ/OU1SY5QY0W_8jpLy]qvVY^@LO4MO7QQ9QQ9QQ9SQ8TR9UT8WV:ZV;XR<VP:RM9NI6HE6DB5AA5?A6<=5;>5:@69A67B47B47C57D3:B7:B79A69A69A69A6:B7:B7:B7:B7:B7:B7;C8<D9>F;>F;>IA>J@?I>>I9?H7>F7>D8=B;>E>;A=6@85A39H1BV3Pg;ZrB]€F\}HVuIMhEBZ@9N;5G74E3<N8EW=NaCRgHShILcG@W=4J3180/6.-4,YgM[hN\hP^jRblTemVhmYjmZklZklZlj[liZnhZnhZog\ph]liXkhYjfZjf]ie\ie\hfZhfWehUbgQajUerao|s~Ž”¥¬¨ºÄÈÏ×Úáçìô÷öûþ÷ýûõúôóöíïñäèêÜãäÒÜÛÉÔѾÎË¸ËÆ³Ã¾«¼·¤Ä·¦ÇºªÎÀµÖÉÁßÔÐêÞàóèîúðùýõÿþøÿÿüÿþýÿýüÿüýÿüþýýÿþþþþþþþþþþþþþþþþþþþÿþüÿþüþýûÿýúÿýúÿýúÿýúÿüøÿû÷ÿû÷ÿýüÿüûþúùýûüÿýþÿþÿÿýþþüýÿüýÿýýÿýúýôïíâÜæÙÑðâÙÿðèÿûÿÿýÿÿýþÿÿýÿÿûýÿúýÿüüýÿýþÿþýÿÿþÿÿþýÿþõÿýíÿýäÿüßûûãÿþçâàÇŠ†mPJ0SL0SL/UL-VM.UO/VO2UP2TP3QP4PO3NN2PL1NM1OM4NN4LN6KO6JO8HP8JS8GP5GP3KR3MT3PV4V\8]c?fsGtU‡”i›s…lnuTZaBRV;LN6NN6MM5NL5OM6TP7WS:YU<ZT>XR<TO;QL9KH9GE8CC7@B7=>6<?6:@69A67B47B46B46C2;C8:B79A69A69A69A6:B7;C8;C8:B7:B7;C8;C8=E:>F;?G<<G?<H>>H=>I9?H7>F7>D8=B;=D=;A=6@85A39H1DX5Ri=]uEY|BXyDRqEIdA<T:2G4.@0->,6H2@R8L_AQfGShIMdH@W=4J329107/-4,YgMZhN\hP^jRblTemVgoZjo[lo\lm[mk\mj[nhZnhZoi]ph]liXkhYjfZie\ie\ie\ig[igXfiVchRajUerao|s{‹ŠŽŸ¦Ÿ±»ÂËÒÕÜäéðöòúüôúøñöðíðçéëÞáãÕÚÛËÒÑ¿ÌɶÉıþ«¾¹¦»´¢Ë¾®ÓŸÝÏÄæÙÑíâà÷ëíÿôúÿøÿÿ÷ÿÿúÿÿüÿþýÿýüÿûüþüþýþÿÿþþþþþþþþþþþþþþþþþþÿþüÿþüþýûÿüùÿýúÿýúÿýúÿû÷ÿúöþùõÿýüÿûúýùøüúûþüýÿýþÿþÿÿýþÿüýÿüüÿüùÿøó÷ìæòåÝøêáÿóëÿûÿÿýÿÿýþÿÿûÿÿûýÿúýÿüüýÿüýÿþýÿÿþÿÿþýÿþõÿüìÿüãÿúÝþýèÿÿëåãÌŒˆoRL2UN2TM0WN1VM.UO/WP3VQ3UQ4QP2ON2MM1PL1NM1NL3MM3LN6LP7KP9JR:LU:IR7JS6QX9SZ9U[9]c?gmI€”a’¦sŸ±š«’¡xˆ”pr|Z\bFLP7KM7LK6KI4NI5PK7TM:VP:WQ;VP:SN:QL9LI:IG:EE9CE:=>6<?6:@69A67B47B46B46C2;C8;C8:B79A69A6:B7;C8;C8;C8;C8;C8;C8<D9=E:>F;?G<<G?<H>=G<=H8>G6=E6=C7=B;:A:9?;5?75A39H1BV3Ne9Wo?Sv<St?NmAE`=8P6-B/*<,+<*1C-<N4H[=OdERgHLcG@W=3I2.5-+2*'.& \ No newline at end of file
diff --git a/3rdparty/libjpeg/transupp.c b/3rdparty/libjpeg/transupp.c
index 4060544828e..525932a3170 100644
--- a/3rdparty/libjpeg/transupp.c
+++ b/3rdparty/libjpeg/transupp.c
@@ -1,7 +1,7 @@
/*
* transupp.c
*
- * Copyright (C) 1997-2009, Thomas G. Lane, Guido Vollbeding.
+ * Copyright (C) 1997-2013, Thomas G. Lane, Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -114,6 +114,116 @@ do_crop (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
LOCAL(void)
+do_crop_ext (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
+ JDIMENSION x_crop_offset, JDIMENSION y_crop_offset,
+ jvirt_barray_ptr *src_coef_arrays,
+ jvirt_barray_ptr *dst_coef_arrays)
+/* Crop. This is only used when no rotate/flip is requested with the crop.
+ * Extension: If the destination size is larger than the source, we fill in
+ * the extra area with zero (neutral gray). Note we also have to zero partial
+ * iMCUs at the right and bottom edge of the source image area in this case.
+ */
+{
+ JDIMENSION MCU_cols, MCU_rows, comp_width, comp_height;
+ JDIMENSION dst_blk_y, x_crop_blocks, y_crop_blocks;
+ int ci, offset_y;
+ JBLOCKARRAY src_buffer, dst_buffer;
+ jpeg_component_info *compptr;
+
+ MCU_cols = srcinfo->output_width /
+ (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size);
+ MCU_rows = srcinfo->output_height /
+ (dstinfo->max_v_samp_factor * dstinfo->min_DCT_v_scaled_size);
+
+ for (ci = 0; ci < dstinfo->num_components; ci++) {
+ compptr = dstinfo->comp_info + ci;
+ comp_width = MCU_cols * compptr->h_samp_factor;
+ comp_height = MCU_rows * compptr->v_samp_factor;
+ x_crop_blocks = x_crop_offset * compptr->h_samp_factor;
+ y_crop_blocks = y_crop_offset * compptr->v_samp_factor;
+ for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks;
+ dst_blk_y += compptr->v_samp_factor) {
+ dst_buffer = (*srcinfo->mem->access_virt_barray)
+ ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y,
+ (JDIMENSION) compptr->v_samp_factor, TRUE);
+ if (dstinfo->jpeg_height > srcinfo->output_height) {
+ if (dst_blk_y < y_crop_blocks ||
+ dst_blk_y >= comp_height + y_crop_blocks) {
+ for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) {
+ FMEMZERO(dst_buffer[offset_y],
+ compptr->width_in_blocks * SIZEOF(JBLOCK));
+ }
+ continue;
+ }
+ src_buffer = (*srcinfo->mem->access_virt_barray)
+ ((j_common_ptr) srcinfo, src_coef_arrays[ci],
+ dst_blk_y - y_crop_blocks,
+ (JDIMENSION) compptr->v_samp_factor, FALSE);
+ } else {
+ src_buffer = (*srcinfo->mem->access_virt_barray)
+ ((j_common_ptr) srcinfo, src_coef_arrays[ci],
+ dst_blk_y + y_crop_blocks,
+ (JDIMENSION) compptr->v_samp_factor, FALSE);
+ }
+ for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) {
+ if (dstinfo->jpeg_width > srcinfo->output_width) {
+ if (x_crop_blocks > 0) {
+ FMEMZERO(dst_buffer[offset_y],
+ x_crop_blocks * SIZEOF(JBLOCK));
+ }
+ jcopy_block_row(src_buffer[offset_y],
+ dst_buffer[offset_y] + x_crop_blocks,
+ comp_width);
+ if (compptr->width_in_blocks > comp_width + x_crop_blocks) {
+ FMEMZERO(dst_buffer[offset_y] +
+ comp_width + x_crop_blocks,
+ (compptr->width_in_blocks -
+ comp_width - x_crop_blocks) * SIZEOF(JBLOCK));
+ }
+ } else {
+ jcopy_block_row(src_buffer[offset_y] + x_crop_blocks,
+ dst_buffer[offset_y],
+ compptr->width_in_blocks);
+ }
+ }
+ }
+ }
+}
+
+
+LOCAL(void)
+do_wipe (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
+ JDIMENSION x_crop_offset, JDIMENSION y_crop_offset,
+ jvirt_barray_ptr *src_coef_arrays,
+ JDIMENSION drop_width, JDIMENSION drop_height)
+/* Wipe - drop content of specified area, fill with zero (neutral gray) */
+{
+ JDIMENSION comp_width, comp_height;
+ JDIMENSION blk_y, x_wipe_blocks, y_wipe_blocks;
+ int ci, offset_y;
+ JBLOCKARRAY buffer;
+ jpeg_component_info *compptr;
+
+ for (ci = 0; ci < dstinfo->num_components; ci++) {
+ compptr = dstinfo->comp_info + ci;
+ comp_width = drop_width * compptr->h_samp_factor;
+ comp_height = drop_height * compptr->v_samp_factor;
+ x_wipe_blocks = x_crop_offset * compptr->h_samp_factor;
+ y_wipe_blocks = y_crop_offset * compptr->v_samp_factor;
+ for (blk_y = 0; blk_y < comp_height; blk_y += compptr->v_samp_factor) {
+ buffer = (*srcinfo->mem->access_virt_barray)
+ ((j_common_ptr) srcinfo, src_coef_arrays[ci], blk_y + y_wipe_blocks,
+ (JDIMENSION) compptr->v_samp_factor, TRUE);
+ for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) {
+ FMEMZERO(buffer[offset_y] + x_wipe_blocks,
+ comp_width * SIZEOF(JBLOCK));
+ }
+ }
+ }
+}
+
+
+LOCAL(void)
do_flip_h_no_crop (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
JDIMENSION x_crop_offset,
jvirt_barray_ptr *src_coef_arrays)
@@ -771,7 +881,7 @@ jt_read_integer (const char ** strptr, JDIMENSION * result)
* The routine returns TRUE if the spec string is valid, FALSE if not.
*
* The crop spec string should have the format
- * <width>x<height>{+-}<xoffset>{+-}<yoffset>
+ * <width>[f]x<height>[f]{+-}<xoffset>{+-}<yoffset>
* where width, height, xoffset, and yoffset are unsigned integers.
* Each of the elements can be omitted to indicate a default value.
* (A weakness of this style is that it is not possible to omit xoffset
@@ -793,14 +903,22 @@ jtransform_parse_crop_spec (jpeg_transform_info *info, const char *spec)
/* fetch width */
if (! jt_read_integer(&spec, &info->crop_width))
return FALSE;
- info->crop_width_set = JCROP_POS;
+ if (*spec == 'f' || *spec == 'F') {
+ spec++;
+ info->crop_width_set = JCROP_FORCE;
+ } else
+ info->crop_width_set = JCROP_POS;
}
- if (*spec == 'x' || *spec == 'X') {
+ if (*spec == 'x' || *spec == 'X') {
/* fetch height */
spec++;
if (! jt_read_integer(&spec, &info->crop_height))
return FALSE;
- info->crop_height_set = JCROP_POS;
+ if (*spec == 'f' || *spec == 'F') {
+ spec++;
+ info->crop_height_set = JCROP_FORCE;
+ } else
+ info->crop_height_set = JCROP_POS;
}
if (*spec == '+' || *spec == '-') {
/* fetch xoffset */
@@ -880,7 +998,8 @@ jtransform_request_workspace (j_decompress_ptr srcinfo,
/* Determine number of components in output image */
if (info->force_grayscale &&
- srcinfo->jpeg_color_space == JCS_YCbCr &&
+ (srcinfo->jpeg_color_space == JCS_YCbCr ||
+ srcinfo->jpeg_color_space == JCS_BG_YCC) &&
srcinfo->num_components == 3)
/* We'll only process the first component */
info->num_components = 1;
@@ -957,33 +1076,81 @@ jtransform_request_workspace (j_decompress_ptr srcinfo,
info->crop_xoffset = 0; /* default to +0 */
if (info->crop_yoffset_set == JCROP_UNSET)
info->crop_yoffset = 0; /* default to +0 */
- if (info->crop_xoffset >= info->output_width ||
- info->crop_yoffset >= info->output_height)
- ERREXIT(srcinfo, JERR_BAD_CROP_SPEC);
- if (info->crop_width_set == JCROP_UNSET)
+ if (info->crop_width_set == JCROP_UNSET) {
+ if (info->crop_xoffset >= info->output_width)
+ ERREXIT(srcinfo, JERR_BAD_CROP_SPEC);
info->crop_width = info->output_width - info->crop_xoffset;
- if (info->crop_height_set == JCROP_UNSET)
+ } else {
+ /* Check for crop extension */
+ if (info->crop_width > info->output_width) {
+ /* Crop extension does not work when transforming! */
+ if (info->transform != JXFORM_NONE ||
+ info->crop_xoffset >= info->crop_width ||
+ info->crop_xoffset > info->crop_width - info->output_width)
+ ERREXIT(srcinfo, JERR_BAD_CROP_SPEC);
+ } else {
+ if (info->crop_xoffset >= info->output_width ||
+ info->crop_width <= 0 ||
+ info->crop_xoffset > info->output_width - info->crop_width)
+ ERREXIT(srcinfo, JERR_BAD_CROP_SPEC);
+ }
+ }
+ if (info->crop_height_set == JCROP_UNSET) {
+ if (info->crop_yoffset >= info->output_height)
+ ERREXIT(srcinfo, JERR_BAD_CROP_SPEC);
info->crop_height = info->output_height - info->crop_yoffset;
- /* Ensure parameters are valid */
- if (info->crop_width <= 0 || info->crop_width > info->output_width ||
- info->crop_height <= 0 || info->crop_height > info->output_height ||
- info->crop_xoffset > info->output_width - info->crop_width ||
- info->crop_yoffset > info->output_height - info->crop_height)
- ERREXIT(srcinfo, JERR_BAD_CROP_SPEC);
+ } else {
+ /* Check for crop extension */
+ if (info->crop_height > info->output_height) {
+ /* Crop extension does not work when transforming! */
+ if (info->transform != JXFORM_NONE ||
+ info->crop_yoffset >= info->crop_height ||
+ info->crop_yoffset > info->crop_height - info->output_height)
+ ERREXIT(srcinfo, JERR_BAD_CROP_SPEC);
+ } else {
+ if (info->crop_yoffset >= info->output_height ||
+ info->crop_height <= 0 ||
+ info->crop_yoffset > info->output_height - info->crop_height)
+ ERREXIT(srcinfo, JERR_BAD_CROP_SPEC);
+ }
+ }
/* Convert negative crop offsets into regular offsets */
- if (info->crop_xoffset_set == JCROP_NEG)
- xoffset = info->output_width - info->crop_width - info->crop_xoffset;
- else
+ if (info->crop_xoffset_set != JCROP_NEG)
xoffset = info->crop_xoffset;
- if (info->crop_yoffset_set == JCROP_NEG)
- yoffset = info->output_height - info->crop_height - info->crop_yoffset;
+ else if (info->crop_width > info->output_width) /* crop extension */
+ xoffset = info->crop_width - info->output_width - info->crop_xoffset;
else
+ xoffset = info->output_width - info->crop_width - info->crop_xoffset;
+ if (info->crop_yoffset_set != JCROP_NEG)
yoffset = info->crop_yoffset;
+ else if (info->crop_height > info->output_height) /* crop extension */
+ yoffset = info->crop_height - info->output_height - info->crop_yoffset;
+ else
+ yoffset = info->output_height - info->crop_height - info->crop_yoffset;
/* Now adjust so that upper left corner falls at an iMCU boundary */
- info->output_width =
- info->crop_width + (xoffset % info->iMCU_sample_width);
- info->output_height =
- info->crop_height + (yoffset % info->iMCU_sample_height);
+ if (info->transform == JXFORM_WIPE) {
+ /* Ensure the effective wipe region will cover the requested */
+ info->drop_width = (JDIMENSION) jdiv_round_up
+ ((long) (info->crop_width + (xoffset % info->iMCU_sample_width)),
+ (long) info->iMCU_sample_width);
+ info->drop_height = (JDIMENSION) jdiv_round_up
+ ((long) (info->crop_height + (yoffset % info->iMCU_sample_height)),
+ (long) info->iMCU_sample_height);
+ } else {
+ /* Ensure the effective crop region will cover the requested */
+ if (info->crop_width_set == JCROP_FORCE ||
+ info->crop_width > info->output_width)
+ info->output_width = info->crop_width;
+ else
+ info->output_width =
+ info->crop_width + (xoffset % info->iMCU_sample_width);
+ if (info->crop_height_set == JCROP_FORCE ||
+ info->crop_height > info->output_height)
+ info->output_height = info->crop_height;
+ else
+ info->output_height =
+ info->crop_height + (yoffset % info->iMCU_sample_height);
+ }
/* Save x/y offsets measured in iMCUs */
info->x_crop_offset = xoffset / info->iMCU_sample_width;
info->y_crop_offset = yoffset / info->iMCU_sample_height;
@@ -999,7 +1166,9 @@ jtransform_request_workspace (j_decompress_ptr srcinfo,
transpose_it = FALSE;
switch (info->transform) {
case JXFORM_NONE:
- if (info->x_crop_offset != 0 || info->y_crop_offset != 0)
+ if (info->x_crop_offset != 0 || info->y_crop_offset != 0 ||
+ info->output_width > srcinfo->output_width ||
+ info->output_height > srcinfo->output_height)
need_workspace = TRUE;
/* No workspace needed if neither cropping nor transforming */
break;
@@ -1053,6 +1222,8 @@ jtransform_request_workspace (j_decompress_ptr srcinfo,
need_workspace = TRUE;
transpose_it = TRUE;
break;
+ case JXFORM_WIPE:
+ break;
}
/* Allocate workspace if needed.
@@ -1062,7 +1233,7 @@ jtransform_request_workspace (j_decompress_ptr srcinfo,
if (need_workspace) {
coef_arrays = (jvirt_barray_ptr *)
(*srcinfo->mem->alloc_small) ((j_common_ptr) srcinfo, JPOOL_IMAGE,
- SIZEOF(jvirt_barray_ptr) * info->num_components);
+ SIZEOF(jvirt_barray_ptr) * info->num_components);
width_in_iMCUs = (JDIMENSION)
jdiv_round_up((long) info->output_width,
(long) info->iMCU_sample_width);
@@ -1313,12 +1484,13 @@ jtransform_adjust_parameters (j_decompress_ptr srcinfo,
{
/* If force-to-grayscale is requested, adjust destination parameters */
if (info->force_grayscale) {
- /* First, ensure we have YCbCr or grayscale data, and that the source's
+ /* First, ensure we have YCC or grayscale data, and that the source's
* Y channel is full resolution. (No reasonable person would make Y
* be less than full resolution, so actually coping with that case
* isn't worth extra code space. But we check it to avoid crashing.)
*/
- if (((dstinfo->jpeg_color_space == JCS_YCbCr &&
+ if ((((dstinfo->jpeg_color_space == JCS_YCbCr ||
+ dstinfo->jpeg_color_space == JCS_BG_YCC) &&
dstinfo->num_components == 3) ||
(dstinfo->jpeg_color_space == JCS_GRAYSCALE &&
dstinfo->num_components == 1)) &&
@@ -1413,7 +1585,11 @@ jtransform_execute_transform (j_decompress_ptr srcinfo,
*/
switch (info->transform) {
case JXFORM_NONE:
- if (info->x_crop_offset != 0 || info->y_crop_offset != 0)
+ if (info->output_width > srcinfo->output_width ||
+ info->output_height > srcinfo->output_height)
+ do_crop_ext(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset,
+ src_coef_arrays, dst_coef_arrays);
+ else if (info->x_crop_offset != 0 || info->y_crop_offset != 0)
do_crop(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset,
src_coef_arrays, dst_coef_arrays);
break;
@@ -1449,6 +1625,10 @@ jtransform_execute_transform (j_decompress_ptr srcinfo,
do_rot_270(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset,
src_coef_arrays, dst_coef_arrays);
break;
+ case JXFORM_WIPE:
+ do_wipe(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset,
+ src_coef_arrays, info->drop_width, info->drop_height);
+ break;
}
}
diff --git a/3rdparty/libjpeg/transupp.h b/3rdparty/libjpeg/transupp.h
index 7c16c19c440..eee6931414c 100644
--- a/3rdparty/libjpeg/transupp.h
+++ b/3rdparty/libjpeg/transupp.h
@@ -1,7 +1,7 @@
/*
* transupp.h
*
- * Copyright (C) 1997-2009, Thomas G. Lane, Guido Vollbeding.
+ * Copyright (C) 1997-2013, Thomas G. Lane, Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -51,12 +51,16 @@
*
* We also offer a lossless-crop option, which discards data outside a given
* image region but losslessly preserves what is inside. Like the rotate and
- * flip transforms, lossless crop is restricted by the JPEG format: the upper
- * left corner of the selected region must fall on an iMCU boundary. If this
- * does not hold for the given crop parameters, we silently move the upper left
- * corner up and/or left to make it so, simultaneously increasing the region
- * dimensions to keep the lower right crop corner unchanged. (Thus, the
+ * flip transforms, lossless crop is restricted by the current JPEG format: the
+ * upper left corner of the selected region must fall on an iMCU boundary. If
+ * this does not hold for the given crop parameters, we silently move the upper
+ * left corner up and/or left to make it so, simultaneously increasing the
+ * region dimensions to keep the lower right crop corner unchanged. (Thus, the
* output image covers at least the requested region, but may cover more.)
+ * The adjustment of the region dimensions may be optionally disabled.
+ *
+ * A complementary lossless-wipe option is provided to discard (gray out) data
+ * inside a given image region while losslessly preserving what is outside.
*
* We also provide a lossless-resize option, which is kind of a lossless-crop
* operation in the DCT coefficient block domain - it discards higher-order
@@ -101,18 +105,21 @@ typedef enum {
JXFORM_TRANSVERSE, /* transpose across UR-to-LL axis */
JXFORM_ROT_90, /* 90-degree clockwise rotation */
JXFORM_ROT_180, /* 180-degree rotation */
- JXFORM_ROT_270 /* 270-degree clockwise (or 90 ccw) */
+ JXFORM_ROT_270, /* 270-degree clockwise (or 90 ccw) */
+ JXFORM_WIPE /* wipe */
} JXFORM_CODE;
/*
* Codes for crop parameters, which can individually be unspecified,
- * positive, or negative. (Negative width or height makes no sense, though.)
+ * positive or negative for xoffset or yoffset,
+ * positive or forced for width or height.
*/
typedef enum {
- JCROP_UNSET,
- JCROP_POS,
- JCROP_NEG
+ JCROP_UNSET,
+ JCROP_POS,
+ JCROP_NEG,
+ JCROP_FORCE
} JCROP_CODE;
/*
@@ -127,15 +134,15 @@ typedef struct {
boolean perfect; /* if TRUE, fail if partial MCUs are requested */
boolean trim; /* if TRUE, trim partial MCUs as needed */
boolean force_grayscale; /* if TRUE, convert color image to grayscale */
- boolean crop; /* if TRUE, crop source image */
+ boolean crop; /* if TRUE, crop or wipe source image */
/* Crop parameters: application need not set these unless crop is TRUE.
* These can be filled in by jtransform_parse_crop_spec().
*/
JDIMENSION crop_width; /* Width of selected region */
- JCROP_CODE crop_width_set;
+ JCROP_CODE crop_width_set; /* (forced disables adjustment) */
JDIMENSION crop_height; /* Height of selected region */
- JCROP_CODE crop_height_set;
+ JCROP_CODE crop_height_set; /* (forced disables adjustment) */
JDIMENSION crop_xoffset; /* X offset of selected region */
JCROP_CODE crop_xoffset_set; /* (negative measures from right edge) */
JDIMENSION crop_yoffset; /* Y offset of selected region */
@@ -148,6 +155,8 @@ typedef struct {
JDIMENSION output_height;
JDIMENSION x_crop_offset; /* destination crop offsets measured in iMCUs */
JDIMENSION y_crop_offset;
+ JDIMENSION drop_width; /* drop/wipe dimensions measured in iMCUs */
+ JDIMENSION drop_height;
int iMCU_sample_width; /* destination iMCU size */
int iMCU_sample_height;
} jpeg_transform_info;
diff --git a/3rdparty/libjpeg/usage.txt b/3rdparty/libjpeg/usage.txt
index eae58425f0f..6752a77f3db 100644
--- a/3rdparty/libjpeg/usage.txt
+++ b/3rdparty/libjpeg/usage.txt
@@ -14,7 +14,7 @@ INTRODUCTION
These programs implement JPEG image encoding, decoding, and transcoding.
JPEG (pronounced "jay-peg") is a standardized compression method for
-full-color and gray-scale images.
+full-color and grayscale images.
GENERAL USAGE
@@ -47,12 +47,13 @@ or
This syntax works on all systems, so it is useful for scripts.
The currently supported image file formats are: PPM (PBMPLUS color format),
-PGM (PBMPLUS gray-scale format), BMP, Targa, and RLE (Utah Raster Toolkit
-format). (RLE is supported only if the URT library is available.)
-cjpeg recognizes the input image format automatically, with the exception
-of some Targa-format files. You have to tell djpeg which format to generate.
+PGM (PBMPLUS grayscale format), BMP, Targa, and RLE (Utah Raster Toolkit
+format). (RLE is supported only if the URT library is available, which it
+isn't on most non-Unix systems.) cjpeg recognizes the input image format
+automatically, with the exception of some Targa-format files. You have to
+tell djpeg which format to generate.
-JPEG files are in the defacto standard JFIF file format. There are other,
+JPEG files are in the standard JFIF file format. There are other,
less widely used JPEG-based file formats, but we don't support them.
All switch names may be abbreviated; for example, -grayscale may be written
@@ -77,6 +78,13 @@ The basic command line switches for cjpeg are:
saying -grayscale, you'll get a smaller JPEG file that
takes less time to process.
+ -rgb Create RGB JPEG file.
+ Using this switch suppresses the conversion from RGB
+ colorspace input to the default YCbCr JPEG colorspace.
+ You can use this switch in combination with the
+ -block N switch (see below) for lossless JPEG coding.
+ See also the -rgb1 switch below.
+
-optimize Perform optimization of entropy encoding parameters.
Without this, default encoding parameters are used.
-optimize usually makes the JPEG file a little smaller,
@@ -151,6 +159,11 @@ file size is about the same --- often a little smaller.
Switches for advanced users:
+ -arithmetic Use arithmetic coding.
+ CAUTION: arithmetic coded JPEG is not yet widely
+ implemented, so many decoders will be unable to
+ view an arithmetic coded JPEG file at all.
+
-block N Set DCT block size. All N from 1 to 16 are possible.
Default is 8 (baseline format).
Larger values produce higher compression,
@@ -164,6 +177,37 @@ Switches for advanced users:
decoders will be unable to view a SmartScale extended
JPEG file at all.
+ -rgb1 Create RGB JPEG file with reversible color transform.
+ Works like the -rgb switch (see above) and inserts a
+ simple reversible color transform into the processing
+ which significantly improves the compression.
+ Use this switch in combination with the -block N
+ switch (see above) for lossless JPEG coding.
+ CAUTION: A decoder with inverse color transform
+ support is required for this feature. Reversible
+ color transform support is not yet widely implemented,
+ so many decoders will be unable to view a reversible
+ color transformed JPEG file at all.
+
+ -bgycc Create big gamut YCC JPEG file.
+ In this type of encoding the color difference
+ components are quantized further by a factor of 2
+ compared to the normal Cb/Cr values, thus creating
+ space to allow larger color values with higher
+ saturation than the normal gamut limits to be encoded.
+ In order to compensate for the loss of color fidelity
+ compared to a normal YCC encoded file, the color
+ quantization tables can be adjusted accordingly.
+ For example, cjpeg -bgycc -quality 80,90 will give
+ similar results as cjpeg -quality 80.
+ CAUTION: For correct decompression a decoder with big
+ gamut YCC support (JFIF version 2) is required.
+ An old decoder may or may not display a big gamut YCC
+ encoded JPEG file, depending on JFIF version check
+ and corresponding warning/error configuration.
+ In case of a granted decompression the old decoder
+ will display the image with half saturated colors.
+
-dct int Use integer DCT method (default).
-dct fast Use fast integer DCT (less accurate).
-dct float Use floating-point DCT method.
@@ -210,11 +254,6 @@ factor will visibly blur the image, however.
Switches for wizards:
- -arithmetic Use arithmetic coding. CAUTION: arithmetic coded JPEG
- is not yet widely implemented, so many decoders will
- be unable to view an arithmetic coded JPEG file at
- all.
-
-baseline Force baseline-compatible quantization tables to be
generated. This clamps quantization values to 8 bits
even at low quality settings. (This switch is poorly
@@ -254,10 +293,14 @@ The basic command line switches for djpeg are:
highest quality output.) Currently, this is equivalent
to "-dct fast -nosmooth -onepass -dither ordered".
- -grayscale Force gray-scale output even if JPEG file is color.
+ -grayscale Force grayscale output even if JPEG file is color.
Useful for viewing on monochrome displays; also,
djpeg runs noticeably faster in this mode.
+ -rgb Force RGB output even if JPEG file is grayscale.
+ This is provided to support applications that don't
+ want to cope with grayscale as a separate case.
+
-scale M/N Scale the output image by a factor M/N. Currently
supported scale factors are M/N with all M from 1 to
16, where N is the source DCT size, which is 8 for
@@ -271,7 +314,7 @@ The basic command line switches for djpeg are:
-bmp Select BMP output format (Windows flavor). 8-bit
colormapped format is emitted if -colors or -grayscale
- is specified, or if the JPEG file is gray-scale;
+ is specified, or if the JPEG file is grayscale;
otherwise, 24-bit full-color format is emitted.
-gif Select GIF output format. Since GIF does not support
@@ -281,18 +324,18 @@ The basic command line switches for djpeg are:
-os2 Select BMP output format (OS/2 1.x flavor). 8-bit
colormapped format is emitted if -colors or -grayscale
- is specified, or if the JPEG file is gray-scale;
+ is specified, or if the JPEG file is grayscale;
otherwise, 24-bit full-color format is emitted.
-pnm Select PBMPLUS (PPM/PGM) output format (this is the
default format). PGM is emitted if the JPEG file is
- gray-scale or if -grayscale is specified; otherwise
+ grayscale or if -grayscale is specified; otherwise
PPM is emitted.
-rle Select RLE output format. (Requires URT library.)
- -targa Select Targa output format. Gray-scale format is
- emitted if the JPEG file is gray-scale or if
+ -targa Select Targa output format. Grayscale format is
+ emitted if the JPEG file is grayscale or if
-grayscale is specified; otherwise, colormapped format
is emitted if -colors is specified; otherwise, 24-bit
full-color format is emitted.
@@ -334,7 +377,7 @@ Switches for advanced users:
The one-pass method is faster and needs less memory,
but it produces a lower-quality image. -onepass is
ignored unless you also say -colors N. Also,
- the one-pass method is always used for gray-scale
+ the one-pass method is always used for grayscale
output (the two-pass method is no improvement then).
-maxmemory N Set limit for amount of memory to use in processing
@@ -368,7 +411,8 @@ quality settings to make very small JPEG files; the percentage improvement
is often a lot more than it is on larger files. (At present, -optimize
mode is always selected when generating progressive JPEG files.)
-GIF input files are no longer supported, to avoid the Unisys LZW patent.
+GIF input files are no longer supported, to avoid the Unisys LZW patent
+(now expired).
(Conversion of GIF files to JPEG is usually a bad idea anyway.)
@@ -396,8 +440,9 @@ it may run out of memory even with -maxmemory 0. In that case you can still
decompress, with some loss of image quality, by specifying -onepass for
one-pass quantization.
-To avoid the Unisys LZW patent, djpeg produces uncompressed GIF files. These
-are larger than they should be, but are readable by standard GIF decoders.
+To avoid the Unisys LZW patent (now expired), djpeg produces uncompressed GIF
+files. These are larger than they should be, but are readable by standard GIF
+decoders.
HINTS FOR BOTH PROGRAMS
@@ -439,14 +484,16 @@ jpegtran performs various useful transformations of JPEG files.
It can translate the coded representation from one variant of JPEG to another,
for example from baseline JPEG to progressive JPEG or vice versa. It can also
perform some rearrangements of the image data, for example turning an image
-from landscape to portrait format by rotation.
+from landscape to portrait format by rotation. For EXIF files and JPEG files
+containing Exif data, you may prefer to use exiftran instead.
jpegtran works by rearranging the compressed data (DCT coefficients), without
ever fully decoding the image. Therefore, its transformations are lossless:
there is no image degradation at all, which would not be true if you used
djpeg followed by cjpeg to accomplish the same conversion. But by the same
token, jpegtran cannot perform lossy operations such as changing the image
-quality.
+quality. However, while the image data is losslessly transformed, metadata
+can be removed. See the -copy option for specifics.
jpegtran uses a command line syntax similar to cjpeg or djpeg.
On Unix-like systems, you say:
@@ -459,9 +506,9 @@ To specify the coded JPEG representation used in the output file,
jpegtran accepts a subset of the switches recognized by cjpeg:
-optimize Perform optimization of entropy encoding parameters.
-progressive Create progressive JPEG file.
+ -arithmetic Use arithmetic coding.
-restart N Emit a JPEG restart marker every N MCU rows, or every
N MCU blocks if "B" is attached to the number.
- -arithmetic Use arithmetic coding.
-scans file Use the scan script given in the specified text file.
See the previous discussion of cjpeg for more details about these switches.
If you specify none of these switches, you get a plain baseline-JPEG output
@@ -514,14 +561,21 @@ image region but losslessly preserves what is inside. Like the rotate and
flip transforms, lossless crop is restricted by the current JPEG format: the
upper left corner of the selected region must fall on an iMCU boundary. If
this does not hold for the given crop parameters, we silently move the upper
-left corner up and/or left to make it so, simultaneously increasing the region
-dimensions to keep the lower right crop corner unchanged. (Thus, the output
-image covers at least the requested region, but may cover more.)
+left corner up and/or left to make it so, simultaneously increasing the
+region dimensions to keep the lower right crop corner unchanged. (Thus, the
+output image covers at least the requested region, but may cover more.)
+The adjustment of the region dimensions may be optionally disabled by
+attaching an 'f' character ("force") to the width or height number.
The image can be losslessly cropped by giving the switch:
-crop WxH+X+Y Crop to a rectangular subarea of width W, height H
starting at point X,Y.
+A complementary lossless-wipe option is provided to discard (gray out) data
+inside a given image region while losslessly preserving what is outside:
+ -wipe WxH+X+Y Wipe (gray out) a rectangular subarea of
+ width W, height H starting at point X,Y.
+
Other not-strictly-lossless transformation switches are:
-grayscale Force grayscale output.
@@ -546,16 +600,18 @@ extended JPEG file at all.
jpegtran also recognizes these switches that control what to do with "extra"
markers, such as comment blocks:
- -copy none Copy no extra markers from source file. This setting
- suppresses all comments and other excess baggage
- present in the source file.
- -copy comments Copy only comment markers. This setting copies
- comments from the source file, but discards
- any other inessential (for image display) data.
+ -copy none Copy no extra markers from source file.
+ This setting suppresses all comments
+ and other metadata in the source file.
+ -copy comments Copy only comment markers.
+ This setting copies comments from the source file,
+ but discards any other metadata.
-copy all Copy all extra markers. This setting preserves
- miscellaneous markers found in the source file, such
- as JFIF thumbnails, Exif data, and Photoshop settings.
+ metadata found in the source file, such as JFIF
+ thumbnails, Exif data, and Photoshop settings.
In some files these extra markers can be sizable.
+ Note that this option will copy thumbnails as-is;
+ they will not be transformed.
The default behavior is -copy comments. (Note: in IJG releases v6 and v6a,
jpegtran always did the equivalent of -copy none.)
diff --git a/3rdparty/libjpeg/wrgif.c b/3rdparty/libjpeg/wrgif.c
index 5fe83283919..e4f1e8720ed 100644
--- a/3rdparty/libjpeg/wrgif.c
+++ b/3rdparty/libjpeg/wrgif.c
@@ -2,6 +2,7 @@
* wrgif.c
*
* Copyright (C) 1991-1997, Thomas G. Lane.
+ * Modified 2015 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -218,7 +219,7 @@ put_3bytes (gif_dest_ptr dinfo, int val)
LOCAL(void)
emit_header (gif_dest_ptr dinfo, int num_colors, JSAMPARRAY colormap)
/* Output the GIF file header, including color map */
-/* If colormap==NULL, synthesize a gray-scale colormap */
+/* If colormap==NULL, synthesize a grayscale colormap */
{
int BitsPerPixel, ColorMapSize, InitCodeSize, FlagByte;
int cshift = dinfo->cinfo->data_precision - 8;
@@ -270,7 +271,7 @@ emit_header (gif_dest_ptr dinfo, int num_colors, JSAMPARRAY colormap)
put_3bytes(dinfo, GETJSAMPLE(colormap[0][i]) >> cshift);
}
} else {
- /* Create a gray-scale map of num_colors values, range 0..255 */
+ /* Create a grayscale map of num_colors values, range 0..255 */
put_3bytes(dinfo, (i * 255 + (num_colors-1)/2) / (num_colors-1));
}
} else {
@@ -393,7 +394,7 @@ jinit_write_gif (j_decompress_ptr cinfo)
((j_common_ptr) cinfo, JPOOL_IMAGE, cinfo->output_width, (JDIMENSION) 1);
dest->pub.buffer_height = 1;
- return (djpeg_dest_ptr) dest;
+ return &dest->pub;
}
#endif /* GIF_SUPPORTED */
diff --git a/3rdparty/libjpeg/wrjpgcom.c b/3rdparty/libjpeg/wrjpgcom.c
index 8c04b055120..d1bfcc9d58e 100644
--- a/3rdparty/libjpeg/wrjpgcom.c
+++ b/3rdparty/libjpeg/wrjpgcom.c
@@ -2,6 +2,7 @@
* wrjpgcom.c
*
* Copyright (C) 1994-1997, Thomas G. Lane.
+ * Modified 2015 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -453,6 +454,11 @@ main (int argc, char **argv)
comment_arg = (char *) malloc((size_t) MAX_COM_LENGTH);
if (comment_arg == NULL)
ERREXIT("Insufficient memory");
+ if (strlen(argv[argn]+1) >= (size_t) MAX_COM_LENGTH) {
+ fprintf(stderr, "Comment text may not exceed %u bytes\n",
+ (unsigned int) MAX_COM_LENGTH);
+ exit(EXIT_FAILURE);
+ }
strcpy(comment_arg, argv[argn]+1);
for (;;) {
comment_length = (unsigned int) strlen(comment_arg);
@@ -462,9 +468,19 @@ main (int argc, char **argv)
}
if (++argn >= argc)
ERREXIT("Missing ending quote mark");
+ if (strlen(comment_arg) + 1 + strlen(argv[argn]) >=
+ (size_t) MAX_COM_LENGTH) {
+ fprintf(stderr, "Comment text may not exceed %u bytes\n",
+ (unsigned int) MAX_COM_LENGTH);
+ exit(EXIT_FAILURE);
+ }
strcat(comment_arg, " ");
strcat(comment_arg, argv[argn]);
}
+ } else if (strlen(comment_arg) >= (size_t) MAX_COM_LENGTH) {
+ fprintf(stderr, "Comment text may not exceed %u bytes\n",
+ (unsigned int) MAX_COM_LENGTH);
+ exit(EXIT_FAILURE);
}
comment_length = (unsigned int) strlen(comment_arg);
} else
diff --git a/3rdparty/libjpeg/wrtarga.c b/3rdparty/libjpeg/wrtarga.c
index cf104d2debd..7b43169e697 100644
--- a/3rdparty/libjpeg/wrtarga.c
+++ b/3rdparty/libjpeg/wrtarga.c
@@ -2,6 +2,7 @@
* wrtarga.c
*
* Copyright (C) 1991-1996, Thomas G. Lane.
+ * Modified 2015 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*
@@ -73,7 +74,7 @@ write_header (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, int num_colors)
targaheader[17] = 0x20; /* Top-down, non-interlaced */
if (cinfo->out_color_space == JCS_GRAYSCALE) {
- targaheader[2] = 3; /* image type = uncompressed gray-scale */
+ targaheader[2] = 3; /* image type = uncompressed grayscale */
targaheader[16] = 8; /* bits per pixel */
} else { /* must be RGB */
if (num_colors > 0) {
@@ -247,7 +248,7 @@ jinit_write_targa (j_decompress_ptr cinfo)
((j_common_ptr) cinfo, JPOOL_IMAGE, dest->buffer_width, (JDIMENSION) 1);
dest->pub.buffer_height = 1;
- return (djpeg_dest_ptr) dest;
+ return &dest->pub;
}
#endif /* TARGA_SUPPORTED */
diff --git a/3rdparty/portaudio/src/hostapi/dsound/pa_win_ds.c b/3rdparty/portaudio/src/hostapi/dsound/pa_win_ds.c
index 35fac5f7f03..e8f21af1b14 100644
--- a/3rdparty/portaudio/src/hostapi/dsound/pa_win_ds.c
+++ b/3rdparty/portaudio/src/hostapi/dsound/pa_win_ds.c
@@ -47,11 +47,12 @@
*/
//#define PA_WIN_DS_USE_WMME_TIMER
+#define _WIN32_WINNT 0x0400 /* required to get waitable timer APIs */
+
#include <assert.h>
#include <stdio.h>
#include <string.h> /* strlen() */
-#define _WIN32_WINNT 0x0400 /* required to get waitable timer APIs */
#include <initguid.h> /* make sure ds guids get defined */
#include <windows.h>
#include <objbase.h>
@@ -279,7 +280,7 @@ typedef struct PaWinDsStream
UINT inputBufferSizeBytes;
- int hostBufferSizeFrames; /* input and output host ringbuffers have the same number of frames */
+ unsigned long hostBufferSizeFrames; /* input and output host ringbuffers have the same number of frames */
double framesWritten;
double secondsPerHostByte; /* Used to optimize latency calculation for outTime */
double pollingPeriodSeconds;
diff --git a/3rdparty/portaudio/src/hostapi/wasapi/mingw-include/audioclient.h b/3rdparty/portaudio/src/hostapi/wasapi/mingw-include/audioclient.h
index bf77baf029f..9c36d1e65fb 100644
--- a/3rdparty/portaudio/src/hostapi/wasapi/mingw-include/audioclient.h
+++ b/3rdparty/portaudio/src/hostapi/wasapi/mingw-include/audioclient.h
@@ -93,7 +93,7 @@ typedef interface IChannelAudioVolume IChannelAudioVolume;
/* header files for imported files */
#include "wtypes.h"
#include "unknwn.h"
-#include "AudioSessionTypes.h"
+#include "audiosessiontypes.h"
#ifdef __cplusplus
extern "C"{
@@ -1130,7 +1130,6 @@ EXTERN_C const IID IID_IChannelAudioVolume;
/* interface __MIDL_itf_audioclient_0000_0007 */
/* [local] */
-#define FACILITY_AUDCLNT 0x889
#define AUDCLNT_ERR(n) MAKE_HRESULT(SEVERITY_ERROR, FACILITY_AUDCLNT, n)
#define AUDCLNT_SUCCESS(n) MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_AUDCLNT, n)
#define AUDCLNT_E_NOT_INITIALIZED AUDCLNT_ERR(0x001)
diff --git a/3rdparty/portaudio/src/hostapi/wdmks/pa_win_wdmks.c b/3rdparty/portaudio/src/hostapi/wdmks/pa_win_wdmks.c
index 70a48d8ffae..915ca2a0224 100644
--- a/3rdparty/portaudio/src/hostapi/wdmks/pa_win_wdmks.c
+++ b/3rdparty/portaudio/src/hostapi/wdmks/pa_win_wdmks.c
@@ -50,8 +50,6 @@ format conversion. That means that it will lock out all other users
of a device for the duration of active stream using those devices
*/
-#include <stdio.h>
-
#if (defined(_WIN32) && (defined(_MSC_VER) && (_MSC_VER >= 1200))) /* MSC version 6 and above */
#pragma comment( lib, "setupapi.lib" )
#endif
@@ -62,11 +60,13 @@ of a device for the duration of active stream using those devices
#define PA_LOGL_
#ifdef __GNUC__
-#include <initguid.h>
#define _WIN32_WINNT 0x0501
#define WINVER 0x0501
+#include <initguid.h>
#endif
+#include <stdio.h>
+
#include <string.h> /* strlen() */
#include <assert.h>
#include <wchar.h> /* iswspace() */
diff --git a/3rdparty/portaudio/src/hostapi/wmme/pa_win_wmme.c b/3rdparty/portaudio/src/hostapi/wmme/pa_win_wmme.c
index 422c86714a7..7c4a369d99d 100644
--- a/3rdparty/portaudio/src/hostapi/wmme/pa_win_wmme.c
+++ b/3rdparty/portaudio/src/hostapi/wmme/pa_win_wmme.c
@@ -463,7 +463,7 @@ PaWinMmeDeviceInfo;
#define PA_ENV_BUF_SIZE_ (32)
#define PA_REC_IN_DEV_ENV_NAME_ ("PA_RECOMMENDED_INPUT_DEVICE")
#define PA_REC_OUT_DEV_ENV_NAME_ ("PA_RECOMMENDED_OUTPUT_DEVICE")
-static PaDeviceIndex GetEnvDefaultDeviceID( char *envName )
+static PaDeviceIndex GetEnvDefaultDeviceID( const char *envName )
{
PaDeviceIndex recommendedIndex = paNoDevice;
DWORD hresult;
diff --git a/3rdparty/zlib/CMakeLists.txt b/3rdparty/zlib/CMakeLists.txt
index 14411a4370e..0fe939df689 100644
--- a/3rdparty/zlib/CMakeLists.txt
+++ b/3rdparty/zlib/CMakeLists.txt
@@ -3,7 +3,7 @@ set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)
project(zlib C)
-set(VERSION "1.2.9")
+set(VERSION "1.2.11")
option(ASM686 "Enable building i686 assembly implementation")
option(AMD64 "Enable building amd64 assembly implementation")
diff --git a/3rdparty/zlib/ChangeLog b/3rdparty/zlib/ChangeLog
index 63d04953dba..30199a65a03 100644
--- a/3rdparty/zlib/ChangeLog
+++ b/3rdparty/zlib/ChangeLog
@@ -1,6 +1,17 @@
ChangeLog file for zlib
+Changes in 1.2.11 (15 Jan 2017)
+- Fix deflate stored bug when pulling last block from window
+- Permit immediate deflateParams changes before any deflate input
+
+Changes in 1.2.10 (2 Jan 2017)
+- Avoid warnings on snprintf() return value
+- Fix bug in deflate_stored() for zero-length input
+- Fix bug in gzwrite.c that produced corrupt gzip files
+- Remove files to be installed before copying them in Makefile.in
+- Add warnings when compiling with assembler code
+
Changes in 1.2.9 (31 Dec 2016)
- Fix contrib/minizip to permit unzipping with desktop API [Zouzou]
- Improve contrib/blast to return unused bytes
diff --git a/3rdparty/zlib/Makefile.in b/3rdparty/zlib/Makefile.in
index c8b487c287b..5a77949ff06 100644
--- a/3rdparty/zlib/Makefile.in
+++ b/3rdparty/zlib/Makefile.in
@@ -1,5 +1,5 @@
# Makefile for zlib
-# Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler
+# Copyright (C) 1995-2017 Jean-loup Gailly, Mark Adler
# For conditions of distribution and use, see copyright notice in zlib.h
# To compile and test, type:
@@ -32,7 +32,7 @@ CPP=$(CC) -E
STATICLIB=libz.a
SHAREDLIB=libz.so
-SHAREDLIBV=libz.so.1.2.9
+SHAREDLIBV=libz.so.1.2.11
SHAREDLIBM=libz.so.1
LIBS=$(STATICLIB) $(SHAREDLIBV)
@@ -309,10 +309,12 @@ install-libs: $(LIBS)
-@if [ ! -d $(DESTDIR)$(sharedlibdir) ]; then mkdir -p $(DESTDIR)$(sharedlibdir); fi
-@if [ ! -d $(DESTDIR)$(man3dir) ]; then mkdir -p $(DESTDIR)$(man3dir); fi
-@if [ ! -d $(DESTDIR)$(pkgconfigdir) ]; then mkdir -p $(DESTDIR)$(pkgconfigdir); fi
+ rm -f $(DESTDIR)$(libdir)/$(STATICLIB)
cp $(STATICLIB) $(DESTDIR)$(libdir)
chmod 644 $(DESTDIR)$(libdir)/$(STATICLIB)
-@($(RANLIB) $(DESTDIR)$(libdir)/libz.a || true) >/dev/null 2>&1
-@if test -n "$(SHAREDLIBV)"; then \
+ rm -f $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBV); \
cp $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir); \
echo "cp $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)"; \
chmod 755 $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBV); \
@@ -322,8 +324,10 @@ install-libs: $(LIBS)
ln -s $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBM); \
($(LDCONFIG) || true) >/dev/null 2>&1; \
fi
+ rm -f $(DESTDIR)$(man3dir)/zlib.3
cp $(SRCDIR)zlib.3 $(DESTDIR)$(man3dir)
chmod 644 $(DESTDIR)$(man3dir)/zlib.3
+ rm -f $(DESTDIR)$(pkgconfigdir)/zlib.pc
cp zlib.pc $(DESTDIR)$(pkgconfigdir)
chmod 644 $(DESTDIR)$(pkgconfigdir)/zlib.pc
# The ranlib in install is needed on NeXTSTEP which checks file times
@@ -331,6 +335,7 @@ install-libs: $(LIBS)
install: install-libs
-@if [ ! -d $(DESTDIR)$(includedir) ]; then mkdir -p $(DESTDIR)$(includedir); fi
+ rm -f $(DESTDIR)$(includedir)/zlib.h $(DESTDIR)$(includedir)/zconf.h
cp $(SRCDIR)zlib.h zconf.h $(DESTDIR)$(includedir)
chmod 644 $(DESTDIR)$(includedir)/zlib.h $(DESTDIR)$(includedir)/zconf.h
diff --git a/3rdparty/zlib/README b/3rdparty/zlib/README
index 8002f398861..51106de4753 100644
--- a/3rdparty/zlib/README
+++ b/3rdparty/zlib/README
@@ -1,6 +1,6 @@
ZLIB DATA COMPRESSION LIBRARY
-zlib 1.2.9 is a general purpose data compression library. All the code is
+zlib 1.2.11 is a general purpose data compression library. All the code is
thread safe. The data format used by the zlib library is described by RFCs
(Request for Comments) 1950 to 1952 in the files
http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and
@@ -31,7 +31,7 @@ Mark Nelson <markn@ieee.org> wrote an article about zlib for the Jan. 1997
issue of Dr. Dobb's Journal; a copy of the article is available at
http://marknelson.us/1997/01/01/zlib-engine/ .
-The changes made in version 1.2.9 are documented in the file ChangeLog.
+The changes made in version 1.2.11 are documented in the file ChangeLog.
Unsupported third party contributions are provided in directory contrib/ .
@@ -84,7 +84,7 @@ Acknowledgments:
Copyright notice:
- (C) 1995-2016 Jean-loup Gailly and Mark Adler
+ (C) 1995-2017 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
diff --git a/3rdparty/zlib/contrib/delphi/ZLib.pas b/3rdparty/zlib/contrib/delphi/ZLib.pas
index 7a3cb664967..060e1991186 100644
--- a/3rdparty/zlib/contrib/delphi/ZLib.pas
+++ b/3rdparty/zlib/contrib/delphi/ZLib.pas
@@ -152,7 +152,7 @@ procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer;
const OutBuf: Pointer; BufSize: Integer);
const
- zlib_version = '1.2.9';
+ zlib_version = '1.2.11';
type
EZlibError = class(Exception);
diff --git a/3rdparty/zlib/contrib/dotzlib/DotZLib/UnitTests.cs b/3rdparty/zlib/contrib/dotzlib/DotZLib/UnitTests.cs
index ddeb19e09f9..6d8aebb7994 100644
--- a/3rdparty/zlib/contrib/dotzlib/DotZLib/UnitTests.cs
+++ b/3rdparty/zlib/contrib/dotzlib/DotZLib/UnitTests.cs
@@ -156,7 +156,7 @@ namespace DotZLibTests
public void Info_Version()
{
Info info = new Info();
- Assert.AreEqual("1.2.9", Info.Version);
+ Assert.AreEqual("1.2.11", Info.Version);
Assert.AreEqual(32, info.SizeOfUInt);
Assert.AreEqual(32, info.SizeOfULong);
Assert.AreEqual(32, info.SizeOfPointer);
diff --git a/3rdparty/zlib/contrib/infback9/inftree9.c b/3rdparty/zlib/contrib/infback9/inftree9.c
index 2103aee4652..5f4a76798d8 100644
--- a/3rdparty/zlib/contrib/infback9/inftree9.c
+++ b/3rdparty/zlib/contrib/infback9/inftree9.c
@@ -1,5 +1,5 @@
/* inftree9.c -- generate Huffman trees for efficient decoding
- * Copyright (C) 1995-2016 Mark Adler
+ * Copyright (C) 1995-2017 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -9,7 +9,7 @@
#define MAXBITS 15
const char inflate9_copyright[] =
- " inflate9 1.2.9 Copyright 1995-2016 Mark Adler ";
+ " inflate9 1.2.11 Copyright 1995-2017 Mark Adler ";
/*
If you use the zlib library in a product, an acknowledgment is welcome
in the documentation of your product. If for some reason you cannot
@@ -64,7 +64,7 @@ unsigned short FAR *work;
static const unsigned short lext[31] = { /* Length codes 257..285 extra */
128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
130, 130, 130, 130, 131, 131, 131, 131, 132, 132, 132, 132,
- 133, 133, 133, 133, 144, 192, 79};
+ 133, 133, 133, 133, 144, 77, 202};
static const unsigned short dbase[32] = { /* Distance codes 0..31 base */
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49,
65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073,
diff --git a/3rdparty/zlib/contrib/minizip/configure.ac b/3rdparty/zlib/contrib/minizip/configure.ac
index 54d823f6715..5b11970977f 100644
--- a/3rdparty/zlib/contrib/minizip/configure.ac
+++ b/3rdparty/zlib/contrib/minizip/configure.ac
@@ -1,7 +1,7 @@
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
-AC_INIT([minizip], [1.2.9], [bugzilla.redhat.com])
+AC_INIT([minizip], [1.2.11], [bugzilla.redhat.com])
AC_CONFIG_SRCDIR([minizip.c])
AM_INIT_AUTOMAKE([foreign])
LT_INIT
diff --git a/3rdparty/zlib/contrib/pascal/zlibpas.pas b/3rdparty/zlib/contrib/pascal/zlibpas.pas
index aebaea0c10a..a0dff11b505 100644
--- a/3rdparty/zlib/contrib/pascal/zlibpas.pas
+++ b/3rdparty/zlib/contrib/pascal/zlibpas.pas
@@ -10,8 +10,8 @@ unit zlibpas;
interface
const
- ZLIB_VERSION = '1.2.9';
- ZLIB_VERNUM = $1290;
+ ZLIB_VERSION = '1.2.11';
+ ZLIB_VERNUM = $12a0;
type
alloc_func = function(opaque: Pointer; items, size: Integer): Pointer;
diff --git a/3rdparty/zlib/contrib/vstudio/readme.txt b/3rdparty/zlib/contrib/vstudio/readme.txt
index a3adaf19a45..48cccc0d2a2 100644
--- a/3rdparty/zlib/contrib/vstudio/readme.txt
+++ b/3rdparty/zlib/contrib/vstudio/readme.txt
@@ -1,4 +1,4 @@
-Building instructions for the DLL versions of Zlib 1.2.9
+Building instructions for the DLL versions of Zlib 1.2.11
========================================================
This directory contains projects that build zlib and minizip using
@@ -75,4 +75,4 @@ Gilles Vollant
info@winimage.com
Visual Studio 2013 and 2015 Projects from Sean Hunt
-seandhunt_7@yahoo.com \ No newline at end of file
+seandhunt_7@yahoo.com
diff --git a/3rdparty/zlib/contrib/vstudio/vc10/zlib.rc b/3rdparty/zlib/contrib/vstudio/vc10/zlib.rc
index 24727c83dd3..c4e4b016e9c 100644
--- a/3rdparty/zlib/contrib/vstudio/vc10/zlib.rc
+++ b/3rdparty/zlib/contrib/vstudio/vc10/zlib.rc
@@ -2,8 +2,8 @@
#define IDR_VERSION1 1
IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
- FILEVERSION 1, 2, 9, 0
- PRODUCTVERSION 1, 2, 9, 0
+ FILEVERSION 1, 2, 11, 0
+ PRODUCTVERSION 1, 2, 11, 0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS 0
FILEOS VOS_DOS_WINDOWS32
@@ -17,12 +17,12 @@ BEGIN
BEGIN
VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0"
- VALUE "FileVersion", "1.2.9\0"
+ VALUE "FileVersion", "1.2.11\0"
VALUE "InternalName", "zlib\0"
VALUE "OriginalFilename", "zlibwapi.dll\0"
VALUE "ProductName", "ZLib.DLL\0"
VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
- VALUE "LegalCopyright", "(C) 1995-2016 Jean-loup Gailly & Mark Adler\0"
+ VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0"
END
END
BLOCK "VarFileInfo"
diff --git a/3rdparty/zlib/contrib/vstudio/vc11/zlib.rc b/3rdparty/zlib/contrib/vstudio/vc11/zlib.rc
index 24727c83dd3..c4e4b016e9c 100644
--- a/3rdparty/zlib/contrib/vstudio/vc11/zlib.rc
+++ b/3rdparty/zlib/contrib/vstudio/vc11/zlib.rc
@@ -2,8 +2,8 @@
#define IDR_VERSION1 1
IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
- FILEVERSION 1, 2, 9, 0
- PRODUCTVERSION 1, 2, 9, 0
+ FILEVERSION 1, 2, 11, 0
+ PRODUCTVERSION 1, 2, 11, 0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS 0
FILEOS VOS_DOS_WINDOWS32
@@ -17,12 +17,12 @@ BEGIN
BEGIN
VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0"
- VALUE "FileVersion", "1.2.9\0"
+ VALUE "FileVersion", "1.2.11\0"
VALUE "InternalName", "zlib\0"
VALUE "OriginalFilename", "zlibwapi.dll\0"
VALUE "ProductName", "ZLib.DLL\0"
VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
- VALUE "LegalCopyright", "(C) 1995-2016 Jean-loup Gailly & Mark Adler\0"
+ VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0"
END
END
BLOCK "VarFileInfo"
diff --git a/3rdparty/zlib/contrib/vstudio/vc12/zlib.rc b/3rdparty/zlib/contrib/vstudio/vc12/zlib.rc
index 4f6396d17f3..c4e4b016e9c 100644
--- a/3rdparty/zlib/contrib/vstudio/vc12/zlib.rc
+++ b/3rdparty/zlib/contrib/vstudio/vc12/zlib.rc
@@ -2,8 +2,8 @@
#define IDR_VERSION1 1
IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
- FILEVERSION 1, 2, 9, 0
- PRODUCTVERSION 1, 2, 9, 0
+ FILEVERSION 1, 2, 11, 0
+ PRODUCTVERSION 1, 2, 11, 0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS 0
FILEOS VOS_DOS_WINDOWS32
@@ -17,12 +17,12 @@ BEGIN
BEGIN
VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0"
- VALUE "FileVersion", "1.2.8.1\0"
+ VALUE "FileVersion", "1.2.11\0"
VALUE "InternalName", "zlib\0"
VALUE "OriginalFilename", "zlibwapi.dll\0"
VALUE "ProductName", "ZLib.DLL\0"
VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
- VALUE "LegalCopyright", "(C) 1995-2013 Jean-loup Gailly & Mark Adler\0"
+ VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0"
END
END
BLOCK "VarFileInfo"
diff --git a/3rdparty/zlib/contrib/vstudio/vc14/miniunz.vcxproj.user b/3rdparty/zlib/contrib/vstudio/vc14/miniunz.vcxproj.user
deleted file mode 100644
index abe8dd8961e..00000000000
--- a/3rdparty/zlib/contrib/vstudio/vc14/miniunz.vcxproj.user
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <PropertyGroup />
-</Project> \ No newline at end of file
diff --git a/3rdparty/zlib/contrib/vstudio/vc14/minizip.vcxproj.user b/3rdparty/zlib/contrib/vstudio/vc14/minizip.vcxproj.user
deleted file mode 100644
index abe8dd8961e..00000000000
--- a/3rdparty/zlib/contrib/vstudio/vc14/minizip.vcxproj.user
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <PropertyGroup />
-</Project> \ No newline at end of file
diff --git a/3rdparty/zlib/contrib/vstudio/vc14/testzlib.vcxproj.user b/3rdparty/zlib/contrib/vstudio/vc14/testzlib.vcxproj.user
deleted file mode 100644
index abe8dd8961e..00000000000
--- a/3rdparty/zlib/contrib/vstudio/vc14/testzlib.vcxproj.user
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <PropertyGroup />
-</Project> \ No newline at end of file
diff --git a/3rdparty/zlib/contrib/vstudio/vc14/testzlibdll.vcxproj.user b/3rdparty/zlib/contrib/vstudio/vc14/testzlibdll.vcxproj.user
deleted file mode 100644
index abe8dd8961e..00000000000
--- a/3rdparty/zlib/contrib/vstudio/vc14/testzlibdll.vcxproj.user
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <PropertyGroup />
-</Project> \ No newline at end of file
diff --git a/3rdparty/zlib/contrib/vstudio/vc14/zlib.rc b/3rdparty/zlib/contrib/vstudio/vc14/zlib.rc
index 4f6396d17f3..c4e4b016e9c 100644
--- a/3rdparty/zlib/contrib/vstudio/vc14/zlib.rc
+++ b/3rdparty/zlib/contrib/vstudio/vc14/zlib.rc
@@ -2,8 +2,8 @@
#define IDR_VERSION1 1
IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
- FILEVERSION 1, 2, 9, 0
- PRODUCTVERSION 1, 2, 9, 0
+ FILEVERSION 1, 2, 11, 0
+ PRODUCTVERSION 1, 2, 11, 0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS 0
FILEOS VOS_DOS_WINDOWS32
@@ -17,12 +17,12 @@ BEGIN
BEGIN
VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0"
- VALUE "FileVersion", "1.2.8.1\0"
+ VALUE "FileVersion", "1.2.11\0"
VALUE "InternalName", "zlib\0"
VALUE "OriginalFilename", "zlibwapi.dll\0"
VALUE "ProductName", "ZLib.DLL\0"
VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
- VALUE "LegalCopyright", "(C) 1995-2013 Jean-loup Gailly & Mark Adler\0"
+ VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0"
END
END
BLOCK "VarFileInfo"
diff --git a/3rdparty/zlib/contrib/vstudio/vc14/zlibstat.vcxproj.user b/3rdparty/zlib/contrib/vstudio/vc14/zlibstat.vcxproj.user
deleted file mode 100644
index abe8dd8961e..00000000000
--- a/3rdparty/zlib/contrib/vstudio/vc14/zlibstat.vcxproj.user
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <PropertyGroup />
-</Project> \ No newline at end of file
diff --git a/3rdparty/zlib/contrib/vstudio/vc14/zlibvc.vcxproj.user b/3rdparty/zlib/contrib/vstudio/vc14/zlibvc.vcxproj.user
deleted file mode 100644
index abe8dd8961e..00000000000
--- a/3rdparty/zlib/contrib/vstudio/vc14/zlibvc.vcxproj.user
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <PropertyGroup />
-</Project> \ No newline at end of file
diff --git a/3rdparty/zlib/contrib/vstudio/vc9/zlib.rc b/3rdparty/zlib/contrib/vstudio/vc9/zlib.rc
index 24727c83dd3..c4e4b016e9c 100644
--- a/3rdparty/zlib/contrib/vstudio/vc9/zlib.rc
+++ b/3rdparty/zlib/contrib/vstudio/vc9/zlib.rc
@@ -2,8 +2,8 @@
#define IDR_VERSION1 1
IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
- FILEVERSION 1, 2, 9, 0
- PRODUCTVERSION 1, 2, 9, 0
+ FILEVERSION 1, 2, 11, 0
+ PRODUCTVERSION 1, 2, 11, 0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS 0
FILEOS VOS_DOS_WINDOWS32
@@ -17,12 +17,12 @@ BEGIN
BEGIN
VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0"
- VALUE "FileVersion", "1.2.9\0"
+ VALUE "FileVersion", "1.2.11\0"
VALUE "InternalName", "zlib\0"
VALUE "OriginalFilename", "zlibwapi.dll\0"
VALUE "ProductName", "ZLib.DLL\0"
VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
- VALUE "LegalCopyright", "(C) 1995-2016 Jean-loup Gailly & Mark Adler\0"
+ VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0"
END
END
BLOCK "VarFileInfo"
diff --git a/3rdparty/zlib/deflate.c b/3rdparty/zlib/deflate.c
index 415adbf94f9..1ec761448de 100644
--- a/3rdparty/zlib/deflate.c
+++ b/3rdparty/zlib/deflate.c
@@ -1,5 +1,5 @@
/* deflate.c -- compress data using the deflation algorithm
- * Copyright (C) 1995-2016 Jean-loup Gailly and Mark Adler
+ * Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -52,7 +52,7 @@
#include "deflate.h"
const char deflate_copyright[] =
- " deflate 1.2.9 Copyright 1995-2016 Jean-loup Gailly and Mark Adler ";
+ " deflate 1.2.11 Copyright 1995-2017 Jean-loup Gailly and Mark Adler ";
/*
If you use the zlib library in a product, an acknowledgment is welcome
in the documentation of your product. If for some reason you cannot
@@ -88,6 +88,7 @@ local void putShortMSB OF((deflate_state *s, uInt b));
local void flush_pending OF((z_streamp strm));
local unsigned read_buf OF((z_streamp strm, Bytef *buf, unsigned size));
#ifdef ASMV
+# pragma message("Assembler code may have bugs -- use at your own risk")
void match_init OF((void)); /* asm code initialization */
uInt longest_match OF((deflate_state *s, IPos cur_match));
#else
@@ -585,7 +586,8 @@ int ZEXPORT deflateParams(strm, level, strategy)
}
func = configuration_table[s->level].func;
- if ((strategy != s->strategy || func != configuration_table[level].func)) {
+ if ((strategy != s->strategy || func != configuration_table[level].func) &&
+ s->high_water) {
/* Flush the last buffer: */
int err = deflate(strm, Z_BLOCK);
if (err == Z_STREAM_ERROR)
@@ -1040,7 +1042,6 @@ int ZEXPORT deflate (strm, flush)
}
}
}
- Assert(strm->avail_out > 0, "bug2");
if (flush != Z_FINISH) return Z_OK;
if (s->wrap <= 0) return Z_STREAM_END;
@@ -1653,38 +1654,39 @@ local block_state deflate_stored(s, flush)
* possible. If flushing, copy the remaining available input to next_out as
* stored blocks, if there is enough space.
*/
- unsigned len, left, have, last;
+ unsigned len, left, have, last = 0;
unsigned used = s->strm->avail_in;
- for (;;) {
+ do {
/* Set len to the maximum size block that we can copy directly with the
* available input data and output space. Set left to how much of that
* would be copied from what's left in the window.
*/
len = MAX_STORED; /* maximum deflate stored block length */
have = (s->bi_valid + 42) >> 3; /* number of header bytes */
+ if (s->strm->avail_out < have) /* need room for header */
+ break;
/* maximum stored block length that will fit in avail_out: */
- have = s->strm->avail_out > have ? s->strm->avail_out - have : 0;
+ have = s->strm->avail_out - have;
left = s->strstart - s->block_start; /* bytes left in window */
if (len > (ulg)left + s->strm->avail_in)
len = left + s->strm->avail_in; /* limit len to the input */
if (len > have)
len = have; /* limit len to the output */
- if (left > len)
- left = len; /* limit window pull to len */
/* If the stored block would be less than min_block in length, or if
* unable to copy all of the available input when flushing, then try
* copying to the window and the pending buffer instead. Also don't
* write an empty block when flushing -- deflate() does that.
*/
- if (len < min_block && (len == 0 || flush == Z_NO_FLUSH ||
- len - left != s->strm->avail_in))
+ if (len < min_block && ((len == 0 && flush != Z_FINISH) ||
+ flush == Z_NO_FLUSH ||
+ len != left + s->strm->avail_in))
break;
/* Make a dummy stored block in pending to get the header bytes,
* including any pending bits. This also updates the debugging counts.
*/
- last = flush == Z_FINISH && len - left == s->strm->avail_in ? 1 : 0;
+ last = flush == Z_FINISH && len == left + s->strm->avail_in ? 1 : 0;
_tr_stored_block(s, (char *)0, 0L, last);
/* Replace the lengths in the dummy stored block with len. */
@@ -1696,14 +1698,16 @@ local block_state deflate_stored(s, flush)
/* Write the stored block header bytes. */
flush_pending(s->strm);
- /* Update debugging counts for the data about to be copied. */
#ifdef ZLIB_DEBUG
+ /* Update debugging counts for the data about to be copied. */
s->compressed_len += len << 3;
s->bits_sent += len << 3;
#endif
/* Copy uncompressed bytes from the window to next_out. */
if (left) {
+ if (left > len)
+ left = len;
zmemcpy(s->strm->next_out, s->window + s->block_start, left);
s->strm->next_out += left;
s->strm->avail_out -= left;
@@ -1721,7 +1725,7 @@ local block_state deflate_stored(s, flush)
s->strm->avail_out -= len;
s->strm->total_out += len;
}
- }
+ } while (last == 0);
/* Update the sliding window with the last s->w_size bytes of the copied
* data, or append all of the copied data to the existing window if less
@@ -1753,14 +1757,17 @@ local block_state deflate_stored(s, flush)
s->block_start = s->strstart;
s->insert += MIN(used, s->w_size - s->insert);
}
+ if (s->high_water < s->strstart)
+ s->high_water = s->strstart;
- /* If flushing or finishing and all input has been consumed, then done. If
- * the code above couldn't write a complete block to next_out, then the
- * code following this won't be able to either.
- */
- if (flush != Z_NO_FLUSH && s->strm->avail_in == 0 &&
- (long)s->strstart == s->block_start)
- return flush == Z_FINISH ? finish_done : block_done;
+ /* If the last block was written to next_out, then done. */
+ if (last)
+ return finish_done;
+
+ /* If flushing and all input has been consumed, then done. */
+ if (flush != Z_NO_FLUSH && flush != Z_FINISH &&
+ s->strm->avail_in == 0 && (long)s->strstart == s->block_start)
+ return block_done;
/* Fill the window with any remaining input. */
have = s->window_size - s->strstart - 1;
@@ -1779,6 +1786,8 @@ local block_state deflate_stored(s, flush)
read_buf(s->strm, s->window + s->strstart, have);
s->strstart += have;
}
+ if (s->high_water < s->strstart)
+ s->high_water = s->strstart;
/* There was not enough avail_out to write a complete worthy or flushed
* stored block to next_out. Write a stored block to pending instead, if we
@@ -1791,20 +1800,18 @@ local block_state deflate_stored(s, flush)
min_block = MIN(have, s->w_size);
left = s->strstart - s->block_start;
if (left >= min_block ||
- (left && flush != Z_NO_FLUSH && s->strm->avail_in == 0 &&
- left <= have)) {
+ ((left || flush == Z_FINISH) && flush != Z_NO_FLUSH &&
+ s->strm->avail_in == 0 && left <= have)) {
len = MIN(left, have);
last = flush == Z_FINISH && s->strm->avail_in == 0 &&
len == left ? 1 : 0;
_tr_stored_block(s, (charf *)s->window + s->block_start, len, last);
s->block_start += len;
flush_pending(s->strm);
- if (last)
- return finish_started;
}
/* We've done all we can with the available input and output. */
- return need_more;
+ return last ? finish_started : need_more;
}
/* ===========================================================================
diff --git a/3rdparty/zlib/gzlib.c b/3rdparty/zlib/gzlib.c
index a87d3d19ecd..4105e6aff92 100644
--- a/3rdparty/zlib/gzlib.c
+++ b/3rdparty/zlib/gzlib.c
@@ -1,5 +1,5 @@
/* gzlib.c -- zlib functions common to reading and writing gzip files
- * Copyright (C) 2004, 2010, 2011, 2012, 2013, 2016 Mark Adler
+ * Copyright (C) 2004-2017 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -211,7 +211,7 @@ local gzFile gz_open(path, fd, mode)
else
#endif
#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
- snprintf(state->path, len + 1, "%s", (const char *)path);
+ (void)snprintf(state->path, len + 1, "%s", (const char *)path);
#else
strcpy(state->path, path);
#endif
@@ -293,7 +293,7 @@ gzFile ZEXPORT gzdopen(fd, mode)
if (fd == -1 || (path = (char *)malloc(7 + 3 * sizeof(int))) == NULL)
return NULL;
#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
- snprintf(path, 7 + 3 * sizeof(int), "<fd:%d>", fd); /* for debugging */
+ (void)snprintf(path, 7 + 3 * sizeof(int), "<fd:%d>", fd);
#else
sprintf(path, "<fd:%d>", fd); /* for debugging */
#endif
@@ -608,8 +608,8 @@ void ZLIB_INTERNAL gz_error(state, err, msg)
return;
}
#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
- snprintf(state->msg, strlen(state->path) + strlen(msg) + 3,
- "%s%s%s", state->path, ": ", msg);
+ (void)snprintf(state->msg, strlen(state->path) + strlen(msg) + 3,
+ "%s%s%s", state->path, ": ", msg);
#else
strcpy(state->msg, state->path);
strcat(state->msg, ": ");
diff --git a/3rdparty/zlib/gzwrite.c b/3rdparty/zlib/gzwrite.c
index a2ee573db0e..c7b5651d70b 100644
--- a/3rdparty/zlib/gzwrite.c
+++ b/3rdparty/zlib/gzwrite.c
@@ -1,5 +1,5 @@
/* gzwrite.c -- zlib functions for writing gzip files
- * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler
+ * Copyright (C) 2004-2017 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -117,6 +117,7 @@ local int gz_comp(state, flush)
if (strm->avail_out == 0) {
strm->avail_out = state->size;
strm->next_out = state->out;
+ state->x.next = state->out;
}
}
diff --git a/3rdparty/zlib/inffast.c b/3rdparty/zlib/inffast.c
index a15876d4e44..0dbd1dbc09f 100644
--- a/3rdparty/zlib/inffast.c
+++ b/3rdparty/zlib/inffast.c
@@ -1,5 +1,5 @@
/* inffast.c -- fast decoding
- * Copyright (C) 1995-2008, 2010, 2013, 2016 Mark Adler
+ * Copyright (C) 1995-2017 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -8,7 +8,9 @@
#include "inflate.h"
#include "inffast.h"
-#ifndef ASMINF
+#ifdef ASMINF
+# pragma message("Assembler code may have bugs -- use at your own risk")
+#else
/*
Decode literal, length, and distance codes and write out the resulting
diff --git a/3rdparty/zlib/inftrees.c b/3rdparty/zlib/inftrees.c
index fa27dcbda60..2ea08fc13ea 100644
--- a/3rdparty/zlib/inftrees.c
+++ b/3rdparty/zlib/inftrees.c
@@ -1,5 +1,5 @@
/* inftrees.c -- generate Huffman trees for efficient decoding
- * Copyright (C) 1995-2016 Mark Adler
+ * Copyright (C) 1995-2017 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -9,7 +9,7 @@
#define MAXBITS 15
const char inflate_copyright[] =
- " inflate 1.2.9 Copyright 1995-2016 Mark Adler ";
+ " inflate 1.2.11 Copyright 1995-2017 Mark Adler ";
/*
If you use the zlib library in a product, an acknowledgment is welcome
in the documentation of your product. If for some reason you cannot
@@ -62,7 +62,7 @@ unsigned short FAR *work;
35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
static const unsigned short lext[31] = { /* Length codes 257..285 extra */
16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
- 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 192, 79};
+ 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 77, 202};
static const unsigned short dbase[32] = { /* Distance codes 0..29 base */
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
diff --git a/3rdparty/zlib/os400/README400 b/3rdparty/zlib/os400/README400
index 7926d7c5fad..4f98334f5ac 100644
--- a/3rdparty/zlib/os400/README400
+++ b/3rdparty/zlib/os400/README400
@@ -1,4 +1,4 @@
- ZLIB version 1.2.9 for OS/400 installation instructions
+ ZLIB version 1.2.11 for OS/400 installation instructions
1) Download and unpack the zlib tarball to some IFS directory.
(i.e.: /path/to/the/zlib/ifs/source/directory)
diff --git a/3rdparty/zlib/os400/make.sh b/3rdparty/zlib/os400/make.sh
index ddbfb16b8a3..19eec117a67 100644
--- a/3rdparty/zlib/os400/make.sh
+++ b/3rdparty/zlib/os400/make.sh
@@ -260,7 +260,7 @@ fi
echo '#pragma comment(user, "ZLIB version '"${VERSION}"'")' > os400.c
echo '#pragma comment(user, __DATE__)' >> os400.c
echo '#pragma comment(user, __TIME__)' >> os400.c
-echo '#pragma comment(copyright, "Copyright (C) 1995-2016 Jean-Loup Gailly, Mark Adler. OS/400 version by P. Monnerat.")' >> os400.c
+echo '#pragma comment(copyright, "Copyright (C) 1995-2017 Jean-Loup Gailly, Mark Adler. OS/400 version by P. Monnerat.")' >> os400.c
make_module OS400 os400.c
LINK= # No need to rebuild service program yet.
MODULES=
diff --git a/3rdparty/zlib/os400/zlib.inc b/3rdparty/zlib/os400/zlib.inc
index 5431e540f43..c6aca2cbd6a 100644
--- a/3rdparty/zlib/os400/zlib.inc
+++ b/3rdparty/zlib/os400/zlib.inc
@@ -1,7 +1,7 @@
* ZLIB.INC - Interface to the general purpose compression library
*
* ILE RPG400 version by Patrick Monnerat, DATASPHERE.
- * Version 1.2.9
+ * Version 1.2.11
*
*
* WARNING:
@@ -22,12 +22,12 @@
*
* Versioning information.
*
- D ZLIB_VERSION C '1.2.9'
- D ZLIB_VERNUM C X'1290'
+ D ZLIB_VERSION C '1.2.11'
+ D ZLIB_VERNUM C X'12a0'
D ZLIB_VER_MAJOR C 1
D ZLIB_VER_MINOR C 2
D ZLIB_VER_REVISION...
- D C 9
+ D C 11
D ZLIB_VER_SUBREVISION...
D C 0
*
diff --git a/3rdparty/zlib/qnx/package.qpg b/3rdparty/zlib/qnx/package.qpg
index 67a87776278..31e8e90db4d 100644
--- a/3rdparty/zlib/qnx/package.qpg
+++ b/3rdparty/zlib/qnx/package.qpg
@@ -25,10 +25,10 @@
<QPG:Files>
<QPG:Add file="../zconf.h" install="/opt/include/" user="root:sys" permission="644"/>
<QPG:Add file="../zlib.h" install="/opt/include/" user="root:sys" permission="644"/>
- <QPG:Add file="../libz.so.1.2.9" install="/opt/lib/" user="root:bin" permission="644"/>
- <QPG:Add file="libz.so" install="/opt/lib/" component="dev" filetype="symlink" linkto="libz.so.1.2.9"/>
- <QPG:Add file="libz.so.1" install="/opt/lib/" filetype="symlink" linkto="libz.so.1.2.9"/>
- <QPG:Add file="../libz.so.1.2.9" install="/opt/lib/" component="slib"/>
+ <QPG:Add file="../libz.so.1.2.11" install="/opt/lib/" user="root:bin" permission="644"/>
+ <QPG:Add file="libz.so" install="/opt/lib/" component="dev" filetype="symlink" linkto="libz.so.1.2.11"/>
+ <QPG:Add file="libz.so.1" install="/opt/lib/" filetype="symlink" linkto="libz.so.1.2.11"/>
+ <QPG:Add file="../libz.so.1.2.11" install="/opt/lib/" component="slib"/>
</QPG:Files>
<QPG:PackageFilter>
@@ -63,7 +63,7 @@
</QPM:ProductDescription>
<QPM:ReleaseDescription>
- <QPM:ReleaseVersion>1.2.9</QPM:ReleaseVersion>
+ <QPM:ReleaseVersion>1.2.11</QPM:ReleaseVersion>
<QPM:ReleaseUrgency>Medium</QPM:ReleaseUrgency>
<QPM:ReleaseStability>Stable</QPM:ReleaseStability>
<QPM:ReleaseNoteMinor></QPM:ReleaseNoteMinor>
diff --git a/3rdparty/zlib/treebuild.xml b/3rdparty/zlib/treebuild.xml
index 931ee5a2216..fd75525f995 100644
--- a/3rdparty/zlib/treebuild.xml
+++ b/3rdparty/zlib/treebuild.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" ?>
-<package name="zlib" version="1.2.9">
- <library name="zlib" dlversion="1.2.9" dlname="z">
+<package name="zlib" version="1.2.11">
+ <library name="zlib" dlversion="1.2.11" dlname="z">
<property name="description"> zip compression library </property>
<property name="include-target-dir" value="$(@PACKAGE/install-includedir)" />
diff --git a/3rdparty/zlib/trees.c b/3rdparty/zlib/trees.c
index 357f3139254..50cf4b4571c 100644
--- a/3rdparty/zlib/trees.c
+++ b/3rdparty/zlib/trees.c
@@ -1,5 +1,5 @@
/* trees.c -- output deflated data using Huffman coding
- * Copyright (C) 1995-2016 Jean-loup Gailly
+ * Copyright (C) 1995-2017 Jean-loup Gailly
* detect_data_type() function provided freely by Cosmin Truta, 2006
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -906,7 +906,7 @@ void ZLIB_INTERNAL _tr_align(s)
/* ===========================================================================
* Determine the best encoding for the current block: dynamic trees, static
- * trees or store, and output the encoded block to the zip file.
+ * trees or store, and write out the encoded block.
*/
void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)
deflate_state *s;
diff --git a/3rdparty/zlib/win32/Makefile.msc b/3rdparty/zlib/win32/Makefile.msc
index 67b773171da..6831882de43 100644
--- a/3rdparty/zlib/win32/Makefile.msc
+++ b/3rdparty/zlib/win32/Makefile.msc
@@ -1,5 +1,5 @@
# Makefile for zlib using Microsoft (Visual) C
-# zlib is copyright (C) 1995-2006 Jean-loup Gailly and Mark Adler
+# zlib is copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
#
# Usage:
# nmake -f win32/Makefile.msc (standard build)
diff --git a/3rdparty/zlib/win32/README-WIN32.txt b/3rdparty/zlib/win32/README-WIN32.txt
index 5002f3c9117..df7ab7f4b34 100644
--- a/3rdparty/zlib/win32/README-WIN32.txt
+++ b/3rdparty/zlib/win32/README-WIN32.txt
@@ -1,6 +1,6 @@
ZLIB DATA COMPRESSION LIBRARY
-zlib 1.2.9 is a general purpose data compression library. All the code is
+zlib 1.2.11 is a general purpose data compression library. All the code is
thread safe. The data format used by the zlib library is described by RFCs
(Request for Comments) 1950 to 1952 in the files
http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format)
@@ -22,7 +22,7 @@ before asking for help.
Manifest:
-The package zlib-1.2.9-win32-x86.zip will contain the following files:
+The package zlib-1.2.11-win32-x86.zip will contain the following files:
README-WIN32.txt This document
ChangeLog Changes since previous zlib packages
@@ -72,7 +72,7 @@ are too numerous to cite here.
Copyright notice:
- (C) 1995-2012 Jean-loup Gailly and Mark Adler
+ (C) 1995-2017 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
diff --git a/3rdparty/zlib/win32/VisualC.txt b/3rdparty/zlib/win32/VisualC.txt
index 579a5fc9e0f..1005b219410 100644
--- a/3rdparty/zlib/win32/VisualC.txt
+++ b/3rdparty/zlib/win32/VisualC.txt
@@ -1,3 +1,3 @@
To build zlib using the Microsoft Visual C++ environment,
-use the appropriate project from the projects/ directory.
+use the appropriate project from the contrib/vstudio/ directory.
diff --git a/3rdparty/zlib/win32/zlib1.rc b/3rdparty/zlib/win32/zlib1.rc
index 5c0feed1b44..234e641c329 100644
--- a/3rdparty/zlib/win32/zlib1.rc
+++ b/3rdparty/zlib/win32/zlib1.rc
@@ -26,7 +26,7 @@ BEGIN
VALUE "FileDescription", "zlib data compression library\0"
VALUE "FileVersion", ZLIB_VERSION "\0"
VALUE "InternalName", "zlib1.dll\0"
- VALUE "LegalCopyright", "(C) 1995-2013 Jean-loup Gailly & Mark Adler\0"
+ VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0"
VALUE "OriginalFilename", "zlib1.dll\0"
VALUE "ProductName", "zlib\0"
VALUE "ProductVersion", ZLIB_VERSION "\0"
diff --git a/3rdparty/zlib/zlib.3 b/3rdparty/zlib/zlib.3
index cbac458881e..bda4eb07370 100644
--- a/3rdparty/zlib/zlib.3
+++ b/3rdparty/zlib/zlib.3
@@ -1,4 +1,4 @@
-.TH ZLIB 3 "31 Dec 2016"
+.TH ZLIB 3 "15 Jan 2017"
.SH NAME
zlib \- compression/decompression library
.SH SYNOPSIS
@@ -105,9 +105,9 @@ before asking for help.
Send questions and/or comments to zlib@gzip.org,
or (for the Windows DLL version) to Gilles Vollant (info@winimage.com).
.SH AUTHORS AND LICENSE
-Version 1.2.9
+Version 1.2.11
.LP
-Copyright (C) 1995-2016 Jean-loup Gailly and Mark Adler
+Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
.LP
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
diff --git a/3rdparty/zlib/zlib.3.pdf b/3rdparty/zlib/zlib.3.pdf
index 5c71eedad26..6fa519c5bdf 100644
--- a/3rdparty/zlib/zlib.3.pdf
+++ b/3rdparty/zlib/zlib.3.pdf
Binary files differ
diff --git a/3rdparty/zlib/zlib.h b/3rdparty/zlib/zlib.h
index 69fbb978e36..f09cdaf1e05 100644
--- a/3rdparty/zlib/zlib.h
+++ b/3rdparty/zlib/zlib.h
@@ -1,7 +1,7 @@
/* zlib.h -- interface of the 'zlib' general purpose compression library
- version 1.2.9, December 31st, 2016
+ version 1.2.11, January 15th, 2017
- Copyright (C) 1995-2016 Jean-loup Gailly and Mark Adler
+ Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
@@ -37,11 +37,11 @@
extern "C" {
#endif
-#define ZLIB_VERSION "1.2.9"
-#define ZLIB_VERNUM 0x1290
+#define ZLIB_VERSION "1.2.11"
+#define ZLIB_VERNUM 0x12b0
#define ZLIB_VER_MAJOR 1
#define ZLIB_VER_MINOR 2
-#define ZLIB_VER_REVISION 9
+#define ZLIB_VER_REVISION 11
#define ZLIB_VER_SUBREVISION 0
/*
@@ -379,10 +379,11 @@ ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
Initializes the internal stream state for decompression. The fields
next_in, avail_in, zalloc, zfree and opaque must be initialized before by
- the caller. In the current version of inflate, the provide input is not
- read or consumed. Any memory allocation will be deferred to the first call
- of inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them
- to use default allocation functions.
+ the caller. In the current version of inflate, the provided input is not
+ read or consumed. The allocation of a sliding window will be deferred to
+ the first call of inflate (if the decompression does not complete on the
+ first call). If zalloc and zfree are set to Z_NULL, inflateInit updates
+ them to use default allocation functions.
inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
@@ -408,7 +409,7 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
- Decompress more input starting at next_in and update next_in and avail_in
accordingly. If not all input can be processed (because there is not
- enough room in the output buffer), then next_in and avail_on are updated
+ enough room in the output buffer), then next_in and avail_in are updated
accordingly, and processing will resume at this point for the next call of
inflate().
@@ -711,10 +712,11 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
used to switch between compression and straight copy of the input data, or
to switch to a different kind of input data requiring a different strategy.
If the compression approach (which is a function of the level) or the
- strategy is changed, then the input available so far is compressed with the
- old level and strategy using deflate(strm, Z_BLOCK). There are three
- approaches for the compression levels 0, 1..3, and 4..9 respectively. The
- new level and strategy will take effect at the next call of deflate().
+ strategy is changed, and if any input has been consumed in a previous
+ deflate() call, then the input available so far is compressed with the old
+ level and strategy using deflate(strm, Z_BLOCK). There are three approaches
+ for the compression levels 0, 1..3, and 4..9 respectively. The new level
+ and strategy will take effect at the next call of deflate().
If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does
not have enough output space to complete, then the parameter change will not
@@ -1229,7 +1231,7 @@ ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen,
the byte length of the source buffer. Upon entry, destLen is the total size
of the destination buffer, which must be at least the value returned by
compressBound(sourceLen). Upon exit, destLen is the actual size of the
- compressed buffer. compress() is equivalent to compress2() with a level
+ compressed data. compress() is equivalent to compress2() with a level
parameter of Z_DEFAULT_COMPRESSION.
compress returns Z_OK if success, Z_MEM_ERROR if there was not
@@ -1246,7 +1248,7 @@ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen,
length of the source buffer. Upon entry, destLen is the total size of the
destination buffer, which must be at least the value returned by
compressBound(sourceLen). Upon exit, destLen is the actual size of the
- compressed buffer.
+ compressed data.
compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
memory, Z_BUF_ERROR if there was not enough room in the output buffer,
diff --git a/3rdparty/zlib/zutil.c b/3rdparty/zlib/zutil.c
index 3b4d90451f0..a76c6b0c7e5 100644
--- a/3rdparty/zlib/zutil.c
+++ b/3rdparty/zlib/zutil.c
@@ -1,5 +1,5 @@
/* zutil.c -- target dependent utility functions for the compression library
- * Copyright (C) 1995-2005, 2010, 2011, 2012, 2016 Jean-loup Gailly
+ * Copyright (C) 1995-2017 Jean-loup Gailly
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -113,7 +113,7 @@ uLong ZEXPORT zlibCompileFlags()
}
#ifdef ZLIB_DEBUG
-
+#include <stdlib.h>
# ifndef verbose
# define verbose 0
# endif
diff --git a/README.md b/README.md
index f4693c3cd83..3c6a2405f86 100644
--- a/README.md
+++ b/README.md
@@ -89,7 +89,7 @@ Please note that MAME is a registered trademark of Nicola Salmoria, and permissi
<img align="right" src="http://opensource.org/trademarks/opensource/OSI-Approved-License-100x137.png">
</a>
- Copyright (C) 1997-2016 MAMEDev and contributors
+ Copyright (C) 1997-2017 MAMEDev and contributors
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
diff --git a/android-project/LICENSE b/android-project/LICENSE
index 4d9210d10e1..7129c522789 100644
--- a/android-project/LICENSE
+++ b/android-project/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2016, MAME Development Team
+Copyright (c) 2017, MAME Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/android-project/app/src/main/AndroidManifest.xml b/android-project/app/src/main/AndroidManifest.xml
index e438149550c..13ddaa65946 100644
--- a/android-project/app/src/main/AndroidManifest.xml
+++ b/android-project/app/src/main/AndroidManifest.xml
@@ -4,8 +4,8 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.mamedev.mame"
- android:versionCode="181"
- android:versionName="0.181"
+ android:versionCode="182"
+ android:versionName="0.182"
android:installLocation="auto">
<!-- Android 5.0 -->
diff --git a/benchmarks/LICENSE b/benchmarks/LICENSE
index 4d9210d10e1..7129c522789 100644
--- a/benchmarks/LICENSE
+++ b/benchmarks/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2016, MAME Development Team
+Copyright (c) 2017, MAME Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/docs/source/conf.py b/docs/source/conf.py
index 3031771673e..55b2d422005 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -54,7 +54,7 @@ master_doc = 'index'
# General information about the project.
project = u'MAME Documentation'
-copyright = u'2016, MAMEdev Team'
+copyright = u'2017, MAMEdev Team'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
diff --git a/docs/source/license.rst b/docs/source/license.rst
index 615e9af911b..1ce48503983 100644
--- a/docs/source/license.rst
+++ b/docs/source/license.rst
@@ -6,7 +6,7 @@ The MAME project as a whole is distributed under the terms of the `GNU General P
Please note that MAME is a registered trademark of Nicola Salmoria, and permission is required to use the "MAME" name, logo, or wordmark.
- Copyright (C) 1997-2016 MAMEDev and contributors
+ Copyright (C) 1997-2017 MAMEDev and contributors
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
diff --git a/docs/source/whatis.rst b/docs/source/whatis.rst
index 1233ad00080..98897104855 100644
--- a/docs/source/whatis.rst
+++ b/docs/source/whatis.rst
@@ -7,7 +7,7 @@ MAME's purpose is to preserve decades of software history. As electronic technol
|
| **MAME(R), the Multiple Arcade Machine Emulator**
-| **Copyright (c) 1997-2016 by Nicola Salmoria and the MAME team**
+| **Copyright (c) 1997-2017 by Nicola Salmoria and the MAME team**
| **MAME is a trademark owned by Nicola Salmoria**
|
diff --git a/hash/archimedes.xml b/hash/archimedes.xml
index 61b897461af..0e9c065af8d 100644
--- a/hash/archimedes.xml
+++ b/hash/archimedes.xml
@@ -9,19 +9,15 @@ Undumped games, based on http://www.acorn-gaming.org.uk/index.php3?p=Database/
3D Construction Kit by Domark
Abuse by R-Comp Interactive (RiscPC & StrongARM)
-Aldebaran by ArcAngels (RiscOS3+)
-Alone in the Dark by Krisalis (RiscOS3+)
Alps by Alpine Software (RiscOS2 & 3)
Ankh by Artex Software (RiscOS3+)
Arcade 3 by Clares Micro Supplies (??)
Arcade Soccer by 4th Dimension (RiscOS2)
Arcendium by Clares Micro Supplies (RiscOS2)
-ArcPinball by Shibumi Software (RiscOS2)
Arctrivia by Moray Micro Computing (??)
Arcturus by Oregan Software (RiscOS3+)
Aries by Eclipse (RiscOS2 & 3)
Arya by SkullSoft (RiscOS3+)
-Axis by ?? (RiscOS2+)
Ballarena by Eterna (RiscOS2)
Bambuzle by Arxe (RiscOS2)
Battle Chess by Krisalis (??)
@@ -38,7 +34,6 @@ Cardmania by CIS (RiscOS3)
Carnage Inc. by 4th Dimension (RiscOS2+)
Cartoon Line Part 1 by Eterna (RiscOS2 & ??)
Casino by Minerva (RiscOS2+)
-Caverns by Minerva (RiscOS2 & ??)
Caves of Confusion by Generation Design (RiscOS3)
Champions Collection by Krisalis (RiscOS2)
The Chaos Engine by R-Comp Interactive (RiscOS3+)
@@ -55,9 +50,7 @@ Crisis by ?? (??)
Cyber Ape by ?? (RiscOS2+)
Cyber Chess by 4th Dimension (RiscOS3+)
Cyborg by Alpine Software (RiscOS3+)
-Cycloids by Eclipse (RiscOS2+)
Cygnus Collection by Cygnus (RiscOS2 & 3)
-DarkWood by Eclipse (RiscOS3+)
David Pilling's Chess by ?? (RiscOS2+)
Days of Steam by ?? (RiscOS3+)
Demon's Lair by 4th Dimension (RiscOS3+)
@@ -72,14 +65,11 @@ Dreadnoughts - Bismarks by Turcan Research Systems (RiscOS3)
Dreadnoughts - Ironclads by Turcan Research Systems (RiscOS3)
Drifter by 4th Dimension (RiscOS2+)
Drop Ship by 4th Dimension (RiscOS2+)
-Dune II - Battle for Arrakis by Eclipse (RiscOS2+)
The Dungeon by 4th Dimension (RiscOS2+)
E-Type 2 by 4th Dimension (RiscOS2+)
E-Type Extra 100 Miles by 4th Dimension (RiscOS2+)
Emotions by The Datafile (RiscPC & StrongARM)
-Empire Soccer (Unreleased?) by ?? (??)
Enter the Realm by 4th Dimension (RiscOS2+)
-Enthar 7 by ?? (RiscOS2)
Entropy by Oregan Software Developments (RiscOS2 & 3)
Eternal Destiny by Destiny Software (RiscPC & StrongARM)
Exodus by Artex Software (RiscOS3+)
@@ -87,7 +77,6 @@ The Exotic Adventures of Sylvia Lane by 4th Dimension (RiscOS3)
Face to Face by SYRAsoft (RiscOS3+)
Family Favourites by ?? (RiscOS2)
Fine Racer by Eterna (RiscOS2)
-Fire and Ice by Warner Interactive (RiscOS3)
Fireball by CIS (RiscOS2)
Fist Lore by ICS (RiscOS2+)
Flight Simulator Toolkit by Simis (RiscOS2)
@@ -96,24 +85,19 @@ Flying High - Euroblaster and Joust by The Datafile (StrongARM)
Formula Two Thousand by ?? (RiscOS2+)
Frak by ProAction (RiscPC & StrongARM)
FRED by Eclipse (RiscOS3+)
-Freddy's Folly by Minerva (RiscOS2)
Fyarena by ?? (??)
Galactic Dan by 4th Dimension (RiscOS2+)
Global Effect by Eclipse (RiscOS2+)
-Gods by Krisalis (RiscOS3)
The Gold Run by Generation Design (RiscOS3+)
Grevious Bodily 'Arm by 4th Dimension (RiscOS2 & 3)
-Gribbly's Day Out by Coin-Age (RiscOS2)
Ground Hog by 4th Dimension (RiscOS3+)
Haunted House by 4th Dimension (RiscOS3+)
-Heimdall by Krisalis (RiscOS3+)
Here With the Clues by ?? (RiscOS2)
Heretic and Hexen by R-Comp Interactive (RiscPC & StrongARM)
Heroes of Might and Magic 2 by R-Comp Interactive (RiscPC & StrongARM)
High Risc Racing by Davyn (RiscOS3+)
Holed Out by 4th Dimension (RiscOS2+)
Holed Out Designer by 4th Dimension (RiscOS2+)
-Hostages by Superior Software (RiscOS2 & 3)
Hoverbod by ?? (RiscOS2)
Humanoids by CIS (RiscOS2+)
Inertia by 4th Dimension (RiscOS2+)
@@ -123,26 +107,20 @@ Jahangir Khan Squash by Krisalis (RiscOS2)
James Pond 2: Robocod (Plus) by Eclipse (RiscOS2+)
Jinxter by Magnetic Scrolls (RiscOS3+)
K.V. by High Risc Software Developments (RiscOS3)
-Karma: The Flight Trainer by Periscope Software (RiscOS3+)
Kerbang! by Eterna (RiscOS2)
Killer Bugs by CIS (RiscPC & ??)
The Last Cybermoch by Generation Design (RiscOS2+)
-The Last Ninja by Superior Software (RiscOS2+)
-Lemmings 2: The Tribes by Krisalis (RiscOS2+)
Logic Mania by 4th Dimension (RiscOS3+)
Loopz by Audiogenic (RiscOS3+)
Lotus Turbo Challenge 2 by Krisalis (RiscOS2+)
Maddingley Hall by Minerva (??)
-Magic Pockets by Renegade (RiscOS2+)
Magnetic Scrolls Collection 1 by Magnetic Scrolls (??)
Magnetoids by Oregan Software Developments (RiscOS3+)
Mahjong Patience by CIS (RiscOS2)
Man-at-Arms by 4th Dimension (RiscOS2)
-Microdrive by CIS (RiscOS2+)
Microdrive 2 by CIS (??)
Microdrive Designer by CIS (RiscOS2 & 3)
Microdrive World Edition by CIS (RiscOS2+)
-Minotaur by Minerva (RiscOS2)
Mirror Image and Merp by ?? (RiscOS3+)
Missile Control by Minerva (RiscOS2)
Morph by 4th Dimension (RiscOS3+)
@@ -171,7 +149,6 @@ Provocator by Computer Tutorial (RiscOS2)
Psyanki by 4th Dimension (RiscOS2 & ?)
Pushy by 4th Dimension (RiscOS3+)
Quark by Oregan Software Developments (RiscOS2 & 3)
-Quazer by Impact Software (RiscOS2 & 3)
Quest for Gold by Krisalis (RiscOS2 & 3)
Raw Power by Eclipse (??)
The Real McCoy by 4th Dimension (RiscOS2)
@@ -183,18 +160,14 @@ The Real McCoy 6 by 4th Dimension (RiscOS3+)
Repton 1 & 2 twinpack by ProAction (RiscOS3+)
Return to Doom Trilogy by ?? (??)
Rick Dangerous by The Hitmen Software (RiscOS2+)
-Rise in Crime by Robico Software (RiscOS2 & 3)
Robocatch by Generation Design (RiscOS2+)
Robotix by CIS (RiscOS2)
Rockfall by Eterna (RiscOS2+)
-Rotor by Superior Software (RiscOS2)
Sally and Wally by Oregan Software Developments (RiscOS2+)
Saloon Cars Deluxe by 4th Dimension (RiscOS2+)
Saloon Cars Deluxe Extra Courses by 4th Dimension (RiscOS2+)
Scrabble by U.S. Gold (RiscOS3+)
SeaTrek by Generation Design (RiscOS2+)
-Sensible Soccer by Renegade (RiscOS3)
-Serpents by CIS (RiscOS3+)
Shuggy by Werewolf Software (RiscOS3+)
Silverball by 4th Dimension (RiscOS3+)
Sim City 2000 by Krisalis (RiscOS3+)
@@ -205,7 +178,6 @@ Spobbleoid Fantasy by 4th Dimension (RiscOS3+)
Sporting Triangles by ?? (??)
SpySnatcher by Topologika (??)
Square Route by ComputerEyes (??)
-StarTrader by Gem Electronics (??)
Stereoworld by 4th Dimension (RiscOS3+)
Stranded by Robico Sotware (RiscOS2)
Stunt Racer 2000 by 4th Dimension (RiscOS2+)
@@ -226,8 +198,6 @@ Wavelength by Eclipse (RiscOS3)
Wizard Apprentice by The Datafile (RiscPC & StrongARM)
Wolf Pack by Software 42 (RiscOS2+)
Wonderland by Magnetic Scrolls (RiscOS3)
-Word Up Word Down by ?? (RiscOS2)
-World Class Leaderboard by Krisalis (??)
Worldscape by Eclipse (StrongARM?)
Worra Battle by Oak Solutions (RiscOS2+)
X-Fire by 4th Dimension (RiscOS2+)
@@ -235,13 +205,12 @@ Xenocide by Skullsoft (RiscOS3+)
Xenon 2 by Eclipse (RiscOS2+)
XOR by Longman Logotron (RiscOS2+)
Zalaga by ProAction (RiscPC & StrongARM)
-Zarch by Superior Software (RiscOS2 & 3)
Zelanites: The Onslaught by Micro Power (RiscOS2)
-->
- <software name="2067bc" supported="no">
- <description>2067BC</description>
- <year>19??</year>
+ <software name="2067bc">
+ <description>2067 BC</description>
+ <year>1992</year>
<publisher>Oregan Software</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
@@ -250,7 +219,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="aggress" supported="no">
+ <software name="aggress">
<description>Aggressor</description>
<year>1992</year>
<publisher>Atomic Software</publisher>
@@ -261,10 +230,10 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="airsuprm" supported="no">
+ <software name="airsuprm">
<description>Air Supremacy</description>
- <year>19??</year>
- <publisher>Superior Software</publisher>
+ <year>1991</year>
+ <publisher>Superior Software/Acornsoft</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
<rom name="air supremecy (19xx)(acornsoft - superior software).adf" size="819200" crc="b338ef90" sha1="cb89723c1f651827aa36ff80465980840e8deb8a" offset="0" />
@@ -272,7 +241,18 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="alerion" supported="no">
+ <software name="aldebaran">
+ <description>Aldebaran</description>
+ <year>1991</year>
+ <publisher>Evolution Trading</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Aldebaran (1993)(Evolution Trading AG).adf" size="819200" crc="53516b2c" sha1="aad078dafe44d989682bf27ddab4d89cf7eda5c3" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="alerion">
<description>Alerion</description>
<year>1994</year>
<publisher>Archimedes World</publisher>
@@ -283,7 +263,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="alieninv" supported="no">
+ <software name="alieninv">
<description>Alien Invasion</description>
<year>1994</year>
<publisher>Archimedes World</publisher>
@@ -294,7 +274,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="alieninva" cloneof="alieninv" supported="no">
+ <software name="alieninva" cloneof="alieninv">
<description>Alien Invasion (Alt)</description>
<year>1994</year>
<publisher>Archimedes World</publisher>
@@ -305,7 +285,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="aliped" supported="no">
+ <software name="aliped">
<description>Aliped</description>
<year>1990</year>
<publisher>Archimedes World</publisher>
@@ -316,7 +296,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="alipeda" cloneof="aliped" supported="no">
+ <software name="alipeda" cloneof="aliped">
<description>Aliped (Alt)</description>
<year>1990</year>
<publisher>Archimedes World</publisher>
@@ -327,7 +307,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="allinbox" supported="no">
+ <software name="allinbox">
<description>All-In Boxing</description>
<year>1994</year>
<publisher>Archimedes World</publisher>
@@ -338,18 +318,62 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="allinboxa" cloneof="allinbox" supported="no">
- <description>All-In Boxing (Alt)</description>
- <year>1994</year>
- <publisher>Archimedes World</publisher>
+ <software name="alonedark">
+ <description>Alone In The Dark</description>
+ <year>1995</year>
+ <publisher>Krisalis</publisher>
+ <info name="usage" value="Protection requires manual" />
<part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Alone In The Dark (1995)(Krisalis)(Disk 1 of 8).adf" size="819200" crc="9b73f7a9" sha1="f73b4e98b91dd291cff3b8b4107f66d24178a59e" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 2"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Alone In The Dark (1995)(Krisalis)(Disk 2 of 8).adf" size="819200" crc="d468c68f" sha1="5cc4610dcd05b01528ce53709944fdbe4a3d21b4" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 3"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Alone In The Dark (1995)(Krisalis)(Disk 3 of 8).adf" size="819200" crc="451d84fb" sha1="c783d6f225ba74e5e5d30107d15a8214c28cbab0" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 4"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Alone In The Dark (1995)(Krisalis)(Disk 4 of 8).adf" size="819200" crc="55573680" sha1="ed6e6bc3b9ba0d9dcab56ab7b3ee273755c5d86b" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 5"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Alone In The Dark (1995)(Krisalis)(Disk 5 of 8).adf" size="819200" crc="29bdb055" sha1="9a93a4341c36c55dd801b2ff0bdde90efbdceccf" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 6"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Alone In The Dark (1995)(Krisalis)(Disk 6 of 8).adf" size="819200" crc="b94e5066" sha1="b1ed75ee5882809c5671e8dc44e19ef5f932edef" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 7"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Alone In The Dark (1995)(Krisalis)(Disk 7 of 8).adf" size="819200" crc="c12ae5de" sha1="b18c95e9d4cb78d21f3b0d7584e0d91c567edf30" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 8"/>
<dataarea name="flop" size="819200">
- <rom name="boxing.adf" size="819200" crc="48d74d8b" sha1="38fcf7b7c1a0b55cab74610c915cde03ad7069f3" offset="0" />
+ <rom name="Alone In The Dark (1995)(Krisalis)(Disk 8 of 8).adf" size="819200" crc="5ae4d49c" sha1="cbf5f42a59a9b76db2e82c72edc4d584cfce01a9" offset="0"/>
</dataarea>
</part>
</software>
- <software name="apocalyp" supported="no">
+ <software name="apocalyp">
<description>Apocalypse</description>
<year>1990</year>
<publisher>Fourth Dimension</publisher>
@@ -367,7 +391,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="apocalypa" cloneof="apocalyp" supported="no">
+ <software name="apocalypa" cloneof="apocalyp">
<description>Apocalypse (Alt)</description>
<year>1990</year>
<publisher>Fourth Dimension</publisher>
@@ -385,7 +409,18 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="asylum" supported="no">
+ <software name="arcpinball">
+ <description>ArcPinball</description>
+ <year>1990</year>
+ <publisher>Shibumi Software</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="ArcPinball (1990)(Shibumi Software).adf" size="819200" crc="325f1016" sha1="6a990abfaf0d06f9e41023cbd7d8d43d9ae2dff8" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="asylum">
<description>Asylum</description>
<year>1993</year>
<publisher>Digital Psychosis</publisher>
@@ -403,7 +438,23 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="bigbang" supported="no">
+ <software name="axis">
+ <description>Axis</description>
+ <year>1993</year>
+ <publisher>TBA Software</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="TBA_AXIS_Disc1.adf" size="819200" crc="fdda50c0" sha1="b0055702d2908f59056f02f319052b2714b7753e" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="TBA_AXIS_Disc2.adf" size="819200" crc="3c297eaf" sha1="9c82f7d55b125b945b925906fa97fb5b87c23e0c" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bigbang">
<description>Big Bang</description>
<year>19??</year>
<publisher>Psycore</publisher>
@@ -414,8 +465,8 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="blitz" supported="no">
- <description>Blitz</description>
+ <software name="blitz">
+ <description>Blitz!</description>
<year>1991</year>
<publisher>Arxe Systems</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -425,9 +476,9 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="blowpipe" supported="no">
- <description>Blow Pipe</description>
- <year>19??</year>
+ <software name="blowpipe">
+ <description>Blowpipe</description>
+ <year>1990</year>
<publisher>Eclipse</publisher>
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1"/>
@@ -443,9 +494,9 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="bobbie" supported="no">
+ <software name="bobbie">
<description>Bobbie Blockhead vs The Dark Planet</description>
- <year>19??</year>
+ <year>1991</year>
<publisher>Atomic Software</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
@@ -454,7 +505,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="break147" supported="no">
+ <software name="break147">
<description>Break 147</description>
<year>1991</year>
<publisher>Fourth Dimension</publisher>
@@ -465,7 +516,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="bublfair" supported="no">
+ <software name="bublfair">
<description>Bubble Fair</description>
<year>1991</year>
<publisher>Eterna</publisher>
@@ -476,40 +527,29 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="bugmoon" supported="no">
- <description>Bug Hunter &amp; Moon Dash (Hacked?)</description>
+ <software name="bugmoon">
+ <description>Bug Hunter &amp; Moon Dash</description>
<year>1990</year>
<publisher>Minerva</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
- <rom name="bug hunter &amp; moon dash (1990)(minerva)[h].adf" size="819200" crc="fdca6089" sha1="2d3e0c5557bfe780353df75ce43026ec1467a334" offset="0" />
+ <rom name="Bug Hunter and Moon Dash (1990)(Minerva).adf" size="819200" crc="fdca6089" sha1="2d3e0c5557bfe780353df75ce43026ec1467a334" offset="0" />
</dataarea>
</part>
</software>
- <software name="bughunt2" supported="no">
- <description>Bug Hunter in Space (v3.22, Hacked?)</description>
+ <software name="bughunt2">
+ <description>Bug Hunter in Space</description>
<year>1990</year>
<publisher>Minerva</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
- <rom name="bug hunter 2 v3.22 (1990)(minerva)[h].adf" size="819200" crc="c1df774f" sha1="9b65347ce1445f6c1fcafe2cf3b7fe25c2d9d7bf" offset="0" />
+ <rom name="Bug Hunter in Space (1990)(Minerva).adf" size="819200" crc="8f2b0cd4" sha1="b212e07cfbe6a5f3f17748be9a4fc473aed86574" offset="0" />
</dataarea>
</part>
</software>
- <software name="bughunt2a" cloneof="bughunt2" supported="no">
- <description>Bug Hunter in Space (Alt?)</description>
- <year>1990</year>
- <publisher>Minerva</publisher>
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="819200">
- <rom name="bhis.adf" size="819200" crc="8f2b0cd4" sha1="b212e07cfbe6a5f3f17748be9a4fc473aed86574" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="cfodder" supported="no">
+ <software name="cfodder">
<description>Cannon Fodder</description>
<year>1993</year>
<publisher>Krisalis</publisher>
@@ -533,7 +573,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="cataclys" supported="no">
+ <software name="cataclys">
<description>Cataclysm</description>
<year>1991</year>
<publisher>Fourth Dimension</publisher>
@@ -551,31 +591,31 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="chess3d" supported="no">
- <description>Chess 3D (v1.33)</description>
- <year>19??</year>
- <publisher>Micro Power</publisher>
+ <software name="caverns">
+ <description>Caverns</description>
+ <year>1991</year>
+ <publisher>Minerva</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
- <rom name="chess 3d v1.33 (19xx)(micropower).adf" size="819200" crc="dbc0ac1d" sha1="a8ed0b17377dea96098b274b9982998bee070d3c" offset="0" />
+ <rom name="Caverns (Minerva).adf" size="819200" crc="0fa79ffc" sha1="3a7e69449d600650985f8f9a889a7bba3d67cc69" offset="0"/>
</dataarea>
</part>
</software>
- <software name="chess3da" cloneof="chess3d" supported="no">
+ <software name="chess3d">
<description>Chess 3D</description>
- <year>19??</year>
+ <year>1991</year>
<publisher>Micro Power</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="804864">
- <rom name="chess 3d (19xx)(micropower).adf" size="804864" crc="b2f43c2a" sha1="90d3978556577ce09129ddeabcdeda5247692a68" offset="0" />
+ <dataarea name="flop" size="819200">
+ <rom name="chess 3d v1.33 (19xx)(micropower).adf" size="819200" crc="dbc0ac1d" sha1="a8ed0b17377dea96098b274b9982998bee070d3c" offset="0" />
</dataarea>
</part>
</software>
- <software name="chess3db" cloneof="chess3d" supported="no">
+ <software name="chess3da" cloneof="chess3d">
<description>Chess 3D (Alt)</description>
- <year>19??</year>
+ <year>1991</year>
<publisher>Micro Power</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
@@ -584,7 +624,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="chokaway" supported="no">
+ <software name="chokaway">
<description>Chocks Away</description>
<year>1990</year>
<publisher>Fourth Dimension</publisher>
@@ -602,7 +642,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="chokawaya" cloneof="chokaway" supported="no">
+ <software name="chokawaya" cloneof="chokaway">
<description>Chocks Away (Alt)</description>
<year>1990</year>
<publisher>Fourth Dimension</publisher>
@@ -620,9 +660,9 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="chokawayam" cloneof="chokaway" supported="no">
- <description>Chocks Away - Additional Missions</description>
- <year>1990</year>
+ <software name="chokawym">
+ <description>Chocks Away - Extra Missions</description>
+ <year>1991</year>
<publisher>Fourth Dimension</publisher>
<info name="usage" value="Requires &quot;Chocks Away&quot; to work" />
<part name="flop1" interface="floppy_3_5">
@@ -632,7 +672,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="chuckrck" supported="no">
+ <software name="chuckrck">
<description>Chuck Rock</description>
<year>1991</year>
<publisher>Krisalis</publisher>
@@ -650,54 +690,107 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="conquer" supported="no">
+ <software name="conquer">
<description>Conqueror</description>
- <year>19??</year>
- <publisher>Superior Software</publisher>
+ <year>1988</year>
+ <publisher>Superior Software/Acornsoft</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
- <rom name="conqueror (19xx)(-).adf" size="819200" crc="d4935557" sha1="c7a67d2f7b6095581ba3e19139e5f539c7b89109" offset="0" />
+ <rom name="Conqueror (1988)(Superior Software).adf" size="819200" crc="f6fc9510" sha1="baa5dc8148cdca11753ac61f9c73df83f17f4301" offset="0" />
</dataarea>
</part>
</software>
- <software name="conquera" cloneof="conquer" supported="no">
- <description>Conqueror (Alt)</description>
- <year>19??</year>
- <publisher>Superior Software</publisher>
+ <software name="corrupt">
+ <description>Corruption (Bad Dump?)</description>
+ <year>1993</year>
+ <publisher>Magnetic Scrolls</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="814080">
+ <rom name="corruption (19xx)(Magnetic Scrolls)[b].adf" size="814080" crc="2f8ba19c" sha1="7deebf17db394b5ae964324136d91d002a6c4634" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="crysmaze">
+ <description>The Crystal Maze (Demo) (Bad Dump?)</description>
+ <year>1993</year>
+ <publisher>Sherston Software</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
- <rom name="conqueror (19xx)(-)[a].adf" size="819200" crc="f6fc9510" sha1="baa5dc8148cdca11753ac61f9c73df83f17f4301" offset="0" />
+ <rom name="crystal maze, the (demo) (19xx)(sherston)[b].adf" size="819200" crc="ff81bc79" sha1="dc4b2f3543ea3ecf95f9713f27c671d5c83f9c04" offset="0" />
</dataarea>
</part>
</software>
- <software name="corrupt" supported="no">
- <description>Corruption (Bad Dump?)</description>
- <year>19??</year>
- <publisher>Magnetic Scrolls</publisher>
+ <software name="cyberzone">
+ <description>CyberZone</description>
+ <year>1992</year>
+ <publisher>Bytepool</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="814080">
- <rom name="corruption (19xx)(-)[b].adf" size="814080" crc="2f8ba19c" sha1="7deebf17db394b5ae964324136d91d002a6c4634" offset="0" />
+ <dataarea name="flop" size="92160">
+ <rom name="CyberZone (1992)(Uffenkamp Computer Systeme).adf" size="92160" crc="88e13c93" sha1="fac09467abbdfc541634f5881f2474206cb37b45" offset="0"/>
</dataarea>
</part>
</software>
- <software name="crysmaze" supported="no">
- <description>The Crystal Maze (Demo, Bad Dump?)</description>
- <year>19??</year>
- <publisher>Sherston Software</publisher>
+ <software name="cycloids">
+ <description>Cycloids</description>
+ <year>1993</year>
+ <publisher>Software 42</publisher>
<part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="814898">
+ <rom name="Cycloids (1993)(Software 42) [m].apd" size="814898" crc="65f9ddd0" sha1="576e191c85b53cbefe18b08d353f8c4d6b377e08" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="darkwood">
+ <description>Darkwood</description>
+ <year>1995</year>
+ <publisher>Eclipse</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 1"/>
+ <dataarea name="flop" size="535807">
+ <rom name="Darkwood (1995)(Eclipse)(Disk 1 of 6).apd" size="535807" crc="7b837db1" sha1="6e7a2615abe5bbb81ff90f9c15a3bdbdefc68192" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 2"/>
<dataarea name="flop" size="819200">
- <rom name="crystal maze, the (demo) (19xx)(sherston)[b].adf" size="819200" crc="ff81bc79" sha1="dc4b2f3543ea3ecf95f9713f27c671d5c83f9c04" offset="0" />
+ <rom name="Darkwood (1995)(Eclipse)(Disk 2 of 6).adf" size="819200" crc="05fb7e48" sha1="65f14fdcb2a34fc266db8f236cf593d07c25827a" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 3"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Darkwood (1995)(Eclipse)(Disk 3 of 6).adf" size="819200" crc="f1ad67bc" sha1="9d621c35b4d601677095e77284ba895851e1baf2" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 4"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Darkwood (1995)(Eclipse)(Disk 4 of 6).adf" size="819200" crc="763db0e1" sha1="1b8cf79da43d354e0975477c78a03cfc71ec1b61" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 5"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Darkwood (1995)(Eclipse)(Disk 5 of 6).adf" size="819200" crc="c49b9b58" sha1="48cc7e51ed742106a481543d391044faefa8a28f" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 6"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Darkwood (1995)(Eclipse)(Disk 6 of 6).adf" size="819200" crc="591699c9" sha1="29994cca0c2f23ff7da6ed719ae2b5477b38d574" offset="0"/>
</dataarea>
</part>
</software>
- <software name="deeva" supported="no">
+ <software name="deeva">
<description>Deeva</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <year>1990</year>
+ <publisher>Calderglen Computers</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
<rom name="deeva.adf" size="819200" crc="8fc8d8a2" sha1="932e529a7782f8c4288220f9918a1150826fce18" offset="0" />
@@ -705,7 +798,62 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="etype" supported="no">
+ <software name="dune2">
+ <description>Dune II - The Battle for Arrakis</description>
+ <year>1995</year>
+ <publisher>Eclipse</publisher>
+ <info name="usage" value="Protection requires manual" />
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 1"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Dune II - Battle for Arrakis (1995)(Eclipse)(Disk 1 of 8).adf" size="819200" crc="8279a308" sha1="ba0c4a5218b2292ae94b8f2aa0f825cd6019b51b" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 2"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Dune II - Battle for Arrakis (1995)(Eclipse)(Disk 2 of 8).adf" size="819200" crc="314a0da2" sha1="816c1aa3f8848fff6620546189852d86fcad7bbb" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 3"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Dune II - Battle for Arrakis (1995)(Eclipse)(Disk 3 of 8).adf" size="819200" crc="36a9bfd7" sha1="9c050c47138a63ea5cdd17d4974f8a36a370ef6f" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 4"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Dune II - Battle for Arrakis (1995)(Eclipse)(Disk 4 of 8).adf" size="819200" crc="d87a13aa" sha1="d6ead5a025322c4c545269dfd62cdcc2d2e9123a" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 5"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Dune II - Battle for Arrakis (1995)(Eclipse)(Disk 5 of 8).adf" size="819200" crc="d96361c1" sha1="7c60387241ea1b080b01a9ac015d3e4820015ad1" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 6"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Dune II - Battle for Arrakis (1995)(Eclipse)(Disk 6 of 8).adf" size="819200" crc="db57332d" sha1="8fd65c3f8c8f337d56c3b4b2a3e0cca51e473b07" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 7"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Dune II - Battle for Arrakis (1995)(Eclipse)(Disk 7 of 8).adf" size="819200" crc="5cbe020f" sha1="ae5d0e7197a941ed8374917eff8cc9e5383db631" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 8"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Dune II - Battle for Arrakis (1995)(Eclipse)(Disk 8 of 8).adf" size="819200" crc="82a1c535" sha1="13c48d191329a9056c1179e44eeb0d848964cecf" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="etype">
<description>E-Type</description>
<year>1989</year>
<publisher>Fourth Dimension</publisher>
@@ -723,7 +871,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="etypetrk" cloneof="etype" supported="no">
+ <software name="etypetd">
<description>E-Type - Track Designer</description>
<year>1989</year>
<publisher>Fourth Dimension</publisher>
@@ -734,7 +882,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="ego" supported="no">
+ <software name="ego">
<description>EGO: Repton 4</description>
<year>1992</year>
<publisher>ProAction</publisher>
@@ -745,7 +893,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="elite" supported="no">
+ <software name="elite">
<description>Elite</description>
<year>1991</year>
<publisher>Hybrid Technology</publisher>
@@ -756,7 +904,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="elitea" cloneof="elite" supported="no">
+ <software name="elitea" cloneof="elite">
<description>Elite (Alt)</description>
<year>1991</year>
<publisher>Hybrid Technology</publisher>
@@ -767,40 +915,40 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="enigma" supported="no">
- <description>Enigma</description>
- <year>1993</year>
- <publisher>Archimedes World</publisher>
+ <software name="empsoccr94">
+ <description>Empire Soccer 94</description>
+ <year>1995</year>
+ <publisher>Empire</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
- <rom name="enigma (1993)(archimedes world).adf" size="819200" crc="99524aab" sha1="9651d10b2fea745ef9d9e404ee799c351d55239d" offset="0" />
+ <rom name="Empire Soccer 94 (1995)(Empire).adf" size="819200" crc="9fc33348" sha1="b67baf3bca0f5d087a3fd9d493c04ab95a1ec06c" offset="0"/>
</dataarea>
</part>
</software>
- <software name="enigmaa" cloneof="enigma" supported="no">
- <description>Enigma (Alt)</description>
+ <software name="enigma">
+ <description>Enigma</description>
<year>1993</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
- <rom name="enigma (1993)(archimedes world)[a].adf" size="819200" crc="9277d658" sha1="2bdd2d1f53ee5f359f12adb8b20e915d12978de0" offset="0" />
+ <rom name="enigma (1993)(archimedes world).adf" size="819200" crc="99524aab" sha1="9651d10b2fea745ef9d9e404ee799c351d55239d" offset="0" />
</dataarea>
</part>
</software>
- <software name="enigmab" cloneof="enigma" supported="no">
- <description>Enigma (Alt 2)</description>
+ <software name="enigmaa" cloneof="enigma">
+ <description>Enigma (Alt)</description>
<year>1993</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
- <rom name="enigma (1993)(archimedes world)[a2].adf" size="819200" crc="979f5998" sha1="9228630e3858caed9f108b1a35036957d4efa720" offset="0" />
+ <rom name="enigma (1993)(archimedes world)[a].adf" size="819200" crc="9277d658" sha1="2bdd2d1f53ee5f359f12adb8b20e915d12978de0" offset="0" />
</dataarea>
</part>
</software>
- <software name="enthar7" supported="no">
+ <software name="enthar7">
<description>Enthar Seven</description>
<year>1988</year>
<publisher>Robico</publisher>
@@ -811,9 +959,9 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="fervour" supported="no">
+ <software name="fervour">
<description>Fervour (Bad Dump?)</description>
- <year>19??</year>
+ <year>1992</year>
<publisher>Clares Micro Supplies</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
@@ -822,7 +970,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="firebal2" supported="no">
+ <software name="firebal2">
<description>Fireball II</description>
<year>1990</year>
<publisher>CIS</publisher>
@@ -833,8 +981,8 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="firebal2e" cloneof="firebal2" supported="no">
- <description>Fireball II Extra</description>
+ <software name="firebal2e" cloneof="firebal2">
+ <description>Fireball II Xtra</description>
<year>1990</year>
<publisher>CIS</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -844,19 +992,74 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="fish" supported="no">
- <description>Fish</description>
- <year>19??</year>
+ <software name="fireice">
+ <description>Fire &amp; Ice</description>
+ <year>1995</year>
+ <publisher>Krisalis</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Game Disk"/>
+ <dataarea name="flop" size="493403">
+ <rom name="Fire &amp; Ice (1995)(Warner Interactive Entertainment)(Disk 1 of 2).apd" size="493403" crc="f078767d" sha1="0f69d13ba2072f9e3a826ce4efa3b8fa6f77f0b6" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Data Disk"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Fire &amp; Ice (1995)(Warner Interactive Entertainmenr)(Disk 2 of 2).adf" size="819200" crc="29b82548" sha1="b0e24dbde4be0fb9df9d07f6e3f1072d126dd065" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fish">
+ <description>Fish!</description>
+ <year>1990</year>
<publisher>Magnetic Scrolls</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
- <rom name="fish.adf" size="819200" crc="621acc39" sha1="a7c01cf53c43c3c8a6ae13bde0edfb774226c9bc" offset="0" />
+ <rom name="Fish (1990)(Magnetic Scrolls).adf" size="819200" crc="621acc39" sha1="a7c01cf53c43c3c8a6ae13bde0edfb774226c9bc" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="flashbk">
+ <description>Flashback</description>
+ <year>1994</year>
+ <publisher>U.S. Gold</publisher>
+ <info name="usage" value="Protection requires manual" />
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Flashback (1994)(US Gold)(Disk 1 of 6).adf" size="819200" crc="25f92865" sha1="784f2421b626251d6a6eaf76fb4413788f264179" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Flashback (1994)(US Gold)(Disk 2 of 6).adf" size="819200" crc="88f38016" sha1="ea4d71344a1c48d1d77920703828ed476ee127f8" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Flashback (1994)(US Gold)(Disk 3 of 6).adf" size="819200" crc="45d0bcde" sha1="a5262af281bc639d8f890bc0df7cf847bf3b67b5" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Flashback (1994)(US Gold)(Disk 4 of 6).adf" size="819200" crc="8090a1c3" sha1="673188a5afa9b70a95d6235305edcec17003f2bd" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Flashback (1994)(US Gold)(Disk 5 of 6).adf" size="819200" crc="2e9e576e" sha1="4ddc56374eba7bfe79885a79ddf91ddd118099b1" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Flashback (1994)(US Gold)(Disk 6 of 6).adf" size="819200" crc="225b5346" sha1="171f3a7ed4cc68a4d5942b6512e1b25011878c44" offset="0"/>
</dataarea>
</part>
</software>
- <software name="flashbd" supported="no">
- <description>Flashback (v1.0, Demo)</description>
+ <software name="flashbd">
+ <description>Flashback (Demo)</description>
<year>1992</year>
<publisher>U.S. Gold</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -866,8 +1069,55 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="gorm" supported="no">
- <description>Gorm (v1.40)</description>
+ <software name="fredfolly">
+ <description>Freddy's Folly</description>
+ <year>19??</year>
+ <publisher>Minerva</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="FreddysFolly.adf" size="819200" crc="63bb55f4" sha1="63ed769df8b83ee4b97ab05a3121bdf8966c2d68" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ftt">
+ <description>FTT</description>
+ <year>1994</year>
+ <publisher>TBA Software</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk FTT1"/>
+ <dataarea name="flop" size="234117">
+ <rom name="FTT (1994)(TBA Software)(Disk 1 of 2).apd" size="234117" crc="f4a5bb1c" sha1="976c39818fe28964b03d6d3a9962e098c71ffba1" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk FTT2"/>
+ <dataarea name="flop" size="443205">
+ <rom name="FTT (1994)(TBA Software)(Disk 2 of 2).apd" size="443205" crc="e92d2fe6" sha1="c0498df871cccd6598b2c185ce8ab7b9e7b33e63" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gods">
+ <description>Gods</description>
+ <year>1992</year>
+ <publisher>Krisalis</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 1"/>
+ <dataarea name="flop" size="684177">
+ <rom name="Gods (1992)(Krisalis Software)(Disk 1 of 2).apd" size="684177" crc="23d36a1e" sha1="f0e649a4243da86ff7450a78eb90bca9171d7aa9" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 2"/>
+ <dataarea name="flop" size="681223">
+ <rom name="Gods (1992)(Krisalis Software)(Disk 2 of 2).apd" size="681223" crc="b1684199" sha1="2e191cec0b7524b0a035d735f74cfe9aadff2473" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gorm">
+ <description>Gorm</description>
<year>1994</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -877,9 +1127,31 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="guile" supported="no">
+ <software name="gribblys">
+ <description>Gribbly's Day Out on the Arc</description>
+ <year>1992</year>
+ <publisher>Coin-Age</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="485302">
+ <rom name="Gribblys Day Out On the Arc (1992)(Coin-Age).apd" size="485302" crc="c7f27578" sha1="442cc1919b03e6c4959ccf00f37bf3f1319288c8" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="guildthvs">
+ <description>The Guild of Thieves</description>
+ <year>1989</year>
+ <publisher>Magnetic Scrolls</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Guild of Thieves.adf" size="819200" crc="50d40adb" sha1="c53b369d6f26a87c4a718af752f7051bc7a00e0f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="guile">
<description>Guile</description>
- <year>19??</year>
+ <year>199?</year>
<publisher>Dream Software</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
@@ -888,8 +1160,8 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="hamsters" supported="no">
- <description>Hamsters (v1.10, Demo)</description>
+ <software name="hamsters">
+ <description>Hamsters (Demo)</description>
<year>1994</year>
<publisher>Eclipse</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -899,8 +1171,39 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="heroqst" supported="no">
- <description>Hero Quest (Hacked?)</description>
+ <software name="heimdall">
+ <description>Heimdall</description>
+ <year>1993</year>
+ <publisher>Krisalis</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Heimdall (1993)(Krisalis)(Disk 0 of 4).adf" size="819200" crc="a2d638d8" sha1="d2209bc3cf1c8e7d887da4f6a7c37e2712628cae" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Heimdall (1993)(Krisalis)(Disk 1 of 4).adf" size="819200" crc="10355dd8" sha1="d20cf25ed9f08ff08ad017d8f037296a884e7f6b" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Heimdall (1993)(Krisalis)(Disk 2 of 4).adf" size="819200" crc="53522cd6" sha1="a1e80b5fd38d124f2bfa04754731a6dbc01ade1a" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Heimdall (1993)(Krisalis)(Disk 3 of 4).adf" size="819200" crc="63b06f01" sha1="4e6c7d4bd4a0d406e53b557bcf1e75a801110670" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Heimdall (1993)(Krisalis)(Disk 4 of 4).adf" size="819200" crc="7d78079d" sha1="8e2ed146ad713d65ead1a34f05a022af5f45b3ce" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="heroqst">
+ <description>Hero Quest</description>
<year>1991</year>
<publisher>Krisalis</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -910,10 +1213,10 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="hostages" supported="no">
+ <software name="hostages">
<description>Hostages</description>
<year>1990</year>
- <publisher>Superior Software</publisher>
+ <publisher>Superior Software/Acornsoft</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
<rom name="Hostages (Superior Software).adf" size="819200" crc="f42a6fa3" sha1="0c8bce397205bcb3f1d285570086572cd1ca0cc0" offset="0" />
@@ -921,9 +1224,9 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="ibix" supported="no">
+ <software name="ibix">
<description>Ibix the Viking</description>
- <year>19??</year>
+ <year>1992</year>
<publisher>Minerva</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
@@ -932,7 +1235,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="interdc2" supported="no">
+ <software name="interdc2">
<description>Interdictor 2</description>
<year>1989</year>
<publisher>Clares Micro Supplies</publisher>
@@ -943,7 +1246,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="ironlord" supported="no">
+ <software name="ironlord">
<description>Iron Lord</description>
<year>1990</year>
<publisher>Cygnus</publisher>
@@ -954,7 +1257,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="ironlorda" cloneof="ironlord" supported="no">
+ <software name="ironlorda" cloneof="ironlord">
<description>Iron Lord (Alt)</description>
<year>1990</year>
<publisher>Ubi Soft</publisher>
@@ -965,7 +1268,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="ixion" supported="no">
+ <software name="ixion">
<description>Ixion</description>
<year>1992</year>
<publisher>Eclipse</publisher>
@@ -983,7 +1286,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="jpond" supported="no">
+ <software name="jpond">
<description>James Pond</description>
<year>1990</year>
<publisher>Krisalis</publisher>
@@ -994,7 +1297,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="jponda" cloneof="jpond" supported="no">
+ <software name="jponda" cloneof="jpond">
<description>James Pond (Alt)</description>
<year>1990</year>
<publisher>Krisalis</publisher>
@@ -1005,7 +1308,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="jetfight" supported="no">
+ <software name="jetfight">
<description>Jet Fighter</description>
<year>1988</year>
<publisher>Minerva</publisher>
@@ -1016,10 +1319,10 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="kaptkonf" supported="no">
+ <software name="kaptkonf">
<description>Kaptain Konflict</description>
<year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <publisher>Caldergen Computers</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
<rom name="kaptain konflict.adf" size="819200" crc="a0deed65" sha1="b5423e587b8560b67120cf4e666a3c9c5c7655a4" offset="0" />
@@ -1027,10 +1330,26 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="lander" supported="no">
- <description>Lander (Demo?)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="karmaft">
+ <description>Karma: The Flight Trainer</description>
+ <year>1991</year>
+ <publisher>Periscope Software</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Karma_1.adf" size="819200" crc="fa96aad8" sha1="2766b870f9c1366f3a6457c5294771aa54f171bd" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Karma_2.adf" size="819200" crc="d3b837b6" sha1="b5ba834c4c1d3321ca48b94fc6b668783e23a4f0" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lander">
+ <description>Lander (Demo)</description>
+ <year>1987</year>
+ <publisher>Acorn</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
<rom name="lander.adf" size="819200" crc="a9444537" sha1="a627ab8a527210a491f8c6fac88d5e3f4ee1d83e" offset="0" />
@@ -1038,7 +1357,18 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="leedsutd" supported="no">
+ <software name="lastninja">
+ <description>The Last Ninja</description>
+ <year>1992</year>
+ <publisher>Superior Software/Acornsoft</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="475908">
+ <rom name="Last Ninja, The (1992)(Superior Software).apd" size="475908" crc="4abb3792" sha1="3d155d5d1a97408bf132eebc33878138241305c7" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="leedsutd">
<description>Leeds United Champions!</description>
<year>19??</year>
<publisher>CDS</publisher>
@@ -1049,9 +1379,9 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="losttmpl" supported="no">
+ <software name="losttmpl">
<description>Legend of the Lost Temple</description>
- <year>19??</year>
+ <year>1992</year>
<publisher>Eterna</publisher>
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1"/>
@@ -1067,7 +1397,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="lemmings" supported="no">
+ <software name="lemmings">
<description>Lemmings</description>
<year>1991</year>
<publisher>Krisalis</publisher>
@@ -1078,7 +1408,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="lemmingsa" cloneof="lemmings" supported="no">
+ <software name="lemmingsa" cloneof="lemmings">
<description>Lemmings (Alt)</description>
<year>1991</year>
<publisher>Krisalis</publisher>
@@ -1089,7 +1419,48 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mariarti" supported="no">
+ <software name="lemmings2">
+ <description>Lemmings 2 - The Tribes</description>
+ <year>1994</year>
+ <publisher>Krisalis</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Lemmings 2 - The Tribes (1994)(Krisalis)(Disk 1 of 3).adf" size="819200" crc="d2223309" sha1="958c20f61e1d2ee635b0aa99c1b4cfac1fa17c34" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Lemmings 2 - The Tribes (1994)(Krisalis)(Disk 2 of 3).adf" size="819200" crc="731f3902" sha1="1bb8d222aa4f85455f04356d1e8878050ad21dcc" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 3"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Lemmings 2 - The Tribes (1994)(Krisalis)(Disk 3 of 3).adf" size="819200" crc="02905b5e" sha1="5a5e470d8dca51c53e49a9cfc6910a78d0b58081" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_3_5">
+ <feature name="part_id" value="Introduction Disk"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Lemmings 2 - The Tribes (1994)(Krisalis)(Intro Disk).adf" size="819200" crc="6c84d389" sha1="e3e527f4de41989a855bc80b56df0b22cd3dbfeb" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="magpockets">
+ <description>Magic Pockets</description>
+ <year>1993</year>
+ <publisher>Renegade</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="963449">
+ <rom name="Magic Pockets (1993)(Renegade).apd" size="963449" crc="5816357b" sha1="11c32acd481ac9ebc6d522154b94a89e8d3e0f94" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mariarti">
<description>Mad Professor Mariarti</description>
<year>1990</year>
<publisher>Krisalis</publisher>
@@ -1100,7 +1471,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mariartia" cloneof="mariarti" supported="no">
+ <software name="mariartia" cloneof="mariarti">
<description>Mad Professor Mariarti (Alt)</description>
<year>1990</year>
<publisher>Krisalis</publisher>
@@ -1111,7 +1482,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mariartib" cloneof="mariarti" supported="no">
+ <software name="mariartib" cloneof="mariarti">
<description>Mad Professor Mariarti (Alt 2)</description>
<year>1990</year>
<publisher>Krisalis</publisher>
@@ -1122,7 +1493,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="manchutd" supported="no">
+ <software name="manchutd">
<description>Manchester United Europe</description>
<year>1991</year>
<publisher>Krisalis</publisher>
@@ -1133,10 +1504,10 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mastbrek" supported="no">
+ <software name="mastbrek">
<description>Master Break</description>
<year>1989</year>
- <publisher>Superior Software</publisher>
+ <publisher>Superior Software/Acornsoft</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="798720">
<rom name="Master Break (19xx)(Superior Software).adf" size="798720" crc="c956b33b" sha1="219557031bb57a21891f637eb073120befa493fa" offset="0" />
@@ -1144,7 +1515,25 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mig29" supported="no">
+ <software name="microdrv">
+ <description>Microdrive 3D</description>
+ <year>19??</year>
+ <publisher>CIS</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Microdrive 3D"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Microdrive.adf" size="819200" crc="0ae2b344" sha1="672add2e003b2d5fd82d889bbb1acef56f8b988b" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Extra Courses U.S.A."/>
+ <dataarea name="flop" size="819200">
+ <rom name="Microdrive_Extra.adf" size="819200" crc="e6348208" sha1="2f75a01fb54af28646729f06be6ed002e4b237d2" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mig29">
<description>Mig 29 Fulcrum</description>
<year>1991</year>
<publisher>Krisalis</publisher>
@@ -1155,10 +1544,11 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="moonquak" supported="no">
- <description>Moon Quake (Hacked?)</description>
+ <software name="moonquak">
+ <description>Moon Quake</description>
<year>1992</year>
- <publisher>Paul Taylor</publisher>
+ <publisher>Archimedes World</publisher>
+ <info name="author" value="Paul Taylor" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
<rom name="moon quake (1992)(taylor, paul)[h].adf" size="819200" crc="8a9009bb" sha1="2a96d10af75b315a362145cf9c8d4f6404aa8f07" offset="0" />
@@ -1166,7 +1556,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mrdoo" supported="no">
+ <software name="mrdoo">
<description>Mr. Doo</description>
<year>1994</year>
<publisher>Archimedes World</publisher>
@@ -1177,7 +1567,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mrdooa" cloneof="mrdoo" supported="no">
+ <software name="mrdooa" cloneof="mrdoo">
<description>Mr. Doo (Alt)</description>
<year>1994</year>
<publisher>Archimedes World</publisher>
@@ -1188,7 +1578,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="nebulus" supported="no">
+ <software name="nebulus">
<description>Nebulus</description>
<year>1992</year>
<publisher>Krisalis</publisher>
@@ -1199,7 +1589,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="oddball" supported="no">
+ <software name="oddball">
<description>Oddball</description>
<year>1995</year>
<publisher>Digital Psychosis</publisher>
@@ -1210,7 +1600,18 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="morelemm" supported="no">
+ <software name="minotaur">
+ <description>Minotaur</description>
+ <year>1988</year>
+ <publisher>Minerva</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Minotaur.adf" size="819200" crc="7e0d2aac" sha1="261bdb8c8b56cd25202d540efd502ed53d830318" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="morelemm">
<description>Oh, No! More Lemmings!</description>
<year>1992</year>
<publisher>Krisalis</publisher>
@@ -1221,7 +1622,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="morelemma" cloneof="morelemm" supported="no">
+ <software name="morelemma" cloneof="morelemm">
<description>Oh, No! More Lemmings! (Alt)</description>
<year>1992</year>
<publisher>Krisalis</publisher>
@@ -1232,7 +1633,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="pacmania" supported="no">
+ <software name="pacmania">
<description>Pac-Mania</description>
<year>1991</year>
<publisher>Domark</publisher>
@@ -1243,7 +1644,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="paradr2k" supported="no">
+ <software name="paradr2k">
<description>Paradroid 2000</description>
<year>1993</year>
<publisher>Coin-Age</publisher>
@@ -1254,7 +1655,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="paradr2ka" cloneof="paradr2k" supported="no">
+ <software name="paradr2ka" cloneof="paradr2k">
<description>Paradroid 2000 (Alt)</description>
<year>1993</year>
<publisher>Coin-Age</publisher>
@@ -1265,7 +1666,25 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="pipmania" supported="no">
+ <software name="pias3">
+ <description>Play It Again Sam 3</description>
+ <year>1993</year>
+ <publisher>Superior Software/Acornsoft</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 1"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Play It Again Sam 3 - Disc 1 (1993)(Superior Software).adf" size="819200" crc="d69ff5e6" sha1="416b4b013012115f4ab235b4454d1d7788c6f376" offset="0" />
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 2"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Play It Again Sam 3 - Disc 2 (1993)(Superior Software).adf" size="819200" crc="5be128ae" sha1="8011ee840d5ef371b5c1964c315df3c0fa66e758" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pipmania">
<description>Pipe Mania</description>
<year>1988</year>
<publisher>Empire</publisher>
@@ -1276,9 +1695,9 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="poizone" supported="no">
+ <software name="poizone">
<description>Poizone</description>
- <year>19??</year>
+ <year>1991</year>
<publisher>Eterna</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="815104">
@@ -1287,29 +1706,62 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="populous" supported="no">
+ <software name="populous">
<description>Populous</description>
- <year>1989</year>
+ <year>1992</year>
<publisher>Krisalis</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="814080">
- <rom name="populous (1989)(bullfrog).adf" size="814080" crc="85fd411d" sha1="00b5723f7838fd4562b6d9c1c39f2ca9b17cecae" offset="0" />
+ <dataarea name="flop" size="574595">
+ <rom name="Populous (1992)(Krisalis).apd" size="574595" crc="b4a70f0b" sha1="9f90ff345a169893745f1c620bf648b3d06161a9" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="premmngr">
+ <description>Premier Manager</description>
+ <year>1994</year>
+ <publisher>Gremlin</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="638749">
+ <rom name="Premier Manager (1993)(Gremlin).apd" size="638749" crc="bf2c7af6" sha1="610090dc0a65ee968275122af545f48015fa4bb4" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="quazer">
+ <description>Quazer</description>
+ <year>1988</year>
+ <publisher>Impact Software</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Quazer (Impact).adf" size="819200" crc="2be098ca" sha1="f1a80a6d382f3416656f2c5150bc67e2326f28fb" offset="0"/>
</dataarea>
</part>
</software>
- <software name="repton3" supported="no">
+ <software name="repton3">
<description>Repton 3</description>
<year>1988</year>
- <publisher>ProAction</publisher>
+ <publisher>Superior Software/Acornsoft</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="308806">
+ <rom name="Repton 3 (1988)(Superior Software).apd" size="308806" crc="849770ea" sha1="87b4616e00c5577fd8e0702c094d11a657ecee62" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="revelatn">
+ <description>Revelation</description>
+ <year>1992</year>
+ <publisher>Krisalis</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
- <rom name="repton 3 (1988)(superior software).adf" size="819200" crc="619c1446" sha1="cc6acf8b65204c314b7e2c8dc764482c7fbd9218" offset="0" />
+ <rom name="Revelation (1992)(Krisalis).adf" size="819200" crc="993e4c34" sha1="2758a23bbe6282700e0c3fb4bf9375892fee54e3" offset="0"/>
</dataarea>
</part>
</software>
- <software name="revolver" supported="no">
+ <software name="revolver">
<description>Revolver</description>
<year>19??</year>
<publisher>Psycore</publisher>
@@ -1320,7 +1772,69 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="simcity" supported="no">
+ <software name="risecrime">
+ <description>Rise In Crime</description>
+ <year>1988</year>
+ <publisher>Robico</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="RiseInCrime (Robico).adf" size="819200" crc="6d9a76d5" sha1="0c14a9bbc6f4cdad47d4429ca4b33c55cc68b8fc" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rotor">
+ <description>Rotor</description>
+ <year>1989</year>
+ <publisher>Arcana</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Rotor (Arcana).adf" size="819200" crc="bdce2e4e" sha1="06122f33f5e3891020fd635803cf3c66159b9630" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rotoros3" cloneof="rotor">
+ <description>Rotor (Patched RiscOS3)</description>
+ <year>1989</year>
+ <publisher>Arcana</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Rotor_ROS3 (Arcana).ADF" size="819200" crc="11d8b871" sha1="70c6bfaac3558438319bba62e45104a6f4a50382" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sensoccr">
+ <description>Sensible Soccer</description>
+ <year>1993</year>
+ <publisher>Renegade</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 1"/>
+ <dataarea name="flop" size="354504">
+ <rom name="Sensible Soccer (1993)(Renegade)(Disk 1 of 2).apd" size="354504" crc="710647b2" sha1="892e93b7bfeb7790c8a24cabd3585fc564faa6b2" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disk 2"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Sensible Soccer (1993)(Renegade)(Disk 2 of 2).adf" size="819200" crc="16e890d8" sha1="57e87e43c0f0e7a139ddca2ec2152dd0af46bebb" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="serpents">
+ <description>Serpents</description>
+ <year>1993</year>
+ <publisher>CIS</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Serpents (1993)(CIS).adf" size="819200" crc="808300a9" sha1="b035e0105d4a1a8201af2d9448dd6e6bd87231af" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="simcity">
<description>Sim City</description>
<year>1993</year>
<publisher>Krisalis</publisher>
@@ -1331,7 +1845,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="simonsor" supported="no">
+ <software name="simonsor">
<description>Simon the Sorcerer</description>
<year>1994</year>
<publisher>Gamesware</publisher>
@@ -1397,21 +1911,21 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="small" supported="no">
+ <software name="small">
<description>Small</description>
- <year>19??</year>
+ <year>1993</year>
<publisher>Virgo Software</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
- <rom name="small.adf" size="819200" crc="de79f51d" sha1="24db6ffb82e8e82262fe99ef55774a692569a8c8" offset="0" />
+ <rom name="Small (1993)(Virgo).adf" size="819200" crc="de79f51d" sha1="24db6ffb82e8e82262fe99ef55774a692569a8c8" offset="0" />
</dataarea>
</part>
</software>
- <software name="speech" supported="no">
+ <software name="speech">
<description>Speech!</description>
<year>1991</year>
- <publisher>Superior Software</publisher>
+ <publisher>Superior Software/Acornsoft</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="337920">
<rom name="Speech! v1.3 (1991)(Superior Software).adf" size="337920" crc="afa0caf6" sha1="6bf70e521a803c00665d9402e484ada5decc80dd" offset="0" />
@@ -1419,7 +1933,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="speedbl2" supported="no">
+ <software name="speedbl2">
<description>Speedball 2 - Brutal Deluxe</description>
<year>1992</year>
<publisher>Krisalis</publisher>
@@ -1430,7 +1944,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="speedbl2a" cloneof="speedbl2" supported="no">
+ <software name="speedbl2a" cloneof="speedbl2">
<description>Speedball 2 - Brutal Deluxe (Alt)</description>
<year>1992</year>
<publisher>Krisalis</publisher>
@@ -1441,8 +1955,8 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="spheres" supported="no">
- <description>Spheres of Chaos</description>
+ <software name="spheres">
+ <description>Spheres of Chaos (Demo)</description>
<year>1992</year>
<publisher>Matt Black</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1452,8 +1966,8 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="spheresa" cloneof="spheres" supported="no">
- <description>Spheres of Chaos (Alt)</description>
+ <software name="spheresa" cloneof="spheres">
+ <description>Spheres of Chaos (Demo)(Alt)</description>
<year>1992</year>
<publisher>Matt Black</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1463,29 +1977,18 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="spheresb" cloneof="spheres" supported="no">
- <description>Spheres of Chaos (Alt 2)</description>
- <year>1992</year>
- <publisher>Matt Black</publisher>
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="819200">
- <rom name="spheres of chaos (1992)(black, matt - mcleod, iain)[a2].adf" size="819200" crc="24683c11" sha1="afbab8e7d2512c0d8f217f016ed8aabc53342689" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="spheresc" cloneof="spheres" supported="no">
- <description>Spheres of Chaos (Alt 3)</description>
- <year>1992</year>
+ <software name="spheresc">
+ <description>Spheres of Chaos</description>
+ <year>1993</year>
<publisher>Matt Black</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
- <rom name="spheres of chaos (1992)(black, matt - mcleod, iain)[a3].adf" size="819200" crc="1490e86a" sha1="eadf13055748205061b82fe008e971c7769c999f" offset="0" />
+ <rom name="spheres of chaos (1993)(black, matt - mcleod, iain).adf" size="819200" crc="1490e86a" sha1="eadf13055748205061b82fe008e971c7769c999f" offset="0" />
</dataarea>
</part>
</software>
- <software name="starf3k" supported="no">
+ <software name="starf3k">
<description>Star Fighter 3000</description>
<year>1994</year>
<publisher>Fednet</publisher>
@@ -1496,7 +1999,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="starch" supported="no">
+ <software name="starch">
<description>Starch</description>
<year>1990</year>
<publisher>Archimedes World</publisher>
@@ -1507,7 +2010,18 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="stuntr2k" supported="no">
+ <software name="startrdr">
+ <description>StarTrader</description>
+ <year>1988</year>
+ <publisher>Gem Electronics</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Startrader.adf" size="819200" crc="7ba280cd" sha1="3022e18d47ed0fc14b09c18caff3fc0ac1f4edff" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="stuntr2k">
<description>Stunt Racer 2000 (Disk 2 Only)</description>
<year>19??</year>
<publisher>Fourth Dimension</publisher>
@@ -1518,7 +2032,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="suprpool" supported="no">
+ <software name="suprpool">
<description>Super Pool</description>
<year>1991</year>
<publisher>Fourth Dimension</publisher>
@@ -1529,7 +2043,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="suprpoola" cloneof="suprpool" supported="no">
+ <software name="suprpoola" cloneof="suprpool">
<description>Super Pool (Alt)</description>
<year>1991</year>
<publisher>Fourth Dimension</publisher>
@@ -1540,7 +2054,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="suprpoolb" cloneof="suprpool" supported="no">
+ <software name="suprpoolb" cloneof="suprpool">
<description>Super Pool (Alt 2)</description>
<year>1991</year>
<publisher>Fourth Dimension</publisher>
@@ -1551,32 +2065,10 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="suprdsk1" supported="no">
- <description>Superior Disk 1</description>
- <year>1993</year>
- <publisher>Superior Software</publisher>
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="819200">
- <rom name="superior disk 1 (1993)(superior software).adf" size="819200" crc="d69ff5e6" sha1="416b4b013012115f4ab235b4454d1d7788c6f376" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="suprdsk2" supported="no">
- <description>Superior Disk 2</description>
- <year>1993</year>
- <publisher>Superior Software</publisher>
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="819200">
- <rom name="superior disk 2 (1993)(superior software).adf" size="819200" crc="5be128ae" sha1="8011ee840d5ef371b5c1964c315df3c0fa66e758" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="suprgolf" supported="no">
+ <software name="suprgolf">
<description>Superior Golf</description>
<year>1990</year>
- <publisher>Superior Software</publisher>
+ <publisher>Superior Software/Acornsoft</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="808960">
<rom name="superior golf (1990)(superior software).adf" size="808960" crc="10b5e57e" sha1="38206d1449478f218e1e1e3567594cd143c42c62" offset="0" />
@@ -1584,7 +2076,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="swiv" supported="no">
+ <software name="swiv">
<description>SWIV</description>
<year>1992</year>
<publisher>Krisalis</publisher>
@@ -1595,7 +2087,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="talisman" supported="no">
+ <software name="talisman">
<description>Talisman</description>
<year>1989</year>
<publisher>Minerva</publisher>
@@ -1606,7 +2098,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="talismana" cloneof="talisman" supported="no">
+ <software name="talismana" cloneof="talisman">
<description>Talisman (Alt)</description>
<year>1989</year>
<publisher>Minerva</publisher>
@@ -1617,7 +2109,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="terramex" supported="no">
+ <software name="terramex">
<description>Terramex</description>
<year>1988</year>
<publisher>Krisalis</publisher>
@@ -1628,7 +2120,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="terramexa" cloneof="terramex" supported="no">
+ <software name="terramexa" cloneof="terramex">
<description>Terramex (Alt)</description>
<year>1988</year>
<publisher>Krisalis</publisher>
@@ -1639,7 +2131,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="topbanan" supported="no">
+ <software name="topbanan">
<description>Top Banana</description>
<year>19??</year>
<publisher>Psycore</publisher>
@@ -1650,7 +2142,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="topbanana" cloneof="topbanan" supported="no">
+ <software name="topbanana" cloneof="topbanan">
<description>Top Banana (Alt)</description>
<year>19??</year>
<publisher>Psycore</publisher>
@@ -1661,7 +2153,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="towbabel" supported="no">
+ <software name="towbabel">
<description>Tower of Babel</description>
<year>1991</year>
<publisher>Cygnus</publisher>
@@ -1672,7 +2164,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="trivial" supported="no">
+ <software name="trivial">
<description>Trivial Pursuit</description>
<year>1989</year>
<publisher>Domark</publisher>
@@ -1683,7 +2175,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="twinwrld" supported="no">
+ <software name="twinwrld">
<description>Twin World</description>
<year>1991</year>
<publisher>Cygnus</publisher>
@@ -1694,7 +2186,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="twinwrlda" cloneof="twinwrld" supported="no">
+ <software name="twinwrlda" cloneof="twinwrld">
<description>Twin World (Alt)</description>
<year>1991</year>
<publisher>Cygnus</publisher>
@@ -1705,7 +2197,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="warlocks" supported="no">
+ <software name="warlocks">
<description>Warlocks (Demo, Bad Dump?)</description>
<year>1993</year>
<publisher>Davyn</publisher>
@@ -1716,7 +2208,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="whitemag" supported="no">
+ <software name="whitemag">
<description>White Magic</description>
<year>1989</year>
<publisher>Fourth Dimension</publisher>
@@ -1727,7 +2219,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="whitema2" supported="no">
+ <software name="whitema2">
<description>White Magic 2</description>
<year>1989</year>
<publisher>Fourth Dimension</publisher>
@@ -1738,7 +2230,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="wimpgame" supported="no">
+ <software name="wimpgame">
<description>The Wimp Game</description>
<year>1990</year>
<publisher>Fourth Dimension</publisher>
@@ -1749,8 +2241,8 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="wolf3d" supported="no">
- <description>Wolfenstein 3D (v1.00, Bad Dump?)</description>
+ <software name="wolf3d">
+ <description>Wolfenstein 3D</description>
<year>1994</year>
<publisher>Powerslave Software</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1773,8 +2265,19 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="worldbox" supported="no">
- <description>World Championship Boxing Manager (v3.0)</description>
+ <software name="wordupdn">
+ <description>Word Up Word Down</description>
+ <year>1988</year>
+ <publisher>Gem Electronics</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="WordUpWordDown.adf" size="819200" crc="952d4223" sha1="2a65460f752df69979dc10b6929176bdf6462f36" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="worldbox">
+ <description>World Championship Boxing Manager</description>
<year>1991</year>
<publisher>Krisalis</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1784,7 +2287,29 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="zool" supported="no">
+ <software name="wcleaderb">
+ <description>World Class Leaderboard</description>
+ <year>1993</year>
+ <publisher>Krisalis</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="273337">
+ <rom name="World Class Leaderboard (1993)(Krisalis).apd" size="273337" crc="a61aec90" sha1="48eb438d99480814258cfbcfae4b7bf52c6b0dbe" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zarch">
+ <description>Zarch</description>
+ <year>1987</year>
+ <publisher>Superior Software/Acornsoft</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="332598">
+ <rom name="Zarch (1987)(Superior Software).apd" size="332598" crc="052c6a08" sha1="1acddc24bda274a747ea22f1b39b483b4cdef252" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zool">
<description>Zool</description>
<year>1993</year>
<publisher>Gremlin</publisher>
@@ -1805,7 +2330,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<!-- Other disks to sort (homebrew?!?) -->
- <software name="3dtanks" supported="no">
+ <software name="3dtanks">
<description>3D Tanks</description>
<year>19??</year>
<publisher>&lt;homebrew&gt;</publisher>
@@ -1816,9 +2341,9 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="amoria" supported="no">
- <description>Amoria</description>
- <year>19??</year>
+ <software name="amoria">
+ <description>Arc Moria</description>
+ <year>199?</year>
<publisher>&lt;homebrew&gt;</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
@@ -1827,21 +2352,10 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="moria" supported="no">
- <description>Archimedes Moria</description>
- <year>19??</year>
- <publisher>&lt;homebrew&gt;</publisher>
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="819200">
- <rom name="archimedes moria (19xx)(-).adf" size="819200" crc="e855d09d" sha1="5ae480ff4765575e5fac504e25daeb885a41228d" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="arcomini" supported="no">
- <description>Arcomini (Bad Dump?)</description>
+ <software name="arcomini">
+ <description>ArcOmnibus (Bad Dump?)</description>
<year>1990</year>
- <publisher>&lt;homebrew&gt;</publisher>
+ <publisher>RISC Developments</publisher>
<info name="author" value="Fairbrother" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
@@ -1850,10 +2364,10 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="arcomni" supported="no">
+ <software name="arcomni">
<description>ArcOmnibus (v1.03)</description>
<year>19??</year>
- <publisher>&lt;homebrew&gt;</publisher>
+ <publisher>RISC Developments</publisher>
<info name="author" value="Beebug" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
@@ -1862,10 +2376,10 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="arcomnia" cloneof="arcomni" supported="no">
+ <software name="arcomnia" cloneof="arcomni">
<description>ArcOmnibus (v1.03, Alt)</description>
<year>19??</year>
- <publisher>&lt;homebrew&gt;</publisher>
+ <publisher>RISC Developments</publisher>
<info name="author" value="Beebug" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
@@ -1874,8 +2388,8 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="bloxed" supported="no">
- <description>Bloxed (Hacked?)</description>
+ <software name="bloxed">
+ <description>Bloxed</description>
<year>1995</year>
<publisher>&lt;homebrew&gt;</publisher>
<info name="author" value="Steven Singer" />
@@ -1886,7 +2400,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="blackhrt" supported="no">
+ <software name="blackhrt">
<description>Castle Black Heart</description>
<year>1991</year>
<publisher>&lt;homebrew&gt;</publisher>
@@ -1898,7 +2412,18 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="cheats1" supported="no">
+ <software name="bluethndr">
+ <description>Blue Thunder</description>
+ <year>199?</year>
+ <publisher>&lt;homebrew&gt;</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Blue Thunder.adf" size="819200" crc="501dc7ec" sha1="4bd9c317df89246b38b398beddab365b82ca7cc8" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cheats1">
<description>Cheats 1</description>
<year>19??</year>
<publisher>&lt;homebrew&gt;</publisher>
@@ -1909,8 +2434,8 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="colourum" supported="no">
- <description>Colour Umoria (v5.4.0)</description>
+ <software name="colourum">
+ <description>Colour UMoria (v5.4.0)</description>
<year>1992</year>
<publisher>&lt;homebrew&gt;</publisher>
<info name="author" value="Edouard Poor" />
@@ -1921,8 +2446,8 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="corewars" supported="no">
- <description>Corewars</description>
+ <software name="corewars">
+ <description>Core Wars</description>
<year>19??</year>
<publisher>&lt;homebrew&gt;</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1932,7 +2457,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="creepie" supported="no">
+ <software name="creepie">
<description>Creepie Crawlie 1 &amp; 2</description>
<year>19??</year>
<publisher>&lt;homebrew&gt;</publisher>
@@ -1945,7 +2470,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</software>
- <software name="crytond" supported="no">
+ <software name="crytond">
<description>Cryton Demo (Bad Dump?)</description>
<year>1989</year>
<publisher>&lt;homebrew&gt;</publisher>
@@ -1957,8 +2482,8 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="deskhack" supported="no">
- <description>Desktop Hacker (v1.01)</description>
+ <software name="deskhack">
+ <description>Desktop Hacker</description>
<year>1994</year>
<publisher>DoggySoft</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -1968,9 +2493,9 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="dinosaw" supported="no">
+ <software name="dinosaw">
<description>DinoSaw PD</description>
- <year>19??</year>
+ <year>1993</year>
<publisher>&lt;homebrew&gt;</publisher>
<info name="author" value="Tom Cooper" />
<part name="flop1" interface="floppy_3_5">
@@ -1980,9 +2505,9 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="fruitz" supported="no">
+ <software name="fruitz">
<description>Fruitz</description>
- <year>19??</year>
+ <year>1997</year>
<publisher>Digital Fantasy</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
@@ -1991,7 +2516,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="gyrinus2" supported="no">
+ <software name="gyrinus2">
<description>Gyrinus II - Son of Gyrinus</description>
<year>19??</year>
<publisher>&lt;homebrew&gt;</publisher>
@@ -2010,11 +2535,10 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="hacker" supported="no">
- <description>The Hacker (v3.05)</description>
+ <software name="hacker">
+ <description>The Hacker</description>
<year>1993</year>
- <publisher>&lt;homebrew&gt;</publisher>
- <info name="author" value="DoggySoft" />
+ <publisher>DoggySoft</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
<rom name="hacker, the v3.05 (1993)(doggysoft).adf" size="819200" crc="b208c218" sha1="bed95cbefaa86a2b8d6d87cf3a6cf1f3d1e9808d" offset="0" />
@@ -2022,11 +2546,10 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="hackera" cloneof="hacker" supported="no">
- <description>The Hacker (v3.05, Alt)</description>
+ <software name="hackera" cloneof="hacker">
+ <description>The Hacker (Alt)</description>
<year>1993</year>
- <publisher>&lt;homebrew&gt;</publisher>
- <info name="author" value="DoggySoft" />
+ <publisher>DoggySoft</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
<rom name="hacker, the v3.05 (1993)(doggysoft)[a].adf" size="819200" crc="c6a88514" sha1="b02d6495f6a9a1099cb06cac7d0e0d1756f175a0" offset="0" />
@@ -2034,19 +2557,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="hackerb" cloneof="hacker" supported="no">
- <description>The Hacker (v3.05, Alt 2)</description>
- <year>1993</year>
- <publisher>&lt;homebrew&gt;</publisher>
- <info name="author" value="DoggySoft" />
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="819200">
- <rom name="hacker, the v3.05 (1993)(doggysoft)[a2].adf" size="819200" crc="12864add" sha1="8dcc0c2d7074e62d34eb0727d5d4e484117be496" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="maddash2" supported="no">
+ <software name="maddash2">
<description>MadDash 2</description>
<year>2001</year>
<publisher>&lt;homebrew&gt;</publisher>
@@ -2058,7 +2569,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="marvello" supported="no">
+ <software name="marvello">
<description>My Marvellous Demo</description>
<year>1991</year>
<publisher>&lt;homebrew&gt;</publisher>
@@ -2070,8 +2581,8 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="pdleming" supported="no">
- <description>PD Lemings</description>
+ <software name="lemings">
+ <description>Lemings</description>
<year>19??</year>
<publisher>&lt;homebrew&gt;</publisher>
<info name="author" value="Tom Cooper" />
@@ -2082,7 +2593,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="puntpred" supported="no">
+ <software name="puntpred">
<description>The Punters Predictor</description>
<year>19??</year>
<publisher>&lt;homebrew&gt;</publisher>
@@ -2093,7 +2604,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="riscdrm" supported="no">
+ <software name="riscdrm">
<description>RiscDream</description>
<year>1991</year>
<publisher>&lt;homebrew&gt;</publisher>
@@ -2105,7 +2616,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="gyrinus" supported="no">
+ <software name="gyrinus">
<description>Son of Gyrinus</description>
<year>19??</year>
<publisher>&lt;homebrew&gt;</publisher>
@@ -2124,7 +2635,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="gyrinusa" cloneof="gyrinus" supported="no">
+ <software name="gyrinusa" cloneof="gyrinus">
<description>Son of Gyrinus (Alt)</description>
<year>19??</year>
<publisher>&lt;homebrew&gt;</publisher>
@@ -2143,7 +2654,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="sysintd" supported="no">
+ <software name="sysintd">
<description>System Interrupt Demos 1-5</description>
<year>1989</year>
<publisher>&lt;homebrew&gt;</publisher>
@@ -2155,18 +2666,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="tcddemo" supported="no">
- <description>TCD Demo (Bad Dump?)</description>
- <year>19??</year>
- <publisher>&lt;homebrew&gt;</publisher>
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="226628">
- <rom name="tcd demo (19xx)(-)[b].adf" size="226628" crc="c8721c48" sha1="6b868d83acdeba3a9814161720dbd181ab29f271" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="timezone" supported="no">
+ <software name="timezone">
<description>Time Zone</description>
<year>19??</year>
<publisher>&lt;homebrew&gt;</publisher>
@@ -2178,8 +2678,8 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="coconizr" supported="no">
- <description>Coconizer (v1.3)</description>
+ <software name="coconizr">
+ <description>Coconizer</description>
<year>1990</year>
<publisher>Playfield</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2189,7 +2689,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="hdformat" supported="no">
+ <software name="hdformat">
<description>Hard Disc Formatter v2.19</description>
<year>1992</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2200,7 +2700,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="pcfs" supported="no">
+ <software name="pcfs">
<description>PCFS v1.0</description>
<year>1999</year>
<publisher>Chris-O</publisher>
@@ -2211,9 +2711,9 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="specemu" supported="no">
- <description>Spectrum Emulator</description>
- <year>19??</year>
+ <software name="specemu">
+ <description>Speculator</description>
+ <year>199?</year>
<publisher>&lt;unknown&gt;</publisher>
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1"/>
@@ -2229,7 +2729,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="vzap" supported="no">
+ <software name="vzap">
<description>VZap</description>
<year>2000</year>
<publisher>Digital Phenomena</publisher>
@@ -2240,22 +2740,21 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="virusscn" supported="no">
- <description>Virus Scanner Compilation</description>
- <year>199?</year>
- <publisher>&lt;unknown&gt;</publisher>
+ <software name="virusscn">
+ <description>Eradicate</description>
+ <year>1995</year>
+ <publisher>Applied Software Solutions</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="814080">
- <rom name="virus scanner compilation (199x)(-).adf" size="814080" crc="9ff9c3d9" sha1="be20fbad0de22405dafce0aa5cc5d15af1b49b21" offset="0" />
+ <rom name="Virus Scan v1.38 (1995)(Eradicate).adf" size="814080" crc="9ff9c3d9" sha1="be20fbad0de22405dafce0aa5cc5d15af1b49b21" offset="0" />
</dataarea>
</part>
</software>
-
<!-- Compilations -->
- <software name="mprg01" supported="no">
+ <software name="mprg01">
<description>Multi-Program 01</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2266,18 +2765,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mprg01a" cloneof="mprg01" supported="no">
- <description>Multi-Program 01 (Alt)</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="808960">
- <rom name="multi-program 01 (19xx)(-)[a].adf" size="808960" crc="64d7b15b" sha1="5c6fff2812f3c5657fac111f0d3b61cd52ac50bc" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="mprg02" supported="no">
+ <software name="mprg02">
<description>Multi-Program 02</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2288,7 +2776,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mprg02a" cloneof="mprg02" supported="no">
+ <software name="mprg02a" cloneof="mprg02">
<description>Multi-Program 02 (Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2299,7 +2787,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mprg03" supported="no">
+ <software name="mprg03">
<description>Multi-Program 03</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2310,7 +2798,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mprg04" supported="no">
+ <software name="mprg04">
<description>Multi-Program 04</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2321,7 +2809,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mprg05" supported="no">
+ <software name="mprg05">
<description>Multi-Program 05</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2332,7 +2820,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mprg06" supported="no">
+ <software name="mprg06">
<description>Multi-Program 06</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2343,7 +2831,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mprg07" supported="no">
+ <software name="mprg07">
<description>Multi-Program 07</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2354,7 +2842,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mprg08" supported="no">
+ <software name="mprg08">
<description>Multi-Program 08</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2365,7 +2853,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mprg09" supported="no">
+ <software name="mprg09">
<description>Multi-Program 09</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2376,7 +2864,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mprg10" supported="no">
+ <software name="mprg10">
<description>Multi-Program 10</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2387,7 +2875,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mprg11" supported="no">
+ <software name="mprg11">
<description>Multi-Program 11</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2398,7 +2886,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mprg12" supported="no">
+ <software name="mprg12">
<description>Multi-Program 12</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2409,7 +2897,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mprg13" supported="no">
+ <software name="mprg13">
<description>Multi-Program 13</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2420,7 +2908,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mprg13a" cloneof="mprg13" supported="no">
+ <software name="mprg13a" cloneof="mprg13">
<description>Multi-Program 13 (Alt)</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2432,7 +2920,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mprg14" supported="no">
+ <software name="mprg14">
<description>Multi-Program 14</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2443,7 +2931,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mprg15" supported="no">
+ <software name="mprg15">
<description>Multi-Program 15</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2454,7 +2942,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mprg16" supported="no">
+ <software name="mprg16">
<description>Multi-Program 16</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2465,7 +2953,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mprg17" supported="no">
+ <software name="mprg17">
<description>Multi-Program 17</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2476,7 +2964,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mprg18" supported="no">
+ <software name="mprg18">
<description>Multi-Program 18</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2487,7 +2975,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mprg19" supported="no">
+ <software name="mprg19">
<description>Multi-Program 19</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2498,7 +2986,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mprg20" supported="no">
+ <software name="mprg20">
<description>Multi-Program 20</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2509,7 +2997,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mprg21" supported="no">
+ <software name="mprg21">
<description>Multi-Program 21</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2520,7 +3008,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mprg22" supported="no">
+ <software name="mprg22">
<description>Multi-Program 22</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2531,7 +3019,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mprg23" supported="no">
+ <software name="mprg23">
<description>Multi-Program 23</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2542,7 +3030,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mprg24" supported="no">
+ <software name="mprg24">
<description>Multi-Program 24</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2553,7 +3041,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mprg25" supported="no">
+ <software name="mprg25">
<description>Multi-Program 25</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2564,7 +3052,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mprg26" supported="no">
+ <software name="mprg26">
<description>Multi-Program 26</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2575,7 +3063,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="tools01a" supported="no">
+ <software name="tools01a">
<description>Tools01</description>
<year>19??</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -2586,21 +3074,10 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="tools02a" supported="no">
- <description>Tools02</description>
- <year>19??</year>
- <publisher>&lt;unknown&gt;</publisher>
- <part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="819200">
- <rom name="tools02.adf" size="819200" crc="9d13affa" sha1="ca2edab7a9708ebf8cba80abc97b245de1fa20f4" offset="0" />
- </dataarea>
- </part>
- </software>
-
<!-- Business -->
- <software name="1stwordp" supported="no">
+ <software name="1stwordp">
<description>1st Word Plus (Release 2)</description>
<year>1989</year>
<publisher>Acorn</publisher>
@@ -2612,7 +3089,49 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="acorndtp" supported="no">
+ <software name="advance">
+ <description>Advance</description>
+ <year>1994</year>
+ <publisher>Acorn</publisher>
+ <info name="release" value="SKB77" />
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Program Disc 1"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Advance Program disc 1 (Acorn).adf" size="819200" crc="ef02cda5" sha1="a4cb272e2f77e85b852611383d0492a0015cd032" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Program Disc 2"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Advance Program disc 2 (Acorn).adf" size="819200" crc="626977b7" sha1="76cfcdffb1cc99df49af08f15130568ccb81d34a" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <feature name="part_id" value="Data Disc A"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Advance Data disc A (Acorn).adf" size="819200" crc="d3aadb3b" sha1="13054f84f6868903bc9393e437c1f5276da1a4c5" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_3_5">
+ <feature name="part_id" value="Data Disc B"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Advance Data disc B (Acorn).adf" size="819200" crc="1494214b" sha1="be7932e7390e17dffcd53b3842c7377b23733a94" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="advntage">
+ <description>Advantage</description>
+ <year>199?</year>
+ <publisher>Longman Logotron</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Advantage(Logotron).adf" size="819200" crc="d35e305f" sha1="88f3c68e8ad972479f37a727e931ec12f1917e04" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="acorndtp">
<description>Acorn Desktop Publisher</description>
<year>1989</year>
<publisher>Acorn</publisher>
@@ -2631,7 +3150,189 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="euclid" supported="no">
+ <software name="ancesty2">
+ <description>Ancestry II</description>
+ <year>1994</year>
+ <publisher>Minerva</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Ancestry 2(1994)(Minerva).adf" size="819200" crc="8ec714fe" sha1="8a6d280a1dace3f751c47b45ecd2c6b636380d96" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="artisan">
+ <description>Artisan</description>
+ <year>1987</year>
+ <publisher>Clares Micro Supplies</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Artisan(1987)(Clares).adf" size="819200" crc="704b5820" sha1="f61b9e5c0096c0fdc5aa36288e80b287b65f7a1b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="arcassem">
+ <description>Archimedes Assembly Language</description>
+ <year>1988</year>
+ <publisher>Dabhand Computing</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Archimedes Assembly Language(Dabhand).adf" size="819200" crc="a4d766c3" sha1="b76add641e9738875f8bea00b6eb6c7dbaa52e99" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="arcopsys">
+ <description>Archimedes Operating System</description>
+ <year>1989</year>
+ <publisher>Dabhand Computing</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Archimedes Operating System(Dabhand).adf" size="819200" crc="8ce3f29e" sha1="019f4834d11afe2cbcdc1d59358a456236732bb4" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="arcscan3">
+ <description>ArcScan III</description>
+ <year>1991</year>
+ <publisher>RISC Developments</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="ArcscanIII program disc.adf" size="819200" crc="516ac1b4" sha1="defdef9e49b3f1d8d63c17094c65147cd9748e1f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="arcscanl">
+ <description>ArcScan III Library Discs</description>
+ <year>1991</year>
+ <publisher>RISC Developments</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Library Disc 1"/>
+ <dataarea name="flop" size="819200">
+ <rom name="ArcscanIII Library disc 1.adf" size="819200" crc="7f84dcb6" sha1="75e08a799b19b155acb17df62c187b8a8ca2830d" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Library Disc 2"/>
+ <dataarea name="flop" size="819200">
+ <rom name="ArcscanIII Library disc 2.adf" size="819200" crc="b1eccc7b" sha1="33dd546d0288171e9cf53eb16846b242c59b8639" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <feature name="part_id" value="Acorn Publisher Library"/>
+ <dataarea name="flop" size="819200">
+ <rom name="ArcScanIII AcornPublisher Library disk.adf" size="819200" crc="894f12b5" sha1="140194efc9e9f2cec3e934ac12c97ece25008dfd" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_3_5">
+ <feature name="part_id" value="Acorn User Library"/>
+ <dataarea name="flop" size="819200">
+ <rom name="ArcScanIII AcornUser Library disk.adf" size="819200" crc="9fbed052" sha1="cbc5c9821712e977ea7c9adf348d5f1c18fdec49" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_3_5">
+ <feature name="part_id" value="Archimedes World Library"/>
+ <dataarea name="flop" size="819200">
+ <rom name="ArcScanIII ArchimedesWorld Library disk.adf" size="819200" crc="45b56fbc" sha1="b5124095024541c1a9c5b755f17dd859e6cb7a11" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_3_5">
+ <feature name="part_id" value="Micro User Library"/>
+ <dataarea name="flop" size="819200">
+ <rom name="ArcScanIII MicroUser Library disk.adf" size="819200" crc="52218a1a" sha1="4d48a422e27d002b3d9bef87334495d288987455" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_3_5">
+ <feature name="part_id" value="RISC User Library"/>
+ <dataarea name="flop" size="819200">
+ <rom name="ArcScanIII RISCUser Library disk.adf" size="819200" crc="a8496e78" sha1="b7b98ae603f0bbfa6645aaadc0029dd6a61a3374" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="arcscan3r" cloneof="arcscan3">
+ <description>ArcScan III RISC User</description>
+ <year>1991</year>
+ <publisher>RISC Developments</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="RISC User"/>
+ <dataarea name="flop" size="819200">
+ <rom name="ArcscanIII RISC user.adf" size="819200" crc="99940be3" sha1="580b9ebeb0e13c2603797942c6d8a409a5c25344" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="artworks">
+ <description>ArtWorks</description>
+ <year>1992</year>
+ <publisher>Computer Concepts</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 1"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Artworks disc 1(1992)(Computer Concepts).adf" size="819200" crc="d9a0d6da" sha1="a6c8d323304e6aa0407e0e923a9abb007511fffc" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 2"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Artworks disc 2(1992)(Computer Concepts).adf" size="819200" crc="0ef30350" sha1="0c28cde55901698aaee62d86ff56245112f93cb2" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bbcbemu">
+ <description>BBC Model B Emulator</description>
+ <year>1990</year>
+ <publisher>Acorn</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="655360">
+ <rom name="Acorn BBC B emulator.adf" size="655360" crc="f258d279" sha1="20f11d131c1899931d714a25f1b0543a72e00040" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="compress">
+ <description>Compression</description>
+ <year>1991</year>
+ <publisher>Computer Concepts</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Compression(1991)(Computer Concepts).adf" size="819200" crc="969fb38e" sha1="8d4a64792efa7714c86dd19e8ed4f2ea0e2cf39d" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="discresc">
+ <description>Archimedes Disc Rescue</description>
+ <year>1992</year>
+ <publisher>Look Systems</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Archimedes Disc Rescue (1992)(LookSystems).adf" size="819200" crc="ee8164a5" sha1="88b0218d1b3f0ed4b065b91291c72780d3117582" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="drawhelp">
+ <description>!Draw_Help</description>
+ <year>19??</year>
+ <publisher>Sherston Software</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="409600">
+ <rom name="Draw Help 1(Sherston).adf" size="409600" crc="7797fcda" sha1="7ea03aa25457f0850df9a08782c7da01ca216758" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <dataarea name="flop" size="409600">
+ <rom name="Draw Help 2(Sherston).adf" size="409600" crc="b5431aee" sha1="f167c7487247cb4b0feb3a5b56cb8c90c1cd4cb4" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="euclid">
<description>Euclid</description>
<year>1988</year>
<publisher>Ace Computing</publisher>
@@ -2673,19 +3374,285 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="impresjr" supported="no">
- <description>Impression Junior</description>
+ <software name="filehand">
+ <description>File Handling for All</description>
+ <year>1991</year>
+ <publisher>RISC Developments</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="File handling for All.adf" size="819200" crc="102e7ee4" sha1="e7dfa8ecc170d8a0a4c1d5584c62373efe703aa5" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fontdir">
+ <description>Font Directory</description>
+ <year>1995</year>
+ <publisher>Look Systems</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Font Directory(LookSystems).adf" size="819200" crc="245b5003" sha1="1f0f118378d2bd259895145b696e2697c8137eb8" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fontdir2">
+ <description>Font Directory 2</description>
+ <year>1996</year>
+ <publisher>Look Systems</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Font Directory 2(LookSystems).adf" size="819200" crc="afd169e1" sha1="eb279971c4254bbe3e50dfb641619769da7669c0" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="genespls">
+ <description>Genesis Plus</description>
+ <year>1991</year>
+ <publisher>Oak Solutions</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Applications"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Genesis applications(1991)(Oak Solutions).adf" size="819200" crc="ff907bea" sha1="ae7a034366fc9cbd3efd307c24285bbf995bed9a" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Editor"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Genesis editor(1991)(Oak Solutions).adf" size="819200" crc="7ab93068" sha1="182a32960f44bfeeffe5cd205f563047e65b7885" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="genespro">
+ <description>Genesis Professional</description>
+ <year>1994</year>
+ <publisher>Oak Solutions</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="GenProf"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Genesis Professional Disc 1(1993)(Oak Solutions).adf" size="819200" crc="32bd000d" sha1="e49c3a27b78cd689dbc7213f7ca315eac1d15d45" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="GenLib"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Genesis Professional Disc 2(1993)(Oak Solutions).adf" size="819200" crc="9879a8c7" sha1="0d924ad322d19606e949207b0857484ef1417858" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <feature name="part_id" value="Utils"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Genesis Professional Disc 3(1993)(Oak Solutions).adf" size="819200" crc="7a779251" sha1="da7eaa5eb46b4a78359b2577391084b5c4ca8ed0" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_3_5">
+ <feature name="part_id" value="Examples"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Genesis Professional Disc 4(1993)(Oak Solutions).adf" size="819200" crc="7f11a9cf" sha1="1e0cd12297712b5b74d7d0524b3b33848afd3a48" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="genesproa" cloneof="genespro">
+ <description>Genesis Professional (Alt)</description>
+ <year>1994</year>
+ <publisher>Oak Solutions</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="GenProf"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Genesis_1.adf" size="819200" crc="06866f7e" sha1="5939b9b3369647fbe894e6bb8f22addc305fa2a2" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="GenLib"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Genesis_2.adf" size="819200" crc="00cc3938" sha1="cf6ebfe9ca07dd30ebfedcebff8165e824f9f52b" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <feature name="part_id" value="Utils"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Genesis_3.adf" size="819200" crc="098b050e" sha1="94a60d95ea21faa4751c008d6d05734571c7b3fa" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_3_5">
+ <feature name="part_id" value="Examples"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Genesis_4.adf" size="819200" crc="9d56c6a3" sha1="23c62b9a9ddfd9e351d1bd24ffc29e7921ed223e" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hypbookau">
+ <description>Hyperbook Authoring System</description>
+ <year>1988</year>
+ <publisher>Longman Logotron</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Hyperbook Authoring system.adf" size="819200" crc="eb8c7a2e" sha1="e8da8e55263261c2d0894d440f716ec6431ce4c0" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hypbookrd">
+ <description>Hyperbook Reader</description>
+ <year>1988</year>
+ <publisher>Longman Logotron</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Hyperbook Reader.adf" size="819200" crc="c3ba6118" sha1="b2643b8a93eef6d9bb03e0c54f9981fa85b00d6a" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hypbooklb">
+ <description>Hyperbook Library</description>
<year>1989</year>
+ <publisher>Longman Logotron</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="20th Century History Sourcebook"/>
+ <dataarea name="flop" size="819200">
+ <rom name="20th Century History Sourcebook.adf" size="819200" crc="6d296b55" sha1="dcc471164346f0821c9f66af4d7044de697e9926" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Economics Issues 1988"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Economics Issues 1988.adf" size="819200" crc="1cab712e" sha1="f7a86093fba211646ed51681b05664cc2873ba91" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <feature name="part_id" value="The Gospels"/>
+ <dataarea name="flop" size="819200">
+ <rom name="The Gospels.adf" size="819200" crc="952fa10d" sha1="ef035dbcece43b5deb0d919e63bce33532b60fb3" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_3_5">
+ <feature name="part_id" value="Geographical Issues No.1"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Geographical Issues No1.adf" size="819200" crc="cac34eb5" sha1="96df92565736390abd1559830260cd0d0f3edda6" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_3_5">
+ <feature name="part_id" value="Geographical Issues No.2"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Geographical Issues No2.adf" size="819200" crc="65f22250" sha1="39d11a8df39faaa06c558c05497985024a1c3c4a" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_3_5">
+ <feature name="part_id" value="Hamlet"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Hamlet.adf" size="819200" crc="d74609eb" sha1="0168814421c4536bca217406cc5d96dc6a090766" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_3_5">
+ <feature name="part_id" value="The Pollution File"/>
+ <dataarea name="flop" size="819200">
+ <rom name="The Pollution File.adf" size="819200" crc="d574dc22" sha1="c6e725e091a7b346c6de0f301a7343bf795ce510" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_3_5">
+ <feature name="part_id" value="Science and Technology Issues 1988 No.1"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Science and Technology Issues 1988 No1.adf" size="819200" crc="64b7c6d8" sha1="29d996435f19db8d3b9159ae4e558449bf47beb2" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop9" interface="floppy_3_5">
+ <feature name="part_id" value="Science and Technology Issues 1988 No.2"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Science and Technology Issues 1988 No2.adf" size="819200" crc="3e19a22d" sha1="eb6dc5929728e21b7d8b7ccd328e48f2cd57d62f" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop10" interface="floppy_3_5">
+ <feature name="part_id" value="Social Issues 1988 No.1"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Social Issues 1988 No1.adf" size="819200" crc="472a5b97" sha1="8961d38527c554430d6a4aaf7af64770c7942866" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop11" interface="floppy_3_5">
+ <feature name="part_id" value="Social Issues 1988 No.2"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Social Issues 1988 No2.adf" size="819200" crc="65c85705" sha1="c26f0633d06badb323f81f764378ed6ce50e2112" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="impresjr">
+ <description>Impression Junior</description>
+ <year>1990</year>
<publisher>Computer Concepts</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size="814080">
- <rom name="Impression Jr (19xx)(Computer Concepts).adf" size="814080" crc="1fe45813" sha1="8eacd5856d3e8fcf643ecc575d668fda3fe530ca" offset="0" />
+ <feature name="part_id" value="Disc 1"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Impression Junior Disc 1(Computer Concepts).adf" size="819200" crc="821f15f9" sha1="42b00c0598664f95e9f5b6125a31ee7857772d01" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 2"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Impression Junior Disc 2(Computer Concepts).adf" size="819200" crc="51a10a7b" sha1="f4effe3b70a76876f1f65de4a18941c20dca06d6" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 3"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Impression Junior Disc 3(Computer Concepts).adf" size="819200" crc="9d51ca2c" sha1="c8865d8e14eafc6b2a4e409c59f6a6494eccc0c4" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 4"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Impression Junior Disc 4(Computer Concepts).adf" size="819200" crc="419cdcd7" sha1="299a1a2f1d26eabeffba9f46c5b19efc1274cdf7" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="impstyle">
+ <description>Impression Style</description>
+ <year>1993</year>
+ <publisher>Computer Concepts</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 1"/>
+ <dataarea name="flop" size="819200">
+ <rom name="ImpressionStyle1(Computer Concepts).adf" size="819200" crc="22dab317" sha1="43ec69a4a56e4ee95adcd9ef2ec176b00e9056b3" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 2"/>
+ <dataarea name="flop" size="819200">
+ <rom name="ImpressionStyle2(Computer Concepts).adf" size="819200" crc="db01c181" sha1="93332112d0c301bbe0c8b7b2766ddd476fdc6e2a" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 3"/>
+ <dataarea name="flop" size="819200">
+ <rom name="ImpressionStyle3(Computer Concepts).adf" size="819200" crc="89d04fcc" sha1="d775cd825378f0210c8b7c59089b8ffcc73ac396" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 4"/>
+ <dataarea name="flop" size="819200">
+ <rom name="ImpressionStyle4(Computer Concepts).adf" size="819200" crc="67a5d395" sha1="1d1a399fa698d9a0e693e593ffa5b4747a69b969" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 5"/>
+ <dataarea name="flop" size="819200">
+ <rom name="ImpressionStyle5(Computer Concepts).adf" size="819200" crc="1f9857c5" sha1="63f2d152dd7bb410cf523a0dfdc0633009878488" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 6"/>
+ <dataarea name="flop" size="819200">
+ <rom name="ImpressionStyle6(Computer Concepts).adf" size="819200" crc="2e0c928a" sha1="ce9a09dcbb02ca1a5d9e32b405d8f16df9c5f478" offset="0"/>
</dataarea>
</part>
</software>
- <software name="magpie" supported="no">
- <description>Archimedes Magpie</description>
+ <software name="magpie">
+ <description>Magpie</description>
<year>1992</year>
<publisher>Logotron</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2695,7 +3662,43 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="pcemul" supported="no">
+ <software name="mstrfile">
+ <description>Masterfile</description>
+ <year>1992</year>
+ <publisher>RISC Developments</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Program Disc"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Masterfile Program disc (RISC Developments).adf" size="819200" crc="8b81e217" sha1="367af20ef891503e0274b89e9ddc1cfdb25720f1" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Example Disc"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Masterfile Example disc (RISC Developments).adf" size="819200" crc="542a224c" sha1="0f217bf41721a7b10dab204b917429a41b1abbf4" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mstudio32">
+ <description>Music Studio 32</description>
+ <year>1997</year>
+ <publisher>Longman Logotron</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 1"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Music Studio 32 disc 1.adf" size="819200" crc="156736c0" sha1="35af749e77f6a68e29cbd95e6995d1fd37c7f781" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 2"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Music Studio 32 disc 2.adf" size="819200" crc="92eb8b86" sha1="51933c43156fed083f92f195933fb62833314dd5" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pcemul">
<description>PC Emulator</description>
<year>1989</year>
<publisher>Acorn</publisher>
@@ -2706,8 +3709,8 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="pendown" supported="no">
- <description>Pen Down (v1.72)</description>
+ <software name="pendown">
+ <description>Pen Down</description>
<year>1992</year>
<publisher>Logotron</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2717,7 +3720,29 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="pipedrm3" supported="no">
+ <software name="peracct3">
+ <description>Personal Accounts 3</description>
+ <year>1994</year>
+ <publisher>Apricote Studios</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Personal Accounts 3(1994)(Apricote Studios).adf" size="819200" crc="bbb48c37" sha1="cf95b6389eaf1ea9d973db69f7e58f70b06ca9e9" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pinpntjr">
+ <description>Junior PinPoint</description>
+ <year>1992</year>
+ <publisher>Logotron</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Junior PinPoint(Logotron).adf" size="819200" crc="70e6fe77" sha1="0c35d09dcd7185e28678701d3880fbf07a6253fd" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pipedrm3">
<description>PipeDream 3</description>
<year>1989</year>
<publisher>Colton Software</publisher>
@@ -2728,8 +3753,144 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="startwri" supported="no">
- <description>StartWrite (Bad Dump?)</description>
+ <software name="pipedrm4">
+ <description>PipeDream 4</description>
+ <year>1991</year>
+ <publisher>Colton Software</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Program Disc"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Pipedream4(1991)(Colton).adf" size="819200" crc="34ef4a8b" sha1="5327770e23738bee999135e683e0bf98cec4221d" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Examples Disc"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Pipedream4 Examples(1991)(Colton).adf" size="819200" crc="acc49561" sha1="a8c2988e58f875cc0eaada2e4e04d0b19d2be9f5" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pocketfs">
+ <description>PocketFS</description>
+ <year>1992</year>
+ <publisher>Computer Concepts</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="PocketFS2(1992)(Computer Concepts).adf" size="819200" crc="e2c728eb" sha1="194aea8d144d34673556b12c92f8c8c7295bc1a4" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="partisan">
+ <description>ProArtisan</description>
+ <year>1988</year>
+ <publisher>Clares Micro Supplies</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Program Disc"/>
+ <dataarea name="flop" size="819200">
+ <rom name="ProArtisan(1988)(Clares).adf" size="819200" crc="436eff15" sha1="28f266e675baef1d55084ccb48d943b6a0d64d23" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Resource Disc"/>
+ <dataarea name="flop" size="819200">
+ <rom name="ProArtisan Resource Disc(1988)(Clares).adf" size="819200" crc="9c754d23" sha1="b5371dd0b5ee9eea8fe0b731d2e5716bd5c1d2ce" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pubart2">
+ <description>Publish Art Release 2</description>
+ <year>1995</year>
+ <publisher>Smart DTP</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 1"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Publish art disc 1(1995)(Smart DTP).adf" size="819200" crc="372eb850" sha1="c639189a7208a2aba5cab66ae28d6d077a25ef54" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 2"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Publish art disc 2(1995)(Smart DTP).adf" size="819200" crc="a100ddf6" sha1="0c1241adaeef6ba2c6e8505e2aab914e636f4362" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 3"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Publish art disc 3(1995)(Smart DTP).adf" size="819200" crc="78ef44d8" sha1="58254c1da7427da3c3eb088d108d1b499e9aa2b9" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 4"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Publish art disc 4(1995)(Smart DTP).adf" size="819200" crc="1331f909" sha1="a54e6d10c3c92a384a27965c3ccca75a4c0a8618" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 5"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Publish art disc 5(1995)(Smart DTP).adf" size="819200" crc="df326856" sha1="08e6334698e2c9122634587e8b8601f967e9bde3" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 6"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Publish art disc 6(1995)(Smart DTP).adf" size="819200" crc="3d74b576" sha1="dfd1224558a80a02d2484591c998018f7353bb0a" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 7"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Publish art disc 7(1995)(Smart DTP).adf" size="819200" crc="3c24311b" sha1="21d5f0a0416c2651a0aee3cae2f1968757d1815e" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_3_5">
+ <feature name="part_id" value="Disc 8"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Publish art disc 8(1995)(Smart DTP).adf" size="819200" crc="e4af845e" sha1="9dd3e0b961ccdfc5be75c7902e0b64f3c07eda14" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="revelat2">
+ <description>Revelation 2</description>
+ <year>1992</year>
+ <publisher>Longman Logotron</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Master Disc"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Revelation 2 Master Disk.adf" size="819200" crc="c4bc5ac5" sha1="819d0a9a2948341ceaa04e489a121dc1832f6c4d" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Curriculum Guide 1"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Revelation 2 Curr Guide 1.adf" size="819200" crc="55545c87" sha1="2dfa913cc86d92eeaa19f9ddae41fec08ea48bf5" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <feature name="part_id" value="Curriculum Guide 2"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Revelation 2 Curr Guide 2.adf" size="819200" crc="6c9ae856" sha1="9aa667b5866c46d8c895cf072a594bb367b2fe8b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="scanlitp">
+ <description>ScanLight Plus</description>
+ <year>1992</year>
+ <publisher>Computer Concepts</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Scanlight Plus(Computer Concepts).adf" size="819200" crc="47c222f4" sha1="1f87f29f5385f607400ff4a372fffe6c6c372af1" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="startwri">
+ <description>StartWrite</description>
<year>1992</year>
<publisher>Icon Technology</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2739,9 +3900,60 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
+ <software name="tblmtdes">
+ <description>TableMate Designer</description>
+ <year>1996</year>
+ <publisher>Dalriada Data Technology</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="TableMate Designer(1996)(Dalriada).adf" size="819200" crc="79d4d4e7" sha1="61cef8b1a8905cb6ff41efd13bc233242aba4e2d" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="vidiarc">
+ <description>Vidi-ARChimedes</description>
+ <year>1991</year>
+ <publisher>Rombo Productions</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Program Disc"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Vidi Program disc.adf" size="819200" crc="d346530b" sha1="5ae28821a0e1ffc9ceab474d6c1de832f6956baa" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Slideshow Disc"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Vidi Slideshow disc.adf" size="819200" crc="7f96881b" sha1="f69f035e7de3f8e1aa4a9721e0575980c1c21869" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wimptkit">
+ <description>Wimp Programmer's Toolkit</description>
+ <year>1991</year>
+ <publisher>RISC Developments</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Wimp Programmer's Toolkit.adf" size="819200" crc="c4a8cbb2" sha1="e1d915db2184de85a9d9b8e71ff057bb976064eb" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wimpprog">
+ <description>Wimp Programming for All</description>
+ <year>1992</year>
+ <publisher>RISC Developments</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Wimp Programming for All.adf" size="819200" crc="52fe6aba" sha1="b1f84c4a13d01f744b9c568aede93fadbc94f692" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
<!-- Educational -->
- <software name="dinosaur" supported="no">
+ <software name="dinosaur">
<description>10 out of 10 - Dinosaurs</description>
<year>1993</year>
<publisher>Ten Out Of Ten Educational Systems</publisher>
@@ -2752,7 +3964,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="drivtest" supported="no">
+ <software name="drivtest">
<description>10 out of 10 - Driving Test</description>
<year>1994</year>
<publisher>Ten Out Of Ten Educational Systems</publisher>
@@ -2770,7 +3982,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="earlyess" supported="no">
+ <software name="earlyess">
<description>10 out of 10 - Early Essentials</description>
<year>1993</year>
<publisher>Ten Out Of Ten Educational Systems</publisher>
@@ -2788,7 +4000,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="english" supported="no">
+ <software name="english">
<description>10 out of 10 - English</description>
<year>1994</year>
<publisher>Ten Out Of Ten Educational Systems</publisher>
@@ -2799,7 +4011,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="essit" supported="no">
+ <software name="essit">
<description>10 out of 10 - Essential I.T.</description>
<year>1996</year>
<publisher>Ten Out Of Ten Educational Systems</publisher>
@@ -2810,7 +4022,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="essmaths" supported="no">
+ <software name="essmaths">
<description>10 out of 10 - Essential Maths</description>
<year>1994</year>
<publisher>Ten Out Of Ten Educational Systems</publisher>
@@ -2821,7 +4033,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="essscien" supported="no">
+ <software name="essscien">
<description>10 out of 10 - Essential Science</description>
<year>1994</year>
<publisher>Ten Out Of Ten Educational Systems</publisher>
@@ -2832,7 +4044,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="french" supported="no">
+ <software name="french">
<description>10 out of 10 - French</description>
<year>1993</year>
<publisher>Ten Out Of Ten Educational Systems</publisher>
@@ -2843,7 +4055,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="german" supported="no">
+ <software name="german">
<description>10 out of 10 - German</description>
<year>1994</year>
<publisher>Ten Out Of Ten Educational Systems</publisher>
@@ -2854,7 +4066,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="jnress" supported="no">
+ <software name="jnress">
<description>10 out of 10 - Junior Essentials</description>
<year>1993</year>
<publisher>Ten Out Of Ten Educational Systems</publisher>
@@ -2865,7 +4077,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mathalge" supported="no">
+ <software name="mathalge">
<description>10 out of 10 - Maths - Algebra</description>
<year>1993</year>
<publisher>Ten Out Of Ten Educational Systems</publisher>
@@ -2883,7 +4095,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mathgeom" supported="no">
+ <software name="mathgeom">
<description>10 out of 10 - Maths - Geometry</description>
<year>1995</year>
<publisher>Ten Out Of Ten Educational Systems</publisher>
@@ -2894,7 +4106,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mathnumb" supported="no">
+ <software name="mathnumb">
<description>10 out of 10 - Maths - Number</description>
<year>1994</year>
<publisher>Ten Out Of Ten Educational Systems</publisher>
@@ -2905,7 +4117,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="mathstat" supported="no">
+ <software name="mathstat">
<description>10 out of 10 - Maths - Statistics</description>
<year>1993</year>
<publisher>Ten Out Of Ten Educational Systems</publisher>
@@ -2923,8 +4135,8 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="spellpun" supported="no">
- <description>Spelling &amp; Punctuation</description>
+ <software name="spellpun">
+ <description>10 out of 10 - Spelling &amp; Punctuation</description>
<year>1994</year>
<publisher>Ten Out Of Ten Educational Systems</publisher>
<part name="flop1" interface="floppy_3_5">
@@ -2934,42 +4146,78 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="spellstr" supported="no">
- <description>10 out of 10 - Spelling - Structured</description>
- <year>1994</year>
+ <software name="tables">
+ <description>10 out of 10 - Tables</description>
+ <year>1997</year>
<publisher>Ten Out Of Ten Educational Systems</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
- <rom name="10 out of 10 - spelling - structured (1994).adf" size="819200" crc="074816d6" sha1="38c25831ed9dc5ddf99761a2a6013fca630d50e2" offset="0"/>
+ <rom name="10 out of 10 - tables (1997).adf" size="819200" crc="b68428da" sha1="70c25c311a820d39573da0596dcb45e902f9f138" offset="0"/>
</dataarea>
</part>
</software>
- <software name="tables" supported="no">
- <description>10 out of 10 - Tables</description>
+ <software name="words">
+ <description>10 out of 10 - Words</description>
<year>1997</year>
<publisher>Ten Out Of Ten Educational Systems</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
- <rom name="10 out of 10 - tables (1997).adf" size="819200" crc="b68428da" sha1="70c25c311a820d39573da0596dcb45e902f9f138" offset="0"/>
+ <rom name="10 out of 10 - words (1997).adf" size="819200" crc="007e280c" sha1="e541a88667e1b6c4bc216bdaa4c0787e95f8fe46" offset="0"/>
</dataarea>
</part>
</software>
- <software name="words" supported="no">
- <description>10 out of 10 - Words</description>
- <year>1997</year>
- <publisher>Ten Out Of Ten Educational Systems</publisher>
+ <software name="droom">
+ <description>Dread Dragon Droom</description>
+ <year>1989</year>
+ <publisher>Resource</publisher>
<part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Program Disc"/>
<dataarea name="flop" size="819200">
- <rom name="10 out of 10 - words (1997).adf" size="819200" crc="007e280c" sha1="e541a88667e1b6c4bc216bdaa4c0787e95f8fe46" offset="0"/>
+ <rom name="Droom(Resource).adf" size="819200" crc="fe7784de" sha1="1ba54dcee97f4dde5a8ff59cf09fce483a7f1ae1" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Supplemental Disc"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Droom Supplemental(Resource).adf" size="819200" crc="c02498b3" sha1="0fd97c76d1201549ad23f1f1fa49120c1b7dafb0" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dtstories">
+ <description>Desk Top Stories</description>
+ <year>1988</year>
+ <publisher>Resource</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <feature name="part_id" value="Story Disc"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Desk Top Stories Story Disk(Resource).adf" size="819200" crc="7cdf6586" sha1="4ebd1318b0ae2b8694d32960d3befcfe3c283aa6" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <feature name="part_id" value="Library Disc"/>
+ <dataarea name="flop" size="819200">
+ <rom name="Desk Top Stories Library Disk(Resource).adf" size="819200" crc="fbe31de6" sha1="c947fd4f925add9ce089cadf354af924da1d38a1" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathmani">
+ <description>MathMania</description>
+ <year>1995</year>
+ <publisher>Topologika</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="MathMania(1995)(Topologika).adf" size="819200" crc="548263e6" sha1="e6acdd15830c461247563e54d93159c44ed103ff" offset="0"/>
</dataarea>
</part>
</software>
<!-- Languages -->
- <software name="ansicr2" supported="no">
+ <software name="ansicr2">
<description>Acorn ANSI C (Release 2)</description>
<year>1988</year>
<publisher>Acorn</publisher>
@@ -2981,7 +4229,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="ansicr3" supported="no">
+ <software name="ansicr3">
<description>Acorn ANSI C (Release 3)</description>
<year>1989</year>
<publisher>Acorn</publisher>
@@ -3005,7 +4253,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="acppr5" supported="no">
+ <software name="acppr5">
<description>Acorn C/C++ (Release 5)</description>
<year>1995</year>
<publisher>Acorn</publisher>
@@ -3048,6 +4296,17 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
+ <software name="easyc">
+ <description>Easy C</description>
+ <year>1993</year>
+ <publisher>RISC Developments</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="EasyC(1993)(RISC Development).adf" size="819200" crc="d67beb3d" sha1="fee528214ab968380fb355e5d62a07bece2d3865" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
<!-- Magazines -->
<software name="ac_oct92">
@@ -3055,7 +4314,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1992</year>
<publisher>Acorn Computing</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AC_Oct92_01.adf" size="819200" crc="09da255a" sha1="4091c1570882ef30c15682e2f3aedaa0f42a9a20" offset="0"/>
</dataarea>
</part>
@@ -3066,7 +4325,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1992</year>
<publisher>Acorn Computing</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AC_Nov92.adf" size="819200" crc="4e7ec356" sha1="1f5930d492a6a4bb0f19eb6f67f1cebfb98399d9" offset="0"/>
</dataarea>
</part>
@@ -3077,7 +4336,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1992</year>
<publisher>Acorn Computing</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AC_Dec92_03.adf" size="819200" crc="7263783d" sha1="a1e881cb70786485944843074e15bbd2de89a680" offset="0"/>
</dataarea>
</part>
@@ -3088,7 +4347,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1993</year>
<publisher>Acorn Computing</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AC_Jan93.adf" size="819200" crc="8f8f8e9a" sha1="9ddf6d4490c06c159e73c919856a579dc9ab9f0f" offset="0"/>
</dataarea>
</part>
@@ -3099,7 +4358,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1993</year>
<publisher>Acorn Computing</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AC_Feb93.adf" size="819200" crc="dc945b95" sha1="4602f3c28e96f10da40e22fffb6c7842e192f5dc" offset="0"/>
</dataarea>
</part>
@@ -3110,7 +4369,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1993</year>
<publisher>Acorn Computing</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AC_Mar93.adf" size="819200" crc="e9f4aafb" sha1="401ffc234a3261a2283ee37ae1ccee514694cb9f" offset="0"/>
</dataarea>
</part>
@@ -3121,7 +4380,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1993</year>
<publisher>Acorn Computing</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AC_Apr93.adf" size="819200" crc="ff1725ef" sha1="76eda0ee2f58de85163b0b233f2dfaf16c950a9f" offset="0"/>
</dataarea>
</part>
@@ -3132,7 +4391,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1993</year>
<publisher>Acorn Computing</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AC_May93.adf" size="819200" crc="2a10c392" sha1="2738e261c6510d1348390ba3af14eadc5151db30" offset="0"/>
</dataarea>
</part>
@@ -3143,7 +4402,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1993</year>
<publisher>Acorn Computing</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="ACJun93.adf" size="819200" crc="47a74746" sha1="26090aec4b2586ac2a5ebaca9c1e9e621c492dcc" offset="0"/>
</dataarea>
</part>
@@ -3154,7 +4413,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1993</year>
<publisher>Acorn Computing</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AC_Jul93.adf" size="819200" crc="a14c8f0d" sha1="aa1613a0b9e01ec0b9be530dfe0a3368fc4c3906" offset="0"/>
</dataarea>
</part>
@@ -3165,7 +4424,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1993</year>
<publisher>Acorn Computing</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AC_Aug93.adf" size="819200" crc="6d054d10" sha1="0aca3029e0f2987414bd61dc9dbf3ec9d775b1a2" offset="0"/>
</dataarea>
</part>
@@ -3176,7 +4435,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1993</year>
<publisher>Acorn Computing</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AC_Sep93.adf" size="819200" crc="a7956bda" sha1="a065cd30c8e365cacbbdfdb0eb44188e382e2d26" offset="0"/>
</dataarea>
</part>
@@ -3187,7 +4446,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1993</year>
<publisher>Acorn Computing</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AC_Oct93.adf" size="819200" crc="b5079a41" sha1="75d80c5b1c5982f64a8f5ea36ea308a6c1206011" offset="0"/>
</dataarea>
</part>
@@ -3198,12 +4457,12 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1993</year>
<publisher>Acorn Computing</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AC_Dec93_1.adf" size="819200" crc="05d79f11" sha1="28bf6c3eb9834fa1bae1d0b35a2b9b655569f6bb" offset="0"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AC_Dec93_2.adf" size="819200" crc="49b245a0" sha1="935675911e1ee8b2b6022a5d04786da162c268d4" offset="0"/>
</dataarea>
</part>
@@ -3214,12 +4473,12 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1993</year>
<publisher>Acorn Computing</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AC_Special93_1.adf" size="819200" crc="a851b5ae" sha1="7fd69e0a29c8161592e8a323414f5c7794b66aa0" offset="0"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AC_Special93_2.adf" size="819200" crc="4356f46d" sha1="b429f70583d0d073fbee8946c977ee20f3b96c69" offset="0"/>
</dataarea>
</part>
@@ -3230,7 +4489,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Acorn Computing</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AC_Feb94.adf" size="819200" crc="4ae63d54" sha1="9b9f280625d8d0f56fedf6e21ac603f99750df82" offset="0"/>
</dataarea>
</part>
@@ -3241,7 +4500,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Acorn Computing</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AC_Apr94.adf" size="819200" crc="4f5b154e" sha1="5ea5c770f4eac370a60dc67bdffa8b8c83fd9037" offset="0"/>
</dataarea>
</part>
@@ -3252,7 +4511,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Acorn Computing</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AC_Jun94.adf" size="819200" crc="efb19662" sha1="3e45f8d53b7df0fcaefa5f0799e0fb94a08e321b" offset="0"/>
</dataarea>
</part>
@@ -3263,7 +4522,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Acorn Computing</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AC_Jul94.adf" size="819200" crc="4f6f25a4" sha1="c4824b386219621b3d6365cc68d1c7268855b76a" offset="0"/>
</dataarea>
</part>
@@ -3274,7 +4533,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Acorn Computing</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AC_Aug94.adf" size="819200" crc="da38933a" sha1="ca90d9c899cd2c07458a430f350bb1cea0e77905" offset="0"/>
</dataarea>
</part>
@@ -3285,7 +4544,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Acorn Computing</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AC_Sep94.adf" size="819200" crc="ee2a0bb6" sha1="50a90dff775dad4e738bfbd2b2e38eb4df1f8dae" offset="0"/>
</dataarea>
</part>
@@ -3296,7 +4555,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1995</year>
<publisher>Acorn Computing</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AC_Mar95.adf" size="819200" crc="5f20ab54" sha1="2ed1356caa1c3bed3210d7ad7268aa770be98cf5" offset="0"/>
</dataarea>
</part>
@@ -3307,7 +4566,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1993</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_Oct93.adf" size="819200" crc="83c25895" sha1="cf130fe6390b8a6ad75071ec72d1818c5b3c89c1" offset="0"/>
</dataarea>
</part>
@@ -3318,7 +4577,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1993</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_Nov93.adf" size="819200" crc="c5e631e7" sha1="26ede6b8dd15e781b4c2d5d31e6eec137c6a00b5" offset="0"/>
</dataarea>
</part>
@@ -3329,7 +4588,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_Jan94.adf" size="819200" crc="14b7fed4" sha1="7caa312374af626060e08a0fbfeb69ec27fbcd0d" offset="0"/>
</dataarea>
</part>
@@ -3340,7 +4599,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_Feb94.adf" size="819200" crc="79715fe8" sha1="a2e370d6e4f123623d643195057685852596d923" offset="0"/>
</dataarea>
</part>
@@ -3351,7 +4610,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_Mar94.adf" size="819200" crc="9ee71521" sha1="1586d1ce122b110adfd51c7eabae9b1ba183df04" offset="0"/>
</dataarea>
</part>
@@ -3362,7 +4621,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_May94.adf" size="819200" crc="28489add" sha1="de04bddc808f961fadb76c8e55cbe3c228587f7d" offset="0"/>
</dataarea>
</part>
@@ -3373,7 +4632,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_Jun94.adf" size="819200" crc="662c87f0" sha1="ae4c92015e5930c4e1b377dfe0a353bad5d14e34" offset="0"/>
</dataarea>
</part>
@@ -3384,7 +4643,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_Jul94.adf" size="819200" crc="5dd3e2c0" sha1="090db6c006c15813907f048e21096167724f2ccd" offset="0"/>
</dataarea>
</part>
@@ -3395,7 +4654,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_Aug94.adf" size="819200" crc="9603a89b" sha1="57865dd58dcf957f4dadab1af145013d4b7cdb65" offset="0"/>
</dataarea>
</part>
@@ -3406,7 +4665,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_Sep94.adf" size="819200" crc="125a1be2" sha1="08d45a0a7f2682f8dc08651bf38576f8e2d98751" offset="0"/>
</dataarea>
</part>
@@ -3417,7 +4676,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_Oct94.adf" size="819200" crc="191470d1" sha1="6414901a8c6d7a4b14f9ac258f4728dbc5349118" offset="0"/>
</dataarea>
</part>
@@ -3428,7 +4687,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_Nov94.adf" size="819200" crc="f95be54a" sha1="ed6ea4605e7d13b3462e4109591af577168d23f0" offset="0"/>
</dataarea>
</part>
@@ -3439,7 +4698,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_Dec94.adf" size="819200" crc="5f5288de" sha1="3d24ca78362b4eabbacaba90a10b194aa54476d3" offset="0"/>
</dataarea>
</part>
@@ -3450,7 +4709,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1995</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_Jan95.adf" size="819200" crc="86b63c53" sha1="3e3fce0f68fd789f9544c008043fe9ee3fafbf0d" offset="0"/>
</dataarea>
</part>
@@ -3461,7 +4720,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1995</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_Feb95.adf" size="819200" crc="73176e4c" sha1="42d1b63ede116c4626c860e445350af52990eeaa" offset="0"/>
</dataarea>
</part>
@@ -3472,7 +4731,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1995</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_Mar95.adf" size="819200" crc="7ddd4a34" sha1="0304c8ee12e66dde17453366285ee360586d830d" offset="0"/>
</dataarea>
</part>
@@ -3483,7 +4742,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1995</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_Apr95.adf" size="819200" crc="f22528ba" sha1="a56e200b54fad0a1df7b1df31a8b0461bcdc7d47" offset="0"/>
</dataarea>
</part>
@@ -3494,7 +4753,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1995</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_May95.adf" size="819200" crc="db0e4c20" sha1="5f3e2ba22d78173578dc9a0b099e53b0dee3caa0" offset="0"/>
</dataarea>
</part>
@@ -3505,7 +4764,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1995</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_Jun95.adf" size="819200" crc="5c5db5a9" sha1="80f2b49f0f740e7a3a1ef78ecdbd6755dab8bbe5" offset="0"/>
</dataarea>
</part>
@@ -3516,7 +4775,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1995</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_Jul95.adf" size="819200" crc="53b5a1c4" sha1="0c0b6891be3ec6182d68510c4d147cf8e0012490" offset="0"/>
</dataarea>
</part>
@@ -3527,7 +4786,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1995</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_Aug95.adf" size="819200" crc="21f05319" sha1="3bdf92c8b254ecc17f9d0a62f0b511e07a53a05e" offset="0"/>
</dataarea>
</part>
@@ -3538,7 +4797,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1995</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_Sep95.adf" size="819200" crc="2ff8d8ed" sha1="121a26125c089ec073fc95f6dcd746483e43fdd0" offset="0"/>
</dataarea>
</part>
@@ -3549,7 +4808,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1995</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_Oct95.adf" size="819200" crc="b90db5e2" sha1="e64d5bc8c5cec51b0ce2a7c376197915e34a8bdb" offset="0"/>
</dataarea>
</part>
@@ -3560,7 +4819,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1995</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_Nov95.adf" size="819200" crc="ea32f184" sha1="01209fa489df8173abea405161bcd7cfc44fd3fd" offset="0"/>
</dataarea>
</part>
@@ -3571,7 +4830,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1995</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_Dec95.adf" size="819200" crc="e125f00f" sha1="eb39318e7c3a0def77c26135a439b93180467520" offset="0"/>
</dataarea>
</part>
@@ -3582,7 +4841,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1995</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_Xmas95A.adf" size="819200" crc="949087ae" sha1="5e8a97b1f2c5df1de2de2b6bab0b104dec59bb9a" offset="0"/>
</dataarea>
</part>
@@ -3593,7 +4852,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1996</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_Jan96.adf" size="819200" crc="4e3358fd" sha1="4a96aa2b5ba424d6db36e23dfe2c9bc3f68746ee" offset="0"/>
</dataarea>
</part>
@@ -3604,7 +4863,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1996</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_Feb96.adf" size="819200" crc="bb7b9ac5" sha1="6fa96deb91eeb928fa324ecdff6e03f1b8808a9a" offset="0"/>
</dataarea>
</part>
@@ -3615,7 +4874,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1998</year>
<publisher>Acorn User</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AU_Dec98.adf" size="819200" crc="f16f5af6" sha1="5347ef009138aa82e33ef51ad748c6f5851b907c" offset="0"/>
</dataarea>
</part>
@@ -3626,7 +4885,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1991</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Feb91.adf" size="819200" crc="ea499fd7" sha1="2c901b0cabc8157ea0d2d7c66cec306e80d1d52b" offset="0"/>
</dataarea>
</part>
@@ -3637,7 +4896,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1991</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_apr91.adf" size="819200" crc="6e0dd6ab" sha1="e9d07849b08d9b30c1e53bb59a40075b7081cff6" offset="0"/>
</dataarea>
</part>
@@ -3648,7 +4907,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1991</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_May91.adf" size="819200" crc="d892fbeb" sha1="9d34a7ba51898269ce549d209fb2b0a92e424673" offset="0"/>
</dataarea>
</part>
@@ -3659,7 +4918,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1991</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Jun91.adf" size="819200" crc="31f4d996" sha1="c5beae362e9245b5dedf408e2df508c01765b4a0" offset="0"/>
</dataarea>
</part>
@@ -3670,7 +4929,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1991</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Jul91.adf" size="819200" crc="cfdb9d8e" sha1="3ad27011e719be8b612bdb9b7a4c5cebc2ef845d" offset="0"/>
</dataarea>
</part>
@@ -3681,7 +4940,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1991</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Aug91.adf" size="819200" crc="5f692fed" sha1="0bcf5e75e0ba8fd9ee50843e3e05d4b4bd97cc9a" offset="0"/>
</dataarea>
</part>
@@ -3692,7 +4951,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1991</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Sep91.adf" size="819200" crc="d4e11ee6" sha1="28bb63f3ca87e93854d95d6b4837aab3362609fb" offset="0"/>
</dataarea>
</part>
@@ -3703,7 +4962,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1991</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Oct91.adf" size="819200" crc="bd74e04f" sha1="0a7afef59fdd44ab09cf5573f8250067379444d6" offset="0"/>
</dataarea>
</part>
@@ -3714,7 +4973,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1991</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Nov91.adf" size="819200" crc="c587b155" sha1="a728276bc66a63cca2a42e3cc72a8deab621b71d" offset="0"/>
</dataarea>
</part>
@@ -3725,7 +4984,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1991</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Dec91.adf" size="819200" crc="9fa9463a" sha1="a48aa5d74a2d3a233536c3432026777bb844ed40" offset="0"/>
</dataarea>
</part>
@@ -3736,7 +4995,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1992</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Mar92.adf" size="819200" crc="15780dcd" sha1="5414ea47379a3aef0add3e01af0303980a223363" offset="0"/>
</dataarea>
</part>
@@ -3747,7 +5006,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1992</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Apr92.adf" size="819200" crc="f4a19923" sha1="22929d22970a01c88244e3e295bee41c8bd50377" offset="0"/>
</dataarea>
</part>
@@ -3758,7 +5017,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1992</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Jul92.adf" size="819200" crc="2fb1ff74" sha1="6245af4eb36fdd9a0715149bf3f62be310f67583" offset="0"/>
</dataarea>
</part>
@@ -3769,7 +5028,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1992</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Aug92.adf" size="819200" crc="c0e8d1be" sha1="dfa2a20ec22278e2a8b82d284e196b70ba508677" offset="0"/>
</dataarea>
</part>
@@ -3780,7 +5039,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1992</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Sep92.adf" size="819200" crc="76460335" sha1="3cfb94e238a9ae637765feee58f895faaa9f1ae4" offset="0"/>
</dataarea>
</part>
@@ -3791,7 +5050,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1992</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Nov92.adf" size="819200" crc="0278d551" sha1="5c353829bb8fe8407f98374d37e8e926300f5e3d" offset="0"/>
</dataarea>
</part>
@@ -3802,7 +5061,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1992</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Dec92.adf" size="819200" crc="0dab5759" sha1="2fb8c0cc238ab942e3844150c7f16182711196a3" offset="0"/>
</dataarea>
</part>
@@ -3813,7 +5072,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1993</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Jan93.adf" size="819200" crc="32fa2786" sha1="93aa6570d705ba8f6d79f16b7330366176ac3fe4" offset="0"/>
</dataarea>
</part>
@@ -3824,7 +5083,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1993</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Feb93.adf" size="819200" crc="9167820b" sha1="751b0f91a801be94005af08d20feb1836627fe0a" offset="0"/>
</dataarea>
</part>
@@ -3835,7 +5094,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1993</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Mar93.adf" size="819200" crc="420bde8e" sha1="1f798bb262206777b9ebe1bba555de0a21ea00c5" offset="0"/>
</dataarea>
</part>
@@ -3846,7 +5105,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1993</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Apr93.adf" size="819200" crc="4bd1f3fd" sha1="adb69f5be4f4a5aad01ab29efda9159a70cb982c" offset="0"/>
</dataarea>
</part>
@@ -3857,7 +5116,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1993</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_May93.adf" size="819200" crc="56a7bc58" sha1="a6a0c7ce5d87b5ecab6d285cd17c3c0521c47f95" offset="0"/>
</dataarea>
</part>
@@ -3868,7 +5127,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1993</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Jun93.adf" size="819200" crc="0615ffca" sha1="ae8deeafe5ac8668503fba4a86611b9e1437baa6" offset="0"/>
</dataarea>
</part>
@@ -3879,7 +5138,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1993</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Jul93.adf" size="819200" crc="cc98c8e3" sha1="5ead65a5499ace638e2e15693b6b9250219822c1" offset="0"/>
</dataarea>
</part>
@@ -3890,7 +5149,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1993</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Aug93.adf" size="819200" crc="7b65fb32" sha1="e4be746fc64cde4ec61280f0f775713a1f65440a" offset="0"/>
</dataarea>
</part>
@@ -3901,7 +5160,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1993</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Sep93.adf" size="819200" crc="4ad7a503" sha1="bec38624edf41e185ad852d9447713316f873fa1" offset="0"/>
</dataarea>
</part>
@@ -3912,7 +5171,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1993</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Oct93.adf" size="819200" crc="628c84ac" sha1="466966d367d565cfe0f5c3f4a620e7c9dc72edfb" offset="0"/>
</dataarea>
</part>
@@ -3923,7 +5182,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1993</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Nov93.adf" size="819200" crc="7b606bac" sha1="219b440518133925e5205a028dae4cd559bacaa9" offset="0"/>
</dataarea>
</part>
@@ -3934,7 +5193,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1993</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Dec93.adf" size="819200" crc="2f19ae6c" sha1="1a5f22deddddd4d91b20b58b9091aed262ef4b07" offset="0"/>
</dataarea>
</part>
@@ -3945,7 +5204,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Jan94.adf" size="819200" crc="5e750a53" sha1="b58c152a973143a08d4f80689acad638c23f9a72" offset="0"/>
</dataarea>
</part>
@@ -3956,7 +5215,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1994-02_Disc1.adf" size="819200" crc="8f46c61c" sha1="c077964bcda85d1c68bea2981d5c99fe29b97929" offset="0"/>
</dataarea>
</part>
@@ -3967,12 +5226,12 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1994-03_Disc1.adf" size="819200" crc="840950f8" sha1="89b7c231729c91fdd63816a0defe676ffccc54b9" offset="0"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1994-03_Disc2.adf" size="819200" crc="89338a77" sha1="444e2d922e7fb04357afe9b3863880411a3f680d" offset="0"/>
</dataarea>
</part>
@@ -3983,12 +5242,12 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1994-04_Disc1.adf" size="819200" crc="91fe890a" sha1="7351cf0077007372c1f0111d1a18943ccee69f59" offset="0"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1994-04_Disc2.adf" size="819200" crc="cf69a16e" sha1="5ac5785e36d390987d329fe57786240f457258a3" offset="0"/>
</dataarea>
</part>
@@ -3999,12 +5258,12 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1994-05_Disk1.adf" size="819200" crc="600a53cd" sha1="8290cbf7b5a43792f213e4876c8dc8a69e713413" offset="0"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1994-05_Disk2.adf" size="819200" crc="cf78e2fb" sha1="46e66ba5527eee4c1516db5c56898be43c83b944" offset="0"/>
</dataarea>
</part>
@@ -4015,12 +5274,12 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1994-06_Disc1.adf" size="819200" crc="b858824e" sha1="937db539e85cad187ea0f491b0c35ee1c474f186" offset="0"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1994-06_Disc2.adf" size="819200" crc="b526edce" sha1="8d958cc1f4f5f952276a68f2ac8b87cd352ece64" offset="0"/>
</dataarea>
</part>
@@ -4031,12 +5290,12 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1994-07_Disc1.adf" size="819200" crc="8d9c464f" sha1="5822a8bdb189f140b9578e177dd77beeb1a8daa1" offset="0"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1994-07_Disc2.adf" size="819200" crc="213cbaa1" sha1="32f8f228d24c8686f937b839c22e161e71f4162e" offset="0"/>
</dataarea>
</part>
@@ -4047,12 +5306,12 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1994-08_Disc1.adf" size="819200" crc="390dff8e" sha1="0af609d7585320caf84c713434f71aab08a35710" offset="0"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1994-08_Disc2.adf" size="819200" crc="41eb9f27" sha1="c50f7b0f280be93dfc7cb28c6ce3fde6462296e2" offset="0"/>
</dataarea>
</part>
@@ -4063,12 +5322,12 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1994-09_Disc1.adf" size="819200" crc="825b5900" sha1="68726ea01ec3b9259d7c9fa32d4e841142b3c813" offset="0"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1994-09_Disc2.adf" size="819200" crc="61ef9189" sha1="e59f3b6681feb6b56c93ea6653bfa00b193cefc7" offset="0"/>
</dataarea>
</part>
@@ -4079,12 +5338,12 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1994-10_Disc1.adf" size="819200" crc="1aeb00df" sha1="3115f0f728d2c5c53cd0c69c1521cfcd46e6feb0" offset="0"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1994-10_Disc2.adf" size="819200" crc="4991cbed" sha1="c79b6d2a1909f82ab384625e89c734f70e7f6fd2" offset="0"/>
</dataarea>
</part>
@@ -4095,12 +5354,12 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1994-11_Disc1.adf" size="819200" crc="e85167a2" sha1="ca6040a379d4f9917b73230044dc3c7d26da7b2c" offset="0"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1994-11_Disc2.adf" size="819200" crc="8b6e7efe" sha1="a587b47cbf0594b7e28ad5d07f72eba32c67adcc" offset="0"/>
</dataarea>
</part>
@@ -4111,12 +5370,12 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1994</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1994-12_Disc1.adf" size="819200" crc="0c3c1ff3" sha1="eefadde3818f4566a4a36b216cedf342ef990417" offset="0"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1994-12_Disc2.adf" size="819200" crc="e1d68b2c" sha1="dc7525dca1995cc5ca0c000ea62f2a54245cdac1" offset="0"/>
</dataarea>
</part>
@@ -4127,12 +5386,12 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1995</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1995-01_Disc1.adf" size="819200" crc="a0767a6c" sha1="955d4376a567ecdebf92f1d32ec7063bf92a37d0" offset="0"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1995-01_Disc2.adf" size="819200" crc="988ead77" sha1="bb8c174a13cdfc2dea7a83534fc7e9fe132d8b7f" offset="0"/>
</dataarea>
</part>
@@ -4143,12 +5402,12 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1995</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1995-02_Disc1.adf" size="819200" crc="e289549b" sha1="50af856545e02175d2b1c89fefe2211ab03842de" offset="0"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1995-02_Disc2.adf" size="819200" crc="20da13b5" sha1="176a113f0383173bc3f6ae56c30d5c9347bbce4b" offset="0"/>
</dataarea>
</part>
@@ -4159,12 +5418,12 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1995</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1995-03_Disc1.adf" size="819200" crc="11460a0d" sha1="76867393e5494dcbde79c8e4914496c458903428" offset="0"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1995-03_Disc2.adf" size="819200" crc="0b5c6a35" sha1="7b8267c364a5d74c3123f28e7032890146975a7f" offset="0"/>
</dataarea>
</part>
@@ -4175,12 +5434,12 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1995</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1995-04_Disc1.adf" size="819200" crc="33b81e71" sha1="e7050d7fe0e57db81c96eb790e9fde8599b7bc90" offset="0"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1995-04_Disc2.adf" size="819200" crc="28517484" sha1="38816954757905f5bd7e03b6534c7729c7bea374" offset="0"/>
</dataarea>
</part>
@@ -4191,12 +5450,12 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1995</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1995-05_Disc1.adf" size="819200" crc="8a547b1f" sha1="fb90be30104be3f0fa0264ae23d0eeefe31d3e12" offset="0"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1995-05_Disc2.adf" size="819200" crc="615dfedc" sha1="bc98e9dc4a434eb2e90cb3705e9608094fb3e2a6" offset="0"/>
</dataarea>
</part>
@@ -4207,12 +5466,12 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1995</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1995-06_Disc1.adf" size="819200" crc="4b50a4f5" sha1="dd241bbc3d6d006cf40726b4e633bf302780564c" offset="0"/>
</dataarea>
</part>
<part name="flop2" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_1995-06_Disc2.adf" size="819200" crc="8ded8d25" sha1="8f3bcb430e2712bab94a091eeefd382fc15913cf" offset="0"/>
</dataarea>
</part>
@@ -4223,7 +5482,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1995</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Jul95.adf" size="819200" crc="6377c797" sha1="4c4f3e4c2ff25677be6ced98a7f67d1628c8e88f" offset="0"/>
</dataarea>
</part>
@@ -4234,7 +5493,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>1995</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Nov95.adf" size="819200" crc="dade144b" sha1="e2192a4fa0bd736153d9876cf36117382fb0c6ac" offset="0"/>
</dataarea>
</part>
@@ -4245,15 +5504,154 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
<year>199?</year>
<publisher>Archimedes World</publisher>
<part name="flop1" interface="floppy_3_5">
- <dataarea name="flop" size = "819200">
+ <dataarea name="flop" size="819200">
<rom name="AW_Vol15_Issue7.adf" size="819200" crc="52a58327" sha1="61d06f2a857d592b0d556ccc58b4ee593360c4c5" offset="0"/>
</dataarea>
</part>
</software>
+ <!-- Public Domain -->
+
+ <software name="sfcata92">
+ <description>Skyfall 1992 Autumn Catalogue</description>
+ <year>1992</year>
+ <publisher>SkyFall</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Skyfall 1992 Autumn Catalogue.adf" size="819200" crc="79cc3858" sha1="53645f721a6c07afd5d999a2d09606e8a589cbe8" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sfh24">
+ <description>Skyfall Disc H24: Desktop Applications - Disc Bits One</description>
+ <year>199?</year>
+ <publisher>SkyFall</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Skyfall H24 - Desktop Apps.adf" size="819200" crc="d93c0507" sha1="3f4225d73d3e7ee9f1f9ad524e64553b7538194c" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sfi30">
+ <description>Skyfall Disc I30: Outline Fonts</description>
+ <year>199?</year>
+ <publisher>SkyFall</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Skyfall I30 - Outline Fonts.adf" size="819200" crc="2da9f056" sha1="28885443142b64629e7980a48c4992d7bed3c5e5" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sfi31">
+ <description>Skyfall Disc I31: Outline Fonts</description>
+ <year>199?</year>
+ <publisher>SkyFall</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Skyfall I31 - Outline Fonts.adf" size="819200" crc="61b90a9a" sha1="276c9e34ae5d054c053d16dd1e7b2fbf408af40f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sfi32">
+ <description>Skyfall Disc I32: Outline Fonts</description>
+ <year>199?</year>
+ <publisher>SkyFall</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Skyfall I32 - Outline Fonts.adf" size="819200" crc="c21955de" sha1="8fa33c698b6815a8792996ca257ac5627fea94a7" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sfi33">
+ <description>Skyfall Disc I33: Outline Fonts</description>
+ <year>199?</year>
+ <publisher>SkyFall</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Skyfall I33 - Outline Fonts.adf" size="819200" crc="4212d9c1" sha1="5837c3eafa22e6e21340951c6d17a424428f1501" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sfk20">
+ <description>Skyfall Disc K20: PD Games - Wimp Games</description>
+ <year>199?</year>
+ <publisher>SkyFall</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Skyfall K20 - PD Games.adf" size="819200" crc="5e31b37a" sha1="41015329efede18a9def64d6616c63c92a395c20" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sfk22">
+ <description>Skyfall Disc K22: PD Games - Yaig Two</description>
+ <year>199?</year>
+ <publisher>SkyFall</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Skyfall K22 - PD Games.adf" size="819200" crc="11f8404a" sha1="146127ec47ba25ffcf7e42505ddce0466f0e90b4" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sfk29">
+ <description>Skyfall Disc K29: PD Games - Gyrinus</description>
+ <year>199?</year>
+ <publisher>SkyFall</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Skyfall K29 - Gyrinus2_1.adf" size="819200" crc="7b6ad906" sha1="e7eb579c5b8963860168f903464fb52188641a08" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Skyfall K30 - Gyrinus2_2.adf" size="819200" crc="3d5a5d12" sha1="486278712f02fb0182b1e25c8f837cc23986e195" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sfw05">
+ <description>Skyfall Disc W05: Videos</description>
+ <year>199?</year>
+ <publisher>SkyFall</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Skyfall W05 - Videos.adf" size="819200" crc="98d047fa" sha1="ff2e06e5ab3248ce96b6e24d16880bd07c3ad324" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sfx04">
+ <description>Skyfall Disc X04: Star Trek</description>
+ <year>199?</year>
+ <publisher>SkyFall</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Skyfall X04 - Star Trek.adf" size="819200" crc="a35be0db" sha1="d7a3826a4d9f90c7d948bd350759ed0d6ba0b7e0" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sfz01">
+ <description>Skyfall Disc Z01: Vector Clip Art</description>
+ <year>199?</year>
+ <publisher>SkyFall</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="Skyfall Z01 - Clip Art.adf" size="819200" crc="d09e917c" sha1="ace9918bff9ad8f61539f6fc09dba7bad3bda226" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
<!-- System -->
- <software name="welcomea" supported="no">
+ <software name="welcomea">
<description>Welcome (Arthur)</description>
<year>1987</year>
<publisher>Acorn</publisher>
@@ -4264,7 +5662,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="riscapps" supported="no">
+ <software name="riscapps">
<description>Archimedes Applications (RISC OS 2)</description>
<year>1988</year>
<publisher>Acorn</publisher>
@@ -4282,7 +5680,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="riscappsa" cloneof="riscapps" supported="no">
+ <software name="riscappsa" cloneof="riscapps">
<description>Archimedes Applications (RISC OS 2) (Alt)</description>
<year>1988</year>
<publisher>Acorn</publisher>
@@ -4300,7 +5698,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="ros3apps" supported="no">
+ <software name="ros3apps">
<description>Acorn RISC OS 3 Applications</description>
<year>1992</year>
<publisher>Acorn</publisher>
@@ -4318,7 +5716,7 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="ros3supp" supported="no">
+ <software name="ros3supp">
<description>Acorn RISC OS 3 Support</description>
<year>1992</year>
<publisher>Acorn</publisher>
@@ -4330,13 +5728,24 @@ Zelanites: The Onslaught by Micro Power (RiscOS2)
</part>
</software>
- <software name="newlook" supported="no">
+ <software name="newlook">
<description>RISC OS !New Look</description>
<year>1993</year>
<publisher>Acorn</publisher>
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="819200">
- <rom name="newlook (1993)(acorn).adf" size="819200" crc="9d13affa" sha1="ca2edab7a9708ebf8cba80abc97b245de1fa20f4" offset="0" />
+ <rom name="NewLook (1993)(Acorn).adf" size="819200" crc="128273d8" sha1="88339dd8d4eb87a6ece9f0b8de864a0766dde77e" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="newlookt" cloneof="newlook">
+ <description>RISC OS !New Look (TDK)</description>
+ <year>1993</year>
+ <publisher>Acorn</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size="819200">
+ <rom name="NewLookTDK (1993)(Acorn).adf" size="819200" crc="d6bed3ce" sha1="9f02adbfb30f4376ab1b2fc5b7281d24eb1d0a42" offset="0" />
</dataarea>
</part>
</software>
diff --git a/hash/atom_cass.xml b/hash/atom_cass.xml
index 304d4c884ea..993d2a9c161 100644
--- a/hash/atom_cass.xml
+++ b/hash/atom_cass.xml
@@ -82,6 +82,17 @@
</part>
</software>
+ <software name="backgamm">
+ <description>Backgammon</description>
+ <year>1981</year>
+ <publisher>Bug Byte</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="4007">
+ <rom name="Backgammon(BugByte).hq.uef" size="4007" crc="beba4486" sha1="30c122855456bef98391d8d06c23ae30a8bb5e99" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="breakout">
<description>Breakout (4K)</description>
<year>1981</year>
@@ -135,6 +146,17 @@
</part>
</software>
+ <software name="cylonatt">
+ <description>Cylon Attack</description>
+ <year>1982</year>
+ <publisher>A&amp;F Software</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="3866">
+ <rom name="CylonAttack(AnF).hq.uef" size="3866" crc="8a10cef1" sha1="75190d1e922623423ee52ecfc1913b843d052aca" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="deathsat">
<description>Death Satellite (12K)</description>
<year>1982</year>
@@ -168,6 +190,17 @@
</part>
</software>
+ <software name="earlywar">
+ <description>Early Warning</description>
+ <year>1982</year>
+ <publisher>A&amp;F Software</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="3340">
+ <rom name="EarlyWarning(AnF).hq.uef" size="3340" crc="c4896e06" sha1="603359d551114ff91df7dd6627f7a64efce46dc7" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="gala">
<description>Galaforce (32K)</description>
<year>2012</year>
@@ -366,6 +399,17 @@
</part>
</software>
+ <software name="minefld">
+ <description>Minefield</description>
+ <year>1982</year>
+ <publisher>A&amp;F Software</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="3859">
+ <rom name="Minefield(AnF).hq.uef" size="3859" crc="71c88da9" sha1="6744df000a59138a2eeafe8a36eab2f97ca7619d" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="omegamis">
<description>Omega Mission</description>
<year>1982</year>
@@ -445,6 +489,17 @@
</part>
</software>
+ <software name="tangled">
+ <description>Tangled</description>
+ <year>1982</year>
+ <publisher>A&amp;F Software</publisher>
+ <part name="cass1" interface="atom_cass">
+ <dataarea name="cass" size="2378">
+ <rom name="Tangled(AnF).hq.uef" size="2378" crc="488b976d" sha1="acf65680369a7b7e516c72ded2b74ecd1c971ff9" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="typist">
<description>Atom Typist (7K)</description>
<year>1981</year>
diff --git a/hash/atom_flop.xml b/hash/atom_flop.xml
index f337defd830..ce72c0d0bd7 100644
--- a/hash/atom_flop.xml
+++ b/hash/atom_flop.xml
@@ -65,6 +65,18 @@
</part>
</software>
+ <software name="galxians">
+ <description>Galaxians (12K)</description>
+ <year>1982</year>
+ <publisher>Aardvark</publisher>
+ <info name="usage" value="Load with *RUN&quot;GALAXI&quot;" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="102400">
+ <rom name="Galaxians(Aardvark).dsk" size="102400" crc="142fff89" sha1="5edca5333d5584ed64f980f15c67698873db93ff" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="hardhath">
<description>Hard Hat Harry (32K)</description>
<year>2011</year>
diff --git a/hash/atom_rom.xml b/hash/atom_rom.xml
index b1712ae2fbd..c8602485132 100644
--- a/hash/atom_rom.xml
+++ b/hash/atom_rom.xml
@@ -7,7 +7,7 @@
- axr2 (APP Laboratories)
-->
-<softwarelist name="atom_cart" description="Acorn Atom Utility ROMs">
+<softwarelist name="atom_rom" description="Acorn Atom Utility ROMs">
<software name="ace20">
<description>ACE-2.0</description>
diff --git a/hash/bbc_flop_65c102.xml b/hash/bbc_flop_65c102.xml
index 4626e439a75..b136a5f5f75 100644
--- a/hash/bbc_flop_65c102.xml
+++ b/hash/bbc_flop_65c102.xml
@@ -11,7 +11,7 @@
<softwarelist name="bbc_flop_65c102" description="65C102 Co-Processor Discs">
<software name="coprosup" supported="no">
- <description>BBC Master 65C102 Co-Processor Support Disc</description>
+ <description>65C102 Co-Processor Support Disc</description>
<year>1986</year>
<publisher>Acorn Computers</publisher>
<info name="format" value="DFS" />
diff --git a/hash/bbcb_cass.xml b/hash/bbcb_cass.xml
index b4b25861ebb..ae001c70c92 100644
--- a/hash/bbcb_cass.xml
+++ b/hash/bbcb_cass.xml
@@ -14077,9 +14077,9 @@
</software>
<software name="wayotef2" cloneof="wayotef">
- <description>The Way of the Exploding Fist (Richochet)</description>
+ <description>The Way of the Exploding Fist (Ricochet)</description>
<year>1985</year>
- <publisher>Richochet</publisher>
+ <publisher>Ricochet</publisher>
<part name="cass" interface="bbc_cass">
<dataarea name="cass" size="17353">
<rom name="wayoftheexplodingfistv2(1985)(ricochet).hq.uef" size="17353" crc="d5ef89de" sha1="3186dad75a0099836be20a97956fca2597ceaeb1" offset="0" />
diff --git a/hash/c64_flop.xml b/hash/c64_flop.xml
index f788e300be2..a75dfe38741 100644
--- a/hash/c64_flop.xml
+++ b/hash/c64_flop.xml
@@ -430,6 +430,19 @@
</part>
</software>
+ <software name="speakez">
+ <description>SpeakEasy</description>
+ <year>1983</year>
+ <publisher>Personal Peripheral Products</publisher>
+ <sharedfeat name="compatibility" value="NTSC,PAL"/>
+ <sharedfeat name="requirement" value="c64_cart:speakez"/>
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="174848">
+ <rom name="speakeasy.d64" size="174848" crc="702cc20c" sha1="d9a19213809e2b51ee55fac9687b55bddaa86871" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
<!-- Educational -->
<software name="kats1">
diff --git a/hash/cpc_flop.xml b/hash/cpc_flop.xml
index cbff12ee39d..3d191b4d960 100644
--- a/hash/cpc_flop.xml
+++ b/hash/cpc_flop.xml
@@ -153674,7 +153674,7 @@ stick to CPC-Power disks, when available)
</software>
<!-- Identifying Vindicator, The (1988)(Imagine Software).dsk... --> <!-- Mostly GoodCPC -->
- <software name="vindicat02" cloneof="vindicat" supported="no">
+ <software name="thevindi02" cloneof="thevindi" supported="no">
<description>The Vindicator (Imagine Software)</description>
<year>1988</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -153686,7 +153686,7 @@ stick to CPC-Power disks, when available)
</software>
<!-- Identifying Vindicator, The (1988)(Imagine Software)[cr Two Mag][t Two Mag].dsk... --> <!-- Mostly GoodCPC -->
- <software name="vindicat03" cloneof="vindicat" supported="no">
+ <software name="thevindi03" cloneof="thevindi" supported="no">
<description>The Vindicator (Imagine Software)[cr Two Mag][t Two Mag]</description>
<year>1988</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -153698,7 +153698,7 @@ stick to CPC-Power disks, when available)
</software>
<!-- Identifying Vindicators (1989)(Domark).dsk... --> <!-- Mostly GoodCPC -->
- <software name="vindicat04" cloneof="vindicat" supported="no">
+ <software name="vindicat02" cloneof="vindicat" supported="no">
<description>Vindicators (Domark)</description>
<year>1989</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -153710,7 +153710,7 @@ stick to CPC-Power disks, when available)
</software>
<!-- Identifying Vindicators (1989)(Domark)[a].dsk... --> <!-- Mostly GoodCPC -->
- <software name="vindicat05" cloneof="vindicat" supported="no">
+ <software name="vindicat03" cloneof="vindicat" supported="no">
<description>Vindicators (Domark)[a]</description>
<year>1989</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -153722,7 +153722,7 @@ stick to CPC-Power disks, when available)
</software>
<!-- Identifying Vindicators (1989)(Domark)[cr GPA][t GPA].dsk... --> <!-- Mostly GoodCPC -->
- <software name="vindicat06" cloneof="vindicat" supported="no">
+ <software name="vindicat04" cloneof="vindicat" supported="no">
<description>Vindicators (Domark)[cr GPA][t GPA]</description>
<year>1989</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -189644,7 +189644,7 @@ stick to CPC-Power disks, when available)
</software>
<!-- Identifying Vindicator, The (UK) (1988) [a1].dsk... --> <!-- GoodCPC -->
- <software name="vindicat07" cloneof="vindicat" supported="no">
+ <software name="thevindi04" cloneof="thevindi" supported="no">
<description>The Vindicator (UK) [a1]</description>
<year>1988</year>
<publisher>&lt;unknown&gt;</publisher>
@@ -189656,7 +189656,7 @@ stick to CPC-Power disks, when available)
</software>
<!-- Identifying Vindicator, The (UK) (1988) [a2].dsk... --> <!-- GoodCPC -->
- <software name="vindicat08" cloneof="vindicat" supported="no">
+ <software name="thevindi05" cloneof="thevindi" supported="no">
<description>The Vindicator (UK) [a2]</description>
<year>1988</year>
<publisher>&lt;unknown&gt;</publisher>
diff --git a/hash/electron_flop.xml b/hash/electron_flop.xml
index f9df327951d..1fabb5911d7 100644
--- a/hash/electron_flop.xml
+++ b/hash/electron_flop.xml
@@ -65,7 +65,7 @@
</part>
</software>
- <software name="abgensnr" cloneof="argcreat">
+ <software name="abgensnr">
<description>Answer Back - General Knowledge Senior Quiz</description>
<year>1984</year>
<publisher>Kosmos</publisher>
@@ -476,7 +476,7 @@
</part>
</software>
- <software name="pias35">
+ <software name="pias35" cloneof="pias">
<description>Play It Again Sam (3.5")</description>
<year>1987</year>
<publisher>Superior Software/Acornsoft</publisher>
diff --git a/hash/ibm5150.xml b/hash/ibm5150.xml
index 9e6951b04fa..912f7a21d13 100644
--- a/hash/ibm5150.xml
+++ b/hash/ibm5150.xml
@@ -2548,6 +2548,150 @@ Known PC Booter Games Not Dumped, Or Dumped and Lost when Demonlord's Site went
</part>
</software>
+ <software name="desk3">
+ <description>DeskMate (3.05, 5.25")</description>
+ <year>1990</year>
+ <publisher>Tandy</publisher>
+ <info name="version" value="03.05.00" />
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 1: Startup Disk, Install" />
+ <dataarea name="flop" size = "368640">
+ <rom name="dm305dk1.img" size="368640" crc="7f4182af" sha1="a02a7dec082d3434c3cde29ad05aef9eda9f4765" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 2: Desktop, Text" />
+ <dataarea name="flop" size = "368640">
+ <rom name="dm305dk2.img" size="368640" crc="6fb5aa52" sha1="f9c89a60103af2de38a301932670476984604a2f" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 3: PC-Link, Telecom, Worksheet" />
+ <dataarea name="flop" size = "368640">
+ <rom name="dm305dk3.img" size="368640" crc="455605a7" sha1="69e48cd7d7fc3a8514465225a7540566dd6347e5" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 4: Address Book, Calendar" />
+ <dataarea name="flop" size = "368640">
+ <rom name="dm305dk4.img" size="368640" crc="3b32b34a" sha1="2715d4353089dca2637d5162f75418f1e7d6f074" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 5: Filer, Form Setup" />
+ <dataarea name="flop" size = "368640">
+ <rom name="dm305dk5.img" size="368640" crc="8e93ebd4" sha1="1caa9be0c23bac65130b33b08ce8350c5e597794" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop6" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 6: Printer Drivers" />
+ <dataarea name="flop" size = "368640">
+ <rom name="dm305dk6.img" size="368640" crc="a0f81483" sha1="f95558e665fd5109467a009060a96e59baf88faa" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop7" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 7: Dictionary, Hangman" />
+ <dataarea name="flop" size = "368640">
+ <rom name="dm305dk7.img" size="368640" crc="0ad16680" sha1="5159c89219597bcd685f7a046789a0c6ca88f9c6" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop8" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 8: Draw" />
+ <dataarea name="flop" size = "368640">
+ <rom name="dm305dk8.img" size="368640" crc="d63bfb96" sha1="7895cc697cf216acf1822589682a79e958c0905b" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop9" interface="floppy_5_25">
+ <feature name="part_id" value="Disk 9: Fonts" />
+ <dataarea name="flop" size = "368640">
+ <rom name="dm305dk9.img" size="368640" crc="770cd60d" sha1="a1af30d1a0ed4c38deafa59e94c822e4f73ae282" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="desk3_35" cloneof="desk3">
+ <description>DeskMate (3.05, 3.5")</description>
+ <year>1990</year>
+ <publisher>Tandy</publisher>
+ <info name="version" value="03.05.00" />
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size = "737280">
+ <rom name="disk1.img" size="737280" crc="f3af8c6b" sha1="06a9875ab8c4ce4ce50bf344f3002ef7d512d711" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <dataarea name="flop" size = "737280">
+ <rom name="disk2.img" size="737280" crc="603cf56c" sha1="8c3d1876134744fe111ae33840afd0af7d93bfb1" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <dataarea name="flop" size = "737280">
+ <rom name="disk3.img" size="737280" crc="bf9271d6" sha1="d35cf946d1894872ed385f7bb9b4842958ef90ec" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_3_5">
+ <dataarea name="flop" size = "737280">
+ <rom name="disk4.img" size="737280" crc="5835eaa4" sha1="eae3d11fb24835a3b214179a205e5d52de76f41c" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_3_5">
+ <dataarea name="flop" size = "737280">
+ <rom name="disk5.img" size="737280" crc="35ca8ddc" sha1="49fcade64969354039d67d78cf9c8398324cea13" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="desq">
+ <description>DESQ</description>
+ <year>1984</year>
+ <publisher>Quarterdeck</publisher>
+ <info name="version" value="1.00" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size = "368640">
+ <rom name="Disk01.img" size="368640" crc="e86a110e" sha1="05f5ac86738151e7832ec8c96b842772aefd2e86" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <dataarea name="flop" size = "368640">
+ <rom name="Disk02.img" size="368640" crc="2d51542d" sha1="bc0962df0258778b1abcc2c5bd2bf51ad9f4a91c" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <dataarea name="flop" size = "368640">
+ <rom name="Disk03.img" size="368640" crc="fb8ea51c" sha1="eca5d960f6bddd0dd6df73a8157173808ad9e64c" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <dataarea name="flop" size = "368640">
+ <rom name="Disk04.img" size="368640" crc="8924e6a2" sha1="1ef62eeca2c3bbb8adc89aa020d4c303d5b29677" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="desqview">
+ <description>DESQview 1.03</description>
+ <year>1986</year>
+ <publisher>Quarterdeck</publisher>
+ <info name="version" value="1.03" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size = "368640">
+ <rom name="Disk1.img" size="368640" crc="8fef17cc" sha1="e3ac9097d60e847c169cb14d806099c5d8f5e0e5" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="desqviewa" cloneof="desqview">
+ <description>DESQview 1.02</description>
+ <year>1986</year>
+ <publisher>Quarterdeck</publisher>
+ <info name="version" value="1.02" />
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size = "368640">
+ <rom name="disk1_102.img" size="368640" crc="0deed6f2" sha1="843642c4266f8d2b318a4ddb7b0aa90abcf495e1" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="diag202a">
<description>IBM System Diagnostics v 2.02 (Version A)</description>
<year>198?</year>
@@ -2614,6 +2758,20 @@ Known PC Booter Games Not Dumped, Or Dumped and Lost when Demonlord's Site went
</part>
</software>
+ <!-- sold also for the IBM PCjr-->
+ <software name="nortutil">
+ <description>The Norton Utilities 3.10</description>
+ <year>1986</year>
+ <publisher>Peter Norton Computing, Inc.</publisher>
+ <info name="usage" value="boot from PC DOS 2.1 and then load, using: nc /d1" />
+ <!-- marked as bad since source is questionable, needs a redump -->
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="368640">
+ <rom name="norton utilities 310.img" size="368640" crc="b27b8cbb" sha1="34b5973fe5354a08b4d2a987473f82cd82a581cd" offset="0x00000" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="visicalc">
<description>VisiCalc</description>
<year>1982</year>
@@ -3784,6 +3942,37 @@ Known PC Booter Games Not Dumped, Or Dumped and Lost when Demonlord's Site went
</part>
</software>
+ <!-- "Thoroughbred Passport" copy-protection dongle not emulated -->
+ <software name="tbos" supported="no">
+ <description>Thoroughbred/OS 6.6.2-6</description>
+ <year>1987</year>
+ <publisher>Concept Omega</publisher>
+ <part name="flop1" interface="floppy_5_25">
+ <feature name="part_id" value="THOROUGHBRED/OS SYSTEM (T/OS)"/>
+ <dataarea name="flop" size = "368640">
+ <rom name="disk01.img" size="368640" crc="cbeee231" sha1="b993172879455cff1b41817e9b608eb0496ce167" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_5_25">
+ <feature name="part_id" value="THOROUGHBRED/OS SUPPLEMENTAL (ULIB)"/>
+ <dataarea name="flop" size = "368640">
+ <rom name="disk02.img" size="368640" crc="1315222c" sha1="21d9d4485881b31ab193e3c0ef05c316b9eebd57" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_5_25">
+ <feature name="part_id" value="THOROUGHBRED/OS DIAGNOSTIC (DISPAK)"/>
+ <dataarea name="flop" size = "368640">
+ <rom name="disk03.img" size="368640" crc="a4edcdf5" sha1="3883330fac69a8fb6dd63aaddd8bab6ccf2562d6" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_5_25">
+ <feature name="part_id" value="THOROUGHBRED/OS TAPE DRIVER"/>
+ <dataarea name="flop" size = "368640">
+ <rom name="disk04.img" size="368640" crc="bfb908dd" sha1="ce0376208143395e06e48c45879354e09b49cf45" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="xenix86">
<description>SCO XENIX System V release 2.1.3 for i8086</description>
<year>1986</year>
@@ -3980,6 +4169,18 @@ Known PC Booter Games Not Dumped, Or Dumped and Lost when Demonlord's Site went
</part>
</software>
+ <software name="arctadv">
+ <description>Arctic Adventure</description>
+ <year>1991</year>
+ <publisher>Apogee Software</publisher>
+ <info name="version" value="2.0" />
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size = "737280">
+ <rom name="Arctic Adventure (USA) (v2.0).img" size="737280" crc="a6606d54" sha1="c9c4546746742c8c5c0faa8eace2f033fa4d61b3" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="bargames">
<description>Bar Games</description>
<year>1989</year>
@@ -4511,6 +4712,19 @@ Known PC Booter Games Not Dumped, Or Dumped and Lost when Demonlord's Site went
</part>
</software>
+ <software name="ptomb">
+ <description>Pharaoh's Tomb</description>
+ <year>1990</year>
+ <publisher>Apogee</publisher>
+ <info name="developer" value="Micro F/X" />
+ <info name="version" value="3.0" />
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size = "737280">
+ <rom name="Pharaoh's Tomb (USA) (v3.0).img" size="737280" crc="0923275f" sha1="cab3ad6cecda45f44d1721b9da1a93d6b4cfc6d6" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
<!-- Fatal error: Incorrect layout on track 39 head 0, expected_size=100000, current_size=103360 -->
<software name="purplesa" supported="no">
<description>Purple Saturn Day</description>
@@ -4528,6 +4742,17 @@ Known PC Booter Games Not Dumped, Or Dumped and Lost when Demonlord's Site went
</part>
</software>
+ <software name="agidemos">
+ <description>Sierra Demo</description>
+ <year>1987</year>
+ <publisher>Sierra</publisher>
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size = "368640">
+ <rom name="agidemos.dsk" size="368640" crc="2441c877" sha1="fe0302191a2173727eeb69316c1dc3e814761f85" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="skatedie">
<description>Skate or Die (5.25")</description>
<year>1988</year>
diff --git a/hash/ibm5170.xml b/hash/ibm5170.xml
index 4b64abbfe1c..3e720e42ffe 100644
--- a/hash/ibm5170.xml
+++ b/hash/ibm5170.xml
@@ -2921,6 +2921,19 @@ Missing files come here
</part>
</software>
+ <software name="mitsmous">
+ <!-- from Acer CPR 1.2 recovery CD-ROM -->
+ <description>Mitsumi Mouse Driver</description>
+ <year>1994</year>
+ <publisher>Mitsumi</publisher>
+ <info name="version" value="7.22" />
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size = "1474560">
+ <rom name="mouse disk1.img" size="1474560" crc="df5ebedd" sha1="1e66014840879965547804943842a1428dd588ed" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="neccd110">
<description>NEC Atapi-IDE CD-Rom Driver (Rev D011V110.ENG019)</description>
<year>1995</year>
@@ -3420,6 +3433,38 @@ Missing files come here
</part>
</software>
+ <software name="desk3hd">
+ <description>DeskMate (3.05, 3.5" 1.44MB)</description>
+ <year>1990</year>
+ <publisher>Tandy</publisher>
+ <info name="version" value="03.05.00" />
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size = "1474560">
+ <rom name="deskmte1.dsk" size="1474560" crc="c85598c1" sha1="605ca187208932b29da5357a339737db47827fa4" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <dataarea name="flop" size = "1474560">
+ <rom name="deskmte2.dsk" size="1474560" crc="9d14fc5c" sha1="5e0d3ac6e1ae422cf87b958b35c83b7f25887f59" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <dataarea name="flop" size = "1474560">
+ <rom name="deskmte3.dsk" size="1474560" crc="0cbe386b" sha1="fa695147fea64d5ba3a6f785538c043e961f9cbd" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_3_5">
+ <dataarea name="flop" size = "1474560">
+ <rom name="deskmte4.dsk" size="1474560" crc="200dc9a3" sha1="dabc84e8507b7de442f7089a1c8e8f4061bd1be6" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_3_5">
+ <dataarea name="flop" size = "1474560">
+ <rom name="deskmte5.dsk" size="1474560" crc="c2ed638a" sha1="82b897d4a10c8897c2a467152a14d739b10aeb1f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="pcdos7d">
<description>PC DOS 7 (Demonstration)</description>
<year>1994</year>
@@ -3444,6 +3489,47 @@ Missing files come here
</part>
</software>
+ <software name="moneynet">
+ <!-- from Acer CPR 1.2 recovery CD-ROM -->
+ <description>Reuters Money Network</description>
+ <year>1994</year>
+ <publisher>Reuters</publisher>
+ <info name="version" value="2.0R3" />
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size = "1474560">
+ <rom name="moneynet disk1.img" size="1474560" crc="c9422588" sha1="ded7282d49e32b21de24c9c64de1a1450ba84de7" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <dataarea name="flop" size = "1474560">
+ <rom name="moneynet disk2.img" size="1474560" crc="8941e8e1" sha1="50dfc034d9a6ffd7626d58efb292f0ab0535fb09" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <dataarea name="flop" size = "1474560">
+ <rom name="moneynet disk3.img" size="1474560" crc="dcfc9b90" sha1="3968bdc94bf594d00fd966a531cf919380fd7aae" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="prodigy">
+ <!-- from Acer CPR 1.2 recovery CD-ROM -->
+ <description>Prodigy Service</description>
+ <year>1994</year>
+ <publisher>Prodigy</publisher>
+ <info name="version" value="9.18" />
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size = "1474560">
+ <rom name="prodigy disk1.img" size="1474560" crc="81c34e95" sha1="9ce2a7b88e4da7f9ac1196c05aa772c398355766" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <dataarea name="flop" size = "1474560">
+ <rom name="prodigy disk2.img" size="1474560" crc="99c0c50a" sha1="6842d1cd7c3c6f94a04cd104e79e1a0ebde8d8b4" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="btpscl55">
<description>Borland Turbo Pascal 5.5</description>
<year>1989</year>
@@ -4147,6 +4233,24 @@ Missing files come here
</part>
</software>
+ <software name="boppin">
+ <description>Boppin' (Super Ultimate, v1.1)</description>
+ <year>1994</year>
+ <publisher>Apogee Software</publisher>
+ <info name="developer" value="Accursed Toys" />
+ <info name="version" value="1.1" />
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size = "1474560">
+ <rom name="Boppin' - Super Ultimate (USA) (v1.1) (Disk 1).img" size="1474560" crc="cd253923" sha1="f51aa14b960bf1517ccac19c4f8d379744d32a3d" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <dataarea name="flop" size = "1474560">
+ <rom name="Boppin' - Super Ultimate (USA) (v1.1) (Disk 2).img" size="1474560" crc="20c4dc37" sha1="e39ac3f58f81813e515e8fa203dff7e9b9ebf9d3" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="chipdale">
<description>Chip 'N Dale Rescue Rangers - The Adventure in Nimnul's Castle</description>
<year>1990</year>
@@ -4163,6 +4267,7 @@ Missing files come here
<year>1992</year>
<publisher>Apogee Software</publisher>
<info name="developer" value="id Software" />
+ <info name="version" value="1.4" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size = "1474560">
<rom name="Commander Keen in Goodbye, Galaxy! (USA) (v1.4) (EGA) (3.5'').img" size="1474560" crc="c6d9eac0" sha1="ea1266074d4a9201ba66293b38d652480d4f0ab8" offset="0"/>
@@ -4175,6 +4280,7 @@ Missing files come here
<year>1992</year>
<publisher>Apogee Software</publisher>
<info name="developer" value="id Software" />
+ <info name="version" value="1.4" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size = "1228800">
<rom name="Commander Keen in Goodbye, Galaxy! (USA) (v1.4) (EGA) (5.25'') (Disk 1).img" size="1228800" crc="c19a9f27" sha1="0c5bb1ae622384603ee5b9aafbe26c5429da3d96" offset="0"/>
@@ -4192,6 +4298,7 @@ Missing files come here
<year>1992</year>
<publisher>Apogee Software</publisher>
<info name="developer" value="id Software" />
+ <info name="version" value="1.4" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size = "1474560">
<rom name="Commander Keen in Goodbye, Galaxy! (USA) (v1.4) (CGA) (3.5'').img" size="1474560" crc="ebb5fe47" sha1="4ba724bcc7ca7664c44192fb3a7719f9ec5e186c" offset="0"/>
@@ -4204,6 +4311,7 @@ Missing files come here
<year>1992</year>
<publisher>Apogee Software</publisher>
<info name="developer" value="id Software" />
+ <info name="version" value="1.4" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size = "1228800">
<rom name="Commander Keen in Goodbye, Galaxy! (USA) (v1.4) (CGA) (5.25'').img" size="1228800" crc="6e08fec4" sha1="ae808d3833b3a7ea27c26fa39d20c9694c0a0cd0" offset="0"/>
@@ -4217,6 +4325,7 @@ Missing files come here
<year>1991</year>
<publisher>FormGen</publisher>
<info name="developer" value="id Software" />
+ <info name="version" value="1.5" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size = "737280">
<rom name="Commander Keen in Aliens Ate My Baby Sitter! (USA) (v1.5) (3.5'') (Disk 1).img" size="737280" crc="495070a8" sha1="d63d0d20025b72f431ecb3b90df2eb54d5651726" offset="0"/>
@@ -4241,6 +4350,7 @@ Missing files come here
<year>1991</year>
<publisher>FormGen</publisher>
<info name="developer" value="id Software" />
+ <info name="version" value="1.4" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size="737280">
<rom name="disk1.img" size="737280" crc="841adabf" sha1="8253cd16647975ee2675adffd81c79a31946f080" offset="0" />
@@ -4263,6 +4373,7 @@ Missing files come here
<year>1991</year>
<publisher>FormGen</publisher>
<info name="developer" value="id Software" />
+ <info name="version" value="1.0" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size = "737280">
<rom name="Commander Keen in Aliens Ate My Baby Sitter! (USA) (v1.0) (3.5'') (Disk 1).img" size="737280" crc="91a56a22" sha1="adbe45f8c69a9a855a71edd601cabe29a2ebd332" offset="0"/>
@@ -4280,6 +4391,7 @@ Missing files come here
<year>1991</year>
<publisher>FormGen</publisher>
<info name="developer" value="id Software" />
+ <info name="version" value="1.4" />
<part name="flop1" interface="floppy_5_25">
<dataarea name="flop" size = "368640">
<rom name="Commander Keen in Aliens Ate My Baby Sitter! (USA) (v1.4) (5.25'') (Disk 1).img" size="368640" crc="7104af60" sha1="d1a90731b4636771b4116a54ff0be3c7f89af9e3" offset="0"/>
@@ -4302,6 +4414,7 @@ Missing files come here
<year>1991</year>
<publisher>GT Software</publisher>
<info name="developer" value="id Software" />
+ <info name="version" value="1.0" />
<part name="flop1" interface="floppy_3_5">
<dataarea name="flop" size = "737280">
<rom name="Commander Keen in Aliens Ate My Baby Sitter! (USA) (Demo v1.0) (3.5'').img" size="737280" crc="f8bc360b" sha1="1f98b701c16d4459d012385b3bb766e55694709f" offset="0"/>
@@ -4890,20 +5003,62 @@ Missing files come here
</part>
</software>
-<!--
- This is not a real dump, it was constructed using WinImage for use with MESS
- Also circulating with CRC fb591430
- <software name="ptombs">
- <description>Pharaoh's Tomb (Shareware)</description>
- <year>1994</year>
- <publisher>Apogee</publisher>
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="368640">
- <rom name="pharaoh's tomb (shareware).img" size="368640" crc="b1f4dbf6" sha1="d3c4ae0b6ac6b5233c4970805c8e4f2b89f9c57a" offset="0" />
- </dataarea>
- </part>
- </software>
--->
+ <software name="mystict">
+ <description>Mystic Towers</description>
+ <year>1994</year>
+ <publisher>Apogee Software</publisher>
+ <info name="developer" value="Animation FX" />
+ <info name="version" value="1.11" />
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size = "1474560">
+ <rom name="Mystic Towers (USA) (v1.11).img" size="1474560" crc="970fc40e" sha1="daa034e1c25cf77814d0df081e38dba95ee76139" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="omf2097" supported="partial">
+ <description>One Must Fall 2097</description>
+ <year>1994</year>
+ <publisher>Epic MegaGames</publisher>
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size = "1474560">
+ <rom name="One Must Fall 2097 (USA, Europe) (v1.1) (Disk 1).img" size="1474560" crc="d3c22bef" sha1="37ecfac3dcf2e58485c54188346c069bf0fe1221" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <dataarea name="flop" size = "1474560">
+ <rom name="One Must Fall 2097 (USA, Europe) (v1.1) (Disk 2).img" size="1474560" crc="21d0a22c" sha1="355522989a8146180ece03dd1170d887a59666c5" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <dataarea name="flop" size = "1474560">
+ <rom name="One Must Fall 2097 (USA, Europe) (v1.1) (Disk 3).img" size="1474560" crc="ff7f2994" sha1="2e05e23d1962611f75e50e3f8ca58db245852ac0" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop4" interface="floppy_3_5">
+ <dataarea name="flop" size = "1474560">
+ <rom name="One Must Fall 2097 (USA, Europe) (v1.1) (Disk 4).img" size="1474560" crc="ff8c6380" sha1="29dd79f459cbc886d46e291a4bc3b7b68594317d" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop5" interface="floppy_3_5">
+ <dataarea name="flop" size = "1474560">
+ <rom name="One Must Fall 2097 (USA, Europe) (v1.1) (Disk 5).img" size="1474560" crc="2258ca74" sha1="6669ac792b3727e272656703ea0505af90208cae" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="paganitz">
+ <description>Paganitzu</description>
+ <year>1991</year>
+ <publisher>Apogee Software</publisher>
+ <info name="developer" value="Trilobyte" />
+ <info name="version" value="1.02" />
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size = "1474560">
+ <rom name="Paganitzu (USA) (v1.02).img" size="1474560" crc="7efa4aa3" sha1="7520c44be7451ff07065471b905f93f60d507234" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
<software name="raptor12">
<description>Raptor - Call of the Shadows</description>
@@ -4927,6 +5082,28 @@ Missing files come here
</part>
</software>
+ <software name="roc">
+ <description>Realms of Chaos</description>
+ <year>1995</year>
+ <publisher>Apogee Software</publisher>
+ <info name="version" value="1.00" />
+ <part name="flop1" interface="floppy_3_5">
+ <dataarea name="flop" size = "1474560">
+ <rom name="Realms of Chaos (USA) (v1.0) (Disk 1).img" size="1474560" crc="5bf4b35f" sha1="9e369bf6157b959074a14fdde580281a587cd09f" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop2" interface="floppy_3_5">
+ <dataarea name="flop" size = "1474560">
+ <rom name="Realms of Chaos (USA) (v1.0) (Disk 2).img" size="1474560" crc="a220fe92" sha1="a67676cc1be7477886707b12de286c57f05b86b7" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="flop3" interface="floppy_3_5">
+ <dataarea name="flop" size = "1474560">
+ <rom name="Realms of Chaos (USA) (v1.0) (Disk 3).img" size="1474560" crc="4611a516" sha1="157f4bb42c1293feb5bac9d7452619711bb4c1dd" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="samnmax">
<!-- Dumped via Kryoflux, track 0 shows as modified on all disks -->
<description>Sam &amp; Max Hit the Road</description>
diff --git a/hash/ibmpcjr_cart.xml b/hash/ibmpcjr_cart.xml
index e40d40f4d19..3d4e67342bf 100644
--- a/hash/ibmpcjr_cart.xml
+++ b/hash/ibmpcjr_cart.xml
@@ -30,9 +30,9 @@ Micro Surgeon (Imagic)
*CrossFire (Sierra OnLine)
*Mine Shaft (Sierra OnLine)
-FaceMaker (Spinaker)
-KinderComp (Spinaker)
-Fraction Fever (Spinaker)
+FaceMaker (Spinnaker)
+KinderComp (Spinnaker)
+*Fraction Fever (Spinnaker)
-->
<software name="basic">
@@ -89,6 +89,17 @@ Fraction Fever (Spinaker)
</part>
</software>
+ <software name="fracfevr">
+ <description>Fraction Fever</description>
+ <year>1983</year>
+ <publisher>Spinnaker</publisher>
+ <part name="cart1" interface="ibmpcjr_cart">
+ <dataarea name="rom" size = "8192">
+ <rom name="fraction.bin" size="8192" crc="28bb80e0" sha1="2ab31a435fa2f0c07226f3f7cf073f2b2a6c1c2c" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
<software name="lotus123">
<description>Lotus 123jr</description>
<year>1984</year>
diff --git a/hash/ibmpcjr_flop.xml b/hash/ibmpcjr_flop.xml
index da16081dbaf..d7d995aa29d 100644
--- a/hash/ibmpcjr_flop.xml
+++ b/hash/ibmpcjr_flop.xml
@@ -67,20 +67,6 @@
</part>
</software>
- <!-- will be moved to the pc softlist oneday when one is created. These was sold also for the IBM PCjr-->
- <software name="nortutil">
- <description>The Norton Utilities 3.10</description>
- <year>1986</year>
- <publisher>Peter Norton Computing, Inc.</publisher>
- <info name="usage" value="boot from PC DOS 2.1 and then load, using: nc /d1" />
- <!-- marked as bad since source is questionable, needs a redump -->
- <part name="flop1" interface="floppy_5_25">
- <dataarea name="flop" size="368640">
- <rom name="norton utilities 310.img" size="368640" crc="b27b8cbb" sha1="34b5973fe5354a08b4d2a987473f82cd82a581cd" offset="0x00000" status="baddump" />
- </dataarea>
- </part>
- </software>
-
<software name="procm24">
<description>ProComm (Version 2.4.3)</description>
<year>1988</year>
diff --git a/hash/megadriv.xml b/hash/megadriv.xml
index 24d3c031904..e15890ba459 100644
--- a/hash/megadriv.xml
+++ b/hash/megadriv.xml
@@ -24548,46 +24548,54 @@ Notice that these are not working on real hardware due to bugged code with VDP i
</part>
</software>
- <software name="skp10" cloneof="sk">
+ <software name="skp06" cloneof="sk">
<description>Sonic &amp; Knuckles (Prototype 0606, 19940606, 10.02)</description>
<year>1994</year>
<publisher>Sega</publisher>
<part name="cart" interface="megadriv_cart">
- <dataarea name="rom" width="16" endianness="big" size="2097152">
+ <feature name="slot" value="rom_sk"/>
+ <dataarea name="rom" width="16" endianness="big" size="3407872">
<rom name="sonic &amp; knuckles (prototype 0606 - jun 06, 1994, 10.02).bin" size="2097152" crc="03a52f63" sha1="173524ffae78438b5ddd039ec8b8def786f28aee" offset="0x000000"/>
+ <rom name="sonic &amp; knuckles (s2k chip) (prototype 0606 - jun 05, 1994, 22.25).bin" size="262144" crc="bd619ea9" sha1="f557741d93f8d3e8a84099ab88f0331ced2875c8" offset="0x300000"/>
</dataarea>
</part>
</software>
- <software name="skp08" cloneof="sk">
+ <software name="skp05" cloneof="sk">
<description>Sonic &amp; Knuckles (Prototype 0608, 19940608, 05.03)</description>
<year>1994</year>
<publisher>Sega</publisher>
<part name="cart" interface="megadriv_cart">
- <dataarea name="rom" width="16" endianness="big" size="2097152">
+ <feature name="slot" value="rom_sk"/>
+ <dataarea name="rom" width="16" endianness="big" size="3407872">
<rom name="sonic &amp; knuckles (prototype 0608 - jun 08, 1994, 05.03).bin" size="2097152" crc="7a6c1317" sha1="a55b784590e602a82719d6721b2789f686564d2b" offset="0x000000"/>
+ <rom name="sonic &amp; knuckles (s2k chip) (prototype 0608 - jun 08, 1994, 03.35).bin" size="262144" crc="6a5dcbe6" sha1="f27434f63ce45de92c361b0b3aabdfde80c237da" offset="0x300000"/>
</dataarea>
</part>
</software>
- <software name="skp06" cloneof="sk">
+ <software name="skp04" cloneof="sk">
<description>Sonic &amp; Knuckles (Prototype 0610, 19940610, 07.49)</description>
<year>1994</year>
<publisher>Sega</publisher>
<part name="cart" interface="megadriv_cart">
- <dataarea name="rom" width="16" endianness="big" size="2097152">
+ <feature name="slot" value="rom_sk"/>
+ <dataarea name="rom" width="16" endianness="big" size="3407872">
<rom name="sonic &amp; knuckles (prototype 0610 - jun 10, 1994, 07.49).bin" size="2097152" crc="7092f368" sha1="bc67cb9edb8958a66723a8346c9d58d43d18ca80" offset="0x000000"/>
+ <rom name="sonic &amp; knuckles (s2k chip) (prototype 0610 - jun 10, 1994, 03.11).bin" size="262144" crc="0f6ff22b" sha1="d2b4003a7110f258641b7b76d7716acbcb3b62ab" offset="0x300000"/>
</dataarea>
</part>
</software>
- <software name="skp04" cloneof="sk">
+ <software name="skp03" cloneof="sk">
<description>Sonic &amp; Knuckles (Prototype 0612, 19940612, 18.27)</description>
<year>1994</year>
<publisher>Sega</publisher>
<part name="cart" interface="megadriv_cart">
- <dataarea name="rom" width="16" endianness="big" size="2097152">
+ <feature name="slot" value="rom_sk"/>
+ <dataarea name="rom" width="16" endianness="big" size="3407872">
<rom name="sonic &amp; knuckles (prototype 0612 - jun 12, 1994, 18.27).bin" size="2097152" crc="b0a253e8" sha1="8585b617e6828bf0b255d4ef747384db7ff67826" offset="0x000000"/>
+ <rom name="sonic &amp; knuckles (s2k chip) (prototype 0612 - jun 12, 1994, 18.18).bin" size="262144" crc="9a5f8183" sha1="eb29700a161a1949ed3057a3580911c7932315a5" offset="0x300000"/>
</dataarea>
</part>
</software>
@@ -24597,8 +24605,10 @@ Notice that these are not working on real hardware due to bugged code with VDP i
<year>1994</year>
<publisher>Sega</publisher>
<part name="cart" interface="megadriv_cart">
- <dataarea name="rom" width="16" endianness="big" size="2097152">
+ <feature name="slot" value="rom_sk"/>
+ <dataarea name="rom" width="16" endianness="big" size="3407872">
<rom name="sonic &amp; knuckles (prototype 0618 - jun 18, 1994, 09.15).bin" size="2097152" crc="2615f5dc" sha1="e365c42a2c754b9df98b5b74dbc3e7f94c1a84f4" offset="0x000000"/>
+ <rom name="sonic &amp; knuckles (s2k chip) (prototype 0618 - jun 18, 1994, 9.07).bin" size="262144" crc="4dcfd55c" sha1="70429f1d80503a0632f603bf762fe0bbaa881d22" offset="0x300000"/>
</dataarea>
</part>
</software>
@@ -24608,86 +24618,32 @@ Notice that these are not working on real hardware due to bugged code with VDP i
<year>1994</year>
<publisher>Sega</publisher>
<part name="cart" interface="megadriv_cart">
- <dataarea name="rom" width="16" endianness="big" size="2097152">
+ <feature name="slot" value="rom_sk"/>
+ <dataarea name="rom" width="16" endianness="big" size="3407872">
<rom name="sonic &amp; knuckles (prototype 0619 - jun 19, 1994, 08.18).bin" size="2097152" crc="1ea5b9d1" sha1="b84d197e646ceece8681d35af3b4014c1bbeae35" offset="0x000000"/>
+ <rom name="sonic &amp; knuckles (s2k chip) (prototype 0618 - jun 18, 1994, 9.07).bin" size="262144" crc="4dcfd55c" sha1="70429f1d80503a0632f603bf762fe0bbaa881d22" offset="0x300000"/>
</dataarea>
</part>
</software>
-<!-- These are just dumps of the mpr-16911-s.ic2 lock-on chip. should be matched with the SK data above to get proper sets to be locked on Sonic 2... -->
- <software name="skp11" cloneof="sk" supported="no">
- <description>Sonic &amp; Knuckles (Prototype 0606, 19940605, 22.25, S2K chip)</description>
- <year>1994</year>
- <publisher>Sega</publisher>
- <part name="cart" interface="megadriv_cart">
- <dataarea name="rom" width="16" endianness="big" size="262144">
- <rom name="sonic &amp; knuckles (s2k chip) (prototype 0606 - jun 05, 1994, 22.25).bin" size="262144" crc="bd619ea9" sha1="f557741d93f8d3e8a84099ab88f0331ced2875c8" offset="0x000000"/>
- </dataarea>
- </part>
- </software>
-
- <software name="skp09" cloneof="sk" supported="no">
- <description>Sonic &amp; Knuckles (Prototype 0608, 19940608, 03.35, S2K chip)</description>
- <year>1994</year>
- <publisher>Sega</publisher>
- <part name="cart" interface="megadriv_cart">
- <dataarea name="rom" width="16" endianness="big" size="262144">
- <rom name="sonic &amp; knuckles (s2k chip) (prototype 0608 - jun 08, 1994, 03.35).bin" size="262144" crc="6a5dcbe6" sha1="f27434f63ce45de92c361b0b3aabdfde80c237da" offset="0x000000"/>
- </dataarea>
- </part>
- </software>
-
- <software name="skp07" cloneof="sk" supported="no">
- <description>Sonic &amp; Knuckles (Prototype 0610, 19940610, 03.11, S2K chip)</description>
- <year>1994</year>
- <publisher>Sega</publisher>
- <part name="cart" interface="megadriv_cart">
- <dataarea name="rom" width="16" endianness="big" size="262144">
- <rom name="sonic &amp; knuckles (s2k chip) (prototype 0610 - jun 10, 1994, 03.11).bin" size="262144" crc="0f6ff22b" sha1="d2b4003a7110f258641b7b76d7716acbcb3b62ab" offset="0x000000"/>
- </dataarea>
- </part>
- </software>
-
- <software name="skp05" cloneof="sk" supported="no">
- <description>Sonic &amp; Knuckles (Prototype 0612, 19940612, 18.18, S2K chip)</description>
- <year>1994</year>
- <publisher>Sega</publisher>
- <part name="cart" interface="megadriv_cart">
- <dataarea name="rom" width="16" endianness="big" size="262144">
- <rom name="sonic &amp; knuckles (s2k chip) (prototype 0612 - jun 12, 1994, 18.18).bin" size="262144" crc="9a5f8183" sha1="eb29700a161a1949ed3057a3580911c7932315a5" offset="0x000000"/>
- </dataarea>
- </part>
- </software>
-
- <software name="skp03" cloneof="sk" supported="no">
- <description>Sonic &amp; Knuckles (Prototype 0618, 19940618, 9.07, S2K chip)</description>
+ <software name="skp07" cloneof="sk">
+ <description>Sonic &amp; Knuckles (Prototype 0525, 19940525, 15.28)</description>
<year>1994</year>
<publisher>Sega</publisher>
<part name="cart" interface="megadriv_cart">
- <dataarea name="rom" width="16" endianness="big" size="262144">
- <rom name="sonic &amp; knuckles (s2k chip) (prototype 0618 - jun 18, 1994, 9.07).bin" size="262144" crc="4dcfd55c" sha1="70429f1d80503a0632f603bf762fe0bbaa881d22" offset="0x000000"/>
+ <dataarea name="rom" width="16" endianness="big" size="4194304">
+ <rom name="sonic &amp; knuckles (prototype 0525 - may 25, 1994, 15.28).bin" size="4194304" crc="8e8dadd0" sha1="5f2c4dc4e739d562e9f0525361ba83f3e0551e21" offset="0x000000"/>
</dataarea>
</part>
</software>
<software name="knucklp">
<description>Knuckles in Sonic 2 (Prototype 0524, 19940527, 10.46)</description>
- <year>199?</year>
- <publisher>&lt;unknown&gt;</publisher>
- <part name="cart" interface="megadriv_cart">
- <dataarea name="rom" width="16" endianness="big" size="4194304">
- <rom name="knuckles in sonic 2 (prototype 0524 - may 27, 1994, 10.46).bin" size="4194304" crc="8878c1a8" sha1="3a827d575f5a484c24e6c31417f32d6c5f0045de" offset="0x000000"/>
- </dataarea>
- </part>
- </software>
-
- <software name="skp12" cloneof="sk">
- <description>Sonic &amp; Knuckles (Prototype 0525, 19940525, 15.28)</description>
<year>1994</year>
<publisher>Sega</publisher>
<part name="cart" interface="megadriv_cart">
<dataarea name="rom" width="16" endianness="big" size="4194304">
- <rom name="sonic &amp; knuckles (prototype 0525 - may 25, 1994, 15.28).bin" size="4194304" crc="8e8dadd0" sha1="5f2c4dc4e739d562e9f0525361ba83f3e0551e21" offset="0x000000"/>
+ <rom name="knuckles in sonic 2 (prototype 0524 - may 27, 1994, 10.46).bin" size="4194304" crc="8878c1a8" sha1="3a827d575f5a484c24e6c31417f32d6c5f0045de" offset="0x000000"/>
</dataarea>
</part>
</software>
diff --git a/hash/neogeo.xml b/hash/neogeo.xml
index 27a462ebfa3..818e036a5fc 100644
--- a/hash/neogeo.xml
+++ b/hash/neogeo.xml
@@ -7669,6 +7669,47 @@
<sharedfeat name="release" value="MVS" /> <!-- Unknown if it was also released on AES -->
<sharedfeat name="compatibility" value="MVS,AES" />
<part name="cart" interface="neo_cart">
+ <feature name="slot" value="sma_kof99" />
+ <dataarea name="maincpu" width="16" endianness="big" size="0x900000">
+ <rom loadflag="load16_word_swap" name="kb.neo-sma" offset="0x0c0000" size="0x040000" crc="9fccc688" sha1="1a24d0fe7cabe7b346f538e099f1357bbf77bc89" />
+ <!-- stored in the custom chip -->
+ <rom loadflag="load16_word_swap" name="151-pg1k.p1" offset="0x100000" size="0x400000" crc="ef259292" sha1="e02f2d0c71eac74424507e4845991fbc12821045" /> <!-- mask rom TC5332205 -->
+ <rom loadflag="load16_word_swap" name="151-pg2k.p2" offset="0x500000" size="0x400000" crc="f3898ec2" sha1="c7fd230fbb97a9b171aeae8ff1a5cd39ba7fa9eb" /> <!-- mask rom TC5332205 -->
+ </dataarea>
+ <dataarea name="fixed" size="0x20000">
+ <!-- The Encrypted Boards do _not_ have an s1 rom, data for it comes from the Cx ROMs -->
+ <rom value="0" size="0x20000" offset="0x000000" loadflag="fill" />
+ </dataarea>
+ <dataarea name="audiocpu" size="0x020000">
+ <rom offset="0x000000" size="0x020000" name="251-m1.m1" crc="5e74539c" sha1="6f49a9343cbd026b2c6720ff3fa2e5b1f85e80da" /> <!-- TC531001 -->
+ </dataarea>
+ <dataarea name="ymsnd" size="0x0e00000">
+ <rom name="251-v1.v1" offset="0x000000" size="0x400000" crc="ef2eecc8" sha1="8ed13b9db92dba3124bc5ba66e3e275885ece24a" /> <!-- TC5332204 -->
+ <rom name="251-v2.v2" offset="0x400000" size="0x400000" crc="73e211ca" sha1="0e60fa64cab6255d9721e2b4bc22e3de64c874c5" /> <!-- TC5332204 -->
+ <rom name="251-v3.v3" offset="0x800000" size="0x400000" crc="821901da" sha1="c6d4975bfaa19a62ed59126cadf2578c0a5c257f" /> <!-- TC5332204 -->
+ <rom name="251-v4.v4" offset="0xc00000" size="0x200000" crc="b49e6178" sha1="dde6f76e958841e8c99b693e13ced9aa9ef316dc" /> <!-- TC5316200 -->
+ </dataarea>
+ <dataarea name="sprites" size="0x4000000">
+ <!-- Encrypted -->
+ <rom loadflag="load16_byte" name="251-c1.c1" offset="0x000000" size="0x800000" crc="0f9e93fe" sha1="c7d77f0833c6f526f632e4f2dce59e302f6b9a15" /> <!-- TC5364205 -->
+ <rom loadflag="load16_byte" name="251-c2.c2" offset="0x000001" size="0x800000" crc="e71e2ea3" sha1="39c7a326fddbcca3b29c68cdc96aad4d62295c0f" /> <!-- TC5364205 -->
+ <rom loadflag="load16_byte" name="251-c3.c3" offset="0x1000000" size="0x800000" crc="238755d2" sha1="01125b5c7a28e350f091280b041954fd1ac7c98f" /> <!-- TC5364205 -->
+ <rom loadflag="load16_byte" name="251-c4.c4" offset="0x1000001" size="0x800000" crc="438c8b22" sha1="ffbc643f5b27dd00f2f95d4ef4c5f29ee814722b" /> <!-- TC5364205 -->
+ <rom loadflag="load16_byte" name="251-c5.c5" offset="0x2000000" size="0x800000" crc="0b0abd0a" sha1="d5ad324fe523bdc6f09209d236cc4932524a48f1" /> <!-- TC5364205 -->
+ <rom loadflag="load16_byte" name="251-c6.c6" offset="0x2000001" size="0x800000" crc="65bbf281" sha1="79ae174667a23dabcfe865b6cd6133c86098452e" /> <!-- TC5364205 -->
+ <rom loadflag="load16_byte" name="251-c7.c7" offset="0x3000000" size="0x800000" crc="ff65f62e" sha1="7cd335fede05b56e15db90ce407c1183a78da4e9" /> <!-- TC5364205 -->
+ <rom loadflag="load16_byte" name="251-c8.c8" offset="0x3000001" size="0x800000" crc="8d921c68" sha1="42acf1d27d52a8e3b6262eb7df50693c0b135565" /> <!-- TC5364205 -->
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kof99ka" cloneof="kof99">
+ <description>The King of Fighters '99 - Millennium Battle (Korean release, non-encrypted program)</description>
+ <year>1999</year>
+ <publisher>SNK</publisher>
+ <sharedfeat name="release" value="MVS" /> <!-- Unknown if it was also released on AES -->
+ <sharedfeat name="compatibility" value="MVS,AES" />
+ <part name="cart" interface="neo_cart">
<feature name="slot" value="cmc42_kof99k" />
<dataarea name="maincpu" width="16" endianness="big" size="0x500000">
<rom loadflag="load16_word_swap" name="152-p1.p1" offset="0x000000" size="0x100000" crc="f2c7ddfa" sha1="d592eecc53d442c55c2f26a6a721fdf2924d2a5b" />
diff --git a/hash/pico.xml b/hash/pico.xml
index f0b33dd69cd..f2a746121a7 100644
--- a/hash/pico.xml
+++ b/hash/pico.xml
@@ -1382,6 +1382,17 @@ Published by Others (T-yyy*** serial codes, for yyy depending on the publisher)
</dataarea>
</part>
</software>
+
+ <software name="eccojri" cloneof="eccojr">
+ <description>Ecco Jr. e la Grande Caccia al Tesoro nell'Oceano! (Ita)</description>
+ <year>1994</year>
+ <publisher>Sega</publisher>
+ <part name="cart" interface="pico_cart">
+ <dataarea name="rom" size="524288">
+ <rom name="mpr-17738-h.ic1" size="524288" crc="03ca1014" sha1="64e5d8f749e9e6c839b3655c9e8cf38e699c058d" offset="000000" loadflag="load16_word_swap" />
+ </dataarea>
+ </part>
+ </software>
<software name="eccojrj" cloneof="eccojr">
<description>Ecco Jr. and the Great Ocean Treasure Hunt! (Jpn)</description>
diff --git a/hash/snes.xml b/hash/snes.xml
index 6ff4c5c0843..0a981df7fe6 100644
--- a/hash/snes.xml
+++ b/hash/snes.xml
@@ -33286,8 +33286,8 @@ Alternate board (XL-1)
</dataarea>
</part>
</software>
-
- <software name="lostvik">
+
+ <software name="lostvik">
<description>The Lost Vikings (Euro)</description>
<year>1993</year>
<publisher>Interplay</publisher>
diff --git a/hash/sorcerer_cass.xml b/hash/sorcerer_cass.xml
index 9dbbc9f78f9..e383f519069 100644
--- a/hash/sorcerer_cass.xml
+++ b/hash/sorcerer_cass.xml
@@ -773,4 +773,15 @@
</dataarea>
</part>
</software>
+ <software name="interceptor">
+ <description>Interceptor</description>
+ <year>198?</year>
+ <publisher>Blair Rideout</publisher>
+ <info name="usage" value="Boot to Monitor, LOG" />
+ <part name="cass" interface="sorcerer_cass">
+ <dataarea name="cass" size="7201560">
+ <rom name="interceptor.wav" size="7201560" crc="144ad2be" sha1="621776831dacde4d25777eb87300c0e9e692b74f" offset="0" />
+ </dataarea>
+ </part>
+ </software>
</softwarelist>
diff --git a/hash/vic1001_flop.xml b/hash/vic1001_flop.xml
index 183b2a680d3..52df6a600a3 100644
--- a/hash/vic1001_flop.xml
+++ b/hash/vic1001_flop.xml
@@ -58,4 +58,17 @@
</part>
</software>
+ <software name="speakez">
+ <description>SpeakEasy</description>
+ <year>1983</year>
+ <publisher>Personal Peripheral Products</publisher>
+ <sharedfeat name="compatibility" value="NTSC,PAL"/>
+ <sharedfeat name="requirement" value="vic1001_cart:speakez"/>
+ <part name="flop1" interface="floppy_5_25">
+ <dataarea name="flop" size="174848">
+ <rom name="speakeasy.d64" size="174848" crc="bfd060ca" sha1="d2c5b5c2b6c5ef01891e3256a4aad8ec2bbbbfe5" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
</softwarelist>
diff --git a/hash/vsmile_cart.xml b/hash/vsmile_cart.xml
index 59a1d0a4eba..aac89d865ae 100644
--- a/hash/vsmile_cart.xml
+++ b/hash/vsmile_cart.xml
@@ -516,1408 +516,1408 @@ Game cartridges
<softwarelist name="vsmile_cart" description="VTech V.Smile cartridges">
- <software name="aladdin" supported="no">
- <description>Disneys Aladdin - Aladdins Welt der Wunder (Ger)</description>
- <year>2005?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092204(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-3" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92204.u1" size="8388608" crc="dfa7b720" sha1="c4f7bcbe95c7eb5dfd0dd97f5d496db6ac158ea6" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="redhood" supported="no">
- <description>Entdecke die Welt von Rotkäppchen (Ger)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092024(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-2" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92024.u1" size="8388608" crc="cdeb71f9" sha1="21d2ecf5bc22fa94a1015de6f670415b6d42a3b1" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="alphaprk" supported="no">
- <description>Alphabet Park Adventure (USA)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092000(US)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708894" />
- <feature name="pcb_model" value="708894-A" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92000.u1" size="8388608" crc="69ef24ff" sha1="82b89bdc5e9050e4152866fc774d3996f9836d65" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="ariel" supported="no">
- <description>Disneys Arielle die Meerjungfrau - Arielles aufregendes Abenteuer (Ger, Rev. 3?)</description>
- <year>2004?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092124(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708106" />
- <feature name="pcb_model" value="708106-1" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92124(3).u1" size="8388608" crc="fc2d6d64" sha1="3747eb33304bb49a8f9ff912c0e3e07611e078dd" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="ariel1" cloneof="ariel" supported="no">
- <description>Disneys Arielle Die Meerjungfrau - Arielles aufregendes Abenteuer (Ger)</description>
- <year>2004?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092124(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708894" />
- <feature name="pcb_model" value="708894-A" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92124.u1" size="8388608" crc="ce21b7ba" sha1="e992b113f014614db34b81bb22357847cef79a16" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="arielf" cloneof="ariel" supported="no">
- <description>Disney La Petite Sirene - Ariel devient une princesse (Fra)</description>
- <year>2004?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092125(FR)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-2" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92125.u1" size="8388608" crc="341b2f6c" sha1="a9f6a30037dc814b6cf8e8485ee9778038a20c23" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="arieldk" cloneof="ariel" supported="no">
- <description>Disney Den Lille Havfrue - Ariels majestætiske rejse! (Den)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092133(DK)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-1" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92133.u1" size="8388608" crc="182b5973" sha1="7f356a9890c7ea20c81db94f81037355b8cfb2c9" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="arielsw" cloneof="ariel" supported="no">
- <description>Disneys Den Lilla Sjöjungfrun - Ariels majestätiska resa! (Swe)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092134(SE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708894" />
- <feature name="pcb_model" value="708894-E" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92134.u1" size="8388608" crc="e567db85" sha1="ca52eaca6cf1b361fd4b1ae2b2380095c612668d" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="barney" supported="no">
- <description>Barney - Erlebnis-Reise (Ger)</description>
- <year>2005?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092384(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="7061238A" />
- <feature name="pcb_model" value="7061238A-3" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92384.u1" size="8388608" crc="a73855fa" sha1="dcc61ecf05bb41779a78196145136c1e9cbfa415" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <!-- loads if mapped as Batman TV -->
- <software name="bobbday" supported="no">
- <description>Bob the Builder - Bob's Busy Day (USA)</description>
- <year>2005?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092300(US)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="7061238A" />
- <feature name="pcb_model" value="7061238A-3" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92300.u1" size="8388608" crc="6aea957b" sha1="947008c882733a8284a000c9c4d379e2c213526e" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="bobbdayg" cloneof="bobbday" supported="no">
- <description>Bob der Baumeister - Bobs spannender Arbeitstag (Ger)</description>
- <year>2005?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092304(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-2" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92304.u1" size="8388608" crc="70c83b25" sha1="bebe311cfbeb25e01892b7636f4427ae0e0e4c9e" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="bobbdaydk" cloneof="bobbday" supported="no">
- <description>Byggemand Bob - Bobs travle dag (Den)</description>
- <year>2006?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092313(DK)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-1" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92313.u1" size="8388608" crc="37498231" sha1="2966ba75fc4430ee5d9dc7003d7f7e54e5546382" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="bobbdaysw" cloneof="bobbday" supported="no">
- <description>Byggare Bob - Bobs stressiga dag (Swe)</description>
- <year>2006?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092314(SE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708106" />
- <feature name="pcb_model" value="708106-3" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92314-100.u1" size="8388608" crc="ac343df7" sha1="77dafa48ca0e015728c5ead844dd729e87eb6182" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <!-- loads if mapped as Batman TV -->
- <software name="cars" supported="no">
- <description>Disney/Pixar Cars - Rev It Up in Radiator Springs (USA)</description>
- <year>2006?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092660(US)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-2" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="092660.u1" size="8388608" crc="ff65d967" sha1="27b229b6e308dfc0cea7e594c7b006f27961c05f" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="carsg" cloneof="cars" supported="no">
- <description>Disney/Pixar Cars - Vollgas in Radiator Springs (Ger)</description>
- <year>2006?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092664(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-3" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92664(2).u1" size="8388608" crc="6f4c150d" sha1="f6fc136ca18025511a9b12c577860116fdc66c8c" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="carsf" cloneof="cars" supported="no">
- <description>Disney/Pixar Cars - Quatre Roues (Fra)</description>
- <year>2006?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092665(FR)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-3" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="092665.u1" size="8388608" crc="c1f63c2e" sha1="3a6726a0a5dd5543d632dfbf57144da780994ba5" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="carsdk" cloneof="cars" supported="no">
- <description>Disney/Pixar Biler - Ræs i Kølerkildekøbing (Den)</description>
- <year>2007?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092673(DK)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-2" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92673.u1" size="8388608" crc="380d5655" sha1="fa70dcfd2793b5ba7bede3b365e245c8fde935d7" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="carssw" cloneof="cars" supported="no">
- <description>Disney/Pixar Bilar - Kör ikapp i Kylarköping (Swe)</description>
- <year>2007?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092674(SE)" />
- <info name="alt_title" value="Biler - Kör ikapp i Kylarköping (Misprinted cart)"/>
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708201" />
- <feature name="pcb_model" value="708201-7" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="C92674-1.u1" size="8388608" crc="69b535f2" sha1="7785e4e92a0edbb90fd0e0a4f2de3afafae5e957" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="cinderla" supported="no">
- <description>Disney Princess Cinderella - Cinderella's Magic Wishes (USA)</description>
- <year>2005?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092240(US)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="706714" />
- <feature name="pcb_model" value="706714-1" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92240.u1" size="8388608" crc="2723728c" sha1="32fd6a5b9718ccc7e10e64046d7ac320cfa47362" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="cinderlaa" cloneof="cinderla" supported="no">
- <description>Disney Princess Cinderella - Cinderella's Magic Wishes (USA, Alt)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092240(US)" />
- <part name="cart" interface="vsmile_cart">
- <dataarea name="rom" size="8388608">
- <rom name="52-92240(us).bin" size="8388608" crc="0a89723c" sha1="15082b565f6f71a0f993c2734cb807f37611eb17" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="cinderlaf" cloneof="cinderla" supported="no">
- <description>Disney Princesses Cendrillon - Le rêve enchanté de Cendrillon (Fra)</description>
- <year>2005?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092245(FR)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-2" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92245.u1" size="8388608" crc="7c63221f" sha1="227e1d3b63714e6bf8d0fc0897bab9ffc1721ff5" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="cinderladk" cloneof="cinderla" supported="no">
- <description>Disney Princess Cinderella - Askepots magiske ønsker (Den)</description>
- <year>2006?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092253(DK)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-2" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="092253.u1" size="8388608" crc="81edbee0" sha1="cf4bca5a1f28049a40060eead7f10c940574107f" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="cinderlag" cloneof="cinderla" supported="no">
- <description>Disney Princess Cinderella - Lernen im Märchenland (Ger, Rev. 1)</description>
- <year>2007?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092244-104(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-2" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92244-1.u1" size="8388608" crc="7dbe47a2" sha1="d74d24d1d87a456f11a98f822b8c59d155734cea" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="cinderlag1" cloneof="cinderla" supported="no">
- <description>Disney Princess Cinderella - Lernen im Märchenland (Ger)</description>
- <year>2005?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092244(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="706714" />
- <feature name="pcb_model" value="706714-1" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92244.u1" size="8388608" crc="b08a50f3" sha1="a8e6b8b427115d01d35c27b41385ac5d430484c3" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="cinderlasw" cloneof="cinderla" supported="no">
- <description>Disney Princess Cinderella - Askungens magiska önskningar (Swe)</description>
- <year>2006?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092254(SE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-3" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92254.u1" size="8388608" crc="946472af" sha1="9009a81689be949f9a5fbf91a6a1d2398f7e8d90" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="mickymag" supported="no">
- <description>Disney's Mickey Mouse - Mickey's Magical Adventure (USA)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092080(US)" />
- <part name="cart" interface="vsmile_cart">
- <dataarea name="rom" size="8388608">
- <rom name="52-092080(us).bin" size="8388608" crc="997a8a07" sha1="cd70c7249e25a37aeb3a3b85f56bd2b39dbf3d73" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <!-- loads if mapped as Batman TV -->
- <software name="dora" supported="no">
- <description>Nick Jr Dora the Explorer - Dora's Fix-it Adventure (USA)</description>
- <year>2005?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092280(US)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-1" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92280.u1" size="8388608" crc="225c3133" sha1="97610c09834251d1960dbc67da18dad91e832dba" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="doraf" cloneof="dora" supported="no">
- <description>Dora L'Exploratrice - Les aventures de Dora Apprentie Mécano (Fra)</description>
- <year>2005?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092285(FR)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="7061238A" />
- <feature name="pcb_model" value="7061238A-3" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92285.u1" size="8388608" crc="5f47e1d5" sha1="046b5ce7669755e8d8a9be9be2684828b1f1dd9d" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="dorag" cloneof="dora" supported="no">
- <description>Nick Jr Dora - Doras Reparatur-Abenteuer (Ger, Rev. 1)</description>
- <year>2007?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092284-104(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708201" />
- <feature name="pcb_model" value="708201-4" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="092284-1.u1" size="8388608" crc="070a72dc" sha1="3ca4820f2b54040d1d111b5ac41003c6e53b9164" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="elmo" supported="no">
- <description>Elmos großes Abenteuer (Ger)</description>
- <year>2005?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092264(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="706714" />
- <feature name="pcb_model" value="706714-1" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92264.u1" size="8388608" crc="906b6496" sha1="8932008fef144d2ad3d056fd24f64264825af8ce" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="footschl" supported="no">
- <description>V.Smile Fußball Schule (Ger)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092824(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-2" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92824.u1" size="8388608" crc="620b9ebb" sha1="e22ff87a03c6cac3186613a9e804dd6d4e3a3dc4" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="findnemo" supported="no">
- <description>Disney/Pixar Finding Nemo - Nemo's Ocean Discoveries (USA)</description>
- <year>2005?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092420(US)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-2" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92420.u1" size="8388608" crc="e40e46dc" sha1="ac78178cff76ed264589113b73211b1f4cfe6dbf" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="fred" supported="no">
- <description>Freds Zahlen Rallye (Ger)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092044(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708894" />
- <feature name="pcb_model" value="708894-A" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92044.u1" size="8388608" crc="24988ef6" sha1="7f5d647dc8edf780ea86a43e08e8d2169b19a0ae" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="appilote" cloneof="fred" supported="no">
- <description>Apprenti' pilote (Fra)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092045(FR)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708894" />
- <feature name="pcb_model" value="708894-A" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92045.u1" size="8388608" crc="c4819e95" sha1="b625a7fb1d078349aee1c4cc18ee6f3917aaa816" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="kleinstn" supported="no">
- <description>Kleine Einsteins (Ger, Rev. 3?)</description>
- <year>2009?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092984(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708201" />
- <feature name="pcb_model" value="708201-6" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92984-3.u1" size="8388608" crc="8f671aa7" sha1="a6a0a5cd5c5bf14c1b546354bfe9209820955975" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="lionking" supported="no">
- <description>Disney's The Lion King - Simba's Big Adventure (USA)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092100(US)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-1" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92100.u1" size="8388608" crc="08af3249" sha1="193d824625040ae9e30d8f5b7b74d7348bf3b7cd" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="lionkingdk" cloneof="lionking" supported="no">
- <description>Disney Løvernes Konge - Simbas store eventyr (Den)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092113(DK)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708894" />
- <feature name="pcb_model" value="708894-E" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92113.u1" size="8388608" crc="924efa89" sha1="fd111f99ef101d318a66a728927d379559dc0106" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="lionkingsw" cloneof="lionking" supported="no">
- <description>Disney Lejonkungen - Simbas stora äventyr (Swe)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092114(SE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708894" />
- <feature name="pcb_model" value="708894-E" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92114.u1" size="8388608" crc="e1123089" sha1="058c60342c49844b4855d11ce1219879bfd2b6be" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="manny" supported="no">
- <description>Meister Manny's Werkzeugkiste (Ger)</description>
- <year>2009?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-090024(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708201" />
- <feature name="pcb_model" value="708201-4" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="90024 OK.u1" size="8388608" crc="8358af57" sha1="f7886adb508413584df1abfc8bde68c830b3e487" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="melodil">
- <description>Nickelodeon Les Mélodilous - Les explorateurs vikings (Fra)</description>
- <year>2006?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092585(FR)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-2" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="092585.u1" size="8388608" crc="99d3d704" sha1="5ba4489849a4e49a22a5083750b4e41a565a4cd6" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="mickymagg" cloneof="mickymag" supported="no">
- <description>Disneys Micky - Mickys magisches Abenteuer (Ger)</description>
- <year>2004?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092084(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-2" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92084.u1" size="8388608" crc="e50692f3" sha1="5c5a338e0186fdd643441455c778780ef5936042" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="mickymagsw" cloneof="mickymag" supported="no">
- <description>Disneys Musse Pigg - Musses magiska äventyr (Swe)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092094(SE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708106" />
- <feature name="pcb_model" value="708106-1" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92094.u1" size="8388608" crc="9ec8d52f" sha1="0f6f6cc4a34aacfa4ad97a73f4c5ad04e7bcec40" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="mickeywh" supported="no">
- <description>Micky Maus Wunderhaus (Ger, Rev. 3?)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092944(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708201" />
- <feature name="pcb_model" value="708201-4" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92944-3.u1" size="8388608" crc="11695793" sha1="ea58234636d544dbf6d3f65508fcf5263355636f" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="mickeychsw" cloneof="mickeywh" supported="no">
- <description>Mickey Mouse Clubhouse (Swe)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092954(SE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708201" />
- <feature name="pcb_model" value="708201-7" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92954.u1" size="8388608" crc="6d8a99d2" sha1="f929e5c3a2aff21dcf38bbbb6441a95eed744256" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="monstaln" supported="no">
- <description>DreamWorks Monsters vs Aliens (Ger)</description>
- <year>2009?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-090164(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708201" />
- <feature name="pcb_model" value="708201-4" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="90164 OK.u1" size="8388608" crc="bf531c68" sha1="00c3a04282f3d1eb517fc6eb8c4af413bcb9587b" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="mypuppy" supported="no">
- <description>Mein erster Hund (Ger)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-090144(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708201" />
- <feature name="pcb_model" value="708201-4" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="90144 OK.u1" size="8388608" crc="501a4c33" sha1="ebd3e8acd9e1e53409544b847cf508d75a8a0012" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="mypuppysw" cloneof="mypuppy" supported="no">
- <description>Min hundvalp (Swe)</description>
- <year>2009?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-090154(SE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708201" />
- <feature name="pcb_model" value="708201-6" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="A90154.u1" size="8388608" crc="b1cf55cf" sha1="654b104e2ad8414a29db70bb9e07873b8eca8645" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="noddy" supported="no">
- <description>Noddy - Detektiv für einen Tag (Ger, Rev. 3?)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092544-104(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708201" />
- <feature name="pcb_model" value="708201-4" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92544-3.u1" size="8388608" crc="2402b5b4" sha1="98dd09522b3d897dd8db070e08e66fcaebb192a2" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="oben" supported="no">
- <description>Disney/Pixar Oben (Ger)</description>
- <year>2009?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-090004-004(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708201" />
- <feature name="pcb_model" value="708201-4" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="90004 ok.u1" size="8388608" crc="e1b9c194" sha1="a5547757e566a854c5dc1173565c7de47e4877f2" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="partyprk" supported="no">
- <description>Cranium Partyland Park - A Carnival of Play-and-Learn Fun (USA)</description>
- <year>2007?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092920(US)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-3" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92920(2).u1" size="8388608" crc="bb8271ad" sha1="e59a8da24c08d596e1ef60b6cceb769bdb689ece" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="ratat" supported="no">
- <description>Disney/Pixar Ratatouille - Remys neue Rezepte (Ger)</description>
- <year>2007?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092884(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-3" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92884.u1" size="8388608" crc="d8e36793" sha1="e8d7078726b077d1bf0a13b715de4a03fd93189c" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="scoobydo" supported="no">
- <description>Scooby-Doo! - Funland Frenzy (USA)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092160(US)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-1" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92160.u1" size="8388608" crc="161ef602" sha1="d4020599c83a64b9f1f972b0b8ebc4c3fcc85970" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="scoobydof" cloneof="scoobydo" supported="no">
- <description>Scooby-Doo - Panique à Funland (Fra)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092165(FR)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="706714" />
- <feature name="pcb_model" value="706714-1" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92165.u1" size="8388608" crc="ba35c0ac" sha1="9c1525f0da65deeadeef5aa6e43477775804da88" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="scoobydog" cloneof="scoobydo" supported="no">
- <description>Scooby-Doo! - Im Lernpark (Ger)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092164(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708894" />
- <feature name="pcb_model" value="708894-E" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92164.u1" size="8388608" crc="97576369" sha1="81d84286a09068d54a4d1051040187a1b89c9d42" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="scoobydodk" cloneof="scoobydo" supported="no">
- <description>Scooby-Doo! - Sjov i forlystelsesparken (Den)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092173(DK)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-2" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="092173.u1" size="8388608" crc="d24dd55a" sha1="85850a6ec0215442f99d1554ee6af62773c93426" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="scoobydosw" cloneof="scoobydo" supported="no">
- <description>Scooby-Doo! - Tivoli-tokerier (Swe)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092174(SE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-2" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="092174.u1" size="8388608" crc="ecec53de" sha1="ad021dae6a8633b66172e3b0ef357b2dd52b021e" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="erniebrt" supported="no">
- <description>Ernies &amp; Berts Fantastisches Abenteuer (Ger)</description>
- <year>2006?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092464(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-2" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92464.u1" size="8388608" crc="064c620c" sha1="d44e8a5507f18e544de707cae4b9a7d309c56fdf" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="shrek3" supported="no">
- <description>DreamWorks Shrek the Third - Arthur's School Day Adventure (USA)</description>
- <year>2007?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092860(US)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-2" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92860.u1" size="8388608" crc="eb84fc96" sha1="20ac2101fd0679e888f31ee38b1ba1358b0932a8" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="shrek" supported="no">
- <description>DreamWorks Shrek - Die Geschichte des Drachen (Ger)</description>
- <year>2006?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092604(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-2" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="092604.u1" size="8388608" crc="0abbb98b" sha1="7b23e7a5a1f1b5f3a39427b563e06340268db272" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="shrekf" cloneof="shrek" supported="no">
- <description>DreamWorks Shrek - Le rhume de Dragonne (Fra)</description>
- <year>2006?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092605(FR)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-2" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="092605.u1" size="8388608" crc="31334442" sha1="09022c94ac69e362979148bec9380f36fb6b88be" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="spidermn" supported="no">
- <description>Spider-Man &amp; ses amis - Missions secrètes (Fra)</description>
- <year>2005?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092145(FR)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="706714" />
- <feature name="pcb_model" value="706714-1" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92145.u1" size="8388608" crc="906b0ab6" sha1="da5435366a439afd70ff210c0e655839f66fbef3" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="spiderm2" supported="no">
- <description>Spider-Man &amp; Freunde - Wettkampf im Space-Labor (Ger)</description>
- <year>2006?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092524(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="706714" />
- <feature name="pcb_model" value="706714-1" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92524.u1" size="8388608" crc="eb9e2303" sha1="07ee3fba4e850487c365fd883ac1fb53a25d0028" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="spongeb" supported="no">
- <description>Nickelodeon Spongebob Squarepants - A Day in the Life of a Sponge (USA)</description>
- <year>2005?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092440(US)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-2" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92440.u1" size="8388608" crc="92afd10b" sha1="22ac256853201a5feaf86dc709ff05ad748d217c" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="spongebg" cloneof="spongeb" supported="no">
- <description>Nickelodeon Spongebob Schwammkopf - Der Tag des Schwamms (Ger, Rev. 1)</description>
- <year>2005?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092444(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="706714" />
- <feature name="pcb_model" value="706714-1" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92444.u1" size="8388608" crc="49e1dc61" sha1="e55822fa9b2ae0cfba63b7a897aadbee23af5f4d" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="spongebg1" cloneof="spongeb" supported="no">
- <description>Nickelodeon Spongebob Schwammkopf - Der Tag des Schwamms (Ger)</description>
- <year>2005?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092444(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-2" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92444.u1" size="8388608" crc="1bc67f49" sha1="817aa0f13d3934bf3993baaac0185ef49ac825ba" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="superman" supported="no">
- <description>Superman - Der Superheld (Ger)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092644(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-2" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92644.u1" size="8388608" crc="4b28aca5" sha1="5ce55940a2357de0df0dcf5d77a69cd9e03a9146" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="supermanf" cloneof="superman" supported="no">
- <description>Superman - À la rescousse ! (Fra)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092645(FR)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-2" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="092645.u1" size="8388608" crc="0e42dee7" sha1="2aa140b000e702d253ca72e5e54c9087608fe199" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="thomas" supported="no">
- <description>Thomas &amp; seine Freunde - Freunde Halten Zusammen (Ger, Rev. 1)</description>
- <year>2007?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092344-104(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-3" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="092344-1.u1" size="8388608" crc="9e9fc42c" sha1="27f7e98c180ee3b51cc2ce4fc19e3f3f5777887a" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="thomas1" cloneof="thomas" supported="no">
- <description>Thomas &amp; seine Freunde - Freunde Halten Zusammen (Ger)</description>
- <year>2007?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092344(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708106" />
- <feature name="pcb_model" value="708106-1" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92344-1(3).u1" size="8388608" crc="f0a73961" sha1="2e043e131073ad27ca7cebc28c237ecd8c1271e8" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="thomassw" cloneof="thomas" supported="no">
- <description>Thomas &amp; Friends - Tågen hjälps åt (Swe)</description>
- <year>2007?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092354(SE)" /> <!-- 494096(SE) on cart -->
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708106" />
- <feature name="pcb_model" value="708106-1" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92354.u1" size="8388608" crc="d3dfc103" sha1="fbb4a460504797253a47945ae3bea4e7eda4a388" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="tingelng" supported="no">
- <description>Tingeling (Swe)</description>
- <year>2010?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-090274(SE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708201" />
- <feature name="pcb_model" value="708201-7" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="90274.u1" size="8388608" crc="5ae6dced" sha1="3298bf1fb43173e1c4c2200ddc5a1a6af57d4323" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="toystor2" supported="no">
- <description>Disney/Pixar Toy Story 2 - Operation: Rescue Woody! (USA)</description>
- <year>2005</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092220(US)" />
- <part name="cart" interface="vsmile_cart">
- <dataarea name="rom" size="8388608">
- <rom name="52-92220(us).bin" size="8388608" crc="6335b0e1" sha1="ddb4bcc5f9b155041bf4ffce236f57cfae3fdec2" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="toystor2g" cloneof="toystor2" supported="no">
- <description>Disney/Pixar Toy Story 2 - Woodys Spannende Rettung (Ger)</description>
- <year>2006?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092224(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-3" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92224-105.u1" size="8388608" crc="c6fbdb94" sha1="887f1d2acadc6902d386488577654a6786d802a9" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="toystor2sw" cloneof="toystor2" supported="no">
- <description>Disney/Pixar Toy Story 2 - Operation: Rädda Woody! (Swe)</description>
- <year>2005?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092234(SE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-2" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92234.u1" size="8388608" crc="a6aa6d6b" sha1="ca576d994441ffaac96e015f5a9309e0326280e1" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="walle" supported="no">
- <description>Disney/Pixar Wall-E (Ger)</description>
- <year>2008?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092844(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708201" />
- <feature name="pcb_model" value="708201-4" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92844-3.u1" size="8388608" crc="f4be4391" sha1="5e43c9dd4759218578d1a8364540db8bc6bc6416" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="wallesw" cloneof="walle" supported="no">
- <description>Disney/Pixar Wall-E (Swe)</description>
- <year>2008?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092854(SE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708106" />
- <feature name="pcb_model" value="708106-1" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92854.u1" size="8388608" crc="860194d2" sha1="3d5f40a0f523c9b090a826fef45a6bc63a58d519" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="pooh" supported="no">
- <description>Disneys Winnie Puuh - Die Honigjagd (Ger)</description>
- <year>2004?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092064(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="706714" />
- <feature name="pcb_model" value="706714-1" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92064.u1" size="8388608" crc="38a17e7e" sha1="434849ba8867d0bfb16b0fb5abfec86286390c07" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="pooh1" cloneof="pooh" supported="no">
- <description>My Friends Tigger &amp; Pooh - Die Honigjagd (Ger)</description>
- <year>2008?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092064-104(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-3" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92064-204(2).u1" size="8388608" crc="081e414d" sha1="e612aee1f62ca260bc0b011a512fd8c207eeb833" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="poohf" cloneof="pooh" supported="no">
- <description>Disney Winnie l'Ourson - La Chasse au miel de Winnie (Fra)</description>
- <year>2004?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092065(FR)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708894" />
- <feature name="pcb_model" value="708894-1" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92065.u1" size="8388608" crc="7b0bd06c" sha1="0767e07e767a64c0fe56dac7b3cb478bab34b864" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="poohdk" cloneof="pooh" supported="no">
- <description>Disney Peter Plys - Honningjagten (Den)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092073(DK)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="706714" />
- <feature name="pcb_model" value="706714-1" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92073.u1" size="8388608" crc="f2cf8e50" sha1="9ef7e8a3f03c252970348f2eabc53010c1ee588b" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="poohsw" cloneof="pooh" supported="no">
- <description>Disney Nalle Puh - Honungsjakten (Swe)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092074(SE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-1" />
- <feature name="cart_type" value="lilac" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92074.u1" size="8388608" crc="70bde4da" sha1="788a8b471ef97106fbcaeb053cd6aa19c6ac299a" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="lerntanz" supported="no">
- <description>V.Smile - Lern- und Tanzmatte (Ger)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-091324(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="707180" />
- <feature name="pcb_model" value="707180-2" />
- <feature name="cart_type" value="yellow" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="91324.u1" size="8388608" crc="db81c1e1" sha1="fbe3f9ee65b7a692c568dde8986df7a2bba8b133" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="techart" supported="no">
- <description>V.Smile Zeichenatelier (Ger)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-067004(GER)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="67000C" />
- <feature name="pcb_model" value="67000C-5" />
- <feature name="cart_type" value="yellow" />
- <feature name="u2" value="U2" /> <!-- SRAM -->
- <feature name="u3" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="4194304">
- <rom name="GER-509.u3" size="4194304" crc="ae5f4fe2" sha1="1c5428da7464182e6ee0585d1ebc211f91667238" offset="0" />
- </dataarea>
- <dataarea name="vram" size="131072">
- </dataarea>
- </part>
- </software>
-
- <software name="techartsw" cloneof="techart" supported="no">
- <description>V.Smile Tecknarstudio (Swe)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-067021(SE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="67000C" />
- <feature name="pcb_model" value="67000C-2" />
- <feature name="cart_type" value="yellow" />
- <feature name="u2" value="U2" /> <!-- SRAM -->
- <feature name="u3" value="U3" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="4194304">
- <rom name="52-67021.u3" size="4194304" crc="27449e15" sha1="5c13865dffb04c98c69f3422c965d76a9aa36c33" offset="0" />
- </dataarea>
- <dataarea name="vram" size="131072">
- </dataarea>
- </part>
- </software>
-
- <software name="zayzmac" cloneof="zayzaea" supported="no">
- <description>Zayzoo - My Alien Classmate (USA)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092360(US)" />
- <part name="cart" interface="vsmile_cart">
- <dataarea name="rom" size="8388608">
- <rom name="52-92360(us).bin" size="8388608" crc="76ff9718" sha1="be783c1abe96f785564f5b5b6b4ea089b799c1d4" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="zayzaea" supported="no">
- <description>Zayzoo: An Earth Adventure (USA)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092360-101(US)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="708201" />
- <feature name="pcb_model" value="708201-4" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92360-201(4).u1" size="8388608" crc="0b1f8225" sha1="7c2e39428faf40cff2007ae1a3e2f2ae565e5db4" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="zayzmacg" cloneof="zayzaea" supported="no">
- <description>Zayzoos Lernall (Ger)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092364(GE)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="706714" />
- <feature name="pcb_model" value="706714-1" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92364.u1" size="8388608" crc="93e9dcf3" sha1="5889e46806d1fa70ac92ec6b2158a339126a26d2" offset="0" />
- </dataarea>
- </part>
- </software>
-
- <software name="zezou" cloneof="zayzaea" supported="no">
- <description>Zézou - Notre Ami Venu d'Ailleurs (Fra)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-092365(FR)" />
- <part name="cart" interface="vsmile_cart">
- <feature name="pcb" value="706714" />
- <feature name="pcb_model" value="706714-1" />
- <feature name="cart_type" value="lilac" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="92365.u1" size="8388608" crc="e965565e" sha1="9cabefa6a2dc0cd2df9d07bb0e11ae0b2dd4d5f8" offset="0" />
- </dataarea>
- </part>
- </software>
+ <software name="aladdin" supported="no">
+ <description>Disneys Aladdin - Aladdins Welt der Wunder (Ger)</description>
+ <year>2005?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092204(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-3" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92204.u1" size="8388608" crc="dfa7b720" sha1="c4f7bcbe95c7eb5dfd0dd97f5d496db6ac158ea6" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="redhood" supported="no">
+ <description>Entdecke die Welt von Rotkäppchen (Ger)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092024(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-2" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92024.u1" size="8388608" crc="cdeb71f9" sha1="21d2ecf5bc22fa94a1015de6f670415b6d42a3b1" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="alphaprk" supported="no">
+ <description>Alphabet Park Adventure (USA)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092000(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708894" />
+ <feature name="pcb_model" value="708894-A" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92000.u1" size="8388608" crc="69ef24ff" sha1="82b89bdc5e9050e4152866fc774d3996f9836d65" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ariel" supported="no">
+ <description>Disneys Arielle die Meerjungfrau - Arielles aufregendes Abenteuer (Ger, Rev. 3?)</description>
+ <year>2004?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092124(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708106" />
+ <feature name="pcb_model" value="708106-1" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92124(3).u1" size="8388608" crc="fc2d6d64" sha1="3747eb33304bb49a8f9ff912c0e3e07611e078dd" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ariel1" cloneof="ariel" supported="no">
+ <description>Disneys Arielle Die Meerjungfrau - Arielles aufregendes Abenteuer (Ger)</description>
+ <year>2004?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092124(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708894" />
+ <feature name="pcb_model" value="708894-A" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92124.u1" size="8388608" crc="ce21b7ba" sha1="e992b113f014614db34b81bb22357847cef79a16" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="arielf" cloneof="ariel" supported="no">
+ <description>Disney La Petite Sirene - Ariel devient une princesse (Fra)</description>
+ <year>2004?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092125(FR)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-2" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92125.u1" size="8388608" crc="341b2f6c" sha1="a9f6a30037dc814b6cf8e8485ee9778038a20c23" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="arieldk" cloneof="ariel" supported="no">
+ <description>Disney Den Lille Havfrue - Ariels majestætiske rejse! (Den)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092133(DK)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-1" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92133.u1" size="8388608" crc="182b5973" sha1="7f356a9890c7ea20c81db94f81037355b8cfb2c9" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="arielsw" cloneof="ariel" supported="no">
+ <description>Disneys Den Lilla Sjöjungfrun - Ariels majestätiska resa! (Swe)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092134(SE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708894" />
+ <feature name="pcb_model" value="708894-E" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92134.u1" size="8388608" crc="e567db85" sha1="ca52eaca6cf1b361fd4b1ae2b2380095c612668d" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="barney" supported="no">
+ <description>Barney - Erlebnis-Reise (Ger)</description>
+ <year>2005?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092384(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="7061238A" />
+ <feature name="pcb_model" value="7061238A-3" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92384.u1" size="8388608" crc="a73855fa" sha1="dcc61ecf05bb41779a78196145136c1e9cbfa415" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- loads if mapped as Batman TV -->
+ <software name="bobbday" supported="no">
+ <description>Bob the Builder - Bob's Busy Day (USA)</description>
+ <year>2005?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092300(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="7061238A" />
+ <feature name="pcb_model" value="7061238A-3" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92300.u1" size="8388608" crc="6aea957b" sha1="947008c882733a8284a000c9c4d379e2c213526e" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bobbdayg" cloneof="bobbday" supported="no">
+ <description>Bob der Baumeister - Bobs spannender Arbeitstag (Ger)</description>
+ <year>2005?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092304(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-2" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92304.u1" size="8388608" crc="70c83b25" sha1="bebe311cfbeb25e01892b7636f4427ae0e0e4c9e" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bobbdaydk" cloneof="bobbday" supported="no">
+ <description>Byggemand Bob - Bobs travle dag (Den)</description>
+ <year>2006?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092313(DK)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-1" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92313.u1" size="8388608" crc="37498231" sha1="2966ba75fc4430ee5d9dc7003d7f7e54e5546382" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bobbdaysw" cloneof="bobbday" supported="no">
+ <description>Byggare Bob - Bobs stressiga dag (Swe)</description>
+ <year>2006?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092314(SE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708106" />
+ <feature name="pcb_model" value="708106-3" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92314-100.u1" size="8388608" crc="ac343df7" sha1="77dafa48ca0e015728c5ead844dd729e87eb6182" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- loads if mapped as Batman TV -->
+ <software name="cars" supported="no">
+ <description>Disney/Pixar Cars - Rev It Up in Radiator Springs (USA)</description>
+ <year>2006?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092660(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-2" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="092660.u1" size="8388608" crc="ff65d967" sha1="27b229b6e308dfc0cea7e594c7b006f27961c05f" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="carsg" cloneof="cars" supported="no">
+ <description>Disney/Pixar Cars - Vollgas in Radiator Springs (Ger)</description>
+ <year>2006?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092664(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-3" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92664(2).u1" size="8388608" crc="6f4c150d" sha1="f6fc136ca18025511a9b12c577860116fdc66c8c" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="carsf" cloneof="cars" supported="no">
+ <description>Disney/Pixar Cars - Quatre Roues (Fra)</description>
+ <year>2006?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092665(FR)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-3" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="092665.u1" size="8388608" crc="c1f63c2e" sha1="3a6726a0a5dd5543d632dfbf57144da780994ba5" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="carsdk" cloneof="cars" supported="no">
+ <description>Disney/Pixar Biler - Ræs i Kølerkildekøbing (Den)</description>
+ <year>2007?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092673(DK)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-2" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92673.u1" size="8388608" crc="380d5655" sha1="fa70dcfd2793b5ba7bede3b365e245c8fde935d7" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="carssw" cloneof="cars" supported="no">
+ <description>Disney/Pixar Bilar - Kör ikapp i Kylarköping (Swe)</description>
+ <year>2007?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092674(SE)" />
+ <info name="alt_title" value="Biler - Kör ikapp i Kylarköping (Misprinted cart)"/>
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708201" />
+ <feature name="pcb_model" value="708201-7" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="C92674-1.u1" size="8388608" crc="69b535f2" sha1="7785e4e92a0edbb90fd0e0a4f2de3afafae5e957" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cinderla" supported="no">
+ <description>Disney Princess Cinderella - Cinderella's Magic Wishes (USA)</description>
+ <year>2005?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092240(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="706714" />
+ <feature name="pcb_model" value="706714-1" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92240.u1" size="8388608" crc="2723728c" sha1="32fd6a5b9718ccc7e10e64046d7ac320cfa47362" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cinderlaa" cloneof="cinderla" supported="no">
+ <description>Disney Princess Cinderella - Cinderella's Magic Wishes (USA, Alt)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092240(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <dataarea name="rom" size="8388608">
+ <rom name="52-92240(us).bin" size="8388608" crc="0a89723c" sha1="15082b565f6f71a0f993c2734cb807f37611eb17" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cinderlaf" cloneof="cinderla" supported="no">
+ <description>Disney Princesses Cendrillon - Le rêve enchanté de Cendrillon (Fra)</description>
+ <year>2005?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092245(FR)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-2" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92245.u1" size="8388608" crc="7c63221f" sha1="227e1d3b63714e6bf8d0fc0897bab9ffc1721ff5" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cinderladk" cloneof="cinderla" supported="no">
+ <description>Disney Princess Cinderella - Askepots magiske ønsker (Den)</description>
+ <year>2006?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092253(DK)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-2" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="092253.u1" size="8388608" crc="81edbee0" sha1="cf4bca5a1f28049a40060eead7f10c940574107f" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cinderlag" cloneof="cinderla" supported="no">
+ <description>Disney Princess Cinderella - Lernen im Märchenland (Ger, Rev. 1)</description>
+ <year>2007?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092244-104(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-2" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92244-1.u1" size="8388608" crc="7dbe47a2" sha1="d74d24d1d87a456f11a98f822b8c59d155734cea" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cinderlag1" cloneof="cinderla" supported="no">
+ <description>Disney Princess Cinderella - Lernen im Märchenland (Ger)</description>
+ <year>2005?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092244(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="706714" />
+ <feature name="pcb_model" value="706714-1" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92244.u1" size="8388608" crc="b08a50f3" sha1="a8e6b8b427115d01d35c27b41385ac5d430484c3" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cinderlasw" cloneof="cinderla" supported="no">
+ <description>Disney Princess Cinderella - Askungens magiska önskningar (Swe)</description>
+ <year>2006?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092254(SE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-3" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92254.u1" size="8388608" crc="946472af" sha1="9009a81689be949f9a5fbf91a6a1d2398f7e8d90" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mickymag" supported="no">
+ <description>Disney's Mickey Mouse - Mickey's Magical Adventure (USA)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092080(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <dataarea name="rom" size="8388608">
+ <rom name="52-092080(us).bin" size="8388608" crc="997a8a07" sha1="cd70c7249e25a37aeb3a3b85f56bd2b39dbf3d73" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <!-- loads if mapped as Batman TV -->
+ <software name="dora" supported="no">
+ <description>Nick Jr Dora the Explorer - Dora's Fix-it Adventure (USA)</description>
+ <year>2005?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092280(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-1" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92280.u1" size="8388608" crc="225c3133" sha1="97610c09834251d1960dbc67da18dad91e832dba" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="doraf" cloneof="dora" supported="no">
+ <description>Dora L'Exploratrice - Les aventures de Dora Apprentie Mécano (Fra)</description>
+ <year>2005?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092285(FR)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="7061238A" />
+ <feature name="pcb_model" value="7061238A-3" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92285.u1" size="8388608" crc="5f47e1d5" sha1="046b5ce7669755e8d8a9be9be2684828b1f1dd9d" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dorag" cloneof="dora" supported="no">
+ <description>Nick Jr Dora - Doras Reparatur-Abenteuer (Ger, Rev. 1)</description>
+ <year>2007?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092284-104(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708201" />
+ <feature name="pcb_model" value="708201-4" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="092284-1.u1" size="8388608" crc="070a72dc" sha1="3ca4820f2b54040d1d111b5ac41003c6e53b9164" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elmo" supported="no">
+ <description>Elmos großes Abenteuer (Ger)</description>
+ <year>2005?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092264(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="706714" />
+ <feature name="pcb_model" value="706714-1" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92264.u1" size="8388608" crc="906b6496" sha1="8932008fef144d2ad3d056fd24f64264825af8ce" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="footschl" supported="no">
+ <description>V.Smile Fußball Schule (Ger)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092824(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-2" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92824.u1" size="8388608" crc="620b9ebb" sha1="e22ff87a03c6cac3186613a9e804dd6d4e3a3dc4" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="findnemo" supported="no">
+ <description>Disney/Pixar Finding Nemo - Nemo's Ocean Discoveries (USA)</description>
+ <year>2005?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092420(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-2" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92420.u1" size="8388608" crc="e40e46dc" sha1="ac78178cff76ed264589113b73211b1f4cfe6dbf" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fred" supported="no">
+ <description>Freds Zahlen Rallye (Ger)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092044(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708894" />
+ <feature name="pcb_model" value="708894-A" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92044.u1" size="8388608" crc="24988ef6" sha1="7f5d647dc8edf780ea86a43e08e8d2169b19a0ae" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="appilote" cloneof="fred" supported="no">
+ <description>Apprenti' pilote (Fra)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092045(FR)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708894" />
+ <feature name="pcb_model" value="708894-A" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92045.u1" size="8388608" crc="c4819e95" sha1="b625a7fb1d078349aee1c4cc18ee6f3917aaa816" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kleinstn" supported="no">
+ <description>Kleine Einsteins (Ger, Rev. 3?)</description>
+ <year>2009?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092984(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708201" />
+ <feature name="pcb_model" value="708201-6" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92984-3.u1" size="8388608" crc="8f671aa7" sha1="a6a0a5cd5c5bf14c1b546354bfe9209820955975" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lionking" supported="no">
+ <description>Disney's The Lion King - Simba's Big Adventure (USA)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092100(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-1" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92100.u1" size="8388608" crc="08af3249" sha1="193d824625040ae9e30d8f5b7b74d7348bf3b7cd" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lionkingdk" cloneof="lionking" supported="no">
+ <description>Disney Løvernes Konge - Simbas store eventyr (Den)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092113(DK)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708894" />
+ <feature name="pcb_model" value="708894-E" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92113.u1" size="8388608" crc="924efa89" sha1="fd111f99ef101d318a66a728927d379559dc0106" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lionkingsw" cloneof="lionking" supported="no">
+ <description>Disney Lejonkungen - Simbas stora äventyr (Swe)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092114(SE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708894" />
+ <feature name="pcb_model" value="708894-E" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92114.u1" size="8388608" crc="e1123089" sha1="058c60342c49844b4855d11ce1219879bfd2b6be" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="manny" supported="no">
+ <description>Meister Manny's Werkzeugkiste (Ger)</description>
+ <year>2009?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-090024(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708201" />
+ <feature name="pcb_model" value="708201-4" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="90024 OK.u1" size="8388608" crc="8358af57" sha1="f7886adb508413584df1abfc8bde68c830b3e487" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="melodil">
+ <description>Nickelodeon Les Mélodilous - Les explorateurs vikings (Fra)</description>
+ <year>2006?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092585(FR)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-2" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="092585.u1" size="8388608" crc="99d3d704" sha1="5ba4489849a4e49a22a5083750b4e41a565a4cd6" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mickymagg" cloneof="mickymag" supported="no">
+ <description>Disneys Micky - Mickys magisches Abenteuer (Ger)</description>
+ <year>2004?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092084(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-2" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92084.u1" size="8388608" crc="e50692f3" sha1="5c5a338e0186fdd643441455c778780ef5936042" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mickymagsw" cloneof="mickymag" supported="no">
+ <description>Disneys Musse Pigg - Musses magiska äventyr (Swe)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092094(SE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708106" />
+ <feature name="pcb_model" value="708106-1" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92094.u1" size="8388608" crc="9ec8d52f" sha1="0f6f6cc4a34aacfa4ad97a73f4c5ad04e7bcec40" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mickeywh" supported="no">
+ <description>Micky Maus Wunderhaus (Ger, Rev. 3?)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092944(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708201" />
+ <feature name="pcb_model" value="708201-4" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92944-3.u1" size="8388608" crc="11695793" sha1="ea58234636d544dbf6d3f65508fcf5263355636f" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mickeychsw" cloneof="mickeywh" supported="no">
+ <description>Mickey Mouse Clubhouse (Swe)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092954(SE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708201" />
+ <feature name="pcb_model" value="708201-7" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92954.u1" size="8388608" crc="6d8a99d2" sha1="f929e5c3a2aff21dcf38bbbb6441a95eed744256" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="monstaln" supported="no">
+ <description>DreamWorks Monsters vs Aliens (Ger)</description>
+ <year>2009?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-090164(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708201" />
+ <feature name="pcb_model" value="708201-4" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="90164 OK.u1" size="8388608" crc="bf531c68" sha1="00c3a04282f3d1eb517fc6eb8c4af413bcb9587b" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mypuppy" supported="no">
+ <description>Mein erster Hund (Ger)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-090144(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708201" />
+ <feature name="pcb_model" value="708201-4" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="90144 OK.u1" size="8388608" crc="501a4c33" sha1="ebd3e8acd9e1e53409544b847cf508d75a8a0012" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mypuppysw" cloneof="mypuppy" supported="no">
+ <description>Min hundvalp (Swe)</description>
+ <year>2009?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-090154(SE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708201" />
+ <feature name="pcb_model" value="708201-6" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="A90154.u1" size="8388608" crc="b1cf55cf" sha1="654b104e2ad8414a29db70bb9e07873b8eca8645" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="noddy" supported="no">
+ <description>Noddy - Detektiv für einen Tag (Ger, Rev. 3?)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092544-104(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708201" />
+ <feature name="pcb_model" value="708201-4" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92544-3.u1" size="8388608" crc="2402b5b4" sha1="98dd09522b3d897dd8db070e08e66fcaebb192a2" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="oben" supported="no">
+ <description>Disney/Pixar Oben (Ger)</description>
+ <year>2009?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-090004-004(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708201" />
+ <feature name="pcb_model" value="708201-4" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="90004 ok.u1" size="8388608" crc="e1b9c194" sha1="a5547757e566a854c5dc1173565c7de47e4877f2" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="partyprk" supported="no">
+ <description>Cranium Partyland Park - A Carnival of Play-and-Learn Fun (USA)</description>
+ <year>2007?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092920(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-3" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92920(2).u1" size="8388608" crc="bb8271ad" sha1="e59a8da24c08d596e1ef60b6cceb769bdb689ece" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ratat" supported="no">
+ <description>Disney/Pixar Ratatouille - Remys neue Rezepte (Ger)</description>
+ <year>2007?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092884(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-3" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92884.u1" size="8388608" crc="d8e36793" sha1="e8d7078726b077d1bf0a13b715de4a03fd93189c" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="scoobydo" supported="no">
+ <description>Scooby-Doo! - Funland Frenzy (USA)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092160(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-1" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92160.u1" size="8388608" crc="161ef602" sha1="d4020599c83a64b9f1f972b0b8ebc4c3fcc85970" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="scoobydof" cloneof="scoobydo" supported="no">
+ <description>Scooby-Doo - Panique à Funland (Fra)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092165(FR)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="706714" />
+ <feature name="pcb_model" value="706714-1" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92165.u1" size="8388608" crc="ba35c0ac" sha1="9c1525f0da65deeadeef5aa6e43477775804da88" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="scoobydog" cloneof="scoobydo" supported="no">
+ <description>Scooby-Doo! - Im Lernpark (Ger)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092164(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708894" />
+ <feature name="pcb_model" value="708894-E" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92164.u1" size="8388608" crc="97576369" sha1="81d84286a09068d54a4d1051040187a1b89c9d42" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="scoobydodk" cloneof="scoobydo" supported="no">
+ <description>Scooby-Doo! - Sjov i forlystelsesparken (Den)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092173(DK)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-2" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="092173.u1" size="8388608" crc="d24dd55a" sha1="85850a6ec0215442f99d1554ee6af62773c93426" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="scoobydosw" cloneof="scoobydo" supported="no">
+ <description>Scooby-Doo! - Tivoli-tokerier (Swe)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092174(SE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-2" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="092174.u1" size="8388608" crc="ecec53de" sha1="ad021dae6a8633b66172e3b0ef357b2dd52b021e" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="erniebrt" supported="no">
+ <description>Ernies &amp; Berts Fantastisches Abenteuer (Ger)</description>
+ <year>2006?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092464(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-2" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92464.u1" size="8388608" crc="064c620c" sha1="d44e8a5507f18e544de707cae4b9a7d309c56fdf" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="shrek3" supported="no">
+ <description>DreamWorks Shrek the Third - Arthur's School Day Adventure (USA)</description>
+ <year>2007?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092860(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-2" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92860.u1" size="8388608" crc="eb84fc96" sha1="20ac2101fd0679e888f31ee38b1ba1358b0932a8" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="shrek" supported="no">
+ <description>DreamWorks Shrek - Die Geschichte des Drachen (Ger)</description>
+ <year>2006?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092604(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-2" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="092604.u1" size="8388608" crc="0abbb98b" sha1="7b23e7a5a1f1b5f3a39427b563e06340268db272" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="shrekf" cloneof="shrek" supported="no">
+ <description>DreamWorks Shrek - Le rhume de Dragonne (Fra)</description>
+ <year>2006?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092605(FR)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-2" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="092605.u1" size="8388608" crc="31334442" sha1="09022c94ac69e362979148bec9380f36fb6b88be" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spidermn" supported="no">
+ <description>Spider-Man &amp; ses amis - Missions secrètes (Fra)</description>
+ <year>2005?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092145(FR)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="706714" />
+ <feature name="pcb_model" value="706714-1" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92145.u1" size="8388608" crc="906b0ab6" sha1="da5435366a439afd70ff210c0e655839f66fbef3" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spiderm2" supported="no">
+ <description>Spider-Man &amp; Freunde - Wettkampf im Space-Labor (Ger)</description>
+ <year>2006?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092524(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="706714" />
+ <feature name="pcb_model" value="706714-1" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92524.u1" size="8388608" crc="eb9e2303" sha1="07ee3fba4e850487c365fd883ac1fb53a25d0028" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spongeb" supported="no">
+ <description>Nickelodeon Spongebob Squarepants - A Day in the Life of a Sponge (USA)</description>
+ <year>2005?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092440(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-2" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92440.u1" size="8388608" crc="92afd10b" sha1="22ac256853201a5feaf86dc709ff05ad748d217c" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spongebg" cloneof="spongeb" supported="no">
+ <description>Nickelodeon Spongebob Schwammkopf - Der Tag des Schwamms (Ger, Rev. 1)</description>
+ <year>2005?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092444(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="706714" />
+ <feature name="pcb_model" value="706714-1" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92444.u1" size="8388608" crc="49e1dc61" sha1="e55822fa9b2ae0cfba63b7a897aadbee23af5f4d" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spongebg1" cloneof="spongeb" supported="no">
+ <description>Nickelodeon Spongebob Schwammkopf - Der Tag des Schwamms (Ger)</description>
+ <year>2005?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092444(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-2" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92444.u1" size="8388608" crc="1bc67f49" sha1="817aa0f13d3934bf3993baaac0185ef49ac825ba" offset="0" /> <!-- sldh -->
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="superman" supported="no">
+ <description>Superman - Der Superheld (Ger)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092644(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-2" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92644.u1" size="8388608" crc="4b28aca5" sha1="5ce55940a2357de0df0dcf5d77a69cd9e03a9146" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="supermanf" cloneof="superman" supported="no">
+ <description>Superman - À la rescousse ! (Fra)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092645(FR)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-2" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="092645.u1" size="8388608" crc="0e42dee7" sha1="2aa140b000e702d253ca72e5e54c9087608fe199" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="thomas" supported="no">
+ <description>Thomas &amp; seine Freunde - Freunde Halten Zusammen (Ger, Rev. 1)</description>
+ <year>2007?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092344-104(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-3" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="092344-1.u1" size="8388608" crc="9e9fc42c" sha1="27f7e98c180ee3b51cc2ce4fc19e3f3f5777887a" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="thomas1" cloneof="thomas" supported="no">
+ <description>Thomas &amp; seine Freunde - Freunde Halten Zusammen (Ger)</description>
+ <year>2007?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092344(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708106" />
+ <feature name="pcb_model" value="708106-1" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92344-1(3).u1" size="8388608" crc="f0a73961" sha1="2e043e131073ad27ca7cebc28c237ecd8c1271e8" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="thomassw" cloneof="thomas" supported="no">
+ <description>Thomas &amp; Friends - Tågen hjälps åt (Swe)</description>
+ <year>2007?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092354(SE)" /> <!-- 494096(SE) on cart -->
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708106" />
+ <feature name="pcb_model" value="708106-1" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92354.u1" size="8388608" crc="d3dfc103" sha1="fbb4a460504797253a47945ae3bea4e7eda4a388" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tingelng" supported="no">
+ <description>Tingeling (Swe)</description>
+ <year>2010?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-090274(SE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708201" />
+ <feature name="pcb_model" value="708201-7" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="90274.u1" size="8388608" crc="5ae6dced" sha1="3298bf1fb43173e1c4c2200ddc5a1a6af57d4323" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="toystor2" supported="no">
+ <description>Disney/Pixar Toy Story 2 - Operation: Rescue Woody! (USA)</description>
+ <year>2005</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092220(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <dataarea name="rom" size="8388608">
+ <rom name="52-92220(us).bin" size="8388608" crc="6335b0e1" sha1="ddb4bcc5f9b155041bf4ffce236f57cfae3fdec2" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="toystor2g" cloneof="toystor2" supported="no">
+ <description>Disney/Pixar Toy Story 2 - Woodys Spannende Rettung (Ger)</description>
+ <year>2006?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092224(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-3" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92224-105.u1" size="8388608" crc="c6fbdb94" sha1="887f1d2acadc6902d386488577654a6786d802a9" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="toystor2sw" cloneof="toystor2" supported="no">
+ <description>Disney/Pixar Toy Story 2 - Operation: Rädda Woody! (Swe)</description>
+ <year>2005?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092234(SE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-2" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92234.u1" size="8388608" crc="a6aa6d6b" sha1="ca576d994441ffaac96e015f5a9309e0326280e1" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="walle" supported="no">
+ <description>Disney/Pixar Wall-E (Ger)</description>
+ <year>2008?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092844(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708201" />
+ <feature name="pcb_model" value="708201-4" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92844-3.u1" size="8388608" crc="f4be4391" sha1="5e43c9dd4759218578d1a8364540db8bc6bc6416" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wallesw" cloneof="walle" supported="no">
+ <description>Disney/Pixar Wall-E (Swe)</description>
+ <year>2008?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092854(SE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708106" />
+ <feature name="pcb_model" value="708106-1" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92854.u1" size="8388608" crc="860194d2" sha1="3d5f40a0f523c9b090a826fef45a6bc63a58d519" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pooh" supported="no">
+ <description>Disneys Winnie Puuh - Die Honigjagd (Ger)</description>
+ <year>2004?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092064(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="706714" />
+ <feature name="pcb_model" value="706714-1" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92064.u1" size="8388608" crc="38a17e7e" sha1="434849ba8867d0bfb16b0fb5abfec86286390c07" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pooh1" cloneof="pooh" supported="no">
+ <description>My Friends Tigger &amp; Pooh - Die Honigjagd (Ger)</description>
+ <year>2008?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092064-104(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-3" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92064-204(2).u1" size="8388608" crc="081e414d" sha1="e612aee1f62ca260bc0b011a512fd8c207eeb833" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="poohf" cloneof="pooh" supported="no">
+ <description>Disney Winnie l'Ourson - La Chasse au miel de Winnie (Fra)</description>
+ <year>2004?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092065(FR)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708894" />
+ <feature name="pcb_model" value="708894-1" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="U1" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92065.u1" size="8388608" crc="7b0bd06c" sha1="0767e07e767a64c0fe56dac7b3cb478bab34b864" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="poohdk" cloneof="pooh" supported="no">
+ <description>Disney Peter Plys - Honningjagten (Den)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092073(DK)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="706714" />
+ <feature name="pcb_model" value="706714-1" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92073.u1" size="8388608" crc="f2cf8e50" sha1="9ef7e8a3f03c252970348f2eabc53010c1ee588b" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="poohsw" cloneof="pooh" supported="no">
+ <description>Disney Nalle Puh - Honungsjakten (Swe)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092074(SE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-1" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92074.u1" size="8388608" crc="70bde4da" sha1="788a8b471ef97106fbcaeb053cd6aa19c6ac299a" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lerntanz" supported="no">
+ <description>V.Smile - Lern- und Tanzmatte (Ger)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-091324(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="707180" />
+ <feature name="pcb_model" value="707180-2" />
+ <feature name="cart_type" value="yellow" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="91324.u1" size="8388608" crc="db81c1e1" sha1="fbe3f9ee65b7a692c568dde8986df7a2bba8b133" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="techart" supported="no">
+ <description>V.Smile Zeichenatelier (Ger)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-067004(GER)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="67000C" />
+ <feature name="pcb_model" value="67000C-5" />
+ <feature name="cart_type" value="yellow" />
+ <feature name="u2" value="U2" /> <!-- SRAM -->
+ <feature name="u3" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="4194304">
+ <rom name="GER-509.u3" size="4194304" crc="ae5f4fe2" sha1="1c5428da7464182e6ee0585d1ebc211f91667238" offset="0" />
+ </dataarea>
+ <dataarea name="vram" size="131072">
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="techartsw" cloneof="techart" supported="no">
+ <description>V.Smile Tecknarstudio (Swe)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-067021(SE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="67000C" />
+ <feature name="pcb_model" value="67000C-2" />
+ <feature name="cart_type" value="yellow" />
+ <feature name="u2" value="U2" /> <!-- SRAM -->
+ <feature name="u3" value="U3" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="4194304">
+ <rom name="52-67021.u3" size="4194304" crc="27449e15" sha1="5c13865dffb04c98c69f3422c965d76a9aa36c33" offset="0" />
+ </dataarea>
+ <dataarea name="vram" size="131072">
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zayzmac" cloneof="zayzaea" supported="no">
+ <description>Zayzoo - My Alien Classmate (USA)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092360(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <dataarea name="rom" size="8388608">
+ <rom name="52-92360(us).bin" size="8388608" crc="76ff9718" sha1="be783c1abe96f785564f5b5b6b4ea089b799c1d4" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zayzaea" supported="no">
+ <description>Zayzoo: An Earth Adventure (USA)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092360-101(US)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="708201" />
+ <feature name="pcb_model" value="708201-4" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92360-201(4).u1" size="8388608" crc="0b1f8225" sha1="7c2e39428faf40cff2007ae1a3e2f2ae565e5db4" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zayzmacg" cloneof="zayzaea" supported="no">
+ <description>Zayzoos Lernall (Ger)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092364(GE)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="706714" />
+ <feature name="pcb_model" value="706714-1" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92364.u1" size="8388608" crc="93e9dcf3" sha1="5889e46806d1fa70ac92ec6b2158a339126a26d2" offset="0" />
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zezou" cloneof="zayzaea" supported="no">
+ <description>Zézou - Notre Ami Venu d'Ailleurs (Fra)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-092365(FR)" />
+ <part name="cart" interface="vsmile_cart">
+ <feature name="pcb" value="706714" />
+ <feature name="pcb_model" value="706714-1" />
+ <feature name="cart_type" value="lilac" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="92365.u1" size="8388608" crc="e965565e" sha1="9cabefa6a2dc0cd2df9d07bb0e11ae0b2dd4d5f8" offset="0" />
+ </dataarea>
+ </part>
+ </software>
</softwarelist>
diff --git a/hash/vsmileb_cart.xml b/hash/vsmileb_cart.xml
index 1eaa6635fd0..658923cce36 100644
--- a/hash/vsmileb_cart.xml
+++ b/hash/vsmileb_cart.xml
@@ -99,83 +99,83 @@ The V.Baby currently have no dumps available, hence the carts are temporarily li
<softwarelist name="vsmileb_cart" description="VTech V.Smile Baby cartridges">
- <software name="mktierf" supported="no">
- <description>Meine kleinen Tierfreunde (Ger)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-099004(GE)" />
- <part name="cart" interface="vsmileb_cart">
- <feature name="pcb" value="707154" />
- <feature name="pcb_model" value="707154-3" />
- <feature name="u4" value="U4" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="99004.u4" size="8388608" crc="7b48544b" sha1="a736ef1313762c493a366990406c3a7393457b6e" offset="0" />
- </dataarea>
- </part>
- </software>
+ <software name="mktierf" supported="no">
+ <description>Meine kleinen Tierfreunde (Ger)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-099004(GE)" />
+ <part name="cart" interface="vsmileb_cart">
+ <feature name="pcb" value="707154" />
+ <feature name="pcb_model" value="707154-3" />
+ <feature name="u4" value="U4" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="99004.u4" size="8388608" crc="7b48544b" sha1="a736ef1313762c493a366990406c3a7393457b6e" offset="0" />
+ </dataarea>
+ </part>
+ </software>
- <software name="bauernhf" supported="no">
- <description>Mein erster Bauernhof (Ger)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-099064(GE)" />
- <part name="cart" interface="vsmileb_cart">
- <feature name="pcb" value="707154" />
- <feature name="pcb_model" value="707154-3" />
- <feature name="u4" value="U4" /> <!-- ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="27-08788-000.u4" size="8388608" crc="581e16f9" sha1="330b309644db9f017d275b9df0ffe7530ed5bcef" offset="0" />
- </dataarea>
- </part>
- </software>
+ <software name="bauernhf" supported="no">
+ <description>Mein erster Bauernhof (Ger)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-099064(GE)" />
+ <part name="cart" interface="vsmileb_cart">
+ <feature name="pcb" value="707154" />
+ <feature name="pcb_model" value="707154-3" />
+ <feature name="u4" value="U4" /> <!-- ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="27-08788-000.u4" size="8388608" crc="581e16f9" sha1="330b309644db9f017d275b9df0ffe7530ed5bcef" offset="0" />
+ </dataarea>
+ </part>
+ </software>
- <software name="poohhawa" supported="no">
- <description>Pooh's Hundred Acre Wood Adventure (USA)</description>
- <year>2007</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-099020(US)" />
- <part name="cart" interface="vsmileb_cart">
- <dataarea name="rom" size="8388608">
- <rom name="099020.bin" size="8388608" crc="a3ac4cd4" sha1="3562c632e0a1e70cb9e382ebb823449757afed67" offset="0" />
- </dataarea>
- </part>
- </software>
+ <software name="poohhawa" supported="no">
+ <description>Pooh's Hundred Acre Wood Adventure (USA)</description>
+ <year>2007</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-099020(US)" />
+ <part name="cart" interface="vsmileb_cart">
+ <dataarea name="rom" size="8388608">
+ <rom name="099020.bin" size="8388608" crc="a3ac4cd4" sha1="3562c632e0a1e70cb9e382ebb823449757afed67" offset="0" />
+ </dataarea>
+ </part>
+ </software>
- <software name="poohhawag" cloneof="poohhawa" supported="no">
- <description>Puuhs Hundert-Morgen-Wald (Ger)</description>
- <year>2006?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-099024(GE)" />
- <part name="cart" interface="vsmileb_cart">
- <feature name="pcb" value="707155" />
- <feature name="pcb_model" value="707155-2" />
- </part>
- </software>
+ <software name="poohhawag" cloneof="poohhawa" supported="no">
+ <description>Puuhs Hundert-Morgen-Wald (Ger)</description>
+ <year>2006?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-099024(GE)" />
+ <part name="cart" interface="vsmileb_cart">
+ <feature name="pcb" value="707155" />
+ <feature name="pcb_model" value="707155-2" />
+ </part>
+ </software>
- <software name="poohhawasw" cloneof="poohhawa" supported="no">
- <description>Nalle Puhs Äventyr i Sjumilaskogen (Swe)</description>
- <year>2007?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-099034(SE)" />
- <part name="cart" interface="vsmileb_cart">
- <feature name="pcb" value="707154" />
- <feature name="pcb_model" value="707154-4" />
- <feature name="u4" value="U4" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="99034.u4" size="8388608" crc="5dbe1c20" sha1="51f56cedbe99fc7438429a4c02c08f65d2313790" offset="0" />
- </dataarea>
- </part>
- </software>
+ <software name="poohhawasw" cloneof="poohhawa" supported="no">
+ <description>Nalle Puhs Äventyr i Sjumilaskogen (Swe)</description>
+ <year>2007?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-099034(SE)" />
+ <part name="cart" interface="vsmileb_cart">
+ <feature name="pcb" value="707154" />
+ <feature name="pcb_model" value="707154-4" />
+ <feature name="u4" value="U4" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="99034.u4" size="8388608" crc="5dbe1c20" sha1="51f56cedbe99fc7438429a4c02c08f65d2313790" offset="0" />
+ </dataarea>
+ </part>
+ </software>
- <software name="lupptack" cloneof="mktierf" supported="no">
- <description>Lär och upptäck (Swe)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-099014(SE)" />
- <part name="cart" interface="vsmileb_cart">
- <feature name="pcb" value="707155" />
- <feature name="pcb_model" value="707155-2" />
- </part>
- </software>
+ <software name="lupptack" cloneof="mktierf" supported="no">
+ <description>Lär och upptäck (Swe)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-099014(SE)" />
+ <part name="cart" interface="vsmileb_cart">
+ <feature name="pcb" value="707155" />
+ <feature name="pcb_model" value="707155-2" />
+ </part>
+ </software>
-</softwarelist> \ No newline at end of file
+</softwarelist>
diff --git a/hash/vsmilem_cart.xml b/hash/vsmilem_cart.xml
index ac1bbb32628..f3adb276d9d 100644
--- a/hash/vsmilem_cart.xml
+++ b/hash/vsmilem_cart.xml
@@ -241,91 +241,91 @@ Smartbooks currently have no dumps available, hence they are temporarily listed
<softwarelist name="vsmilem_cart" description="VTech V.Smile Motion cartridges">
- <software name="cinderla" supported="no">
- <description>Disney Princess Cinderella - Lernen im Märchenland (Ger)</description>
- <year>2010?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-084604(GE)" />
- <part name="cart" interface="vsmilem_cart">
- <feature name="pcb" value="708201" />
- <feature name="pcb_model" value="708201-7" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="C84604.u1" size="8388608" crc="0229cf3a" sha1="9c08e6370ecf08992924f067b64dd1950e3a2c6c" offset="0" />
- </dataarea>
- </part>
- </software>
+ <software name="cinderla" supported="no">
+ <description>Disney Princess Cinderella - Lernen im Märchenland (Ger)</description>
+ <year>2010?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-084604(GE)" />
+ <part name="cart" interface="vsmilem_cart">
+ <feature name="pcb" value="708201" />
+ <feature name="pcb_model" value="708201-7" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="C84604.u1" size="8388608" crc="0229cf3a" sha1="9c08e6370ecf08992924f067b64dd1950e3a2c6c" offset="0" />
+ </dataarea>
+ </part>
+ </software>
- <software name="kfpanda" supported="no">
- <description>DreamWorks Kung Fu Panda - Der Weg des Panda (Ger)</description>
- <year>2008?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-084124(GE)" />
- <part name="cart" interface="vsmilem_cart">
- <feature name="pcb" value="708201" />
- <feature name="pcb_model" value="708201-4" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="84124 OK.u1" size="8388608" crc="16493095" sha1="07c75e46c294901ee9309d98c925a39dc1b5e384" offset="0" />
- </dataarea>
- </part>
- </software>
+ <software name="kfpanda" supported="no">
+ <description>DreamWorks Kung Fu Panda - Der Weg des Panda (Ger)</description>
+ <year>2008?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-084124(GE)" />
+ <part name="cart" interface="vsmilem_cart">
+ <feature name="pcb" value="708201" />
+ <feature name="pcb_model" value="708201-4" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="84124 OK.u1" size="8388608" crc="16493095" sha1="07c75e46c294901ee9309d98c925a39dc1b5e384" offset="0" />
+ </dataarea>
+ </part>
+ </software>
- <software name="dora" supported="no">
- <description>Nick Dora - Doras Reparatur-Abenteuer (Ger)</description>
- <year>2009?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-084024(GE)" />
- <part name="cart" interface="vsmilem_cart">
- <feature name="pcb" value="708201" />
- <feature name="pcb_model" value="708201-4" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="84024 OK.u1" size="8388608" crc="6769cb8b" sha1="615177d959983cdb67acdb8f3be063b3d09cb5db" offset="0" />
- </dataarea>
- </part>
- </software>
+ <software name="dora" supported="no">
+ <description>Nick Dora - Doras Reparatur-Abenteuer (Ger)</description>
+ <year>2009?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-084024(GE)" />
+ <part name="cart" interface="vsmilem_cart">
+ <feature name="pcb" value="708201" />
+ <feature name="pcb_model" value="708201-4" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="84024 OK.u1" size="8388608" crc="6769cb8b" sha1="615177d959983cdb67acdb8f3be063b3d09cb5db" offset="0" />
+ </dataarea>
+ </part>
+ </software>
- <software name="kleinstn" supported="no">
- <description>Kleine Einsteins (Ger)</description>
- <year>200?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-084164(GE)" />
- <part name="cart" interface="vsmilem_cart">
- <dataarea name="rom" size="8388608">
- <rom name="80-084164.bin" size="8388608" crc="b0ec807e" sha1="e947c84efd3f061cbf10f73e412d4cfdd474bade" offset="0" />
- </dataarea>
- </part>
- </software>
+ <software name="kleinstn" supported="no">
+ <description>Kleine Einsteins (Ger)</description>
+ <year>200?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-084164(GE)" />
+ <part name="cart" interface="vsmilem_cart">
+ <dataarea name="rom" size="8388608">
+ <rom name="80-084164.bin" size="8388608" crc="b0ec807e" sha1="e947c84efd3f061cbf10f73e412d4cfdd474bade" offset="0" />
+ </dataarea>
+ </part>
+ </software>
- <software name="tinker" supported="no">
- <description>TinkerBell (Ger)</description>
- <year>2009?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-084324(GE)" />
- <part name="cart" interface="vsmilem_cart">
- <feature name="pcb" value="708201" />
- <feature name="pcb_model" value="708201-7" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="C84324.u1" size="8388608" crc="9e207566" sha1="bb3e180a2c69306b56f08909a05dc83309be0f09" offset="0" />
- </dataarea>
- </part>
- </software>
+ <software name="tinker" supported="no">
+ <description>TinkerBell (Ger)</description>
+ <year>2009?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-084324(GE)" />
+ <part name="cart" interface="vsmilem_cart">
+ <feature name="pcb" value="708201" />
+ <feature name="pcb_model" value="708201-7" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="C84324.u1" size="8388608" crc="9e207566" sha1="bb3e180a2c69306b56f08909a05dc83309be0f09" offset="0" />
+ </dataarea>
+ </part>
+ </software>
- <software name="pooh" supported="no">
- <description>Winnie Puuh - Die Honigjagd (Ger)</description>
- <year>2009?</year>
- <publisher>VTech</publisher>
- <info name="serial" value="80-084384(GE)" />
- <part name="cart" interface="vsmilem_cart">
- <feature name="pcb" value="708201" />
- <feature name="pcb_model" value="708201-4" />
- <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
- <dataarea name="rom" size="8388608">
- <rom name="84384.u1" size="8388608" crc="60649955" sha1="2eda79cbf138e25ffb33281987cc885ec98e9b04" offset="0" />
- </dataarea>
- </part>
- </software>
+ <software name="pooh" supported="no">
+ <description>Winnie Puuh - Die Honigjagd (Ger)</description>
+ <year>2009?</year>
+ <publisher>VTech</publisher>
+ <info name="serial" value="80-084384(GE)" />
+ <part name="cart" interface="vsmilem_cart">
+ <feature name="pcb" value="708201" />
+ <feature name="pcb_model" value="708201-4" />
+ <feature name="u1" value="" /> <!-- EPOXY BLOB ROM -->
+ <dataarea name="rom" size="8388608">
+ <rom name="84384.u1" size="8388608" crc="60649955" sha1="2eda79cbf138e25ffb33281987cc885ec98e9b04" offset="0" />
+ </dataarea>
+ </part>
+ </software>
-</softwarelist> \ No newline at end of file
+</softwarelist>
diff --git a/hash/zx80_cass.xml b/hash/zx80_cass.xml
new file mode 100644
index 00000000000..97ac6ba8a82
--- /dev/null
+++ b/hash/zx80_cass.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0"?>
+<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
+
+<!-- ZX80 Cassettes -->
+
+<softwarelist name="zx80_cass" description="ZX80 cassettes">
+
+ <software name="breakout">
+ <description>1K Breakout</description>
+ <year>1980</year>
+ <publisher>Macronics</publisher>
+ <info name="usage" value="Start with &quot;RUN&quot;" />
+ <part name="cass1" interface="zx80_cass">
+ <dataarea name="cass" size="842">
+ <rom name="Breakout (Macronics 1980).o" size="842" crc="e2843c13" sha1="a70d60f82affa744ae219b1a808d73e09430fd32" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dbrkout">
+ <description>Double Breakout</description>
+ <year>1981</year>
+ <publisher>Beam Software</publisher>
+ <info name="usage" value="Start with &quot;GO TO 1&quot;" />
+ <part name="cass1" interface="zx80_cass">
+ <dataarea name="cass" size="726">
+ <rom name="ZX80 Double Breakout (Beam Software 1981).o" size="726" crc="de689c74" sha1="d380dc5bbda27212e7d7c6ca281c04a8ea7742cb" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mstrmind">
+ <description>Master Mind</description>
+ <year>2006</year>
+ <publisher>MadAxe</publisher>
+ <info name="usage" value="Start with &quot;RUN&quot;" />
+ <part name="cass1" interface="zx80_cass">
+ <dataarea name="cass" size="3950">
+ <rom name="Mastermind.o" size="3950" crc="daf6da5b" sha1="18eae1df9d719fcd13703a392d29bdee46e675eb" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spaceinv1">
+ <description>1K Space Invaders</description>
+ <year>1980</year>
+ <publisher>Macronics</publisher>
+ <info name="usage" value="Start with &quot;GO TO 100&quot;" />
+ <part name="cass1" interface="zx80_cass">
+ <dataarea name="cass" size="676">
+ <rom name="Space Invaders 1K (Macronics 1981) Reconstruction.o" size="676" crc="38a1e5df" sha1="e68e867cbb8364e8b651e16f35e4a8b0f68fcd86" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spaceinv3">
+ <description>3K Space Invaders</description>
+ <year>1980</year>
+ <publisher>Macronics</publisher>
+ <info name="usage" value="Start with &quot;RUN&quot;" />
+ <part name="cass1" interface="zx80_cass">
+ <dataarea name="cass" size="1878">
+ <rom name="Space Invaders 3K (Macronics 1981).o" size="1878" crc="ae9cefbe" sha1="043c8102118ac179959f57bc31997fcbd9d8837d" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="supinvsn">
+ <description>Super Invasion</description>
+ <year>1981</year>
+ <publisher>Beam Software</publisher>
+ <info name="usage" value="Start with &quot;GO TO 1&quot;" />
+ <part name="cass1" interface="zx80_cass">
+ <feature name="part_id" value="1K"/>
+ <dataarea name="cass" size="900">
+ <rom name="ZX80 Super Invasion 1K (Beam Software 1981).o" size="900" crc="bd61a8c2" sha1="e3381f600eedf2a5309fec4baa4ebfe2eacd8ee9" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx80_cass">
+ <feature name="part_id" value="2K"/>
+ <dataarea name="cass" size="1268">
+ <rom name="ZX80 Super Invasion 2K (Beam Software 1981).o" size="1268" crc="d7d99f55" sha1="456fa58fd684592c02d911c1745fd958e13fa5a4" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+</softwarelist>
diff --git a/hash/zx81_cass.xml b/hash/zx81_cass.xml
new file mode 100644
index 00000000000..4fc2384017a
--- /dev/null
+++ b/hash/zx81_cass.xml
@@ -0,0 +1,8379 @@
+<?xml version="1.0"?>
+<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
+
+<!-- ZX81 Cassettes -->
+
+<!-- This list was compiled from the archive at http://www.zx81stuff.org.uk/. Updated to 22/08/2016 -->
+
+
+<softwarelist name="zx81_cass" description="ZX81 cassettes">
+
+ <software name="10games">
+ <description>10 Games for 1K</description>
+ <year>1981</year>
+ <publisher>J.K.Greye Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7636">
+ <rom name="10Games.tzx" size="7636" crc="141cddd1" sha1="3a776f7dbf4fd169572aad5b775b4ca27c61222a" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="1kgames">
+ <description>1K Games Pack</description>
+ <year>198?</year>
+ <publisher>Artic</publisher>
+ <info name="author" value="Adam Waring" />
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="8576">
+ <rom name="1KGames.tzx" size="8576" crc="2648f563" sha1="11562494bb40cef9bcea606b1bd2ad375f47ef75" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="1kgamess" cloneof="1kgames">
+ <description>1K Games (Sinclair)</description>
+ <year>198?</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="8576">
+ <rom name="1KGames.tzx" size="8576" crc="2648f563" sha1="11562494bb40cef9bcea606b1bd2ad375f47ef75" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="1kwonders">
+ <description>1k Wonders</description>
+ <year>198?</year>
+ <publisher>ICT</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="14657">
+ <rom name="1kWonders.A.tzx" size="14657" crc="592f5084" sha1="c463e7e039a917193f6600283fb52529d0431307" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="14708">
+ <rom name="1kWonders.B.tzx" size="14708" crc="cdc3c8fd" sha1="5a83e9161b20221794b4b5d128e37bb320741618" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="1kzxchesss" cloneof="1kzxchess">
+ <description>1K ZX Chess (Sinclair)</description>
+ <year>198?</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="2223">
+ <rom name="1KZXChess.tzx" size="2223" crc="2fc225b9" sha1="055730a794e227e02d6fa780f1bb82a68c1b86bf" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="1kzxchess">
+ <description>1K ZX Chess</description>
+ <year>198?</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="1165">
+ <rom name="1KZXChess(Artic).A.ChessQueen.tzx" size="1165" crc="9c750652" sha1="ed848d9bd69311536da64c0414f7ae2ec9316622" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="2kgames">
+ <description>2K Games Pack</description>
+ <year>1983</year>
+ <publisher>International Publishing &amp; Software Inc.</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="6977">
+ <rom name="2KGamesPack(IPS).tzx" size="6977" crc="c1893b03" sha1="b33fdc40eb4631617c2687795de02904c92255c3" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="3ddefend">
+ <description>3D Defender</description>
+ <year>1981</year>
+ <publisher>J.K.Greye Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="12095">
+ <rom name="3DDefender.tzx" size="12095" crc="a9e69d1c" sha1="7c6b0a1fdef5c43aeed21f9d98f4e0c9837214cf" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="3ddefendn" cloneof="3ddefend">
+ <description>3D Defender (New Generation)</description>
+ <year>1982</year>
+ <publisher>New Generation Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="12095">
+ <rom name="3DDefender(NGS).tzx" size="12095" crc="0df02e27" sha1="6aa9a12e6256bc2657326361c636571faf2cfb83" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="3dgp">
+ <description>3D Grand Prix</description>
+ <year>1983</year>
+ <publisher>dK'tronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="13448">
+ <rom name="3DGrandPrix.A.tzx" size="13448" crc="07866eb9" sha1="691e9c32aef94668542673641a8bec49261e336a" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="13448">
+ <rom name="3DGrandPrix.B.3DGrandPrix(Alt).tzx" size="13448" crc="f0996d7c" sha1="cf56c6ad5552f3c36a73ce26b32be9b745a8d554" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="3dmonmaze">
+ <description>3D Monster Maze</description>
+ <year>1981</year>
+ <publisher>J.K.Greye Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="10798">
+ <rom name="3DMonsterMaze.tzx" size="10798" crc="436d8b0e" sha1="c6c141057d870b114d8844bb7578040ad8c5b151" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="3dmonmazen" cloneof="3dmonmaze">
+ <description>3D Monster Maze (New Generation)</description>
+ <year>1982</year>
+ <publisher>New Generation Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="10798">
+ <rom name="3DMonsterMaze(NGS).tzx" size="10798" crc="38dbcc52" sha1="2b0e9cd691979154c2d75ac76f93be076aab3423" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="52kfampak">
+ <description>5-2K Family Pak</description>
+ <year>198?</year>
+ <publisher>Timeworks</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7846">
+ <rom name="52KFamilyPak.tzx" size="7846" crc="fa438ced" sha1="1d613e0ab6462ab52c757aa1b6b6262311eb6c8e" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="5pourjouer">
+ <description>5 Programmes Pour Jouer</description>
+ <year>1984</year>
+ <publisher>Direco International</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="2483">
+ <rom name="5ProgrammesPourJouer.A.tzx" size="2483" crc="bd28368e" sha1="30f2099abf92d5b74182e4bf66165c75d4af4649" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="1556">
+ <rom name="5ProgrammesPourJouer.B.tzx" size="1556" crc="c2c9d251" sha1="db05067dbaf7a124ff6e9174709cf6adad82c768" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="5pourflech">
+ <description>5 Programmes Pour Reflechir</description>
+ <year>1984</year>
+ <publisher>Direco International</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="2271">
+ <rom name="5ProgrammesPourReflechir.A.tzx" size="2271" crc="99086702" sha1="f7432586becb4fa854000990f843325ce3c0001d" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="1637">
+ <rom name="5ProgrammesPourReflechir.B.tzx" size="1637" crc="0510fff8" sha1="5a948f1f262f59fa40795181957409a82a95bdf4" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="6games">
+ <description>6 Games</description>
+ <year>198?</year>
+ <publisher>Felix Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side 1"/>
+ <dataarea name="cass" size="17824">
+ <rom name="6Games.A.tzx" size="17824" crc="f4a7cd3f" sha1="f2f9e5c82992538b65f2f945713ccb0f2a7c3e84" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side 2"/>
+ <dataarea name="cass" size="14908">
+ <rom name="6Games.B.tzx" size="14908" crc="500a0d03" sha1="815c3e359bf8d52f38677b11305787cfc756b094" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="8progs">
+ <description>8 Programs by GM4IHJ</description>
+ <year>198?</year>
+ <publisher>Amsat-UK Software Service</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="56578">
+ <rom name="8Programs.tzx" size="56578" crc="bb788390" sha1="e2185c5962d8c89bb020028a22e25470405bef0f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="adgrafspee">
+ <description>Admiral Graf Spee</description>
+ <year>198?</year>
+ <publisher>Temptation Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="17024">
+ <rom name="AdmiralGrafSpee.tzx" size="17024" crc="c583887e" sha1="741a2b608801fc12705535fa88f2d895af486e80" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="abudgtman">
+ <description>Advanced Budget Manager</description>
+ <year>1983</year>
+ <publisher>Softsync</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16291">
+ <rom name="AdvancedBudgetManager.tzx" size="16291" crc="72a0eeda" sha1="617af815c0545f0832cd9502ba51a0a5db5dcd1d" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="advmaths">
+ <description>Advanced Mathematics</description>
+ <year>1982</year>
+ <publisher>W.H.Smith</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="13671">
+ <rom name="AdvancedMathematics.tzx" size="13671" crc="e6a14eaa" sha1="8caa2805da995945d9153828c921ad4ab96678a5" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="advent">
+ <description>Adventure</description>
+ <year>1982</year>
+ <publisher>Bug Byte</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16017">
+ <rom name="Adventure.tzx" size="16017" crc="35d4be2a" sha1="c5fb1e4aa356ec4a406a2da76495d9f9b368d058" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="adventc">
+ <description>Adventure C</description>
+ <year>1982</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14275">
+ <rom name="AdventureC.tzx" size="14275" crc="449ed54f" sha1="ebc2d62e91088447c40bd394aa825acbe2982210" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="adventone">
+ <description>Adventure One</description>
+ <year>1983</year>
+ <publisher>Abersoft</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15848">
+ <rom name="AdventureOne.tzx" size="15848" crc="b1cbaaa7" sha1="bad2e766140ee0159389ac513f37c0e8372ed5c8" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="adventt1">
+ <description>Adventure Tape 1</description>
+ <year>1983</year>
+ <publisher>Phipps Associates</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="57316">
+ <rom name="AdventureTape1.tzx" size="57316" crc="f85217cb" sha1="851fd8d8c082c534766deb7c7d724ed0e9ae9410" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="adventtn1">
+ <description>Adventure Tape No.1</description>
+ <year>1982</year>
+ <publisher>Phipps Associates</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="57280">
+ <rom name="AdventureTapeNo1.tzx" size="57280" crc="48254758" sha1="bc8d49cbfa4156fcd10739b8ba17987a6708a2aa" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="airline">
+ <description>Airline</description>
+ <year>1982</year>
+ <publisher>Cases Computer Simulations</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16072">
+ <rom name="Airline.tzx" size="16072" crc="844cbaac" sha1="56b18d5296da989927c05c0f33dc30d2a3b1ba4c" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="algebra1">
+ <description>Algebra 1</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="3926">
+ <rom name="Algebra1.tzx" size="3926" crc="11f6af7c" sha1="4cfec3ba12646b6b5cf05860401750fa149fbce9" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="alien">
+ <description>Alien</description>
+ <year>1982</year>
+ <publisher>PSS</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="11961">
+ <rom name="Alien.tzx" size="11961" crc="febc8fef" sha1="9545ca45d3440c9a34be3411bc7395f37af82777" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="alienatt">
+ <description>Alien Attack</description>
+ <year>198?</year>
+ <publisher>Computer Rentals</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="6429">
+ <rom name="AlienAttack.tzx" size="6429" crc="e6ce2fa6" sha1="f52df2571903d9aae931b359eabb67e2bbd6fc41" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="aliendrop">
+ <description>Alien-Dropout</description>
+ <year>1982</year>
+ <publisher>Silversoft</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="3424">
+ <rom name="AlienDropout.tzx" size="3424" crc="fe0f33f4" sha1="c51813b542dd1432421ad7bb222a6f5cef4cd641" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="alienrain">
+ <description>Alien Rain &amp; Outrider</description>
+ <year>1983</year>
+ <publisher>Computer Rentals</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Alien Rain"/>
+ <dataarea name="cass" size="5610">
+ <rom name="AlienRain.A.tzx" size="5610" crc="c267e42c" sha1="6008f67f506d020b4448b6ab75190619d0188962" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Outrider"/>
+ <dataarea name="cass" size="5725">
+ <rom name="AlienRain.B.Outrider.tzx" size="5725" crc="97609497" sha1="0137cd91ed0acffc4694e1f61df086f2233231c0" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="alphprob">
+ <description>Alphaprobe</description>
+ <year>1982</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="11252">
+ <rom name="Alphaprobe.tzx" size="11252" crc="7b7603f0" sha1="a71fdaec9225187ad0724bdaaab65b2860e994fb" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="arcadeact">
+ <description>Arcade Action</description>
+ <year>198?</year>
+ <publisher>Micromega</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="4651">
+ <rom name="ArcadeAction.tzx" size="4651" crc="5cb215e3" sha1="04fc1ffa34592f093f1c0eae9d54b3ff31eb3e86" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="arithun8">
+ <description>Arithmetic for the Under 8's</description>
+ <year>1982</year>
+ <publisher>Rose Cassettes</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Add/Subtract"/>
+ <dataarea name="cass" size="19062">
+ <rom name="ArithmeticUnder8.A.tzx" size="19062" crc="0e749664" sha1="badf9f959dc80c0f7e28e7898792613e4bc53b08" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Multiply/Divide"/>
+ <dataarea name="cass" size="17351">
+ <rom name="ArithmeticUnder8.B.tzx" size="17351" crc="1dbb269a" sha1="4070c18fbbd83b7b1c920e0cb6445744559c8513" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="aeurope80">
+ <description>Around Europe in 80 Hours</description>
+ <year>1982</year>
+ <publisher>International Publishing &amp; Software Inc.</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15451">
+ <rom name="AroundEuropeIn80Hours.tzx" size="15451" crc="860758c6" sha1="cb59d966fe38c858df9a002f2eaaae2cb0e1ba73" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="astroids">
+ <description>Asteroids</description>
+ <year>1982</year>
+ <publisher>Silversoft</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="3776">
+ <rom name="Asteroids.tzx" size="3776" crc="939e50e5" sha1="85047ab187bfcd02195f00150419cee1bfc07a5f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="astroidssf">
+ <description>Asteroids (Software Farm)</description>
+ <year>198?</year>
+ <publisher>Software Farm</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="8594">
+ <rom name="Asteroids(SF).tzx" size="8594" crc="8b6f8743" sha1="d56d7e03a545b99607174faec186c42e64618189" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="autochef">
+ <description>Autochef</description>
+ <year>1982</year>
+ <publisher>Cases Computer Simulations</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15648">
+ <rom name="Autochef.tzx" size="15648" crc="3869ae07" sha1="2b7416327bdb907108d287f8cd4eaa0fd291ecba" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="avenger">
+ <description>Avenger</description>
+ <year>1982</year>
+ <publisher>Abacus</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7368">
+ <rom name="Avenger.tzx" size="7368" crc="b545fdae" sha1="529b2a9eb67c50db12494cc0ff7272925e9d18b4" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="backgamm">
+ <description>Backgammon and Dice</description>
+ <year>1982</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Backgammon"/>
+ <dataarea name="cass" size="14994">
+ <rom name="Backgammon.A.tzx" size="14994" crc="09137343" sha1="4c550466ea3e2a56582e1d1975606d9d218919c0" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Dice"/>
+ <dataarea name="cass" size="2224">
+ <rom name="Backgammon.B.Dice.tzx" size="2224" crc="273930e0" sha1="724a5d1345321f8ad252a551ec640a74b75a12e2" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="backgammk">
+ <description>Backgammon (Keith Archer)</description>
+ <year>1982</year>
+ <publisher>Keith Archer</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="11861">
+ <rom name="Backgammon(KA).tzx" size="11861" crc="153ed883" sha1="81f25c1667c8eba6936eabfd080ccad3a3a34add" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="backgammp" cloneof="backgamm">
+ <description>Backgammon and Dice (Psion)</description>
+ <year>1982</year>
+ <publisher>Psion</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Backgammon"/>
+ <dataarea name="cass" size="15077">
+ <rom name="Backgammon(Psion).A.Backgammon.tzx" size="15077" crc="1698933b" sha1="979ad80673fca8d39ee8c15a83ccce3e8b054212" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Dice"/>
+ <dataarea name="cass" size="1943">
+ <rom name="Backgammon(Psion).B.Dice.tzx" size="1943" crc="0c05f785" sha1="88df78dc3a63a6dabf615b5148b02105c86dd174" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="backgammt">
+ <description>Backgammon (Timex)</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="17108">
+ <rom name="Backgammon(Timex).tzx" size="17108" crc="307aacd2" sha1="5a78754d849fe5284342089159af45588029c0a9" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bankrobbr">
+ <description>Bank Robber</description>
+ <year>1983</year>
+ <publisher>Romik Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="6798">
+ <rom name="BankRobber.tzx" size="6798" crc="f9a7ab7d" sha1="40d0fcc8faaf73b0082d4f1937ef16626d289f66" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="baron">
+ <description>Baron</description>
+ <year>198?</year>
+ <publisher>Temptation Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16716">
+ <rom name="Baron.tzx" size="16716" crc="2813c7a1" sha1="fd944cedd638d3a5d6b70a8a4d50f2d41c16ea74" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="basicbas">
+ <description>Basic BASIC</description>
+ <year>1983</year>
+ <publisher>2-Bit Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Screen Display/Input/Subroutines"/>
+ <dataarea name="cass" size="2570">
+ <rom name="BasicBASIC.A.tzx" size="2570" crc="03ecfde1" sha1="5534b7b4f9fa4f3cd76d86b63570cea044c6ac93" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Loops/Motion/Juggler"/>
+ <dataarea name="cass" size="2507">
+ <rom name="BasicBASIC.B.tzx" size="2507" crc="8ea35e3e" sha1="22f7db82f3f12ed4249e6ca8d89997e7fae88de2" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="basicode2">
+ <description>Basicode2</description>
+ <year>1984</year>
+ <publisher>BBC</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="3570">
+ <rom name="Basicode2.A.tzx" size="3570" crc="db6f1818" sha1="9204245adf3f343e82c43d6ec70117c4dc491908" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="batcage">
+ <description>Bat Cage</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="1446">
+ <rom name="BatCage.tzx" size="1446" crc="650a94d8" sha1="8f6842f02e416e8b66c8d6172f2e852a5e14d2f8" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="batlships">
+ <description>Battleships</description>
+ <year>1982</year>
+ <publisher>JRS Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="12962">
+ <rom name="Battleships.tzx" size="12962" crc="a1057bc5" sha1="0c36982f0243f39c028a21207a2218d40b1cb369" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bigflapatt">
+ <description>Bigflap Attack</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="10053">
+ <rom name="BigflapAttack.A.tzx" size="10053" crc="02352386" sha1="dc23f585b4b9094f110d2b4b805bbafc518e009f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="biorhythm">
+ <description>Biorhythms</description>
+ <year>1982</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Instructions"/>
+ <dataarea name="cass" size="11560">
+ <rom name="Biorhythms.A.Instructions.tzx" size="11560" crc="4290bc1a" sha1="446600a99f718a4441adf790039253183b111131" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Biorhythms"/>
+ <dataarea name="cass" size="7997">
+ <rom name="Biorhythms.B.tzx" size="7997" crc="6734d82a" sha1="cb8824f28a341f53c735f4c277601434465a6129" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="biorhythm1">
+ <description>Biorhythms 1 (Fun To Learn)</description>
+ <year>1982</year>
+ <publisher>W.H.Smith</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Instructions"/>
+ <dataarea name="cass" size="11560">
+ <rom name="Biorhythms1(WHSmith).A.Instructions.tzx" size="11560" crc="f15a0ff6" sha1="a75a60e743c8824921eb4c411bfb744de91e5af0" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Biorhythms"/>
+ <dataarea name="cass" size="7998">
+ <rom name="Biorhythms1(WHSmith).B.Biorhythms.tzx" size="7998" crc="c1d6bbd4" sha1="30f5e2ceb4356fabeaafeff310a91753de65f0d3" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="blkcrystl">
+ <description>Black Crystal</description>
+ <year>1982</year>
+ <publisher>Carnell</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Test/Map 1"/>
+ <dataarea name="cass" size="17518">
+ <rom name="BlackCrystal.1A.tzx" size="17518" crc="307aa17e" sha1="0d824dff122ac0cad34b1370c6fa5c131350303e" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Map 2/Map 3"/>
+ <dataarea name="cass" size="32770">
+ <rom name="BlackCrystal.1B.tzx" size="32770" crc="d609b241" sha1="f1f857aa857cea6a5236d423ab89d066d1885ad8" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Map 4/Map 4b"/>
+ <dataarea name="cass" size="32804">
+ <rom name="BlackCrystal.2A.tzx" size="32804" crc="4961dd59" sha1="55a0088f0d8dd118f1f364f0c7bc2679c4898287" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="Map 5/Map 6"/>
+ <dataarea name="cass" size="32284">
+ <rom name="BlackCrystal.2B.tzx" size="32284" crc="4a040e40" sha1="2264156eb38d953deaee49bb89a2bd44b5a8cb64" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="blkcrystlc" cloneof="blkcrystl">
+ <description>Black Crystal (Clam Shell)</description>
+ <year>1982</year>
+ <publisher>Carnell</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Test"/>
+ <dataarea name="cass" size="1241">
+ <rom name="BlackCrystal(ClamShell).1A.1.Test.tzx" size="1241" crc="5b5bfcf1" sha1="49a62c41ad77ae4857fb7dfc7cefdc795c02c302" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Map 1"/>
+ <dataarea name="cass" size="16384">
+ <rom name="BlackCrystal(ClamShell).1A.2.Map1.tzx" size="16384" crc="1d7cf04c" sha1="b702ed73f59c5a8063e581014752ad183fd3624e" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Map 2"/>
+ <dataarea name="cass" size="16435">
+ <rom name="BlackCrystal(ClamShell).1B.1.Map2.tzx" size="16435" crc="683fecd3" sha1="ed3cf41a6b3df839682a73a6ff06a4c0fc14d04d" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="Map 3"/>
+ <dataarea name="cass" size="16442">
+ <rom name="BlackCrystal(ClamShell).1B.2.Map3.tzx" size="16442" crc="7d89094f" sha1="7dece5c8b571681a997f4a60240abb851483be7d" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass5" interface="zx81_cass">
+ <feature name="part_id" value="Map 4"/>
+ <dataarea name="cass" size="16443">
+ <rom name="BlackCrystal(ClamShell).2A.1.Map4.tzx" size="16443" crc="f18ec8a6" sha1="374cf2b0e908f8cec52d6b50e155b945b4fd3952" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass6" interface="zx81_cass">
+ <feature name="part_id" value="Map 4b"/>
+ <dataarea name="cass" size="16468">
+ <rom name="BlackCrystal(ClamShell).2A.2.Map4b.tzx" size="16468" crc="27240b8e" sha1="d1bb41e034ebb412804508ce4eed09e55b8924e4" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass7" interface="zx81_cass">
+ <feature name="part_id" value="Map 5"/>
+ <dataarea name="cass" size="15968">
+ <rom name="BlackCrystal(ClamShell).2B.1.Map5.tzx" size="15968" crc="f3dc098e" sha1="05d987afb52b0b9577a00a4bcf0f85188f12e5a0" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass8" interface="zx81_cass">
+ <feature name="part_id" value="Map 6"/>
+ <dataarea name="cass" size="16423">
+ <rom name="BlackCrystal(ClamShell).2B.2.Map6.tzx" size="16423" crc="a4e9b59f" sha1="0ebf5ee230be18ed3c9842314cf32929aa82d879" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="blkcrystls" cloneof="blkcrystl">
+ <description>Black Crystal (Single Sided)</description>
+ <year>1982</year>
+ <publisher>Carnell</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Test/Map 1/Map 2/Map 3"/>
+ <dataarea name="cass" size="50136">
+ <rom name="BlackCrystal(SingleSided).1A.tzx" size="50136" crc="52e60561" sha1="71c582739f4d0bb2dc2649d5b61502eff1ec85d2" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Map 4/Map 4b/Map 5/Map 6"/>
+ <dataarea name="cass" size="64991">
+ <rom name="BlackCrystal(SingleSided).2A.tzx" size="64991" crc="ab30a673" sha1="64b1a7c75d58b2e4ad1ff29df653a0732cadbc21" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="blackstar">
+ <description>Black Star</description>
+ <year>1983</year>
+ <publisher>Quicksilva</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7047">
+ <rom name="BlackStar.tzx" size="7047" crc="f227253f" sha1="0abe2ca4064679c23da82773fab70bf05c245844" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bomber">
+ <description>Bomber</description>
+ <year>1982</year>
+ <publisher>Fisher-Marriott</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Bomber"/>
+ <dataarea name="cass" size="8671">
+ <rom name="Bomber.A.tzx" size="8671" crc="ef8e29d6" sha1="ed3e1fea3dc2b29e69ac8cc5a9b5914aadadf13c" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Table Games"/>
+ <dataarea name="cass" size="11760">
+ <rom name="Bomber.B.TableGames.tzx" size="11760" crc="44370b26" sha1="6332a963637cdac869944203e8d28442aaa39287" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bomberm" cloneof="bomber">
+ <description>Bomber (MikroGen)</description>
+ <year>198?</year>
+ <publisher>Mikro-Gen</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Bomber"/>
+ <dataarea name="cass" size="2686">
+ <rom name="Bomber(MikroGen).A.tzx" size="2686" crc="2a4e2f5c" sha1="0ac22b302c06606e1eee5a7173fb42a5d0a427c4" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Jeff"/>
+ <dataarea name="cass" size="760">
+ <rom name="Bomber(MikroGen).B.Jeff.tzx" size="760" crc="26b7260c" sha1="6be9377e58f774afe870a6fc9a6d412f11ec84c8" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bouncbert">
+ <description>Bouncing Bert</description>
+ <year>1985</year>
+ <publisher>Software Farm</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15151">
+ <rom name="BouncingBert.tzx" size="15151" crc="c30caf71" sha1="ef3be8446d80452a155ed647a55c7d24aee58a6d" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="breakout">
+ <description>Breakout</description>
+ <year>1982</year>
+ <publisher>CDS Micro Systems</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="3467">
+ <rom name="Breakout.tzx" size="3467" crc="322fafd6" sha1="1cb495c3b751e64e8b1fc38c68fabf0340365f39" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="breakoutj">
+ <description>Breakout (JKG)</description>
+ <year>1981</year>
+ <publisher>J.K.Greye Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="948">
+ <rom name="Breakout(JKG).tzx" size="948" crc="e3f0284a" sha1="c8138f8960aedf4d848c65b676d76bf717ec9154" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="breakoutn">
+ <description>Breakout (NGS)</description>
+ <year>1982</year>
+ <publisher>New Generation Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="948">
+ <rom name="Breakout(NGS).tzx" size="948" crc="227210c6" sha1="86b96863cffca1038110a78b99b4df5fbcc75daa" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="breakout3">
+ <description>Breakout 3</description>
+ <year>1982</year>
+ <publisher>Axis</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5705">
+ <rom name="Breakout3.tzx" size="5705" crc="69b9a5bf" sha1="faf622eff6cca236e0623d7f23cf35bfef74d823" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="brkoutsi">
+ <description>Breakout, Space Invaders and Music</description>
+ <year>1981</year>
+ <publisher>Macronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="2734">
+ <rom name="BreakoutSIAndMusic.tzx" size="2734" crc="d383db01" sha1="d5582e7a6a79bd6b8a2096ed968c91292b46483b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="brickstp">
+ <description>Brick Stop</description>
+ <year>1982</year>
+ <publisher>CDS Micro Systems</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="3362">
+ <rom name="BrickStop.tzx" size="3362" crc="2e173afa" sha1="232822deb023be4037e9864a1ccd01e8c42a32bf" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bubblbug">
+ <description>Bubble Bugs</description>
+ <year>1983</year>
+ <publisher>Romik Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="6647">
+ <rom name="BubbleBugs.tzx" size="6647" crc="368c6f68" sha1="e52ddab32b1183910d1c74ae04999a8fb92dc158" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="budgeter">
+ <description>The Budgeter</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7653">
+ <rom name="BudgeterThe.tzx" size="7653" crc="5ea30258" sha1="936a4bdf69507c24b8a634c94065548a3757fac9" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bumper7">
+ <description>Bumper 7</description>
+ <year>1981</year>
+ <publisher>Axis</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5179">
+ <rom name="Bumper7.tzx" size="5179" crc="3c31d394" sha1="2adc581baca7d49305c0ccd720f594c50618be5e" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="bushous3">
+ <description>Business &amp; Household 3</description>
+ <year>1981</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Telephone/Note Pad"/>
+ <dataarea name="cass" size="8929">
+ <rom name="BusinessAndHousehold3.A.tzx" size="8929" crc="c9795488" sha1="b4a0238eadfd18d9d1b594f91cd4aa1bbf8d2a77" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Bank Account"/>
+ <dataarea name="cass" size="16334">
+ <rom name="BusinessAndHousehold3.B.BankAccount.tzx" size="16334" crc="1eac8baf" sha1="2ca52b358174bc20b7afe2c469e5cb3a3077d560" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="byter">
+ <description>Byter</description>
+ <year>1983</year>
+ <publisher>Protek</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5271">
+ <rom name="Byter.tzx" size="5271" crc="540854fe" sha1="ab1f4d1f13735e7ffe4e143c1ee159a2ca1a0617" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="canworms">
+ <description>Can of Worms</description>
+ <year>198?</year>
+ <publisher>Automata Cartography</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7150">
+ <rom name="CanOfWorms.tzx" size="7150" crc="b2e6fa12" sha1="9bb651b39206913bbe74600997114fcbcd70747c" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="carpool">
+ <description>The Carpooler</description>
+ <year>198?</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14507">
+ <rom name="CarpoolerThe.tzx" size="14507" crc="d8258cef" sha1="cafbb78bf77f88c0ffb29e6c2a92666899149c8e" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cassett1">
+ <description>Cassette 1</description>
+ <year>1981</year>
+ <publisher>M.Orwin</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="8920">
+ <rom name="Cassette1.A.tzx" size="8920" crc="ce6e07bd" sha1="ab28050ee9c2e588cd05e8e1a42c2b5c6b46d019" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B: Invaders"/>
+ <dataarea name="cass" size="840">
+ <rom name="Cassette1.B.1.Invaders16K.tzx" size="840" crc="8e8fbe4c" sha1="0710f6de9300b11e35c0e9236764d24360fcf67d" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Side B: Maze Of Death"/>
+ <dataarea name="cass" size="914">
+ <rom name="Cassette1.B.2.MazeOfDeath16K.tzx" size="914" crc="da90fbf0" sha1="dd9b2d3a345e562d3347116d212690c69c3ab320" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cassett2">
+ <description>Cassette 2</description>
+ <year>1981</year>
+ <publisher>M.Orwin</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Othello"/>
+ <dataarea name="cass" size="10350">
+ <rom name="Cassette2.1.Othello.tzx" size="10350" crc="92ad141b" sha1="bc1d784a3a2384b9dbb5f83db3091f8c4c5ea437" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Awari"/>
+ <dataarea name="cass" size="8010">
+ <rom name="Cassette2.2.Awari.tzx" size="8010" crc="3e697f06" sha1="ca2a45ffb336316d644519e3658cd7e50ee5f8ed" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Laser Bases"/>
+ <dataarea name="cass" size="7843">
+ <rom name="Cassette2.3.LaserBases.tzx" size="7843" crc="65607fd8" sha1="072a14528888477c71ec0278b724a54b3ae9f56d" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="Word Mastermind"/>
+ <dataarea name="cass" size="6503">
+ <rom name="Cassette2.4.WordMastermind.tzx" size="6503" crc="c0d66d3c" sha1="3bdc2232badc33b11bb6d82bb483cd0f8cf95a3b" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass5" interface="zx81_cass">
+ <feature name="part_id" value="Rectangles"/>
+ <dataarea name="cass" size="13714">
+ <rom name="Cassette2.5.Rectangles.tzx" size="13714" crc="7c3d1f84" sha1="2de481d730e97e48df9c4636a75bfc746c489532" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass6" interface="zx81_cass">
+ <feature name="part_id" value="Crash"/>
+ <dataarea name="cass" size="2856">
+ <rom name="Cassette2.6.Crash.tzx" size="2856" crc="25f8c5a9" sha1="be9eb7073485cd3d991657a963ff513fbb703a30" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass7" interface="zx81_cass">
+ <feature name="part_id" value="Roulette"/>
+ <dataarea name="cass" size="7982">
+ <rom name="Cassette2.7.Roulette.tzx" size="7982" crc="0e7e94b6" sha1="3141ff5179036e4ef765e2f4ba6caf6dd50f786f" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass8" interface="zx81_cass">
+ <feature name="part_id" value="Pontoon"/>
+ <dataarea name="cass" size="6974">
+ <rom name="Cassette2.8.Pontoon.tzx" size="6974" crc="61d67ed4" sha1="85eabdb5e457636077c631a24d8899d1a4005649" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass9" interface="zx81_cass">
+ <feature name="part_id" value="Penny Shoot"/>
+ <dataarea name="cass" size="3595">
+ <rom name="Cassette2.9.PennyShoot.tzx" size="3595" crc="3009b9f3" sha1="835ac755753e105c3f0058664422d3ffe0a5f075" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass10" interface="zx81_cass">
+ <feature name="part_id" value="Gun Command"/>
+ <dataarea name="cass" size="2349">
+ <rom name="Cassette2.10.GunCommand.tzx" size="2349" crc="3fca5ea8" sha1="01c51cd669b219fca07fb1789b6a659b70441c26" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cassett3">
+ <description>Cassette 3</description>
+ <year>1982</year>
+ <publisher>M.Orwin</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="96710">
+ <rom name="Cassette3.tzx" size="96710" crc="f612e596" sha1="a3a02c88cd119f5acf87ef056a8b26dad0a79390" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cassett4">
+ <description>Cassette 4</description>
+ <year>1982</year>
+ <publisher>M.Orwin</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="53160">
+ <rom name="Cassette4.tzx" size="53160" crc="9c246427" sha1="5cdb627ac5b3498225d7d4d5fb90d80751187218" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cassett5">
+ <description>Cassette 5</description>
+ <year>1983</year>
+ <publisher>M.Orwin</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="34618">
+ <rom name="Cassette5.A.tzx" size="34618" crc="03d298c2" sha1="5d3d2a0728f51d9b537556066939fc44499424c2" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="33214">
+ <rom name="Cassette5.B.tzx" size="33214" crc="576e752d" sha1="12b00657151e8908ab4d374ef55482b7f4c0c788" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cass50">
+ <description>Cassette 50</description>
+ <year>1983</year>
+ <publisher>Cascade</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="52088">
+ <rom name="Cassette50.A.tzx" size="52088" crc="e5619ec8" sha1="f2a5c306116b76fa8daccb3759d79c65060575c0" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="42598">
+ <rom name="Cassette50.B.tzx" size="42598" crc="a1ce7f38" sha1="79acd22c7bae0dd030521ba64b183c1eb4444fd0" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="castle">
+ <description>Castle</description>
+ <year>1982</year>
+ <publisher>CDS Micro Systems</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14716">
+ <rom name="Castle.tzx" size="14716" crc="ba09cc38" sha1="688abd7300f76e35f69ae025a4411f2767514b94" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="catacomb">
+ <description>Catacombs</description>
+ <year>1981</year>
+ <publisher>J.K.Greye Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="12740">
+ <rom name="Catacombs.tzx" size="12740" crc="f8d6aee6" sha1="c872d07e278df997df9a66185852f580fd851151" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cavecrus">
+ <description>Cave Crusade</description>
+ <year>198?</year>
+ <publisher>AWA Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="6510">
+ <rom name="CaveCrusade.tzx" size="6510" crc="9dec44e3" sha1="bc4a46fdec5734a88afc005df4864feae26549e1" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="centipede">
+ <description>Centipede</description>
+ <year>1982</year>
+ <publisher>Llamasoft</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="9940">
+ <rom name="Centipede.tzx" size="9940" crc="163cf493" sha1="dd75bbb4ec90c8d054e1c0a41164e02a8f3121e3" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="centipededk" cloneof="centipede">
+ <description>Centipede (dk)</description>
+ <year>1982</year>
+ <publisher>dK'tronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="10008">
+ <rom name="Centipede(dktronics).tzx" size="10008" crc="f12c5ee1" sha1="c90d0ca1dd3e1679c9c0e4a359d6b84978c129f7" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="centipedeg" cloneof="centipede">
+ <description>Centipede (Green Cover)</description>
+ <year>198?</year>
+ <publisher>dK'tronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="9967">
+ <rom name="Centipede(Green).tzx" size="9967" crc="0ed972cd" sha1="1bf47ef2651d5d09a6971ce9eb931aa41ed846cb" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="challeng">
+ <description>Challenge</description>
+ <year>198?</year>
+ <publisher>Micromega</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="4865">
+ <rom name="Challenge.tzx" size="4865" crc="8439c8b1" sha1="b3dd53df21a684570b3120a8a996fae738dfb15a" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="challeng1">
+ <description>The Challenger 1</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="4178">
+ <rom name="Challenger1The.tzx" size="4178" crc="a01b37e4" sha1="5b9809a27911e43d8fb882a60da3752fe202bc27" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="champion">
+ <description>Champions!</description>
+ <year>198?</year>
+ <publisher>Peaksoft</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15086">
+ <rom name="Champions.tzx" size="15086" crc="7ae0415b" sha1="1847183ffcaf74bb7f709d09d1d5fea24c720e6a" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cbookmgr">
+ <description>The Checkbook Manager</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="13713">
+ <rom name="CheckbookManagerThe.tzx" size="13713" crc="b32eaa12" sha1="d1b150fee25332715af8115604d8063e5a71b77d" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="chess">
+ <description>Chess also Chess-Clock</description>
+ <year>1981</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Chess"/>
+ <dataarea name="cass" size="8529">
+ <rom name="Chess.A.tzx" size="8529" crc="048ac674" sha1="19d9455f04dfbd3fd3ccf8ed150a4978d969beaa" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Chess-Clock"/>
+ <dataarea name="cass" size="1805">
+ <rom name="Chess.B.ChessClock.tzx" size="1805" crc="d12b8821" sha1="204487379b173c2ba8d805ae4858de86e74cc852" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="chessmg" cloneof="chess">
+ <description>Chess (MikroGen)</description>
+ <year>1982</year>
+ <publisher>Mikro-Gen</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Chess"/>
+ <dataarea name="cass" size="8529">
+ <rom name="Chess(MikroGen).A.tzx" size="8529" crc="92057527" sha1="adbdb8dc0294ed68aba56b68e16321f58402887d" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Chess-Clock"/>
+ <dataarea name="cass" size="1805">
+ <rom name="Chess(MikroGen).B.ChessClock.tzx" size="1805" crc="4ddef71e" sha1="835616b426f0536d3a8fb6902760c71809222775" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="chessp" cloneof="chess">
+ <description>Chess (Psion)</description>
+ <year>1981</year>
+ <publisher>Psion</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Chess"/>
+ <dataarea name="cass" size="8529">
+ <rom name="Chess(Orange).A.tzx" size="8529" crc="0fe7013a" sha1="ee43745c163b2fd3ed37585d1c766f793153f77b" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Chess-Clock"/>
+ <dataarea name="cass" size="1805">
+ <rom name="Chess(Orange).B.ChessClock.tzx" size="1805" crc="2e049800" sha1="be7ca7357fa5111bda6d8d93560aa85e4b5fc0a7" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="chesst" cloneof="chess">
+ <description>Chess (Timex)</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="10227">
+ <rom name="Chess(Timex).tzx" size="10227" crc="8f6bfdc7" sha1="bd2a54d8ccb6bd918deaba02b0793cf0372c8f27" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="chessty" cloneof="chess">
+ <description>Chess (Typed)</description>
+ <year>1981</year>
+ <publisher>Mikro-Gen</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Chess"/>
+ <dataarea name="cass" size="8529">
+ <rom name="Chess(Typed).A.tzx" size="8529" crc="77e34686" sha1="5d785ac7af08d094fcc9470c26230cb6a584e8d5" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Chess-Clock"/>
+ <dataarea name="cass" size="1805">
+ <rom name="Chess(Typed).B.ChessClock.tzx" size="1805" crc="7b285e51" sha1="0db27d26e93f935ecc523efeea341550c2d5ec5b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="chinastr">
+ <description>Chinese Astrology</description>
+ <year>1982</year>
+ <publisher>M.A.Smith</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Love, Sex &amp; Marriage"/>
+ <dataarea name="cass" size="8566">
+ <rom name="ChineseAstrology.A.LoveSexMarriage.tzx" size="8566" crc="ee9a7ed3" sha1="dfbdeec9395d1a90551df2ec12dd785f95b77923" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Business Relationships"/>
+ <dataarea name="cass" size="10812">
+ <rom name="ChineseAstrology.B.BusinessRelationships.tzx" size="10812" crc="a08a524e" sha1="2b833b77f200fd6a721650c700addf20823facda" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="chrsdemo">
+ <description>Chrs Demo</description>
+ <year>198?</year>
+ <publisher>Quicksilva</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5993">
+ <rom name="ChrsDemo.tzx" size="5993" crc="3e8d1da7" sha1="8509b1fc61dc20c1e9280526858b0e95bd6359b5" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cityxon">
+ <description>City of Xon</description>
+ <year>1982</year>
+ <publisher>Pleasantrees</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15729">
+ <rom name="CityOfXon.tzx" size="15729" crc="3b72af94" sha1="0d07fb55913b3495b0c26178c84d010cd5eeb03e" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="citypatrl">
+ <description>City Patrol</description>
+ <year>1982</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="9388">
+ <rom name="CityPatrol.tzx" size="9388" crc="1ea8841e" sha1="99d5ae89cfe7940e67d8ede6dbd860020b1ad9df" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cpatsabo">
+ <description>City Patrol and Sabotage</description>
+ <year>1981</year>
+ <publisher>Macronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="City Patrol"/>
+ <dataarea name="cass" size="9391">
+ <rom name="CityPatrolAndSabotage.A.CityPatrol.tzx" size="9391" crc="71200d8c" sha1="519bc37531f57d85b3d2804d661c5e38790a95f2" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Sabotage"/>
+ <dataarea name="cass" size="9070">
+ <rom name="CityPatrolAndSabotage.B.Sabotage.tzx" size="9070" crc="8af2b584" sha1="87a7d2ca469d26dc5b2dccb8e267c9dbab337d1f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="clubrecc">
+ <description>Club Record Controller</description>
+ <year>1982</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7075">
+ <rom name="ClubRecordController.tzx" size="7075" crc="c1bdaa09" sha1="246f887ed316a62311165af8ac7abee59c0cfce6" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="clubrecs">
+ <description>Club Records</description>
+ <year>1982</year>
+ <publisher>W.H.Smith</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7744">
+ <rom name="ClubRecords.tzx" size="7744" crc="229bf155" sha1="d62dc88512d6dc336dad5637924e6056a19e12a7" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="collspack">
+ <description>Collectors Pack</description>
+ <year>1982</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7665">
+ <rom name="CollectorsPack.tzx" size="7665" crc="4998a5d6" sha1="bb2b43893119eabf30754be20992bf32e05e6832" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="collsrecs" cloneof="collspack">
+ <description>Collectors Recording System</description>
+ <year>198?</year>
+ <publisher>W.H.Smith</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7665">
+ <rom name="CollectorsRecordingSystem.tzx" size="7665" crc="1a89b64d" sha1="7fb6cf85c4a0e47a2ad78f5f4371deeebadcb923" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="comchest">
+ <description>Community Chest</description>
+ <year>198?</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14270">
+ <rom name="CommunityChest.tzx" size="14270" crc="bf585c82" sha1="c95af3f37795adabe7f251643efff51cb7e2579f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="combasic">
+ <description>Complete Sinclair ZX81/Timex TS1000 Basic Course</description>
+ <year>1981</year>
+ <publisher>Melbourne House</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Cassette 1"/>
+ <dataarea name="cass" size="6837">
+ <rom name="CompleteBasicCourse.1.tzx" size="6837" crc="8a335d6d" sha1="157bef534acc8ff7f29cbfecdb41a81de3a262b8" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Cassette 2"/>
+ <dataarea name="cass" size="6856">
+ <rom name="CompleteBasicCourse.2.tzx" size="6856" crc="5a6f7147" sha1="726829d49097ad4997f6bc6fae7f5c0b7f9e124c" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="compteba">
+ <description>Compte Bancaire</description>
+ <year>1984</year>
+ <publisher>No Man's Land</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Loader"/>
+ <dataarea name="cass" size="1377">
+ <rom name="CompteBancaire.A.Loader.tzx" size="1377" crc="07222c29" sha1="5d331a026f9fce60cb7aaac0621d7618ba71d849" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Compte Bancaire"/>
+ <dataarea name="cass" size="15852">
+ <rom name="CompteBancaire.B.tzx" size="15852" crc="e0ae5e4d" sha1="e222deec7ce04fe16c6ffe79ec675d62c82e5a76" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="compshar">
+ <description>Comp-u-Share</description>
+ <year>198?</year>
+ <publisher>Micromega</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="17652">
+ <rom name="CompuShare.tzx" size="17652" crc="f62ae771" sha1="043e56d73eeb16b8c286fd282d94cf5aa17427ff" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="compcalc">
+ <description>ComputaCalc ZX</description>
+ <year>1981</year>
+ <publisher>Silicon Tricks</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="9228">
+ <rom name="ComputaCalc.tzx" size="9228" crc="06066afc" sha1="496065dbc17d2461647bb76933ad9247f03cd1de" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="compcoach">
+ <description>The Computer Coach</description>
+ <year>1983</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Part 1"/>
+ <dataarea name="cass" size="7858">
+ <rom name="ComputerCoachThe.1.Part1.tzx" size="7858" crc="a9824d2e" sha1="c3be190a13a3699b810d09da4929ffeff2ddef32" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Part 2"/>
+ <dataarea name="cass" size="7807">
+ <rom name="ComputerCoachThe.3.Part2.tzx" size="7807" crc="63b90e60" sha1="0d4340fd83a83cbb638bd8f831b364ca91cbc249" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="concentr">
+ <description>Concentration</description>
+ <year>1982</year>
+ <publisher>International Publishing &amp; Software Inc.</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="821">
+ <rom name="Concentration.A.tzx" size="821" crc="312e2083" sha1="03d9372995e2b4827f18b3aafd9009ac97957f3a" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="16114">
+ <rom name="Concentration.B.tzx" size="16114" crc="7133e94f" sha1="f6667d8ac0a0be119a987175a03791d62faec20f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="constell">
+ <description>Constellation</description>
+ <year>198?</year>
+ <publisher>Bug Byte</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="12611">
+ <rom name="Constellation.tzx" size="12611" crc="a0146b49" sha1="fb8bbc99988812c5ef372a7358a36ceadb53ae73" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="constellg" cloneof="constell">
+ <description>Constellation (Gladstone)</description>
+ <year>198?</year>
+ <publisher>Gladstone Electronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15694">
+ <rom name="Constellation(GE).tzx" size="15694" crc="89092de9" sha1="69da2b7f7a1f311a73858f4787f05c31460e7172" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ctrltech">
+ <description>Control Technology Tapes 1,2,3</description>
+ <year>198?</year>
+ <publisher>Control Technology</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="48433">
+ <rom name="ControlTechnology123.tzx" size="48433" crc="d9610ea9" sha1="8e630dbc2725862733cd138e69a7c8ca9eeed84f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="convgerm">
+ <description>Conversational German</description>
+ <year>1983</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15603">
+ <rom name="ConversationalGerman.tzx" size="15603" crc="810bdcc4" sha1="ddb421fe807557a6f4a2eb7ea78e15c249b15de1" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cosmguer">
+ <description>Cosmic Guerilla</description>
+ <year>1983</year>
+ <publisher>Quicksilva</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7561">
+ <rom name="CosmicGuerilla.tzx" size="7561" crc="001ef96d" sha1="ef8e79312d0dc7efec6bf2a9a6ca785b0e4a94a0" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="countatt">
+ <description>Counter Attack</description>
+ <year>198?</year>
+ <publisher>Woodside Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7219">
+ <rom name="CounterAttack.tzx" size="7219" crc="6b8852ca" sha1="286cd36a713f95ffcc5e847539a59de6c55f6c42" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="coupnmgr">
+ <description>The Coupon Manager</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16135">
+ <rom name="CouponManagerThe.Alt2.tzx" size="16135" crc="de8ec693" sha1="35fc0916df11991c94336746c3f45ae22d43a715" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <dataarea name="cass" size="16120">
+ <rom name="CouponManagerThe.tzx" size="16120" crc="6f6bfea6" sha1="297dc8c4445f9f0cc3ae380c8f68c537fa52679b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="critpath">
+ <description>Critical Path Analysis</description>
+ <year>1981</year>
+ <publisher>Hilderbay</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="6275">
+ <rom name="CriticalPathAnalysis.tzx" size="6275" crc="28ee5886" sha1="3ee5a82dec70e4bd7eb1d514cdd4538cb433f24a" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="critpatht">
+ <description>Critical Path Analysis (Timex)</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="6720">
+ <rom name="CriticalPathAnalysis(Timex).tzx" size="6720" crc="c1835895" sha1="469f80fbf8e3979b8534e28dabd9d7089e55425e" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="croakac">
+ <description>Croaka-Crawla</description>
+ <year>1983</year>
+ <publisher>Quicksilva</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14896">
+ <rom name="CroakaCrawla.tzx" size="14896" crc="1e07d1c3" sha1="3489fd97ee769b1b59e0b74ccdeb667f135dbcbd" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="cubegame">
+ <description>The Cube Game</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="13714">
+ <rom name="CubeGameThe.tzx" size="13714" crc="c87bea16" sha1="dbf04e07ff5ed808df032c66191f79d0c96488a5" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dallasf">
+ <description>Dallas (French)</description>
+ <year>1983</year>
+ <publisher>Cases Computer Simulations</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16379">
+ <rom name="Dallas(French).tzx" size="16379" crc="4a65562e" sha1="499bee247f3bdc37eca67e95eee1624de11ec5d6" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dampglop">
+ <description>Damper/Glooper</description>
+ <year>1983</year>
+ <publisher>Quicksilva</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Damper"/>
+ <dataarea name="cass" size="7893">
+ <rom name="DamperGlooper.A.1.Damper.tzx" size="7893" crc="7ba5920e" sha1="2bac7abefbcf29e1537e40c77d5d7a9bf5247ddc" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Glooper"/>
+ <dataarea name="cass" size="7425">
+ <rom name="DamperGlooper.A.2.Glooper.tzx" size="7425" crc="c7da8d44" sha1="0d7aafc71a2209f01b793bb25cb2adc28491e143" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="damslbst">
+ <description>The Damsel and the Beast</description>
+ <year>1981</year>
+ <publisher>Bug Byte</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="10464">
+ <rom name="DamselAndTheBeastThe.tzx" size="10464" crc="b34252c8" sha1="574392a27b8328ec82121e1c666e2c3411f34342" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dcoder">
+ <description>D Coder</description>
+ <year>198?</year>
+ <publisher>Cosma</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7680">
+ <rom name="DCoder.A.tzx" size="7680" crc="1684ba79" sha1="39f16bb21b52c566218f38aa07b1951e38c0f8bd" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dictator">
+ <description>Dictator</description>
+ <year>1982</year>
+ <publisher>Bug Byte</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16306">
+ <rom name="Dictator.tzx" size="16306" crc="b01e01a7" sha1="c14608ecc904b6ad8141d64bb4eed66c43b6316d" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dodgcon4">
+ <description>Dodgems and Connect 4</description>
+ <year>198?</year>
+ <publisher>CDS Micro Systems</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Dodgems"/>
+ <dataarea name="cass" size="4556">
+ <rom name="DodgemsAndConnect4.1.Dodgems.tzx" size="4556" crc="12b40976" sha1="c3488467611ce1de2ab47e5e3ddb1d476a308dc8" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Connect 4"/>
+ <dataarea name="cass" size="4943">
+ <rom name="DodgemsAndConnect4.2.Connect4.tzx" size="4943" crc="dbd71395" sha1="3c7d23465de15ee4cec68cfe23af76e159169656" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dodgcon4b" cloneof="dodgcon4">
+ <description>Dodgems and Connect 4 (Brown Inlay)</description>
+ <year>1982</year>
+ <publisher>CDS Micro Systems</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="9488">
+ <rom name="DodgemsAndConnect4(Brown).tzx" size="9488" crc="39d4e107" sha1="de9f3293e482ac4f92b3278d262e45321450fe79" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dominoes">
+ <description>Dominoes</description>
+ <year>1983</year>
+ <publisher>Phipps Associates</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15375">
+ <rom name="Dominoes.tzx" size="15375" crc="4fc4e410" sha1="b780954c535ccd6f6a778999b7244de33bb3ad53" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dontpsgo">
+ <description>Do Not Pass Go</description>
+ <year>198?</year>
+ <publisher>Work Force</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="13587">
+ <rom name="DoNotPassGo.tzx" size="13587" crc="a2dd0f0c" sha1="45ded58ce3255e5239722c956eef084bac20ad6d" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dragnmze">
+ <description>Dragon Maze</description>
+ <year>1981</year>
+ <publisher>Macronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="4970">
+ <rom name="DragonMaze.tzx" size="4970" crc="c2a29e0d" sha1="58e77f8d47f0a0061f0545e3d95485d9041d7025" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="drfloyd">
+ <description>Dr.Floyd</description>
+ <year>198?</year>
+ <publisher>Apropos Technology</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14294">
+ <rom name="DrFloyd.tzx" size="14294" crc="d5b0408f" sha1="6982c898304a0e319434984a019b96682d177661" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="dungdoom">
+ <description>Dungeons of Doom</description>
+ <year>1982</year>
+ <publisher>Temptation Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15074">
+ <rom name="DungeonsOfDoom.tzx" size="15074" crc="d5034066" sha1="b2884c73af5da39e4c32d9a11206769e006f456f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ee1filtr">
+ <description>E.E.1 - Filter Design</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="12047">
+ <rom name="EE1FilterDesign.tzx" size="12047" crc="1159b6aa" sha1="d6714fe623f9e444c22cde90f56488a58fce0d33" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elcostan">
+ <description>Electric Cost Analyzer</description>
+ <year>1983</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15789">
+ <rom name="ElectricCostAnalyzer.tzx" size="15789" crc="d6745b7a" sha1="f5f5c2a8038df69484937ce4b853b4e83dfcf5f5" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elcheckbk">
+ <description>The Electronic Checkbook</description>
+ <year>1982</year>
+ <publisher>Timeworks</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16382">
+ <rom name="ElectronicCheckbookThe.tzx" size="16382" crc="bc3ed36d" sha1="3791720c3974c31c322b9d1e6a6281de6e6bcfcd" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="elctrnic">
+ <description>Electronics</description>
+ <year>198?</year>
+ <publisher>Spectre</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16121">
+ <rom name="Electronics.tzx" size="16121" crc="e777753a" sha1="d3a41d3aa66db93144eef927a1c37fc8bb9fab90" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="encounter">
+ <description>Encounter</description>
+ <year>1982</year>
+ <publisher>Quicksilva</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="17612">
+ <rom name="Encounter.tzx" size="17612" crc="af150f3f" sha1="ec8355c006d83dfc367a166ee6f33cb3530381ab" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="englit1">
+ <description>English Literature 1</description>
+ <year>1982</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Novelists"/>
+ <dataarea name="cass" size="11359">
+ <rom name="EnglishLiterature1.A.Novelists.tzx" size="11359" crc="eb41799d" sha1="4f594a2062924d008ff6521a647290c53e300b93" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Authors"/>
+ <dataarea name="cass" size="11378">
+ <rom name="EnglishLiterature1.B.Authors.tzx" size="11378" crc="6211723c" sha1="9f5579290feec503185214ffd33cec72ca73e9d4" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="englit1w" cloneof="englit1">
+ <description>English Literature 1 (WHSmith)</description>
+ <year>1982</year>
+ <publisher>W.H.Smith</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Novelists"/>
+ <dataarea name="cass" size="11359">
+ <rom name="EnglishLiterature1.A.Novelists.tzx" size="11359" crc="eb41799d" sha1="4f594a2062924d008ff6521a647290c53e300b93" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Authors"/>
+ <dataarea name="cass" size="11378">
+ <rom name="EnglishLiterature1.B.Authors.tzx" size="11378" crc="6211723c" sha1="9f5579290feec503185214ffd33cec72ca73e9d4" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="englit2">
+ <description>English Literature 2</description>
+ <year>1982</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Poets and Playwrights"/>
+ <dataarea name="cass" size="11815">
+ <rom name="EnglishLiterature2.A.PoetsAndPlaywrights.tzx" size="11815" crc="3928ee74" sha1="16c4d301674f1b8fd69ca74179f4ae3e8983fcc8" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Modern Authors"/>
+ <dataarea name="cass" size="11476">
+ <rom name="EnglishLiterature2.B.ModernAuthors.tzx" size="11476" crc="edae3315" sha1="02ea5f2739bb2c59f3b1be30b3d05265a5e94f7e" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="englit2w" cloneof="englit2">
+ <description>English Literature 2 (WHSmith)</description>
+ <year>1982</year>
+ <publisher>W.H.Smith</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Poets and Playwrights"/>
+ <dataarea name="cass" size="11815">
+ <rom name="EnglishLiterature2(ICL).A.PoetsAndPlaywrights.tzx" size="11815" crc="e7613f6c" sha1="d571fb435874ff06ea0791f994cbd16fff7c9387" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Modern Authors"/>
+ <dataarea name="cass" size="11476">
+ <rom name="EnglishLiterature2(ICL).B.ModernAuthors.tzx" size="11476" crc="6bf66648" sha1="5f1beba70eb4471f2b10e0a0e0165416140bc185" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="esmanhat">
+ <description>Escape From Manhattan</description>
+ <year>1983</year>
+ <publisher>Computer Rentals</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16320">
+ <rom name="EscapeFromManhattan.tzx" size="16320" crc="2cacbb72" sha1="975c976e36b9dbd47fcf5312fae4ad5c2521d6d7" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="esshazzar">
+ <description>Escape From Shazzar</description>
+ <year>1983</year>
+ <publisher>International Publishing &amp; Software Inc.</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16376">
+ <rom name="EscapeFromShazzar.tzx" size="16376" crc="78075b95" sha1="992dfcece29b42c729bbca05422bf090dc7c275c" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="espisland">
+ <description>Espionage Island</description>
+ <year>1982</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15734">
+ <rom name="EspionageIsland.tzx" size="15734" crc="2bf38dca" sha1="1afaa1c3773c78f8f92941d95de226a727cc8822" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="espislanda" cloneof="espisland">
+ <description>Espionage Island (Artic)</description>
+ <year>198?</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15734">
+ <rom name="EspionageIsland(Artic).tzx" size="15734" crc="06a3887c" sha1="7b36f0bce5eccb9fc3dc4fb553516e5e7f5adabe" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="execsoft">
+ <description>Execu-Soft</description>
+ <year>198?</year>
+ <publisher>Orbyte Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="General Ledger"/>
+ <dataarea name="cass" size="12120">
+ <rom name="Execusoft.1.GeneralLedger.tzx" size="12120" crc="6046a152" sha1="26202c85cec0c8320ac4fc7db0f0cc1e30690e02" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Customer Credit"/>
+ <dataarea name="cass" size="13890">
+ <rom name="Execusoft.2.CustomerCredit.tzx" size="13890" crc="1fcf99f7" sha1="da0ef74209bfb7c0822f246f0a1d7085ce997a83" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Execu-Diary"/>
+ <dataarea name="cass" size="7616">
+ <rom name="Execusoft.3.ExecuDiary.tzx" size="7616" crc="bd80eddb" sha1="ebc7a7a8e4fc8c96f93c02ab17e8b01d11ef5a52" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="Execu-Address &amp; Phone File"/>
+ <dataarea name="cass" size="8621">
+ <rom name="Execusoft.4.ExecuAddressPhoneFile.tzx" size="8621" crc="3ad5de89" sha1="894a97451180bce9bebb53358c07bfd79dc849a2" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass5" interface="zx81_cass">
+ <feature name="part_id" value="Accounts Payable"/>
+ <dataarea name="cass" size="10231">
+ <rom name="Execusoft.5.AccountsPayable.tzx" size="10231" crc="a0c1cdc0" sha1="107edcf09a8e0650a14d5b7507a5d9dda027bb3f" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass6" interface="zx81_cass">
+ <feature name="part_id" value="Accounts Receivable"/>
+ <dataarea name="cass" size="10285">
+ <rom name="Execusoft.6.AccountsReceivable.tzx" size="10285" crc="f09a5edf" sha1="b5f265aef3cb9f112fa78efaf36389f0e325f65e" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass7" interface="zx81_cass">
+ <feature name="part_id" value="Inventory Control"/>
+ <dataarea name="cass" size="15338">
+ <rom name="Execusoft.7.InventoryControl.tzx" size="15338" crc="2ce1e860" sha1="6762dd492b4ddb0916ff0eb7f255f9bd894afa4a" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="famquiz">
+ <description>Family Quiz</description>
+ <year>1981</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="31731">
+ <rom name="FamilyQuiz.A.tzx" size="31731" crc="b5cab947" sha1="125f78ba649df1670d50022aa9b71dec2300bf4f" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="32094">
+ <rom name="FamilyQuiz.B.tzx" size="32094" crc="814f2035" sha1="a9d61019e77a29dd4c27a70bbd29b148e4c8717c" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fangames">
+ <description>Fantasy Games</description>
+ <year>1981</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Perilous Swamp"/>
+ <dataarea name="cass" size="10713">
+ <rom name="FantasyGames.A.PerilousSwamp.tzx" size="10713" crc="c6c9c195" sha1="975d8558822f17b7a24c047dce3f00be001dfbf3" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Sorcerer's Island"/>
+ <dataarea name="cass" size="16069">
+ <rom name="FantasyGames.B.SorcerersIsland.tzx" size="16069" crc="16770cb3" sha1="471beea8530eee168c592fc1f02567ade04c6b6e" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fangamesp">
+ <description>Fantasy Games (Psion)</description>
+ <year>1981</year>
+ <publisher>Psion</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Perilous Swamp"/>
+ <dataarea name="cass" size="11669">
+ <rom name="FantasyGames(Psion).A.PerilousSwamp.tzx" size="11669" crc="7ff18d67" sha1="d442a69d4ffbcf44fce65fc0f91f34691e8980ab" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Sorcerer's Island"/>
+ <dataarea name="cass" size="16337">
+ <rom name="FantasyGames(Psion).B.SorcerersIsland.tzx" size="16337" crc="219f7160" sha1="b70fdfbd6c27b194e7ff41021d9b9dddd827c47b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fastload">
+ <description>Fastload</description>
+ <year>1982</year>
+ <publisher>International Publishing &amp; Software Inc.</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="10345">
+ <rom name="Fastload.A.tzx" size="10345" crc="141414a6" sha1="56f1a0ab98d5ef271a7bfee64d87c7295175901f" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="2216">
+ <rom name="Fastload.B.BootstrapLoader.tzx" size="2216" crc="123f3773" sha1="a59f8836adbc29e6bb149993af80a811c8323401" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fastloada" cloneof="fastload">
+ <description>Fastload (Artic)</description>
+ <year>198?</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="15318">
+ <rom name="Fastload(Artic).A.tzx" size="15318" crc="f58c997b" sha1="a43e826f5e3f53b96cbf98e544ed4dc579e8b802" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="2220">
+ <rom name="Fastload(Artic).B.BootstrapLoader.tzx" size="2220" crc="8bc8521f" sha1="d96423777b44bb0675cbdc8cd66c273689cd8fd6" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fastls">
+ <description>Fast Load Save</description>
+ <year>1982</year>
+ <publisher>Musamy Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="11000">
+ <rom name="FastLoadSave.tzx" size="11000" crc="939f03cb" sha1="616dfc2662d46f415277990bebf0b09e187ed36e" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fastoneg" cloneof="fastone">
+ <description>The Fast One (Green Inlay)</description>
+ <year>198?</year>
+ <publisher>Campbell Systems</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="9837">
+ <rom name="FastOne(Green).tzx" size="9837" crc="3c57d2f2" sha1="c31f2892ea9145cdab6ef5f21cd126ab9d079036" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fastone">
+ <description>The Fast One</description>
+ <year>198?</year>
+ <publisher>Campbell Systems</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="TFO"/>
+ <dataarea name="cass" size="4770">
+ <rom name="FastOneThe.A.1.TFO.tzx" size="4770" crc="bdd31d76" sha1="642e49611a0f386aa44186141b334659a9face42" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="TFOX"/>
+ <dataarea name="cass" size="5214">
+ <rom name="FastOneThe.A.2.TFOX.tzx" size="5214" crc="a02d25de" sha1="83dfe8ea5fff08ac58ddb93f0ae1014bc88b3e08" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="first">
+ <description>The First</description>
+ <year>198?</year>
+ <publisher>Mindseye</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="19748">
+ <rom name="First.A.tzx" size="19748" crc="d4b2d430" sha1="ded45934df8afad1096a2dfce70755e5eb14a767" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="21371">
+ <rom name="First.B.tzx" size="21371" crc="53ff77de" sha1="0b653e6c6bd1239c31c3aa044cdf070eeac1f914" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="flsimul">
+ <description>Flight Simulation</description>
+ <year>1982</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="13855">
+ <rom name="FlightSimulation.tzx" size="13855" crc="945da3c1" sha1="de020d7531c0904a8a152193e7b3d5203e5c1017" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="flsimult" cloneof="flsimul">
+ <description>The Flight Simulator</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="13855">
+ <rom name="FlightSimulation.tzx" size="13855" crc="945da3c1" sha1="de020d7531c0904a8a152193e7b3d5203e5c1017" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="flugsim" cloneof="flsimul">
+ <description>Flug-Simulation</description>
+ <year>1982</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="13855">
+ <rom name="FlightSimulation.tzx" size="13855" crc="945da3c1" sha1="de020d7531c0904a8a152193e7b3d5203e5c1017" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="football">
+ <description>Football</description>
+ <year>198?</year>
+ <publisher>Tyrant</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15858">
+ <rom name="Football.tzx" size="15858" crc="8503533c" sha1="d75dfc7310f08160f7ff61f2e08f2ed4fa5aabb0" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fballeag">
+ <description>Football-League</description>
+ <year>1981</year>
+ <publisher>Video Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14343">
+ <rom name="FootballLeague.A.tzx" size="14343" crc="78694c75" sha1="4887f03b6e5725d1acb156a485ddc9c450607d88" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fballman">
+ <description>Football Manager</description>
+ <year>1981</year>
+ <publisher>Addictive Games</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14968">
+ <rom name="FootballManager.tzx" size="14968" crc="34e09721" sha1="56180074fe4bbc0f6c0189b88482affd537b5645" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fballpool">
+ <description>Football Pools Program</description>
+ <year>198?</year>
+ <publisher>Hartland Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="24422">
+ <rom name="FootballPools.tzx" size="24422" crc="2d0ed98b" sha1="a2ae0611ad434600777c2ba0df4cc48d8109d9f8" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="forth">
+ <description>Forth</description>
+ <year>1983</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14183">
+ <rom name="Forth.tzx" size="14183" crc="376c5750" sha1="012a7e585c3f2d245e3d7ffba935ea1962be21c4" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fortzorl">
+ <description>Fortress of Zorlac</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7442">
+ <rom name="FortressOfZorlac.tzx" size="7442" crc="30d3ba7d" sha1="13f8969e92932f3f6e4c6f177bbe34512780b96f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fortynin">
+ <description>Forty Niner</description>
+ <year>198?</year>
+ <publisher>Software Farm</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14106">
+ <rom name="FortyNiner.tzx" size="14106" crc="1c4eff0a" sha1="e563342e858b8c38a384ebfd695c479feb01a4a5" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="freegame">
+ <description>Free Games Cassette (French)</description>
+ <year>1983</year>
+ <publisher>Direco International</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="2948">
+ <rom name="FreeGamesCassette.A.tzx" size="2948" crc="240ba061" sha1="3d760fa3bda783b5d06f26fc440b1fac5083310b" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="7123">
+ <rom name="FreeGamesCassette.B.Envahisseurs.tzx" size="7123" crc="c54ba9c8" sha1="506c84ab8acb12621f0ea011877ad007ba8b8d55" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="frenchrv">
+ <description>G.C.E. "O" Level French Revision</description>
+ <year>1982</year>
+ <publisher>Rose Cassettes</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="40286">
+ <rom name="FrenchRevision.A.tzx" size="40286" crc="526e83c8" sha1="82ab674e38e811a42fd1b908be63ae48ae91c9b1" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="35414">
+ <rom name="FrenchRevision.B.tzx" size="35414" crc="ab407694" sha1="143f8473d07109167fdaf0f64bcd103f380fad6c" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="frogger">
+ <description>Frogger</description>
+ <year>198?</year>
+ <publisher>DJL Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="13723">
+ <rom name="Frogger.tzx" size="13723" crc="bd7df880" sha1="75499b16de8dfbabf668328109d0a36963bfd11b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="froggers">
+ <description>Frogger (Sega)</description>
+ <year>1981</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="10868">
+ <rom name="Frogger(Sega).tzx" size="10868" crc="95952886" sha1="08999372caf4a07b532e7360f1573c5262b56ed7" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="froggy">
+ <description>Froggy</description>
+ <year>1982</year>
+ <publisher>DJL Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="10622">
+ <rom name="Froggy.tzx" size="10622" crc="e84f00da" sha1="c0d7d2db94e8fb84bb22428b0b6a5c5ccc11c52b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="frogs">
+ <description>Frogs</description>
+ <year>198?</year>
+ <publisher>Mikro-Gen</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="4453">
+ <rom name="Frogs.tzx" size="4453" crc="efd0f05e" sha1="899d5cdf74208e30d17c5d34f5733d207222daaa" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="fundmath">
+ <description>FUNdamentals of Math</description>
+ <year>1983</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="39312">
+ <rom name="FUNdamentalsOfMath.tzx" size="39312" crc="75ade9a1" sha1="0c1fd6d5034fa73e8d1d3dd525e088cd96971bd7" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="funfaira">
+ <description>Fun Fair Adventure</description>
+ <year>1983</year>
+ <publisher>Fawkes Computing</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15892">
+ <rom name="FunFairAdventure.tzx" size="15892" crc="477b0e8f" sha1="c828c69e2a899e1b15968dafeaeb19b6045b360b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="galgunnr">
+ <description>Galactic Gunner</description>
+ <year>1983</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="9014">
+ <rom name="GalacticGunner.tzx" size="9014" crc="1ee1c007" sha1="93f8f8b5fde8de8305d0946f25296da88e26d720" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="galpatrl">
+ <description>Galactic Patrol</description>
+ <year>1983</year>
+ <publisher>Computer Rentals</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="6295">
+ <rom name="GalacticPatrol.tzx" size="6295" crc="25cb9c4e" sha1="ed32fc48477d367e241b4a7f311f7d0c7caa615a" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="galpatrlo" cloneof="galpatrl">
+ <description>Galactic Patrol (Omega)</description>
+ <year>1984</year>
+ <publisher>Omega</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="6295">
+ <rom name="GalacticPatrol.tzx" size="6295" crc="25cb9c4e" sha1="ed32fc48477d367e241b4a7f311f7d0c7caa615a" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="galtrper">
+ <description>Galactic Trooper</description>
+ <year>1983</year>
+ <publisher>Romik Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="4517">
+ <rom name="GalacticTrooper.tzx" size="4517" crc="95146c5f" sha1="ee48ee10e53adbbbfe6d62c8b4fbadea8bc1eb16" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="galaxian">
+ <description>Galaxians</description>
+ <year>198?</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="3788">
+ <rom name="Galaxians.tzx" size="3788" crc="1cb67cb3" sha1="8bec4c27d81da870a63ee5da3205855c27acb802" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="galgloop">
+ <description>Galaxians &amp; Gloops</description>
+ <year>1983</year>
+ <publisher>Quicksilva</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Galaxians"/>
+ <dataarea name="cass" size="4333">
+ <rom name="GalaxiansAndGloops.1.Galaxians.tzx" size="4333" crc="c94dc06f" sha1="400332def43480ec5eaf519c095fcd52a87dfd0a" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Gloops"/>
+ <dataarea name="cass" size="12173">
+ <rom name="GalaxiansAndGloops.2.Gloops.tzx" size="12173" crc="813ca346" sha1="ab7351a764b7dbf0c2ac76d1ca0be75e17710949" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="galsword">
+ <description>Galaxians/Sword of Peace</description>
+ <year>198?</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Galaxians"/>
+ <dataarea name="cass" size="3788">
+ <rom name="Galaxians.tzx" size="3788" crc="1cb67cb3" sha1="8bec4c27d81da870a63ee5da3205855c27acb802" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Sword of Peace"/>
+ <dataarea name="cass" size="8807">
+ <rom name="GalaxiansSwordOfPeace.A.2.SwordOfPeace.tzx" size="8807" crc="e854198e" sha1="37c8d31a5360a91c492c158c33f1a7e4fb9266e9" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="galinvad">
+ <description>Galaxy Invaders</description>
+ <year>1981</year>
+ <publisher>Bridge Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="3246">
+ <rom name="GalaxyInvaders.A.1.GalaxyInvaders.tzx" size="3246" crc="bec54462" sha1="e28c2cbd1a619211a22be7be9c9cffd7284532c7" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <dataarea name="cass" size="3199">
+ <rom name="GalaxyInvaders.A.2.GalaxyInvaders(Alt).tzx" size="3199" crc="84a2e390" sha1="41730857820a687f492a5533566a932794bf676f" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <dataarea name="cass" size="3236">
+ <rom name="GalaxyInvaders.Alt2.tzx" size="3236" crc="0e8d60e8" sha1="38975cb4577bc28ec19fb80a42308bbe00c9fdef" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="galinvdi">
+ <description>Galaxy Invaders (IPS)</description>
+ <year>1982</year>
+ <publisher>International Publishing &amp; Software Inc.</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="4224">
+ <rom name="GalaxyInvaders(IPS).tzx" size="4224" crc="6df4e24b" sha1="23fc85b7e2ecfacd664dc991acf7e56393a345a1" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="galjailb">
+ <description>Galaxy Jailbreak</description>
+ <year>1983</year>
+ <publisher>Romik Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5661">
+ <rom name="GalaxyJailbreak.tzx" size="5661" crc="8f630ce4" sha1="351dce4ff4d8d3dcc68508b39bb910b21cecfb84" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="galwarr">
+ <description>Galaxy Warrior/Star Trek</description>
+ <year>198?</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="11620">
+ <rom name="GalaxyWarriorAndStarTrek.tzx" size="11620" crc="1bcb3a5f" sha1="abfb5609bfa713c2f4841bc45ba11eb7363b6bf7" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gambler">
+ <description>The Gambler</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="19202">
+ <rom name="GamblerThe.tzx" size="19202" crc="e05a3062" sha1="61da0728b3850a4235d13b1a71e7bb0e339fac63" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gamepac">
+ <description>Game Pac</description>
+ <year>1982</year>
+ <publisher>Tyrant</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="9391">
+ <rom name="GamePac.A.tzx" size="9391" crc="a7a7d08e" sha1="f74af7bca8dd56152eec5691ce90fbdf6a213f49" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="4089">
+ <rom name="GamePac.B.tzx" size="4089" crc="5fd28ecc" sha1="091d4d8db789d1c71404e9a13c75f98d90333e5a" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="games1">
+ <description>Games 1</description>
+ <year>1981</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="2716">
+ <rom name="Games1.A.tzx" size="2716" crc="0fe6dd26" sha1="65838fbf9f3251f66c6a3c2e23a0226f3c62f488" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="2740">
+ <rom name="Games1.B.tzx" size="2740" crc="80adb729" sha1="d20268e45e7bebbe30ad884d512c257e75409468" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="games4">
+ <description>Games 4</description>
+ <year>1981</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="10702">
+ <rom name="Games4.A.tzx" size="10702" crc="e7ab0ffa" sha1="ddcb11ac954896119afbc89357112d439918c633" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="12617">
+ <rom name="Games4.B.tzx" size="12617" crc="d4b54d35" sha1="605f54450b56472a763e259da6cd5fb3beec73d3" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gamesii">
+ <description>Games II</description>
+ <year>1982</year>
+ <publisher>JRS Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="City Bomb"/>
+ <dataarea name="cass" size="2811">
+ <rom name="GamesII.1.CityBomb.tzx" size="2811" crc="f1bd287a" sha1="ae2bd9d9a3ad04c8ebfae3d6afdb82e261f1fa76" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="3D Battle"/>
+ <dataarea name="cass" size="4619">
+ <rom name="GamesII.2.3DBattle.tzx" size="4619" crc="379fc3eb" sha1="56941d86f4fa0fbfc21fcfde61a959e8ee8f4c82" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Grid Ball"/>
+ <dataarea name="cass" size="2761">
+ <rom name="GamesII.3.GridBall.tzx" size="2761" crc="74b99090" sha1="618eff8b569e4311efd8833ce83137ffd70001e8" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gamepk">
+ <description>Games Pack</description>
+ <year>1982</year>
+ <publisher>JRS Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="20187">
+ <rom name="GamesPack.tzx" size="20187" crc="4c92529e" sha1="eb8aec55c92fc530591e033c862ce3b95c40a149" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gamepk1">
+ <description>Games Pack 1</description>
+ <year>198?</year>
+ <publisher>Database Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="833">
+ <rom name="GamesPack1.A.1.T.tzx" size="833" crc="96169795" sha1="a0a103600601fe22190dea42b7cfe74c99cdd502" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <dataarea name="cass" size="768">
+ <rom name="GamesPack1.A.2.F.tzx" size="768" crc="6312a81e" sha1="b9aac7ebfe26e46ffd9796357a3ce3f4326e9237" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <dataarea name="cass" size="875">
+ <rom name="GamesPack1.A.3.H.tzx" size="875" crc="01465efd" sha1="d1b418fb56f63c8373532df2c5c91cd5d439c1d0" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <dataarea name="cass" size="805">
+ <rom name="GamesPack1.A.4.D.tzx" size="805" crc="69074319" sha1="168156e6f96e0650ccd3190e6e3fe76f7ed1f119" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass5" interface="zx81_cass">
+ <dataarea name="cass" size="671">
+ <rom name="GamesPack1.A.5.K.tzx" size="671" crc="4f084151" sha1="86cabccf02fe401b445672cfed1042a0e461f9af" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass6" interface="zx81_cass">
+ <dataarea name="cass" size="640">
+ <rom name="GamesPack1.A.6.A.tzx" size="640" crc="a7b2c692" sha1="32d535c9a8965c46cadc753ef04169f0a240d93e" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gamepk1j">
+ <description>Games Pack 1 (JPS)</description>
+ <year>1982</year>
+ <publisher>John Prince Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Astro Invaders"/>
+ <dataarea name="cass" size="3096">
+ <rom name="GamesPack1(JPS).A.1.AstroInvaders.tzx" size="3096" crc="4963be08" sha1="140c2fffe0907b79cfae7b5fa19f2de3a69e6c67" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Arcade Grand-Prix"/>
+ <dataarea name="cass" size="2833">
+ <rom name="GamesPack1(JPS).A.2.ArcadeGrandPrix.tzx" size="2833" crc="148748f7" sha1="916f945816feb1f9216309082dd6e640323ced1f" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Penalty"/>
+ <dataarea name="cass" size="3258">
+ <rom name="GamesPack1(JPS).A.3.Penalty.tzx" size="3258" crc="25351424" sha1="e8e05521e8138fce3e8ec8503f4e8fadc832de5f" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="Golf"/>
+ <dataarea name="cass" size="3583">
+ <rom name="GamesPack1(JPS).A.4.Golf.tzx" size="3583" crc="c7e119fb" sha1="7f2c44c0baf1571b334b7cdcc5f866554b289fba" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass5" interface="zx81_cass">
+ <feature name="part_id" value="Swat"/>
+ <dataarea name="cass" size="2517">
+ <rom name="GamesPack1(JPS).A.5.Swat.tzx" size="2517" crc="28e0bb97" sha1="1388df032039f44df3a28ba7ab462d93c56068f2" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gamepk2">
+ <description>Games Pack 2</description>
+ <year>198?</year>
+ <publisher>Database Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="962">
+ <rom name="GamesPack2.A.1.L.tzx" size="962" crc="ddbf047a" sha1="926ab9964a4d0ccd07460ce4912edaf3a00e5552" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <dataarea name="cass" size="688">
+ <rom name="GamesPack2.A.2.C.tzx" size="688" crc="9dee32e7" sha1="e65d1cbe63399753b517b4f07054f5f6a8ad05b2" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <dataarea name="cass" size="772">
+ <rom name="GamesPack2.A.3.N.tzx" size="772" crc="c0219a32" sha1="d3bd9e178075236cfc443315a6a01413184e708f" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <dataarea name="cass" size="805">
+ <rom name="GamesPack2.A.4.M.tzx" size="805" crc="f7e64395" sha1="61fc23c3a853c76dd0f810469e53c12fd56a8b15" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass5" interface="zx81_cass">
+ <dataarea name="cass" size="930">
+ <rom name="GamesPack2.A.5.R.tzx" size="930" crc="747121cb" sha1="f725bbadb80d5fe02dc0e7e76eed9fcdcc209fe8" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass6" interface="zx81_cass">
+ <dataarea name="cass" size="693">
+ <rom name="GamesPack2.A.6.E.tzx" size="693" crc="4b7c05b8" sha1="b0d2d1aae2d0301beab9cce32cb97b67009cc3b8" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass7" interface="zx81_cass">
+ <dataarea name="cass" size="582">
+ <rom name="GamesPack2.A.7.B.tzx" size="582" crc="6715fe66" sha1="fc751bd78ff85863a5a6074c37de287392deed9d" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gamesamp">
+ <description>Games Sampler</description>
+ <year>1982</year>
+ <publisher>2-Bit Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="2185">
+ <rom name="GamesSampler.A.tzx" size="2185" crc="1723075f" sha1="1abb166e82cec02e04e328aab36eca3f083bf39a" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="2054">
+ <rom name="GamesSampler.B.tzx" size="2054" crc="6d543659" sha1="fc24dd1c2c2efad9e5f0a569f266cbfeb14c12cc" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gametap1">
+ <description>Gamestape 1</description>
+ <year>1983</year>
+ <publisher>Fawkes Computing</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="17533">
+ <rom name="Gamestape1.A.tzx" size="17533" crc="608ac493" sha1="004e482cc9c7f942157e40542c430c4d9907a7fd" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="20967">
+ <rom name="Gamestape1.B.tzx" size="20967" crc="05c7bed5" sha1="529167a0ce3bfb583556cfbede7a25704f16e6bb" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gametap2">
+ <description>Games Tape 2</description>
+ <year>1981</year>
+ <publisher>J.K.Greye Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Starfighter"/>
+ <dataarea name="cass" size="5982">
+ <rom name="GamesTape2.1.StarFighter.tzx" size="5982" crc="a2614118" sha1="401df59f891e6bc0c104a1e382077fc090f75c50" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Pyramid"/>
+ <dataarea name="cass" size="4821">
+ <rom name="GamesTape2.2.Pyramid.tzx" size="4821" crc="4198fd12" sha1="c9438f3ef08c39769908230f99995edc28fb6587" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Artist"/>
+ <dataarea name="cass" size="4284">
+ <rom name="GamesTape2.3.Artist.tzx" size="4284" crc="d634b348" sha1="7e99744821161955018b374dc2e0217b31177733" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gametap2t" cloneof="gametap2">
+ <description>Games Tape 2 (Typed)</description>
+ <year>1981</year>
+ <publisher>J.K.Greye Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="10696">
+ <rom name="GamesTape2(Typed).A.tzx" size="10696" crc="62121129" sha1="7bf2a8980fad2b8acf86308bd7f41b17aaf07858" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="4284">
+ <rom name="GamesTape2(Typed).B.Artist.tzx" size="4284" crc="ab7c5b15" sha1="e732416e758e02540659b77f53afb683cae4cd1f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gametap3">
+ <description>Gamestape #3</description>
+ <year>1984</year>
+ <publisher>ICT</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="15916">
+ <rom name="Gamestape3.A.tzx" size="15916" crc="eb965129" sha1="5d391d13e0ab6d66e10e21f9c85d5bc9bb6a5bb1" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="15939">
+ <rom name="Gamestape3.B.tzx" size="15939" crc="6ed8651d" sha1="9d2f97eedd0b5cedc4f04508727e327856e14b29" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gauntlet">
+ <description>The Gauntlet</description>
+ <year>1982</year>
+ <publisher>Colourmatic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14643">
+ <rom name="GauntletThe.tzx" size="14643" crc="7de2e0a3" sha1="49e714e58e9725925b28f8e17d90c708961064b5" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gauntletp" cloneof="gauntlet">
+ <description>The Gauntlet (PSS)</description>
+ <year>1984</year>
+ <publisher>PSS</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14793">
+ <rom name="GauntletThe(PSS).tzx" size="14793" crc="076726dd" sha1="3756c65ac420104c97a01317cdf156c2f412a2df" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="genstats">
+ <description>General Statistics</description>
+ <year>1982</year>
+ <publisher>W.H.Smith</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14466">
+ <rom name="GeneralStatistics.tzx" size="14466" crc="8889d5e3" sha1="a1f94c7ca3a27e24ebfaba575700cfccf8640356" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="geoguk">
+ <description>Geographics UK</description>
+ <year>198?</year>
+ <publisher>Novus Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16281">
+ <rom name="GeographicsUK.tzx" size="16281" crc="4af3cfc9" sha1="0d88e5bc5e71cc898a375156e40396b5b536d7a0" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="geog1">
+ <description>Geography 1</description>
+ <year>1982</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Towns"/>
+ <dataarea name="cass" size="8019">
+ <rom name="Geography1.A.Towns.tzx" size="8019" crc="658c127f" sha1="5163c617b1889f9b2144357bb9c01f7f70c90357" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Europe"/>
+ <dataarea name="cass" size="8824">
+ <rom name="Geography1.B.Europe.tzx" size="8824" crc="c1d94291" sha1="e16307331bde14d03b8d8e51763954dbe3f18574" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="geog1w" cloneof="geog1">
+ <description>Geography 1 (WHSmith)</description>
+ <year>1982</year>
+ <publisher>W.H.Smith</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Towns"/>
+ <dataarea name="cass" size="8019">
+ <rom name="Geography1(WHSmith).A.Towns.tzx" size="8019" crc="05219793" sha1="99bc3a6c0574a619350f130834cf58add59cd0d1" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Europe"/>
+ <dataarea name="cass" size="8824">
+ <rom name="Geography1(WHSmith).B.Europe.tzx" size="8824" crc="e582d909" sha1="3c87e21ae91d3c91fc6d70dd698be68b4c0fc683" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="geometr1">
+ <description>Geometry 1</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5483">
+ <rom name="Geometry1.tzx" size="5483" crc="80dad6c4" sha1="be9373f6519a369e7d2dba40a14319f4751b1b78" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ghosth">
+ <description>Ghost Hunt</description>
+ <year>1982</year>
+ <publisher>PSS</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5538">
+ <rom name="GhostHunt.tzx" size="5538" crc="8e8d76f5" sha1="33ac921be892a02c115f7dfa73c54cafe178671b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gobblman">
+ <description>Gobbleman</description>
+ <year>1982</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="4250">
+ <rom name="Gobbleman.Alt.ZXPackman.tzx" size="4250" crc="5ce53aaf" sha1="76a4e3bbad70d42eb51b4a5aa322026340f2edda" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <dataarea name="cass" size="4250">
+ <rom name="Gobbleman.tzx" size="4250" crc="837324dc" sha1="350f63f2316174e62983b438b55d7f56361d70dd" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gobblers">
+ <description>Gobblers</description>
+ <year>198?</year>
+ <publisher>Software Farm</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7394">
+ <rom name="Gobblers.tzx" size="7394" crc="dafe76e1" sha1="681bd965a868d25b3ded5c9111c6f6a622a7df1e" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gold">
+ <description>Gold</description>
+ <year>1981</year>
+ <publisher>Hilderbay</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="23791">
+ <rom name="Gold.tzx" size="23791" crc="a280fcba" sha1="33c0acac2f430cc9884739426e287098d646bd92" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="golf">
+ <description>Golf</description>
+ <year>1982</year>
+ <publisher>R &amp; R Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="9468">
+ <rom name="Golf.tzx" size="9468" crc="1b658fab" sha1="3177bea82297a86a2c5c541cde8426fff95cc052" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="graphkit">
+ <description>Graphics Kit</description>
+ <year>1981</year>
+ <publisher>Softsync</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="6203">
+ <rom name="GraphicsKit.tzx" size="6203" crc="0e978f07" sha1="2e26b56a9895655424d29d23d2836c28b0a26226" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="graphpc1">
+ <description>Graphics Pac 1</description>
+ <year>1982</year>
+ <publisher>Apropos Technology</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Doodler"/>
+ <dataarea name="cass" size="1148">
+ <rom name="GraphicsPac1.1.Doodler.tzx" size="1148" crc="f04448f3" sha1="8e03d74d199e736153431540ef4b7a19c6b27732" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Super Doodler"/>
+ <dataarea name="cass" size="3145">
+ <rom name="GraphicsPac1.2.SuperDoodler.tzx" size="3145" crc="46fcf7db" sha1="3080617292d893d2526556213c2592b935cd3a95" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Random 1"/>
+ <dataarea name="cass" size="1067">
+ <rom name="GraphicsPac1.3.Random1.tzx" size="1067" crc="4aa44079" sha1="ac2e05392a060b60215187a5e1c550616bd7cb77" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="Random 2"/>
+ <dataarea name="cass" size="4346">
+ <rom name="GraphicsPac1.4.Random2.tzx" size="4346" crc="977a1837" sha1="e8333e101eee47b38906021dd34697a992d306cc" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass5" interface="zx81_cass">
+ <feature name="part_id" value="Screen Formatter"/>
+ <dataarea name="cass" size="2750">
+ <rom name="GraphicsPac1.5.ScreenFormatter.tzx" size="2750" crc="db3ceafc" sha1="0e011b47de8e668ca060271da8fa22d8d001df05" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="graphtkit" cloneof="graphkit">
+ <description>Graphics Toolkit</description>
+ <year>1982</year>
+ <publisher>JRS Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Graphics Toolkit"/>
+ <dataarea name="cass" size="2950">
+ <rom name="GraphicsToolkit.A.1.GrTool.tzx" size="2950" crc="4518373c" sha1="9d36d02e8f882f5aad8c155ff5ae0f2eae70476b" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Graphics Demo"/>
+ <dataarea name="cass" size="3330">
+ <rom name="GraphicsToolkit.A.2.GrDemo.tzx" size="3330" crc="08aa1cdc" sha1="6c1f1ea4034c863c979707796e8eb317baea9cf0" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="graphtkitc" cloneof="graphkit">
+ <description>Graphics Toolkit (Colour Inlay)</description>
+ <year>1982</year>
+ <publisher>JRS Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Graphics Toolkit"/>
+ <dataarea name="cass" size="2950">
+ <rom name="GraphicsToolkit(CI).A.GrTool.tzx" size="2950" crc="1a9b4150" sha1="3eefb73e6713aefea67b03e9c50275ca034c8dda" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Graphics Demo"/>
+ <dataarea name="cass" size="3366">
+ <rom name="GraphicsToolkit(CI).B.GrDemo.tzx" size="3366" crc="d3ff44c3" sha1="72734c6c78005c20bccfcf1002ea3c99106aa704" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gbltd">
+ <description>Great Britain Ltd</description>
+ <year>198?</year>
+ <publisher>Simon W. Hessel</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15767">
+ <rom name="GreatBritainLtd.tzx" size="15767" crc="4b717923" sha1="bbde7b36f9f2cb65cd0ef2f112c52ce612a19433" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="grimmft">
+ <description>Grimm's Fairy Trails</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="9563">
+ <rom name="GrimmsFairyTrails.tzx" size="9563" crc="55fe8f96" sha1="cb65770be85add8b3aa5e01cecacc3b2b2835ecb" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="guitarbg">
+ <description>Guitar for Beginners</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="11246">
+ <rom name="GuitarForBeginners.tzx" size="11246" crc="10734bfb" sha1="975deca435c26ed3e0604497454129186e139307" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gulp">
+ <description>ZX-Gulp</description>
+ <year>1982</year>
+ <publisher>Campbell Systems</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Gulp"/>
+ <dataarea name="cass" size="4678">
+ <rom name="Gulp.A.tzx" size="4678" crc="d8a6ec60" sha1="3d40b826b3f4cbae8cab72e1908d4f88b8a35ef7" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Note"/>
+ <dataarea name="cass" size="4771">
+ <rom name="Gulp.B.Note.tzx" size="4771" crc="d8e35de7" sha1="a01bb922f507390c9094dba88d5e2a6e5dbcabb2" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gulpm">
+ <description>Gulp (Mindware)</description>
+ <year>1982</year>
+ <publisher>Mindware</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="1125">
+ <rom name="Gulp(Mindware).1.Gulp.tzx" size="1125" crc="c651f1e5" sha1="c91c14f5ec001c991ed3c67673fe38c8b7b9d02d" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gulp2">
+ <description>Gulp 2</description>
+ <year>1982</year>
+ <publisher>Campbell Systems</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="6342">
+ <rom name="Gulp2.tzx" size="6342" crc="b041f1bf" sha1="aa0fadd80146c2dab98dab49c88f52ba4852c861" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="gulpman">
+ <description>Gulpman</description>
+ <year>1982</year>
+ <publisher>Micromega</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="6351">
+ <rom name="Gulpman.tzx" size="6351" crc="7baebe9a" sha1="d28c22863672b87a1f0f6b23f2262b0195b3e1fb" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hangman">
+ <description>Hangman</description>
+ <year>1982</year>
+ <publisher>Softsync</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Animals"/>
+ <dataarea name="cass" size="7731">
+ <rom name="Hangman.1.Animals.tzx" size="7731" crc="efa31353" sha1="382d9107ebddd895261433549979d2a6f7c5d13b" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Science"/>
+ <dataarea name="cass" size="7748">
+ <rom name="Hangman.2.Science.tzx" size="7748" crc="32c1e290" sha1="c1d92c4af6049466098684f6c4ecc1179f2c8371" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="States"/>
+ <dataarea name="cass" size="5634">
+ <rom name="Hangman.3.States.tzx" size="5634" crc="46bb7e53" sha1="5a92f4913d3f0044c91cd37c1fed6bf8eef4545e" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="Countries"/>
+ <dataarea name="cass" size="6787">
+ <rom name="Hangman.4.Countries.tzx" size="6787" crc="a049e3ee" sha1="3248b1f4b7bf13503d740eff3332fb80b79edc38" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass5" interface="zx81_cass">
+ <feature name="part_id" value="Fruits and Vegetables"/>
+ <dataarea name="cass" size="6292">
+ <rom name="Hangman.5.FruitsAndVegetables.tzx" size="6292" crc="e2068658" sha1="ef0f201fc815b2b62f46afd2c21bd8e47d36d7c1" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass6" interface="zx81_cass">
+ <feature name="part_id" value="Opponent"/>
+ <dataarea name="cass" size="5314">
+ <rom name="Hangman.6.Opponent.tzx" size="5314" crc="fd88a3f3" sha1="405529f44d2be3111723d3562a93213cc0cfe80f" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass7" interface="zx81_cass">
+ <feature name="part_id" value="Library Master"/>
+ <dataarea name="cass" size="4457">
+ <rom name="Hangman.7.LibraryMaster.tzx" size="4457" crc="619a426e" sha1="c42648de8276f3cb8a0e1c26c9cf3b0cabcd33ba" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hauteres" cloneof="highreso">
+ <description>Haute Resolution</description>
+ <year>1984</year>
+ <publisher>Pluto</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="6970">
+ <rom name="HauteResolution.tzx" size="6970" crc="f52d460f" sha1="91cd6738fcec38d4fc9d3e3ba08614634935918a" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="heatsys">
+ <description>Heating System Analyzer</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15718">
+ <rom name="HeatingSystemAnalyzer.tzx" size="15718" crc="ea836c43" sha1="9d5e5a4f1e26f6a5dba03028940310bb796da199" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="highres">
+ <description>High Res</description>
+ <year>1981</year>
+ <publisher>Macronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="10985">
+ <rom name="HighRes.tzx" size="10985" crc="fa40dbc1" sha1="9b81b10a719af4c6c61a03ed003f1198f68bda1b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="highreso">
+ <description>High Resolution</description>
+ <year>1983</year>
+ <publisher>Computer Rentals</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="High Resolution"/>
+ <dataarea name="cass" size="1851">
+ <rom name="HighResolution.A.1.HiRes.tzx" size="1851" crc="362f31ec" sha1="4d6268d49665d825944c2eda6b25b5545a920bbc" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Sine"/>
+ <dataarea name="cass" size="2672">
+ <rom name="HighResolution.A.2.Sine.tzx" size="2672" crc="6df248d9" sha1="2b8b13a3e931f71e695f367c13cfe90ce63330df" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Expo 3D"/>
+ <dataarea name="cass" size="2702">
+ <rom name="HighResolution.A.3.Expo3D.tzx" size="2702" crc="2331f245" sha1="3b03efb362dd4d4c2cc8b49bfae28a2ecc477728" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="highresp" cloneof="highreso">
+ <description>High-Res Package</description>
+ <year>1983</year>
+ <publisher>International Publishing &amp; Software Inc.</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="High Resolution"/>
+ <dataarea name="cass" size="1851">
+ <rom name="HighResPackage.1.HiRes.tzx" size="1851" crc="fd4443ae" sha1="59a8b0060e6efa8a3a1d96fb727aaeb94363d608" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Sine"/>
+ <dataarea name="cass" size="2672">
+ <rom name="HighResPackage.2.Sine.tzx" size="2672" crc="af08a5f3" sha1="0feb7a70647713b1445c1e8d5cf8a613385c266e" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Expo 3D"/>
+ <dataarea name="cass" size="5282">
+ <rom name="HighResPackage.3.Expo3D.tzx" size="5282" crc="b0720fa6" sha1="5f871bb6105577693f66bfcae6d984b4f85eac70" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="history1">
+ <description>History 1</description>
+ <year>1982</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Events"/>
+ <dataarea name="cass" size="10763">
+ <rom name="History1.A.Events.tzx" size="10763" crc="c4596894" sha1="ffc75c53f7afaac4fe7078eddd0c60003dce829e" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Monarchs"/>
+ <dataarea name="cass" size="8819">
+ <rom name="History1.B.Monarchs.tzx" size="8819" crc="88d2e888" sha1="f864089d4e5909c01b5920c920bec47faa384a88" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="history1w" cloneof="history1">
+ <description>History 1 (WHSmith)</description>
+ <year>1982</year>
+ <publisher>W.H.Smith</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Events"/>
+ <dataarea name="cass" size="10763">
+ <rom name="History1(ICL).A.Events.tzx" size="10763" crc="7caa1b16" sha1="5907aaa5c2ce1acded7161cbb2345b2c18554f30" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Monarchs"/>
+ <dataarea name="cass" size="8819">
+ <rom name="History1(ICL).B.Monarchs.tzx" size="8819" crc="cfc4de89" sha1="3f35181d21511c9e1b5e7fe05bb1b6aa7257a57c" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="homeassm">
+ <description>The Home Asset Manager</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15112">
+ <rom name="HomeAssetManagerThe.tzx" size="15112" crc="fd728104" sha1="e19508787e6ede4ec4323df540dd7516b49b295d" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="homeimpr">
+ <description>The Home Improvement Planner</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15871">
+ <rom name="HomeImprovementPlannerThe.tzx" size="15871" crc="4e4df58c" sha1="45e98db0f02643a37ed71b86a85042a331b9aac1" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="homemony">
+ <description>Home Money Manager</description>
+ <year>1982</year>
+ <publisher>International Publishing &amp; Software Inc.</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="5581">
+ <rom name="HomeMoneyManager.A.tzx" size="5581" crc="dded5024" sha1="b6aefce43f856d0cee1ce73b3c17ea20e9b47bd8" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="5581">
+ <rom name="HomeMoneyManager.B.tzx" size="5581" crc="22d7ad06" sha1="1bc060bd33764d5372f189a8a60df43dc0705751" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hopper">
+ <description>Hopper</description>
+ <year>1982</year>
+ <publisher>PSS</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="11061">
+ <rom name="Hopper.tzx" size="11061" crc="f5601550" sha1="4102dbfe6c3cddb82877bb9b089f764420f0a249" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hoppert" cloneof="hopper">
+ <description>Hopper (Truck)</description>
+ <year>1981</year>
+ <publisher>PSS</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="11061">
+ <rom name="Hopper(Truck).tzx" size="11061" crc="57034213" sha1="5747373be057f05059c47d8acb42f2c9312eeb83" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="housdeat">
+ <description>House of Death</description>
+ <year>198?</year>
+ <publisher>A.J.Rushton</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15289">
+ <rom name="HouseOfDeath.tzx" size="15289" crc="e78272e3" sha1="80ee47dd77a43c051c600a38def525950a110119" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="hrg70">
+ <description>HRG 7.0</description>
+ <year>1983</year>
+ <publisher>&lt;unknown&gt;</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="19444">
+ <rom name="HRG70.tzx" size="19444" crc="75adee54" sha1="9f062ea8b3bd11a868a773dd4fed573a51225a1e" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="incacurs">
+ <description>Adventure B: Inca Curse</description>
+ <year>1981</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="12205">
+ <rom name="IncaCurse.tzx" size="12205" crc="700a1e34" sha1="8948f63c75c80dffa4e317e4d8ed400bd6b11de9" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="incacursa" cloneof="incacurs">
+ <description>Inca Curse (Artic)</description>
+ <year>1981</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="12205">
+ <rom name="IncaCurse(Artic).tzx" size="12205" crc="76d699e6" sha1="c3840c1539239437150d7e300b0bae412ad6a987" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="intcobalt">
+ <description>Intercepteur Cobalt</description>
+ <year>1984</year>
+ <publisher>ERE Informatique</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="17755">
+ <rom name="IntercepteurCobalt.A.tzx" size="17755" crc="e90c1a54" sha1="328b9a75ee0a1c08721d7d8f58c84b8ad2538500" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="23922">
+ <rom name="IntercepteurCobalt.B.tzx" size="23922" crc="fb6edf18" sha1="e20e460dbcf4656414782e5380abb4711aad815d" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="intengl1">
+ <description>Intermediate English 1</description>
+ <year>1981</year>
+ <publisher>Rose Cassettes</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="27144">
+ <rom name="IntermediateEnglish1.A.tzx" size="27144" crc="b4d0b1f6" sha1="8211c4653db38a0d26766841509ed0df5050a5f6" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="25710">
+ <rom name="IntermediateEnglish1.B.tzx" size="25710" crc="28358e1c" sha1="894ddb9073a82d50ae0e2a7d9e84a0001d28b1d5" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="intengl2">
+ <description>Intermediate English 2</description>
+ <year>1981</year>
+ <publisher>Rose Cassettes</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="26539">
+ <rom name="IntermediateEnglish2.A.tzx" size="26539" crc="94b0b976" sha1="ff6c6da77aa2e74e171c91149ce70fcd5c96fef4" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="30989">
+ <rom name="IntermediateEnglish2.B.tzx" size="30989" crc="e701d068" sha1="e0f8c47c76953886fbe7c02ed1ef0ef73eb465a4" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="inbestpt">
+ <description>In The Best Possible Taste!</description>
+ <year>1983</year>
+ <publisher>Automata Cartography</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="12443">
+ <rom name="InTheBestPossibleTaste.A.tzx" size="12443" crc="d30461d3" sha1="f29722a9eafc560f33fc7ca656b8817f7d647451" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="12399">
+ <rom name="InTheBestPossibleTaste.B.tzx" size="12399" crc="1ccad031" sha1="f291b2a3c50ff8a8ebddc28da2834815b4c2bf7f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="intrchem">
+ <description>Introduction To Chemistry</description>
+ <year>1983</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="37232">
+ <rom name="IntroductionToChemistry.tzx" size="37232" crc="7b7d1b69" sha1="4a49f3c842e387dd1353dc859877b93c92aa8ace" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="invaders">
+ <description>Invaders</description>
+ <year>1982</year>
+ <publisher>Bug Byte</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="2605">
+ <rom name="Invaders.tzx" size="2605" crc="93d1d5d7" sha1="bb79a0ea9ff54e882d45a7ca94dc71762488b2cd" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="invadera">
+ <description>Invaders (AGS)</description>
+ <year>198?</year>
+ <publisher>A.G.Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="2349">
+ <rom name="Invaders(AGS).tzx" size="2349" crc="58299c24" sha1="37503b2c552016a3265ff387afca6ffa6380c5e8" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="invaderb" cloneof="invaders">
+ <description>Invaders (Re-release)</description>
+ <year>1982</year>
+ <publisher>Bug Byte</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="2605">
+ <rom name="Invaders(Alt).tzx" size="2605" crc="e2b37050" sha1="c5a9f1683d2730eaf40a879c0f5c676b5f718e03" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="invaderf">
+ <description>Invaders (Forward)</description>
+ <year>198?</year>
+ <publisher>Forward Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="3697">
+ <rom name="Invaders(Forward).tzx" size="3697" crc="3ea98bb5" sha1="a8ae592fe3b4b939b664be00454fb591b004f478" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="invaderm" cloneof="invaders">
+ <description>Invaders (Monochrome)</description>
+ <year>198?</year>
+ <publisher>Bug Byte</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="2605">
+ <rom name="Invaders(Mono).tzx" size="2605" crc="80e827f0" sha1="3aeb0fa4a5c458ace0affc01f528d4b15ee047b8" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="invadert" cloneof="invaders">
+ <description>Invaders (Typed Inlay)</description>
+ <year>1981</year>
+ <publisher>Bug Byte</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="2605">
+ <rom name="Invaders(Typed).tzx" size="2605" crc="4647c030" sha1="a3669f5ce7897e144314b0a4ea5e3e1b79cff5ef" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="invforce">
+ <description>Invasion Force</description>
+ <year>1982</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7890">
+ <rom name="InvasionForce.tzx" size="7890" crc="84b20542" sha1="3bf53649fdf8249fdb8a601bb7ae7dbbb38b08de" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="invforcei" cloneof="invforce">
+ <description>Invasion Force (IPS)</description>
+ <year>1983</year>
+ <publisher>International Publishing &amp; Software Inc.</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7890">
+ <rom name="InvasionForce(IPS).tzx" size="7890" crc="c7842b97" sha1="3b59f5a004f92d081181834aa59073ba74b47909" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="invent1">
+ <description>Inventions 1</description>
+ <year>1982</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Before 1850"/>
+ <dataarea name="cass" size="11515">
+ <rom name="Inventions1.A.Before1850.tzx" size="11515" crc="f05b3999" sha1="68dfba1fa52bc4d09a1d6daeb361d4f0c2abc62a" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="After 1850"/>
+ <dataarea name="cass" size="11521">
+ <rom name="Inventions1.B.After1850.tzx" size="11521" crc="ab467a2c" sha1="1f7b1fae62bb3477a6c6d336aabd1f93d4697568" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="invent1w" cloneof="invent1">
+ <description>Inventions 1 (WHSmith)</description>
+ <year>1982</year>
+ <publisher>W.H.Smith</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Before 1850"/>
+ <dataarea name="cass" size="11515">
+ <rom name="Inventions1(WHSmith).A.Before1850.tzx" size="11515" crc="6e525789" sha1="65d2dce3a7afa7499ea51dafa612aa8ac1ac3fb0" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="After 1850"/>
+ <dataarea name="cass" size="11521">
+ <rom name="Inventions1(WHSmith).B.After1850.tzx" size="11521" crc="8f7738a2" sha1="eed08a120bc5499a0eae06d77264ed199d9d05ea" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="invctrl">
+ <description>Inventory Control</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Stock 1"/>
+ <dataarea name="cass" size="14501">
+ <rom name="InventoryControl.1.Stock1.tzx" size="14501" crc="b30ee93f" sha1="4f969a61deb59366f50a07c1823c986d4cf80e59" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Stock 2"/>
+ <dataarea name="cass" size="15775">
+ <rom name="InventoryControl.2.Stock2.tzx" size="15775" crc="ef43ff82" sha1="3b30e0261ac181d6c7d5f6d510aec93eb3dbf520" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="invctrld">
+ <description>Inventory Control (Data-assette)</description>
+ <year>198?</year>
+ <publisher>Data-assette</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16175">
+ <rom name="InventoryControl(DA).tzx" size="16175" crc="21d56ec5" sha1="390707e52e816a1df284b65ce1fd52e14110a504" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="iraplan">
+ <description>The IRA Planner</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16247">
+ <rom name="IRAPlannerThe.tzx" size="16247" crc="ad9f1b1c" sha1="74f585b9673b45307f59019f5d03e324ffedfb8c" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jdarcade">
+ <description>J.D.Arcades</description>
+ <year>1982</year>
+ <publisher>Computer Rentals</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="8782">
+ <rom name="JDArcades.tzx" size="8782" crc="6fb5f451" sha1="08c17dc95d0a7e8a68fb9b534398d45656e25ea5" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="junglmath">
+ <description>Jungle Maths</description>
+ <year>1982</year>
+ <publisher>Scisoft</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Addition/Subtraction"/>
+ <dataarea name="cass" size="15933">
+ <rom name="JungleMaths.A.AddSub.tzx" size="15933" crc="34128787" sha1="45c4d31a6fa1eb5c75ce59ff86a344fb3005899c" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Multiplication/Division"/>
+ <dataarea name="cass" size="15392">
+ <rom name="JungleMaths.B.MulDiv.tzx" size="15392" crc="1a46d81b" sha1="48cfc881c50b8b8b7c68bdd246e05bbf08789fad" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jnredu2">
+ <description>Junior Education 2</description>
+ <year>1981</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Crash"/>
+ <dataarea name="cass" size="1870">
+ <rom name="JuniorEducation2.A.1.Crash.tzx" size="1870" crc="ac256e76" sha1="d84c785273e902488c63b4cfa76416010a9c5ade" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Multiply"/>
+ <dataarea name="cass" size="4309">
+ <rom name="JuniorEducation2.A.2.Multiply.tzx" size="4309" crc="165cf746" sha1="80d2e610b3e7a66e9e0dbca1cb29affbea9037ba" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Train"/>
+ <dataarea name="cass" size="2566">
+ <rom name="JuniorEducation2.A.3.Train.tzx" size="2566" crc="6da77157" sha1="180afdf69acb603653e2d1de5d49a302ee9b8975" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="Fractions"/>
+ <dataarea name="cass" size="10946">
+ <rom name="JuniorEducation2.A.4.Fractions.tzx" size="10946" crc="f198727f" sha1="3c5527642320c798dc0f29b02cd90675c065d9ba" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass5" interface="zx81_cass">
+ <feature name="part_id" value="Add Sub"/>
+ <dataarea name="cass" size="5125">
+ <rom name="JuniorEducation2.B.1.AddSub.tzx" size="5125" crc="8730aaa7" sha1="7d3c10606bdd085d430cf6f598a06eb5c7ba145c" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass6" interface="zx81_cass">
+ <feature name="part_id" value="Division"/>
+ <dataarea name="cass" size="3233">
+ <rom name="JuniorEducation2.B.2.Division.tzx" size="3233" crc="1741915a" sha1="fe043c0a816dab39a3a1f45d0d21b5af8cd64ab4" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass7" interface="zx81_cass">
+ <feature name="part_id" value="Spelling"/>
+ <dataarea name="cass" size="11559">
+ <rom name="JuniorEducation2.B.3.Spelling.tzx" size="11559" crc="e1a7e21a" sha1="976ef2b818f17a3265733614d43e4ed7f9563e4d" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jnredu5">
+ <description>Junior Education 5</description>
+ <year>1981</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Maths"/>
+ <dataarea name="cass" size="891">
+ <rom name="JuniorEducation5.A.1.Maths.tzx" size="891" crc="5cdefe14" sha1="6af4715813879ce3859bf35f57b2d71e9f3c3a9b" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Balance"/>
+ <dataarea name="cass" size="977">
+ <rom name="JuniorEducation5.A.2.Balance.tzx" size="977" crc="27c37471" sha1="1f61ab1cbac92e395062a1c497bb0a935ecae2b9" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Volumes"/>
+ <dataarea name="cass" size="1007">
+ <rom name="JuniorEducation5.A.3.Volumes.tzx" size="1007" crc="274d55cc" sha1="7f1c2a2be566b8f6e2f96c2db053cd647ae9311e" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="Averages"/>
+ <dataarea name="cass" size="923">
+ <rom name="JuniorEducation5.B.1.Averages.tzx" size="923" crc="93a849d5" sha1="8c49584623607a5eda2b6ca47e329e4e3599386b" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass5" interface="zx81_cass">
+ <feature name="part_id" value="Bases"/>
+ <dataarea name="cass" size="888">
+ <rom name="JuniorEducation5.B.2.Bases.tzx" size="888" crc="31e9c08f" sha1="53f64d4780f042d52c7508058f23938bf783e807" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass6" interface="zx81_cass">
+ <feature name="part_id" value="Temp"/>
+ <dataarea name="cass" size="946">
+ <rom name="JuniorEducation5.B.3.Temp.tzx" size="946" crc="fec5b18e" sha1="301969e9bc6793dd7b8c6401716d443ef9685c03" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jnrmath1">
+ <description>Junior Maths 1</description>
+ <year>1981</year>
+ <publisher>Rose Cassettes</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="19624">
+ <rom name="JuniorMaths1.A.tzx" size="19624" crc="4dfeb098" sha1="1efe47def1417823e67cc5c35b68a94f911d0207" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="21445">
+ <rom name="JuniorMaths1.B.tzx" size="21445" crc="741ba259" sha1="e429563ed45fc162b82111c5eeff50ea2a176335" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="jnrmath2">
+ <description>Junior Maths 2</description>
+ <year>1981</year>
+ <publisher>Rose Cassettes</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="20430">
+ <rom name="JuniorMaths2.A.tzx" size="20430" crc="95f0eace" sha1="3f418fa0397f8cee4746e72c230dfb0f24d63356" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="24896">
+ <rom name="JuniorMaths2.B.tzx" size="24896" crc="c226ffc8" sha1="e68e48d74dd6fd5bbe44955f673b96869801e1c9" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kasinok">
+ <description>Kasino Kraps</description>
+ <year>1983</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="12777">
+ <rom name="KasinoKraps.tzx" size="12777" crc="7e27ad21" sha1="39950e34a01e852c6df5fb06e59dfae019d54e90" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kbdcalc">
+ <description>Keyboard Calculator</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="6160">
+ <rom name="KeyboardCalculator.tzx" size="6160" crc="56b36255" sha1="064abd828a4d801e1e2029234762f6aadcba008e" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="keysgond">
+ <description>Keys To Gondrun</description>
+ <year>1982</year>
+ <publisher>International Publishing &amp; Software Inc.</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15928">
+ <rom name="KeysToGondrun.tzx" size="15928" crc="97e9ac6d" sha1="38c82913732383ae4fae62dd1be8f5a04927cdfd" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kgdmnam">
+ <description>Kingdom of Nam</description>
+ <year>1981</year>
+ <publisher>Microgame Simulations</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="8202">
+ <rom name="KingdomOfNam.tzx" size="8202" crc="ca57c0c9" sha1="d5c07352365144b1f0c9eb4c89a3f854747b7a90" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="knightqu">
+ <description>The Knights Quest</description>
+ <year>1983</year>
+ <publisher>Phipps Associates</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="52909">
+ <rom name="KnightsQuest.tzx" size="52909" crc="2bcedb3f" sha1="ce182bf32766964ca43066727475eadbaa6a8d1a" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kongsrev">
+ <description>Kongs Revenge</description>
+ <year>1984</year>
+ <publisher>Stephen Hartley Computing</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14843">
+ <rom name="KongsRevenge.tzx" size="14843" crc="cc315aca" sha1="c87d1a7f00cca913b0d9bdbe8a8752e82c72fd6c" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="krakit">
+ <description>Krakit</description>
+ <year>1982</year>
+ <publisher>International Publishing &amp; Software Inc.</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Rules"/>
+ <dataarea name="cass" size="15570">
+ <rom name="Krakit.1.Rules.tzx" size="15570" crc="61d2c4bb" sha1="137989425817073a6dcde5a5d3c26653de5b98de" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Clues"/>
+ <dataarea name="cass" size="14846">
+ <rom name="Krakit.2.Clues.tzx" size="14846" crc="c9f52dff" sha1="31657836dd996e6f83b3bfb6ca73686680052fb9" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="krakitd">
+ <description>Krakit Demo</description>
+ <year>1983</year>
+ <publisher>International Publishing &amp; Software Inc.</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Krakit"/>
+ <dataarea name="cass" size="8097">
+ <rom name="Krakit(IPS).A.tzx" size="8097" crc="e1d9d1f0" sha1="1e8c16aa92242f6f9d7316a2a44570226dafa1d9" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Demo"/>
+ <dataarea name="cass" size="7636">
+ <rom name="Krakit(IPS).B.Demo.tzx" size="7636" crc="0424b2a3" sha1="e996add507650d3a6e3e617b0e9a0f1f24e8eeb5" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="krazykng">
+ <description>Krazy Kong</description>
+ <year>1982</year>
+ <publisher>PSS</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="8465">
+ <rom name="KrazyKong.tzx" size="8465" crc="a5dd2afe" sha1="ac74298badc343b3c81a96fca8bcab1b43faad87" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="krazykngi" cloneof="krazykng">
+ <description>Krazy Kong (Intercomputer)</description>
+ <year>1983</year>
+ <publisher>Intercomputer Inc</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7799">
+ <rom name="KrazyKong(Inter).tzx" size="7799" crc="d5a3ddd8" sha1="1e4edf41f7a576a8b68ecfaab4f936ba80460360" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="kryptono">
+ <description>Krypton Ordeal</description>
+ <year>198?</year>
+ <publisher>Novus Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Krypton Ordeal"/>
+ <dataarea name="cass" size="16164">
+ <rom name="KryptonOrdeal.A.tzx" size="16164" crc="b4c86bf3" sha1="5ab0148f308b72eaecbe8470bb2deddf7f0ef644" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Hole-in-One"/>
+ <dataarea name="cass" size="12606">
+ <rom name="KryptonOrdeal.B.HoleInOne.tzx" size="12606" crc="216044dd" sha1="11e1014c0e257db937ca576da57e48452b7d553b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="labyrinth">
+ <description>Labyrinth</description>
+ <year>1981</year>
+ <publisher>Axis</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="10956">
+ <rom name="Labyrinth.tzx" size="10956" crc="2bd7dd50" sha1="2ce0f07c10363839828a54fb00fb278f1ed5aeac" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="langusge">
+ <description>Language Usage</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="43685">
+ <rom name="LanguageUsage.tzx" size="43685" crc="f83ba0cd" sha1="8892aac163feb54128ee568636c905c0cb18e7e5" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="laprecrd">
+ <description>Lap Record</description>
+ <year>1981</year>
+ <publisher>Macronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5115">
+ <rom name="LapRecord.tzx" size="5115" crc="4ab33041" sha1="28d2a56bc5974bed6e848a495367140893f35eb1" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="learnlab">
+ <description>Learning Lab</description>
+ <year>1981</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Starters"/>
+ <dataarea name="cass" size="831">
+ <rom name="LearningLab.1A.1.Starters.tzx" size="831" crc="90b11e40" sha1="b0f9f793babbb2685f264d06e09d895238c109c1" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Area 1"/>
+ <dataarea name="cass" size="438">
+ <rom name="LearningLab.1A.2.Area1.tzx" size="438" crc="8ea1b4cf" sha1="96a08eb11140d592de5d4cc5608044c3945c7b83" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Area 2"/>
+ <dataarea name="cass" size="544">
+ <rom name="LearningLab.1A.3.Area2.tzx" size="544" crc="2878664d" sha1="81bab44255c3e89c3a0c5704a5757f96b8075c97" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="Area 3"/>
+ <dataarea name="cass" size="572">
+ <rom name="LearningLab.1A.4.Area3.tzx" size="572" crc="13ef1295" sha1="3932e675df3b0adb9a1171469df3ea7f2011b4d6" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass5" interface="zx81_cass">
+ <feature name="part_id" value="Starters 16"/>
+ <dataarea name="cass" size="3148">
+ <rom name="LearningLab.1B.1.Starters16.tzx" size="3148" crc="a0a1873f" sha1="159f88bef248e79f6389640c2e5b00b85df85188" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass6" interface="zx81_cass">
+ <feature name="part_id" value="Big One"/>
+ <dataarea name="cass" size="701">
+ <rom name="LearningLab.2A.1.BigOne.tzx" size="701" crc="8b0b9c07" sha1="a2b1c98fe2e93e256c7a30da9267fd6876812801" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass7" interface="zx81_cass">
+ <feature name="part_id" value="Looper"/>
+ <dataarea name="cass" size="445">
+ <rom name="LearningLab.2A.2.Looper.tzx" size="445" crc="69184305" sha1="308ada40916e2f9538955451750f89021cec5821" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass8" interface="zx81_cass">
+ <feature name="part_id" value="Go Test"/>
+ <dataarea name="cass" size="743">
+ <rom name="LearningLab.2B.1.GoTest.tzx" size="743" crc="80fe0c69" sha1="ecc0dacca5e5f360faefccd633f63edf721a4d3a" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass9" interface="zx81_cass">
+ <feature name="part_id" value="For Test"/>
+ <dataarea name="cass" size="505">
+ <rom name="LearningLab.2B.2.ForTest.tzx" size="505" crc="027c0026" sha1="f10ec848cba211d5ad9ce4eea12819a379d98f76" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass10" interface="zx81_cass">
+ <feature name="part_id" value="Trace"/>
+ <dataarea name="cass" size="794">
+ <rom name="LearningLab.3A.1.Trace.tzx" size="794" crc="4ba68e36" sha1="400113e7cb91f71309df6fa4753735e50f139c53" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass11" interface="zx81_cass">
+ <feature name="part_id" value="Scroller"/>
+ <dataarea name="cass" size="556">
+ <rom name="LearningLab.3A.2.Scroller.tzx" size="556" crc="de6784e0" sha1="0178e9ca53e022b7edafc17e1ba42fd6845c8137" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass12" interface="zx81_cass">
+ <feature name="part_id" value="Primes"/>
+ <dataarea name="cass" size="777">
+ <rom name="LearningLab.3B.1.Primes.tzx" size="777" crc="f27c5f9c" sha1="b66a91bf9741333e5ef4a04f29d174ccd055dd0a" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass13" interface="zx81_cass">
+ <feature name="part_id" value="Example"/>
+ <dataarea name="cass" size="656">
+ <rom name="LearningLab.3B.2.Example.tzx" size="656" crc="3da327a0" sha1="45bf4786e20aca2d6745a392e9e640f650f27557" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass14" interface="zx81_cass">
+ <feature name="part_id" value="Speedy"/>
+ <dataarea name="cass" size="547">
+ <rom name="LearningLab.4A.1.Speedy.tzx" size="547" crc="947cd522" sha1="7715e08b46c06ea7255173a457b76f8ad0e3cdcc" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass15" interface="zx81_cass">
+ <feature name="part_id" value="Picture"/>
+ <dataarea name="cass" size="830">
+ <rom name="LearningLab.4A.2.Picture.tzx" size="830" crc="df014f67" sha1="163ba7ae6e871268edbd293028c230c76da8a1df" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass16" interface="zx81_cass">
+ <feature name="part_id" value="Graph"/>
+ <dataarea name="cass" size="834">
+ <rom name="LearningLab.4B.1.Graph.tzx" size="834" crc="00f46500" sha1="7b654944f1dc18c51025ae39f9c254eeb0740c8e" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass17" interface="zx81_cass">
+ <feature name="part_id" value="Codes"/>
+ <dataarea name="cass" size="523">
+ <rom name="LearningLab.4B.2.Codes.tzx" size="523" crc="955bb0e0" sha1="3459179113e5aeba6977219ee6012e1774546e01" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass18" interface="zx81_cass">
+ <feature name="part_id" value="Swopper"/>
+ <dataarea name="cass" size="658">
+ <rom name="LearningLab.5A.1.Swopper.tzx" size="658" crc="68c4bc24" sha1="631602cfe620d9ced4e998f79464844eac0837ee" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass19" interface="zx81_cass">
+ <feature name="part_id" value="Names"/>
+ <dataarea name="cass" size="955">
+ <rom name="LearningLab.5A.2.Names.tzx" size="955" crc="57345a3f" sha1="a3537ec5ca1b6ed5178914fc2ff94cf304c66098" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass20" interface="zx81_cass">
+ <feature name="part_id" value="Create"/>
+ <dataarea name="cass" size="726">
+ <rom name="LearningLab.5B.1.Create.tzx" size="726" crc="ec92b05e" sha1="b448b66d325b00eed81c3dfd261a806fb443501f" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass21" interface="zx81_cass">
+ <feature name="part_id" value="Rates"/>
+ <dataarea name="cass" size="982">
+ <rom name="LearningLab.5B.2.Rates.tzx" size="982" crc="d2578d79" sha1="940bfb0db4d5540c52aa5acb1df86d3d5c6253b2" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass22" interface="zx81_cass">
+ <feature name="part_id" value="Strategy"/>
+ <dataarea name="cass" size="746">
+ <rom name="LearningLab.6A.1.Strategy.tzx" size="746" crc="7fca69d5" sha1="fbfc23ed26b2377a5584c611496d3faa8bf6729b" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass23" interface="zx81_cass">
+ <feature name="part_id" value="Archery"/>
+ <dataarea name="cass" size="831">
+ <rom name="LearningLab.6A.2.Archery.tzx" size="831" crc="a5bfa766" sha1="d4a2afd4e6e66eb3b269aad1126a73fa4b27dcbe" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass24" interface="zx81_cass">
+ <feature name="part_id" value="Mastermind"/>
+ <dataarea name="cass" size="879">
+ <rom name="LearningLab.6A.3.Mastermind.tzx" size="879" crc="d06d0d18" sha1="278b72db309d25742f41ba7da2ac8ab6f875fb7d" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass25" interface="zx81_cass">
+ <feature name="part_id" value="Finance"/>
+ <dataarea name="cass" size="6623">
+ <rom name="LearningLab.6B.1.Finance.tzx" size="6623" crc="9969852d" sha1="37061dea80f4d1ee383bc214ea5265a1afe0b33a" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="listmngr">
+ <description>The List Manager</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="29918">
+ <rom name="ListManagerThe.tzx" size="29918" crc="9df64f46" sha1="f3fed91b2947d49a6d85c26797f46366ba614769" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="loanmort">
+ <description>The Loan/Mortgage Amortizer</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="10564">
+ <rom name="LoanMortgageAmortizerThe.tzx" size="10564" crc="8fd28637" sha1="60988beeefb18dd293f49a3f91c6487d6245a554" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lostisld">
+ <description>Lost Island</description>
+ <year>1982</year>
+ <publisher>JRS Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15766">
+ <rom name="LostIsland.tzx" size="15766" crc="b0682ddb" sha1="b1bed07dd568166c87352c1700c8e3fb81a43a7b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lovebusz">
+ <description>Love, Business &amp; The Zodiac</description>
+ <year>1982</year>
+ <publisher>M.A.Smith</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Love, Sex and Marriage"/>
+ <dataarea name="cass" size="9216">
+ <rom name="LoveBusinessZodiac.A.LoveSexMarriage.tzx" size="9216" crc="418d9eac" sha1="f0164f204b8da11341d28dbfa13fd4a65e2ce85b" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Business Relationships"/>
+ <dataarea name="cass" size="11309">
+ <rom name="LoveBusinessZodiac.B.BusinessRelationships.tzx" size="11309" crc="95083de4" sha1="eedb1e101ae7c645454ea03c6246afd6630a805d" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ltxtztxt">
+ <description>LText/ZText</description>
+ <year>1982</year>
+ <publisher>Oasis Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="LText"/>
+ <dataarea name="cass" size="15177">
+ <rom name="LTextZText.A.LText.tzx" size="15177" crc="0ce6eec0" sha1="dbbbcd0d7c2c9e1ebe3f9df6c0e97d393a7f0529" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="ZText"/>
+ <dataarea name="cass" size="8961">
+ <rom name="LTextZText.B.ZText.tzx" size="8961" crc="f5d2d4c2" sha1="83251ce696bb92212faf783f4200468ebe329dfb" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="lunaresc">
+ <description>Lunar Rescue</description>
+ <year>198?</year>
+ <publisher>Mikro-Gen</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="4885">
+ <rom name="LunarRescue.tzx" size="4885" crc="b63d952a" sha1="620f51472b3313aa14bee80521e5654c05b4c5b6" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mcodetst">
+ <description>Machine Code Test Tool</description>
+ <year>1982</year>
+ <publisher>F.O.Ainley</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="3047">
+ <rom name="MachineCodeTestTool.tzx" size="3047" crc="e7fc10fc" sha1="9108f1176687353a4b9e0a0eff750478a863d5c2" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="manuctrl">
+ <description>Manufacturing Control</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15008">
+ <rom name="ManufacturingControl.tzx" size="15008" crc="fec50d8e" sha1="694cfa2652b6134621f5b6a2a189af5b8f1e853b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="marnresc">
+ <description>Marine Rescue</description>
+ <year>1982</year>
+ <publisher>International Publishing &amp; Software Inc.</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="11057">
+ <rom name="MarineRescue.tzx" size="11057" crc="60217181" sha1="c0fe4882d84b9fc7503004128975115b5cc355f2" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="maths1">
+ <description>Mathematics 1</description>
+ <year>1982</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Addition/Subtraction"/>
+ <dataarea name="cass" size="3835">
+ <rom name="Mathematics1.A.AdditionSubtraction.tzx" size="3835" crc="f3ac3a24" sha1="1f7c83c7149701be17418f13c550574219a89fa7" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Multiplication/Division"/>
+ <dataarea name="cass" size="5095">
+ <rom name="Mathematics1.B.MultiplicationDivision.tzx" size="5095" crc="6963328d" sha1="443815cbc57eb94cb3341508d87304f6b4f73fdf" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="maths1w" cloneof="maths1">
+ <description>Mathematics 1 (WHSmith)</description>
+ <year>1982</year>
+ <publisher>W.H.Smith</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Addition/Subtraction"/>
+ <dataarea name="cass" size="3835">
+ <rom name="Mathematics1.A.AdditionSubtraction.tzx" size="3835" crc="f3ac3a24" sha1="1f7c83c7149701be17418f13c550574219a89fa7" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Multiplication/Division"/>
+ <dataarea name="cass" size="5095">
+ <rom name="Mathematics1.B.MultiplicationDivision.tzx" size="5095" crc="6963328d" sha1="443815cbc57eb94cb3341508d87304f6b4f73fdf" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathrout">
+ <description>Math Routines and Fit</description>
+ <year>198?</year>
+ <publisher>Zeta Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16074">
+ <rom name="MathRoutinesAndFit.tzx" size="16074" crc="2896de80" sha1="aa81c6329174cb096d5690cf4d6456b0e0dbdccc" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathsinv">
+ <description>Maths Invaders</description>
+ <year>198?</year>
+ <publisher>Programs in Education</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="8030">
+ <rom name="MathsInvaders.tzx" size="8030" crc="19057596" sha1="4e6e0fc96692a767de539ec97df4b06b30c5af70" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mathspt1">
+ <description>Maths Part 1</description>
+ <year>198?</year>
+ <publisher>Scisoft</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="19849">
+ <rom name="MathsPart1.A.tzx" size="19849" crc="012f409a" sha1="03c3f4ac4e95f830f5062267bb222bf53e105380" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="18389">
+ <rom name="MathsPart1.B.tzx" size="18389" crc="d0cd29f8" sha1="92cef10c6e9a31d3d1cb94aaf743a7644231ce57" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mazedeath">
+ <description>Maze Death Race</description>
+ <year>1982</year>
+ <publisher>PSS</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Part 1"/>
+ <dataarea name="cass" size="7851">
+ <rom name="MazeDeathRace.A.1.Part1.tzx" size="7851" crc="de724f63" sha1="db7f75fa46601245907715bda906d4c5f9c84776" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Part 2"/>
+ <dataarea name="cass" size="4579">
+ <rom name="MazeDeathRace.A.2.Part2.tzx" size="4579" crc="aa059d96" sha1="e7fbc33129fb453115e0e8faea205af6ae332a68" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mazogs">
+ <description>Mazogs</description>
+ <year>1981</year>
+ <publisher>Bug Byte</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="13059">
+ <rom name="Mazogs.tzx" size="13059" crc="4cb450b8" sha1="edee5d84ed22c2cffa6b605a4caa998a8510da17" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mazogsg" cloneof="mazogs">
+ <description>Mazogs (Gladstone)</description>
+ <year>198?</year>
+ <publisher>Gladstone Electronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="13170">
+ <rom name="Mazogs(GE).tzx" size="13170" crc="5d7dd442" sha1="94e2da0938bd44f9c0392e2061e390e69d49d47b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mazogss" cloneof="mazogs">
+ <description>Mazogs (Softsync)</description>
+ <year>1982</year>
+ <publisher>Softsync</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="13059">
+ <rom name="Mazogs(Softsync).tzx" size="13059" crc="2c73fa3b" sha1="56e5e86334cb633863fc2386ffda515ad8c58ea9" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mcoder">
+ <description>MCoder</description>
+ <year>1982</year>
+ <publisher>PSS</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="3786">
+ <rom name="MCoder.tzx" size="3786" crc="3aef6340" sha1="74d2103372c2d6e5d627c9deddba2ed948606c77" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mcoder11">
+ <description>MCoder 11</description>
+ <year>1983</year>
+ <publisher>PSS</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5941">
+ <rom name="MCoder11.tzx" size="5941" crc="4c0ee232" sha1="e4d21864bfbba4e7584fb8d4817494eddebeba52" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mervenus">
+ <description>Merchant of Venus</description>
+ <year>1983</year>
+ <publisher>Crystal</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16393">
+ <rom name="MerchantOfVenus.tzx" size="16393" crc="5e4a029e" sha1="95f7628f548dcbfeb169fe3f12baa23e720b6f8c" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="metstorm">
+ <description>Meteor Storm</description>
+ <year>1982</year>
+ <publisher>dK'tronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5987">
+ <rom name="MeteorStorm.Alt2.tzx" size="5987" crc="605e7266" sha1="5d5ce4892bb9755e8e42077c68da6f20e9f8c0b2" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <dataarea name="cass" size="5987">
+ <rom name="MeteorStorm.tzx" size="5987" crc="f2c24bfe" sha1="c50a3cf08f38a9317c89718eaca14f997ee664c8" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="metstormf" cloneof="metstorm">
+ <description>Meteor Storm (FastMaster)</description>
+ <year>1982</year>
+ <publisher>dK'tronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="6024">
+ <rom name="MeteorStorm(FastMaster).tzx" size="6024" crc="35c2540e" sha1="e02a6983c28a40ccc70a3fa3edd1dc6dbf176354" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="micmouse">
+ <description>Micro Mouse</description>
+ <year>1983</year>
+ <publisher>Lothlorien</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="8713">
+ <rom name="MicroMouse.tzx" size="8713" crc="db8110b5" sha1="012a444ac366224d63daf2bc242ca30b58a0e33a" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mindmach">
+ <description>Mind vs. Machine</description>
+ <year>1982</year>
+ <publisher>2-Bit Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="3168">
+ <rom name="MindvsMachine.B.tzx" size="3168" crc="c7ac234d" sha1="5bf1942b1696ad670427a5119bac1cbddcac30f0" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="minesatn">
+ <description>Mines of Saturn/Return to Earth</description>
+ <year>198?</year>
+ <publisher>Mikro-Gen</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Mines of Saturn"/>
+ <dataarea name="cass" size="13045">
+ <rom name="MinesOfSaturnReturnToEarth.A.MinesOfSaturn.tzx" size="13045" crc="87a4f7f7" sha1="33fc3f6ec28bba835834be07ef68122df6c547bc" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Return to Earth"/>
+ <dataarea name="cass" size="10790">
+ <rom name="MinesOfSaturnReturnToEarth.B.ReturnToEarth.tzx" size="10790" crc="1667ffa7" sha1="95a3afcd664cb8524152188ac00cc7e6192df5c0" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mxdgame1">
+ <description>Mixed Game Bag 1</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Bowling"/>
+ <dataarea name="cass" size="9530">
+ <rom name="MixedGameBag1.1.Bowling.tzx" size="9530" crc="0659bbe6" sha1="f32248710c0579e305668969b1d1261a4af503cf" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Robot Wars"/>
+ <dataarea name="cass" size="9078">
+ <rom name="MixedGameBag1.2.RobotWars.tzx" size="9078" crc="ba6ea1f4" sha1="08b02de757cb822aec8a8472e9e1999f52e93de2" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Bingo"/>
+ <dataarea name="cass" size="4171">
+ <rom name="MixedGameBag1.3.Bingo.tzx" size="4171" crc="180a34bd" sha1="a9a21627661d9af329089a17ac9bc4f8073b2d03" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mxdgame2">
+ <description>Mixed Game Bag 2</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Memory"/>
+ <dataarea name="cass" size="1581">
+ <rom name="MixedGameBag2.1.Memory.tzx" size="1581" crc="ee31f350" sha1="2912dccd99366375d9b40580d538ca6a3bd4cd5c" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Concentration"/>
+ <dataarea name="cass" size="1652">
+ <rom name="MixedGameBag2.2.Concentration.tzx" size="1652" crc="2b1c3ae1" sha1="229578430aa00102eb216b314905340b7989085d" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Super Mind"/>
+ <dataarea name="cass" size="1579">
+ <rom name="MixedGameBag2.3.SuperMind.tzx" size="1579" crc="d43693f5" sha1="768ad2b5a06ee834b60eda2e2b2534900f2ee0b8" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mxdgame3">
+ <description>Mixed Game Bag III</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="6939">
+ <rom name="MixedGameBagIII.tzx" size="6939" crc="9115c144" sha1="9ad8a4c6321346b904995ac8e9aee31124eb5868" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mnyanal1">
+ <description>Money Analyzer 1</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="2508">
+ <rom name="MoneyAnalyzer1.tzx" size="2508" crc="8b0ecf6c" sha1="5a223f431b06f01ccd7e30c31d462422409a3c69" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mnyanal2">
+ <description>Money Analyzer 2</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Depreciation"/>
+ <dataarea name="cass" size="1500">
+ <rom name="MoneyAnalyzer2.1.Depreciation.tzx" size="1500" crc="f60f3930" sha1="23705378e70508e947711411a06d3700f3382c94" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Present"/>
+ <dataarea name="cass" size="1636">
+ <rom name="MoneyAnalyzer2.2.Present.tzx" size="1636" crc="9bc3bbb3" sha1="25b0ff11ef104185f2087359670a3204c4813f1e" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Return"/>
+ <dataarea name="cass" size="1500">
+ <rom name="MoneyAnalyzer2.3.Return.tzx" size="1500" crc="d21e55f1" sha1="f84912a577927cb5fac13b2726d371d1be7ecce6" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mondesas">
+ <description>Moniteur Desassembleur</description>
+ <year>1982</year>
+ <publisher>Direco International</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5825">
+ <rom name="MoniteurDesassembleur.tzx" size="5825" crc="e548a0e6" sha1="f3433d201596f069dff1053a86fc2f293b8e4612" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="monsmine">
+ <description>Monster Mine</description>
+ <year>1982</year>
+ <publisher>Gem Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="11048">
+ <rom name="MonsterMine.tzx" size="11048" crc="ac4bec18" sha1="bcbf2d46f2c8b547600f979882968d4a57c5b524" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="morserdr">
+ <description>Morse Reader</description>
+ <year>198?</year>
+ <publisher>JEP Electronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="9055">
+ <rom name="MorseReader.tzx" size="9055" crc="9fce1af5" sha1="debe28ec7e350d9b6431dc6fca6da97513232f02" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mothersh">
+ <description>Mothership</description>
+ <year>1982</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="9863">
+ <rom name="Mothership.tzx" size="9863" crc="526e7fa1" sha1="05fd66ec3eb2c22df673f2bdaa238faab8ae5fc2" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="mothershs" cloneof="mothersh">
+ <description>Mothership (Softsync)</description>
+ <year>1983</year>
+ <publisher>Softsync</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="9863">
+ <rom name="Mothership(Softsync).tzx" size="9863" crc="28f60c02" sha1="63dec851b552ac48d167ce90deec768f0677d42f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="multfile">
+ <description>Multifile (Gladstone)</description>
+ <year>1981</year>
+ <publisher>Gladstone Electronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5783">
+ <rom name="Multifile(GE).tzx" size="5783" crc="18343751" sha1="d72de512a1adc62cf2de299c2e1ff64ed630316b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="multfilep">
+ <description>Multifile Plus (Gladstone)</description>
+ <year>198?</year>
+ <publisher>Gladstone Electronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7921">
+ <rom name="MultifilePlus(GE).tzx" size="7921" crc="4952ff07" sha1="c2866c2c9430d5aec6ea4eb01d7f04c839b1b30c" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="multgrap">
+ <description>MultiGraphics 2.3</description>
+ <year>1981</year>
+ <publisher>Bridge Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14452">
+ <rom name="Multigraphics.tzx" size="14452" crc="14dd97d3" sha1="7b7bead37db83539393b9bab71c15ed048608d85" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="munchees">
+ <description>Munchees</description>
+ <year>1983</year>
+ <publisher>Quicksilva</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7777">
+ <rom name="Munchees.tzx" size="7777" crc="4da90eed" sha1="c64c8336f95030b957f3e6c3aed5be3a2237dbb1" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="muncher">
+ <description>Muncher</description>
+ <year>1982</year>
+ <publisher>Silversoft</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5430">
+ <rom name="Muncher.tzx" size="5430" crc="7334ad2a" sha1="2d7edcfd205dfbdfe253967fa8dd25711964b00c" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="murgatro">
+ <description>Murgatroyds</description>
+ <year>1982</year>
+ <publisher>Collins Computing</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7315">
+ <rom name="Murgatroyds.tzx" size="7315" crc="d35af98d" sha1="e9b44dc8dce87e747c15c2bb24dc508f319ddc36" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="music1">
+ <description>Music 1</description>
+ <year>1982</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Composers"/>
+ <dataarea name="cass" size="11982">
+ <rom name="Music1.A.Composers.tzx" size="11982" crc="8d827e2c" sha1="4c9a2dd1be47d99da48799f26c401f241ebcd086" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Musicians"/>
+ <dataarea name="cass" size="11134">
+ <rom name="Music1.B.Musicians.tzx" size="11134" crc="b979a29a" sha1="3cfa6a1dae7d7c74017b113b4ae93cbd206abfa2" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="music1w" cloneof="music1">
+ <description>Music 1 (WHSmith)</description>
+ <year>1982</year>
+ <publisher>W.H.Smith</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Composers"/>
+ <dataarea name="cass" size="11982">
+ <rom name="Music1.A.Composers.tzx" size="11982" crc="8d827e2c" sha1="4c9a2dd1be47d99da48799f26c401f241ebcd086" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Musicians"/>
+ <dataarea name="cass" size="11134">
+ <rom name="Music1.B.Musicians.tzx" size="11134" crc="b979a29a" sha1="3cfa6a1dae7d7c74017b113b4ae93cbd206abfa2" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="muscompo">
+ <description>Music Composer</description>
+ <year>198?</year>
+ <publisher>Memotronic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5822">
+ <rom name="MusicComposer.tzx" size="5822" crc="d0cc5789" sha1="bbf95991604eb52b8211d709736cdcde9ac4dc3b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="musicedu">
+ <description>Music Educator 1</description>
+ <year>1983</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14372">
+ <rom name="MusicEducator1.tzx" size="14372" crc="db66a8dd" sha1="0ee598ab50535505e8382f93d6f77f158d1e43e4" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="namtraid">
+ <description>Namtir Raiders</description>
+ <year>1982</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="3984">
+ <rom name="NamtirRaiders.tzx" size="3984" crc="e65d10f3" sha1="364dd09fac90173806cd1a643b594cb378156a55" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nightgunn">
+ <description>Night Gunner</description>
+ <year>1982</year>
+ <publisher>Digital Integration</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5333">
+ <rom name="NightGunner.tzx" size="5333" crc="ba8bea96" sha1="ecd2c009311a97f40eae7102faf426e8572b6f96" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nightgunns" cloneof="nightgunn">
+ <description>Night Gunner (Softsync)</description>
+ <year>1982</year>
+ <publisher>Softsync</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5333">
+ <rom name="NightGunner(Softsync).tzx" size="5333" crc="422fb2ab" sha1="9bd903833515016e2e6215c068b630223fc0138a" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nightmpk">
+ <description>Nightmare Park</description>
+ <year>1981</year>
+ <publisher>Macronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="11879">
+ <rom name="NightmarePark.tzx" size="11879" crc="53965b76" sha1="86dbca70ae32e736a89c161c7e260e43576da971" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="nightmpkmp">
+ <description>Nightmare Park and Music Plus</description>
+ <year>1981</year>
+ <publisher>Macronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Nightmare Park"/>
+ <dataarea name="cass" size="11815">
+ <rom name="NightmareParkAndMusicPlus.A.NightmarePark.tzx" size="11815" crc="88d4eed4" sha1="cec6727887610ccb5d5b28e3272c33cb216447e9" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Music Plus"/>
+ <dataarea name="cass" size="2057">
+ <rom name="NightmareParkAndMusicPlus.B.MusicPlus.tzx" size="2057" crc="5923e5d3" sha1="7f199e73c33247d227662bb0b76406b8e2ed756d" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="oceantrd">
+ <description>Ocean Trader</description>
+ <year>1983</year>
+ <publisher>Quicksilva</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Instructions"/>
+ <dataarea name="cass" size="11969">
+ <rom name="OceanTrader.A.1.Instructions.tzx" size="11969" crc="8a42742e" sha1="8f892f0db3e2b2a4f60f2fda0a521acfbddf9f7a" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Ocean Trader"/>
+ <dataarea name="cass" size="15925">
+ <rom name="OceanTrader.A.2.tzx" size="15925" crc="677e26e1" sha1="ce14e353392ccec332a113950e5a20b981568b65" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="octopuss">
+ <description>Octopussy</description>
+ <year>198?</year>
+ <publisher>Peaksoft</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="6308">
+ <rom name="Octopussy.tzx" size="6308" crc="9d408c0e" sha1="745515410b88f840a33611b15c4e0a31e6b28611" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="olvlmath">
+ <description>G.C.E. "O" Level Maths (13-16 Years)</description>
+ <year>1981</year>
+ <publisher>Rose Cassettes</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="45762">
+ <rom name="OLevelMaths.tzx" size="45762" crc="18dee8d7" sha1="fbcb91863fb3a6af3435bb6c120c4451a388f05d" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="oraclcave">
+ <description>The Oracles Cave</description>
+ <year>1981</year>
+ <publisher>Doric Computer Systems</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16181">
+ <rom name="OraclesCaveThe.tzx" size="16181" crc="dea5489a" sha1="752bb718f14e0a7e9da87fa958ccd0e366813a34" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="organizr">
+ <description>The Organizer</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="VU-FILE"/>
+ <dataarea name="cass" size="6351">
+ <rom name="OrganizerThe.A.tzx" size="6351" crc="63316320" sha1="c9ccd350c43c0ce1085ae2acb6fb54239bd08d57" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Gazetteer"/>
+ <dataarea name="cass" size="16458">
+ <rom name="OrganizerThe.B.Gazetteer.tzx" size="16458" crc="cf4c5413" sha1="fb91932e33ddf77537727184cdd6422a3550a237" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="othello">
+ <description>Othello</description>
+ <year>198?</year>
+ <publisher>CDS Micro Systems</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="11885">
+ <rom name="Othello.tzx" size="11885" crc="09d487fe" sha1="47c8980d14972b59fab5098667b170169894515d" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="othellom">
+ <description>Othello (Moi)</description>
+ <year>1982</year>
+ <publisher>Moi</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="12809">
+ <rom name="Othello(Moi).tzx" size="12809" crc="96eeab64" sha1="78f78e57bf940d87d020c39aa4218b273f612313" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pacrabbt">
+ <description>Pac Rabbit</description>
+ <year>1983</year>
+ <publisher>International Publishing &amp; Software Inc.</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="800">
+ <rom name="PacRabbit.A.1.Rabbit.tzx" size="800" crc="3956eccb" sha1="6f354b05e25c86c3de9ea98ed4a0063de46d4c59" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <dataarea name="cass" size="12914">
+ <rom name="PacRabbit.B.1.PacRabbit.tzx" size="12914" crc="98929832" sha1="dfcd62b8a0e18fe596fd031fac6e63da1c87f905" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="paintmze">
+ <description>Paint-Maze</description>
+ <year>198?</year>
+ <publisher>Mikro-Gen</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5086">
+ <rom name="PaintMaze.tzx" size="5086" crc="2eff4b27" sha1="e8519c3eb5b772f13fe374c1c57a15d7d4791887" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="partygms">
+ <description>Party Games</description>
+ <year>1982</year>
+ <publisher>Tyrant</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="12013">
+ <rom name="PartyGames.A.tzx" size="12013" crc="522cd0dd" sha1="1b0e9822bfce4ec693d9c0d6a0e7ca2e4288c15f" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="9454">
+ <rom name="PartyGames.B.tzx" size="9454" crc="ed90b85b" sha1="aa51dbbc51992b4edfa069e379bcbebbb8a815d9" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="patrouil">
+ <description>Patrouille De L'Espace</description>
+ <year>1981</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Raiders"/>
+ <dataarea name="cass" size="3005">
+ <rom name="PatrouilleDeLEspace.A.Raiders.tzx" size="3005" crc="7c3583df" sha1="2077381824f057ae9c953d6af0d11b2ce7b0b00c" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Bomber"/>
+ <dataarea name="cass" size="2397">
+ <rom name="PatrouilleDeLEspace.B.Bomber.tzx" size="2397" crc="6b38e0ab" sha1="0800181140382d84ac7bc3e0a37901717dc4e8e2" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pelopwar">
+ <description>Peloponnesian War</description>
+ <year>1982</year>
+ <publisher>Lothlorien</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16341">
+ <rom name="PeloponnesianWar.tzx" size="16341" crc="f56e0c9d" sha1="94ebc1a99152a5441238ad242da19b4c9ccee699" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pengy">
+ <description>Pengy</description>
+ <year>1984</year>
+ <publisher>Fawkes Computing</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="8782">
+ <rom name="Pengy.tzx" size="8782" crc="85894997" sha1="27606cf98e27ecc5a6da5da5e36ba5ab9c4fa038" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="persbank">
+ <description>Personal Banking System</description>
+ <year>1982</year>
+ <publisher>J.P.Gibbons</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16084">
+ <rom name="PersonalBankingSystem.A.tzx" size="16084" crc="4221c8e0" sha1="c8ab699e7f12a1a63f4b2cfa4c35245ab0b1a9ed" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <dataarea name="cass" size="12700">
+ <rom name="PersonalBankingSystem.B.Alternative.tzx" size="12700" crc="9a2b515e" sha1="84891c3ff2647e590a1e376f160df5d104a7a7a5" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="persfina">
+ <description>Personal Finance Planner</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="13703">
+ <rom name="PersonalFinancePlanner.A.tzx" size="13703" crc="db594de1" sha1="47f9ddecaf9257d5cae87fe4dc977b0dd01d524b" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <dataarea name="cass" size="13782">
+ <rom name="PersonalFinancePlanner.B.PersonalFinancePlanner(Alt).tzx" size="13782" crc="7a49bd95" sha1="333397933889b6a2708044b1e95fefe6585f9d19" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="persfinp">
+ <description>Personal Financial Planning Pack</description>
+ <year>1983</year>
+ <publisher>International Publishing &amp; Software Inc.</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Chex Watcher"/>
+ <dataarea name="cass" size="15781">
+ <rom name="PersonalFinancialPlanningPack.A.1.ChexWatcher.tzx" size="15781" crc="5053c773" sha1="3fa161b97162d3cefca201ebf10be3585417c178" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="My Worth"/>
+ <dataarea name="cass" size="14838">
+ <rom name="PersonalFinancialPlanningPack.A.2.MyWorth.tzx" size="14838" crc="bc81a92e" sha1="a500adae51f9cbe663bee40328a291253753b95a" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Budget Planner"/>
+ <dataarea name="cass" size="15616">
+ <rom name="PersonalFinancialPlanningPack.B.1.BudgetPlanner.tzx" size="15616" crc="8bdd062c" sha1="796345296e78cab74af00c056ed9da436ae0696d" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="A-Loan"/>
+ <dataarea name="cass" size="10711">
+ <rom name="PersonalFinancialPlanningPack.B.2.ALoan.tzx" size="10711" crc="7e159656" sha1="338bf2743a4a99f543135eeba3303c4f77722ba5" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="phoenix">
+ <description>Phoenix Adventure</description>
+ <year>1982</year>
+ <publisher>CDS Micro Systems</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15659">
+ <rom name="Phoenix.A.tzx" size="15659" crc="cf999f96" sha1="8f2bceda6cb5ba5ab703c44005fa9cee56b15364" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <dataarea name="cass" size="15850">
+ <rom name="Phoenix.B.Phoenix(Alt).tzx" size="15850" crc="0db40394" sha1="5339dcf72c142e62e96e8f4c5fd79ba1a183c375" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="physrev">
+ <description>Physics Revision</description>
+ <year>1981</year>
+ <publisher>Scisoft</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Revision"/>
+ <dataarea name="cass" size="11143">
+ <rom name="PhysicsRevision.A.1.Revision.tzx" size="11143" crc="bac28cd9" sha1="9a3c393005478c24ba69fa7e96bfaa1147d4718b" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Units Questions"/>
+ <dataarea name="cass" size="9413">
+ <rom name="PhysicsRevision.A.2.UnitsQuestions.tzx" size="9413" crc="f50583ed" sha1="20338839366194c96d129f65df26db764960b7c8" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Problems 1"/>
+ <dataarea name="cass" size="12154">
+ <rom name="PhysicsRevision.A.3.Problems1.tzx" size="12154" crc="9e6d372c" sha1="1dac1175f0b8929001f3b300dac851527118f9b1" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="Problems 2"/>
+ <dataarea name="cass" size="14863">
+ <rom name="PhysicsRevision.A.4.Problems2.tzx" size="14863" crc="c174ea2c" sha1="2ca9b877f3ab5a0bacdaa648f3ad7f462addcade" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass5" interface="zx81_cass">
+ <feature name="part_id" value="Mechanics Equations"/>
+ <dataarea name="cass" size="8847">
+ <rom name="PhysicsRevision.B.1.MechanicsEquations.tzx" size="8847" crc="8fde5b37" sha1="f1d6ef3d65eb1b55b75cd74a7211535deb44536a" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass6" interface="zx81_cass">
+ <feature name="part_id" value="Electricity Equations"/>
+ <dataarea name="cass" size="11209">
+ <rom name="PhysicsRevision.B.2.ElectricityEquations.tzx" size="11209" crc="e1f5510f" sha1="842d936621b695500fb9830af826520b69f7e28a" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass7" interface="zx81_cass">
+ <feature name="part_id" value="Light and Sound Equations"/>
+ <dataarea name="cass" size="11482">
+ <rom name="PhysicsRevision.B.3.LightAndSoundEquations.tzx" size="11482" crc="1e4e5b48" sha1="88eb7130cb578b269b38c301486b1533b921c9fd" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass8" interface="zx81_cass">
+ <feature name="part_id" value="Heat and Pressure Equations"/>
+ <dataarea name="cass" size="11362">
+ <rom name="PhysicsRevision.B.4.HeatAndPressureEquations.tzx" size="11362" crc="61fcd99a" sha1="8289877de681a1e6c43143ff6d6bac757451336b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pilot">
+ <description>Pilot</description>
+ <year>1982</year>
+ <publisher>Hewson Consultants</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15119">
+ <rom name="Pilot.tzx" size="15119" crc="775bafed" sha1="8c4645159bcbec8144e875efeacb772d6609119d" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pilotn" cloneof="pilot">
+ <description>Pilot (New)</description>
+ <year>1982</year>
+ <publisher>Hewson Consultants</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="13271">
+ <rom name="Pilot(New).tzx" size="13271" crc="0bc60aad" sha1="42e19385766fe586291dee026b49b60f47a9df0f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pimania">
+ <description>Pimania</description>
+ <year>1982</year>
+ <publisher>Automata Cartography</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16003">
+ <rom name="Pimania.tzx" size="16003" crc="37cfb18d" sha1="dd537d6ab72a749d1f6071d91748282e2ea2b89f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="pinball">
+ <description>Pinball</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="4898">
+ <rom name="Pinball.tzx" size="4898" crc="f8452e21" sha1="4ff5e7491088e5ebe4c67b4813baa943aaea5164" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="piontrl">
+ <description>Pioneer Trail</description>
+ <year>1983</year>
+ <publisher>Quicksilva</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15682">
+ <rom name="PioneerTrail.tzx" size="15682" crc="ceb55f84" sha1="1ff2a193ffda69d2ca542d63334399bcf2301390" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="plntdth">
+ <description>Adventure A: Planet of Death</description>
+ <year>198?</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="13675">
+ <rom name="PlanetOfDeath.tzx" size="13675" crc="cdef18a4" sha1="346412f09b472c931874fd441660ab5435d5f3c1" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="plntdtha" cloneof="plntdth">
+ <description>Planet of Death (Artic)</description>
+ <year>198?</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="13675">
+ <rom name="PlanetOfDeath.tzx" size="13675" crc="cdef18a4" sha1="346412f09b472c931874fd441660ab5435d5f3c1" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="planetds">
+ <description>Planetoids</description>
+ <year>1981</year>
+ <publisher>Macronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5127">
+ <rom name="Planetoids.tzx" size="5127" crc="02a6b2ad" sha1="270765be9b076e4eaa0704eece81137ad2c0ae10" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="plntraid">
+ <description>Planet Raider/Pirate Treasure</description>
+ <year>1983</year>
+ <publisher>Novus Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Planet Raider"/>
+ <dataarea name="cass" size="10133">
+ <rom name="PlanetRaider.A.tzx" size="10133" crc="fa41868f" sha1="b4a5cba1e7662c6271fe599e009ed55be7967a9c" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Pirate Treasure"/>
+ <dataarea name="cass" size="9114">
+ <rom name="PlanetRaider.B.PirateTreasure.tzx" size="9114" crc="31d6c29e" sha1="2b30e0a064878837a4d5edea0b8edcb0069c7d77" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="popmusic">
+ <description>Pop Music</description>
+ <year>1982</year>
+ <publisher>M.A.Smith</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="1960-1970"/>
+ <dataarea name="cass" size="9161">
+ <rom name="PopMusic.A.1960-1970.tzx" size="9161" crc="bc561457" sha1="a69f8b7b5316311549a04eff3f4112e15da5f626" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="1971-1980"/>
+ <dataarea name="cass" size="9410">
+ <rom name="PopMusic.B.1971-1980.tzx" size="9410" crc="1e380791" sha1="ed670d0a2353728981efa4e52c8cbae68c055154" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="portanal">
+ <description>Portfolio Analysis</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15819">
+ <rom name="PortfolioAnalysis.tzx" size="15819" crc="d7ac34ed" sha1="e92da69a510bddb77ad5fab8e13f70d388ee5878" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="powpack1">
+ <description>Power Pack 1</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="TSCalc"/>
+ <dataarea name="cass" size="1127">
+ <rom name="PowerPack1.1.TSCalc.tzx" size="1127" crc="900c6ced" sha1="a2e4de1ff48b1db549f186696c36b30356c1ce80" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="TSBar"/>
+ <dataarea name="cass" size="1584">
+ <rom name="PowerPack1.2.TSBar.tzx" size="1584" crc="ebd7b7b3" sha1="dc56da706e7b42d539ee7f7b538244886dea99f1" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="TSGraph"/>
+ <dataarea name="cass" size="1457">
+ <rom name="PowerPack1.3.TSGraph.tzx" size="1457" crc="52361205" sha1="1718593d39250fe61458d85a71270040e109e398" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="TSBanner"/>
+ <dataarea name="cass" size="1384">
+ <rom name="PowerPack1.4.TSBanner.tzx" size="1384" crc="f26878da" sha1="1a44e92d6183cf4cd80a256cd095f707092485cb" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="presidnt">
+ <description>Presidents</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5300">
+ <rom name="Presidents.tzx" size="5300" crc="7bb539cf" sha1="e8ecee650bd89d88c7eb2fb9ec06eda5d5647caa" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="printprg">
+ <description>Printer Programs</description>
+ <year>1984</year>
+ <publisher>Nick Godwin</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="20668">
+ <rom name="PrinterPrograms.tzx" size="20668" crc="11d50d78" sha1="22a458e45d174f9053a5b96bcdf848fa2afc0e9e" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="printshp">
+ <description>Print Shop</description>
+ <year>1983</year>
+ <publisher>Cases Computer Simulations</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15212">
+ <rom name="PrintShop.tzx" size="15212" crc="da63a78f" sha1="6d911ea6f2e1df74f2547fb89c99f240a0e0272b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="privteer">
+ <description>Privateer</description>
+ <year>1982</year>
+ <publisher>Lothlorien</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="13217">
+ <rom name="Privateer.tzx" size="13217" crc="32e4f2d4" sha1="db608044f7c01b572406ade9481a6aea68995488" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="progmerg">
+ <description>Progmerge</description>
+ <year>1982</year>
+ <publisher>ACS Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5513">
+ <rom name="Progmerge.tzx" size="5513" crc="13313bb9" sha1="fef5282a0e6a8937f22398c45187bb0e98e51b27" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="progpak4">
+ <description>Program Pack 4</description>
+ <year>1981</year>
+ <publisher>Bug Byte</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Breakout"/>
+ <dataarea name="cass" size="781">
+ <rom name="ProgramPack4.1.Breakout.tzx" size="781" crc="6c27cb92" sha1="191ff9739fd156177d78c93b3c34b0ec1874465f" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Brikthru"/>
+ <dataarea name="cass" size="743">
+ <rom name="ProgramPack4.2.Brikthru.tzx" size="743" crc="e840d81b" sha1="831ce6fba62101b5de55a5a215bc2ed873cea7eb" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="protectr">
+ <description>Protector</description>
+ <year>1982</year>
+ <publisher>Abacus</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7835">
+ <rom name="Protector.tzx" size="7835" crc="941c0480" sha1="750a926049abec9c67f6ade68fc029a068800dc6" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="puckman">
+ <description>Puckman</description>
+ <year>1981</year>
+ <publisher>Hewson Consultants</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="10765">
+ <rom name="Puckman.tzx" size="10765" crc="2678c742" sha1="c382093f64ac43318766c4c884854150a1775f2f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="puzzler">
+ <description>The Puzzler</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Inversion 1"/>
+ <dataarea name="cass" size="14673">
+ <rom name="PuzzlerThe.1.Inversion1.tzx" size="14673" crc="f876092b" sha1="58a047955ca45f5a96843bd86721012d2204bad7" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Inversion 2"/>
+ <dataarea name="cass" size="16495">
+ <rom name="PuzzlerThe.2.Inversion2.tzx" size="16495" crc="12d82bba" sha1="f1b700e6ef80896ffe554dcd97270affc17c6de7" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="qsastero">
+ <description>QS Asteroids</description>
+ <year>1982</year>
+ <publisher>Quicksilva</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Characters"/>
+ <dataarea name="cass" size="2019">
+ <rom name="QSAsteroids.A.1.Chars.tzx" size="2019" crc="afb5394f" sha1="9133954ce3957f7d7c26c98b1a2f5c2304224abe" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="QS Asteroids"/>
+ <dataarea name="cass" size="3641">
+ <rom name="QSAsteroids.A.2.Prog.tzx" size="3641" crc="3aff68ac" sha1="831588b997a54fbf3cccd44d193814a946755ac5" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="qsasteroa" cloneof="qsastero">
+ <description>QS Asteroids (Alt)</description>
+ <year>1982</year>
+ <publisher>Quicksilva</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="3647">
+ <rom name="QSAsteroids(NC).tzx" size="3647" crc="92df0bf9" sha1="64a0e4aa51c42ddc49ba4a4a26f73fe4fef123fb" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="qsasterob" cloneof="qsastero">
+ <description>QS Asteroids (Big Picture)</description>
+ <year>1981</year>
+ <publisher>Quicksilva</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="3641">
+ <rom name="QSAsteroids(BP2).tzx" size="3641" crc="c5fcf3db" sha1="b39c7484a5cec019727f037a37103e44b37741ec" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="qsave">
+ <description>Q Save</description>
+ <year>198?</year>
+ <publisher>PSS</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="1773">
+ <rom name="QSave.Alt2.tzx" size="1773" crc="87eac4a3" sha1="322992018a0a7848fb97dad488d2238d0ed8b413" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <dataarea name="cass" size="1773">
+ <rom name="QSave.tzx" size="1773" crc="5f40a680" sha1="e81420d705c943af1afc9f2d403c3ae5a952f192" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="qsavei" cloneof="qsave">
+ <description>Q Save (Inter)</description>
+ <year>1982</year>
+ <publisher>Intercomputer Inc</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Q Save 16K"/>
+ <dataarea name="cass" size="1857">
+ <rom name="QSave(Inter).A.QSave16K.tzx" size="1857" crc="59c64f1e" sha1="9851700c7e809d1c9a42d06776f1fcabdaca8227" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Q Save 64K"/>
+ <dataarea name="cass" size="1804">
+ <rom name="QSave(Inter).B.QSave64K.tzx" size="1804" crc="2fb99af4" sha1="26f0adbfbddf6e0e746c5d9d63cde37c250f8b0a" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="qsaver" cloneof="qsave">
+ <description>Q Save (Red)</description>
+ <year>198?</year>
+ <publisher>PSS</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="1693">
+ <rom name="QSave(Red).tzx" size="1693" crc="28bcfd44" sha1="173946ba09a7b0f085b975d25ddfe6f431541186" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="qsdefend">
+ <description>QS Defenda</description>
+ <year>1982</year>
+ <publisher>Quicksilva</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="2739">
+ <rom name="QSDefenda.tzx" size="2739" crc="f53682e9" sha1="db9f63deb748e232c16b4c8b769b143315d83540" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="qsdefendb" cloneof="qsdefend">
+ <description>QS Defenda (Big Picture)</description>
+ <year>1981</year>
+ <publisher>Quicksilva</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="1971">
+ <rom name="QSDefenda(BP).tzx" size="1971" crc="15b06f98" sha1="eccd0670138ea0f14de3448536adddc1df5cd57f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="qsinvade">
+ <description>QS Invaders</description>
+ <year>1982</year>
+ <publisher>Quicksilva</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7399">
+ <rom name="QSInvaders.tzx" size="7399" crc="6e8f0e11" sha1="e9aa462b6d7edd1d2bcf20f37cf2f486ae61eff1" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="qsinvadeb" cloneof="qsinvade">
+ <description>QS Invaders (Big Picture)</description>
+ <year>1981</year>
+ <publisher>Quicksilva</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7407">
+ <rom name="QSInvaders(BP).tzx" size="7407" crc="05b21451" sha1="92b476abe309e02a9721ab2db8d927418060338e" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="qsscramb">
+ <description>QS Scramble</description>
+ <year>1982</year>
+ <publisher>Quicksilva</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Characters"/>
+ <dataarea name="cass" size="2191">
+ <rom name="QSScramble.A.1.Chars.tzx" size="2191" crc="5e063ce9" sha1="0c88b8e4c7f38a64527782e191609fb04fcdfd71" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="QS Scramble"/>
+ <dataarea name="cass" size="4230">
+ <rom name="QSScramble.A.2.Prog.tzx" size="4230" crc="be839406" sha1="61b479ac4b2fdcd8eb9280fbb1a7e29920dcbc48" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="qsscramba" cloneof="qsscramb">
+ <description>QS Scramble (Alt)</description>
+ <year>1982</year>
+ <publisher>Quicksilva</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="6320">
+ <rom name="QSScramble(Alt).tzx" size="6320" crc="30847836" sha1="7ee4b859c49ee81a670bd629e05ac27177dddb7d" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="radio1">
+ <description>Radio Programs 1</description>
+ <year>198?</year>
+ <publisher>Practical Wireless</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="9785">
+ <rom name="RadioPrograms1.A.tzx" size="9785" crc="4aac98e5" sha1="1af55a72ecce714c27f7feffb5fa52fb70f3f855" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="13842">
+ <rom name="RadioPrograms1.B.tzx" size="13842" crc="c1f8485d" sha1="f0dbd0ee16dc1623225e121974219e17b2c6c26a" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="raider">
+ <description>Raider</description>
+ <year>1983</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15204">
+ <rom name="Raider.A.tzx" size="15204" crc="951e57e0" sha1="dbd675a23e66f33b7ca1c5d337de497afee3b995" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <dataarea name="cass" size="15204">
+ <rom name="Raider.B.Raider(Alt).tzx" size="15204" crc="94830f2c" sha1="a69319522d6ba159341e169acb461efd7642852b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ramrunn">
+ <description>Ram Runner</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="13213">
+ <rom name="RamRunner.tzx" size="13213" crc="9ad7e13f" sha1="c821a765c4045b8107ff273dac9d211baca717cd" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="realesta">
+ <description>Real Estate Investment Analysis</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16047">
+ <rom name="RealEstateInvestmentAnalysis.tzx" size="16047" crc="8373ada1" sha1="240481eb5e8b45ee3e7d240076819b8e2593c3f0" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="redalert">
+ <description>Red Alert</description>
+ <year>1981</year>
+ <publisher>Softsync</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="4236">
+ <rom name="RedAlert.tzx" size="4236" crc="16d48454" sha1="61a4719da9099699143e39713d08c13e381e9216" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="remload">
+ <description>REM-Load</description>
+ <year>198?</year>
+ <publisher>Picturesque</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="3832">
+ <rom name="Remload.tzx" size="3832" crc="4abd4029" sha1="910a2a7b3e1dc71238d8b62566ffa0af87776b46" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rentprop">
+ <description>Rental Property Manager</description>
+ <year>198?</year>
+ <publisher>Data-assette</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16339">
+ <rom name="RentalPropertyManager.tzx" size="16339" crc="92f8aa70" sha1="378bb82167e1ee3a4f8ec8a69b2a3612cd2b2810" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="renum">
+ <description>RENUM Renumbering Program</description>
+ <year>1982</year>
+ <publisher>Bug Byte</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Renum 1"/>
+ <dataarea name="cass" size="3224">
+ <rom name="Renum.1.Renum1.tzx" size="3224" crc="d2fd60b0" sha1="a0affc26d6925a8a9b434ee8ad1d3d4ac8a44220" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Renum 2"/>
+ <dataarea name="cass" size="2706">
+ <rom name="Renum.2.Renum2.tzx" size="2706" crc="9cd19b72" sha1="cfdfcef50a44a5653edc83aab73ca599f499d379" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="reversi">
+ <description>Reversi also known as Othello</description>
+ <year>1982</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="6452">
+ <rom name="Reversi.tzx" size="6452" crc="01930d80" sha1="0b09a2d44f3fb3243da9cc46ff161bffe6d8021b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="reversia">
+ <description>Reversi (Artic)</description>
+ <year>1982</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14952">
+ <rom name="Reversi(Artic).tzx" size="14952" crc="d5796e37" sha1="516f08ceefe2997e183e6f47e774fda4b81d7be3" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="robberst">
+ <description>Robbers of the Lost Tomb</description>
+ <year>1982</year>
+ <publisher>Timeworks</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="12365">
+ <rom name="RobbersOfTheLostTomb.tzx" size="12365" crc="700a0975" sha1="4e78f00d3529accfdde236c2ef24e43106b5d8d4" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rocketman">
+ <description>Rocket Man</description>
+ <year>1984</year>
+ <publisher>Software Farm</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15561">
+ <rom name="RocketMan.tzx" size="15561" crc="e34adca9" sha1="024909ddf04e7efb22c4e84781aea9ce8e20a877" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="romanemp">
+ <description>Roman Empire</description>
+ <year>1982</year>
+ <publisher>Lothlorien</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15328">
+ <rom name="RomanEmpire.tzx" size="15328" crc="5eeef590" sha1="38225146a420b541cd425e420b5c21c794fd7486" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rpncalc">
+ <description>RPN Calculator</description>
+ <year>1982</year>
+ <publisher>Zeta Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="8504">
+ <rom name="RPNCalculator.tzx" size="8504" crc="1609ef0d" sha1="a6283859ffc5d6390b55803129777fe32b74d627" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rubikca">
+ <description>Rubik Cube (Alt)</description>
+ <year>1982</year>
+ <publisher>CDS Micro Systems</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14601">
+ <rom name="RubikCube(Alt).tzx" size="14601" crc="11d010a0" sha1="7996ca3bb737847719bdfc0663483d0906d74282" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="rubikcb">
+ <description>Rubik Cube (Brown Inlay)</description>
+ <year>1982</year>
+ <publisher>CDS Micro Systems</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15384">
+ <rom name="RubikCube.tzx" size="15384" crc="580179a6" sha1="9b1b7f10e2ebfc90b3653dc10ec0ffd0d5a5c552" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sabotage">
+ <description>Sabotage</description>
+ <year>1982</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="9070">
+ <rom name="Sabotage.tzx" size="9070" crc="0120fe03" sha1="4d123b512a757fe2e0bfd7ddee111322d8238d9f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="salvo">
+ <description>Salvo</description>
+ <year>198?</year>
+ <publisher>Orbyte Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15510">
+ <rom name="Salvo.tzx" size="15510" crc="d9303929" sha1="706ddd40ffc24ad4fffcef7d8f77889a6a1c1a19" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="samuraiw">
+ <description>Samurai Warrior</description>
+ <year>1982</year>
+ <publisher>Lothlorien</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15481">
+ <rom name="SamuraiWarrior.tzx" size="15481" crc="68f13fb0" sha1="a6d7b88718f8ef85e300cb1ba696544a6cb1efcf" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="scram81">
+ <description>Scram 81</description>
+ <year>1983</year>
+ <publisher>Philip Harwood</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="8123">
+ <rom name="Scram81.A.tzx" size="8123" crc="2fd31859" sha1="37947356dd11ead6a8e4af2d99078abdcae747ad" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <dataarea name="cass" size="8814">
+ <rom name="Scram81.B.Scram81Alt.tzx" size="8814" crc="79187999" sha1="3528ee80f81463e4fd5d252e3bf3bdee34845e0d" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="scramble">
+ <description>Scramble</description>
+ <year>198?</year>
+ <publisher>Mikro-Gen</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="4693">
+ <rom name="Scramble.tzx" size="4693" crc="dd9359a4" sha1="84760e3b08c0e5686c9ace4b23dff5b6187da367" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="scramblec" cloneof="scramble">
+ <description>Scramble (Colour Inlay)</description>
+ <year>198?</year>
+ <publisher>Mikro-Gen</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="4693">
+ <rom name="Scramble(CI).tzx" size="4693" crc="0ef260a9" sha1="338ba99e7d814653800311cd67be49fca764a822" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="scrnkit1">
+ <description>Screen Kit 1</description>
+ <year>198?</year>
+ <publisher>Picturesque</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="2081">
+ <rom name="ScreenKit1.tzx" size="2081" crc="88368931" sha1="78351cb1c27587935242bf9bb0f512d07b902625" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="seawolf">
+ <description>Sea Wolf</description>
+ <year>1983</year>
+ <publisher>Stephen Hartley Computing</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="9732">
+ <rom name="SeaWolf.tzx" size="9732" crc="d23cf454" sha1="f0275fe3bc08875e643be9431615b7a7c5ba64ab" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="seawolfn" cloneof="seawolf">
+ <description>Sea Wolf (Newer)</description>
+ <year>1983</year>
+ <publisher>Stephen Hartley Computing</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="9732">
+ <rom name="SeaWolf(Newer).tzx" size="9732" crc="9e1b515b" sha1="b55b9b06c9805d2253335d4f61a6ae43bbe9ffe4" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="shipdoom">
+ <description>Adventure C: The Ship of Doom</description>
+ <year>1982</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14275">
+ <rom name="ShipOfDoom.tzx" size="14275" crc="ae8d5b3c" sha1="a1e5ab55214da2ca312345586f684e65204d52ad" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="shipdooma" cloneof="shipdoom">
+ <description>Ship of Doom (Artic)</description>
+ <year>1982</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14275">
+ <rom name="ShipOfDoom(Artic).tzx" size="14275" crc="284a314f" sha1="96221bceba4ff6e90fdc59271da1d7973362e8f8" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="similesc">
+ <description>Similes Countdown</description>
+ <year>1981</year>
+ <publisher>AVC Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="10151">
+ <rom name="SimilesCountdown.tzx" size="10151" crc="fbbcdef4" sha1="7cd764fcbd90d455fb2d31ceec7cda10b08ec8cd" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sinuser8">
+ <description>Sinclair User Club Vol.8</description>
+ <year>198?</year>
+ <publisher>Sinclair User</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="11357">
+ <rom name="SinclairUserClub8.A.tzx" size="11357" crc="5bdbd3b2" sha1="408effe3df77673c6f7715cbdc326ec2e283a2b3" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="11085">
+ <rom name="SinclairUserClub8.B.tzx" size="11085" crc="a26a6777" sha1="f01380b67c6946b0d263c93ed632dab55b0a8ea9" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spaceint">
+ <description>Space Intruders</description>
+ <year>1981</year>
+ <publisher>Hewson Consultants</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="4010">
+ <rom name="SpaceIntruders.tzx" size="4010" crc="88b1156f" sha1="8aaf24a56fe3cc999ce32ae795ce0bbd7983838f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spaceinv">
+ <description>Space Invaders</description>
+ <year>198?</year>
+ <publisher>Mikro-Gen</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="2896">
+ <rom name="SpaceInvaders.tzx" size="2896" crc="a345e8db" sha1="4536f0d2a465a71891803b23d29bc8c54c1b874f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spaceinvd">
+ <description>Space Invaders (dk)</description>
+ <year>1981</year>
+ <publisher>dK'tronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="6889">
+ <rom name="SpaceInvaders(dk).tzx" size="6889" crc="720bf20c" sha1="e9d543b4f96bbda648c1488a06d2538ed3da3001" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spcinv3k">
+ <description>Space Invaders 3K</description>
+ <year>1981</year>
+ <publisher>Macronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="3074">
+ <rom name="SpaceInvaders3K.tzx" size="3074" crc="69729abd" sha1="00bea09a8d43cfd35cb2fb44eff623692811d2a9" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="siplanet">
+ <description>Space Invaders and Planetoids</description>
+ <year>1981</year>
+ <publisher>Macronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Space Invaders"/>
+ <dataarea name="cass" size="3074">
+ <rom name="SpaceInvadersAndPlanetoids.A.SpaceInvaders.tzx" size="3074" crc="a7af342f" sha1="0ff73f885d163bc6d396f4bc82a3b7ab5a21f84e" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Planetoids"/>
+ <dataarea name="cass" size="5127">
+ <rom name="SpaceInvadersAndPlanetoids.B.Planetoids.tzx" size="5127" crc="6323718c" sha1="c59760f47116808619d0bb218dea35a2166c9507" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="sirescue">
+ <description>Space Invaders and Space Rescue</description>
+ <year>1981</year>
+ <publisher>Macronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Space Invaders"/>
+ <dataarea name="cass" size="3074">
+ <rom name="SpaceInvadersAndSpaceRescue.A.SpaceInvaders.tzx" size="3074" crc="2fa8fbbb" sha1="846d6306d8e391a5a265a3577e07636e58576033" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Space Rescue (Alt)"/>
+ <dataarea name="cass" size="6589">
+ <rom name="SpaceInvadersAndSpaceRescue.B.SpaceRescue.Alt2.tzx" size="6589" crc="2d0abb88" sha1="366da8a5f21f8656ad343d357a092ed259c37141" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Space Rescue"/>
+ <dataarea name="cass" size="6589">
+ <rom name="SpaceInvadersAndSpaceRescue.B.SpaceRescue.tzx" size="6589" crc="6b2f1fc6" sha1="ce6976e79db0f338d1827ea81b00920c1dccafcc" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="smapollo">
+ <description>Space Man Apollo</description>
+ <year>1984</year>
+ <publisher>ICT</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15875">
+ <rom name="SpacemanApollo.tzx" size="15875" crc="0fc40716" sha1="68861a48e02a2d65b717012df38600d96986df97" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spcmissn">
+ <description>Space Mission</description>
+ <year>1982</year>
+ <publisher>Gem Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="13607">
+ <rom name="SpaceMission.tzx" size="13607" crc="0dacab8d" sha1="bd92c04a311a49e5846e35528d692ee5e6eb2bcf" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spcraid">
+ <description>Space Raiders also Bomber</description>
+ <year>1982</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Space Raiders"/>
+ <dataarea name="cass" size="3003">
+ <rom name="SpaceRaiders.A.tzx" size="3003" crc="60ecdbda" sha1="69298dceaf8eb2a3f86169411cfb48aba930cf02" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Bomber"/>
+ <dataarea name="cass" size="2661">
+ <rom name="SpaceRaiders.B.Bomber.tzx" size="2661" crc="48264a95" sha1="a3dc0351c5bf95ef7f2d9a43114f3163f7a9202a" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spctrek">
+ <description>Space Trek</description>
+ <year>198?</year>
+ <publisher>Micromega</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15619">
+ <rom name="SpaceTrek.tzx" size="15619" crc="081b0787" sha1="0e20ed7812a34ad507ec1c1dc23536641c4b9993" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spctrekj">
+ <description>Spacetrek (JRS)</description>
+ <year>198?</year>
+ <publisher>JRS Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="550">
+ <rom name="Spacetrek(JRS).tzx" size="550" crc="d62cc02f" sha1="1b0c8177a41aea9aa40f5698280c86e505151349" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spellin1">
+ <description>Spelling 1</description>
+ <year>1982</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Series A1 to A15"/>
+ <dataarea name="cass" size="10860">
+ <rom name="Spelling1.A.A.tzx" size="10860" crc="0846af6b" sha1="6a324678d36191c2d99820c448ac132707959f91" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Series B1 to B15"/>
+ <dataarea name="cass" size="12305">
+ <rom name="Spelling1.B.B.tzx" size="12305" crc="225bc624" sha1="7661818a51f462d2a9c3103c6cec58e69bea9e08" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spellin1w" cloneof="spellin1">
+ <description>Spelling 1 (WHSmith)</description>
+ <year>1982</year>
+ <publisher>W.H.Smith</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Series A1 to A15"/>
+ <dataarea name="cass" size="10860">
+ <rom name="Spelling1.A.A.tzx" size="10860" crc="0846af6b" sha1="6a324678d36191c2d99820c448ac132707959f91" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Series B1 to B15"/>
+ <dataarea name="cass" size="12305">
+ <rom name="Spelling1.B.B.tzx" size="12305" crc="225bc624" sha1="7661818a51f462d2a9c3103c6cec58e69bea9e08" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="spellbee">
+ <description>Spelling Bee</description>
+ <year>1983</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="48415">
+ <rom name="SpellingBee.tzx" size="48415" crc="a5987f22" sha1="d992d921483b59b85ae68bdfa6e44d1c9c5068cc" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="stampcoll">
+ <description>The Stamp Collector</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14675">
+ <rom name="StampCollectorThe.tzx" size="14675" crc="702011b4" sha1="e44f8118a5ef3c7ffc55a46d476cdb0f516179ce" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="starqst">
+ <description>Starquest</description>
+ <year>1982</year>
+ <publisher>Pixel Productions</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16209">
+ <rom name="Starquest.2.Starquest.tzx" size="16209" crc="85bfc2b5" sha1="f0d5783909ca9a5954ecd71854f4f9aaa57d6619" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="starqsti" cloneof="starqst">
+ <description>Starquest (IPS)</description>
+ <year>1982</year>
+ <publisher>International Publishing &amp; Software Inc.</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="17893">
+ <rom name="Starquest(IPS).tzx" size="17893" crc="0375bd08" sha1="fa7a242596852d6aa1c2ff15142ea2f1ed6d4b1f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="starqste">
+ <description>Starquest and Encounter-IQ</description>
+ <year>1982</year>
+ <publisher>Quicksilva</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Starquest Load Test"/>
+ <dataarea name="cass" size="1865">
+ <rom name="StarquestAndEncounter.A.1.StarquestLoadTest.tzx" size="1865" crc="d94156b8" sha1="ca4ac097a0e965a2b578dba2fc758ac8dac54f07" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Starquest"/>
+ <dataarea name="cass" size="16117">
+ <rom name="StarquestAndEncounter.A.2.Starquest.tzx" size="16117" crc="b1f4e182" sha1="32ecbaad6ed8d9d9cc58a72a35037a4e9c3abba2" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Encounter-IQ Load Test"/>
+ <dataarea name="cass" size="1865">
+ <rom name="StarquestAndEncounter.A.3.EncounterIQLoadTest.tzx" size="1865" crc="bd74899f" sha1="a443c76e1234ecc0eda0c8aa68736af3939660e6" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="Encounter-IQ"/>
+ <dataarea name="cass" size="16045">
+ <rom name="StarquestAndEncounter.A.4.EncounterIQ.tzx" size="16045" crc="90b3484e" sha1="480af1e3b8850ab256cc8a5f4196f0e91704d6e2" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="starsocc">
+ <description>Star Soccer</description>
+ <year>1982</year>
+ <publisher>Watson Software Services</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="12 League Teams"/>
+ <dataarea name="cass" size="12614">
+ <rom name="StarSoccer.A.12LeagueTeams.tzx" size="12614" crc="2041a648" sha1="423baa4a8238c600ab6cdf8a44c42828c75f8a7e" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="World Cup Teams"/>
+ <dataarea name="cass" size="12614">
+ <rom name="StarSoccer.B.WorldCupTeams.tzx" size="12614" crc="089f451d" sha1="4b36c482bfe43cd515842f448aa8fe3ddc1e2d3b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="starter">
+ <description>The Starter</description>
+ <year>1981</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="2613">
+ <rom name="Starter.tzx" size="2613" crc="00cb3c24" sha1="c2be276cf0f988df20707105f0fb5d6380d8e357" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="startrek">
+ <description>Star Trek</description>
+ <year>1982</year>
+ <publisher>Bug Byte</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="10250">
+ <rom name="StarTrek.tzx" size="10250" crc="c8107516" sha1="3e0f7d137f9572f756ba9edc5c6835fa9367be81" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="startrekm">
+ <description>Star Trek (Macronics)</description>
+ <year>1981</year>
+ <publisher>Macronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16091">
+ <rom name="StarTrek(Macronics).tzx" size="16091" crc="171e0b56" sha1="5a25a295fc011e37b8941634ad32746b9d626d48" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="startreks">
+ <description>Star Trek (Silversoft)</description>
+ <year>1981</year>
+ <publisher>Silversoft</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16391">
+ <rom name="StarTrek(Silversoft).tzx" size="16391" crc="840b93c9" sha1="f9248c2caa8fcd08372cd80c7e9335484ed026b2" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="startrekt" cloneof="startrek">
+ <description>Star Trek (Typed Inlay)</description>
+ <year>1981</year>
+ <publisher>Bug Byte</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="10250">
+ <rom name="StarTrek(Typed).tzx" size="10250" crc="4c595448" sha1="d6286120a5acc82d974f76e381f3382fe0c55be8" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="startrkm">
+ <description>Star Trek and Mission of the Deep</description>
+ <year>1981</year>
+ <publisher>Macronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Star Trek"/>
+ <dataarea name="cass" size="14586">
+ <rom name="StarTrekAndMissionOfTheDeep.A.StarTrek.tzx" size="14586" crc="9a895106" sha1="9b4d30741b61fc6bc25cf7cc61aa09ac1e1776a5" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Mission of the Deep"/>
+ <dataarea name="cass" size="11825">
+ <rom name="StarTrekAndMissionOfTheDeep.B.MissionOfTheDeep.tzx" size="11825" crc="55069adb" sha1="1a9e5f34a6609afc018ab350d7ec6f5179bc623e" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="startrkn">
+ <description>Star Trek and Nightmare Park</description>
+ <year>1981</year>
+ <publisher>Macronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Star Trek"/>
+ <dataarea name="cass" size="15924">
+ <rom name="StarTrekAndNightmarePark.A.StarTrek.tzx" size="15924" crc="ef1704bc" sha1="660d3a247f79d3ad0f6d2cac9359a5eab214f5fc" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Nightmare Park"/>
+ <dataarea name="cass" size="11753">
+ <rom name="StarTrekAndNightmarePark.B.NightmarePark.tzx" size="11753" crc="8af251b8" sha1="63ca277bbaa7b49d7d27f87a0c1e47f0d59ffe1f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="statecap">
+ <description>States And Capitals</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="11538">
+ <rom name="StatesAndCapitals.tzx" size="11538" crc="c70fa5a4" sha1="99551d3bb7ad39b7f55be16973af29dc7425e9e3" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="stats">
+ <description>Statistics</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="4852">
+ <rom name="Statistics.tzx" size="4852" crc="22eb02c8" sha1="494389e8ad0a8c8adb4a7fa17c91464a78d555e2" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="statsz">
+ <description>Statistics (Zeta)</description>
+ <year>198?</year>
+ <publisher>Zeta Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="13600">
+ <rom name="Statistics(Zeta).tzx" size="13600" crc="c0b4f14a" sha1="7f13b230064429ab366f0816b43d683085d0bf62" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="stockcar">
+ <description>Stock Car</description>
+ <year>1984</year>
+ <publisher>Informatique Service</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="8450">
+ <rom name="StockCar.tzx" size="8450" crc="fedbbc78" sha1="3604d2ff3b9de27e45cb691131b98be09ba3c65b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="stkmark">
+ <description>Stock-Market</description>
+ <year>1981</year>
+ <publisher>Video Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="11978">
+ <rom name="StockMarket.A.tzx" size="11978" crc="440cc0e5" sha1="849c2761901e9210f101500e5603d38b90e55a8c" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="stkmarkg">
+ <description>Stock Market Game</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15812">
+ <rom name="StockMarketGame.A.tzx" size="15812" crc="f606c23d" sha1="df1e91afaa1e4e8e8e03d58b277ded78ff231d46" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <dataarea name="cass" size="15812">
+ <rom name="StockMarketGame.B.StockMarketGame(Alt).tzx" size="15812" crc="698bf1bd" sha1="ee94f788ca880287525bbe4b2737ad4e469bde92" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="stkmarkt">
+ <description>Stock Market Tech. Analysis 1</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16405">
+ <rom name="StockMarketTechAnalysis1.tzx" size="16405" crc="40a9b729" sha1="0d23879da55a4e5cbd7a8b482d010fdcb21e06f6" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="stkmarko">
+ <description>The Stock Option Analyzer</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5763">
+ <rom name="StockOptionAnalyzerThe.tzx" size="5763" crc="b829c9c3" sha1="7691ee6f0ac6a103168684ac3cde78ec128c5e68" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="strfball">
+ <description>Strategy Football</description>
+ <year>1983</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15469">
+ <rom name="StrategyFootball.tzx" size="15469" crc="432f9356" sha1="4add01b5f9e3ddf8f19a686ad91385d4dece1bbd" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="subspace">
+ <description>Subspace Striker</description>
+ <year>1982</year>
+ <publisher>Quicksilva</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Subspace Striker Load Test"/>
+ <dataarea name="cass" size="1887">
+ <rom name="SubspaceStriker.A.1.SubspaceStrikerLoadTest.tzx" size="1887" crc="c88f655f" sha1="ab876ccac60f91605c9d35aa31f0e712a3f4afcc" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Subspace Striker"/>
+ <dataarea name="cass" size="15694">
+ <rom name="SubspaceStriker.A.2.SubspaceStriker.tzx" size="15694" crc="10b34c4e" sha1="e2710c23007c637fb8f508b7f772261e86b36d33" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="ZOR Load Test"/>
+ <dataarea name="cass" size="1869">
+ <rom name="SubspaceStriker.A.3.ZORLoadTest.tzx" size="1869" crc="815ce3ac" sha1="a012472921e84175f5fa72380c9937c42ca20047" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="ZOR"/>
+ <dataarea name="cass" size="15328">
+ <rom name="SubspaceStriker.A.4.ZOR.tzx" size="15328" crc="7d6b52c7" sha1="40106080ec48bb9109521196103e41860720c02e" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="subspacei" cloneof="subspace">
+ <description>Subspace Striker (IPS)</description>
+ <year>1982</year>
+ <publisher>International Publishing &amp; Software Inc.</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="17446">
+ <rom name="SubspaceStriker(IPS).tzx" size="17446" crc="b3c93f34" sha1="4a0d2d26033bfb0b0d67248b8b2ae1fa5f423dc4" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="supchess">
+ <description>Super Chess</description>
+ <year>1982</year>
+ <publisher>CP Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16296">
+ <rom name="SuperChess.tzx" size="16296" crc="dad51d68" sha1="ce79c0b548bb98118e1725c82396887e01aea430" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="supchesss" cloneof="supchess">
+ <description>Super Chess (Softsync)</description>
+ <year>1982</year>
+ <publisher>Softsync</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16296">
+ <rom name="SuperChess(Softsync).tzx" size="16296" crc="bdb36226" sha1="5dda6654a11c6f0afa5dcb9d7f128667359a6954" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="supgloop">
+ <description>Super Glooper also Frogs</description>
+ <year>1982</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Super Glooper"/>
+ <dataarea name="cass" size="3429">
+ <rom name="SuperGlooper.A.tzx" size="3429" crc="53f404ab" sha1="d92d86dc2a20b1eed7401f408e6647b51db89e2b" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Frogs"/>
+ <dataarea name="cass" size="4419">
+ <rom name="SuperGlooper.B.Frogs.tzx" size="4419" crc="4dbf2bfc" sha1="6b267a770dc1980bef4a641e95bf0f2a13e40550" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suprinvd">
+ <description>Super Invaders</description>
+ <year>1982</year>
+ <publisher>Bridge Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="12541">
+ <rom name="SuperInvaders.tzx" size="12541" crc="f662bd98" sha1="3d8c7a7f290d9c792ea7263957dcdaa14cd02c93" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suprinvs">
+ <description>Super Invasion</description>
+ <year>1981</year>
+ <publisher>Softsync</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="1124">
+ <rom name="SuperInvasion.tzx" size="1124" crc="cc59f451" sha1="447855ab4bd695a574a93ff9fab09d65258438a5" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suprmath">
+ <description>Super Math</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="8299">
+ <rom name="SuperMath.tzx" size="8299" crc="21eb7b78" sha1="3f30feead9537bf39da7d83175a5a0cc3dcf0a72" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suprmaze">
+ <description>Supermaze</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16394">
+ <rom name="Supermaze.tzx" size="16394" crc="6e93ce7f" sha1="f85d7522e9cd2bf3cbdc3c05493423d7afad482b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="super9">
+ <description>Super Nine</description>
+ <year>1982</year>
+ <publisher>Romik Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="6872">
+ <rom name="SuperNine.tzx" size="6872" crc="e8b39d87" sha1="5d3cb094e65d4bd9c412f4b6fc18afcc768e6f41" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suprogs1">
+ <description>Super Programs 1</description>
+ <year>1981</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Invasion from Jupiter"/>
+ <dataarea name="cass" size="896">
+ <rom name="SuperPrograms1.A.1.InvasionFromJupiter.tzx" size="896" crc="e5c1acd4" sha1="5552be922bf711e368387847ad4240e7ca884730" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Skittles"/>
+ <dataarea name="cass" size="872">
+ <rom name="SuperPrograms1.A.2.Skittles.tzx" size="872" crc="b5e86795" sha1="d3bb78dcfa875d2d462f5c3aadc8fb24f67efec2" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Magic Square"/>
+ <dataarea name="cass" size="847">
+ <rom name="SuperPrograms1.A.3.MagicSquare.tzx" size="847" crc="abf2fde0" sha1="97f80b9c008c5d09c202372cc6cc0a7a565d1a98" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="Doodle"/>
+ <dataarea name="cass" size="789">
+ <rom name="SuperPrograms1.B.1.Doodle.tzx" size="789" crc="9ef1a3e1" sha1="6a929fb729dbef5fbc11f727358d8f93c59fb6b7" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass5" interface="zx81_cass">
+ <feature name="part_id" value="Kim"/>
+ <dataarea name="cass" size="980">
+ <rom name="SuperPrograms1.B.2.Kim.tzx" size="980" crc="4f6b7007" sha1="bd7a8800c239485ab90e85041a2f626c17802e9e" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass6" interface="zx81_cass">
+ <feature name="part_id" value="Liquid Capacity"/>
+ <dataarea name="cass" size="914">
+ <rom name="SuperPrograms1.B.3.LiquidCapacity.tzx" size="914" crc="f16b94ac" sha1="959765eedcbaaa06366bac701abe15a6a9296610" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suprogs1i" cloneof="suprogs1">
+ <description>Super Programs 1 (ICL)</description>
+ <year>1981</year>
+ <publisher>ICL</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="2597">
+ <rom name="SuperPrograms1(ICL).A.tzx" size="2597" crc="1d471e7b" sha1="b0e54e1f6b2d2cba5dc591fb4ba18832d2cf23cf" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="2508">
+ <rom name="SuperPrograms1(ICL).B.tzx" size="2508" crc="25bdc449" sha1="fdfb0a39516e937b48ec1ff5929efaf90f7cc357" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suprogs2">
+ <description>Super Programs 2</description>
+ <year>1981</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="2452">
+ <rom name="SuperPrograms2.A.tzx" size="2452" crc="38367b13" sha1="18fd89dbd81ca347cba1a9a9a58fab1d17d5dff3" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="2498">
+ <rom name="SuperPrograms2.B.tzx" size="2498" crc="0fe131d5" sha1="f4a2f31ffe2393a63928b6ca72d0551a38b6cff5" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suprogs2i" cloneof="suprogs2">
+ <description>Super Programs 2 (ICL)</description>
+ <year>1981</year>
+ <publisher>ICL</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Rings Around Saturn"/>
+ <dataarea name="cass" size="1030">
+ <rom name="SuperPrograms2(ICL).A.1.RingsAroundSaturn.tzx" size="1030" crc="9ec9d4ed" sha1="e04d9c45dc610c803b3f4907e27e515f869b817a" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Secret Code"/>
+ <dataarea name="cass" size="921">
+ <rom name="SuperPrograms2(ICL).A.2.SecretCode.tzx" size="921" crc="a6bea9c3" sha1="c201dfc288e60e62b1f5b86034190200fcf8acbc" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Mind Boggling"/>
+ <dataarea name="cass" size="748">
+ <rom name="SuperPrograms2(ICL).A.3.MindBoggling.tzx" size="748" crc="02ee7382" sha1="cb1bc46bfd98c5fcd84438c8ac4469a4dc01bfba" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="Silhouette"/>
+ <dataarea name="cass" size="894">
+ <rom name="SuperPrograms2(ICL).B.1.Silhouette.tzx" size="894" crc="60cc5fc8" sha1="477613a2d099641cf8f06d211793bc66161c122b" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass5" interface="zx81_cass">
+ <feature name="part_id" value="Memory Test"/>
+ <dataarea name="cass" size="841">
+ <rom name="SuperPrograms2(ICL).B.2.MemoryTest.tzx" size="841" crc="46ab74e1" sha1="d131c41ee303b2ac3aeb9b56101e7691b4db15d3" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass6" interface="zx81_cass">
+ <feature name="part_id" value="Metric Conversion"/>
+ <dataarea name="cass" size="1005">
+ <rom name="SuperPrograms2(ICL).B.3.MetricConversion.tzx" size="1005" crc="6fd49174" sha1="36fecdcbf8f6c33bd2350013c192dde03b5e0b9a" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suprogs3">
+ <description>Super Programs 3</description>
+ <year>1981</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Train Race"/>
+ <dataarea name="cass" size="751">
+ <rom name="SuperPrograms3.A.1.TrainRace.tzx" size="751" crc="12b5c585" sha1="251055bc4ceb4c9f24305621e34a0dd624ac697f" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Challenge"/>
+ <dataarea name="cass" size="943">
+ <rom name="SuperPrograms3.A.2.Challenge.tzx" size="943" crc="0afae2e6" sha1="5ec025467ba040094fe0939ac182c55d0a4ff3c1" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Secret Message"/>
+ <dataarea name="cass" size="734">
+ <rom name="SuperPrograms3.A.3.SecretMessage.tzx" size="734" crc="b44ccb08" sha1="d01e3951b512ff884ec27d7ec93cc71f4c41e207" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="Mind That Meteor"/>
+ <dataarea name="cass" size="848">
+ <rom name="SuperPrograms3.B.1.MindThatMeteor.tzx" size="848" crc="ef783925" sha1="7eddc18e9da3c36e4ee8e41b7dda63e0da91e035" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass5" interface="zx81_cass">
+ <feature name="part_id" value="Character Doodle"/>
+ <dataarea name="cass" size="723">
+ <rom name="SuperPrograms3.B.2.CharacterDoodle.tzx" size="723" crc="21d6955d" sha1="7c13d63cda319fcc632e07dc571258e6e23ab184" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass6" interface="zx81_cass">
+ <feature name="part_id" value="Currency Conversion"/>
+ <dataarea name="cass" size="705">
+ <rom name="SuperPrograms3.B.3.CurrencyConversion.tzx" size="705" crc="d21a1fa5" sha1="1646cdbec9e7eaadc04fea09e7a72c91a123cc9f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suprogs3i" cloneof="suprogs3">
+ <description>Super Programs 3 (ICL)</description>
+ <year>1981</year>
+ <publisher>ICL</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="2228">
+ <rom name="SuperPrograms3(ICL).A.tzx" size="2228" crc="9a3c56d7" sha1="1f7422832c99101741147a7a9bd7606be108d494" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="2062">
+ <rom name="SuperPrograms3(ICL).B.tzx" size="2062" crc="078f1a1b" sha1="a29eed27bdbc7982a176102f8b09be2e0af0ad52" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suprogs4">
+ <description>Super Programs 4</description>
+ <year>1981</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="2487">
+ <rom name="SuperPrograms4.A.tzx" size="2487" crc="0186dec2" sha1="3278b4f29900582aa68e99257877db2fba627131" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="2467">
+ <rom name="SuperPrograms4.B.tzx" size="2467" crc="a69eedc2" sha1="bac35a1dca251296da629e9472f160636dd01fce" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suprogs4i" cloneof="suprogs4">
+ <description>Super Programs 4 (ICL)</description>
+ <year>1981</year>
+ <publisher>ICL</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Down Under"/>
+ <dataarea name="cass" size="981">
+ <rom name="SuperPrograms4(ICL).A.1.DownUnder.tzx" size="981" crc="1efcb34c" sha1="9635660860d3f07c225b0a6ee17c54c7878aeb6f" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Submarines"/>
+ <dataarea name="cass" size="894">
+ <rom name="SuperPrograms4(ICL).A.2.Submarines.tzx" size="894" crc="881d0874" sha1="a7a891fe8d874d679453ecb6987999a54c67bbbe" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Doodling With Graphics"/>
+ <dataarea name="cass" size="848">
+ <rom name="SuperPrograms4(ICL).A.3.DoodlingWithGraphics.tzx" size="848" crc="6e1be5e6" sha1="31e632d91ab7275cae52d8b36b54aff86146f31e" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="The Invisible Invader"/>
+ <dataarea name="cass" size="944">
+ <rom name="SuperPrograms4(ICL).B.1.TheInvisibleInvader.tzx" size="944" crc="6d54999b" sha1="8f549b6b99651c10a46c853479d053d81210c1ff" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass5" interface="zx81_cass">
+ <feature name="part_id" value="Reaction"/>
+ <dataarea name="cass" size="984">
+ <rom name="SuperPrograms4(ICL).B.2.Reaction.tzx" size="984" crc="bf7508a1" sha1="eaf023ced002dc4ebfa53d26571e457dc4097722" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass6" interface="zx81_cass">
+ <feature name="part_id" value="Petrol"/>
+ <dataarea name="cass" size="839">
+ <rom name="SuperPrograms4(ICL).B.3.Petrol.tzx" size="839" crc="fa4e0fe1" sha1="6cb6ce0f19d2b117967e210832d26afebceef5cc" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suprogs5">
+ <description>Super Programs 5</description>
+ <year>1981</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Martian Knockout"/>
+ <dataarea name="cass" size="3160">
+ <rom name="SuperPrograms5.A.1.MartianKnockout.tzx" size="3160" crc="edb573b1" sha1="cd19e4bfb0993ceae46beccaaf94992fd234e413" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Graffiti"/>
+ <dataarea name="cass" size="3289">
+ <rom name="SuperPrograms5.A.2.Graffiti.tzx" size="3289" crc="84301f0a" sha1="cdb4ff6ddd87822ed4bd72e8b038657d50dbb28c" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Find The Mate"/>
+ <dataarea name="cass" size="3590">
+ <rom name="SuperPrograms5.A.3.FindTheMate.tzx" size="3590" crc="f5866981" sha1="780279e4b9cfcfc3ce07cf11ab416301640ffdc4" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="Labyrinth"/>
+ <dataarea name="cass" size="3689">
+ <rom name="SuperPrograms5.B.1.Labyrinth.tzx" size="3689" crc="982c9d5f" sha1="2ff8293b6a19cb3526f5f627595aa8e99f00bc70" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass5" interface="zx81_cass">
+ <feature name="part_id" value="Drop A Brick"/>
+ <dataarea name="cass" size="3645">
+ <rom name="SuperPrograms5.B.2.DropABrick.tzx" size="3645" crc="0ee86f10" sha1="d3ec6179c44088928785f5b262fcbcf75174a266" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass6" interface="zx81_cass">
+ <feature name="part_id" value="Continental"/>
+ <dataarea name="cass" size="5575">
+ <rom name="SuperPrograms5.B.3.Continental.tzx" size="5575" crc="13485bf4" sha1="e6db2a08b889fff0860b25f10142cbdf4ff7a942" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suprogs5i" cloneof="suprogs5">
+ <description>Super Programs 5 (ICL)</description>
+ <year>1981</year>
+ <publisher>ICL</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Martian Knockout"/>
+ <dataarea name="cass" size="3160">
+ <rom name="SuperPrograms5(ICL).A.1.MartianKnockOut.tzx" size="3160" crc="26a8bc69" sha1="6570bb85ae0b33f2cead45da7a56a75f77ebfb3e" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Graffiti"/>
+ <dataarea name="cass" size="3289">
+ <rom name="SuperPrograms5(ICL).A.2.Graffiti.tzx" size="3289" crc="6efc9e70" sha1="6e927dadcfd9c85453134a82c8b8fb0ced2f09db" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Find The Mate"/>
+ <dataarea name="cass" size="3603">
+ <rom name="SuperPrograms5(ICL).A.3.FindTheMate.tzx" size="3603" crc="99601feb" sha1="e3882c50454a6e2c84c8163e3876214488f7677c" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="Labyrinth"/>
+ <dataarea name="cass" size="3689">
+ <rom name="SuperPrograms5(ICL).B.1.Labyrinth.tzx" size="3689" crc="359e049f" sha1="1c65ab163592d0b5177dce56a7e590130cbc29a1" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass5" interface="zx81_cass">
+ <feature name="part_id" value="Drop A Brick"/>
+ <dataarea name="cass" size="3645">
+ <rom name="SuperPrograms5(ICL).B.2.DropABrick.tzx" size="3645" crc="40991b97" sha1="bca3bd107f5be45d7b1c2fcefcca3e108db822bf" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass6" interface="zx81_cass">
+ <feature name="part_id" value="Continental"/>
+ <dataarea name="cass" size="5575">
+ <rom name="SuperPrograms5(ICL).B.3.Continental.tzx" size="5575" crc="6a66aba2" sha1="6daf6f16e4aaa31e694e59e5904e01552568f921" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suprogs6">
+ <description>Super Programs 6</description>
+ <year>1981</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Galactic Invasion"/>
+ <dataarea name="cass" size="3160">
+ <rom name="SuperPrograms6.A.1.GalacticInvasion.tzx" size="3160" crc="f4ac496d" sha1="9b395818abb880100b1b98cd26fac43d2497980d" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Journey Into Danger"/>
+ <dataarea name="cass" size="7166">
+ <rom name="SuperPrograms6.A.2.JourneyIntoDanger.tzx" size="7166" crc="cb55142a" sha1="727aa6856c16bb8dc76e2882f5ee13ef99a26fa2" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Create"/>
+ <dataarea name="cass" size="2199">
+ <rom name="SuperPrograms6.A.3.Create.tzx" size="2199" crc="05e8bdc8" sha1="952870da255439d84a4050733b168d92bcdf4141" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="Nine Hole Golf"/>
+ <dataarea name="cass" size="3666">
+ <rom name="SuperPrograms6.B.1.NineHoleGolf.tzx" size="3666" crc="c1aa6465" sha1="7f3d92c72a9f750890bf130e207932eef7dbe5ca" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass5" interface="zx81_cass">
+ <feature name="part_id" value="Solitaire"/>
+ <dataarea name="cass" size="4705">
+ <rom name="SuperPrograms6.B.2.Solitaire.tzx" size="4705" crc="7634ad90" sha1="c011e9d3cca5f8d8ae9aa3536fdf73e7bd3ce8b8" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass6" interface="zx81_cass">
+ <feature name="part_id" value="Daylight Robbery"/>
+ <dataarea name="cass" size="4873">
+ <rom name="SuperPrograms6.B.3.DaylightRobbery.tzx" size="4873" crc="717db1fc" sha1="3a22694cae1bfdb851a7904036f390f8007a6039" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suprogs6i" cloneof="suprogs6">
+ <description>Super Programs 6 (ICL)</description>
+ <year>1981</year>
+ <publisher>ICL</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Galactic Invasion"/>
+ <dataarea name="cass" size="3160">
+ <rom name="SuperPrograms6(ICL).A.1.GalacticInvasion.tzx" size="3160" crc="f599e091" sha1="47bc24ee5d346cbd79e2f9649a001660808be20f" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Journet Into Danger"/>
+ <dataarea name="cass" size="7165">
+ <rom name="SuperPrograms6(ICL).A.2.JourneyIntoDanger.tzx" size="7165" crc="065ba444" sha1="1918279c378a1255b0dfea8e572614dab8668b99" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Create"/>
+ <dataarea name="cass" size="2199">
+ <rom name="SuperPrograms6(ICL).A.3.Create.tzx" size="2199" crc="526233da" sha1="c27401e82fb0509c3f59fc8565c863a4539720a4" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="Nine Hole Golf"/>
+ <dataarea name="cass" size="3666">
+ <rom name="SuperPrograms6(ICL).B.1.NineHoleGolf.tzx" size="3666" crc="07c9c015" sha1="2fe008f99ed2872c37f16360db972278bdbc1893" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass5" interface="zx81_cass">
+ <feature name="part_id" value="Solitaire"/>
+ <dataarea name="cass" size="4705">
+ <rom name="SuperPrograms6(ICL).B.2.Solitaire.tzx" size="4705" crc="e12d84e5" sha1="5b01a18d3869faa36ead5338c8c62b40da09d0c9" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass6" interface="zx81_cass">
+ <feature name="part_id" value="Daylight Robbery"/>
+ <dataarea name="cass" size="4873">
+ <rom name="SuperPrograms6(ICL).B.3.DaylightRobbery.tzx" size="4873" crc="54434b68" sha1="925c6e3d217722395083ff8e7e3cdc27276e4674" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suprogs7">
+ <description>Super Programs 7</description>
+ <year>1982</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Racetrack"/>
+ <dataarea name="cass" size="854">
+ <rom name="SuperPrograms7.A.1.Racetrack.tzx" size="854" crc="e2ff4848" sha1="9eb944619f57574455b11c21886cf0321c4f5ac4" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Chase"/>
+ <dataarea name="cass" size="888">
+ <rom name="SuperPrograms7.A.2.Chase.tzx" size="888" crc="de6e124d" sha1="e41a6835af2c2ebe21903a9a540b671d7833583c" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="NIM"/>
+ <dataarea name="cass" size="903">
+ <rom name="SuperPrograms7.A.3.NIM.tzx" size="903" crc="508fafd8" sha1="6a29270af2fcb4b41ec0e150b2deac5b8c47a46e" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="Tower of Hanoi"/>
+ <dataarea name="cass" size="910">
+ <rom name="SuperPrograms7.B.1.TowerOfHanoi.tzx" size="910" crc="43f00d5b" sha1="abb85608b97f38160c82ef4443783e2026776ef8" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass5" interface="zx81_cass">
+ <feature name="part_id" value="Docking The Spaceship"/>
+ <dataarea name="cass" size="817">
+ <rom name="SuperPrograms7.B.2.DockingTheSpaceship.tzx" size="817" crc="f1590e5a" sha1="9360f037520e313b0100447dbfed99287eb89744" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass6" interface="zx81_cass">
+ <feature name="part_id" value="Golf"/>
+ <dataarea name="cass" size="890">
+ <rom name="SuperPrograms7.B.3.Golf.tzx" size="890" crc="b8ae994d" sha1="133da4002f2266f8f8fc64e6032267d2bd9e1606" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suprogs7i" cloneof="suprogs7">
+ <description>Super Programs 7 (ICL)</description>
+ <year>1982</year>
+ <publisher>ICL</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Racetrack"/>
+ <dataarea name="cass" size="854">
+ <rom name="SuperPrograms7(ICL).A.1.Racetrack.tzx" size="854" crc="a2a7350c" sha1="3a6ad797d5a10d279b810fe1cf775359eb08f9fe" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Chase"/>
+ <dataarea name="cass" size="888">
+ <rom name="SuperPrograms7(ICL).A.2.Chase.tzx" size="888" crc="a8243583" sha1="f639274f9b3a766de8f006f835d3cb6a6ce0f55d" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="NIM"/>
+ <dataarea name="cass" size="903">
+ <rom name="SuperPrograms7(ICL).A.3.NIM.tzx" size="903" crc="1a8734e3" sha1="c1a55f27158bb4530b7f4d8894c8b5867964cfb1" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="Tower of Hanoi"/>
+ <dataarea name="cass" size="910">
+ <rom name="SuperPrograms7(ICL).B.1.TowerOfHanoi.tzx" size="910" crc="8e0c797b" sha1="05532827af43295f8560afa5e5408555839d8465" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass5" interface="zx81_cass">
+ <feature name="part_id" value="Docking The Spaceship"/>
+ <dataarea name="cass" size="817">
+ <rom name="SuperPrograms7(ICL).B.2.DockingTheSpaceship.tzx" size="817" crc="e3257465" sha1="13afe380c522066d8c4dc545437efc8738eee8da" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass6" interface="zx81_cass">
+ <feature name="part_id" value="Golf"/>
+ <dataarea name="cass" size="890">
+ <rom name="SuperPrograms7(ICL).B.3.Golf.tzx" size="890" crc="8e17a7c9" sha1="4b6b7a06437234ae62bed820bf88ccbc11bb1de2" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suprogs8">
+ <description>Super Programs 8</description>
+ <year>1982</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15192">
+ <rom name="SuperPrograms8.tzx" size="15192" crc="2aa20758" sha1="de665ebe1949e077934ed6f0961d525f274f3d6e" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="suprogs8i" cloneof="suprogs8">
+ <description>Super Programs 8 (ICL)</description>
+ <year>1982</year>
+ <publisher>ICL</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15192">
+ <rom name="SuperPrograms8(ICL).tzx" size="15192" crc="2532389a" sha1="a40650a76c57edc7a0431117fe9d9e5c4f47bb6b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="supscram">
+ <description>Super Scramble</description>
+ <year>1982</year>
+ <publisher>Software Farm</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="9312">
+ <rom name="SuperScramble.tzx" size="9312" crc="5f11c06c" sha1="aa22bb6ff4c10b8279f2c1e568db7b9ae5158ca6" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="supwump">
+ <description>Super Wumpus</description>
+ <year>1981</year>
+ <publisher>Silversoft</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16276">
+ <rom name="SuperWumpus.A.tzx" size="16276" crc="55734c5f" sha1="90f504b054627acbdfb3e87e410af9d80559ab3a" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <dataarea name="cass" size="16276">
+ <rom name="SuperWumpus.B.SuperWumpus(Alt).tzx" size="16276" crc="619c9515" sha1="9e2c635131e80f03c6e0877ba940b8f685f5735f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tablcoun">
+ <description>Tables Countdown</description>
+ <year>1981</year>
+ <publisher>AVC Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="9197">
+ <rom name="TablesCountdown.tzx" size="9197" crc="59bd7de7" sha1="71d4f85478e2eb9016bab2fd0fac0107a7fccdea" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tai">
+ <description>Tai</description>
+ <year>1982</year>
+ <publisher>PSS</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14237">
+ <rom name="Tai.tzx" size="14237" crc="3a1351f8" sha1="fd0a3ceac8ce8540e13c7e6af6f547a2feff5d8a" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="talkback">
+ <description>Talkback</description>
+ <year>1983</year>
+ <publisher>M.W.F.Ringrose</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="12740">
+ <rom name="Talkback.tzx" size="12740" crc="36724d18" sha1="6b32ff6dd4930ad62cadb59b3c4ecdb6eb4a2654" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tapebk50">
+ <description>Tapebook 50 1K</description>
+ <year>198?</year>
+ <publisher>Control Technology</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="37005">
+ <rom name="TapeBook50.tzx" size="37005" crc="d882bccd" sha1="0d1b30d4d024147c9489d56e0519f9f60bf75cbd" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tarot">
+ <description>Tarot</description>
+ <year>1983</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="29510">
+ <rom name="Tarot.tzx" size="29510" crc="5c63c324" sha1="81f1ab607044fd2b44c1163a0cb317dc1727d0a4" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tasword">
+ <description>Tasword</description>
+ <year>1982</year>
+ <publisher>Tasman Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5569">
+ <rom name="Tasword.tzx" size="5569" crc="9b77040a" sha1="100be588ad785f012f513e8043c323348b5e44ed" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="techlit">
+ <description>Technical Literacy Series</description>
+ <year>1983</year>
+ <publisher>National Education Corporation</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="VU-CALC"/>
+ <dataarea name="cass" size="5515">
+ <rom name="TechnicalLiteracySeries.1.VU-CALC.tzx" size="5515" crc="0982d2b9" sha1="efa769b0b1341958fc964c06a0b837ce4dcff235" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Self Test"/>
+ <dataarea name="cass" size="15670">
+ <rom name="TechnicalLiteracySeries.2.SelfTest.tzx" size="15670" crc="719dcf33" sha1="979d7e4d675e72d4f0e7430c3dbdc190254fea8e" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tempest">
+ <description>Tempest</description>
+ <year>198?</year>
+ <publisher>Mikro-Gen</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="3521">
+ <rom name="Tempest.tzx" size="3521" crc="5cca0ded" sha1="a4cfd1f82d0e4d255ae3b54a54f30a6cb96ce4f9" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ten1kgam">
+ <description>Ten 1K Games</description>
+ <year>1983</year>
+ <publisher>Computer Rentals</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7545">
+ <rom name="Ten1KGames.tzx" size="7545" crc="c724fd4a" sha1="589c68041f90a46fb8c18118c0889c6b8f91f0ca" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="throwall">
+ <description>Thro' The Wall also Scramble</description>
+ <year>1982</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Thro' The Wall"/>
+ <dataarea name="cass" size="2430">
+ <rom name="ThroTheWall.A.tzx" size="2430" crc="63a40505" sha1="baabd79e8c63ed10f6e04c15e9ca09faef86b83b" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Scramble"/>
+ <dataarea name="cass" size="4687">
+ <rom name="ThroTheWall.B.Scramble.tzx" size="4687" crc="1ddb4429" sha1="b0ba2b45caccde98acea961b78cf87b11aeb8840" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tombdrac">
+ <description>Tomb of Dracula</description>
+ <year>198?</year>
+ <publisher>Moviedrome Video</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14743">
+ <rom name="TombOfDracula.tzx" size="14743" crc="ef2a3f64" sha1="e883c6e1992ddd67a82e66709211d024b563aa36" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tombdracf" cloneof="tombdrac">
+ <description>Tomb of Dracula (Felix)</description>
+ <year>1982</year>
+ <publisher>Felix Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14743">
+ <rom name="TombOfDracula.tzx" size="14743" crc="ef2a3f64" sha1="e883c6e1992ddd67a82e66709211d024b563aa36" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="toolkit">
+ <description>Toolkit</description>
+ <year>198?</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="3820">
+ <rom name="Toolkit.tzx" size="3820" crc="c015038b" sha1="422fadbdf7cfc0da1e6fdfd101f1d613581ed884" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="toolkita" cloneof="toolkit">
+ <description>Toolkit (Artic)</description>
+ <year>198?</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="3802">
+ <rom name="Toolkit(Artic).tzx" size="3802" crc="4743b221" sha1="049169deb7c4c760d79dd66fdf49172d5a77d776" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="toolkitjrs">
+ <description>Toolkit (JRS)</description>
+ <year>1982</year>
+ <publisher>JRS Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="2318">
+ <rom name="Toolkit(JRS).tzx" size="2318" crc="5c378f0f" sha1="2121e140989dc586810bec4e1399de1007924286" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="trace">
+ <description>Trace</description>
+ <year>1983</year>
+ <publisher>Texgate</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="3474">
+ <rom name="Trace.tzx" size="3474" crc="b43432d2" sha1="68ea27c33ee7b25628862ebd51bf07b716aa0d57" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="trader">
+ <description>Trader</description>
+ <year>1982</year>
+ <publisher>Quicksilva</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="49461">
+ <rom name="Trader.tzx" size="49461" crc="41c24497" sha1="37fd173296fb68815ca87544977b354c44a54d9e" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="traderjwl" cloneof="trader">
+ <description>Trader (Jewel)</description>
+ <year>1982</year>
+ <publisher>Pixel Productions</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="49639">
+ <rom name="Trader(Jewel).tzx" size="49639" crc="01e4ec2a" sha1="0082993bf62f04b69581990f052786daeea5620c" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="traffic">
+ <description>Traffic</description>
+ <year>1984</year>
+ <publisher>Loriciels</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7030">
+ <rom name="Traffic.tzx" size="7030" crc="be09c247" sha1="44626d460f9c918c4bc9e0611737b50215c73a3c" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tsdestry">
+ <description>TS Destroyer and Space Raid</description>
+ <year>198?</year>
+ <publisher>Softsync</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="TS Destroyer"/>
+ <dataarea name="cass" size="2159">
+ <rom name="TSDestroyerAndSpaceRaid.A.TSDestroyer.tzx" size="2159" crc="89fa656a" sha1="370a08ef933fbd91f6afa8f9e4d0ba3d0f0c8532" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Space Raid"/>
+ <dataarea name="cass" size="1379">
+ <rom name="TSDestroyerAndSpaceRaid.B.SpaceRaid.tzx" size="1379" crc="f7d4f75d" sha1="c8028d42f5fc1830869a8a7aa84572078545307b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tgerman">
+ <description>Tutor German</description>
+ <year>1983</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="13869">
+ <rom name="TutorGerman.tzx" size="13869" crc="44ddecba" sha1="058f24ef7be7494a90cd9799cd68b07e78169b95" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tspanish">
+ <description>Tutor Spanish</description>
+ <year>1983</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15219">
+ <rom name="TutorSpanish.tzx" size="15219" crc="4d62869a" sha1="e12aabea86ff2542821bd04cdf6e2868f1d3f5d7" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="trex">
+ <description>Tyrannosaure Rex</description>
+ <year>1982</year>
+ <publisher>Informatique Service</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="11728">
+ <rom name="TyrannosaureRex.tzx" size="11728" crc="5300e4d1" sha1="cb0caa82180a19407cd5e850ca88ca33e12b8efc" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="tyrathens">
+ <description>Tyrant of Athens</description>
+ <year>1982</year>
+ <publisher>Lothlorien</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="13068">
+ <rom name="TyrantOfAthens.tzx" size="13068" crc="fc3fd4f8" sha1="882b644962f09d68bc813563478d773c3a07115b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="udg">
+ <description>UDG</description>
+ <year>1981</year>
+ <publisher>dK'tronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="8150">
+ <rom name="UDG.tzx" size="8150" crc="66a2453f" sha1="0fefc639d3c9a6c2ed2a5d994f94ee0691e0dca5" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ufo">
+ <description>UFO</description>
+ <year>1983</year>
+ <publisher>Protek</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5380">
+ <rom name="UFO.tzx" size="5380" crc="6b8cbcec" sha1="f9bd4f690cb67fa718154cb9f07d63e8103a8c4f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="ufo3dmaze">
+ <description>UFO + 3D Maze</description>
+ <year>1982</year>
+ <publisher>Babtech</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="13279">
+ <rom name="UFOAnd3DMaze.tzx" size="13279" crc="cc63dfdf" sha1="07a8d839b7202b3846fd8f1f84025000fb222f58" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="varanaly">
+ <description>Variance Analyzer</description>
+ <year>198?</year>
+ <publisher>Zeta Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="8407">
+ <rom name="VarianceAnalyzer.tzx" size="8407" crc="90a5774a" sha1="a429c8165b8be52791c99e5da26a84758a4c508b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="vectmath">
+ <description>Vector Mathematics</description>
+ <year>1982</year>
+ <publisher>W.H.Smith</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="12101">
+ <rom name="VectorMathematics.tzx" size="12101" crc="c33b86ba" sha1="b82230bcc7f57f7b1f12720d82440031135be44b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="videoad">
+ <description>Video-Ad</description>
+ <year>1981</year>
+ <publisher>Video Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15281">
+ <rom name="VideoAd.A.tzx" size="15281" crc="42136adc" sha1="c2409cd598ce050d622eb8850e21d74d709060eb" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="vidgraff">
+ <description>Video Graffiti</description>
+ <year>1982</year>
+ <publisher>AGF Hardware</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5263">
+ <rom name="VideoGraffiti.tzx" size="5263" crc="dd2ecb00" sha1="cf2e6cee862cc503be44bf2e6621a2e8d005c521" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="videomap">
+ <description>Video-Map</description>
+ <year>1981</year>
+ <publisher>Video Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15713">
+ <rom name="VideoMap.A.tzx" size="15713" crc="b76622dc" sha1="86d292def89f2cd01bdf677f50abdb18002507a6" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="videoplan">
+ <description>Video-Plan</description>
+ <year>1981</year>
+ <publisher>Video Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15425">
+ <rom name="VideoPlan.A.tzx" size="15425" crc="849e21dc" sha1="fffa47475a0634fc9859212e5a309603d922d258" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="videoview">
+ <description>Video-View</description>
+ <year>1981</year>
+ <publisher>Video Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14095">
+ <rom name="VideoView.tzx" size="14095" crc="f5fdb04b" sha1="abadd8bd7a829c778d6fbf1d4f394025cd1b7c58" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="viewtext">
+ <description>Viewtext (US)</description>
+ <year>1981</year>
+ <publisher>Bug Byte</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="12767">
+ <rom name="Viewtext(US).tzx" size="12767" crc="83f14397" sha1="eb0996ddb294a42c133b0c301958bdaa3b5f4a1a" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="viziz">
+ <description>Vizi/Z</description>
+ <year>198?</year>
+ <publisher>&lt;unknown&gt;</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side A"/>
+ <dataarea name="cass" size="7904">
+ <rom name="ViziZ.A.tzx" size="7904" crc="71b8efed" sha1="5f0c6b77005b1d208fa215850ba143862a64b65c" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side B"/>
+ <dataarea name="cass" size="9663">
+ <rom name="ViziZ.B.tzx" size="9663" crc="6dd0fec7" sha1="1a6230a1ec85e93b458b32143a306dbe7dd8bce1" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="volcdung">
+ <description>Volcanic Dungeon</description>
+ <year>1982</year>
+ <publisher>Carnell</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16482">
+ <rom name="VolcanicDungeon.tzx" size="16482" crc="c6f44894" sha1="6275899b3b7849a97ca8ea869d2bc5806522ae9a" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="vucalc">
+ <description>VU-CALC</description>
+ <year>1982</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5781">
+ <rom name="VU-CALC.tzx" size="5781" crc="221479df" sha1="50275ce9c48f4f3533899a00c5291bdade4a1efe" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="vucalct" cloneof="vucalc">
+ <description>VU-CALC (Timex)</description>
+ <year>1982</year>
+ <publisher>Timex</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5779">
+ <rom name="VU-CALC(Timex).tzx" size="5779" crc="3db82474" sha1="d1533151dfecf9614c55551e0d6bbab85bce9c3c" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="vufile">
+ <description>VU-FILE</description>
+ <year>1982</year>
+ <publisher>Sinclair Research</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="VU-FILE"/>
+ <dataarea name="cass" size="6351">
+ <rom name="VU-FILE.A.tzx" size="6351" crc="3db90601" sha1="4e555b254750353dc58f329ec5c2363b65f9d5dc" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Gazetteer"/>
+ <dataarea name="cass" size="16458">
+ <rom name="VU-FILE.B.Gazetteer.tzx" size="16458" crc="81c7bd27" sha1="e152715cd23ba870a8db2f63050928cfe9524510" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="walkplank">
+ <description>Walk The Plank</description>
+ <year>198?</year>
+ <publisher>Novus Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Side 1"/>
+ <dataarea name="cass" size="12533">
+ <rom name="WalkThePlank.A.Side1.tzx" size="12533" crc="b97cc2cb" sha1="f4c3dc4a0b6651fb64b86738f7cc69aa05710ce5" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Side 2"/>
+ <dataarea name="cass" size="12881">
+ <rom name="WalkThePlank.B.Side2.tzx" size="12881" crc="b513f1a7" sha1="b4a3aeb2928215f1ba59009ba5023310299df902" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="warlord">
+ <description>Warlord</description>
+ <year>1982</year>
+ <publisher>Lothlorien</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="15879">
+ <rom name="Warlord.tzx" size="15879" crc="9bff8537" sha1="dee7757fc095d4de68efcd4147777e0cbbad8424" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="whizquiz">
+ <description>Whizz Quiz</description>
+ <year>1983</year>
+ <publisher>Computertutor</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16252">
+ <rom name="WhizzQuiz.tzx" size="16252" crc="831e3890" sha1="81b7fa7bc053ea09617edd5428ea8b9bc7d8e4d2" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wingedav">
+ <description>Winged Avenger</description>
+ <year>1982</year>
+ <publisher>Work Force</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="4004">
+ <rom name="WingedAvenger.tzx" size="4004" crc="18536d36" sha1="b3ecbf77bb7d691bd1b973ede3774bf3a54a1494" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordgraf">
+ <description>Wordfix/Grafix</description>
+ <year>1982</year>
+ <publisher>Cosma</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Wordfix"/>
+ <dataarea name="cass" size="6476">
+ <rom name="WordfixGrafix.A.Wordfix.tzx" size="6476" crc="a954d55a" sha1="43a832c93f954ac9a08956fb3d7e8343098d8b46" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Grafix"/>
+ <dataarea name="cass" size="6428">
+ <rom name="WordfixGrafix.B.Grafix.tzx" size="6428" crc="e1a89114" sha1="935d2a49b962b0dda2e9c683f71da136033f36ae" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordpak1">
+ <description>Wordpack 1</description>
+ <year>1982</year>
+ <publisher>Wida</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Multiple Choice"/>
+ <dataarea name="cass" size="6742">
+ <rom name="Wordpack1.A.MultipleChoice.tzx" size="6742" crc="4e1eceef" sha1="00bb97fe7b13a581fd15f4bba3a72bfbfcd41ec8" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Odd Man Out"/>
+ <dataarea name="cass" size="6665">
+ <rom name="Wordpack1.B.OddManOut.tzx" size="6665" crc="791883d3" sha1="1517cb72fa27e46842d4d112e982e9b0111c358c" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordpak2">
+ <description>Wordpack 2</description>
+ <year>1982</year>
+ <publisher>Wida</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Word Test"/>
+ <dataarea name="cass" size="6859">
+ <rom name="Wordpack2.A.WordTest.tzx" size="6859" crc="2a14c0bd" sha1="536a8e93b70b09e3dfbe05448fb1035bbab2164f" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Match It"/>
+ <dataarea name="cass" size="6445">
+ <rom name="Wordpack2.B.MatchIt.tzx" size="6445" crc="4bdc8c35" sha1="56702d08c40e37499cb2f1152cf68b0dd7305da5" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordpak3">
+ <description>Wordpack 3</description>
+ <year>1982</year>
+ <publisher>Wida</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Jackpot"/>
+ <dataarea name="cass" size="10681">
+ <rom name="Wordpack3.A.Jackpot.tzx" size="10681" crc="db066df2" sha1="6c8e61671c9d0bb69b3c1f333522b6429fac00a8" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Snap"/>
+ <dataarea name="cass" size="7191">
+ <rom name="Wordpack3.B.Snap.tzx" size="7191" crc="2ea27107" sha1="b05e87ddfd62bffc29d2f1cbf5c50dfb0f4903d1" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordpak4">
+ <description>Wordpack 4</description>
+ <year>1982</year>
+ <publisher>Wida</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Crossword"/>
+ <dataarea name="cass" size="10506">
+ <rom name="Wordpack4.A.Crossword.tzx" size="10506" crc="267a88c1" sha1="276fd7e35e0981944dbc51b3709c9ad0eb5c006d" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Anagrams"/>
+ <dataarea name="cass" size="8249">
+ <rom name="Wordpack4.B.Anagrams.tzx" size="8249" crc="f5539229" sha1="83421388f3e88f8eef7e7eb67de8f55510d56f24" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordplay">
+ <description>Wordplay</description>
+ <year>198?</year>
+ <publisher>Apropos Technology</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Jargon"/>
+ <dataarea name="cass" size="5167">
+ <rom name="Wordplay.1.Jargon.tzx" size="5167" crc="f6e6c5d0" sha1="ece99d5a988ed91380ffd0bbc75b3b5009b71e15" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Story"/>
+ <dataarea name="cass" size="4515">
+ <rom name="Wordplay.2.Story.tzx" size="4515" crc="8945f08a" sha1="4af26f31977dbe1b1ec40b98d84d3eab165741b5" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Haiku"/>
+ <dataarea name="cass" size="10452">
+ <rom name="Wordplay.3.Haiku.tzx" size="10452" crc="6a4927a6" sha1="c6614dd7f369eb4d73f4a1a3434d5784cc7a3ab0" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="Animal"/>
+ <dataarea name="cass" size="15862">
+ <rom name="Wordplay.4.Animal.tzx" size="15862" crc="5be90689" sha1="c61a351cc4a3c0953c921dd9dd2fe77ee0d7b3f4" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass5" interface="zx81_cass">
+ <feature name="part_id" value="Secret"/>
+ <dataarea name="cass" size="3132">
+ <rom name="Wordplay.5.Secret.tzx" size="3132" crc="932d959b" sha1="2c43dfe98300b4e21a9e7f8e4f944cd16c42c0a0" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordply1">
+ <description>Wordplay 1</description>
+ <year>1983</year>
+ <publisher>Griffin Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Word Play 1"/>
+ <dataarea name="cass" size="12494">
+ <rom name="WordPlay1.A.tzx" size="12494" crc="eed05457" sha1="83f523d4fcd7bf1e7cbb5c5b6e6ade98cbf460a3" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Word Cross"/>
+ <dataarea name="cass" size="11452">
+ <rom name="WordPlay1.B.Wordcross.tzx" size="11452" crc="9404c5ca" sha1="6ce76cd4fb237b42bc2145b3a3d61885939b5e9d" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordproc">
+ <description>Word Processor</description>
+ <year>198?</year>
+ <publisher>Alan's Recordings</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="12384">
+ <rom name="WordProcessor.A.tzx" size="12384" crc="c1f41d1c" sha1="4f2e76139efb5a07b443c5495636bcbb42489241" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wordtest">
+ <description>Word Test</description>
+ <year>1982</year>
+ <publisher>Mindware</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="1133">
+ <rom name="WordTest.1.WordTest.tzx" size="1133" crc="e12825a4" sha1="a17549ce398aa7c4955e6a691fd27dbce089db4a" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="wcupfball">
+ <description>World Cup Football</description>
+ <year>1982</year>
+ <publisher>M.A.Smith</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="10657">
+ <rom name="WorldCupFootball.tzx" size="10657" crc="685d01ce" sha1="d081ccd8b759a2866bff5676a112481bb73d5f88" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zxtricat">
+ <description>Z-Xtricator</description>
+ <year>1984</year>
+ <publisher>Software Farm</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Z-Xtricator"/>
+ <dataarea name="cass" size="6535">
+ <rom name="Z-Xtricator.1.Xtricator.tzx" size="6535" crc="016b7276" sha1="bec7653d038ab37b604ce36d97d355147354dfbd" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Screen"/>
+ <dataarea name="cass" size="8701">
+ <rom name="Z-Xtricator.2.Screen.tzx" size="8701" crc="e709d4d6" sha1="4e0450d80f86ca2cc40c353b077f55c2f742275a" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zacman">
+ <description>Zac-Man</description>
+ <year>198?</year>
+ <publisher>Macronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7111">
+ <rom name="ZacMan.tzx" size="7111" crc="76fca436" sha1="e4271947dfab4c3eeb64a5927cda4d25445a0e53" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zaraks">
+ <description>Zaraks</description>
+ <year>1983</year>
+ <publisher>Computer Rentals</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="3923">
+ <rom name="Zaraks.tzx" size="3923" crc="4466c390" sha1="d4d0575f849ed626a6d2b02cc3d64660980694c5" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zombies">
+ <description>Zombies/Sword of Peace</description>
+ <year>198?</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="12404">
+ <rom name="ZombiesSwordOfPeace.tzx" size="12404" crc="45500520" sha1="519d3115b5ceb75b61dff442a927be851fb0ca96" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zuckman">
+ <description>Zuckman</description>
+ <year>1982</year>
+ <publisher>DJL Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="10169">
+ <rom name="Zuckman.tzx" size="10169" crc="c80badf3" sha1="e212c3315d69861422dee61af487f6729568520a" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zuckmanb" cloneof="zuckman">
+ <description>Zuckman (Black Inlay)</description>
+ <year>1982</year>
+ <publisher>DJL Software</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="10169">
+ <rom name="Zuckman(Alt).tzx" size="10169" crc="886fa5b4" sha1="87f7870077134b24dfc9bab9e406762bd7ff6d04" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zxpbook">
+ <description>The ZX81 Pocket Book</description>
+ <year>1982</year>
+ <publisher>Phipps Associates</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Introduction"/>
+ <dataarea name="cass" size="729">
+ <rom name="ZX81PocketBookThe.A.1.Introduction.tzx" size="729" crc="aed958ef" sha1="d3222f94b6e5cd1b87daf0d45cd1ab2a0672ae2b" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Pinning the Tail on the Donkey"/>
+ <dataarea name="cass" size="956">
+ <rom name="ZX81PocketBookThe.A.2.PinningTheTailOnTheDonkey.tzx" size="956" crc="98e6dfe5" sha1="3464b3a508712aee1db8ab35ff9e776c3714d618" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Read"/>
+ <dataarea name="cass" size="607">
+ <rom name="ZX81PocketBookThe.A.3.Read.tzx" size="607" crc="d9d9044e" sha1="0c9a1f4793c151d08b351c6ff6b68ab10b0cc2ad" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="Bucket"/>
+ <dataarea name="cass" size="874">
+ <rom name="ZX81PocketBookThe.A.4.Bucket.tzx" size="874" crc="50b507c2" sha1="670e346613a48714b476369b22408679a11e50c8" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass5" interface="zx81_cass">
+ <feature name="part_id" value="Eyeball"/>
+ <dataarea name="cass" size="770">
+ <rom name="ZX81PocketBookThe.A.5.Eyeball.tzx" size="770" crc="6a9d7e50" sha1="229f3641e6a32055be4e28e4584d3f28d5cbf116" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass6" interface="zx81_cass">
+ <feature name="part_id" value="Etch"/>
+ <dataarea name="cass" size="674">
+ <rom name="ZX81PocketBookThe.A.6.Etch.tzx" size="674" crc="4d1c7bfd" sha1="378e3b29cbc0213ae13d33beaee1c8b5ebbdd4ac" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass7" interface="zx81_cass">
+ <feature name="part_id" value="Clock"/>
+ <dataarea name="cass" size="959">
+ <rom name="ZX81PocketBookThe.A.7.Clock.tzx" size="959" crc="9ef8ba8d" sha1="34310d127bb67fb833c0c6792991bf4f9e390b79" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass8" interface="zx81_cass">
+ <feature name="part_id" value="Artist"/>
+ <dataarea name="cass" size="484">
+ <rom name="ZX81PocketBookThe.A.8.Artist.tzx" size="484" crc="748afc76" sha1="b642120b1cfa6b4319f7090a9b2448028ea98b01" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass9" interface="zx81_cass">
+ <feature name="part_id" value="VatCalc"/>
+ <dataarea name="cass" size="809">
+ <rom name="ZX81PocketBookThe.A.9.VatCalc.tzx" size="809" crc="b402818c" sha1="da48d319b3b539949df5b128d62abe0e0e15c7a2" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass10" interface="zx81_cass">
+ <feature name="part_id" value="Just2"/>
+ <dataarea name="cass" size="559">
+ <rom name="ZX81PocketBookThe.A.10.Just2.tzx" size="559" crc="ca2749fe" sha1="9a0ef3ffc8dd586617b805978c327f321d391810" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass11" interface="zx81_cass">
+ <feature name="part_id" value="JustN"/>
+ <dataarea name="cass" size="576">
+ <rom name="ZX81PocketBookThe.A.11.JustN.tzx" size="576" crc="21f447a4" sha1="ebc353a313c9b8763b3f5427e47fbb17a0535291" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass12" interface="zx81_cass">
+ <feature name="part_id" value="JustU"/>
+ <dataarea name="cass" size="724">
+ <rom name="ZX81PocketBookThe.A.12.JustU.tzx" size="724" crc="ae8aa931" sha1="21fcf855e5251e8e75975417728a49a6bb39174b" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass13" interface="zx81_cass">
+ <feature name="part_id" value="StdDev"/>
+ <dataarea name="cass" size="738">
+ <rom name="ZX81PocketBookThe.A.13.StdDev.tzx" size="738" crc="a783def1" sha1="f23db410ff669bf2f62a2c81b7eb9bc961430a11" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass14" interface="zx81_cass">
+ <feature name="part_id" value="RAMTOP"/>
+ <dataarea name="cass" size="603">
+ <rom name="ZX81PocketBookThe.A.14.RAMTOP.tzx" size="603" crc="c1662206" sha1="f06256532ad79674da292cfb3a13ef43a36c2e28" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass15" interface="zx81_cass">
+ <feature name="part_id" value="Loader"/>
+ <dataarea name="cass" size="614">
+ <rom name="ZX81PocketBookThe.A.15.Loader.tzx" size="614" crc="71720fb5" sha1="5920fe24749f06022f3884cb7d9fc280b4959901" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass16" interface="zx81_cass">
+ <feature name="part_id" value="Selector"/>
+ <dataarea name="cass" size="701">
+ <rom name="ZX81PocketBookThe.A.16.Selector.tzx" size="701" crc="2a966786" sha1="d3aae0a46cb7b760a157816e93d7978b47154e30" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass17" interface="zx81_cass">
+ <feature name="part_id" value="Dump"/>
+ <dataarea name="cass" size="813">
+ <rom name="ZX81PocketBookThe.A.17.Dump.tzx" size="813" crc="28caf50c" sha1="4b81c89dd84541e474b5a031b73a714986180b21" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass18" interface="zx81_cass">
+ <feature name="part_id" value="Dice"/>
+ <dataarea name="cass" size="820">
+ <rom name="ZX81PocketBookThe.A.18.Dice.tzx" size="820" crc="97aafba1" sha1="01300e3ca51fbb22f0eeb7c2ea35a42bb51eacf7" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass19" interface="zx81_cass">
+ <feature name="part_id" value="Val"/>
+ <dataarea name="cass" size="511">
+ <rom name="ZX81PocketBookThe.A.19.Val.tzx" size="511" crc="1d8aa9f1" sha1="c27db7543e4b16f08f7dd2fde01bd522e6bbdf09" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass20" interface="zx81_cass">
+ <feature name="part_id" value="Fruit"/>
+ <dataarea name="cass" size="915">
+ <rom name="ZX81PocketBookThe.A.20.Fruit.tzx" size="915" crc="19d5ee64" sha1="47ef81e1679341cc607c0bd2eeef1b6b4bf1653b" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass21" interface="zx81_cass">
+ <feature name="part_id" value="Reverse"/>
+ <dataarea name="cass" size="902">
+ <rom name="ZX81PocketBookThe.A.21.Reverse.tzx" size="902" crc="512cdb32" sha1="430f455195212b287166b0badab3ee8ae5b7eaa7" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass22" interface="zx81_cass">
+ <feature name="part_id" value="Instr"/>
+ <dataarea name="cass" size="555">
+ <rom name="ZX81PocketBookThe.A.22.Instr.tzx" size="555" crc="19e3a83b" sha1="bb44204a987298f17f6b52f660df45685a30c9d1" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass23" interface="zx81_cass">
+ <feature name="part_id" value="Intro16"/>
+ <dataarea name="cass" size="3771">
+ <rom name="ZX81PocketBookThe.B.1.Intro16.tzx" size="3771" crc="94b3c46e" sha1="ce5da3c8cde7e2a28284b2ae9f059f0bc60c1d63" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass24" interface="zx81_cass">
+ <feature name="part_id" value="Quiz"/>
+ <dataarea name="cass" size="2320">
+ <rom name="ZX81PocketBookThe.B.2.Quiz.tzx" size="2320" crc="ec6ebcc1" sha1="4f07700990e23d2de1412889b5be5536610e6517" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass25" interface="zx81_cass">
+ <feature name="part_id" value="Ski"/>
+ <dataarea name="cass" size="3359">
+ <rom name="ZX81PocketBookThe.B.3.Ski.tzx" size="3359" crc="9f5a9939" sha1="05f4f85a0714f7be57eeffb0756026a628da57a0" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass26" interface="zx81_cass">
+ <feature name="part_id" value="Putting"/>
+ <dataarea name="cass" size="4568">
+ <rom name="ZX81PocketBookThe.B.4.Putting.tzx" size="4568" crc="e0e50b13" sha1="f25721e4d4da86bebc1357acde8838bdbaecac5f" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass27" interface="zx81_cass">
+ <feature name="part_id" value="Trolls"/>
+ <dataarea name="cass" size="4211">
+ <rom name="ZX81PocketBookThe.B.5.Trolls.tzx" size="4211" crc="a34276d8" sha1="4bfa5fe9927a22d5e1903b81c775debe7253cb10" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass28" interface="zx81_cass">
+ <feature name="part_id" value="Artist16"/>
+ <dataarea name="cass" size="1725">
+ <rom name="ZX81PocketBookThe.B.6.Artist16.tzx" size="1725" crc="afe66eb3" sha1="feda2de00e3a35b5bb2b05d8cdf5afb0ea2d03ee" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass29" interface="zx81_cass">
+ <feature name="part_id" value="Jaws"/>
+ <dataarea name="cass" size="3234">
+ <rom name="ZX81PocketBookThe.B.7.Jaws.tzx" size="3234" crc="841cd08e" sha1="5f6925c1f598233da0f06cacb15e97dadf60fd0b" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass30" interface="zx81_cass">
+ <feature name="part_id" value="Dump16"/>
+ <dataarea name="cass" size="2362">
+ <rom name="ZX81PocketBookThe.B.8.Dump16.tzx" size="2362" crc="e7d1fba1" sha1="9b55b68de8ecb521ada556b4c277b6351053455a" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass31" interface="zx81_cass">
+ <feature name="part_id" value="Fruit16"/>
+ <dataarea name="cass" size="2082">
+ <rom name="ZX81PocketBookThe.B.9.Fruit16.tzx" size="2082" crc="2a885695" sha1="19af590c265802a30885eefb399d1ab564a568b0" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass32" interface="zx81_cass">
+ <feature name="part_id" value="Alzan"/>
+ <dataarea name="cass" size="12105">
+ <rom name="ZX81PocketBookThe.B.10.Alzan.tzx" size="12105" crc="731b8d49" sha1="c01b68b9ac1e644842a9b56c5a68617051a9c0c2" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass33" interface="zx81_cass">
+ <feature name="part_id" value="Advent"/>
+ <dataarea name="cass" size="6099">
+ <rom name="ZX81PocketBookThe.B.11.Advent.tzx" size="6099" crc="4255d5a6" sha1="8d6c4a7002c2bf0fc2b1dc653b57d780c2d43f32" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass34" interface="zx81_cass">
+ <feature name="part_id" value="Wumpus"/>
+ <dataarea name="cass" size="5246">
+ <rom name="ZX81PocketBookThe.B.12.Wumpus.tzx" size="5246" crc="5033fae2" sha1="c9940e474c3b0bfe3a4fac5bcfbd550c8920f53a" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zxactpac">
+ <description>ZX Action Pack</description>
+ <year>1982</year>
+ <publisher>Axis</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="4677">
+ <rom name="ZXActionPack.tzx" size="4677" crc="f5f95245" sha1="a97dbf23ee4788951617cc26e8bbd2987d3a4cd6" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zxas">
+ <description>ZXAS Assembler</description>
+ <year>1982</year>
+ <publisher>Bug Byte</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5843">
+ <rom name="ZXAS.tzx" size="5843" crc="fa15514c" sha1="0422f7eca685e2ee3981c86e44624b8ff0ff8aca" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zxasg" cloneof="zxas">
+ <description>ZXAS Assembler (Gladstone)</description>
+ <year>198?</year>
+ <publisher>Gladstone Electronics</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5843">
+ <rom name="ZXAS(GE).tzx" size="5843" crc="a448e4ba" sha1="e09abff8f1c771b7e1ace6b6612eb99dfa539654" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zxassemb">
+ <description>ZX Assembler</description>
+ <year>198?</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7564">
+ <rom name="ZXAssembler.tzx" size="7564" crc="99c7faec" sha1="7fe0c1c9dfbdff0e3f1c4274e09a19eb3ac88a59" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zxassembi" cloneof="zxassemb">
+ <description>ZX Assembler (IPS)</description>
+ <year>1982</year>
+ <publisher>International Publishing &amp; Software Inc.</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7564">
+ <rom name="ZXAssembler.tzx" size="7564" crc="99c7faec" sha1="7fe0c1c9dfbdff0e3f1c4274e09a19eb3ac88a59" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zxassembf" cloneof="zxassemb">
+ <description>ZX Assembleur</description>
+ <year>1982</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="9197">
+ <rom name="ZXAssembleur.tzx" size="9197" crc="aa532026" sha1="02a75242aabfbfa1d233b134df53727d5b8f597b" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zxasterd">
+ <description>ZX Asteroids</description>
+ <year>1982</year>
+ <publisher>Electric Pencil Company</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="6280">
+ <rom name="ZXAsteroids.tzx" size="6280" crc="c92d5c86" sha1="bc223f7b59f8ba07d7faf1da62f5a408034c568c" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zxbug">
+ <description>ZX Bug</description>
+ <year>1981</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5572">
+ <rom name="ZXBug.tzx" size="5572" crc="b77b6a0d" sha1="5f513d59c871aa94dd8d1c1919fea0e8d5aae806" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zxbugi" cloneof="zxbug">
+ <description>ZX Bug (IPS)</description>
+ <year>1982</year>
+ <publisher>International Publishing &amp; Software Inc.</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="5576">
+ <rom name="ZXBug(IPS).tzx" size="5576" crc="f8959e82" sha1="446c92783f64ea88a3faf3f0d5338223995d99a5" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zxchess1">
+ <description>ZX Chess I</description>
+ <year>198?</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14337">
+ <rom name="ZXChessI(Black).tzx" size="14337" crc="98f8fd30" sha1="b2ee8fb73779fc8b13b1bec533e59d762f6f871f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zxchess2">
+ <description>ZX Chess II</description>
+ <year>1981</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14422">
+ <rom name="ZXChessII.tzx" size="14422" crc="90f0224c" sha1="1e99cb497498e471f5f0aeb85c79d292208107b2" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zxchess2im" cloneof="zxchess2">
+ <description>ZX Chess II (Improved)</description>
+ <year>1981</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14326">
+ <rom name="ZXChessII(Improved).tzx" size="14326" crc="60bbdc66" sha1="a4238332fe59d8e4e7048069cb6e26c0b357c16d" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zxchess2i" cloneof="zxchess2">
+ <description>ZX Chess II (IPS)</description>
+ <year>1982</year>
+ <publisher>International Publishing &amp; Software Inc.</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="14326">
+ <rom name="ZXChessII(IPS).tzx" size="14326" crc="e300ffc8" sha1="d06522009c0438e7e201611c1ec10e17650dbf39" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zxcompen">
+ <description>ZX Compendium</description>
+ <year>1983</year>
+ <publisher>Carnell</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <feature name="part_id" value="Load Test"/>
+ <dataarea name="cass" size="1241">
+ <rom name="ZXCompendium.1A.1.LoadTest.tzx" size="1241" crc="abd8ab41" sha1="7d0958afa5d506be5461cbc68b6b3256b06f6bef" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <feature name="part_id" value="Hangman"/>
+ <dataarea name="cass" size="10392">
+ <rom name="ZXCompendium.1A.2.Hangman.tzx" size="10392" crc="0d0d368e" sha1="a72d44f25258b65d72d5af1b1fb53822c5582539" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass3" interface="zx81_cass">
+ <feature name="part_id" value="Side 1A"/>
+ <dataarea name="cass" size="11526">
+ <rom name="ZXCompendium.1A.tzx" size="11526" crc="7c792388" sha1="443bd91fac10c7dd46b47edbb42787e074b7b09a" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass4" interface="zx81_cass">
+ <feature name="part_id" value="Numerology"/>
+ <dataarea name="cass" size="14685">
+ <rom name="ZXCompendium.1B.1.Numerology.tzx" size="14685" crc="bd762cca" sha1="9c38947b9acf439e86de05af31a7cda6465956a4" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass5" interface="zx81_cass">
+ <feature name="part_id" value="Hieroglyphics"/>
+ <dataarea name="cass" size="16490">
+ <rom name="ZXCompendium.1B.2.Hieroglyphics.tzx" size="16490" crc="3a8f8a3b" sha1="a9d8dfbde27126837b903866f4e9482479c24682" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass6" interface="zx81_cass">
+ <feature name="part_id" value="Side 2A"/>
+ <dataarea name="cass" size="17328">
+ <rom name="ZXCompendium.2A.tzx" size="17328" crc="607b744e" sha1="71f121de1c7f985185e72797ff71a94445e77c76" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass7" interface="zx81_cass">
+ <feature name="part_id" value="Movie Mogul"/>
+ <dataarea name="cass" size="16423">
+ <rom name="ZXCompendium.2B.1.MovieMogul.tzx" size="16423" crc="506f420c" sha1="e9955ca7a8e6ab9e4b6612fd3e80c30b13d3a76d" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass8" interface="zx81_cass">
+ <feature name="part_id" value="Wumpus Adventure"/>
+ <dataarea name="cass" size="16225">
+ <rom name="ZXCompendium.2B.2.WumpusAdventure.tzx" size="16225" crc="94002652" sha1="362f75246a84a49c4f7b3f68adf9768f9d8fec86" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zxcompil">
+ <description>ZX Compiler</description>
+ <year>1982</year>
+ <publisher>Silversoft</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="7163">
+ <rom name="ZXCompiler.tzx" size="7163" crc="491041a6" sha1="09cecbec3370cfd1ff77e316c69661132f2e932f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zxdb">
+ <description>ZXDB Disassembler/Debugger</description>
+ <year>1982</year>
+ <publisher>Bug Byte</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="6081">
+ <rom name="ZXDB.tzx" size="6081" crc="f4bd2dc5" sha1="33604f3874337c4a579b9d1c6fb0d56887d2a128" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zxforth">
+ <description>ZX Forth</description>
+ <year>198?</year>
+ <publisher>Artic</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="20567">
+ <rom name="ZXForth.tzx" size="20567" crc="587d765f" sha1="63c6e3cd88655b30cef4afcdf4fcab959210047f" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zxforthi" cloneof="zxforth">
+ <description>ZX Forth (IPS)</description>
+ <year>1982</year>
+ <publisher>International Publishing &amp; Software Inc.</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="12455">
+ <rom name="ZXForth(IPS).tzx" size="12455" crc="73e4bf92" sha1="5cd85e8a39cb6151c243b4d83dfaf88a4f23c3bc" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zxmc">
+ <description>ZX-MC</description>
+ <year>198?</year>
+ <publisher>Picturesque</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="3781">
+ <rom name="ZXMC.tzx" size="3781" crc="bad36aef" sha1="9edc5c21e1edd96e1a733908d9e7d39cec6df85e" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zxmsuped">
+ <description>ZXM Super Editor</description>
+ <year>1983</year>
+ <publisher>Timedata</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="2693">
+ <rom name="ZXMSuperEditor.tzx" size="2693" crc="989424d1" sha1="9af273026fbd076097effee86e09a9f07d58f1fc" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zxprofil">
+ <description>ZX Pro/File</description>
+ <year>1983</year>
+ <publisher>Thomas B. Woods</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="16291">
+ <rom name="ZXProFile.tzx" size="16291" crc="5d5146cf" sha1="214faff9ecc28e7d20e229554bfaae88a8b23b98" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zxsidepr">
+ <description>ZX-Sideprint</description>
+ <year>1982</year>
+ <publisher>Microsphere</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="2175">
+ <rom name="ZXSideprint.tzx" size="2175" crc="5f320b4a" sha1="6965f265cbfca8f6813f698be70ed0e709c59632" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zxtk">
+ <description>ZXTK</description>
+ <year>1982</year>
+ <publisher>Bug Byte</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="2837">
+ <rom name="ZXTK.tzx" size="2837" crc="4f4182c4" sha1="fd398501a5e72ef51c0fd817085e77300807fb57" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="zxtri">
+ <description>ZX Tri</description>
+ <year>1983</year>
+ <publisher>Direco International</publisher>
+ <part name="cass1" interface="zx81_cass">
+ <dataarea name="cass" size="9162">
+ <rom name="ZXTri.A.tzx" size="9162" crc="a93dbc8c" sha1="3a0485af6054243cc77d8304fc987c772f90b64a" offset="0"/>
+ </dataarea>
+ </part>
+ <part name="cass2" interface="zx81_cass">
+ <dataarea name="cass" size="8141">
+ <rom name="ZXTri.B.tzx" size="8141" crc="646bf81d" sha1="12fbf74c7cf04fe63c868ac34b3504ea2444a4d2" offset="0"/>
+ </dataarea>
+ </part>
+ </software>
+
+</softwarelist>
diff --git a/makefile b/makefile
index 8df072c7b42..5f1a1685c09 100644
--- a/makefile
+++ b/makefile
@@ -64,6 +64,7 @@
# USE_SYSTEM_LIB_PORTMIDI = 1
# USE_SYSTEM_LIB_PORTAUDIO = 1
# USE_BUNDLED_LIB_SDL2 = 1
+# USE_SYSTEM_LIB_UTF8PROC = 1
# MESA_INSTALL_ROOT = /opt/mesa
# SDL_INSTALL_ROOT = /opt/sdl2
@@ -460,6 +461,10 @@ ifdef USE_SYSTEM_LIB_PORTAUDIO
PARAMS += --with-system-portaudio='$(USE_SYSTEM_LIB_PORTAUDIO)'
endif
+ifdef USE_SYSTEM_LIB_UTF8PROC
+PARAMS += --with-system-utf8proc='$(USE_SYSTEM_LIB_UTF8PROC)'
+endif
+
# reverse logic for this one
ifdef USE_BUNDLED_LIB_SDL2
@@ -1053,7 +1058,7 @@ endif
.PHONY: vs2015_uwp
vs2015_uwp: generate
- $(SILENT) $(GENIE) $(PARAMS) $(TARGET_PARAMS) --vs=winstore82 --osd=uwp --NO_USE_MIDI=1 --NO_OPENGL=1 --USE_QTDEBUG=0 --MODERN_WIN_API=1 vs2015
+ $(SILENT) $(GENIE) $(PARAMS) $(TARGET_PARAMS) --vs=winstore82 --osd=uwp --NO_USE_MIDI=1 --NO_OPENGL=1 --USE_QTDEBUG=0 --NO_USE_PORTAUDIO=1 --MODERN_WIN_API=1 vs2015
ifdef MSBUILD
$(SILENT) msbuild.exe $(PROJECTDIR_WIN)/vs2015-winstore82/$(PROJECT_NAME).sln $(MSBUILD_PARAMS)
endif
@@ -1092,7 +1097,7 @@ endif
.PHONY: vs2017_uwp
vs2017_uwp: generate
- $(SILENT) $(GENIE) $(PARAMS) $(TARGET_PARAMS) --vs=winstore82 --osd=uwp --NO_USE_MIDI=1 --NO_OPENGL=1 --USE_QTDEBUG=0 --MODERN_WIN_API=1 vs2015
+ $(SILENT) $(GENIE) $(PARAMS) $(TARGET_PARAMS) --vs=winstore82 --osd=uwp --NO_USE_MIDI=1 --NO_OPENGL=1 --USE_QTDEBUG=0 --NO_USE_PORTAUDIO=1 --MODERN_WIN_API=1 vs2015
ifdef MSBUILD
$(SILENT) msbuild.exe $(PROJECTDIR_WIN)/vs2017-winstore82/$(PROJECT_NAME).sln $(MSBUILD_PARAMS)
endif
@@ -1541,14 +1546,14 @@ endif
ifeq (posix,$(SHELLTYPE))
$(GENDIR)/version.cpp: $(GENDIR)/git_desc | $(GEN_FOLDERS)
- @echo '#define BARE_BUILD_VERSION "0.181"' > $@
+ @echo '#define BARE_BUILD_VERSION "0.182"' > $@
@echo 'extern const char bare_build_version[];' >> $@
@echo 'extern const char build_version[];' >> $@
@echo 'const char bare_build_version[] = BARE_BUILD_VERSION;' >> $@
@echo 'const char build_version[] = BARE_BUILD_VERSION " ($(NEW_GIT_VERSION))";' >> $@
else
$(GENDIR)/version.cpp: $(GENDIR)/git_desc
- @echo #define BARE_BUILD_VERSION "0.181" > $@
+ @echo #define BARE_BUILD_VERSION "0.182" > $@
@echo extern const char bare_build_version[]; >> $@
@echo extern const char build_version[]; >> $@
@echo const char bare_build_version[] = BARE_BUILD_VERSION; >> $@
diff --git a/nl_examples/congo_bongo.c b/nl_examples/congo_bongo.c
index b8ef3c181df..492865c79c4 100644
--- a/nl_examples/congo_bongo.c
+++ b/nl_examples/congo_bongo.c
@@ -11,6 +11,7 @@
/* set to 1 to use optimizations increasing performance significantly */
#define USE_OPTMIZATIONS 1
+#define USE_FRONTIERS 1
/* ----------------------------------------------------------------------------
* Library section header START
@@ -44,12 +45,18 @@ NETLIST_START(dummy)
PARAM(Solver.ACCURACY, 1e-8)
PARAM(Solver.NR_LOOPS, 90)
- PARAM(Solver.SOR_FACTOR, 0.001)
- PARAM(Solver.GS_LOOPS, 1)
+ PARAM(Solver.SOR_FACTOR, 1.01)
+ PARAM(Solver.GS_LOOPS, 4)
+ //PARAM(Solver.METHOD, "GMRES")
PARAM(Solver.METHOD, "MAT_CR")
+ //PARAM(Solver.METHOD, "SOR")
#if USE_OPTMIZATIONS
+#if USE_FRONTIERS
SOLVER(Solver, 24000)
+#else
+ SOLVER(Solver, 48000)
+#endif
PARAM(Solver.DYNAMIC_TS, 0 )
PARAM(Solver.PARALLEL, 1)
#else
@@ -121,7 +128,7 @@ NETLIST_START(dummy)
PARAM(XU13.D.MODEL, "MB3614(TYPE=1)")
#endif
-#if 1
+#if USE_FRONTIERS
OPTIMIZE_FRONTIER(C51.1, RES_K(20), 50)
OPTIMIZE_FRONTIER(R77.2, RES_K(20), 50)
@@ -374,7 +381,7 @@ NETLIST_START(G501534_DIP)
//AFUNC(f, 2, "A0 A1 A1 A1 * * 0.01 * *")
//AFUNC(f, 2, "A0")
//AFUNC(f, 2, "A0 6 - A1 3 pow * 0.02 * 6 +")
- AFUNC(f, 2, "A0 A1 3 pow * 0.02 *")
+ AFUNC(f, 2, "A0 * pow(A1,3.0) * 0.02")
/*
* 12: VCC
diff --git a/plugins/hiscore/hiscore.dat b/plugins/hiscore/hiscore.dat
index d4b0ecf97b9..979fea797df 100644
--- a/plugins/hiscore/hiscore.dat
+++ b/plugins/hiscore/hiscore.dat
@@ -8778,7 +8778,7 @@ missile:
missile2:
suprmatk:
suprmatkd:
-@:maincpu,program,002c,30,47,00
+@:maincpu,:videoram/share,002c,30,47,00
;(missile command (set 2)) clone (by GeoMan) - modified hiscore save
diff --git a/plugins/hiscore/init.lua b/plugins/hiscore/init.lua
index 1b881317306..cc3677a6d50 100644
--- a/plugins/hiscore/init.lua
+++ b/plugins/hiscore/init.lua
@@ -64,7 +64,12 @@ function hiscore.startplugin()
emu.print_verbose("hiscore: " .. cputag .. " device not found")
return nil
end
- mem = cpu.spaces[space];
+ local rgnname, rgntype = space:match("([^/]*)/?([^/]*)")
+ if rgntype == "share" then
+ mem = manager:machine():memory().shares[rgnname]
+ else
+ mem = cpu.spaces[space]
+ end
if not mem then
emu.print_verbose("hiscore: " .. space .. " space not found")
return nil;
diff --git a/scripts/extlib.lua b/scripts/extlib.lua
index a3949e3447b..674f1b1d881 100644
--- a/scripts/extlib.lua
+++ b/scripts/extlib.lua
@@ -14,6 +14,7 @@ local extlibs = {
portmidi = { "portmidi", "3rdparty/portmidi/pm_common" },
portaudio = { "portaudio", "3rdparty/portaudio/include" },
lua = { "lua", "3rdparty/lua/src" },
+ utf8proc = { "utf8proc", "3rdparty/utf8proc" },
}
-- system lib options
@@ -57,6 +58,11 @@ newoption {
description = "Use system LUA library",
}
+newoption {
+ trigger = "with-system-utf8proc",
+ description = "Use system utf8proc library",
+}
+
-- build helpers
function ext_lib(lib)
local opt = _OPTIONS["with-system-" .. lib]
diff --git a/scripts/src/3rdparty.lua b/scripts/src/3rdparty.lua
index 13904e80377..e5b64df3ac0 100644
--- a/scripts/src/3rdparty.lua
+++ b/scripts/src/3rdparty.lua
@@ -917,14 +917,14 @@ project "portaudio"
"/wd4189", -- warning C4189: 'xxx' : local variable is initialized but not referenced
"/wd4127", -- warning C4127: conditional expression is constant
}
- if _OPTIONS["vs"]=="intel-15" then
+ if _OPTIONS["vs"]=="intel-15" then
buildoptions {
"/Qwd869", -- remark #869: parameter "xxx" was never referenced
"/Qwd1478", -- warning #1478: function "xxx" (declared at line yyy of "zzz") was declared deprecated
"/Qwd2544", -- message #2544: empty dependent statement in if-statement
"/Qwd1879", -- warning #1879: unimplemented pragma ignored
}
- end
+ end
configuration { "vs2015*" }
buildoptions {
"/wd4456", -- warning C4456: declaration of 'xxx' hides previous local declaration
@@ -1608,9 +1608,9 @@ project "utf8proc"
kind "StaticLib"
defines {
- "UTF8PROC_DLLEXPORT="
+ "UTF8PROC_DLLEXPORT="
}
-
+
configuration "Debug"
defines {
"verbose=-1",
diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua
index 7c6aa7a8167..9902d41b3b5 100644
--- a/scripts/src/bus.lua
+++ b/scripts/src/bus.lua
@@ -428,6 +428,8 @@ if (BUSES["C64"]~=null) then
MAME_DIR .. "src/devices/bus/c64/silverrock.h",
MAME_DIR .. "src/devices/bus/c64/simons_basic.cpp",
MAME_DIR .. "src/devices/bus/c64/simons_basic.h",
+ MAME_DIR .. "src/devices/bus/c64/speakeasy.cpp",
+ MAME_DIR .. "src/devices/bus/c64/speakeasy.h",
MAME_DIR .. "src/devices/bus/c64/stardos.cpp",
MAME_DIR .. "src/devices/bus/c64/stardos.h",
MAME_DIR .. "src/devices/bus/c64/std.cpp",
@@ -1425,6 +1427,8 @@ if (BUSES["VIC20"]~=null) then
MAME_DIR .. "src/devices/bus/vic20/vic1112.h",
MAME_DIR .. "src/devices/bus/vic20/vic1210.cpp",
MAME_DIR .. "src/devices/bus/vic20/vic1210.h",
+ MAME_DIR .. "src/devices/bus/vic20/speakeasy.cpp",
+ MAME_DIR .. "src/devices/bus/vic20/speakeasy.h",
MAME_DIR .. "src/devices/bus/vic20/user.cpp",
MAME_DIR .. "src/devices/bus/vic20/user.h",
MAME_DIR .. "src/devices/bus/vic20/4cga.cpp",
@@ -1493,16 +1497,18 @@ end
if (BUSES["VME"]~=null) then
files {
- MAME_DIR .. "src/devices/bus/vme/vme.cpp",
- MAME_DIR .. "src/devices/bus/vme/vme.h",
- MAME_DIR .. "src/devices/bus/vme/vme_mzr8300.cpp",
- MAME_DIR .. "src/devices/bus/vme/vme_mzr8300.h",
- MAME_DIR .. "src/devices/bus/vme/vme_mvme350.cpp",
- MAME_DIR .. "src/devices/bus/vme/vme_mvme350.h",
- MAME_DIR .. "src/devices/bus/vme/vme_fcisio.cpp",
- MAME_DIR .. "src/devices/bus/vme/vme_fcisio.h",
- MAME_DIR .. "src/devices/bus/vme/vme_fcscsi.cpp",
- MAME_DIR .. "src/devices/bus/vme/vme_fcscsi.h",
+ MAME_DIR .. "src/devices/bus/vme/vme.cpp",
+ MAME_DIR .. "src/devices/bus/vme/vme.h",
+ MAME_DIR .. "src/devices/bus/vme/vme_mzr8300.cpp",
+ MAME_DIR .. "src/devices/bus/vme/vme_mzr8300.h",
+ MAME_DIR .. "src/devices/bus/vme/vme_mvme350.cpp",
+ MAME_DIR .. "src/devices/bus/vme/vme_mvme350.h",
+ MAME_DIR .. "src/devices/bus/vme/vme_fccpu20.cpp",
+ MAME_DIR .. "src/devices/bus/vme/vme_fccpu20.h",
+ MAME_DIR .. "src/devices/bus/vme/vme_fcisio.cpp",
+ MAME_DIR .. "src/devices/bus/vme/vme_fcisio.h",
+ MAME_DIR .. "src/devices/bus/vme/vme_fcscsi.cpp",
+ MAME_DIR .. "src/devices/bus/vme/vme_fcscsi.h",
}
end
@@ -2645,6 +2651,24 @@ end
---------------------------------------------------
--
+--@src/devices/bus/amiga/keyboard/keyboard.h,BUSES["AMIGA_KEYBOARD"] = true
+---------------------------------------------------
+
+if (BUSES["AMIGA_KEYBOARD"]~=null) then
+ files {
+ MAME_DIR .. "src/devices/bus/amiga/keyboard/keyboard.cpp",
+ MAME_DIR .. "src/devices/bus/amiga/keyboard/keyboard.h",
+ MAME_DIR .. "src/devices/bus/amiga/keyboard/matrix.cpp",
+ MAME_DIR .. "src/devices/bus/amiga/keyboard/matrix.h",
+ MAME_DIR .. "src/devices/bus/amiga/keyboard/a1200.cpp",
+ MAME_DIR .. "src/devices/bus/amiga/keyboard/a1200.h",
+ MAME_DIR .. "src/devices/bus/amiga/keyboard/a500.cpp",
+ MAME_DIR .. "src/devices/bus/amiga/keyboard/a500.h",
+ }
+end
+
+---------------------------------------------------
+--
--@src/devices/bus/amiga/zorro/zorro.h,BUSES["ZORRO"] = true
---------------------------------------------------
diff --git a/scripts/src/cpu.lua b/scripts/src/cpu.lua
index 802d582448c..477dac60840 100644
--- a/scripts/src/cpu.lua
+++ b/scripts/src/cpu.lua
@@ -425,7 +425,8 @@ end
if (CPUS["COP400"]~=null or _OPTIONS["with-tools"]) then
table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/cop400/cop410ds.cpp")
table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/cop400/cop420ds.cpp")
- table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/cop400/cop440ds.cpp")
+ table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/cop400/cop444ds.cpp")
+ table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/cop400/cop424ds.cpp")
end
--------------------------------------------------
@@ -611,7 +612,6 @@ if (CPUS["HCD62121"]~=null) then
files {
MAME_DIR .. "src/devices/cpu/hcd62121/hcd62121.cpp",
MAME_DIR .. "src/devices/cpu/hcd62121/hcd62121.h",
- MAME_DIR .. "src/devices/cpu/hcd62121/hcd62121_ops.h",
}
end
@@ -1339,6 +1339,8 @@ if (CPUS["M6805"]~=null) then
MAME_DIR .. "src/devices/cpu/m6805/6805ops.hxx",
MAME_DIR .. "src/devices/cpu/m6805/m68705.cpp",
MAME_DIR .. "src/devices/cpu/m6805/m68705.h",
+ MAME_DIR .. "src/devices/cpu/m6805/m68hc05.cpp",
+ MAME_DIR .. "src/devices/cpu/m6805/m68hc05.h",
}
end
@@ -2415,3 +2417,19 @@ end
if (CPUS["MB86901"]~=null or _OPTIONS["with-tools"]) then
table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/sparc/sparcdasm.cpp")
end
+
+--------------------------------------------------
+-- Intergraph CLIPPER (C100/C300/C400) series
+--@src/devices/cpu/clipper/clipper.h,CPUS["CLIPPER"] = true
+--------------------------------------------------
+
+if (CPUS["CLIPPER"]~=null) then
+ files {
+ MAME_DIR .. "src/devices/cpu/clipper/clipper.cpp",
+ MAME_DIR .. "src/devices/cpu/clipper/clipper.h",
+ }
+end
+
+if (CPUS["CLIPPER"]~=null or _OPTIONS["with-tools"]) then
+ table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/clipper/clipperd.cpp")
+end
diff --git a/scripts/src/emu.lua b/scripts/src/emu.lua
index 44b67a338ae..62d33a18eb9 100644
--- a/scripts/src/emu.lua
+++ b/scripts/src/emu.lua
@@ -128,6 +128,7 @@ files {
MAME_DIR .. "src/emu/ioport.cpp",
MAME_DIR .. "src/emu/ioport.h",
MAME_DIR .. "src/emu/inpttype.h",
+ MAME_DIR .. "src/emu/logmacro.h",
MAME_DIR .. "src/emu/machine.cpp",
MAME_DIR .. "src/emu/machine.h",
MAME_DIR .. "src/emu/mconfig.cpp",
diff --git a/scripts/src/formats.lua b/scripts/src/formats.lua
index 4606137b17c..994633e26b2 100644
--- a/scripts/src/formats.lua
+++ b/scripts/src/formats.lua
@@ -211,6 +211,18 @@ end
--------------------------------------------------
--
+--@src/lib/formats/apd_dsk.h,FORMATS["APD_DSK"] = true
+--------------------------------------------------
+
+if (FORMATS["APD_DSK"]~=null or _OPTIONS["with-tools"]) then
+ files {
+ MAME_DIR.. "src/lib/formats/apd_dsk.cpp",
+ MAME_DIR.. "src/lib/formats/apd_dsk.h",
+ }
+end
+
+--------------------------------------------------
+--
--@src/lib/formats/apf_apt.h,FORMATS["APF_APT"] = true
--------------------------------------------------
diff --git a/scripts/src/lib.lua b/scripts/src/lib.lua
index e102ba3cdcc..9c631aebbab 100644
--- a/scripts/src/lib.lua
+++ b/scripts/src/lib.lua
@@ -22,6 +22,7 @@ project "utils"
ext_includedir("expat"),
ext_includedir("zlib"),
ext_includedir("flac"),
+ ext_includedir("utf8proc"),
}
files {
diff --git a/scripts/src/machine.lua b/scripts/src/machine.lua
index b4db9d9dcce..8e33f586b68 100644
--- a/scripts/src/machine.lua
+++ b/scripts/src/machine.lua
@@ -260,10 +260,10 @@ end
---------------------------------------------------
--
---@src/devices/machine/68561mpcc.h,MACHINES += 68561MPCC
+--@src/devices/machine/68561mpcc.h,MACHINES["MPCC68561"] = true
---------------------------------------------------
-if (MACHINES["68561MPCC"]~=null) then
+if (MACHINES["MPCC68561"]~=null) then
files {
MAME_DIR .. "src/devices/machine/68561mpcc.cpp",
MAME_DIR .. "src/devices/machine/68561mpcc.h",
diff --git a/scripts/src/netlist.lua b/scripts/src/netlist.lua
index 089148c2d18..4fc5a6ed27b 100644
--- a/scripts/src/netlist.lua
+++ b/scripts/src/netlist.lua
@@ -28,26 +28,28 @@ project "netlist"
}
files {
- MAME_DIR .. "src/lib/netlist/nl_base.cpp",
- MAME_DIR .. "src/lib/netlist/nl_base.h",
+ MAME_DIR .. "src/lib/netlist/nl_base.cpp",
+ MAME_DIR .. "src/lib/netlist/nl_base.h",
MAME_DIR .. "src/lib/netlist/nl_config.h",
- MAME_DIR .. "src/lib/netlist/nl_errstr.h",
+ MAME_DIR .. "src/lib/netlist/nl_errstr.h",
MAME_DIR .. "src/lib/netlist/nl_dice_compat.h",
- MAME_DIR .. "src/lib/netlist/nl_factory.cpp",
- MAME_DIR .. "src/lib/netlist/nl_factory.h",
+ MAME_DIR .. "src/lib/netlist/nl_factory.cpp",
+ MAME_DIR .. "src/lib/netlist/nl_factory.h",
MAME_DIR .. "src/lib/netlist/nl_lists.h",
MAME_DIR .. "src/lib/netlist/nl_parser.cpp",
MAME_DIR .. "src/lib/netlist/nl_parser.h",
MAME_DIR .. "src/lib/netlist/nl_setup.cpp",
MAME_DIR .. "src/lib/netlist/nl_setup.h",
- MAME_DIR .. "src/lib/netlist/nl_time.h",
+ MAME_DIR .. "src/lib/netlist/nl_time.h",
MAME_DIR .. "src/lib/netlist/plib/pconfig.h",
MAME_DIR .. "src/lib/netlist/plib/palloc.cpp",
MAME_DIR .. "src/lib/netlist/plib/palloc.h",
MAME_DIR .. "src/lib/netlist/plib/pchrono.cpp",
MAME_DIR .. "src/lib/netlist/plib/pchrono.h",
- MAME_DIR .. "src/lib/netlist/plib/pexception.cpp",
- MAME_DIR .. "src/lib/netlist/plib/pexception.h",
+ MAME_DIR .. "src/lib/netlist/plib/pexception.cpp",
+ MAME_DIR .. "src/lib/netlist/plib/pexception.h",
+ MAME_DIR .. "src/lib/netlist/plib/pfunction.cpp",
+ MAME_DIR .. "src/lib/netlist/plib/pfunction.h",
MAME_DIR .. "src/lib/netlist/plib/pfmtlog.cpp",
MAME_DIR .. "src/lib/netlist/plib/pfmtlog.h",
MAME_DIR .. "src/lib/netlist/plib/plists.h",
@@ -57,6 +59,7 @@ project "netlist"
MAME_DIR .. "src/lib/netlist/plib/poptions.h",
MAME_DIR .. "src/lib/netlist/plib/pparser.cpp",
MAME_DIR .. "src/lib/netlist/plib/pparser.h",
+ MAME_DIR .. "src/lib/netlist/plib/ppmf.h",
MAME_DIR .. "src/lib/netlist/plib/pstate.cpp",
MAME_DIR .. "src/lib/netlist/plib/pstate.h",
MAME_DIR .. "src/lib/netlist/plib/pstring.cpp",
@@ -72,17 +75,19 @@ project "netlist"
MAME_DIR .. "src/lib/netlist/tools/nl_convert.h",
MAME_DIR .. "src/lib/netlist/analog/nld_bjt.cpp",
MAME_DIR .. "src/lib/netlist/analog/nld_bjt.h",
- MAME_DIR .. "src/lib/netlist/analog/nld_fourterm.cpp",
- MAME_DIR .. "src/lib/netlist/analog/nld_fourterm.h",
+ MAME_DIR .. "src/lib/netlist/analog/nlid_fourterm.cpp",
+ MAME_DIR .. "src/lib/netlist/analog/nlid_fourterm.h",
+ MAME_DIR .. "src/lib/netlist/analog/nld_fourterm.h",
MAME_DIR .. "src/lib/netlist/analog/nld_switches.cpp",
MAME_DIR .. "src/lib/netlist/analog/nld_switches.h",
- MAME_DIR .. "src/lib/netlist/analog/nld_twoterm.cpp",
+ MAME_DIR .. "src/lib/netlist/analog/nlid_twoterm.cpp",
+ MAME_DIR .. "src/lib/netlist/analog/nlid_twoterm.h",
MAME_DIR .. "src/lib/netlist/analog/nld_twoterm.h",
MAME_DIR .. "src/lib/netlist/analog/nld_opamps.cpp",
MAME_DIR .. "src/lib/netlist/analog/nld_opamps.h",
MAME_DIR .. "src/lib/netlist/solver/nld_solver.cpp",
MAME_DIR .. "src/lib/netlist/solver/nld_solver.h",
- MAME_DIR .. "src/lib/netlist/solver/nld_matrix_solver.cpp",
+ MAME_DIR .. "src/lib/netlist/solver/nld_matrix_solver.cpp",
MAME_DIR .. "src/lib/netlist/solver/nld_matrix_solver.h",
MAME_DIR .. "src/lib/netlist/solver/nld_ms_direct.h",
MAME_DIR .. "src/lib/netlist/solver/nld_ms_direct1.h",
@@ -187,14 +192,14 @@ project "netlist"
MAME_DIR .. "src/lib/netlist/devices/nld_log.h",
MAME_DIR .. "src/lib/netlist/devices/nld_system.cpp",
MAME_DIR .. "src/lib/netlist/devices/nld_system.h",
- MAME_DIR .. "src/lib/netlist/devices/nld_truthtable.cpp",
- MAME_DIR .. "src/lib/netlist/devices/nld_truthtable.h",
+ MAME_DIR .. "src/lib/netlist/devices/nlid_truthtable.cpp",
+ MAME_DIR .. "src/lib/netlist/devices/nlid_truthtable.h",
MAME_DIR .. "src/lib/netlist/devices/nlid_cmos.h",
MAME_DIR .. "src/lib/netlist/devices/nlid_system.h",
- MAME_DIR .. "src/lib/netlist/devices/nlid_proxy.cpp",
- MAME_DIR .. "src/lib/netlist/devices/nlid_proxy.h",
- MAME_DIR .. "src/lib/netlist/macro/nlm_base.cpp",
- MAME_DIR .. "src/lib/netlist/macro/nlm_base.h",
+ MAME_DIR .. "src/lib/netlist/devices/nlid_proxy.cpp",
+ MAME_DIR .. "src/lib/netlist/devices/nlid_proxy.h",
+ MAME_DIR .. "src/lib/netlist/macro/nlm_base.cpp",
+ MAME_DIR .. "src/lib/netlist/macro/nlm_base.h",
MAME_DIR .. "src/lib/netlist/macro/nlm_ttl74xx.cpp",
MAME_DIR .. "src/lib/netlist/macro/nlm_ttl74xx.h",
MAME_DIR .. "src/lib/netlist/macro/nlm_cd4xxx.cpp",
diff --git a/scripts/src/osd/modules.lua b/scripts/src/osd/modules.lua
index ce9977d8dd6..9ca2bcaa196 100644
--- a/scripts/src/osd/modules.lua
+++ b/scripts/src/osd/modules.lua
@@ -221,6 +221,10 @@ function osdmodulesbuild()
defines {
"NO_USE_PORTAUDIO",
}
+ else
+ includedirs {
+ ext_includedir("portaudio"),
+ }
end
if _OPTIONS["NO_USE_MIDI"]=="1" then
diff --git a/scripts/src/osd/sdl.lua b/scripts/src/osd/sdl.lua
index af6ff1b98ce..5970f6d3334 100644
--- a/scripts/src/osd/sdl.lua
+++ b/scripts/src/osd/sdl.lua
@@ -113,7 +113,8 @@ function maintargetosdoptions(_target,_subtarget)
configuration { "mingw*" or "vs*" }
targetprefix "sdl"
links {
- "psapi"
+ "psapi",
+ "Ole32",
}
configuration { }
diff --git a/scripts/src/sound.lua b/scripts/src/sound.lua
index ab05c06847c..171ad3f30cc 100644
--- a/scripts/src/sound.lua
+++ b/scripts/src/sound.lua
@@ -154,13 +154,13 @@ end
---------------------------------------------------
-- Amiga audio hardware
---@src/devices/sound/amiga.h,SOUNDS["AMIGA"] = true
+--@src/devices/machine/8364_paula.h,SOUNDS["PAULA_8364"] = true
---------------------------------------------------
-if (SOUNDS["AMIGA"]~=null) then
+if (SOUNDS["PAULA_8364"]~=null) then
files {
- MAME_DIR .. "src/devices/sound/amiga.cpp",
- MAME_DIR .. "src/devices/sound/amiga.h",
+ MAME_DIR .. "src/devices/machine/8364_paula.cpp",
+ MAME_DIR .. "src/devices/machine/8364_paula.h",
}
end
@@ -1424,3 +1424,15 @@ if (SOUNDS["MM5837"]~=null) then
MAME_DIR .. "src/devices/sound/mm5837.h",
}
end
+
+---------------------------------------------------
+-- Intelligent Designs DAVE
+--@src/devices/sound/dave.h,MACHINES["DAVE"] = true
+---------------------------------------------------
+
+if (SOUNDS["DAVE"]~=null) then
+ files {
+ MAME_DIR .. "src/devices/sound/dave.cpp",
+ MAME_DIR .. "src/devices/sound/dave.h",
+ }
+end
diff --git a/scripts/src/video.lua b/scripts/src/video.lua
index 0bda85053a7..770de5db893 100644
--- a/scripts/src/video.lua
+++ b/scripts/src/video.lua
@@ -330,6 +330,18 @@ end
--------------------------------------------------
--
+--@src/devices/video/hlcd0515.h,VIDEOS["HLCD0515"] = true
+--------------------------------------------------
+
+if (VIDEOS["HLCD0515"]~=null) then
+ files {
+ MAME_DIR .. "src/devices/video/hlcd0515.cpp",
+ MAME_DIR .. "src/devices/video/hlcd0515.h",
+ }
+end
+
+--------------------------------------------------
+--
--@src/devices/video/huc6202.h,VIDEOS["HUC6202"] = true
--------------------------------------------------
@@ -378,6 +390,18 @@ end
--------------------------------------------------
--
+--@src/devices/video/huc6271.h,VIDEOS["HUC6271"] = true
+--------------------------------------------------
+
+if (VIDEOS["HUC6271"]~=null) then
+ files {
+ MAME_DIR .. "src/devices/video/huc6271.cpp",
+ MAME_DIR .. "src/devices/video/huc6271.h",
+ }
+end
+
+--------------------------------------------------
+--
--@src/devices/video/huc6272.h,VIDEOS["HUC6272"] = true
--------------------------------------------------
@@ -912,3 +936,16 @@ if (VIDEOS["EF9369"]~=null) then
MAME_DIR .. "src/devices/video/ef9369.h",
}
end
+
+--------------------------------------------------
+--
+--@src/devices/video/ppu2c0x.h,VIDEOS["PPU2C0X"] = true
+--------------------------------------------------
+
+if (VIDEOS["PPU2C0X"]~=null) then
+ files {
+ MAME_DIR .. "src/devices/video/ppu2c0x.cpp",
+ MAME_DIR .. "src/devices/video/ppu2c0x.h",
+ }
+end
+
diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua
index 3cd5b7c020d..8c7f713f6f9 100644
--- a/scripts/target/mame/arcade.lua
+++ b/scripts/target/mame/arcade.lua
@@ -163,7 +163,7 @@ SOUNDS["SN76496"] = true
SOUNDS["POKEY"] = true
SOUNDS["TIA"] = true
SOUNDS["NES_APU"] = true
-SOUNDS["AMIGA"] = true
+SOUNDS["PAULA_8364"] = true
SOUNDS["ASTROCADE"] = true
SOUNDS["NAMCO"] = true
SOUNDS["NAMCO_15XX"] = true
@@ -265,6 +265,7 @@ SOUNDS["VOLT_REG"] = true
--SOUNDS["MEA8000"] = true
SOUNDS["DAC76"] = true
SOUNDS["MM5837"] = true
+--SOUNDS["DAVE"] = true
--------------------------------------------------
-- specify available video cores
@@ -296,6 +297,7 @@ VIDEOS["HD44780"] = true
VIDEOS["HD61830"] = true
VIDEOS["HD63484"] = true
--VIDEOS["HD66421"] = true
+--VIDEOS["HLCD0515"] = true
VIDEOS["HUC6202"] = true
VIDEOS["HUC6260"] = true
--VIDEOS["HUC6261"] = true
@@ -338,6 +340,7 @@ VIDEOS["V9938"] = true
VIDEOS["VOODOO"] = true
VIDEOS["VOODOO_PCI"] = true
VIDEOS["ZEUS2"] = true
+VIDEOS["PPU2C0X"] = true
--------------------------------------------------
-- specify available machine cores
@@ -351,7 +354,7 @@ MACHINES["TPI6525"] = true
MACHINES["RIOT6532"] = true
MACHINES["6821PIA"] = true
MACHINES["6840PTM"] = true
---MACHINES["68561MPCC"] = true
+--MACHINES["MPCC68561"] = true
MACHINES["ACIA6850"] = true
MACHINES["68681"] = true
MACHINES["7200FIFO"] = true
@@ -726,6 +729,7 @@ function linkProjects_mame_arcade(_target, _subtarget)
"dooyong",
"dynax",
"edevices",
+ "efo",
"eolith",
"excelent",
"exidy",
@@ -767,6 +771,7 @@ function linkProjects_mame_arcade(_target, _subtarget)
"pce",
"phoenix",
"playmark",
+ "promat",
"psikyo",
"ramtek",
"rare",
@@ -788,6 +793,7 @@ function linkProjects_mame_arcade(_target, _subtarget)
"tecfri",
"technos",
"tehkan",
+ "terminal",
"thepit",
"toaplan",
"tong",
@@ -795,9 +801,9 @@ function linkProjects_mame_arcade(_target, _subtarget)
"univers",
"upl",
"valadon",
- "veltmjr",
"venture",
"vsystem",
+ "wing",
"yunsung",
"zaccaria",
"misc",
@@ -1664,6 +1670,18 @@ files {
MAME_DIR .. "src/mame/drivers/twins.cpp",
}
+createMAMEProjects(_target, _subtarget, "efo")
+files {
+ MAME_DIR .. "src/mame/drivers/cedar_magnet.cpp",
+ MAME_DIR .. "src/mame/machine/cedar_magnet_plane.cpp",
+ MAME_DIR .. "src/mame/machine/cedar_magnet_sprite.cpp",
+ MAME_DIR .. "src/mame/machine/cedar_magnet_board.cpp",
+ MAME_DIR .. "src/mame/machine/cedar_magnet_flop.cpp",
+ MAME_DIR .. "src/mame/drivers/cidelsa.cpp",
+ MAME_DIR .. "src/mame/includes/cidelsa.h",
+ MAME_DIR .. "src/mame/video/cidelsa.cpp",
+}
+
createMAMEProjects(_target, _subtarget, "eolith")
files {
MAME_DIR .. "src/mame/drivers/eolith.cpp",
@@ -1687,6 +1705,7 @@ files {
MAME_DIR .. "src/mame/video/excellent_spr.cpp",
MAME_DIR .. "src/mame/video/excellent_spr.h",
MAME_DIR .. "src/mame/drivers/lastbank.cpp",
+ MAME_DIR .. "src/mame/drivers/witch.cpp",
}
createMAMEProjects(_target, _subtarget, "exidy")
@@ -2717,6 +2736,9 @@ files {
MAME_DIR .. "src/mame/drivers/crgolf.cpp",
MAME_DIR .. "src/mame/includes/crgolf.h",
MAME_DIR .. "src/mame/video/crgolf.cpp",
+ MAME_DIR .. "src/mame/drivers/himesiki.cpp",
+ MAME_DIR .. "src/mame/includes/himesiki.h",
+ MAME_DIR .. "src/mame/video/himesiki.cpp",
MAME_DIR .. "src/mame/drivers/suprgolf.cpp",
}
@@ -2852,10 +2874,6 @@ files {
MAME_DIR .. "src/mame/includes/vsnes.h",
MAME_DIR .. "src/mame/machine/vsnes.cpp",
MAME_DIR .. "src/mame/video/vsnes.cpp",
- MAME_DIR .. "src/mame/video/ppu2c0x.cpp",
- MAME_DIR .. "src/mame/video/ppu2c0x.h",
-
-
}
createMAMEProjects(_target, _subtarget, "nix")
@@ -2996,6 +3014,13 @@ files {
MAME_DIR .. "src/mame/video/sslam.cpp",
}
+createMAMEProjects(_target, _subtarget, "promat")
+files {
+ MAME_DIR .. "src/mame/drivers/1945kiii.cpp",
+ MAME_DIR .. "src/mame/drivers/3x3puzzl.cpp",
+ MAME_DIR .. "src/mame/drivers/gstream.cpp",
+}
+
createMAMEProjects(_target, _subtarget, "psikyo")
files {
MAME_DIR .. "src/mame/drivers/psikyo.cpp",
@@ -3363,6 +3388,8 @@ files {
MAME_DIR .. "src/mame/video/rdpblend.h",
MAME_DIR .. "src/mame/video/rdptpipe.cpp",
MAME_DIR .. "src/mame/video/rdptpipe.h",
+ MAME_DIR .. "src/mame/video/pin64.cpp",
+ MAME_DIR .. "src/mame/video/pin64.h",
MAME_DIR .. "src/mame/drivers/hanaawas.cpp",
MAME_DIR .. "src/mame/includes/hanaawas.h",
MAME_DIR .. "src/mame/video/hanaawas.cpp",
@@ -3666,7 +3693,6 @@ files {
MAME_DIR .. "src/mame/video/rastan.cpp",
MAME_DIR .. "src/mame/drivers/retofinv.cpp",
MAME_DIR .. "src/mame/includes/retofinv.h",
- MAME_DIR .. "src/mame/machine/retofinv.cpp",
MAME_DIR .. "src/mame/video/retofinv.cpp",
MAME_DIR .. "src/mame/drivers/rollrace.cpp",
MAME_DIR .. "src/mame/includes/rollrace.h",
@@ -3938,6 +3964,15 @@ files {
MAME_DIR .. "src/mame/video/wc90b.cpp",
}
+createMAMEProjects(_target, _subtarget, "terminal")
+files {
+ MAME_DIR .. "src/mame/drivers/istrebiteli.cpp",
+ MAME_DIR .. "src/mame/drivers/tiamc1.cpp",
+ MAME_DIR .. "src/mame/includes/tiamc1.h",
+ MAME_DIR .. "src/mame/video/tiamc1.cpp",
+ MAME_DIR .. "src/mame/audio/tiamc1.cpp",
+}
+
createMAMEProjects(_target, _subtarget, "thepit")
files {
MAME_DIR .. "src/mame/drivers/thepit.cpp",
@@ -4048,12 +4083,6 @@ files {
MAME_DIR .. "src/mame/video/tankbust.cpp",
}
-createMAMEProjects(_target, _subtarget, "veltmjr")
-files {
- MAME_DIR .. "src/mame/drivers/cardline.cpp",
- MAME_DIR .. "src/mame/drivers/witch.cpp",
-}
-
createMAMEProjects(_target, _subtarget, "venture")
files {
MAME_DIR .. "src/mame/drivers/looping.cpp",
@@ -4117,6 +4146,17 @@ files {
MAME_DIR .. "src/mame/video/welltris.cpp",
}
+createMAMEProjects(_target, _subtarget, "wing")
+files {
+ MAME_DIR .. "src/mame/drivers/lucky74.cpp",
+ MAME_DIR .. "src/mame/includes/lucky74.h",
+ MAME_DIR .. "src/mame/video/lucky74.cpp",
+ MAME_DIR .. "src/mame/drivers/luckgrln.cpp",
+ MAME_DIR .. "src/mame/drivers/pinkiri8.cpp",
+ MAME_DIR .. "src/mame/drivers/slotcarn.cpp",
+ MAME_DIR .. "src/mame/drivers/superwng.cpp",
+}
+
createMAMEProjects(_target, _subtarget, "yunsung")
files {
MAME_DIR .. "src/mame/drivers/nmg5.cpp",
@@ -4280,13 +4320,11 @@ includedirs {
}
files {
- MAME_DIR .. "src/mame/drivers/1945kiii.cpp",
MAME_DIR .. "src/mame/drivers/39in1.cpp",
MAME_DIR .. "src/mame/machine/pxa255.h",
MAME_DIR .. "src/mame/drivers/3do.cpp",
MAME_DIR .. "src/mame/includes/3do.h",
MAME_DIR .. "src/mame/machine/3do.cpp",
- MAME_DIR .. "src/mame/drivers/3x3puzzl.cpp",
MAME_DIR .. "src/mame/drivers/4enraya.cpp",
MAME_DIR .. "src/mame/includes/4enraya.h",
MAME_DIR .. "src/mame/video/4enraya.cpp",
@@ -4334,6 +4372,7 @@ files {
MAME_DIR .. "src/mame/drivers/calomega.cpp",
MAME_DIR .. "src/mame/includes/calomega.h",
MAME_DIR .. "src/mame/video/calomega.cpp",
+ MAME_DIR .. "src/mame/drivers/cardline.cpp",
MAME_DIR .. "src/mame/drivers/carrera.cpp",
MAME_DIR .. "src/mame/drivers/castle.cpp",
MAME_DIR .. "src/mame/drivers/cave.cpp",
@@ -4352,19 +4391,11 @@ files {
MAME_DIR .. "src/mame/machine/cdislave.h",
MAME_DIR .. "src/mame/machine/cdicdic.cpp",
MAME_DIR .. "src/mame/machine/cdicdic.h",
- MAME_DIR .. "src/mame/drivers/cedar_magnet.cpp",
- MAME_DIR .. "src/mame/machine/cedar_magnet_plane.cpp",
- MAME_DIR .. "src/mame/machine/cedar_magnet_sprite.cpp",
- MAME_DIR .. "src/mame/machine/cedar_magnet_board.cpp",
- MAME_DIR .. "src/mame/machine/cedar_magnet_flop.cpp",
MAME_DIR .. "src/mame/drivers/cesclass.cpp",
MAME_DIR .. "src/mame/drivers/chance32.cpp",
MAME_DIR .. "src/mame/drivers/chexx.cpp",
MAME_DIR .. "src/mame/drivers/chicago.cpp",
MAME_DIR .. "src/mame/drivers/chsuper.cpp",
- MAME_DIR .. "src/mame/drivers/cidelsa.cpp",
- MAME_DIR .. "src/mame/includes/cidelsa.h",
- MAME_DIR .. "src/mame/video/cidelsa.cpp",
MAME_DIR .. "src/mame/drivers/clowndwn.cpp",
MAME_DIR .. "src/mame/drivers/cocoloco.cpp",
MAME_DIR .. "src/mame/drivers/coinmstr.cpp",
@@ -4446,7 +4477,6 @@ files {
MAME_DIR .. "src/mame/drivers/gotcha.cpp",
MAME_DIR .. "src/mame/includes/gotcha.h",
MAME_DIR .. "src/mame/video/gotcha.cpp",
- MAME_DIR .. "src/mame/drivers/gstream.cpp",
MAME_DIR .. "src/mame/drivers/gumbo.cpp",
MAME_DIR .. "src/mame/includes/gumbo.h",
MAME_DIR .. "src/mame/video/gumbo.cpp",
@@ -4456,9 +4486,6 @@ files {
MAME_DIR .. "src/mame/drivers/hazelgr.cpp",
MAME_DIR .. "src/mame/drivers/headonb.cpp",
MAME_DIR .. "src/mame/drivers/highvdeo.cpp",
- MAME_DIR .. "src/mame/drivers/himesiki.cpp",
- MAME_DIR .. "src/mame/includes/himesiki.h",
- MAME_DIR .. "src/mame/video/himesiki.cpp",
MAME_DIR .. "src/mame/drivers/hitpoker.cpp",
MAME_DIR .. "src/mame/drivers/homedata.cpp",
MAME_DIR .. "src/mame/includes/homedata.h",
@@ -4469,7 +4496,6 @@ files {
MAME_DIR .. "src/mame/drivers/imolagp.cpp",
MAME_DIR .. "src/mame/drivers/intrscti.cpp",
MAME_DIR .. "src/mame/drivers/istellar.cpp",
- MAME_DIR .. "src/mame/drivers/istrebiteli.cpp",
MAME_DIR .. "src/mame/drivers/itgambl2.cpp",
MAME_DIR .. "src/mame/drivers/itgambl3.cpp",
MAME_DIR .. "src/mame/drivers/itgamble.cpp",
@@ -4499,10 +4525,6 @@ files {
MAME_DIR .. "src/mame/video/lethalj.cpp",
MAME_DIR .. "src/mame/drivers/limenko.cpp",
MAME_DIR .. "src/mame/drivers/ltcasino.cpp",
- MAME_DIR .. "src/mame/drivers/lucky74.cpp",
- MAME_DIR .. "src/mame/includes/lucky74.h",
- MAME_DIR .. "src/mame/video/lucky74.cpp",
- MAME_DIR .. "src/mame/drivers/luckgrln.cpp",
MAME_DIR .. "src/mame/drivers/magic10.cpp",
MAME_DIR .. "src/mame/drivers/magicard.cpp",
MAME_DIR .. "src/mame/drivers/magicfly.cpp",
@@ -4569,7 +4591,6 @@ files {
MAME_DIR .. "src/mame/video/pk8000.cpp",
MAME_DIR .. "src/mame/drivers/photon2.cpp",
MAME_DIR .. "src/mame/drivers/photoply.cpp",
- MAME_DIR .. "src/mame/drivers/pinkiri8.cpp",
MAME_DIR .. "src/mame/drivers/pipeline.cpp",
MAME_DIR .. "src/mame/drivers/pkscram.cpp",
MAME_DIR .. "src/mame/drivers/pntnpuzl.cpp",
@@ -4607,7 +4628,6 @@ files {
MAME_DIR .. "src/mame/drivers/skyarmy.cpp",
MAME_DIR .. "src/mame/drivers/skylncr.cpp",
MAME_DIR .. "src/mame/drivers/sliver.cpp",
- MAME_DIR .. "src/mame/drivers/slotcarn.cpp",
MAME_DIR .. "src/mame/drivers/smsmcorp.cpp",
MAME_DIR .. "src/mame/drivers/sothello.cpp",
MAME_DIR .. "src/mame/drivers/splus.cpp",
@@ -4625,7 +4645,6 @@ files {
MAME_DIR .. "src/mame/drivers/sumt8035.cpp",
MAME_DIR .. "src/mame/drivers/supercrd.cpp",
MAME_DIR .. "src/mame/drivers/supertnk.cpp",
- MAME_DIR .. "src/mame/drivers/superwng.cpp",
MAME_DIR .. "src/mame/drivers/tapatune.cpp",
MAME_DIR .. "src/mame/drivers/tattack.cpp",
MAME_DIR .. "src/mame/drivers/taxidriv.cpp",
@@ -4636,10 +4655,6 @@ files {
MAME_DIR .. "src/mame/drivers/thedeep.cpp",
MAME_DIR .. "src/mame/includes/thedeep.h",
MAME_DIR .. "src/mame/video/thedeep.cpp",
- MAME_DIR .. "src/mame/drivers/tiamc1.cpp",
- MAME_DIR .. "src/mame/includes/tiamc1.h",
- MAME_DIR .. "src/mame/video/tiamc1.cpp",
- MAME_DIR .. "src/mame/audio/tiamc1.cpp",
MAME_DIR .. "src/mame/drivers/tickee.cpp",
MAME_DIR .. "src/mame/drivers/tmspoker.cpp",
MAME_DIR .. "src/mame/drivers/truco.cpp",
diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua
index 31b9117e1f7..052a99d2527 100644
--- a/scripts/target/mame/mess.lua
+++ b/scripts/target/mame/mess.lua
@@ -134,6 +134,7 @@ CPUS["HPHYBRID"] = true
CPUS["SM510"] = true
CPUS["MB86901"] = true
CPUS["NANOPROCESSOR"] = true
+CPUS["CLIPPER"] = true
--------------------------------------------------
-- specify available sound cores; some of these are
@@ -167,7 +168,7 @@ SOUNDS["SN76496"] = true
SOUNDS["POKEY"] = true
SOUNDS["TIA"] = true
SOUNDS["NES_APU"] = true
-SOUNDS["AMIGA"] = true
+SOUNDS["PAULA_8364"] = true
SOUNDS["ASTROCADE"] = true
--SOUNDS["NAMCO"] = true
--SOUNDS["NAMCO_15XX"] = true
@@ -266,6 +267,7 @@ SOUNDS["VOLT_REG"] = true
SOUNDS["MEA8000"] = true
--SOUNDS["DAC76"] = true
--SOUNDS["MM5837"] = true
+SOUNDS["DAVE"] = true
--------------------------------------------------
-- specify available video cores
@@ -296,10 +298,12 @@ VIDEOS["HD44780"] = true
VIDEOS["HD61830"] = true
--VIDEOS+= HD63484"] = true
VIDEOS["HD66421"] = true
+VIDEOS["HLCD0515"] = true
VIDEOS["HUC6202"] = true
VIDEOS["HUC6260"] = true
VIDEOS["HUC6261"] = true
VIDEOS["HUC6270"] = true
+VIDEOS["HUC6271"] = true
VIDEOS["HUC6272"] = true
VIDEOS["I8244"] = true
VIDEOS["I82730"] = true
@@ -341,6 +345,7 @@ VIDEOS["SCN2674"] = true
VIDEOS["GB_LCD"] = true
VIDEOS["GBA_LCD"] = true
VIDEOS["MGA2064W"] = true
+VIDEOS["PPU2C0X"] = true
--------------------------------------------------
-- specify available machine cores
@@ -354,7 +359,7 @@ MACHINES["GAYLE"] = true
MACHINES["6522VIA"] = true
MACHINES["6821PIA"] = true
MACHINES["6840PTM"] = true
-MACHINES["68561MPCC"] = true
+MACHINES["MPCC68561"] = true
MACHINES["68681"] = true
MACHINES["7200FIFO"] = true
MACHINES["8530SCC"] = true
@@ -607,6 +612,7 @@ BUSES["ADAMNET"] = true
BUSES["APF"] = true
BUSES["APRICOT_EXPANSION"] = true
BUSES["APRICOT_KEYBOARD"] = true
+BUSES["AMIGA_KEYBOARD"] = true
BUSES["ARCADIA"] = true
BUSES["ASTROCADE"] = true
BUSES["BBC_FDC"] = true
@@ -729,6 +735,7 @@ FORMATS["ADAM_DSK"] = true
FORMATS["AFS_DSK"] = true
FORMATS["AMI_DSK"] = true
FORMATS["AP2_DSK"] = true
+FORMATS["APD_DSK"] = true
FORMATS["APF_APT"] = true
FORMATS["APOLLO_DSK"] = true
FORMATS["APPLIX_DSK"] = true
@@ -942,6 +949,7 @@ function linkProjects_mame_mess(_target, _subtarget)
"ibm6580",
"imp",
"intel",
+ "interpro",
"interton",
"intv",
"isc",
@@ -1152,8 +1160,6 @@ files {
MAME_DIR .. "src/mame/machine/kabuki.cpp",
MAME_DIR .. "src/mame/machine/kabuki.h",
MAME_DIR .. "src/mame/video/pk8000.cpp",
- MAME_DIR .. "src/mame/video/ppu2c0x.cpp",
- MAME_DIR .. "src/mame/video/ppu2c0x.h",
MAME_DIR .. "src/mame/machine/snes.cpp",
MAME_DIR .. "src/mame/audio/snes_snd.cpp",
MAME_DIR .. "src/mame/audio/snes_snd.h",
@@ -1166,6 +1172,8 @@ files {
MAME_DIR .. "src/mame/video/rdpblend.h",
MAME_DIR .. "src/mame/video/rdptpipe.cpp",
MAME_DIR .. "src/mame/video/rdptpipe.h",
+ MAME_DIR .. "src/mame/video/pin64.cpp",
+ MAME_DIR .. "src/mame/video/pin64.h",
MAME_DIR .. "src/mame/machine/megadriv.cpp",
MAME_DIR .. "src/mame/drivers/naomi.cpp",
MAME_DIR .. "src/mame/includes/naomi.h",
@@ -1326,8 +1334,6 @@ createMESSProjects(_target, _subtarget, "amiga")
files {
MAME_DIR .. "src/mame/drivers/amiga.cpp",
MAME_DIR .. "src/mame/includes/amiga.h",
- MAME_DIR .. "src/mame/machine/amigakbd.cpp",
- MAME_DIR .. "src/mame/machine/amigakbd.h",
}
createMESSProjects(_target, _subtarget, "amstrad")
@@ -1836,8 +1842,6 @@ files {
createMESSProjects(_target, _subtarget, "enterprise")
files {
MAME_DIR .. "src/mame/drivers/ep64.cpp",
- MAME_DIR .. "src/mame/audio/dave.cpp",
- MAME_DIR .. "src/mame/audio/dave.h",
MAME_DIR .. "src/mame/video/nick.cpp",
MAME_DIR .. "src/mame/video/nick.h",
}
@@ -1896,7 +1900,7 @@ files {
createMESSProjects(_target, _subtarget, "fidelity")
files {
MAME_DIR .. "src/mame/drivers/fidelz80.cpp",
- MAME_DIR .. "src/mame/includes/fidelz80.h",
+ MAME_DIR .. "src/mame/includes/fidelbase.h",
MAME_DIR .. "src/mame/drivers/fidel6502.cpp",
MAME_DIR .. "src/mame/drivers/fidel68k.cpp",
}
@@ -2072,6 +2076,22 @@ files {
MAME_DIR .. "src/mame/drivers/tim100.cpp",
}
+createMESSProjects(_target, _subtarget, "interpro")
+files {
+ MAME_DIR .. "src/mame/drivers/interpro.cpp",
+ MAME_DIR .. "src/mame/includes/interpro.h",
+ MAME_DIR .. "src/mame/machine/cammu.h",
+ MAME_DIR .. "src/mame/machine/cammu.cpp",
+ MAME_DIR .. "src/mame/machine/interpro_ioga.h",
+ MAME_DIR .. "src/mame/machine/interpro_ioga.cpp",
+ MAME_DIR .. "src/mame/machine/interpro_ioga.h",
+ MAME_DIR .. "src/mame/machine/interpro_ioga.cpp",
+ MAME_DIR .. "src/mame/machine/interpro_mcga.h",
+ MAME_DIR .. "src/mame/machine/interpro_mcga.cpp",
+ MAME_DIR .. "src/mame/machine/interpro_sga.h",
+ MAME_DIR .. "src/mame/machine/interpro_sga.cpp",
+}
+
createMESSProjects(_target, _subtarget, "interton")
files {
MAME_DIR .. "src/mame/drivers/vc4000.cpp",
@@ -2379,6 +2399,8 @@ files {
MAME_DIR .. "src/mame/drivers/mk1.cpp",
MAME_DIR .. "src/mame/drivers/mk2.cpp",
MAME_DIR .. "src/mame/drivers/novag6502.cpp",
+ MAME_DIR .. "src/mame/drivers/novagbase.h",
+ MAME_DIR .. "src/mame/drivers/novag68k.cpp",
MAME_DIR .. "src/mame/drivers/ssystem3.cpp",
MAME_DIR .. "src/mame/includes/ssystem3.h",
MAME_DIR .. "src/mame/video/ssystem3.cpp",
@@ -3419,6 +3441,9 @@ files {
MAME_DIR .. "src/mame/includes/xor100.h",
MAME_DIR .. "src/mame/drivers/xavix.cpp",
MAME_DIR .. "src/mame/drivers/zorba.cpp",
+ MAME_DIR .. "src/mame/includes/zorba.h",
+ MAME_DIR .. "src/mame/machine/zorbakbd.cpp",
+ MAME_DIR .. "src/mame/machine/zorbakbd.h",
}
end
diff --git a/src/devices/bus/a2bus/a2alfam2.cpp b/src/devices/bus/a2bus/a2alfam2.cpp
index 0bee8380532..d4decaeae92 100644
--- a/src/devices/bus/a2bus/a2alfam2.cpp
+++ b/src/devices/bus/a2bus/a2alfam2.cpp
@@ -10,7 +10,6 @@
*********************************************************************/
#include "a2alfam2.h"
-#include "includes/apple2.h"
#include "sound/sn76496.h"
/***************************************************************************
diff --git a/src/devices/bus/a2bus/a2applicard.cpp b/src/devices/bus/a2bus/a2applicard.cpp
index 1e4f71e3e33..9fe268dbabd 100644
--- a/src/devices/bus/a2bus/a2applicard.cpp
+++ b/src/devices/bus/a2bus/a2applicard.cpp
@@ -12,7 +12,6 @@
*********************************************************************/
#include "a2applicard.h"
-#include "includes/apple2.h"
#include "cpu/z80/z80.h"
#include "machine/z80ctc.h"
diff --git a/src/devices/bus/a2bus/a2cffa.cpp b/src/devices/bus/a2bus/a2cffa.cpp
index e046b2e120e..79420fff9d3 100644
--- a/src/devices/bus/a2bus/a2cffa.cpp
+++ b/src/devices/bus/a2bus/a2cffa.cpp
@@ -12,7 +12,6 @@
*********************************************************************/
#include "a2cffa.h"
-#include "includes/apple2.h"
#include "machine/ataintf.h"
#include "imagedev/harddriv.h"
#include "softlist.h"
diff --git a/src/devices/bus/a2bus/a2corvus.cpp b/src/devices/bus/a2bus/a2corvus.cpp
index 9ee553b17d8..32d86cdc091 100644
--- a/src/devices/bus/a2bus/a2corvus.cpp
+++ b/src/devices/bus/a2bus/a2corvus.cpp
@@ -41,7 +41,6 @@
*********************************************************************/
#include "a2corvus.h"
-#include "includes/apple2.h"
#include "imagedev/harddriv.h"
/***************************************************************************
diff --git a/src/devices/bus/a2bus/a2diskii.cpp b/src/devices/bus/a2bus/a2diskii.cpp
index 50243e2f596..fa89dfc228e 100644
--- a/src/devices/bus/a2bus/a2diskii.cpp
+++ b/src/devices/bus/a2bus/a2diskii.cpp
@@ -9,7 +9,6 @@
*********************************************************************/
#include "emu.h"
-#include "includes/apple2.h"
#include "imagedev/flopdrv.h"
#include "formats/ap2_dsk.h"
#include "machine/appldriv.h"
diff --git a/src/devices/bus/a2bus/a2dx1.cpp b/src/devices/bus/a2bus/a2dx1.cpp
index 158403ee10c..71eee7cea0b 100644
--- a/src/devices/bus/a2bus/a2dx1.cpp
+++ b/src/devices/bus/a2bus/a2dx1.cpp
@@ -8,7 +8,6 @@
*********************************************************************/
-#include "includes/apple2.h"
#include "a2dx1.h"
#include "sound/volt_reg.h"
diff --git a/src/devices/bus/a2bus/a2echoii.cpp b/src/devices/bus/a2bus/a2echoii.cpp
index ee8e318da31..b309e265a07 100644
--- a/src/devices/bus/a2bus/a2echoii.cpp
+++ b/src/devices/bus/a2bus/a2echoii.cpp
@@ -9,7 +9,6 @@
*********************************************************************/
#include "a2echoii.h"
-#include "includes/apple2.h"
#include "sound/tms5220.h"
/***************************************************************************
diff --git a/src/devices/bus/a2bus/a2eext80col.cpp b/src/devices/bus/a2bus/a2eext80col.cpp
index 1d2f6ae4e74..bd975354314 100644
--- a/src/devices/bus/a2bus/a2eext80col.cpp
+++ b/src/devices/bus/a2bus/a2eext80col.cpp
@@ -9,7 +9,6 @@
*********************************************************************/
#include "emu.h"
-#include "includes/apple2.h"
#include "a2eext80col.h"
diff --git a/src/devices/bus/a2bus/a2eramworks3.cpp b/src/devices/bus/a2bus/a2eramworks3.cpp
index c0a0e2c016d..e832bb53123 100644
--- a/src/devices/bus/a2bus/a2eramworks3.cpp
+++ b/src/devices/bus/a2bus/a2eramworks3.cpp
@@ -10,7 +10,6 @@
*********************************************************************/
#include "emu.h"
-#include "includes/apple2.h"
#include "a2eramworks3.h"
diff --git a/src/devices/bus/a2bus/a2estd80col.cpp b/src/devices/bus/a2bus/a2estd80col.cpp
index c6982aafa83..28a669ffd20 100644
--- a/src/devices/bus/a2bus/a2estd80col.cpp
+++ b/src/devices/bus/a2bus/a2estd80col.cpp
@@ -9,7 +9,6 @@
*********************************************************************/
#include "emu.h"
-#include "includes/apple2.h"
#include "a2estd80col.h"
diff --git a/src/devices/bus/a2bus/a2hsscsi.cpp b/src/devices/bus/a2bus/a2hsscsi.cpp
index e8e5f4b98e4..eb36d7cb8cb 100644
--- a/src/devices/bus/a2bus/a2hsscsi.cpp
+++ b/src/devices/bus/a2bus/a2hsscsi.cpp
@@ -39,7 +39,6 @@
*********************************************************************/
#include "a2hsscsi.h"
-#include "includes/apple2.h"
#include "machine/nscsi_cd.h"
#include "machine/nscsi_hd.h"
diff --git a/src/devices/bus/a2bus/a2lang.cpp b/src/devices/bus/a2bus/a2lang.cpp
index 3c156fd4c90..0bd6af638db 100644
--- a/src/devices/bus/a2bus/a2lang.cpp
+++ b/src/devices/bus/a2bus/a2lang.cpp
@@ -13,7 +13,6 @@
*********************************************************************/
#include "emu.h"
-#include "includes/apple2.h"
#include "a2lang.h"
@@ -70,12 +69,12 @@ void a2bus_lang_device::device_reset()
void a2bus_lang_device::langcard_touch(offs_t offset)
{
- uint32_t val, mask;
+/* uint32_t val, mask;
if (LOG_LANGCARD)
logerror("language card bankswitch read, offset: $c08%0x\n", offset);
- /* determine which flags to change */
+ // determine which flags to change
mask = VAR_LCWRITE | VAR_LCRAM | VAR_LCRAM2;
val = 0;
@@ -93,9 +92,9 @@ void a2bus_lang_device::langcard_touch(offs_t offset)
if ((offset & 0x08) == 0)
val |= VAR_LCRAM2;
- /* change the flags */
+ // change the flags
apple2_state *state = machine().driver_data<apple2_state>();
- state->apple2_setvar(val, mask);
+ state->apple2_setvar(val, mask);*/
}
@@ -106,7 +105,7 @@ void a2bus_lang_device::langcard_touch(offs_t offset)
uint8_t a2bus_lang_device::read_c0nx(address_space &space, uint8_t offset)
{
- apple2_state *state = machine().driver_data<apple2_state>();
+/* apple2_state *state = machine().driver_data<apple2_state>();
// enforce "read twice" for c081/3/9/B
// but only on the II/II+ with a discrete language card.
@@ -128,7 +127,7 @@ uint8_t a2bus_lang_device::read_c0nx(address_space &space, uint8_t offset)
}
langcard_touch(offset);
- last_offset = offset;
+ last_offset = offset;*/
return 0;
}
diff --git a/src/devices/bus/a2bus/a2mcms.cpp b/src/devices/bus/a2bus/a2mcms.cpp
index 57abe911fd0..38b8ce36fa8 100644
--- a/src/devices/bus/a2bus/a2mcms.cpp
+++ b/src/devices/bus/a2bus/a2mcms.cpp
@@ -11,7 +11,6 @@
*********************************************************************/
#include "a2mcms.h"
-#include "includes/apple2.h"
// the actual sound device (a slot device can't currently also be a sound device so we keep this private here)
enum
diff --git a/src/devices/bus/a2bus/a2memexp.cpp b/src/devices/bus/a2bus/a2memexp.cpp
index f34b71e435d..be1d28cd1bc 100644
--- a/src/devices/bus/a2bus/a2memexp.cpp
+++ b/src/devices/bus/a2bus/a2memexp.cpp
@@ -9,7 +9,6 @@
*********************************************************************/
#include "a2memexp.h"
-#include "includes/apple2.h"
/***************************************************************************
diff --git a/src/devices/bus/a2bus/a2sam.cpp b/src/devices/bus/a2bus/a2sam.cpp
index e8b6f811754..3abc1820061 100644
--- a/src/devices/bus/a2bus/a2sam.cpp
+++ b/src/devices/bus/a2bus/a2sam.cpp
@@ -8,7 +8,6 @@
*********************************************************************/
-#include "includes/apple2.h"
#include "a2sam.h"
#include "sound/volt_reg.h"
diff --git a/src/devices/bus/a2bus/a2scsi.cpp b/src/devices/bus/a2bus/a2scsi.cpp
index f1da850482d..3dba10aa849 100644
--- a/src/devices/bus/a2bus/a2scsi.cpp
+++ b/src/devices/bus/a2bus/a2scsi.cpp
@@ -32,7 +32,6 @@
*********************************************************************/
#include "a2scsi.h"
-#include "includes/apple2.h"
#include "machine/nscsi_cd.h"
#include "machine/nscsi_hd.h"
diff --git a/src/devices/bus/a2bus/a2softcard.cpp b/src/devices/bus/a2bus/a2softcard.cpp
index df509e7e079..8ffb9ba88da 100644
--- a/src/devices/bus/a2bus/a2softcard.cpp
+++ b/src/devices/bus/a2bus/a2softcard.cpp
@@ -9,7 +9,6 @@
*********************************************************************/
#include "a2softcard.h"
-#include "includes/apple2.h"
#include "cpu/z80/z80.h"
/***************************************************************************
diff --git a/src/devices/bus/a2bus/a2swyft.cpp b/src/devices/bus/a2bus/a2swyft.cpp
index 975974b849b..ec6ef5af5f7 100644
--- a/src/devices/bus/a2bus/a2swyft.cpp
+++ b/src/devices/bus/a2bus/a2swyft.cpp
@@ -9,7 +9,6 @@
*********************************************************************/
#include "emu.h"
-#include "includes/apple2.h"
#include "a2swyft.h"
diff --git a/src/devices/bus/a2bus/a2themill.cpp b/src/devices/bus/a2bus/a2themill.cpp
index 71aed47ace9..ecabb3e085f 100644
--- a/src/devices/bus/a2bus/a2themill.cpp
+++ b/src/devices/bus/a2bus/a2themill.cpp
@@ -23,7 +23,6 @@
*********************************************************************/
#include "a2themill.h"
-#include "includes/apple2.h"
#include "cpu/m6809/m6809.h"
/***************************************************************************
diff --git a/src/devices/bus/a2bus/a2ultraterm.cpp b/src/devices/bus/a2bus/a2ultraterm.cpp
index 5526515ab1d..82a56021e02 100644
--- a/src/devices/bus/a2bus/a2ultraterm.cpp
+++ b/src/devices/bus/a2bus/a2ultraterm.cpp
@@ -28,7 +28,6 @@
*********************************************************************/
#include "a2ultraterm.h"
-#include "includes/apple2.h"
/***************************************************************************
diff --git a/src/devices/bus/a2bus/a2videoterm.cpp b/src/devices/bus/a2bus/a2videoterm.cpp
index 53eb6d5d20a..03f1ba1f2f4 100644
--- a/src/devices/bus/a2bus/a2videoterm.cpp
+++ b/src/devices/bus/a2bus/a2videoterm.cpp
@@ -24,7 +24,6 @@
*********************************************************************/
#include "a2videoterm.h"
-#include "includes/apple2.h"
/***************************************************************************
diff --git a/src/devices/bus/a2bus/a2vulcan.cpp b/src/devices/bus/a2bus/a2vulcan.cpp
index 216ccc7d043..6cb28536d94 100644
--- a/src/devices/bus/a2bus/a2vulcan.cpp
+++ b/src/devices/bus/a2bus/a2vulcan.cpp
@@ -54,7 +54,6 @@
*********************************************************************/
#include "a2vulcan.h"
-#include "includes/apple2.h"
#include "machine/ataintf.h"
#include "imagedev/harddriv.h"
diff --git a/src/devices/bus/a2bus/a2zipdrive.cpp b/src/devices/bus/a2bus/a2zipdrive.cpp
index 369aec79a4d..0e57cf691c1 100644
--- a/src/devices/bus/a2bus/a2zipdrive.cpp
+++ b/src/devices/bus/a2bus/a2zipdrive.cpp
@@ -20,7 +20,6 @@
*********************************************************************/
#include "a2zipdrive.h"
-#include "includes/apple2.h"
#include "machine/ataintf.h"
#include "imagedev/harddriv.h"
diff --git a/src/devices/bus/a2bus/laser128.cpp b/src/devices/bus/a2bus/laser128.cpp
index 3ba434abfa4..c7dae25191d 100644
--- a/src/devices/bus/a2bus/laser128.cpp
+++ b/src/devices/bus/a2bus/laser128.cpp
@@ -9,7 +9,6 @@
*********************************************************************/
#include "laser128.h"
-#include "includes/apple2.h"
/***************************************************************************
PARAMETERS
diff --git a/src/devices/bus/a2bus/mouse.cpp b/src/devices/bus/a2bus/mouse.cpp
index 6c0c7410c9a..9a4c7526ee6 100644
--- a/src/devices/bus/a2bus/mouse.cpp
+++ b/src/devices/bus/a2bus/mouse.cpp
@@ -66,15 +66,9 @@
#include "mouse.h"
/***************************************************************************
- PARAMETERS
+ CONSTANTS
***************************************************************************/
-//**************************************************************************
-// GLOBAL VARIABLES
-//**************************************************************************
-
-const device_type A2BUS_MOUSE = &device_creator<a2bus_mouse_device>;
-
#define MOUSE_ROM_REGION "a2mse_rom"
#define MOUSE_PIA_TAG "a2mse_pia"
#define MOUSE_MCU_TAG "a2mse_mcu"
@@ -83,9 +77,14 @@ const device_type A2BUS_MOUSE = &device_creator<a2bus_mouse_device>;
#define MOUSE_XAXIS_TAG "a2mse_x"
#define MOUSE_YAXIS_TAG "a2mse_y"
-#define TIMER_QUADRATURE 0
-MACHINE_CONFIG_FRAGMENT( mouse )
+/***************************************************************************
+ GLOBAL VARIABLES
+***************************************************************************/
+
+const device_type A2BUS_MOUSE = &device_creator<a2bus_mouse_device>;
+
+static MACHINE_CONFIG_FRAGMENT( mouse )
MCFG_CPU_ADD(MOUSE_MCU_TAG, M68705P3, 2043600)
MCFG_M68705_PORTA_R_CB(READ8(a2bus_mouse_device, mcu_port_a_r))
MCFG_M68705_PORTB_R_CB(READ8(a2bus_mouse_device, mcu_port_b_r))
@@ -123,92 +122,85 @@ static INPUT_PORTS_START( mouse )
PORT_BIT( 0xff, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(40) PORT_KEYDELTA(0) PORT_PLAYER(1)
INPUT_PORTS_END
+
/***************************************************************************
- FUNCTION PROTOTYPES
+ DEVICE CONFIGURATION
***************************************************************************/
-//-------------------------------------------------
-// input_ports - device-specific input ports
-//-------------------------------------------------
+/*-------------------------------------------------
+ input_ports - device-specific input ports
+-------------------------------------------------*/
ioport_constructor a2bus_mouse_device::device_input_ports() const
{
- return INPUT_PORTS_NAME( mouse );
+ return INPUT_PORTS_NAME(mouse);
}
-//-------------------------------------------------
-// machine_config_additions - device-specific
-// machine configurations
-//-------------------------------------------------
+/*-------------------------------------------------
+ machine_config_additions - device-specific
+ machine configurations
+-------------------------------------------------*/
machine_config_constructor a2bus_mouse_device::device_mconfig_additions() const
{
- return MACHINE_CONFIG_NAME( mouse );
+ return MACHINE_CONFIG_NAME(mouse);
}
-//-------------------------------------------------
-// rom_region - device-specific ROM region
-//-------------------------------------------------
+/*-------------------------------------------------
+ rom_region - device-specific ROM region
+-------------------------------------------------*/
const tiny_rom_entry *a2bus_mouse_device::device_rom_region() const
{
- return ROM_NAME( mouse );
+ return ROM_NAME(mouse);
}
-//**************************************************************************
-// LIVE DEVICE
-//**************************************************************************
+
+/***************************************************************************
+ LIVE DEVICE
+***************************************************************************/
a2bus_mouse_device::a2bus_mouse_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) :
device_t(mconfig, type, name, tag, owner, clock, shortname, source),
device_a2bus_card_interface(mconfig, *this),
m_pia(*this, MOUSE_PIA_TAG),
m_mcu(*this, MOUSE_MCU_TAG),
- m_mouseb(*this, MOUSE_BUTTON_TAG), m_mousex(*this, MOUSE_XAXIS_TAG), m_mousey(*this, MOUSE_YAXIS_TAG),
+ m_mouseb(*this, MOUSE_BUTTON_TAG), m_mousexy(*this, { MOUSE_XAXIS_TAG, MOUSE_YAXIS_TAG }),
m_rom(*this, MOUSE_ROM_REGION),
+ m_rom_bank(0),
m_port_a_in(0), m_port_b_in(0),
- last_mx(0), last_my(0), count_x(0), count_y(0),
- m_read_timer(nullptr)
+ m_last{ 0, 0 }, m_count{ 0, 0 }
{
- m_rom_bank = 0;
}
a2bus_mouse_device::a2bus_mouse_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
a2bus_mouse_device(mconfig, A2BUS_MOUSE, "Apple II Mouse Card", tag, owner, clock, "a2mouse", __FILE__)
{
- m_rom_bank = 0;
}
-//-------------------------------------------------
-// device_start - device-specific startup
-//-------------------------------------------------
+/*-------------------------------------------------
+ device_start - device-specific startup
+-------------------------------------------------*/
void a2bus_mouse_device::device_start()
{
// set_a2bus_device makes m_slot valid
set_a2bus_device();
- // allocate a timer for the quadrature magic
- m_read_timer = timer_alloc(TIMER_QUADRATURE, nullptr);
- m_read_timer->adjust(attotime::never, TIMER_QUADRATURE);
-
// register save state variables
save_item(NAME(m_port_a_in));
save_item(NAME(m_port_b_in));
- save_item(NAME(last_mx));
- save_item(NAME(last_my));
- save_item(NAME(count_x));
- save_item(NAME(count_y));
+ save_item(NAME(m_last));
+ save_item(NAME(m_count));
+
+ m_port_b_in = 0x00;
}
void a2bus_mouse_device::device_reset()
{
m_rom_bank = 0;
- last_mx = last_my = count_x = count_y = 0;
- m_port_a_in = 0;
- m_port_b_in = 0x80;
-
- m_read_timer->adjust(attotime::from_hz(600.0), TIMER_QUADRATURE, attotime::from_hz(600.0));
+ m_last[0] = m_last[1] = m_count[0] = m_count[1] = 0;
+ m_port_a_in = 0x00;
}
/*-------------------------------------------------
@@ -220,7 +212,6 @@ uint8_t a2bus_mouse_device::read_c0nx(address_space &space, uint8_t offset)
return m_pia->read(space, offset & 3);
}
-
/*-------------------------------------------------
write_c0nx - called for writes to this card's c0nx space
-------------------------------------------------*/
@@ -271,12 +262,28 @@ WRITE8_MEMBER(a2bus_mouse_device::mcu_port_a_w)
READ8_MEMBER(a2bus_mouse_device::mcu_port_b_r)
{
- uint8_t b_in = m_port_b_in;
+ enum { XAXIS, YAXIS };
+ constexpr u8 BUTTON = 0x80;
+ constexpr u8 X0 = 0x02; // gate, must go 0/1 for each pixel moved
+ constexpr u8 X1 = 0x01; // direction, 0 = left, 1 = right
+ constexpr u8 Y0 = 0x04; // direction, 0 = up, 1 = down
+ constexpr u8 Y1 = 0x08; // gate, must go 0/1 for each pixel moved
+
+ // update button now
+ if (m_mouseb->read())
+ {
+ m_port_b_in &= ~BUTTON;
+ }
+ else
+ {
+ m_port_b_in |= BUTTON;
+ }
- // clear the gates, leave everything else alone between pulses
- m_port_b_in &= 0x85;
+ // update the axes
+ update_axis<XAXIS, X1, X0>();
+ update_axis<YAXIS, Y0, Y1>();
- return b_in;
+ return m_port_b_in;
}
WRITE8_MEMBER(a2bus_mouse_device::mcu_port_b_w)
@@ -296,83 +303,35 @@ WRITE8_MEMBER(a2bus_mouse_device::mcu_port_c_w)
m_pia->portb_w(data << 4);
}
-/*
- X0 = direction, 0 = left, 1 = right
- X1 = gate, must go 0/1 for each pixel moved
- Y0 = direction, 0 = up, 1 = down
- Y1 = gate, must go 0/1 for each pixel moved
-
- The direction must stay constant for a given train of gate pulses or the MCU will get confused.
-*/
-void a2bus_mouse_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+template <unsigned AXIS, u8 DIR, u8 CLK> void a2bus_mouse_device::update_axis()
{
- if (id == TIMER_QUADRATURE)
- {
- int new_mx, new_my;
- m_port_b_in = 0x80;
+ // read the axis
+ const int new_m = m_mousexy[AXIS]->read();
- // update button now
- if (m_mouseb->read()) m_port_b_in &= ~0x80;
+ // did it change?
+ int diff = new_m - m_last[AXIS];
- // read the axes
- new_mx = m_mousex->read();
- new_my = m_mousey->read();
+ // check for wrap
+ if (diff > 0x80)
+ diff = 0x100 - diff;
+ if (diff < -0x80)
+ diff = -0x100 - diff;
- // did X change?
- if (new_mx != last_mx)
- {
- int diff = new_mx - last_mx;
-
- /* check for wrap */
- if (diff > 0x80)
- diff = 0x100-diff;
- if (diff < -0x80)
- diff = -0x100-diff;
-
- count_x += diff;
- last_mx = new_mx;
- }
-
- // did Y change?
- if (new_my != last_my)
- {
- int diff = new_my - last_my;
-
- /* check for wrap */
- if (diff > 0x80)
- diff = 0x100-diff;
- if (diff < -0x80)
- diff = -0x100-diff;
+ m_count[AXIS] += diff;
+ m_last[AXIS] = new_m;
- count_y += diff;
- last_my = new_my;
- }
-
- if (count_x)
+ if (m_count[AXIS])
+ {
+ m_port_b_in ^= CLK;
+ if (m_count[AXIS] < 0)
{
- if (count_x < 0)
- {
- count_x++;
- }
- else
- {
- count_x--;
- m_port_b_in |= 0x01; // X1
- }
- m_port_b_in |= 0x02; // X0
+ m_count[AXIS]++;
+ if (m_port_b_in & CLK) m_port_b_in &= ~DIR;
}
- else if (count_y)
+ else
{
- if (count_y < 0)
- {
- count_y++;
- }
- else
- {
- count_y--;
- m_port_b_in |= 0x04; // Y0
- }
- m_port_b_in |= 0x08; // Y1
+ m_count[AXIS]--;
+ if (m_port_b_in & CLK) m_port_b_in |= DIR;
}
}
}
diff --git a/src/devices/bus/a2bus/mouse.h b/src/devices/bus/a2bus/mouse.h
index c5a36319d79..b3148eaa7ff 100644
--- a/src/devices/bus/a2bus/mouse.h
+++ b/src/devices/bus/a2bus/mouse.h
@@ -8,8 +8,8 @@
*********************************************************************/
-#ifndef __A2BUS_MOUSE__
-#define __A2BUS_MOUSE__
+#ifndef MAME_DEVICES_A2BUS_MOUSE_H
+#define MAME_DEVICES_A2BUS_MOUSE_H
#include "emu.h"
#include "a2bus.h"
@@ -33,7 +33,6 @@ public:
virtual machine_config_constructor device_mconfig_additions() const override;
virtual const tiny_rom_entry *device_rom_region() const override;
virtual ioport_constructor device_input_ports() const override;
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
DECLARE_WRITE8_MEMBER(pia_out_a);
DECLARE_WRITE8_MEMBER(pia_out_b);
@@ -57,18 +56,19 @@ protected:
required_device<pia6821_device> m_pia;
required_device<m68705p_device> m_mcu;
- required_ioport m_mouseb, m_mousex, m_mousey;
+ required_ioport m_mouseb;
+ required_ioport_array<2> m_mousexy;
private:
+ template <unsigned AXIS, u8 DIR, u8 CLK> void update_axis();
+
required_region_ptr<uint8_t> m_rom;
int m_rom_bank;
- uint8_t m_port_a_in;
- uint8_t m_port_b_in;
- int last_mx, last_my, count_x, count_y;
- emu_timer *m_read_timer;
+ uint8_t m_port_a_in, m_port_b_in;
+ int m_last[2], m_count[2];
};
// device type definition
extern const device_type A2BUS_MOUSE;
-#endif /* __A2BUS_MOUSE__ */
+#endif // MAME_DEVICES_A2BUS_MOUSE_H
diff --git a/src/devices/bus/abcbus/abcbus.h b/src/devices/bus/abcbus/abcbus.h
index 906d3d1b3d2..9fe542944c9 100644
--- a/src/devices/bus/abcbus/abcbus.h
+++ b/src/devices/bus/abcbus/abcbus.h
@@ -121,34 +121,34 @@
#define MCFG_ABCBUS_SLOT_IRQ_CALLBACK(_irq) \
- downcast<abcbus_slot_t *>(device)->set_irq_callback(DEVCB_##_irq);
+ devcb = &downcast<abcbus_slot_t *>(device)->set_irq_callback(DEVCB_##_irq);
#define MCFG_ABCBUS_SLOT_NMI_CALLBACK(_nmi) \
- downcast<abcbus_slot_t *>(device)->set_nmi_callback(DEVCB_##_nmi);
+ devcb = &downcast<abcbus_slot_t *>(device)->set_nmi_callback(DEVCB_##_nmi);
#define MCFG_ABCBUS_SLOT_RDY_CALLBACK(_rdy) \
- downcast<abcbus_slot_t *>(device)->set_rdy_callback(DEVCB_##_rdy);
+ devcb = &downcast<abcbus_slot_t *>(device)->set_rdy_callback(DEVCB_##_rdy);
#define MCFG_ABCBUS_SLOT_RESIN_CALLBACK(_resin) \
- downcast<abcbus_slot_t *>(device)->set_resin_callback(DEVCB_##_resin);
+ devcb = &downcast<abcbus_slot_t *>(device)->set_resin_callback(DEVCB_##_resin);
#define MCFG_ABCBUS_SLOT_PREN_CALLBACK(_pren) \
- downcast<abcbus_slot_t *>(device)->set_pren_callback(DEVCB_##_pren);
+ devcb = &downcast<abcbus_slot_t *>(device)->set_pren_callback(DEVCB_##_pren);
#define MCFG_ABCBUS_SLOT_TRRQ_CALLBACK(_trrq) \
- downcast<abcbus_slot_t *>(device)->set_trrq_callback(DEVCB_##_trrq);
+ devcb = &downcast<abcbus_slot_t *>(device)->set_trrq_callback(DEVCB_##_trrq);
#define MCFG_ABCBUS_SLOT_XINT2_CALLBACK(_xint2) \
- downcast<abcbus_slot_t *>(device)->set_xint2_callback(DEVCB_##_xint2);
+ devcb = &downcast<abcbus_slot_t *>(device)->set_xint2_callback(DEVCB_##_xint2);
#define MCFG_ABCBUS_SLOT_XINT3_CALLBACK(_xint3) \
- downcast<abcbus_slot_t *>(device)->set_xint3_callback(DEVCB_##_xint3);
+ devcb = &downcast<abcbus_slot_t *>(device)->set_xint3_callback(DEVCB_##_xint3);
#define MCFG_ABCBUS_SLOT_XINT4_CALLBACK(_xint4) \
- downcast<abcbus_slot_t *>(device)->set_xint4_callback(DEVCB_##_xint4);
+ devcb = &downcast<abcbus_slot_t *>(device)->set_xint4_callback(DEVCB_##_xint4);
#define MCFG_ABCBUS_SLOT_XINT5_CALLBACK(_xint5) \
- downcast<abcbus_slot_t *>(device)->set_xint5_callback(DEVCB_##_xint5);
+ devcb = &downcast<abcbus_slot_t *>(device)->set_xint5_callback(DEVCB_##_xint5);
@@ -207,16 +207,16 @@ public:
// construction/destruction
abcbus_slot_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template<class _irq> void set_irq_callback(_irq irq) { m_write_irq.set_callback(irq); }
- template<class _nmi> void set_nmi_callback(_nmi nmi) { m_write_nmi.set_callback(nmi); }
- template<class _rdy> void set_rdy_callback(_rdy rdy) { m_write_rdy.set_callback(rdy); }
- template<class _resin> void set_resin_callback(_resin resin) { m_write_resin.set_callback(resin); }
- template<class _pren> void set_pren_callback(_pren pren) { m_write_pren.set_callback(pren); }
- template<class _trrq> void set_trrq_callback(_trrq trrq) { m_write_trrq.set_callback(trrq); }
- template<class _xint2> void set_xint2_callback(_xint2 xint2) { m_write_xint2.set_callback(xint2); }
- template<class _xint3> void set_xint3_callback(_xint3 xint3) { m_write_xint3.set_callback(xint3); }
- template<class _xint4> void set_xint4_callback(_xint4 xint4) { m_write_xint4.set_callback(xint4); }
- template<class _xint5> void set_xint5_callback(_xint5 xint5) { m_write_xint5.set_callback(xint5); }
+ template<class _irq> devcb_base &set_irq_callback(_irq irq) { return m_write_irq.set_callback(irq); }
+ template<class _nmi> devcb_base &set_nmi_callback(_nmi nmi) { return m_write_nmi.set_callback(nmi); }
+ template<class _rdy> devcb_base &set_rdy_callback(_rdy rdy) { return m_write_rdy.set_callback(rdy); }
+ template<class _resin> devcb_base &set_resin_callback(_resin resin) { return m_write_resin.set_callback(resin); }
+ template<class _pren> devcb_base &set_pren_callback(_pren pren) { return m_write_pren.set_callback(pren); }
+ template<class _trrq> devcb_base &set_trrq_callback(_trrq trrq) { return m_write_trrq.set_callback(trrq); }
+ template<class _xint2> devcb_base &set_xint2_callback(_xint2 xint2) { return m_write_xint2.set_callback(xint2); }
+ template<class _xint3> devcb_base &set_xint3_callback(_xint3 xint3) { return m_write_xint3.set_callback(xint3); }
+ template<class _xint4> devcb_base &set_xint4_callback(_xint4 xint4) { return m_write_xint4.set_callback(xint4); }
+ template<class _xint5> devcb_base &set_xint5_callback(_xint5 xint5) { return m_write_xint5.set_callback(xint5); }
// computer interface
void cs_w(uint8_t data) { if (m_card) m_card->abcbus_cs(data); }
diff --git a/src/devices/bus/amiga/keyboard/a1200.cpp b/src/devices/bus/amiga/keyboard/a1200.cpp
new file mode 100644
index 00000000000..c9588ca0a8a
--- /dev/null
+++ b/src/devices/bus/amiga/keyboard/a1200.cpp
@@ -0,0 +1,170 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+/***************************************************************************
+
+ Amiga 1200 Keyboard
+
+ 391508-01 = Rev 0 is MC68HC05C4AFN
+ 391508-02 = Rev 1 is MC68HC05C12FN
+
+***************************************************************************/
+
+#include "emu.h"
+#include "a1200.h"
+#include "matrix.h"
+
+#include "cpu/m6805/m68hc05.h"
+
+//#define VERBOSE 1
+#include "logmacro.h"
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+device_type const A1200_KBD = &device_creator<bus::amiga::keyboard::a1200_kbd_device>;
+
+
+
+namespace bus { namespace amiga { namespace keyboard {
+
+namespace {
+
+INPUT_PORTS_START(a1200_mod)
+ PORT_START("MOD")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LWIN) PORT_CHAR(UCHAR_MAMEKEY(LWIN)) PORT_NAME("Left Amiga")
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT)) PORT_NAME("Left Alt")
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) PORT_NAME("Left Shift")
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL)) PORT_NAME("Ctrl")
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RWIN) PORT_CHAR(UCHAR_MAMEKEY(RWIN)) PORT_NAME("Right Amiga")
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_SHIFT_2) PORT_NAME("Right Alt")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_MAMEKEY(RSHIFT)) PORT_NAME("Right Shift")
+INPUT_PORTS_END
+
+INPUT_PORTS_START(a1200_us_keyboard)
+ PORT_INCLUDE(matrix_us)
+ PORT_INCLUDE(a1200_mod)
+INPUT_PORTS_END
+
+
+MACHINE_CONFIG_FRAGMENT(a1200kbd_revB)
+ MCFG_CPU_ADD("mpu", M68HC705C8A, XTAL_3MHz)
+ MCFG_M68HC05_PORTB_R_CB(READ8(a1200_kbd_device, mpu_portb_r));
+ MCFG_M68HC05_PORTD_R_CB(IOPORT("MOD"));
+ MCFG_M68HC05_PORTA_W_CB(WRITE8(a1200_kbd_device, mpu_porta_w));
+ MCFG_M68HC05_PORTB_W_CB(WRITE8(a1200_kbd_device, mpu_portb_w));
+ MCFG_M68HC05_PORTC_W_CB(WRITE8(a1200_kbd_device, mpu_portc_w));
+ MCFG_M68HC05_TCMP_CB(WRITELINE(a1200_kbd_device, mpu_tcmp));
+MACHINE_CONFIG_END
+
+
+ROM_START(a1200kbd_revB)
+ ROM_REGION(0x2000, "mpu", 0)
+ ROM_LOAD("DFA_Rev_B_A1200_HC705.bin", 0x0000, 0x2000, CRC(2a77eec4) SHA1(301ec6a69404457d912c89e3fc54095eda9f0e93))
+ROM_END
+
+} // anonymous namespace
+
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+a1200_kbd_device::a1200_kbd_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, A1200_KBD, "Amiga 1200 Keyboard Rev B", tag, owner, clock, "a1200kbd_rb", __FILE__)
+ , device_amiga_keyboard_interface(mconfig, *this)
+ , m_rows(*this, "ROW%u", 0)
+ , m_mpu(*this, "mpu")
+ , m_row_drive(0xffff)
+ , m_host_kdat(true)
+ , m_mpu_kdat(true)
+{
+}
+
+WRITE_LINE_MEMBER(a1200_kbd_device::kdat_w)
+{
+ if (bool(state) != m_host_kdat)
+ {
+ LOG("host DATA %u -> %u\n", m_host_kdat ? 1 : 0, state ? 1 : 0);
+ m_host_kdat = bool(state);
+ if (m_mpu_kdat)
+ m_mpu->set_input_line(M68HC05_TCAP_LINE, m_host_kdat ? 1 : 0);
+ }
+}
+
+READ8_MEMBER(a1200_kbd_device::mpu_portb_r)
+{
+ u8 result(m_host_kdat ? 0xff : 0xfe);
+ for (unsigned row = 0; m_rows.size() > row; ++row)
+ {
+ if (!BIT(m_row_drive, row))
+ result &= m_rows[row]->read();
+ }
+ return result;
+}
+
+WRITE8_MEMBER(a1200_kbd_device::mpu_porta_w)
+{
+ m_row_drive = (m_row_drive & 0xff00) | u16(u8(data | ~mem_mask));
+}
+
+WRITE8_MEMBER(a1200_kbd_device::mpu_portb_w)
+{
+ u8 const kdat(BIT(data, 0) | BIT(~mem_mask, 0));
+ m_host->kdat_w(kdat ? 1 : 0);
+ m_host->kclk_w(BIT(data, 1));
+
+ if (bool(kdat) != m_mpu_kdat)
+ {
+ LOG("keyboard DATA %u -> %u\n", m_mpu_kdat ? 1 : 0, kdat);
+ m_mpu_kdat = bool(kdat);
+ if (m_host_kdat)
+ m_mpu->set_input_line(M68HC05_TCAP_LINE, kdat);
+ }
+}
+
+WRITE8_MEMBER(a1200_kbd_device::mpu_portc_w)
+{
+ m_row_drive = (m_row_drive & 0x80ff) | (u16(u8(data | ~mem_mask) & 0x7f) << 8);
+ machine().output().set_value("led_kbd_caps", BIT(~data, 7));
+}
+
+WRITE_LINE_MEMBER(a1200_kbd_device::mpu_tcmp)
+{
+ m_host->krst_w(state);
+}
+
+machine_config_constructor a1200_kbd_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME(a1200kbd_revB);
+}
+
+const tiny_rom_entry *a1200_kbd_device::device_rom_region() const
+{
+ return ROM_NAME(a1200kbd_revB);
+}
+
+ioport_constructor a1200_kbd_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(a1200_us_keyboard);
+}
+
+void a1200_kbd_device::device_start()
+{
+ save_item(NAME(m_row_drive));
+ save_item(NAME(m_host_kdat));
+ save_item(NAME(m_mpu_kdat));
+
+ m_row_drive = 0xffff;
+ m_host_kdat = true;
+ m_mpu_kdat = true;
+}
+
+void a1200_kbd_device::device_reset()
+{
+}
+
+} } } // namespace bus::amiga::keyboard
diff --git a/src/devices/bus/amiga/keyboard/a1200.h b/src/devices/bus/amiga/keyboard/a1200.h
new file mode 100644
index 00000000000..f29689b18e3
--- /dev/null
+++ b/src/devices/bus/amiga/keyboard/a1200.h
@@ -0,0 +1,66 @@
+// license:BSD-3-Clause
+// copyright-holders: Vas Crabb
+/***************************************************************************
+
+ Amiga 1200 Keyboard
+
+ ***************************************************************************/
+
+#ifndef DEVICES_BUS_AMIGA_KEYBOARD_A1200_H
+#define DEVICES_BUS_AMIGA_KEYBOARD_A1200_H
+
+#pragma once
+
+#include "keyboard.h"
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+extern device_type const A1200_KBD;
+
+
+namespace bus { namespace amiga { namespace keyboard {
+
+//**************************************************************************
+// TYPE DECLARATIONS
+//**************************************************************************
+
+// ======================> a1200_kbd_device
+
+class a1200_kbd_device : public device_t, public device_amiga_keyboard_interface
+{
+public:
+ // construction/destruction
+ a1200_kbd_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock);
+
+ // from host
+ virtual DECLARE_WRITE_LINE_MEMBER(kdat_w) override;
+
+ // MPU I/O
+ DECLARE_READ8_MEMBER(mpu_portb_r);
+ DECLARE_WRITE8_MEMBER(mpu_porta_w);
+ DECLARE_WRITE8_MEMBER(mpu_portb_w);
+ DECLARE_WRITE8_MEMBER(mpu_portc_w);
+ DECLARE_WRITE_LINE_MEMBER(mpu_tcmp);
+
+protected:
+ virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual machine_config_constructor device_mconfig_additions() const override;
+ virtual ioport_constructor device_input_ports() const override;
+
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+ required_ioport_array<15> m_rows;
+ required_device<cpu_device> m_mpu;
+
+ u16 m_row_drive;
+ bool m_host_kdat, m_mpu_kdat;
+};
+
+} } } // namespace bus::amiga::keyboard
+
+#endif // DEVICES_BUS_AMIGA_KEYBOARD_A1200_H
diff --git a/src/devices/bus/amiga/keyboard/a500.cpp b/src/devices/bus/amiga/keyboard/a500.cpp
new file mode 100644
index 00000000000..80c241a6b62
--- /dev/null
+++ b/src/devices/bus/amiga/keyboard/a500.cpp
@@ -0,0 +1,423 @@
+// license: GPL-2.0+
+// copyright-holders: Dirk Best
+/***************************************************************************
+
+ Amiga 500 Keyboard
+
+ TODO: - Move 6500/1 to its own CPU core so that it can be shared with
+ other systems
+
+***************************************************************************/
+
+#include "emu.h"
+#include "a500.h"
+#include "matrix.h"
+
+#include "machine/rescap.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type A500_KBD_US = &device_creator<bus::amiga::keyboard::a500_kbd_us_device>;
+const device_type A500_KBD_DE = &device_creator<bus::amiga::keyboard::a500_kbd_de_device>;
+
+
+namespace bus { namespace amiga { namespace keyboard {
+
+//-------------------------------------------------
+// machine_config_additions - device-specific
+// machine configurations
+//-------------------------------------------------
+
+static ADDRESS_MAP_START( mpu6500_map, AS_PROGRAM, 8, a500_kbd_us_device )
+ ADDRESS_MAP_GLOBAL_MASK(0xfff)
+ AM_RANGE(0x000, 0x03f) AM_RAM
+ AM_RANGE(0x080, 0x080) AM_READWRITE(port_a_r, port_a_w)
+ AM_RANGE(0x081, 0x081) AM_READ_PORT("special") AM_WRITE(port_b_w)
+ AM_RANGE(0x082, 0x082) AM_WRITE(port_c_w)
+ AM_RANGE(0x083, 0x083) AM_WRITE(port_d_w)
+ AM_RANGE(0x084, 0x085) AM_WRITE(latch_w)
+ AM_RANGE(0x086, 0x087) AM_READ(counter_r)
+ AM_RANGE(0x088, 0x088) AM_WRITE(transfer_latch_w)
+ AM_RANGE(0x089, 0x089) AM_WRITE(clear_pa0_detect)
+ AM_RANGE(0x08a, 0x08a) AM_WRITE(clear_pa1_detect)
+ AM_RANGE(0x08f, 0x08f) AM_READWRITE(control_r, control_w)
+ AM_RANGE(0x090, 0x0ff) AM_NOP
+ AM_RANGE(0x800, 0xfff) AM_ROM AM_REGION("ic1", 0)
+ADDRESS_MAP_END
+
+static MACHINE_CONFIG_FRAGMENT( kbd_pcb )
+ MCFG_CPU_ADD("ic1", M6502, XTAL_3MHz / 2)
+ MCFG_CPU_PROGRAM_MAP(mpu6500_map)
+MACHINE_CONFIG_END
+
+machine_config_constructor a500_kbd_us_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME(kbd_pcb);
+}
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+ROM_START( kbd_pcb )
+ ROM_REGION(0x800, "ic1", 0)
+ ROM_LOAD("328191-02.ic1", 0x000, 0x800, CRC(4a3fc332) SHA1(83b21d0c8b93fc9b9b3b287fde4ec8f3badac5a2))
+ROM_END
+
+const tiny_rom_entry *a500_kbd_us_device::device_rom_region() const
+{
+ return ROM_NAME(kbd_pcb);
+}
+
+//-------------------------------------------------
+// input_ports - device-specific input ports
+//-------------------------------------------------
+
+static INPUT_PORTS_START( a500_special )
+ PORT_START("special")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LWIN) PORT_CHAR(UCHAR_MAMEKEY(LWIN)) PORT_NAME("Left Amiga") PORT_CHANGED_MEMBER(DEVICE_SELF, a500_kbd_us_device, check_reset, nullptr)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT)) PORT_NAME("Left Alt")
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) PORT_NAME("Left Shift")
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL)) PORT_NAME("Ctrl") PORT_CHANGED_MEMBER(DEVICE_SELF, a500_kbd_us_device, check_reset, nullptr)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RWIN) PORT_CHAR(UCHAR_MAMEKEY(RWIN)) PORT_NAME("Right Amiga") PORT_CHANGED_MEMBER(DEVICE_SELF, a500_kbd_us_device, check_reset, nullptr)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_SHIFT_2) PORT_NAME("Right Alt")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_MAMEKEY(RSHIFT)) PORT_NAME("Right Shift")
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( a500_us_keyboard )
+ PORT_INCLUDE(a500_special)
+ PORT_INCLUDE(matrix_us)
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( a500_de_keyboard )
+ PORT_INCLUDE(a500_special)
+ PORT_INCLUDE(matrix_de)
+INPUT_PORTS_END
+
+ioport_constructor a500_kbd_us_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( a500_us_keyboard );
+}
+
+ioport_constructor a500_kbd_de_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( a500_de_keyboard );
+}
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// a500_kbd_us_device - constructor
+//-------------------------------------------------
+
+a500_kbd_us_device::a500_kbd_us_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ a500_kbd_us_device(mconfig, tag, owner, clock, A500_KBD_US, "Amiga 500 Keyboard (U.S./Canada)", "a500_kbd_us", __FILE__)
+{
+}
+
+a500_kbd_us_device::a500_kbd_us_device(
+ const machine_config &mconfig,
+ const char *tag,
+ device_t *owner,
+ uint32_t clock,
+ device_type type,
+ const char *name,
+ const char *shortname,
+ const char *file) :
+ device_t(mconfig, type, name, tag, owner, clock, shortname, file),
+ device_amiga_keyboard_interface(mconfig, *this),
+ m_mpu(*this, "ic1"),
+ m_special(*this, "special"),
+ m_rows(*this, "ROW%u", 0),
+ m_timer(nullptr),
+ m_watchdog(nullptr),
+ m_reset(nullptr),
+ m_host_kdat(1),
+ m_mpu_kdat(1),
+ m_kclk(1),
+ m_port_c(0xff),
+ m_port_d(0xff),
+ m_latch(0xffff),
+ m_counter(0xffff),
+ m_control(0x00)
+{
+}
+
+//-------------------------------------------------
+// a500_kbd_de_device - constructor
+//-------------------------------------------------
+
+a500_kbd_de_device::a500_kbd_de_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ a500_kbd_us_device(mconfig, tag, owner, clock, A500_KBD_DE, "Amiga 500 Keyboard (Germany/Austria)", "a500_kbd_de", __FILE__)
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void a500_kbd_us_device::device_start()
+{
+ // allocate timers
+ m_timer = timer_alloc(0, nullptr);
+ m_watchdog = timer_alloc(1, nullptr);
+ m_reset = timer_alloc(2, nullptr);
+
+ // register for save states
+ save_item(NAME(m_host_kdat));
+ save_item(NAME(m_mpu_kdat));
+ save_item(NAME(m_kclk));
+ save_item(NAME(m_port_c));
+ save_item(NAME(m_port_d));
+ save_item(NAME(m_latch));
+ save_item(NAME(m_counter));
+ save_item(NAME(m_control));
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void a500_kbd_us_device::device_reset()
+{
+ // stack starts 0
+ m_mpu->set_state_int(M6502_S, 0);
+
+ m_host_kdat = 1;
+ m_mpu_kdat = 1;
+ m_kclk = 1;
+ m_port_c = 0xff;
+ m_port_d = 0xff;
+ m_latch = 0xffff; // not initialized by hardware
+ m_counter = 0xffff; // not initialized by hardware
+ m_control = 0x00;
+
+ m_timer->adjust(attotime::zero, 0, attotime::from_hz(XTAL_3MHz / 2));
+ m_watchdog->adjust(attotime::from_msec(54));
+}
+
+void a500_kbd_us_device::device_timer(emu_timer &timer, device_timer_id tid, int param, void *ptr)
+{
+ switch (tid)
+ {
+ // 6500/1 internal timer
+ case 0:
+ switch (m_control & 0x03)
+ {
+ // interval timer, pulse width measurement (connected to gnd here)
+ case 0:
+ case 3:
+ if (m_counter-- == 0)
+ {
+ // counter overflow
+ m_control |= COUNTER_OVERFLOW;
+ m_counter = m_latch;
+
+ // generate interrupt?
+ update_irqs();
+ }
+ break;
+
+ // pulse generator
+ case 1:
+ break;
+
+ // event counter
+ case 2:
+ break;
+ }
+ break;
+
+ // watchdog
+ case 1:
+ m_mpu->reset();
+ m_watchdog->adjust(attotime::from_msec(54));
+ break;
+
+ // keyboard reset timer
+ case 2:
+ m_host->krst_w(1);
+ break;
+ }
+}
+
+
+//**************************************************************************
+// IMPLEMENTATION
+//**************************************************************************
+
+INPUT_CHANGED_MEMBER( a500_kbd_us_device::check_reset )
+{
+ uint8_t keys = m_special->read();
+
+ // ctrl-amiga-amiga pressed?
+ if (!BIT(keys, 6) && !BIT(keys, 3) && !BIT(keys, 2))
+ {
+ m_host->krst_w(0);
+ m_reset->adjust(PERIOD_OF_555_MONOSTABLE(RES_K(47), CAP_U(10)));
+ }
+}
+
+void a500_kbd_us_device::update_irqs()
+{
+ if ((m_control & PA1_INT_ENABLED) && (m_control & PA1_NEGATIVE_EDGE))
+ m_mpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
+
+ else if ((m_control & PA0_INT_ENABLED) && (m_control & PA0_POSITIVE_EDGE))
+ m_mpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
+
+ else if ((m_control & COUNTER_INT_ENABLED) && (m_control & COUNTER_OVERFLOW))
+ m_mpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
+
+ else
+ m_mpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
+}
+
+READ8_MEMBER( a500_kbd_us_device::port_a_r )
+{
+ uint8_t data = 0xfc;
+
+ // kdat & kclk
+ data |= (m_host_kdat & m_mpu_kdat) << 0;
+ data |= m_kclk << 1;
+
+ // scan port d and c rows
+ uint16_t const row_drive = (uint16_t(m_port_d | 0x80) << 8) | uint16_t(m_port_c);
+ for (unsigned i = 0; i < m_rows.size(); i++)
+ if (!BIT(row_drive, m_rows.size() - i - 1)) data &= m_rows[i]->read();
+
+ return data;
+}
+
+WRITE8_MEMBER( a500_kbd_us_device::port_a_w )
+{
+ // look for pa0 edge
+ if (m_host_kdat && !m_mpu_kdat && BIT(data, 0))
+ {
+ m_control |= PA0_POSITIVE_EDGE;
+ update_irqs();
+ }
+
+ // and pa1 edge
+ if (m_kclk && !BIT(data, 1))
+ {
+ m_control |= PA1_NEGATIVE_EDGE;
+ update_irqs();
+ }
+
+ // update with new values and output
+ if (m_mpu_kdat != BIT(data, 0))
+ {
+ m_mpu_kdat = BIT(data, 0);
+ m_host->kdat_w(m_mpu_kdat);
+ }
+
+ if (m_kclk != BIT(data, 1))
+ {
+ m_kclk = BIT(data, 1);
+ m_host->kclk_w(m_kclk);
+ }
+}
+
+WRITE8_MEMBER( a500_kbd_us_device::port_b_w )
+{
+ // caps lock led
+ machine().output().set_value("led_kbd_caps", BIT(data, 7));
+}
+
+WRITE8_MEMBER( a500_kbd_us_device::port_c_w )
+{
+ m_port_c = data;
+}
+
+WRITE8_MEMBER( a500_kbd_us_device::port_d_w )
+{
+ // reset watchdog on 0 -> 1 transition
+ if (!BIT(m_port_d, 7) && BIT(data, 7))
+ m_watchdog->adjust(attotime::from_msec(54));
+
+ m_port_d = data;
+}
+
+WRITE8_MEMBER( a500_kbd_us_device::latch_w )
+{
+ if (offset == 0)
+ {
+ m_latch &= 0x00ff;
+ m_latch |= data << 8;
+ }
+ else
+ {
+ m_latch &= 0xff00;
+ m_latch |= data << 0;
+ }
+}
+
+READ8_MEMBER( a500_kbd_us_device::counter_r )
+{
+ if (!space.debugger_access())
+ {
+ m_control &= ~COUNTER_OVERFLOW;
+ update_irqs();
+ }
+
+ if (offset == 0)
+ return m_counter >> 8;
+ else
+ return m_counter >> 0;
+}
+
+WRITE8_MEMBER( a500_kbd_us_device::transfer_latch_w )
+{
+ m_control &= ~COUNTER_OVERFLOW;
+ update_irqs();
+
+ m_latch &= 0x00ff;
+ m_latch |= data << 8;
+
+ m_counter = m_latch;
+}
+
+WRITE8_MEMBER( a500_kbd_us_device::clear_pa0_detect )
+{
+ m_control &= ~PA0_POSITIVE_EDGE;
+ update_irqs();
+}
+
+WRITE8_MEMBER( a500_kbd_us_device::clear_pa1_detect )
+{
+ m_control &= ~PA1_NEGATIVE_EDGE;
+ update_irqs();
+}
+
+READ8_MEMBER( a500_kbd_us_device::control_r )
+{
+ return m_control;
+}
+
+WRITE8_MEMBER( a500_kbd_us_device::control_w )
+{
+ m_control = data;
+ update_irqs();
+}
+
+WRITE_LINE_MEMBER( a500_kbd_us_device::kdat_w )
+{
+ // detect positive edge
+ if (!m_host_kdat && m_mpu_kdat && state)
+ {
+ m_control |= PA0_POSITIVE_EDGE;
+ update_irqs();
+ }
+
+ m_host_kdat = state;
+}
+
+} } } // namespace bus::amiga::keyboard
diff --git a/src/devices/bus/amiga/keyboard/a500.h b/src/devices/bus/amiga/keyboard/a500.h
new file mode 100644
index 00000000000..f4aeee81804
--- /dev/null
+++ b/src/devices/bus/amiga/keyboard/a500.h
@@ -0,0 +1,150 @@
+// license: GPL-2.0+
+// copyright-holders: Dirk Best
+/***************************************************************************
+
+ Amiga 500 Keyboard
+
+ Assembly part numbers:
+
+ - 312502-01 U.S./Canada
+ - 312502-02 Germany/Austria
+ - 312502-03 France/Belgium
+ - 312502-04 Italy
+ - 312502-05 Sweden/Finland
+ - 312502-06 Spain
+ - 312502-07 Denmark
+ - 312502-08 Switzerland
+ - 312502-09 Norway
+ - 312502-12 UK
+
+ Amiga 1000 (for reference, to be moved):
+
+ - 327063-01 U.S./Canada
+ - 327063-02 UK
+ - 327063-03 Germany
+ - 327063-04 France
+ - 327063-05 Italy
+
+***************************************************************************/
+
+#ifndef DEVICES_BUS_AMIGA_KEYBOARD_A500_H
+#define DEVICES_BUS_AMIGA_KEYBOARD_A500_H
+
+#pragma once
+
+#include "keyboard.h"
+#include "cpu/m6502/m6502.h"
+
+
+namespace bus { namespace amiga { namespace keyboard {
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> a500_kbd_us_device
+
+class a500_kbd_us_device : public device_t, public device_amiga_keyboard_interface
+{
+public:
+ // construction/destruction
+ a500_kbd_us_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ // from host
+ virtual DECLARE_WRITE_LINE_MEMBER(kdat_w) override;
+
+ // 6500/1 internal
+ DECLARE_READ8_MEMBER(port_a_r);
+ DECLARE_WRITE8_MEMBER(port_a_w);
+ DECLARE_WRITE8_MEMBER(port_b_w);
+ DECLARE_WRITE8_MEMBER(port_c_w);
+ DECLARE_WRITE8_MEMBER(port_d_w);
+ DECLARE_WRITE8_MEMBER(latch_w);
+ DECLARE_READ8_MEMBER(counter_r);
+ DECLARE_WRITE8_MEMBER(transfer_latch_w);
+ DECLARE_WRITE8_MEMBER(clear_pa0_detect);
+ DECLARE_WRITE8_MEMBER(clear_pa1_detect);
+ DECLARE_READ8_MEMBER(control_r);
+ DECLARE_WRITE8_MEMBER(control_w);
+
+ DECLARE_INPUT_CHANGED_MEMBER(check_reset);
+
+protected:
+ a500_kbd_us_device(
+ const machine_config &mconfig,
+ const char *tag,
+ device_t *owner,
+ uint32_t clock,
+ device_type type,
+ const char *name,
+ const char *shortname,
+ const char *file);
+
+ // device-level overrides
+ virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual machine_config_constructor device_mconfig_additions() const override;
+ virtual ioport_constructor device_input_ports() const override;
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+
+private:
+ enum
+ {
+ // counter modes
+ COUNTER_INTERVAL = 0x00,
+ COUNTER_PULSE = 0x01,
+ COUNTER_EVENT = 0x02,
+ COUNTER_PWM = 0x03,
+
+ // interrupt enables
+ PA1_INT_ENABLED = 0x04,
+ PA0_INT_ENABLED = 0x08,
+ COUNTER_INT_ENABLED = 0x10,
+
+ // status
+ PA1_NEGATIVE_EDGE = 0x20,
+ PA0_POSITIVE_EDGE = 0x40,
+ COUNTER_OVERFLOW = 0x80
+ };
+
+ void update_irqs();
+
+ required_device<m6502_device> m_mpu;
+ required_ioport m_special;
+ required_ioport_array<15> m_rows;
+
+ emu_timer *m_timer;
+ emu_timer *m_watchdog;
+ emu_timer *m_reset;
+
+ int m_host_kdat;
+ int m_mpu_kdat;
+ int m_kclk;
+
+ uint8_t m_port_c;
+ uint8_t m_port_d;
+ uint16_t m_latch;
+ uint16_t m_counter;
+ uint8_t m_control;
+};
+
+// ======================> a500_kbd_de_device
+
+class a500_kbd_de_device : public a500_kbd_us_device
+{
+public:
+ a500_kbd_de_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ virtual ioport_constructor device_input_ports() const override;
+};
+
+} } } // namespace bus::amiga::keyboard
+
+
+// device type definition
+extern const device_type A500_KBD_US;
+extern const device_type A500_KBD_DE;
+
+#endif // DEVICES_BUS_AMIGA_KEYBOARD_A500_H
diff --git a/src/devices/bus/amiga/keyboard/keyboard.cpp b/src/devices/bus/amiga/keyboard/keyboard.cpp
new file mode 100644
index 00000000000..c9d9bc95ce9
--- /dev/null
+++ b/src/devices/bus/amiga/keyboard/keyboard.cpp
@@ -0,0 +1,110 @@
+// license: GPL-2.0+
+// copyright-holders: Dirk Best
+/***************************************************************************
+
+ Amiga Keyboard Interface
+
+***************************************************************************/
+
+#include "keyboard.h"
+#include "a500.h"
+#include "a1200.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type AMIGA_KEYBOARD_INTERFACE = &device_creator<amiga_keyboard_bus_device>;
+
+
+//**************************************************************************
+// SLOT DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// amiga_keyboard_bus_device - constructor
+//-------------------------------------------------
+
+amiga_keyboard_bus_device::amiga_keyboard_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, AMIGA_KEYBOARD_INTERFACE, "Amiga Keyboard Interface", tag, owner, clock, "amiga_kbd", __FILE__),
+ device_slot_interface(mconfig, *this),
+ m_kbd(nullptr),
+ m_kclk_handler(*this), m_kdat_handler(*this), m_krst_handler(*this)
+{
+}
+
+//-------------------------------------------------
+// amiga_keyboard_bus_device - destructor
+//-------------------------------------------------
+
+amiga_keyboard_bus_device::~amiga_keyboard_bus_device()
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void amiga_keyboard_bus_device::device_start()
+{
+ // get connected keyboard
+ m_kbd = dynamic_cast<device_amiga_keyboard_interface *>(get_card_device());
+
+ // resolve callbacks
+ m_kclk_handler.resolve_safe();
+ m_kdat_handler.resolve_safe();
+ m_krst_handler.resolve_safe();
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void amiga_keyboard_bus_device::device_reset()
+{
+}
+
+//-------------------------------------------------
+// host to module interface
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER( amiga_keyboard_bus_device::kdat_in_w )
+{
+ if (m_kbd)
+ m_kbd->kdat_w(state);
+}
+
+
+//**************************************************************************
+// KEYBOARD INTERFACE
+//**************************************************************************
+
+//-------------------------------------------------
+// device_amiga_keyboard_interface - constructor
+//-------------------------------------------------
+
+device_amiga_keyboard_interface::device_amiga_keyboard_interface(const machine_config &mconfig, device_t &device) :
+ device_slot_card_interface(mconfig, device)
+{
+ m_host = dynamic_cast<amiga_keyboard_bus_device *>(device.owner());
+}
+
+//-------------------------------------------------
+// ~device_amiga_keyboard_interface - destructor
+//-------------------------------------------------
+
+device_amiga_keyboard_interface::~device_amiga_keyboard_interface()
+{
+}
+
+
+//**************************************************************************
+// SLOT INTERFACE
+//**************************************************************************
+
+SLOT_INTERFACE_START( amiga_keyboard_devices )
+ SLOT_INTERFACE("a500_us", A500_KBD_US)
+ SLOT_INTERFACE("a500_de", A500_KBD_DE)
+ SLOT_INTERFACE("a1200_us", A1200_KBD)
+SLOT_INTERFACE_END
diff --git a/src/devices/bus/amiga/keyboard/keyboard.h b/src/devices/bus/amiga/keyboard/keyboard.h
new file mode 100644
index 00000000000..deb2f79295a
--- /dev/null
+++ b/src/devices/bus/amiga/keyboard/keyboard.h
@@ -0,0 +1,108 @@
+// license: GPL-2.0+
+// copyright-holders: Dirk Best
+/***************************************************************************
+
+ Amiga Keyboard Interface
+
+ Serial data and reset control
+
+ - KDAT (serial data)
+ - KCLK (serial clock)
+ - KRST (reset output)
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef DEVICES_BUS_AMIGA_KEYBOARD_H
+#define DEVICES_BUS_AMIGA_KEYBOARD_H
+
+#include "emu.h"
+
+
+//**************************************************************************
+// INTERFACE CONFIGURATION MACROS
+//**************************************************************************
+
+#define MCFG_AMIGA_KEYBOARD_INTERFACE_ADD(_tag, _def_slot) \
+ MCFG_DEVICE_ADD(_tag, AMIGA_KEYBOARD_INTERFACE, 0) \
+ MCFG_DEVICE_SLOT_INTERFACE(amiga_keyboard_devices, _def_slot, false)
+
+#define MCFG_AMIGA_KEYBOARD_KCLK_HANDLER(_devcb) \
+ devcb = &amiga_keyboard_bus_device::set_kclk_handler(*device, DEVCB_##_devcb);
+
+#define MCFG_AMIGA_KEYBOARD_KDAT_HANDLER(_devcb) \
+ devcb = &amiga_keyboard_bus_device::set_kdat_handler(*device, DEVCB_##_devcb);
+
+#define MCFG_AMIGA_KEYBOARD_KRST_HANDLER(_devcb) \
+ devcb = &amiga_keyboard_bus_device::set_krst_handler(*device, DEVCB_##_devcb);
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class device_amiga_keyboard_interface;
+
+// ======================> amiga_keyboard_bus_device
+
+class amiga_keyboard_bus_device : public device_t, public device_slot_interface
+{
+public:
+ // construction/destruction
+ amiga_keyboard_bus_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ virtual ~amiga_keyboard_bus_device();
+
+ // callbacks
+ template<class _Object> static devcb_base &set_kclk_handler(device_t &device, _Object object)
+ { return downcast<amiga_keyboard_bus_device &>(device).m_kclk_handler.set_callback(object); }
+
+ template<class _Object> static devcb_base &set_kdat_handler(device_t &device, _Object object)
+ { return downcast<amiga_keyboard_bus_device &>(device).m_kdat_handler.set_callback(object); }
+
+ template<class _Object> static devcb_base &set_krst_handler(device_t &device, _Object object)
+ { return downcast<amiga_keyboard_bus_device &>(device).m_krst_handler.set_callback(object); }
+
+ // called from keyboard
+ DECLARE_WRITE_LINE_MEMBER(kclk_w) { m_kclk_handler(state); }
+ DECLARE_WRITE_LINE_MEMBER(kdat_w) { m_kdat_handler(state); }
+ DECLARE_WRITE_LINE_MEMBER(krst_w) { m_krst_handler(state); }
+
+ // called from host
+ DECLARE_WRITE_LINE_MEMBER(kdat_in_w);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+ device_amiga_keyboard_interface *m_kbd;
+
+ devcb_write_line m_kclk_handler;
+ devcb_write_line m_kdat_handler;
+ devcb_write_line m_krst_handler;
+};
+
+// ======================> device_amiga_keyboard_interface
+
+class device_amiga_keyboard_interface : public device_slot_card_interface
+{
+public:
+ // construction/destruction
+ device_amiga_keyboard_interface(const machine_config &mconfig, device_t &device);
+ virtual ~device_amiga_keyboard_interface();
+
+ virtual DECLARE_WRITE_LINE_MEMBER(kdat_w) = 0;
+
+protected:
+ amiga_keyboard_bus_device *m_host;
+};
+
+// device type definition
+extern const device_type AMIGA_KEYBOARD_INTERFACE;
+
+// supported devices
+SLOT_INTERFACE_EXTERN( amiga_keyboard_devices );
+
+#endif // DEVICES_BUS_AMIGA_KEYBOARD_H
diff --git a/src/devices/bus/amiga/keyboard/matrix.cpp b/src/devices/bus/amiga/keyboard/matrix.cpp
new file mode 100644
index 00000000000..6f9b1d4d629
--- /dev/null
+++ b/src/devices/bus/amiga/keyboard/matrix.cpp
@@ -0,0 +1,318 @@
+// license:BSD-3-Clause
+// copyright-holders: Vas Crabb
+/***************************************************************************
+
+ Amiga Keyboard Matrix Ports
+
+ ***************************************************************************/
+
+#include "emu.h"
+#include "matrix.h"
+
+namespace bus { namespace amiga { namespace keyboard {
+
+INPUT_PORTS_START(matrix_us)
+ PORT_START("ROW0")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR(UCHAR_MAMEKEY(ASTERISK))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK))
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_CHAR(9)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('`') PORT_CHAR('~')
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW1")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') PORT_CHAR(0x00b1) PORT_CHAR(0x00ac) // ± ¬
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') PORT_CHAR(0x00e6) PORT_CHAR(0x00c6) // æ Æ
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') PORT_CHAR(0x00e5) PORT_CHAR(0x00c5) // å Å
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') PORT_CHAR(0x00b9) // ¹
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_NUMLOCK) PORT_CHAR(UCHAR_MAMEKEY(NUMLOCK))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW2")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') PORT_CHAR(0x00d7) PORT_CHAR(0x00f7) // × ÷
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') PORT_CHAR(0x00df) PORT_CHAR(0x00a7) // ß §
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') PORT_CHAR(0x00b0) // °
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') PORT_CHAR(0x00b2) // ²
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW3")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') PORT_CHAR(0x00e7) PORT_CHAR(0x00c7) // ç Ç
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') PORT_CHAR(0x00f0) PORT_CHAR(0x00d0) // ð Ã
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') PORT_CHAR(0x00a9) // ©
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') PORT_CHAR(0x00b3) // ³
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW4")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') PORT_CHAR(0x00aa) // ª
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') // dead key (acute) not supported by natural keyboard
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') PORT_CHAR(0x00ae) // ®
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') PORT_CHAR(0x00a2) // ¢
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW5")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') PORT_CHAR(0x00ba) // º
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') // dead key (grave) not supported by natural keyboard
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') PORT_CHAR(0x00fe) PORT_CHAR(0x00de) // þ Þ
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') PORT_CHAR(0x00bc) // ¼
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW6")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') PORT_CHAR(0x00ad) PORT_CHAR(0x00af) // soft hyphen ¯
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') // dead key (circumflex) not supported by natural keyboard
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') PORT_CHAR(0x00a4) PORT_CHAR(0x00a5) // ¤ ¥
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^') PORT_CHAR(0x00bd) // ½
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW7")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') PORT_CHAR(0x00b8) PORT_CHAR(0x00bf) // ¸ ¿
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') // dead key (tilde) not supported by natural keyboard
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') PORT_CHAR(0x00b5) // µ
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') PORT_CHAR(0x00be) // ¾
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SCRLOCK) PORT_CHAR(UCHAR_MAMEKEY(SCRLOCK))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW8")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') // dead key (umlaut) not supported by natural keyboard
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') PORT_CHAR(0x00a1) PORT_CHAR(0x00a6) // ¡ ¦
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*') PORT_CHAR(0x00b7) // ·
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW9")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') PORT_CHAR(0x00a3) // £
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') PORT_CHAR(0x00f8) PORT_CHAR(0x00d8) // ø Ø
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') PORT_CHAR(0x00ab) // «
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHAR(UCHAR_MAMEKEY(SLASH_PAD))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW10")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':')
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') PORT_CHAR(0x00b6) // ¶
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') PORT_CHAR(0x00bb) // »
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW11")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('"')
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{')
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_')
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW12")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}')
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+')
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW13")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DEL) PORT_CHAR(UCHAR_MAMEKEY(DEL))
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|')
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW14")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_INSERT) PORT_CHAR(UCHAR_MAMEKEY(INSERT)) PORT_NAME("Help")
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+INPUT_PORTS_END
+
+INPUT_PORTS_START(matrix_de)
+ PORT_START("ROW0")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR(UCHAR_MAMEKEY(ASTERISK))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH2) PORT_CHAR('<') PORT_CHAR('>')
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK))
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_CHAR(9)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('`') PORT_CHAR('~')
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW1")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('y') PORT_CHAR('Y') PORT_CHAR(0x00b1) PORT_CHAR(0x00ac) // ± ¬
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') PORT_CHAR(0x00e6) PORT_CHAR(0x00c6) // æ Æ
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') PORT_CHAR(0x00e5) PORT_CHAR(0x00c5) // å Å
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') PORT_CHAR(0x00b9) // ¹
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_NUMLOCK) PORT_CHAR(UCHAR_MAMEKEY(NUMLOCK))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW2")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') PORT_CHAR(0x00d7) PORT_CHAR(0x00f7) // × ÷
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') PORT_CHAR(0x00df) PORT_CHAR(0x00a7) // ß §
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') PORT_CHAR(0x00b0) // °
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"') PORT_CHAR('@') PORT_CHAR(0x00b2) // ²
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW3")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') PORT_CHAR(0x00e7) PORT_CHAR(0x00c7) // ç Ç
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') PORT_CHAR(0x00f0) PORT_CHAR(0x00d0) // ð Ã
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') PORT_CHAR(0x00a9) // ©
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR(0x00a7) PORT_CHAR(0x00b3) PORT_CHAR('#') // § ³
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW4")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') PORT_CHAR(0x00aa) // ª
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') // dead key (acute) not supported by natural keyboard
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') PORT_CHAR(0x00ae) // ®
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') PORT_CHAR(0x00b0) PORT_CHAR(0x00a2) // ° ¢
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW5")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') PORT_CHAR(0x00ba) // º
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') // dead key (grave) not supported by natural keyboard
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') PORT_CHAR(0x00fe) PORT_CHAR(0x00de) // þ Þ
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') PORT_CHAR(0x00bc) // ¼
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW6")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') PORT_CHAR(0x00ad) PORT_CHAR(0x00af) // soft hyphen ¯
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') // dead key (circumflex) not supported by natural keyboard
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('z') PORT_CHAR('Z') PORT_CHAR(0x00a4) PORT_CHAR(0x00a5) // ¤ ¥
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') PORT_CHAR(0x00bd) PORT_CHAR('^') // ½
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW7")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') PORT_CHAR(0x00b8) PORT_CHAR(0x00bf) // ¸ ¿
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') // dead key (tilde) not supported by natural keyboard
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') PORT_CHAR(0x00b5) // µ
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('/') PORT_CHAR(0x00be) PORT_CHAR('&') // ¾
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SCRLOCK) PORT_CHAR(UCHAR_MAMEKEY(SCRLOCK))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW8")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR(';')
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') // dead key (umlaut) not supported by natural keyboard
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') PORT_CHAR(0x00a1) PORT_CHAR(0x00a6) // ¡ ¦
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') PORT_CHAR(0x00b7) PORT_CHAR('*') // ·
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW9")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR(':')
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') PORT_CHAR(0x00a3) // £
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') PORT_CHAR(0x00f8) PORT_CHAR(0x00d8) // ø Ø
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') PORT_CHAR(0x00ab) // «
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHAR(UCHAR_MAMEKEY(SLASH_PAD))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW10")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('-') PORT_CHAR('_')
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(0x00f6) PORT_CHAR(0x00d6) PORT_CHAR(';') PORT_CHAR(':') // ö Ö
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') PORT_CHAR(0x00b6) // ¶
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR('=') PORT_CHAR(0x00bb) // »
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW11")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(0x00e4) PORT_CHAR(0x00c4) PORT_CHAR('\'') PORT_CHAR('"') // ä Ä
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR(0x00fc) PORT_CHAR(0x00dc) PORT_CHAR('[') PORT_CHAR('{') // ü Ü
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR(0x00df) PORT_CHAR('?') PORT_CHAR('-') PORT_CHAR('_') // ß
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW12")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('#') PORT_CHAR('^')
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('+') PORT_CHAR('*') PORT_CHAR(']') PORT_CHAR('}')
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR(0x00b4) // ´
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW13")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DEL) PORT_CHAR(UCHAR_MAMEKEY(DEL))
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F11) PORT_CHAR('\\') PORT_CHAR('|')
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("ROW14")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_INSERT) PORT_CHAR(UCHAR_MAMEKEY(INSERT)) PORT_NAME("Help")
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
+INPUT_PORTS_END
+
+} } } // namespace bus::amiga::keyboard
diff --git a/src/devices/bus/amiga/keyboard/matrix.h b/src/devices/bus/amiga/keyboard/matrix.h
new file mode 100644
index 00000000000..82f635c25a3
--- /dev/null
+++ b/src/devices/bus/amiga/keyboard/matrix.h
@@ -0,0 +1,21 @@
+// license:BSD-3-Clause
+// copyright-holders: Vas Crabb
+/***************************************************************************
+
+ Amiga Keyboard Matrix Ports
+
+ ***************************************************************************/
+
+#ifndef DEVICES_BUS_AMIGA_KEYBOARD_MATRIX_H
+#define DEVICES_BUS_AMIGA_KEYBOARD_MATRIX_H
+
+#pragma once
+
+namespace bus { namespace amiga { namespace keyboard {
+
+INPUT_PORTS_EXTERN(matrix_us);
+INPUT_PORTS_EXTERN(matrix_de);
+
+} } } // namespace bus::amiga::keyboard
+
+#endif // DEVICES_BUS_AMIGA_KEYBOARD_MATRIX_H
diff --git a/src/devices/bus/c64/exp.cpp b/src/devices/bus/c64/exp.cpp
index 92c7eb64e5d..ab37fe19481 100644
--- a/src/devices/bus/c64/exp.cpp
+++ b/src/devices/bus/c64/exp.cpp
@@ -339,6 +339,7 @@ int c64_expansion_slot_device::exrom_r(offs_t offset, int sphi2, int ba, int rw,
#include "sfx_sound_expander.h"
#include "silverrock.h"
#include "simons_basic.h"
+#include "speakeasy.h"
#include "stardos.h"
#include "std.h"
#include "structured_basic.h"
@@ -375,6 +376,7 @@ SLOT_INTERFACE_START( c64_expansion_cards )
SLOT_INTERFACE("reu1750", C64_REU1750)
SLOT_INTERFACE("reu1764", C64_REU1764)
SLOT_INTERFACE("sfxse", C64_SFX_SOUND_EXPANDER)
+ SLOT_INTERFACE("speakez", C64_SPEAKEASY)
SLOT_INTERFACE("supercpu", C64_SUPERCPU)
SLOT_INTERFACE("swiftlink", C64_SWIFTLINK)
SLOT_INTERFACE("turbo232", C64_TURBO232)
diff --git a/src/devices/bus/c64/speakeasy.cpp b/src/devices/bus/c64/speakeasy.cpp
new file mode 100644
index 00000000000..6c59b7a11a5
--- /dev/null
+++ b/src/devices/bus/c64/speakeasy.cpp
@@ -0,0 +1,103 @@
+// license:BSD-3-Clause
+// copyright-holders:smf
+/**********************************************************************
+
+ Personal Peripheral Products Speakeasy 64 cartridge emulation
+
+**********************************************************************/
+
+#include "speakeasy.h"
+
+
+
+//**************************************************************************
+// MACROS/CONSTANTS
+//**************************************************************************
+
+#define SC01A_TAG "sc01a"
+
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type C64_SPEAKEASY = &device_creator<c64_speakeasy_t>;
+
+
+//-------------------------------------------------
+// MACHINE_DRIVER( speakeasy )
+//-------------------------------------------------
+
+static MACHINE_CONFIG_FRAGMENT( speakeasy )
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+
+ MCFG_SOUND_ADD(SC01A_TAG, VOTRAX_SC01, 720000)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.85)
+MACHINE_CONFIG_END
+
+
+//-------------------------------------------------
+// machine_config_additions - device-specific
+// machine configurations
+//-------------------------------------------------
+
+machine_config_constructor c64_speakeasy_t::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( speakeasy );
+}
+
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// c64_speakeasy_t - constructor
+//-------------------------------------------------
+
+c64_speakeasy_t::c64_speakeasy_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, C64_SPEAKEASY, "Speakeasy 64", tag, owner, clock, "speakeasy64", __FILE__),
+ device_c64_expansion_card_interface(mconfig, *this),
+ m_votrax(*this, SC01A_TAG)
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void c64_speakeasy_t::device_start()
+{
+}
+
+
+//-------------------------------------------------
+// c64_cd_r - cartridge data read
+//-------------------------------------------------
+
+uint8_t c64_speakeasy_t::c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+{
+ if (!io1)
+ {
+ return m_votrax->request() << 7;
+ }
+
+ return data;
+}
+
+
+//-------------------------------------------------
+// c64_cd_w - cartridge data write
+//-------------------------------------------------
+
+void c64_speakeasy_t::c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+{
+ if (!io1)
+ {
+ m_votrax->write(space, 0, data & 0x3f);
+ m_votrax->inflection_w(space, 0, data >> 6);
+ }
+}
diff --git a/src/devices/bus/c64/speakeasy.h b/src/devices/bus/c64/speakeasy.h
new file mode 100644
index 00000000000..136a565344f
--- /dev/null
+++ b/src/devices/bus/c64/speakeasy.h
@@ -0,0 +1,54 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/**********************************************************************
+
+ Personal Peripheral Products Speakeasy 64 cartridge emulation
+
+**********************************************************************/
+
+#pragma once
+
+#ifndef __C64_SPEAKEASY__
+#define __C64_SPEAKEASY__
+
+#include "emu.h"
+#include "exp.h"
+#include "sound/votrax.h"
+
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> c64_speakeasy_t
+
+class c64_speakeasy_t : public device_t,
+ public device_c64_expansion_card_interface
+{
+public:
+ // construction/destruction
+ c64_speakeasy_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ // optional information overrides
+ virtual machine_config_constructor device_mconfig_additions() const override;
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+ // device_c64_expansion_card_interface overrides
+ virtual uint8_t c64_cd_r(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(address_space &space, offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+
+private:
+ required_device<votrax_sc01_device> m_votrax;
+};
+
+
+// device type definition
+extern const device_type C64_SPEAKEASY;
+
+
+
+#endif
diff --git a/src/devices/bus/cbmiec/cbmiec.h b/src/devices/bus/cbmiec/cbmiec.h
index 8ba9b8b2f02..d9ee6605a93 100644
--- a/src/devices/bus/cbmiec/cbmiec.h
+++ b/src/devices/bus/cbmiec/cbmiec.h
@@ -32,19 +32,19 @@
#define MCFG_CBM_IEC_BUS_SRQ_CALLBACK(_write) \
- downcast<cbm_iec_device *>(device)->set_srq_callback(DEVCB_##_write);
+ devcb = &downcast<cbm_iec_device *>(device)->set_srq_callback(DEVCB_##_write);
#define MCFG_CBM_IEC_BUS_ATN_CALLBACK(_write) \
- downcast<cbm_iec_device *>(device)->set_atn_callback(DEVCB_##_write);
+ devcb = &downcast<cbm_iec_device *>(device)->set_atn_callback(DEVCB_##_write);
#define MCFG_CBM_IEC_BUS_CLK_CALLBACK(_write) \
- downcast<cbm_iec_device *>(device)->set_clk_callback(DEVCB_##_write);
+ devcb = &downcast<cbm_iec_device *>(device)->set_clk_callback(DEVCB_##_write);
#define MCFG_CBM_IEC_BUS_DATA_CALLBACK(_write) \
- downcast<cbm_iec_device *>(device)->set_data_callback(DEVCB_##_write);
+ devcb = &downcast<cbm_iec_device *>(device)->set_data_callback(DEVCB_##_write);
#define MCFG_CBM_IEC_BUS_RESET_CALLBACK(_write) \
- downcast<cbm_iec_device *>(device)->set_reset_callback(DEVCB_##_write);
+ devcb = &downcast<cbm_iec_device *>(device)->set_reset_callback(DEVCB_##_write);
#define MCFG_CBM_IEC_SLOT_ADD(_tag, _address, _slot_intf, _def_slot) \
@@ -78,11 +78,11 @@ public:
// construction/destruction
cbm_iec_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template<class _write> void set_srq_callback(_write wr) { m_write_srq.set_callback(wr); }
- template<class _write> void set_atn_callback(_write wr) { m_write_atn.set_callback(wr); }
- template<class _write> void set_clk_callback(_write wr) { m_write_clk.set_callback(wr); }
- template<class _write> void set_data_callback(_write wr) { m_write_data.set_callback(wr); }
- template<class _write> void set_reset_callback(_write wr) { m_write_reset.set_callback(wr); }
+ template<class _write> devcb_base &set_srq_callback(_write wr) { return m_write_srq.set_callback(wr); }
+ template<class _write> devcb_base &set_atn_callback(_write wr) { return m_write_atn.set_callback(wr); }
+ template<class _write> devcb_base &set_clk_callback(_write wr) { return m_write_clk.set_callback(wr); }
+ template<class _write> devcb_base &set_data_callback(_write wr) { return m_write_data.set_callback(wr); }
+ template<class _write> devcb_base &set_reset_callback(_write wr) { return m_write_reset.set_callback(wr); }
void add_device(cbm_iec_slot_device *slot, device_t *target);
diff --git a/src/devices/bus/coco/coco_dwsock.cpp b/src/devices/bus/coco/coco_dwsock.cpp
index afd8e4dad5f..1d5322e1801 100644
--- a/src/devices/bus/coco/coco_dwsock.cpp
+++ b/src/devices/bus/coco/coco_dwsock.cpp
@@ -10,7 +10,6 @@
#include "emu.h"
#include "osdcore.h"
-#include "includes/coco.h"
#include "coco_dwsock.h"
diff --git a/src/devices/bus/coco/coco_fdc.cpp b/src/devices/bus/coco/coco_fdc.cpp
index c80ebc61391..fbab4c4c58a 100644
--- a/src/devices/bus/coco/coco_fdc.cpp
+++ b/src/devices/bus/coco/coco_fdc.cpp
@@ -46,7 +46,6 @@
#include "cococart.h"
#include "coco_fdc.h"
#include "imagedev/flopdrv.h"
-#include "includes/coco.h"
#include "machine/msm6242.h"
#include "machine/ds1315.h"
#include "machine/wd_fdc.h"
diff --git a/src/devices/bus/coco/coco_multi.cpp b/src/devices/bus/coco/coco_multi.cpp
index fcfd764a169..dcfe5f062aa 100644
--- a/src/devices/bus/coco/coco_multi.cpp
+++ b/src/devices/bus/coco/coco_multi.cpp
@@ -52,7 +52,6 @@
***************************************************************************/
#include "emu.h"
-#include "includes/coco.h"
#include "coco_multi.h"
#include "coco_232.h"
#include "coco_orch90.h"
@@ -161,7 +160,7 @@ void coco_multipak_device::device_start()
// install $FF7F handler
write8_delegate wh = write8_delegate(FUNC(coco_multipak_device::ff7f_write), this);
- machine().device(MAINCPU_TAG)->memory().space(AS_PROGRAM).install_write_handler(0xFF7F, 0xFF7F, wh);
+ machine().device(":maincpu")->memory().space(AS_PROGRAM).install_write_handler(0xFF7F, 0xFF7F, wh);
// initial state
m_select = 0xFF;
diff --git a/src/devices/bus/coco/coco_pak.cpp b/src/devices/bus/coco/coco_pak.cpp
index 1cc9e4f5e05..e3ba87bbbdb 100644
--- a/src/devices/bus/coco/coco_pak.cpp
+++ b/src/devices/bus/coco/coco_pak.cpp
@@ -10,9 +10,9 @@
#include "emu.h"
#include "coco_pak.h"
-#include "includes/coco.h"
#define CARTSLOT_TAG "cart"
+#define CART_AUTOSTART_TAG "cart_autostart"
/***************************************************************************
IMPLEMENTATION
@@ -26,6 +26,19 @@ ROM_START( coco_pak )
// this region is filled by cococart_slot_device::call_load()
ROM_END
+
+//-------------------------------------------------
+// INPUT_PORTS( coco_cart_autostart )
+//-------------------------------------------------
+
+static INPUT_PORTS_START( coco_cart_autostart )
+ PORT_START(CART_AUTOSTART_TAG)
+ PORT_CONFNAME( 0x01, 0x01, "Cart Auto-Start" )
+ PORT_CONFSETTING( 0x00, DEF_STR( Off ))
+ PORT_CONFSETTING( 0x01, DEF_STR( On ))
+INPUT_PORTS_END
+
+
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
@@ -42,14 +55,14 @@ const device_type COCO_PAK = &device_creator<coco_pak_device>;
coco_pak_device::coco_pak_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source)
: device_t(mconfig, type, name, tag, owner, clock, shortname, source),
device_cococart_interface( mconfig, *this ), m_cart(nullptr), m_owner(nullptr),
- m_autostart(*this, ":" CART_AUTOSTART_TAG)
+ m_autostart(*this, CART_AUTOSTART_TAG)
{
}
coco_pak_device::coco_pak_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, COCO_PAK, "CoCo Program PAK", tag, owner, clock, "cocopak", __FILE__),
device_cococart_interface( mconfig, *this ), m_cart(nullptr), m_owner(nullptr),
- m_autostart(*this, ":" CART_AUTOSTART_TAG)
+ m_autostart(*this, CART_AUTOSTART_TAG)
{
}
@@ -74,6 +87,15 @@ machine_config_constructor coco_pak_device::device_mconfig_additions() const
}
//-------------------------------------------------
+// input_ports - device-specific input ports
+//-------------------------------------------------
+
+ioport_constructor coco_pak_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( coco_cart_autostart );
+}
+
+//-------------------------------------------------
// rom_region - device-specific ROM region
//-------------------------------------------------
diff --git a/src/devices/bus/coco/coco_pak.h b/src/devices/bus/coco/coco_pak.h
index f6a93ec459f..84f8e68f75f 100644
--- a/src/devices/bus/coco/coco_pak.h
+++ b/src/devices/bus/coco/coco_pak.h
@@ -26,6 +26,7 @@ public:
// optional information overrides
virtual machine_config_constructor device_mconfig_additions() const override;
virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual ioport_constructor device_input_ports() const override;
virtual uint8_t* get_cart_base() override;
protected:
diff --git a/src/devices/bus/coco/coco_t4426.cpp b/src/devices/bus/coco/coco_t4426.cpp
index b969ac9bcbb..1d5c3b3fa2f 100644
--- a/src/devices/bus/coco/coco_t4426.cpp
+++ b/src/devices/bus/coco/coco_t4426.cpp
@@ -41,12 +41,11 @@
#include "emu.h"
#include "coco_t4426.h"
-#include "includes/coco.h"
#define LOG_GENERAL 0x01
#define LOG_SETUP 0x02
#define LOG_PRINTF 0x04
-#define LOG_PIA 0x08
+#define LOG_PIA 0x08
#define VERBOSE 0 //(LOG_PIA | LOG_PRINTF | LOG_SETUP | LOG_GENERAL)
@@ -74,6 +73,7 @@
#define UART_TAG "acia"
#define PIA_TAG "pia"
#define CARTSLOT_TAG "t4426"
+#define CART_AUTOSTART_TAG "cart_autostart"
/***************************************************************************
IMPLEMENTATION
@@ -109,6 +109,17 @@ ROM_START( coco_t4426 )
ROM_RELOAD(0x18000,0x1000)
ROM_END
+//-------------------------------------------------
+// INPUT_PORTS( coco_cart_autostart )
+//-------------------------------------------------
+
+static INPUT_PORTS_START( coco_cart_autostart )
+ PORT_START(CART_AUTOSTART_TAG)
+ PORT_CONFNAME( 0x01, 0x01, "Cart Auto-Start" )
+ PORT_CONFSETTING( 0x00, DEF_STR( Off ))
+ PORT_CONFSETTING( 0x01, DEF_STR( On ))
+INPUT_PORTS_END
+
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
@@ -129,7 +140,7 @@ coco_t4426_device::coco_t4426_device(const machine_config &mconfig, device_type
,m_cart(nullptr)
,m_owner(nullptr)
,m_select(0)
- ,m_autostart(*this, ":" CART_AUTOSTART_TAG)
+ ,m_autostart(*this, CART_AUTOSTART_TAG)
,m_uart(*this, UART_TAG)
,m_pia(*this, PIA_TAG)
{
@@ -141,7 +152,7 @@ coco_t4426_device::coco_t4426_device(const machine_config &mconfig, const char *
,m_cart(nullptr)
,m_owner(nullptr)
,m_select(0)
- ,m_autostart(*this, ":" CART_AUTOSTART_TAG)
+ ,m_autostart(*this, CART_AUTOSTART_TAG)
,m_uart(*this, UART_TAG)
,m_pia(*this, PIA_TAG)
{
@@ -179,6 +190,16 @@ const tiny_rom_entry *coco_t4426_device::device_rom_region() const
return ROM_NAME( coco_t4426 );
}
+//-------------------------------------------------
+// input_ports - device-specific input ports
+//-------------------------------------------------
+
+ioport_constructor coco_t4426_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( coco_cart_autostart );
+}
+
+
/*-------------------------------------------------
device_reset - device-specific startup
-------------------------------------------------*/
@@ -225,8 +246,8 @@ WRITE8_MEMBER(coco_t4426_device::write)
/*----------------------------------------------------
pia_A_w - PIA port A write
- The T4426 cartridge PIA Port A is connected to
- the CE* input of each 2764 ROM and used for banking
+ The T4426 cartridge PIA Port A is connected to
+ the CE* input of each 2764 ROM and used for banking
in the correct BASIC module at C000-DFFF
The main cartridge ROM at E000-FF00 is fixed however
-----------------------------------------------------*/
diff --git a/src/devices/bus/coco/coco_t4426.h b/src/devices/bus/coco/coco_t4426.h
index a0ec0532142..9fd446c21fb 100644
--- a/src/devices/bus/coco/coco_t4426.h
+++ b/src/devices/bus/coco/coco_t4426.h
@@ -28,6 +28,7 @@ public:
// optional information overrides
virtual machine_config_constructor device_mconfig_additions() const override;
virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual ioport_constructor device_input_ports() const override;
virtual uint8_t* get_cart_base() override;
DECLARE_WRITE8_MEMBER( pia_A_w );
diff --git a/src/devices/bus/coco/dragon_fdc.cpp b/src/devices/bus/coco/dragon_fdc.cpp
index e32bab843e9..f633d465f8c 100644
--- a/src/devices/bus/coco/dragon_fdc.cpp
+++ b/src/devices/bus/coco/dragon_fdc.cpp
@@ -69,7 +69,6 @@
#include "cococart.h"
#include "coco_fdc.h"
#include "imagedev/flopdrv.h"
-#include "includes/coco.h"
#include "machine/wd_fdc.h"
#include "formats/dmk_dsk.h"
#include "formats/jvc_dsk.h"
diff --git a/src/devices/bus/cpc/amdrum.cpp b/src/devices/bus/cpc/amdrum.cpp
index 3ed2f019655..18eea564be0 100644
--- a/src/devices/bus/cpc/amdrum.cpp
+++ b/src/devices/bus/cpc/amdrum.cpp
@@ -7,7 +7,6 @@
*/
#include "emu.h"
-#include "includes/amstrad.h"
#include "amdrum.h"
#include "sound/volt_reg.h"
diff --git a/src/devices/bus/cpc/cpc_pds.cpp b/src/devices/bus/cpc/cpc_pds.cpp
index 311bca693cb..0708cb67f9a 100644
--- a/src/devices/bus/cpc/cpc_pds.cpp
+++ b/src/devices/bus/cpc/cpc_pds.cpp
@@ -8,7 +8,6 @@
#include "emu.h"
#include "cpc_pds.h"
-#include "includes/amstrad.h"
//**************************************************************************
diff --git a/src/devices/bus/cpc/cpc_rom.cpp b/src/devices/bus/cpc/cpc_rom.cpp
index 766c6b8277e..aae1044dc26 100644
--- a/src/devices/bus/cpc/cpc_rom.cpp
+++ b/src/devices/bus/cpc/cpc_rom.cpp
@@ -8,10 +8,10 @@
#include "emu.h"
#include "cpc_rom.h"
-#include "includes/amstrad.h"
const device_type CPC_ROM = &device_creator<cpc_rom_device>;
+SLOT_INTERFACE_EXTERN(cpc_exp_cards);
//**************************************************************************
// DEVICE CONFIG INTERFACE
diff --git a/src/devices/bus/cpc/cpc_rs232.cpp b/src/devices/bus/cpc/cpc_rs232.cpp
index 00090ace9aa..b00503584f0 100644
--- a/src/devices/bus/cpc/cpc_rs232.cpp
+++ b/src/devices/bus/cpc/cpc_rs232.cpp
@@ -7,7 +7,8 @@
*/
#include "cpc_rs232.h"
-#include "includes/amstrad.h"
+
+SLOT_INTERFACE_EXTERN(cpc_exp_cards);
//**************************************************************************
// DEVICE DEFINITIONS
diff --git a/src/devices/bus/cpc/cpc_ssa1.cpp b/src/devices/bus/cpc/cpc_ssa1.cpp
index 9779f4b96da..ef21af1e384 100644
--- a/src/devices/bus/cpc/cpc_ssa1.cpp
+++ b/src/devices/bus/cpc/cpc_ssa1.cpp
@@ -10,7 +10,7 @@
#include "emu.h"
#include "cpc_ssa1.h"
-#include "includes/amstrad.h"
+SLOT_INTERFACE_EXTERN(cpc_exp_cards);
//**************************************************************************
// DEVICE DEFINITIONS
diff --git a/src/devices/bus/cpc/ddi1.cpp b/src/devices/bus/cpc/ddi1.cpp
index ef21cb9f319..be82f2f05b8 100644
--- a/src/devices/bus/cpc/ddi1.cpp
+++ b/src/devices/bus/cpc/ddi1.cpp
@@ -6,8 +6,8 @@
#include "emu.h"
#include "ddi1.h"
-#include "includes/amstrad.h"
#include "softlist.h"
+SLOT_INTERFACE_EXTERN(cpc_exp_cards);
//**************************************************************************
// DEVICE DEFINITIONS
diff --git a/src/devices/bus/cpc/doubler.cpp b/src/devices/bus/cpc/doubler.cpp
index 79d47383b6c..5e5f6587404 100644
--- a/src/devices/bus/cpc/doubler.cpp
+++ b/src/devices/bus/cpc/doubler.cpp
@@ -7,7 +7,7 @@
*/
#include "doubler.h"
-#include "includes/amstrad.h"
+SLOT_INTERFACE_EXTERN(cpc_exp_cards);
//**************************************************************************
// DEVICE DEFINITIONS
diff --git a/src/devices/bus/cpc/hd20.cpp b/src/devices/bus/cpc/hd20.cpp
index 163687d41c7..370b3076b8c 100644
--- a/src/devices/bus/cpc/hd20.cpp
+++ b/src/devices/bus/cpc/hd20.cpp
@@ -8,8 +8,7 @@
#include "emu.h"
#include "hd20.h"
-#include "includes/amstrad.h"
-
+SLOT_INTERFACE_EXTERN(cpc_exp_cards);
//**************************************************************************
// DEVICE DEFINITIONS
diff --git a/src/devices/bus/cpc/magicsound.cpp b/src/devices/bus/cpc/magicsound.cpp
index b80b9218884..d2bf11d2009 100644
--- a/src/devices/bus/cpc/magicsound.cpp
+++ b/src/devices/bus/cpc/magicsound.cpp
@@ -8,10 +8,9 @@
*/
#include "emu.h"
-#include "includes/amstrad.h"
#include "magicsound.h"
#include "sound/volt_reg.h"
-
+SLOT_INTERFACE_EXTERN(cpc_exp_cards);
//**************************************************************************
// DEVICE DEFINITIONS
diff --git a/src/devices/bus/cpc/mface2.cpp b/src/devices/bus/cpc/mface2.cpp
index 7832de1ba7c..90d08716e25 100644
--- a/src/devices/bus/cpc/mface2.cpp
+++ b/src/devices/bus/cpc/mface2.cpp
@@ -8,7 +8,7 @@
#include "emu.h"
#include "mface2.h"
-#include "includes/amstrad.h"
+SLOT_INTERFACE_EXTERN(cpc_exp_cards);
//**************************************************************************
// DEVICE DEFINITIONS
diff --git a/src/devices/bus/cpc/playcity.cpp b/src/devices/bus/cpc/playcity.cpp
index eece3a9c2d7..41896009037 100644
--- a/src/devices/bus/cpc/playcity.cpp
+++ b/src/devices/bus/cpc/playcity.cpp
@@ -11,7 +11,7 @@
*/
#include "playcity.h"
-#include "includes/amstrad.h"
+SLOT_INTERFACE_EXTERN(cpc_exp_cards);
//**************************************************************************
// DEVICE DEFINITIONS
diff --git a/src/devices/bus/cpc/smartwatch.cpp b/src/devices/bus/cpc/smartwatch.cpp
index f7ae8148037..b6a453d79cd 100644
--- a/src/devices/bus/cpc/smartwatch.cpp
+++ b/src/devices/bus/cpc/smartwatch.cpp
@@ -11,8 +11,7 @@
#include "emu.h"
#include "smartwatch.h"
-#include "includes/amstrad.h"
-
+SLOT_INTERFACE_EXTERN(cpc_exp_cards);
//**************************************************************************
// DEVICE DEFINITIONS
diff --git a/src/devices/bus/cpc/transtape.cpp b/src/devices/bus/cpc/transtape.cpp
index 1b3056d12c9..df05e1e491a 100644
--- a/src/devices/bus/cpc/transtape.cpp
+++ b/src/devices/bus/cpc/transtape.cpp
@@ -9,7 +9,7 @@
*/
#include "transtape.h"
-#include "includes/amstrad.h"
+SLOT_INTERFACE_EXTERN(cpc_exp_cards);
//**************************************************************************
// DEVICE DEFINITIONS
diff --git a/src/devices/bus/ep64/exp.h b/src/devices/bus/ep64/exp.h
index 153afb0abc6..cbba96f1efa 100644
--- a/src/devices/bus/ep64/exp.h
+++ b/src/devices/bus/ep64/exp.h
@@ -48,7 +48,7 @@
#define __EP64_EXPANSION_BUS__
#include "emu.h"
-#include "audio/dave.h"
+#include "sound/dave.h"
diff --git a/src/devices/bus/epson_sio/epson_sio.h b/src/devices/bus/epson_sio/epson_sio.h
index c52ebcc11d9..616a407ae5c 100644
--- a/src/devices/bus/epson_sio/epson_sio.h
+++ b/src/devices/bus/epson_sio/epson_sio.h
@@ -23,10 +23,10 @@
MCFG_DEVICE_SLOT_INTERFACE(epson_sio_devices, _def_slot, false)
#define MCFG_EPSON_SIO_RX(_rx) \
- downcast<epson_sio_device *>(device)->set_rx_callback(DEVCB_##_rx);
+ devcb = &downcast<epson_sio_device *>(device)->set_rx_callback(DEVCB_##_rx);
#define MCFG_EPSON_SIO_PIN(_pin) \
- downcast<epson_sio_device *>(device)->set_pin_callback(DEVCB_##_pin);
+ devcb = &downcast<epson_sio_device *>(device)->set_pin_callback(DEVCB_##_pin);
//**************************************************************************
@@ -45,8 +45,8 @@ public:
virtual ~epson_sio_device();
// callbacks
- template<class _rx> void set_rx_callback(_rx rx) { m_write_rx.set_callback(rx); }
- template<class _pin> void set_pin_callback(_pin pin) { m_write_pin.set_callback(pin); }
+ template<class _rx> devcb_base &set_rx_callback(_rx rx) { return m_write_rx.set_callback(rx); }
+ template<class _pin> devcb_base &set_pin_callback(_pin pin) { return m_write_pin.set_callback(pin); }
// called from owner
DECLARE_WRITE_LINE_MEMBER( tx_w );
diff --git a/src/devices/bus/ieee488/hp9895.cpp b/src/devices/bus/ieee488/hp9895.cpp
index e5b1f6de2ec..6abe8bc773d 100644
--- a/src/devices/bus/ieee488/hp9895.cpp
+++ b/src/devices/bus/ieee488/hp9895.cpp
@@ -6,9 +6,52 @@
HP9895 floppy disk drive
+ Phew, this one was tough!
+
+ This is a dual 8" floppy disk drive that interfaces through
+ HPIB/IEEE-488 bus. It implements the so-called "Amigo" command
+ set.
+
+ Its main components are:
+ * A Z80A CPU @ 4 MHz with 8 kB of firmware ROM and 1 kB of
+ static RAM
+ * A HP PHI chip that interfaces CPU to HPIB bus
+ * A disk controller implemented with a lot of discrete TTLs
+ * 2 MPI 8" disk drives
+
+ Data I/O with the disk is carried out through 2 shift registers,
+ one for data bits (@ 0x60 address) and one for clock bits (@ 0x61
+ address). CPU is stalled by setting WAIT/ to 0 whenever it accesses
+ the data register and the hw is not ready for the byte. Once
+ the next byte boundary is reached (the SDOK signal activates) the
+ CPU is released and either the data byte is read from shift register
+ or written into it. At the same time clock shift register is
+ copied into clock register when reading or viceversa when writing.
+
+ The 9895 drive can operate in 2 modes: HP/High density or IBM/low
+ density. This table summarizes the differences between the modes.
+ See also page 2-12 of service manual.
+
+ | Characteristic | HP mode | IBM mode |
+ |----------------+----------+-----------|
+ | Bit cell size | 2 µs | 4 µs |
+ | Modulation | MMFM | FM |
+ | Bit order | LS first | MS first |
+ | Sync bytes | 4x FF | 6x 00 |
+ | Formatted size | 1155 kB | 250.25 kB |
+
Reference manual:
HP 09895-90030, feb 81, 9895A Flexible Disc Memory Service Manual
+ Reference manual for the floppy drives:
+ Magnetic Peripherals, inc., feb 83, 9406-4 Flexible Disk Drive
+ Hardware Maintenance Manual
+
+ TODO/Issues:
+ * floppy_image_device sometimes reports the wrong state for wpt
+ signal
+ * IBM mode hasn't been tested yet
+
*********************************************************************/
#include "hp9895.h"
@@ -16,31 +59,334 @@
// Debugging
#define VERBOSE 1
#define LOG(x) do { if (VERBOSE) logerror x; } while (0)
+#define VERBOSE_0 0
+#define LOG_0(x) do { if (VERBOSE_0) logerror x; } while (0)
+
+// Macros to clear/set single bits
+#define BIT_MASK(n) (1U << (n))
+#define BIT_CLR(w , n) ((w) &= ~BIT_MASK(n))
+#define BIT_SET(w , n) ((w) |= BIT_MASK(n))
+
+// Bits in RESET register
+#define REG_RESET_TIMEOUT_START_BIT 0 // Start TIMEOUT oneshot (1)
+#define REG_RESET_OVERUN_CLEAR_BIT 1 // Clear OVERUN (sic) (1)
+#define REG_RESET_PROGRES_BIT 3 // PROGRES (1)
+
+// Bits in CNTL register
+#define REG_CNTL_READON_BIT 1 // Enable reading (1)
+#define REG_CNTL_WRITON_BIT 2 // Enable writing (1)
+#define REG_CNTL_WRITDRV_BIT 3 // Enable writing to floppy (1)
+#define REG_CNTL_CRCOUT_BIT 4 // Enable output of CRC word (1)
+#define REG_CNTL_CRCON_BIT 5 // Enable updating of CRC word (1) or preset CRC to 0xffff (0)
+
+// Bits in DRV register
+#define REG_DRV_STEP_BIT 0 // Step pulse to drive (1)
+#define REG_DRV_MOVEIN_BIT 1 // Move heads inward (1)
+#define REG_DRV_MGNENA_BIT 2 // Enable checking of bit cell margins (1)
+#define REG_DRV_IN_USE_BIT 3 // "In use" signal to drive (1)
+#define REG_DRV_LOWCURR_BIT 4 // Reduce write current in inner tracks (1)
+#define REG_DRV_HEADSEL_BIT 7 // Head selection (1 = Head 1)
+
+// Bits in XV register
+#define REG_XV_DRIVE3_BIT 0 // Select drive #3 (1)
+#define REG_XV_DRIVE2_BIT 1 // Select drive #2 (1)
+#define REG_XV_DRIVE1_BIT 2 // Select drive #1 (1)
+#define REG_XV_DRIVE0_BIT 3 // Select drive #0 (1)
+#define REG_XV_HIDEN_BIT 4 // Select HP/High density mode (1) or IBM/Low density mode (0)
+#define REG_XV_PRECMP_BIT 5 // Enable pre-compensation
+
+// Bits in DRIVSTAT register
+#define REG_DRIVSTAT_INDEX_BIT 0 // Index pulse from drive (1)
+#define REG_DRIVSTAT_DISCHNG_BIT 1 // Disk changed (1)
+#define REG_DRIVSTAT_TRACK0_BIT 2 // Heads on track #0 (1)
+#define REG_DRIVSTAT_WRPROT_BIT 3 // Disk is write-protected (1)
+#define REG_DRIVSTAT_READY_BIT 4 // Disk is ready (1)
+#define REG_DRIVSTAT_CRCERR_BIT 5 // Error in CRC (1)
+#define REG_DRIVSTAT_OVERUN_BIT 6 // I/O overrun between disk and CPU (1)
+#define REG_DRIVSTAT_TWOSIDE_BIT 7 // 2-sided disk (1)
+
+// Bits in SWITCHES(2) registers
+#define REG_SWITCHES_HPIB_ADDR_SHIFT 0 // LSB of HPIB address
+#define REG_SWITCHES_HPIB_ADDR_MASK 7 // Mask of HPIB address
+#define REG_SWITCHES_W_TEST_BIT 3 // "W" test push-button (1)
+#define REG_SWITCHES_S_TEST_BIT 4 // "S" test push-button (1)
+#define REG_SWITCHES_LOOP_BIT 5 // Test loop option (1)
+#define REG_SWITCHES_TIMEOUT_BIT 6 // TIMEOUT (1)
+#define REG_SWITCHES_AMDT_BIT 7 // Address mark detected (1)
+
+// Timers
+enum {
+ TIMEOUT_TMR_ID,
+ BYTE_TMR_ID,
+ HALF_BIT_TMR_ID
+};
+
+// Timings
+#define TIMEOUT_MSEC 450 // Timeout duration (ms)
+#define HPMODE_BIT_FREQ 500000 // HP-mode bit frequency (Hz)
+#define IBMMODE_BIT_FREQ 250000 // IBM-mode bit frequency (Hz)
+
+#define MIN_SYNC_BITS 29 // Number of bits to synchronize
// device type definition
const device_type HP9895 = &device_creator<hp9895_device>;
+// Masks of drive selectors in XV register
+static const uint8_t xv_drive_masks[] = {
+ BIT_MASK(REG_XV_DRIVE0_BIT),
+ BIT_MASK(REG_XV_DRIVE1_BIT)
+};
+
hp9895_device::hp9895_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, HP9895, "HP9895", tag, owner, clock, "HP9895", __FILE__),
device_ieee488_interface(mconfig, *this),
m_cpu(*this , "cpu"),
- m_phi(*this , "phi")
+ m_phi(*this , "phi"),
+ m_drives{{*this , "floppy0"} , {*this , "floppy1"}},
+ m_switches{*this , "switches"}
{
}
-#if 0
+static INPUT_PORTS_START(hp9895_port)
+ PORT_START("switches")
+ PORT_CONFNAME(REG_SWITCHES_HPIB_ADDR_MASK << REG_SWITCHES_HPIB_ADDR_SHIFT , 0x00 , "HPIB address")
+ PORT_CONFSETTING(0 << REG_SWITCHES_HPIB_ADDR_SHIFT , "0")
+ PORT_CONFSETTING(1 << REG_SWITCHES_HPIB_ADDR_SHIFT , "1")
+ PORT_CONFSETTING(2 << REG_SWITCHES_HPIB_ADDR_SHIFT , "2")
+ PORT_CONFSETTING(3 << REG_SWITCHES_HPIB_ADDR_SHIFT , "3")
+ PORT_CONFSETTING(4 << REG_SWITCHES_HPIB_ADDR_SHIFT , "4")
+ PORT_CONFSETTING(5 << REG_SWITCHES_HPIB_ADDR_SHIFT , "5")
+ PORT_CONFSETTING(6 << REG_SWITCHES_HPIB_ADDR_SHIFT , "6")
+ PORT_CONFSETTING(7 << REG_SWITCHES_HPIB_ADDR_SHIFT , "7")
+ PORT_CONFNAME(BIT_MASK(REG_SWITCHES_W_TEST_BIT) , 0x00 , "W Test")
+ PORT_CONFSETTING(0x00 , DEF_STR(Off))
+ PORT_CONFSETTING(BIT_MASK(REG_SWITCHES_W_TEST_BIT) , DEF_STR(On))
+ PORT_CONFNAME(BIT_MASK(REG_SWITCHES_S_TEST_BIT) , 0x00 , "S Test")
+ PORT_CONFSETTING(0x00 , DEF_STR(Off))
+ PORT_CONFSETTING(BIT_MASK(REG_SWITCHES_S_TEST_BIT) , DEF_STR(On))
+ PORT_CONFNAME(BIT_MASK(REG_SWITCHES_LOOP_BIT) , 0x00 , "Loop")
+ PORT_CONFSETTING(0x00 , DEF_STR(Off))
+ PORT_CONFSETTING(BIT_MASK(REG_SWITCHES_LOOP_BIT) , DEF_STR(On))
+INPUT_PORTS_END
+
ioport_constructor hp9895_device::device_input_ports() const
{
- // TODO: inputs=HPIB address, "S" & "W" switches, "loop" pin
+ return INPUT_PORTS_NAME(hp9895_port);
}
-#endif
+
void hp9895_device::device_start()
{
+ save_item(NAME(m_cpu_irq));
+ save_item(NAME(m_current_drive_idx));
+ save_item(NAME(m_dskchg));
+ save_item(NAME(m_crc));
+ save_item(NAME(m_crcerr_syn));
+ save_item(NAME(m_overrun));
+ save_item(NAME(m_accdata));
+ save_item(NAME(m_timeout));
+ save_item(NAME(m_cntl_reg));
+ save_item(NAME(m_clock_sr));
+ save_item(NAME(m_clock_reg));
+ save_item(NAME(m_data_sr));
+ save_item(NAME(m_wr_context));
+ save_item(NAME(m_had_transition));
+ save_item(NAME(m_lckup));
+ save_item(NAME(m_amdt));
+ save_item(NAME(m_sync_cnt));
+ save_item(NAME(m_hiden));
+ save_item(NAME(m_mgnena));
+
+ m_timeout_timer = timer_alloc(TIMEOUT_TMR_ID);
+ m_byte_timer = timer_alloc(BYTE_TMR_ID);
+ m_half_bit_timer = timer_alloc(HALF_BIT_TMR_ID);
+
+ for (auto& d : m_drives) {
+ d->get_device()->setup_ready_cb(floppy_image_device::ready_cb(&hp9895_device::floppy_ready_cb , this));
+ }
}
void hp9895_device::device_reset()
{
m_cpu_irq = false;
+ m_current_drive = nullptr;
+ m_current_drive_idx = ~0;
+ for (auto& d : m_dskchg) {
+ d = true;
+ }
+ preset_crc();
+ m_crcerr_syn = false;
+ m_overrun = false;
+ m_accdata = false;
+ m_timeout = true;
+ m_cntl_reg = 0;
+ m_clock_sr = 0;
+ m_clock_reg = 0;
+ m_data_sr = 0;
+ m_wr_context = 0;
+ m_had_transition = false;
+ m_lckup = true; // Because READON = 0
+ m_amdt = false;
+ m_sync_cnt = 0;
+ m_hiden = false;
+ m_mgnena = false;
+ m_timeout_timer->reset();
+ m_byte_timer->reset();
+ m_half_bit_timer->reset();
+}
+
+void hp9895_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ switch (id) {
+ case TIMEOUT_TMR_ID:
+ LOG(("Timeout!\n"));
+ m_timeout = true;
+ if (m_mgnena) {
+ // CPU is resumed by timeout if MGNENA=1
+ m_cpu->trigger(1);
+ }
+ break;
+
+ case BYTE_TMR_ID:
+ {
+ if (m_accdata) {
+ // Resume CPU when it's waiting for SDOK
+ m_cpu->trigger(1);
+ } else {
+ // No access to data register by CPU
+ LOG(("Data overrun!\n"));
+ m_overrun = true;
+ }
+ m_accdata = false;
+
+ m_crcerr_syn = m_crc != 0;
+
+ if (!BIT(m_cntl_reg , REG_CNTL_CRCON_BIT)) {
+ // CRC not enabled, keep it in preset state (all ones)
+ preset_crc();
+ }
+
+ attotime sdok_time{machine().time()};
+ LOG_0(("SDOK @ %.06f\n" , sdok_time.as_double()));
+ bool do_crc_upd = true;
+ if (BIT(m_cntl_reg , REG_CNTL_WRITON_BIT)) {
+ // Writing
+ m_pll.commit(get_write_device() , sdok_time);
+ m_pll.ctime = sdok_time;
+
+ // Check for AMDT when in loopback mode
+ if (!m_lckup && !m_amdt && BIT(m_cntl_reg , REG_CNTL_READON_BIT)) {
+ if (m_hiden) {
+ m_amdt = m_data_sr != 0xff;
+ } else {
+ m_amdt = m_data_sr != 0;
+ }
+ }
+
+ LOG_0(("WR D=%02x/C=%02x\n" , m_data_sr , m_clock_sr));
+ do_crc_upd = false;
+ for (unsigned i = 0; i < 8; i++) {
+ bool clock_bit;
+ bool data_bit;
+
+ clock_bit = shift_sr(m_clock_sr, false);
+ data_bit = shift_sr(m_data_sr, true);
+
+ if (BIT(m_cntl_reg , REG_CNTL_CRCOUT_BIT)) {
+ // Substitute data bits from DSR with those from CRC when CRCOUT=1
+ data_bit = BIT(m_crc , 15);
+ m_crc <<= 1;
+ } else if (BIT(m_cntl_reg , REG_CNTL_CRCON_BIT)) {
+ // Update CRC
+ update_crc(data_bit);
+ }
+ write_bit(data_bit, clock_bit);
+ }
+ // When shifting is done DSR is filled with 1s and CSR with 0s
+ }
+ if (BIT(m_cntl_reg , REG_CNTL_READON_BIT)) {
+ // Reading
+ m_pll.ctime = sdok_time;
+
+ for (unsigned i = 0; i < 8; i++) {
+ read_bit(do_crc_upd);
+ }
+ LOG_0(("RD D=%02x/C=%02x\n" , m_data_sr , m_clock_sr));
+ }
+ LOG_0(("next SDOK @ %.06f\n" , m_pll.ctime.as_double()));
+ timer.adjust(m_pll.ctime - sdok_time);
+ }
+ break;
+
+ case HALF_BIT_TMR_ID:
+ {
+ m_pll.ctime = machine().time();
+ if (m_lckup) {
+ // Trying to lock on synchronization bytes
+ attotime edge;
+ attotime tm;
+ get_next_transition(m_pll.ctime, edge);
+ bool half_bit0 = m_pll.feed_read_data(tm , edge , attotime::never);
+ get_next_transition(m_pll.ctime, edge);
+ bool half_bit1 = m_pll.feed_read_data(tm , edge , attotime::never);
+ if (half_bit0 == half_bit1) {
+ // If half bits are equal, no synch
+ LOG_0(("Reset sync_cnt\n"));
+ m_sync_cnt = 0;
+ } else if (++m_sync_cnt >= MIN_SYNC_BITS) {
+ // Synchronized, now wait for AM
+ LOG_0(("Synchronized @ %.6f\n" , machine().time().as_double()));
+ m_lckup = false;
+ if (BIT(m_cntl_reg , REG_CNTL_WRITON_BIT)) {
+ // When loopback is active, leave AM detection to byte timer as
+ // byte boundary is already synchronized
+ timer.reset();
+ return;
+ } else {
+ // Align with bit cell
+ // Synchronization bits in HP mode: 32x 1s -> C/D bits = 01010101...
+ // Synchronization bits in IBM mode: 32x 0s -> C/D bits = 10101010...
+ if (m_hiden != half_bit1) {
+ // Discard 1/2 bit cell if synchronization achieved in the clock part
+ get_next_transition(m_pll.ctime, edge);
+ m_pll.feed_read_data(tm , edge , attotime::never);
+ }
+ // Load CSR & DSR as they are after synchronization bits
+ if (m_hiden) {
+ m_clock_sr = 0;
+ m_data_sr = ~0;
+ } else {
+ m_clock_sr = ~0;
+ m_data_sr = 0;
+ }
+ }
+ }
+ } else {
+ // Looking for AM
+ /// CRC is not updated because it can't be possibly enabled at this point
+ read_bit(false);
+ if ((m_hiden && !BIT(m_data_sr , 7)) ||
+ (!m_hiden && BIT(m_data_sr , 0))) {
+ // Got AM as soon as bits being shifted into DSR change value wrt synchronization bits
+ m_amdt = true;
+ // Finish the current byte
+ for (unsigned i = 0; i < 7; i++) {
+ read_bit(false);
+ }
+ attotime adjust{m_pll.ctime - machine().time()};
+ LOG_0(("Got AM @ %.6f, ctime=%.6f, adj=%.6f, D=%02x/C=%02x\n" , machine().time().as_double() , m_pll.ctime.as_double() , adjust.as_double() , m_data_sr , m_clock_sr));
+ // Disable half-bit timer & enable byte timer
+ timer.reset();
+ m_byte_timer->adjust(adjust);
+ return;
+ }
+ }
+ timer.adjust(m_pll.ctime - machine().time());
+ }
+ break;
+
+ default:
+ break;
+ }
}
void hp9895_device::ieee488_eoi(int state)
@@ -160,6 +506,336 @@ WRITE16_MEMBER(hp9895_device::z80_m1_w)
}
}
+WRITE8_MEMBER(hp9895_device::data_w)
+{
+ LOG_0(("W DATA=%02x\n" , data));
+ // CPU stalls until next SDOK
+ m_cpu->suspend_until_trigger(1 , true);
+ m_data_sr = data;
+ m_clock_sr = m_clock_reg;
+ m_accdata = true;
+}
+
+WRITE8_MEMBER(hp9895_device::clock_w)
+{
+ LOG_0(("W CLOCK=%02x\n" , data));
+ m_clock_reg = data;
+}
+
+WRITE8_MEMBER(hp9895_device::reset_w)
+{
+ LOG_0(("W RESET=%02x\n" , data));
+ if (BIT(data , REG_RESET_TIMEOUT_START_BIT)) {
+ m_timeout = false;
+ m_timeout_timer->adjust(attotime::from_msec(TIMEOUT_MSEC));
+ }
+ if (BIT(data , REG_RESET_OVERUN_CLEAR_BIT)) {
+ m_overrun = false;
+ }
+ // TODO: PROGRES
+}
+
+WRITE8_MEMBER(hp9895_device::leds_w)
+{
+ LOG(("W LEDS=%02x %c%c%c%c%c\n" , data , BIT(data , 4) ? '.' : '*' , BIT(data , 3) ? '.' : '*' , BIT(data , 2) ? '.' : '*' , BIT(data , 1) ? '.' : '*' , BIT(data , 0) ? '.' : '*'));
+ // TODO:
+}
+
+WRITE8_MEMBER(hp9895_device::cntl_w)
+{
+ if (data != m_cntl_reg) {
+ LOG_0(("W CNTL=%02x -> %02x\n" , m_cntl_reg , data));
+ uint8_t old_cntl_reg = m_cntl_reg;
+ m_cntl_reg = data;
+
+ bool old_writon = BIT(old_cntl_reg , REG_CNTL_WRITON_BIT);
+ bool new_writon = BIT(m_cntl_reg , REG_CNTL_WRITON_BIT);
+ bool old_readon = BIT(old_cntl_reg , REG_CNTL_READON_BIT);
+ bool new_readon = BIT(m_cntl_reg , REG_CNTL_READON_BIT);
+
+ bool byte_timer_running = old_writon || m_amdt;
+ bool byte_timer_needed = new_writon || (new_readon && m_amdt);
+
+ if (!byte_timer_running && byte_timer_needed) {
+ LOG_0(("Enable byte tmr\n"));
+ attotime byte_period = get_half_bit_cell_period() * 16;
+ m_byte_timer->adjust(byte_period);
+ } else if (byte_timer_running && !byte_timer_needed) {
+ LOG_0(("Disable byte tmr\n"));
+ m_byte_timer->reset();
+ }
+
+ if (!old_writon && !old_readon && (new_writon || new_readon)) {
+ m_pll.set_clock(get_half_bit_cell_period());
+ }
+
+ if (!old_writon && new_writon) {
+ // Writing enabled
+ LOG_0(("Start writing..\n"));
+ m_pll.start_writing(machine().time());
+ m_wr_context = 0;
+ m_had_transition = false;
+ } else if (old_writon && !new_writon) {
+ // Writing disabled
+ LOG_0(("Stop writing..\n"));
+ m_pll.stop_writing(get_write_device() , machine().time());
+ }
+ if (!old_readon && new_readon) {
+ // Reading enabled
+ LOG_0(("Start reading..\n"));
+ m_pll.read_reset(machine().time());
+ m_sync_cnt = 0;
+ m_half_bit_timer->adjust(get_half_bit_cell_period());
+ } else if (old_readon && !new_readon) {
+ // Reading disabled
+ LOG_0(("Stop reading..\n"));
+ m_half_bit_timer->reset();
+ m_lckup = true;
+ m_amdt = false;
+ }
+ if (!new_readon && !new_writon) {
+ m_crcerr_syn = false;
+ BIT_CLR(m_cntl_reg, REG_CNTL_CRCON_BIT);
+ BIT_CLR(m_cntl_reg, REG_CNTL_CRCOUT_BIT);
+ preset_crc();
+ }
+ }
+}
+
+WRITE8_MEMBER(hp9895_device::drv_w)
+{
+ LOG_0(("W DRV=%02x\n" , data));
+ m_mgnena = BIT(data , REG_DRV_MGNENA_BIT);
+ if (m_current_drive != nullptr) {
+ m_current_drive->stp_w(!BIT(data , REG_DRV_STEP_BIT));
+ m_current_drive->dir_w(!BIT(data , REG_DRV_MOVEIN_BIT));
+ // TODO: in use signal
+ m_current_drive->ss_w(BIT(data , REG_DRV_HEADSEL_BIT));
+ }
+}
+
+WRITE8_MEMBER(hp9895_device::xv_w)
+{
+ LOG_0(("W XV=%02x\n" , data));
+ // Disk Changed flag is cleared when drive is ready and it is deselected
+ if (m_current_drive_idx < 2 && (data & xv_drive_masks[ m_current_drive_idx ]) == 0 && !m_current_drive->ready_r()) {
+ if (m_dskchg[ m_current_drive_idx ]) {
+ LOG(("Dskchg %u cleared\n" , m_current_drive_idx));
+ }
+ m_dskchg[ m_current_drive_idx ] = false;
+ }
+
+ m_current_drive = nullptr;
+ m_current_drive_idx = ~0;
+ for (unsigned i = 0; i < 2; i++) {
+ if (data & xv_drive_masks[ i ]) {
+ m_current_drive = m_drives[ i ]->get_device();
+ m_current_drive_idx = i;
+ break;
+ }
+ }
+
+ m_hiden = BIT(data , REG_XV_HIDEN_BIT);
+}
+
+READ8_MEMBER(hp9895_device::data_r)
+{
+ m_clock_reg = m_clock_sr;
+ m_accdata = true;
+ LOG_0(("R DATA=%02x\n" , m_data_sr));
+ // CPU stalls until next SDOK
+ m_cpu->suspend_until_trigger(1 , true);
+ return m_data_sr;
+}
+
+READ8_MEMBER(hp9895_device::clock_r)
+{
+ return m_clock_reg;
+}
+
+READ8_MEMBER(hp9895_device::drivstat_r)
+{
+ uint8_t res = 0;
+
+ if (m_current_drive != nullptr) {
+ if (m_current_drive->idx_r()) {
+ BIT_SET(res , REG_DRIVSTAT_INDEX_BIT);
+ }
+ if (m_dskchg[ m_current_drive_idx ]) {
+ BIT_SET(res , REG_DRIVSTAT_DISCHNG_BIT);
+ }
+ if (!m_current_drive->trk00_r()) {
+ BIT_SET(res , REG_DRIVSTAT_TRACK0_BIT);
+ }
+ if (m_current_drive->wpt_r()) {
+ BIT_SET(res , REG_DRIVSTAT_WRPROT_BIT);
+ }
+ if (!m_current_drive->ready_r()) {
+ BIT_SET(res , REG_DRIVSTAT_READY_BIT);
+ }
+ if (!m_current_drive->twosid_r()) {
+ BIT_SET(res , REG_DRIVSTAT_TWOSIDE_BIT);
+ }
+ }
+ if (m_crcerr_syn) {
+ BIT_SET(res , REG_DRIVSTAT_CRCERR_BIT);
+ }
+ if (m_overrun) {
+ BIT_SET(res , REG_DRIVSTAT_OVERUN_BIT);
+ }
+ LOG_0(("R DRIVSTAT=%02x\n" , res));
+ return res;
+}
+
+READ8_MEMBER(hp9895_device::switches_r)
+{
+ uint8_t res = get_switches2();
+ res |= m_switches->read();
+ return res;
+}
+
+READ8_MEMBER(hp9895_device::switches2_r)
+{
+ return get_switches2();
+}
+
+void hp9895_device::floppy_ready_cb(floppy_image_device *floppy , int state)
+{
+ if (state) {
+ // Set Disk Changed flag when a drive is not ready
+ for (unsigned i = 0; i < 2; i++) {
+ if (floppy == m_drives[ i ]->get_device()) {
+ LOG(("Dskchg %u set\n" , i));
+ m_dskchg[ i ] = true;
+ break;
+ }
+ }
+ }
+}
+
+uint8_t hp9895_device::get_switches2(void) const
+{
+ uint8_t res = 0;
+
+ if (m_timeout) {
+ BIT_SET(res, REG_SWITCHES_TIMEOUT_BIT);
+ }
+ if (m_amdt) {
+ BIT_SET(res, REG_SWITCHES_AMDT_BIT);
+ }
+
+ return res;
+}
+
+attotime hp9895_device::get_half_bit_cell_period(void) const
+{
+ return attotime::from_hz((m_hiden ? HPMODE_BIT_FREQ : IBMMODE_BIT_FREQ) * 2);
+}
+
+floppy_image_device *hp9895_device::get_write_device(void) const
+{
+ if (!BIT(m_cntl_reg , REG_CNTL_WRITDRV_BIT)) {
+ return nullptr;
+ } else {
+ return m_current_drive;
+ }
+}
+
+void hp9895_device::preset_crc(void)
+{
+ m_crc = ~0;
+}
+
+void hp9895_device::update_crc(bool bit)
+{
+ bool msb = BIT(m_crc , 15);
+
+ m_crc <<= 1;
+ if (bit ^ msb) {
+ m_crc ^= 0x1021;
+ }
+}
+
+bool hp9895_device::shift_sr(uint8_t& sr , bool input_bit)
+{
+ bool res;
+
+ if (m_hiden) {
+ res = BIT(sr , 0);
+ sr >>= 1;
+ if (input_bit) {
+ BIT_SET(sr , 7);
+ }
+ } else {
+ res = BIT(sr , 7);
+ sr <<= 1;
+ if (input_bit) {
+ BIT_SET(sr , 0);
+ }
+ }
+ return res;
+}
+
+void hp9895_device::get_next_transition(const attotime& from_when , attotime& edge)
+{
+ edge = attotime::never;
+
+ if (BIT(m_cntl_reg , REG_CNTL_WRITON_BIT)) {
+ // Loop back write transitions into reading data path
+ for (int idx = 0; idx < m_pll.write_position; idx++) {
+ if (m_pll.write_buffer[ idx ] >= from_when) {
+ edge = m_pll.write_buffer[ idx ];
+ break;
+ }
+ }
+ } else if (m_current_drive != nullptr) {
+ edge = m_current_drive->get_next_transition(from_when);
+ }
+}
+
+void hp9895_device::read_bit(bool crc_upd)
+{
+ attotime edge;
+ attotime tm;
+
+ get_next_transition(m_pll.ctime, edge);
+ bool clock_bit = m_pll.feed_read_data(tm , edge , attotime::never);
+ get_next_transition(m_pll.ctime, edge);
+ bool data_bit = m_pll.feed_read_data(tm , edge , attotime::never);
+
+ shift_sr(m_clock_sr, clock_bit);
+ data_bit = shift_sr(m_data_sr, data_bit);
+
+ if (crc_upd &&
+ BIT(m_cntl_reg , REG_CNTL_CRCON_BIT) &&
+ !BIT(m_cntl_reg , REG_CNTL_CRCOUT_BIT)) {
+ update_crc(data_bit);
+ }
+}
+
+void hp9895_device::write_bit(bool data_bit , bool clock_bit)
+{
+ if (m_hiden) {
+ // **** HP mode ****
+ // m_wr_context delays data bits by 2 bit cells
+ // Bit Content
+ // ============
+ // 2 Data @ t-2
+ // 1 Data @ t-1
+ // 0 Data @ t
+ m_wr_context = (m_wr_context << 1) | data_bit;
+ data_bit = BIT(m_wr_context , 2);
+ clock_bit = !data_bit && (clock_bit || !m_had_transition);
+ m_had_transition = data_bit || clock_bit;
+ }
+ // else... IBM mode, nothing to do
+
+ attotime dummy;
+
+ m_pll.write_next_bit(clock_bit , dummy , nullptr , attotime::never);
+ m_pll.write_next_bit(data_bit , dummy , nullptr , attotime::never);
+}
+
ROM_START(hp9895)
ROM_REGION(0x2000 , "cpu" , 0)
ROM_LOAD("1818-1391a.bin" , 0 , 0x2000 , CRC(b50dbfb5) SHA1(96edf9af78be75fbad2a0245b8af43958ba32752))
@@ -175,9 +851,20 @@ static ADDRESS_MAP_START(z80_io_map , AS_IO , 8 , hp9895_device)
ADDRESS_MAP_UNMAP_HIGH
ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x10 , 0x17) AM_DEVWRITE("phi" , phi_device , reg8_w) AM_READ(phi_reg_r)
- // TODO: 60-67 range
+ AM_RANGE(0x60 , 0x60) AM_READWRITE(data_r , data_w)
+ AM_RANGE(0x61 , 0x61) AM_READWRITE(clock_r , clock_w)
+ AM_RANGE(0x62 , 0x62) AM_READWRITE(drivstat_r , reset_w)
+ AM_RANGE(0x63 , 0x63) AM_READWRITE(switches_r , leds_w)
+ AM_RANGE(0x64 , 0x64) AM_WRITE(cntl_w)
+ AM_RANGE(0x65 , 0x65) AM_WRITE(drv_w)
+ AM_RANGE(0x66 , 0x66) AM_WRITE(xv_w)
+ AM_RANGE(0x67 , 0x67) AM_READ(switches2_r)
ADDRESS_MAP_END
+static SLOT_INTERFACE_START(hp9895_floppies)
+ SLOT_INTERFACE("8dsdd" , FLOPPY_8_DSDD)
+SLOT_INTERFACE_END
+
static MACHINE_CONFIG_FRAGMENT(hp9895)
MCFG_CPU_ADD("cpu" , Z80 , 4000000)
MCFG_CPU_PROGRAM_MAP(z80_program_map)
@@ -195,6 +882,11 @@ static MACHINE_CONFIG_FRAGMENT(hp9895)
MCFG_PHI_REN_WRITE_CB(WRITELINE(hp9895_device , phi_ren_w))
MCFG_PHI_DIO_READWRITE_CB(READ8(hp9895_device , phi_dio_r) , WRITE8(hp9895_device , phi_dio_w))
MCFG_PHI_INT_WRITE_CB(WRITELINE(hp9895_device , phi_int_w))
+
+ MCFG_FLOPPY_DRIVE_ADD("floppy0" , hp9895_floppies , "8dsdd" , floppy_image_device::default_floppy_formats)
+ MCFG_SLOT_FIXED(true)
+ MCFG_FLOPPY_DRIVE_ADD("floppy1" , hp9895_floppies , "8dsdd" , floppy_image_device::default_floppy_formats)
+ MCFG_SLOT_FIXED(true)
MACHINE_CONFIG_END
const tiny_rom_entry *hp9895_device::device_rom_region() const
diff --git a/src/devices/bus/ieee488/hp9895.h b/src/devices/bus/ieee488/hp9895.h
index d7591d684be..5837792de82 100644
--- a/src/devices/bus/ieee488/hp9895.h
+++ b/src/devices/bus/ieee488/hp9895.h
@@ -2,9 +2,9 @@
// copyright-holders: F. Ulivi
/*********************************************************************
- hp9895.h
+ hp9895.h
- HP9895 floppy disk drive
+ HP9895 floppy disk drive
*********************************************************************/
@@ -17,6 +17,8 @@
#include "ieee488.h"
#include "cpu/z80/z80.h"
#include "machine/phi.h"
+#include "imagedev/floppy.h"
+#include "machine/fdc_pll.h"
class hp9895_device : public device_t,
public device_ieee488_interface
@@ -26,9 +28,10 @@ public:
hp9895_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- //virtual ioport_constructor device_input_ports() const override;
+ virtual ioport_constructor device_input_ports() const override;
virtual void device_start() override;
virtual void device_reset() override;
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
virtual const tiny_rom_entry *device_rom_region() const override;
virtual machine_config_constructor device_mconfig_additions() const override;
@@ -63,11 +66,67 @@ public:
DECLARE_READ8_MEMBER(phi_reg_r);
DECLARE_WRITE16_MEMBER(z80_m1_w);
+ // Floppy interface
+ DECLARE_WRITE8_MEMBER(data_w);
+ DECLARE_WRITE8_MEMBER(clock_w);
+ DECLARE_WRITE8_MEMBER(reset_w);
+ DECLARE_WRITE8_MEMBER(leds_w);
+ DECLARE_WRITE8_MEMBER(cntl_w);
+ DECLARE_WRITE8_MEMBER(drv_w);
+ DECLARE_WRITE8_MEMBER(xv_w);
+ DECLARE_READ8_MEMBER(data_r);
+ DECLARE_READ8_MEMBER(clock_r);
+ DECLARE_READ8_MEMBER(drivstat_r);
+ DECLARE_READ8_MEMBER(switches_r);
+ DECLARE_READ8_MEMBER(switches2_r);
+
+ // Floppy drive interface
+ void floppy_ready_cb(floppy_image_device *floppy , int state);
+
private:
required_device<z80_device> m_cpu;
required_device<phi_device> m_phi;
+ required_device<floppy_connector> m_drives[ 2 ];
+ required_ioport m_switches;
bool m_cpu_irq;
+ floppy_image_device *m_current_drive;
+ unsigned m_current_drive_idx;
+ bool m_dskchg[ 2 ];
+ uint16_t m_crc; // U77
+ bool m_crcerr_syn;
+ bool m_overrun;
+ bool m_accdata;
+ bool m_timeout;
+ uint8_t m_cntl_reg; // U31
+ uint8_t m_clock_sr; // U22 & U4
+ uint8_t m_clock_reg; // U23 & U5
+ uint8_t m_data_sr; // U24 & U6
+ uint8_t m_wr_context;
+ bool m_had_transition;
+ bool m_lckup;
+ bool m_amdt;
+ uint8_t m_sync_cnt; // U28 & U73
+ bool m_hiden;
+ bool m_mgnena;
+
+ // Timers
+ emu_timer *m_timeout_timer;
+ emu_timer *m_byte_timer;
+ emu_timer *m_half_bit_timer;
+
+ // PLL
+ fdc_pll_t m_pll;
+
+ uint8_t get_switches2(void) const;
+ attotime get_half_bit_cell_period(void) const;
+ floppy_image_device *get_write_device(void) const;
+ void preset_crc(void);
+ void update_crc(bool bit);
+ bool shift_sr(uint8_t& sr , bool input_bit);
+ void get_next_transition(const attotime& from_when , attotime& edge);
+ void read_bit(bool crc_upd);
+ void write_bit(bool data_bit , bool clock_bit);
};
// device type definition
diff --git a/src/devices/bus/ieee488/ieee488.h b/src/devices/bus/ieee488/ieee488.h
index 8f6ae35a456..8c72f7eb155 100644
--- a/src/devices/bus/ieee488/ieee488.h
+++ b/src/devices/bus/ieee488/ieee488.h
@@ -33,28 +33,28 @@
#define MCFG_IEEE488_EOI_CALLBACK(_write) \
- downcast<ieee488_device *>(device)->set_eoi_callback(DEVCB_##_write);
+ devcb = &downcast<ieee488_device *>(device)->set_eoi_callback(DEVCB_##_write);
#define MCFG_IEEE488_DAV_CALLBACK(_write) \
- downcast<ieee488_device *>(device)->set_dav_callback(DEVCB_##_write);
+ devcb = &downcast<ieee488_device *>(device)->set_dav_callback(DEVCB_##_write);
#define MCFG_IEEE488_NRFD_CALLBACK(_write) \
- downcast<ieee488_device *>(device)->set_nrfd_callback(DEVCB_##_write);
+ devcb = &downcast<ieee488_device *>(device)->set_nrfd_callback(DEVCB_##_write);
#define MCFG_IEEE488_NDAC_CALLBACK(_write) \
- downcast<ieee488_device *>(device)->set_ndac_callback(DEVCB_##_write);
+ devcb = &downcast<ieee488_device *>(device)->set_ndac_callback(DEVCB_##_write);
#define MCFG_IEEE488_IFC_CALLBACK(_write) \
- downcast<ieee488_device *>(device)->set_ifc_callback(DEVCB_##_write);
+ devcb = &downcast<ieee488_device *>(device)->set_ifc_callback(DEVCB_##_write);
#define MCFG_IEEE488_SRQ_CALLBACK(_write) \
- downcast<ieee488_device *>(device)->set_srq_callback(DEVCB_##_write);
+ devcb = &downcast<ieee488_device *>(device)->set_srq_callback(DEVCB_##_write);
#define MCFG_IEEE488_ATN_CALLBACK(_write) \
- downcast<ieee488_device *>(device)->set_atn_callback(DEVCB_##_write);
+ devcb = &downcast<ieee488_device *>(device)->set_atn_callback(DEVCB_##_write);
#define MCFG_IEEE488_REN_CALLBACK(_write) \
- downcast<ieee488_device *>(device)->set_ren_callback(DEVCB_##_write);
+ devcb = &downcast<ieee488_device *>(device)->set_ren_callback(DEVCB_##_write);
#define MCFG_IEEE488_SLOT_ADD(_tag, _address, _slot_intf, _def_slot) \
@@ -92,14 +92,14 @@ public:
// construction/destruction
ieee488_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template<class _write> void set_eoi_callback(_write wr) { m_write_eoi.set_callback(wr); }
- template<class _write> void set_dav_callback(_write wr) { m_write_dav.set_callback(wr); }
- template<class _write> void set_nrfd_callback(_write wr) { m_write_nrfd.set_callback(wr); }
- template<class _write> void set_ndac_callback(_write wr) { m_write_ndac.set_callback(wr); }
- template<class _write> void set_ifc_callback(_write wr) { m_write_ifc.set_callback(wr); }
- template<class _write> void set_srq_callback(_write wr) { m_write_srq.set_callback(wr); }
- template<class _write> void set_atn_callback(_write wr) { m_write_atn.set_callback(wr); }
- template<class _write> void set_ren_callback(_write wr) { m_write_ren.set_callback(wr); }
+ template<class _write> devcb_base &set_eoi_callback(_write wr) { return m_write_eoi.set_callback(wr); }
+ template<class _write> devcb_base &set_dav_callback(_write wr) { return m_write_dav.set_callback(wr); }
+ template<class _write> devcb_base &set_nrfd_callback(_write wr) { return m_write_nrfd.set_callback(wr); }
+ template<class _write> devcb_base &set_ndac_callback(_write wr) { return m_write_ndac.set_callback(wr); }
+ template<class _write> devcb_base &set_ifc_callback(_write wr) { return m_write_ifc.set_callback(wr); }
+ template<class _write> devcb_base &set_srq_callback(_write wr) { return m_write_srq.set_callback(wr); }
+ template<class _write> devcb_base &set_atn_callback(_write wr) { return m_write_atn.set_callback(wr); }
+ template<class _write> devcb_base &set_ren_callback(_write wr) { return m_write_ren.set_callback(wr); }
void add_device(ieee488_slot_device *slot, device_t *target);
diff --git a/src/devices/bus/isa/isa.h b/src/devices/bus/isa/isa.h
index 25e6bb281ce..6e9c6f7e344 100644
--- a/src/devices/bus/isa/isa.h
+++ b/src/devices/bus/isa/isa.h
@@ -93,7 +93,7 @@
isa16_slot_device::static_set_isa16_slot(*device, owner, _isatag);
#define MCFG_ISA_BUS_IOCHCK(_iochck) \
- downcast<isa8_device *>(device)->set_iochck_callback(DEVCB_##_iochck);
+ devcb = &downcast<isa8_device *>(device)->set_iochck_callback(DEVCB_##_iochck);
#define MCFG_ISA_OUT_IRQ2_CB(_devcb) \
devcb = &isa8_device::set_out_irq2_callback(*device, DEVCB_##_devcb);
@@ -191,7 +191,7 @@ public:
// inline configuration
static void static_set_cputag(device_t &device, const char *tag);
static void static_set_custom_spaces(device_t &device);
- template<class _iochck> void set_iochck_callback(_iochck iochck) { m_write_iochck.set_callback(iochck); }
+ template<class _iochck> devcb_base &set_iochck_callback(_iochck iochck) { return m_write_iochck.set_callback(iochck); }
template<class _Object> static devcb_base &set_out_irq2_callback(device_t &device, _Object object) { return downcast<isa8_device &>(device).m_out_irq2_cb.set_callback(object); }
template<class _Object> static devcb_base &set_out_irq3_callback(device_t &device, _Object object) { return downcast<isa8_device &>(device).m_out_irq3_cb.set_callback(object); }
template<class _Object> static devcb_base &set_out_irq4_callback(device_t &device, _Object object) { return downcast<isa8_device &>(device).m_out_irq4_cb.set_callback(object); }
diff --git a/src/devices/bus/nes/ggenie.cpp b/src/devices/bus/nes/ggenie.cpp
index ec6664bb23d..7831f91b717 100644
--- a/src/devices/bus/nes/ggenie.cpp
+++ b/src/devices/bus/nes/ggenie.cpp
@@ -15,8 +15,7 @@
#include "emu.h"
#include "ggenie.h"
-#include "includes/nes.h"
-
+#include "bus/nes/nes_carts.h"
#ifdef NES_PCB_DEBUG
#define VERBOSE 1
diff --git a/src/devices/bus/nubus/nubus.cpp b/src/devices/bus/nubus/nubus.cpp
index 4df5c1c5560..bd13bdb838c 100644
--- a/src/devices/bus/nubus/nubus.cpp
+++ b/src/devices/bus/nubus/nubus.cpp
@@ -414,7 +414,7 @@ void device_nubus_card_interface::install_declaration_rom(device_t *dev, const c
case 0xc3: // lanes 0, 1
m_declaration_rom.resize(romlen*2);
- memset(&m_declaration_rom[0], 0, romlen*4);
+ memset(&m_declaration_rom[0], 0, romlen*2);
for (int i = 0; i < romlen/2; i++)
{
m_declaration_rom[BYTE4_XOR_BE((i*4)+0)] = rom[(i*2)];
@@ -425,7 +425,7 @@ void device_nubus_card_interface::install_declaration_rom(device_t *dev, const c
case 0xa5: // lanes 0, 2
m_declaration_rom.resize(romlen*2);
- memset(&m_declaration_rom[0], 0, romlen*4);
+ memset(&m_declaration_rom[0], 0, romlen*2);
for (int i = 0; i < romlen/2; i++)
{
m_declaration_rom[BYTE4_XOR_BE((i*4)+0)] = rom[(i*2)];
@@ -436,7 +436,7 @@ void device_nubus_card_interface::install_declaration_rom(device_t *dev, const c
case 0x3c: // lanes 2,3
m_declaration_rom.resize(romlen*2);
- memset(&m_declaration_rom[0], 0, romlen*4);
+ memset(&m_declaration_rom[0], 0, romlen*2);
for (int i = 0; i < romlen/2; i++)
{
m_declaration_rom[BYTE4_XOR_BE((i*4)+2)] = rom[(i*2)];
diff --git a/src/devices/bus/vic20/exp.cpp b/src/devices/bus/vic20/exp.cpp
index c95601773e3..a07e623f72a 100644
--- a/src/devices/bus/vic20/exp.cpp
+++ b/src/devices/bus/vic20/exp.cpp
@@ -202,6 +202,7 @@ void vic20_expansion_slot_device::cd_w(address_space &space, offs_t offset, uint
#include "vic1111.h"
#include "vic1112.h"
#include "vic1210.h"
+#include "speakeasy.h"
SLOT_INTERFACE_START( vic20_expansion_cards )
SLOT_INTERFACE("exp", VIC1010)
@@ -209,6 +210,7 @@ SLOT_INTERFACE_START( vic20_expansion_cards )
SLOT_INTERFACE("8k", VIC1110)
SLOT_INTERFACE("16k", VIC1111)
SLOT_INTERFACE("fe3", VIC20_FE3)
+ SLOT_INTERFACE("speakez", VIC20_SPEAKEASY)
// the following need ROMs from the software list
SLOT_INTERFACE_INTERNAL("standard", VIC20_STD)
diff --git a/src/devices/bus/vic20/speakeasy.cpp b/src/devices/bus/vic20/speakeasy.cpp
new file mode 100644
index 00000000000..d13a1908c75
--- /dev/null
+++ b/src/devices/bus/vic20/speakeasy.cpp
@@ -0,0 +1,104 @@
+// license:BSD-3-Clause
+// copyright-holders:smf
+/**********************************************************************
+
+ Personal Peripheral Products Speakeasy cartridge emulation
+ (aka Protecto Enterprizes VIC-20 Voice Synthesizer)
+
+**********************************************************************/
+
+#include "speakeasy.h"
+
+
+
+//**************************************************************************
+// MACROS/CONSTANTS
+//**************************************************************************
+
+#define SC01A_TAG "sc01a"
+
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+const device_type VIC20_SPEAKEASY = &device_creator<vic20_speakeasy_t>;
+
+
+//-------------------------------------------------
+// MACHINE_DRIVER( speakeasy )
+//-------------------------------------------------
+
+static MACHINE_CONFIG_FRAGMENT( speakeasy )
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+
+ MCFG_SOUND_ADD(SC01A_TAG, VOTRAX_SC01, 720000)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.85)
+MACHINE_CONFIG_END
+
+
+//-------------------------------------------------
+// machine_config_additions - device-specific
+// machine configurations
+//-------------------------------------------------
+
+machine_config_constructor vic20_speakeasy_t::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( speakeasy );
+}
+
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// vic20_speakeasy_t - constructor
+//-------------------------------------------------
+
+vic20_speakeasy_t::vic20_speakeasy_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, VIC20_SPEAKEASY, "Speakeasy VIC20", tag, owner, clock, "speakeasyvic20", __FILE__),
+ device_vic20_expansion_card_interface(mconfig, *this),
+ m_votrax(*this, SC01A_TAG)
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void vic20_speakeasy_t::device_start()
+{
+}
+
+
+//-------------------------------------------------
+// vic20_cd_r - cartridge data read
+//-------------------------------------------------
+
+uint8_t vic20_speakeasy_t::vic20_cd_r(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
+{
+ if (!io2)
+ {
+ return m_votrax->request() << 7;
+ }
+
+ return data;
+}
+
+
+//-------------------------------------------------
+// vic20_cd_w - cartridge data write
+//-------------------------------------------------
+
+void vic20_speakeasy_t::vic20_cd_w(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3)
+{
+ if (!io2)
+ {
+ m_votrax->write(space, 0, data & 0x3f);
+ m_votrax->inflection_w(space, 0, data >> 6);
+ }
+}
diff --git a/src/devices/bus/vic20/speakeasy.h b/src/devices/bus/vic20/speakeasy.h
new file mode 100644
index 00000000000..dbd9ccf4e84
--- /dev/null
+++ b/src/devices/bus/vic20/speakeasy.h
@@ -0,0 +1,55 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/**********************************************************************
+
+ Personal Peripheral Products Speakeasy cartridge emulation
+ (aka Protecto Enterprizes VIC-20 Voice Synthesizer)
+
+**********************************************************************/
+
+#pragma once
+
+#ifndef __VIC20_SPEAKEASY__
+#define __VIC20_SPEAKEASY__
+
+#include "emu.h"
+#include "exp.h"
+#include "sound/votrax.h"
+
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> vic20_speakeasy_t
+
+class vic20_speakeasy_t : public device_t,
+ public device_vic20_expansion_card_interface
+{
+public:
+ // construction/destruction
+ vic20_speakeasy_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ // optional information overrides
+ virtual machine_config_constructor device_mconfig_additions() const override;
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+ // device_vic20_expansion_card_interface overrides
+ virtual uint8_t vic20_cd_r(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
+ virtual void vic20_cd_w(address_space &space, offs_t offset, uint8_t data, int ram1, int ram2, int ram3, int blk1, int blk2, int blk3, int blk5, int io2, int io3) override;
+
+private:
+ required_device<votrax_sc01_device> m_votrax;
+};
+
+
+// device type definition
+extern const device_type VIC20_SPEAKEASY;
+
+
+
+#endif
diff --git a/src/devices/bus/vme/vme.cpp b/src/devices/bus/vme/vme.cpp
index 79e6d5a8687..4d6b35a4c80 100644
--- a/src/devices/bus/vme/vme.cpp
+++ b/src/devices/bus/vme/vme.cpp
@@ -6,64 +6,64 @@
* The Versabus-E was standardized as the VME bus by VITA 1981 for Europe
* in the single or double Euroboard form factor. Several standard revs has
* been approved since then up until recently and the VME64 revision.
- *
- * This bus driver starts with Versabus and VME rev C.
+ *
+ * This bus driver starts with Versabus and VME rev C.
* http://bitsavers.informatik.uni-stuttgart.de/pdf/motorola/versabus/M68KVBS_VERSAbus_Specification_Manual_Jul81.pdf
*
* Acronymes from the specification
* ---------------------------------
- * BACKPLANE - A printed circuit board which provides the interconnection path
- between other printed circuit cards.
- SLOT - A single position at which a card may be inserted into the backplane.
+ * BACKPLANE - A printed circuit board which provides the interconnection path
+ between other printed circuit cards.
+ SLOT - A single position at which a card may be inserted into the backplane.
One slot may consist of more than one edge connector.
- BOARD/CARD - Interchangeable terms representing one printed circuit board capable
- of being inserted into the backplane and containing a collection of
+ BOARD/CARD - Interchangeable terms representing one printed circuit board capable
+ of being inserted into the backplane and containing a collection of
electronic components.
- MODULE - A collection of electronic components with a single functional
- purpose. More than one module may exist on the same card, but one
- module should never be spread over multiple cards.
- MASTER - A functional module capable of initiating data bus transfers.
- REQUESTER - A functional module capable of requesting control of the data
- transfer bus.
- INTERRUPT - A functional module capable of detecting interrupt requests
+ MODULE - A collection of electronic components with a single functional
+ purpose. More than one module may exist on the same card, but one
+ module should never be spread over multiple cards.
+ MASTER - A functional module capable of initiating data bus transfers.
+ REQUESTER - A functional module capable of requesting control of the data
+ transfer bus.
+ INTERRUPT - A functional module capable of detecting interrupt requests
HANDLER and initiating appropriate responses.
- MASTER - The combination of a MASTER, REQUESTER, INTERRUPT HANDLER, and
- SUB-SYSTEM (optionally) an INTERRUPTER, which function together and which
+ MASTER - The combination of a MASTER, REQUESTER, INTERRUPT HANDLER, and
+ SUB-SYSTEM (optionally) an INTERRUPTER, which function together and which
must be on the same card.
- NOTE! All MASTERS, REQUESTERS, and INTERRUPT HANDLERS must be pieces of a
- MASTER SUB-SYSTEM.
-
- SLAVE - A functional module capable of responding to data transfer
- operations generated by a MASTER.
- INTERRUPTER - A functional module capable of requesting service from a MASTER
- SUB-SYSTEM by generating an interrupt request.
- SLAVE - The combination of a SLAVE and INTERRUPTER which function together
- SUB-SYSTEM and which must be on the same card.
-
- NOTE! All INTERRUPTERS must be part of either SLAVE SUB-SYSTEMS or MASTER
- SUB-SYSTEMS. However, SLAVES may exist as stand-alone elements.
- Such SLAVES will never be called SLAVE SUB-SYSTEMS.
-
- CONTROLLER - The combination of modules used to provide utility and emergency
- SUB-SYSTEM signals for the VERSAbus. There will always be one and only one
- CONTROLLER SUB-SYSTEM. It can contain the following functional
- modules:
-
- a. Data Transfer Bus ARBITER
- b. Emergency Data Transfer Bus REQUESTER
- c. Power up/power down MASTER
- d. System clock driver
- e. System reset driver
- f. System test controller
- g. Power monitor (for AC clock and AC fail driver)
-
- In any VERSAbus system, only one each of the above functional modules will exist.
- The slot numbered Al is designated as the controller sub-system slot because the
- user will typically provide modules a through d on the board residing in this
- slot. System reset and the system test controller are typically connected to
- an operator control panel and may be located elsewhere. The power monitor is
- interfaced to the incoming AC power source and may also be located remotely.
+ NOTE! All MASTERS, REQUESTERS, and INTERRUPT HANDLERS must be pieces of a
+ MASTER SUB-SYSTEM.
+
+ SLAVE - A functional module capable of responding to data transfer
+ operations generated by a MASTER.
+ INTERRUPTER - A functional module capable of requesting service from a MASTER
+ SUB-SYSTEM by generating an interrupt request.
+ SLAVE - The combination of a SLAVE and INTERRUPTER which function together
+ SUB-SYSTEM and which must be on the same card.
+
+ NOTE! All INTERRUPTERS must be part of either SLAVE SUB-SYSTEMS or MASTER
+ SUB-SYSTEMS. However, SLAVES may exist as stand-alone elements.
+ Such SLAVES will never be called SLAVE SUB-SYSTEMS.
+
+ CONTROLLER - The combination of modules used to provide utility and emergency
+ SUB-SYSTEM signals for the VERSAbus. There will always be one and only one
+ CONTROLLER SUB-SYSTEM. It can contain the following functional
+ modules:
+
+ a. Data Transfer Bus ARBITER
+ b. Emergency Data Transfer Bus REQUESTER
+ c. Power up/power down MASTER
+ d. System clock driver
+ e. System reset driver
+ f. System test controller
+ g. Power monitor (for AC clock and AC fail driver)
+
+ In any VERSAbus system, only one each of the above functional modules will exist.
+ The slot numbered Al is designated as the controller sub-system slot because the
+ user will typically provide modules a through d on the board residing in this
+ slot. System reset and the system test controller are typically connected to
+ an operator control panel and may be located elsewhere. The power monitor is
+ interfaced to the incoming AC power source and may also be located remotely.
*/
#include "emu.h"
@@ -139,12 +139,12 @@ void vme_slot_device::device_start()
{
device_vme_card_interface *dev = dynamic_cast<device_vme_card_interface *>(get_card_device());
LOG("%s %s - %s:%s\n", tag(), FUNCNAME, m_vme_tag, m_vme_slottag);
- if (dev)
+ if (dev)
{
device_vme_card_interface::static_set_vme_tag(*dev, m_vme_tag, m_vme_slottag);
}
- // m_card = dynamic_cast<device_vme_card_interface *>(get_card_device());
+ // m_card = dynamic_cast<device_vme_card_interface *>(get_card_device());
}
//-------------------------------------------------
@@ -164,8 +164,8 @@ READ8_MEMBER(vme_slot_device::read8)
{
uint16_t result = 0x00;
LOG("%s %s\n", tag(), FUNCNAME);
- // printf("%s %s\n", tag(), FUNCNAME);
- // if (m_card) result = m_card->read8(space, offset);
+ // printf("%s %s\n", tag(), FUNCNAME);
+ // if (m_card) result = m_card->read8(space, offset);
return result;
}
@@ -175,8 +175,8 @@ READ8_MEMBER(vme_slot_device::read8)
WRITE8_MEMBER(vme_slot_device::write8)
{
LOG("%s %s\n", tag(), FUNCNAME);
- // printf("%s %s\n", tag(), FUNCNAME);
- // if (m_card) m_card->write8(space, offset, data);
+ // printf("%s %s\n", tag(), FUNCNAME);
+ // if (m_card) m_card->write8(space, offset, data);
}
#if 0 // Disabled until we know how to make a board driver also a slot device
@@ -184,7 +184,7 @@ WRITE8_MEMBER(vme_slot_device::write8)
/* Usually a VME firmware supports only a few boards so it will have its own slot collection defined */
// Controller capable boards that can go into slot1 ( or has an embedded VME bus )
SLOT_INTERFACE_START( vme_slot1 )
-// SLOT_INTERFACE("mzr8105", VME_MZR8105)
+// SLOT_INTERFACE("mzr8105", VME_MZR8105)
SLOT_INTERFACE_END
#endif
@@ -232,7 +232,7 @@ void vme_device::add_vme_card(device_vme_card_interface *card)
void vme_device::install_device(offs_t start, offs_t end, read8_delegate rhandler, write8_delegate whandler, uint32_t mask)
{
- cpu_device *m_maincpu = machine().device<cpu_device>("maincpu");
+ cpu_device *m_maincpu = machine().device<cpu_device>("maincpu");
int buswidth = m_maincpu->space_config(AS_PROGRAM)->m_databus_width;
LOG("%s width:%d\n", FUNCNAME, buswidth);
@@ -325,7 +325,7 @@ void device_vme_card_interface::set_vme_device()
{
LOG("%s %s\n", m_device->tag(), FUNCNAME);
m_vme = dynamic_cast<vme_device *>(device().machine().device(m_vme_tag));
- // printf("*** %s %sfound\n", m_vme_tag, m_vme ? "" : "not ");
+ // printf("*** %s %sfound\n", m_vme_tag, m_vme ? "" : "not ");
if (m_vme) m_vme->add_vme_card(this);
}
@@ -352,7 +352,7 @@ a number of variants that has been more or less standardized:
an almost compatible variant was developed by Motorola called MVMX32bus.
- VSBbus replaced VMX and MVMX32and was approved by IEEE in 1988
- SCSA is a P2 standardization for telephony voice and facsimile applications
-- SkyChannel is packet switched P2 architecture from Sky Computers and standardized
+- SkyChannel is packet switched P2 architecture from Sky Computers and standardized
through VITA/VSO.
- RACEway is a 40Mhz P2 bus allowing 480MBps throughput from Mercusry Computers and
standardized through VITA/VSO.
diff --git a/src/devices/bus/vme/vme.h b/src/devices/bus/vme/vme.h
index 6103379a4ac..c2aa6e2b666 100644
--- a/src/devices/bus/vme/vme.h
+++ b/src/devices/bus/vme/vme.h
@@ -53,7 +53,7 @@
#include "emu.h"
//**************************************************************************
-// CONSTANTS
+// CONSTANTS
//**************************************************************************
#define VME_BUS_TAG "vme"
@@ -78,7 +78,7 @@ public:
DS0,
DS1,
BERR,
- DTACK,
+ DTACK,
WRITE
};
@@ -152,7 +152,7 @@ public:
void set_vme_device();
virtual DECLARE_READ8_MEMBER(read8);
- virtual DECLARE_WRITE8_MEMBER(write8);
+ virtual DECLARE_WRITE8_MEMBER(write8);
device_t *m_device;
// inline configuration
@@ -175,7 +175,7 @@ public:
Short addressing AM codes indicate that address lines A02-A15 are being used to select a BYTE(0-3) group.
Standard addressing AM codes ,indicate that address lines A02-A23 are being used to select a BYTE(0-3) group.
Extended addressing AM codes indicate that address lines A02-A31 are being used to select a BYTE(0-3) group.*/
- enum
+ enum
{ // Defined and User Defined Address Modifier Values, The rest us Reserved between 0x00 and 0x3F
AMOD_EXTENDED_NON_PRIV_DATA = 0x09,
AMOD_EXTENDED_NON_PRIV_PRG = 0x0A,
@@ -196,7 +196,7 @@ public:
};
};
-#define MCFG_VME_SLOT_ADD(_tag, _slot_tag, _slot_intf,_def_slot) \
+#define MCFG_VME_SLOT_ADD(_tag, _slot_tag, _slot_intf,_def_slot) \
MCFG_DEVICE_ADD(_slot_tag, VME_SLOT, 0) \
MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
vme_slot_device::static_set_vme_slot(*device, _tag, _slot_tag);
diff --git a/src/devices/bus/vme/vme_fccpu20.cpp b/src/devices/bus/vme/vme_fccpu20.cpp
new file mode 100644
index 00000000000..e1d9c7afc9b
--- /dev/null
+++ b/src/devices/bus/vme/vme_fccpu20.cpp
@@ -0,0 +1,663 @@
+// license:BSD-3-Clause
+// copyright-holders:Joakim Larsson Edstrom
+/***************************************************************************
+ *
+ * Force SYS68K CPU-20 VME SBC imaginary one (two) slot chassi
+ *
+ * 24/12/2016
+ *
+ * Thanks to Al Kossow and his site http://www.bitsavers.org/ I got the information
+ * required to start the work with this driver.
+ *
+ *
+ * ||
+ * || || CPU-21 - main board
+ * ||||--||_____________________________________________________________
+ * ||||--|| |
+ * || || _ |__
+ * || | | |
+ * RST o-[| | | |
+ * || +-------+ | | |
+ * ABT o-[| | XTAL | | | |
+ * || | 50MHz | +-----------------------+ | | |
+ * RUN C| +-------+ | MPCC | | | |
+ * HALT C| +-------+ | R68561P | | |VME|
+ * BM C| | XTAL | +-----------------------+ | | |
+ * || | 40MHz | +-----------------------+ | |P1 |
+ * || +-------+ | PIT | | | |
+ * FLMA C| +-------+ | MC68230P8 | | | |
+ * EPROM C| | XTAL | +-----------------------+ | | |
+ * 2WST C| | 32MHz | | | |
+ * 4WST C| +-------+ | | |
+ * 6WST C| | | |
+ * 8WST C| |_| |
+ * 12WST C| +--------------------+ |___|
+ * 14WST C| | BIM | |
+ * || | MC68153L | |
+ * || +--------------------+ |
+ * CSH o-[| |
+ * || |
+ * R/H o-[| |
+ * || |
+ * DIP0 - +----------------+ |
+ * . - | | |___
+ * . - | | +---+ _| |
+ * . - | CPU | | |+------------+ | | |
+ * . - | M68020 | | || 27128 | | | |
+ * . - | | | || EPROM | | | |
+ * . - | | | |+------------+ | | |
+ * DIP7 - | | | F | | |VME|
+ * || +----------------+ | L |+------------+ | | |
+ * || | M || 27128 | | |P2 |
+ * [|||O +------------+ | E || EPROM | | | |
+ * +-|||| | | | |+------------+ | | |
+ * | |||| | FPU | | m | | | |
+ * | |||| | 68881 | | e |+------------+ | | |
+ * | |||| | | | m || 27128 | | | |
+ * | |||| | | | || EPROM | | | |
+ * P4 | |||| +------------+ | b |+------------+ | | |
+ * | |||| | u | | | |
+ * +-|||| | s |+------------+ |_| |
+ * [|||O | || 27128 | |___|
+ * || || | || EPROM | |
+ * ||||--|| +---++------------+ |
+ * ||||--||-------------------------------------------------------------+
+ * ||
+ *
+ *
+ * ||
+ * || || CPU-21 - slave board (SRAM-22 - connected via FLME mem bus)
+ * ||||--||_____________________________________________________________
+ * ||||--|| |
+ * || || 64 x 64Kbit SRAM = 512KB __|__
+ * || +-----------+ +-----------+ +-----------+ +-----------+| | |
+ * || |IMS1600 | | | | | | || | |
+ * || +-----------+ +-----------+ +-----------+ +-----------+| | |
+ * RUN C| | | | | | | | || | |
+ * || +-----------+ +-----------+ +-----------+ +-----------+| | |
+ * || | | | | | | | || | |
+ * || +-----------+ +-----------+ +-----------+ +-----------+| |VME|
+ * SEL0 C| | | | | | | | || | |
+ * SEL1 C| +-----------+ +-----------+ +-----------+ +-----------+| |P1 |
+ * || | | | | | | | || | |
+ * || +-----------+ +-----------+ +-----------+ +-----------+| | |
+ * || | | | | | | | || | |
+ * || +-----------+ +-----------+ +-----------+ +-----------+| | |
+ * || | | | | | | | || | |
+ * || +-----------+ +-----------+ +-----------+ +-----------+| | |
+ * || | | | | | | | ||_| |
+ * || +-----------+ +-----------+ +-----------+ +-----------+ |___|
+ * || | | | | | | | | |
+ * || +-----------+ +-----------+ +-----------+ +-----------+ |
+ * || | | | | | | | | |
+ * || +-----------+ +-----------+ +-----------+ +-----------+ |
+ * || | | | | |
+ * || +-----------+ +-----------+ +-----------+ +-----------+ |
+ * || | | | | | | | | |
+ * || +-----------+ +-----------+ +-----------+ +-----------+ |
+ * || |___
+ * || +---++-----------+ +-----------+ _| |
+ * || | || | | || | |
+ * || | |+-----------+ +-----------+| | |
+ * || | || | | || | |
+ * || | |+-----------+ +-----------+| | |
+ * || | F || | | || |VME|
+ * || | L |+-----------+ +-----------+| | |
+ * || | M | | |P2 |
+ * [|||O | E | | | |
+ * +-|||| | | | | |
+ * | |||| | m | | | |
+ * | |||| | e | | | |
+ * | |||| | m | | | |
+ * | |||| | | | | |
+ * P8? | |||| | b | | | |
+ * | |||| | u | +-----------------------+ | | |
+ * +-|||| | s | | MPCC | |_| |
+ * [|||O | | | R68561P | |___|
+ * || || | | +-----------------------+ |
+ * ||||--|| +---+ (XTAL) |
+ * ||||--||------------------------------------------------------------+
+ * || NOTE: Variants also available with 2MB and/or DRAM
+ *
+ * History of Force Computers
+ *---------------------------
+ * see fccpu30.cpp
+ *
+ * Misc links about Force Computes and this board:
+ *------------------------------------------------
+ * http://bitsavers.org/pdf/forceComputers/
+ *
+ * Description(s)
+ * -------------
+ * CPU-20 has the following feature set:
+ * - 68020 CPU with l6.7MHz Clock Frequency
+ * - 68881 Floating Point Coprocessor with l6.7MHz Clock Frequency
+ * - Static RAM 5l2Kbyte with 55ns access time
+ * - 5l2Kbyte (max) of ROM/EPROM for the system
+ * - 2 RS232 Multi Protocol Communication Interfaces (110-38400 Baud)
+ * - Parallel Interface and Timer Chip provides local control and timer function
+ * - VMXbus Primary Master Interface to p2 connector
+ * - Local Interrupt handling via interrupt vectors
+ * - Each VMEbus IRQ level can be enabled/disabled via software
+ * - Address range for the short I/O address modifies (AM4)
+ * - Address range for the standard address modifier
+ * - Single level bus arbiter
+ * - One level slave bus arbitration
+ * - Power monitor
+ * - RESET and SOFTWARE ABORT function switches
+ * - Fully VMEbus, VMXbus and IEEE Pl~14 compatible
+ *
+ * Address Map
+ * --------------------------------------------------------------------------
+ * Range Decscription
+ * --------------------------------------------------------------------------
+ * 00000000-0xxFFFFF Shared DRAM D8-D32
+ * 0yy00000-FAFFFFFF VME A32 D8-D32 yy=xx+1
+ * FB000000-FBFEFFFF VME A24 D8-D32
+ * FBFF0000-FBFFFFFF VME A16 D8-D32
+ * FC000000-FCFEFFFF VME A24 D8-D16
+ * FCFF0000-FCFFFFFF VME A16 D8-D16
+ * FF800000 MPCC
+ * FF800200 MPCC2 - on daughter board
+ * FF800600 MPCC3 - on daughter board
+ * FF800800 BIM
+ * FF800C00 PIT
+ * FF800A00 RTC
+ *
+ *---------------------------------------------------------------------------
+ * TODO:
+ * - Find accurate documentation and adjust memory map for Y boards
+ * - Improve 68561 UART
+ * - Improve hookup of 68230 PIT
+ * - ABORT switch
+ * - Enable/Disable VME interrupts
+ * - Interrupts: Timer, ACFAIL, SYSFAIL and VMX irq
+ * - Memory config
+ * - Board ID
+ * - Add FGA, DUSCC devices and CPU-22 variants
+ * - Add FLME bus for memory expansions and optional extra MPCC
+ * - Add VMX bus on the P2 connector
+ * - Enable FPU
+ * - Add user EPROM sockets as cartridge interface enabling softlists
+ * NOT PLANNED:
+ * - VME bus arbiter as MAME always gets the bus
+ ****************************************************************************/
+#include "emu.h"
+#include "cpu/m68000/m68000.h"
+#include "bus/rs232/rs232.h"
+#include "machine/68230pit.h"
+#include "machine/68153bim.h"
+#include "machine/68561mpcc.h"
+#include "machine/clock.h"
+#include "vme_fccpu20.h"
+
+#define LOG_GENERAL 0x01
+#define LOG_SETUP 0x02
+#define LOG_PRINTF 0x04
+#define LOG_INT 0x08
+
+#define VERBOSE 0 //(LOG_PRINTF | LOG_SETUP | LOG_GENERAL)
+
+#define LOGMASK(mask, ...) do { if (VERBOSE & mask) logerror(__VA_ARGS__); } while (0)
+#define LOGLEVEL(mask, level, ...) do { if ((VERBOSE & mask) >= level) logerror(__VA_ARGS__); } while (0)
+
+#define LOG(...) LOGMASK(LOG_GENERAL, __VA_ARGS__)
+#define LOGSETUP(...) LOGMASK(LOG_SETUP, __VA_ARGS__)
+#define LOGINT(...) LOGMASK(LOG_SETUP, __VA_ARGS__)
+
+#if VERBOSE & LOG_PRINTF
+#define logerror printf
+#endif
+
+#ifdef _MSC_VER
+#define FUNCNAME __func__
+#else
+#define FUNCNAME __PRETTY_FUNCTION__
+#endif
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+const device_type VME_FCCPU20 = &device_creator<vme_fccpu20_card_device>;
+const device_type VME_FCCPU21S = &device_creator<vme_fccpu21s_card_device>;
+const device_type VME_FCCPU21 = &device_creator<vme_fccpu21_card_device>;
+const device_type VME_FCCPU21A = &device_creator<vme_fccpu21a_card_device>;
+const device_type VME_FCCPU21YA = &device_creator<vme_fccpu21ya_card_device>;
+const device_type VME_FCCPU21B = &device_creator<vme_fccpu21b_card_device>;
+const device_type VME_FCCPU21YB = &device_creator<vme_fccpu21yb_card_device>;
+
+#define CLOCK50 XTAL_50MHz /* HCJ */
+#define CLOCK40 XTAL_40MHz /* HCJ */
+#define CLOCK32 XTAL_32MHz /* HCJ */
+
+static ADDRESS_MAP_START (cpu20_mem, AS_PROGRAM, 32, vme_fccpu20_device)
+ ADDRESS_MAP_UNMAP_HIGH
+ AM_RANGE (0x00000000, 0x00000007) AM_ROM AM_READ (bootvect_r) /* ROM mirror just during reset */
+ AM_RANGE (0x00000000, 0x00000007) AM_RAM AM_WRITE (bootvect_w) /* After first write we act as RAM */
+ AM_RANGE (0x00000008, 0x0007ffff) AM_RAM /* Local SRAM */
+ AM_RANGE (0x00080000, 0x000fffff) AM_RAM /* SRAM-22 installed */
+ AM_RANGE (0xff040000, 0xff04ffff) AM_RAM
+ AM_RANGE (0xff000000, 0xff00ffff) AM_ROM AM_REGION("roms", 0x0000)
+ AM_RANGE (0xff800000, 0xff80001f) AM_DEVREADWRITE8("mpcc", mpcc68561_device, read, write, 0xffffffff)
+ AM_RANGE (0xff800200, 0xff80021f) AM_DEVREADWRITE8("mpcc2", mpcc68561_device, read, write, 0xffffffff)
+ AM_RANGE (0xff800600, 0xff80061f) AM_DEVREADWRITE8("mpcc3", mpcc68561_device, read, write, 0xffffffff)
+ AM_RANGE (0xff800800, 0xff80080f) AM_DEVREADWRITE8("bim", bim68153_device, read, write, 0xff00ff00)
+ AM_RANGE (0xff800c00, 0xff800dff) AM_DEVREADWRITE8("pit", pit68230_device, read, write, 0xffffffff)
+ADDRESS_MAP_END
+
+/*
+ * Machine configuration
+ */
+static MACHINE_CONFIG_FRAGMENT (fccpu20)
+ /* basic machine hardware */
+ MCFG_CPU_ADD ("maincpu", M68020, CLOCK50 / 3) /* Crytstal verified from picture HCI */
+ MCFG_CPU_PROGRAM_MAP (cpu20_mem)
+ MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("bim", bim68153_device, iack)
+
+ /* PIT Parallel Interface and Timer device, assumed strapped for on board clock */
+ MCFG_DEVICE_ADD ("pit", PIT68230, CLOCK32 / 4) /* Crystal not verified */
+ MCFG_PIT68230_PA_INPUT_CB(READ8(vme_fccpu20_device, pita_r))
+ MCFG_PIT68230_PB_INPUT_CB(READ8(vme_fccpu20_device, pitb_r))
+ MCFG_PIT68230_PC_INPUT_CB(READ8(vme_fccpu20_device, pitc_r))
+ MCFG_PIT68230_TIMER_IRQ_CB(DEVWRITELINE("bim", bim68153_device, int2_w))
+
+ /* BIM */
+ MCFG_MC68153_ADD("bim", CLOCK32 / 8)
+ MCFG_BIM68153_OUT_INT_CB(WRITELINE(vme_fccpu20_device, bim_irq_callback))
+ /*INT0 - Abort switch */
+ /*INT1 - MPCC@8.064 MHz aswell */
+ /*INT2 - PI/T timer */
+ /*INT3 - SYSFAIL/IRQVMX/ACFAIL/MPCC2/3 */
+
+ /* MPCC */
+#define RS232P1_TAG "rs232p1"
+#define RS232P2_TAG "rs232p2"
+#define RS232P3_TAG "rs232p3"
+ // MPCC
+ MCFG_MPCC68561_ADD ("mpcc", CLOCK32 / 4, 0, 0)
+ MCFG_MPCC_OUT_TXD_CB(DEVWRITELINE(RS232P1_TAG, rs232_port_device, write_txd))
+ MCFG_MPCC_OUT_DTR_CB(DEVWRITELINE(RS232P1_TAG, rs232_port_device, write_dtr))
+ MCFG_MPCC_OUT_RTS_CB(DEVWRITELINE(RS232P1_TAG, rs232_port_device, write_rts))
+ MCFG_MPCC_OUT_INT_CB(DEVWRITELINE("bim", bim68153_device, int1_w))
+
+ /* Additional MPCC sits on FLME boards like SRAM-22,
+ TODO: install MPCC2/MPCC3 in FLME slot device */
+ // MPCC2
+ MCFG_MPCC68561_ADD ("mpcc2", CLOCK32 / 4, 0, 0)
+ MCFG_MPCC_OUT_TXD_CB(DEVWRITELINE(RS232P2_TAG, rs232_port_device, write_txd))
+ MCFG_MPCC_OUT_DTR_CB(DEVWRITELINE(RS232P2_TAG, rs232_port_device, write_dtr))
+ MCFG_MPCC_OUT_RTS_CB(DEVWRITELINE(RS232P2_TAG, rs232_port_device, write_rts))
+ MCFG_MPCC_OUT_INT_CB(DEVWRITELINE("bim", bim68153_device, int3_w))
+ // MPCC3
+ MCFG_MPCC68561_ADD ("mpcc3", CLOCK32 / 4, 0, 0)
+ MCFG_MPCC_OUT_TXD_CB(DEVWRITELINE(RS232P3_TAG, rs232_port_device, write_txd))
+ MCFG_MPCC_OUT_DTR_CB(DEVWRITELINE(RS232P3_TAG, rs232_port_device, write_dtr))
+ MCFG_MPCC_OUT_RTS_CB(DEVWRITELINE(RS232P3_TAG, rs232_port_device, write_rts))
+ MCFG_MPCC_OUT_INT_CB(DEVWRITELINE("bim", bim68153_device, int3_w))
+
+ // MPCC - RS232
+ MCFG_RS232_PORT_ADD (RS232P1_TAG, default_rs232_devices, "terminal")
+ MCFG_RS232_RXD_HANDLER (DEVWRITELINE ("mpcc", mpcc68561_device, write_rx))
+ MCFG_RS232_CTS_HANDLER (DEVWRITELINE ("mpcc", mpcc68561_device, cts_w))
+
+ // MPCC2 - RS232
+ MCFG_RS232_PORT_ADD (RS232P2_TAG, default_rs232_devices, nullptr)
+ MCFG_RS232_RXD_HANDLER (DEVWRITELINE ("mpcc2", mpcc68561_device, write_rx))
+ MCFG_RS232_CTS_HANDLER (DEVWRITELINE ("mpcc2", mpcc68561_device, cts_w))
+
+ // MPCC3 - RS232
+ MCFG_RS232_PORT_ADD (RS232P3_TAG, default_rs232_devices, nullptr)
+ MCFG_RS232_RXD_HANDLER (DEVWRITELINE ("mpcc3", mpcc68561_device, write_rx))
+ MCFG_RS232_CTS_HANDLER (DEVWRITELINE ("mpcc3", mpcc68561_device, cts_w))
+MACHINE_CONFIG_END
+
+// SYS68K/CPU-21S Part No.1 01 041 - 68020 CPU board + FPU 68881 at 12.5 MHz, 512 KB RAM
+static MACHINE_CONFIG_DERIVED( fccpu21s, fccpu20 )
+ MCFG_DEVICE_MODIFY("maincpu")
+ MCFG_DEVICE_CLOCK( CLOCK50 / 4)
+MACHINE_CONFIG_END
+
+// SYS68K/CPU-21 Part No.1 01 001 - 68020 CPU board (CPU-20) + FPU 68881 at 16.7 MHz, 512 KB RAM
+static MACHINE_CONFIG_DERIVED( fccpu21, fccpu20 )
+ MCFG_DEVICE_MODIFY("maincpu")
+ MCFG_DEVICE_CLOCK( CLOCK50 / 3)
+MACHINE_CONFIG_END
+
+// SYS68K/CPU-21A Part No.1 01 011 - 68020 CPU board + FPU 68881 at 20 MHz, 512 KB RAM
+static MACHINE_CONFIG_DERIVED( fccpu21a, fccpu20 )
+ MCFG_DEVICE_MODIFY("maincpu")
+ MCFG_DEVICE_CLOCK( CLOCK40 / 2)
+MACHINE_CONFIG_END
+
+// SYS68K/CPU-21YA Part No.1 01 061 - 68020 CPU board + FPU 68881 at 20 MHz, 2048 KB RAM
+static MACHINE_CONFIG_DERIVED( fccpu21ya, fccpu20 )
+ MCFG_DEVICE_MODIFY("maincpu")
+ MCFG_DEVICE_CLOCK( CLOCK40 / 2)
+MACHINE_CONFIG_END
+
+// SYS68K/CPU-21B Part No.1 01 021 - 68020 CPU board + FPU 68881 at 25 MHz, 512 KB RAM
+static MACHINE_CONFIG_DERIVED( fccpu21b, fccpu20 )
+ MCFG_DEVICE_MODIFY("maincpu")
+ MCFG_DEVICE_CLOCK( CLOCK50 / 2)
+MACHINE_CONFIG_END
+
+// SYS68K/CPU-21YB Part No.1 01 071 - 68020 CPU board + FPU 68881 at 25 MHz, 2048 KB RAM
+static MACHINE_CONFIG_DERIVED( fccpu21yb, fccpu20 )
+ MCFG_DEVICE_MODIFY("maincpu")
+ MCFG_DEVICE_CLOCK( CLOCK50 / 2)
+MACHINE_CONFIG_END
+
+machine_config_constructor vme_fccpu20_device::device_mconfig_additions() const
+{
+ LOG("%s %s\n", tag(), FUNCNAME);
+
+ switch (m_board_id)
+ {
+ case cpu20: return MACHINE_CONFIG_NAME( fccpu20 ); break;
+ case cpu21a: return MACHINE_CONFIG_NAME( fccpu21a ); break;
+ case cpu21ya: return MACHINE_CONFIG_NAME( fccpu21ya ); break;
+ case cpu21b: return MACHINE_CONFIG_NAME( fccpu21b ); break;
+ case cpu21yb: return MACHINE_CONFIG_NAME( fccpu21yb ); break;
+ case cpu21s: return MACHINE_CONFIG_NAME( fccpu21s ); break;
+ case cpu21: return MACHINE_CONFIG_NAME( fccpu21 ); break;
+ default: logerror("Attempt to get config for unknown board type %02x, defaulting to CPU20\n", m_board_id);
+ return MACHINE_CONFIG_NAME( fccpu20 );
+ }
+ return MACHINE_CONFIG_NAME( fccpu20 );
+}
+
+//**************************************************************************
+// Base Device
+//**************************************************************************
+vme_fccpu20_device::vme_fccpu20_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source, fc_board_t board_id) :
+ device_t(mconfig, type, name, tag, owner, clock, shortname, source)
+ , device_vme_card_interface(mconfig, *this)
+ , m_maincpu (*this, "maincpu")
+ , m_pit (*this, "pit")
+ , m_bim (*this, "bim")
+ , m_mpcc (*this, "mpcc")
+ , m_mpcc2 (*this, "mpcc2")
+ , m_mpcc3 (*this, "mpcc3")
+ , m_board_id(board_id)
+{
+ LOG("%s\n", FUNCNAME);
+}
+
+//**************************************************************************
+// Card Devices
+//**************************************************************************
+vme_fccpu20_card_device::vme_fccpu20_card_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : vme_fccpu20_card_device( mconfig, VME_FCCPU20, "Force Computer SYS68K/CPU-20 CPU Board", tag, owner, clock, "fccpu20", __FILE__)
+{
+ LOG("%s %s\n", tag, FUNCNAME);
+}
+
+
+vme_fccpu21s_card_device::vme_fccpu21s_card_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : vme_fccpu21s_card_device( mconfig, VME_FCCPU21S, "Force Computer SYS68K/CPU-21S CPU Board", tag, owner, clock, "fccpu21s", __FILE__)
+{
+ LOG("%s %s\n", tag, FUNCNAME);
+}
+
+vme_fccpu21_card_device::vme_fccpu21_card_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : vme_fccpu21_card_device( mconfig, VME_FCCPU21, "Force Computer SYS68K/CPU-21 CPU Board", tag, owner, clock, "fccpu21", __FILE__)
+{
+ LOG("%s %s\n", tag, FUNCNAME);
+}
+
+vme_fccpu21a_card_device::vme_fccpu21a_card_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : vme_fccpu21a_card_device( mconfig, VME_FCCPU21A, "Force Computer SYS68K/CPU-21A CPU Board", tag, owner, clock, "fccpu21a", __FILE__)
+{
+ LOG("%s %s\n", tag, FUNCNAME);
+}
+
+// TODO: Change to 2MB on board RAM and move FLME memory and find/verify memory map
+vme_fccpu21ya_card_device::vme_fccpu21ya_card_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : vme_fccpu21ya_card_device( mconfig, VME_FCCPU21YA, "Force Computer SYS68K/CPU-21YA CPU Board", tag, owner, clock, "fccpu21ya", __FILE__)
+{
+ LOG("%s %s\n", tag, FUNCNAME);
+}
+
+vme_fccpu21b_card_device::vme_fccpu21b_card_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : vme_fccpu21b_card_device( mconfig, VME_FCCPU21B, "Force Computer SYS68K/CPU-21B CPU Board", tag, owner, clock, "fccpu21b", __FILE__)
+{
+ LOG("%s %s\n", tag, FUNCNAME);
+}
+
+// TODO: Change to 2MB on board RAM and move FLME memory and find/verify memory map
+vme_fccpu21yb_card_device::vme_fccpu21yb_card_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : vme_fccpu21yb_card_device( mconfig, VME_FCCPU21B, "Force Computer SYS68K/CPU-21YB CPU Board", tag, owner, clock, "fccpu21yb", __FILE__)
+{
+ LOG("%s %s\n", tag, FUNCNAME);
+}
+
+/* Start it up */
+void vme_fccpu20_device::device_start()
+{
+ LOG("%s\n", FUNCNAME);
+
+ set_vme_device();
+
+ save_pointer (NAME (m_sysrom), sizeof(m_sysrom));
+ save_pointer (NAME (m_sysram), sizeof(m_sysram));
+ // save_item(NAME(m_board_id)); // TODO: Save this "non base type" item
+
+ /* TODO: setup this RAM from (not yet) optional SRAM-2x board and also support 2MB versions */
+ //m_maincpu->space(AS_PROGRAM).install_ram(0x80000, m_ram->size() + 0x7ffff, m_ram->pointer());
+
+ /* Setup pointer to bootvector in ROM for bootvector handler bootvect_r */
+ m_sysrom = (uint32_t*)(memregion ("roms")->base());
+
+#if 0 // TODO: Setup VME access handlers for shared memory area
+ uint32_t base = 0xFFFF5000;
+ m_vme->install_device(base + 0, base + 1, // Channel B - Data
+ read8_delegate(FUNC(z80sio_device::db_r), subdevice<z80sio_device>("pit")), write8_delegate(FUNC(z80sio_device::db_w), subdevice<z80sio_device>("pit")), 0x00ff);
+ m_vme->install_device(base + 2, base + 3, // Channel B - Control
+ read8_delegate(FUNC(z80sio_device::cb_r), subdevice<z80sio_device>("pit")), write8_delegate(FUNC(z80sio_device::cb_w), subdevice<z80sio_device>("pit")), 0x00ff);
+#endif
+
+}
+
+void vme_fccpu20_device::device_reset()
+{
+ LOG("%s\n", FUNCNAME);
+}
+
+/* Boot vector handler, the PCB hardwires the first 8 bytes from 0xff800000 to 0x0 at reset*/
+READ32_MEMBER (vme_fccpu20_device::bootvect_r)
+{
+ LOG("%s\n", FUNCNAME);
+ return m_sysrom[offset];
+}
+
+WRITE32_MEMBER (vme_fccpu20_device::bootvect_w)
+{
+ LOG("%s\n", FUNCNAME);
+ m_sysram[offset % sizeof(m_sysram)] &= ~mem_mask;
+ m_sysram[offset % sizeof(m_sysram)] |= (data & mem_mask);
+ m_sysrom = &m_sysram[0]; // redirect all upcomming accesses to masking RAM until reset.
+}
+
+WRITE_LINE_MEMBER(vme_fccpu20_device::bim_irq_callback)
+{
+ LOGINT("%s(%02x)\n", FUNCNAME, state);
+
+ bim_irq_state = state;
+ bim_irq_level = m_bim->get_irq_level();
+ LOGINT(" - BIM irq level %02x\n", bim_irq_level);
+ update_irq_to_maincpu();
+}
+
+void vme_fccpu20_device::update_irq_to_maincpu()
+{
+ LOGINT("%s()\n", FUNCNAME);
+ LOGINT(" - bim_irq_level: %02x\n", bim_irq_level);
+ LOGINT(" - bim_irq_state: %02x\n", bim_irq_state);
+ switch (bim_irq_level & 0x07)
+ {
+ case 1: m_maincpu->set_input_line(M68K_IRQ_1, bim_irq_state); break;
+ case 2: m_maincpu->set_input_line(M68K_IRQ_2, bim_irq_state); break;
+ case 3: m_maincpu->set_input_line(M68K_IRQ_3, bim_irq_state); break;
+ case 4: m_maincpu->set_input_line(M68K_IRQ_4, bim_irq_state); break;
+ case 5: m_maincpu->set_input_line(M68K_IRQ_5, bim_irq_state); break;
+ case 6: m_maincpu->set_input_line(M68K_IRQ_6, bim_irq_state); break;
+ case 7: m_maincpu->set_input_line(M68K_IRQ_7, bim_irq_state); break;
+ default: logerror("Programmatic error in %s, please report\n", FUNCNAME);
+ }
+}
+
+/* 8 configuration DIP switches
+ Baud B3 B2 B1 B0
+ 9600 0 0 0 1 7 bits
+ 28800 0 0 1 0 7 bits
+ 38400 1 0 1 0 8 bits
+ 57600 0 0 1 1 7 bits
+
+ B3: 8 bit 38400 baud
+ B4/B5: Both set boots FORCEbug
+ B6: Auto execute FF00C0000
+ B7: memory size?
+*/
+/* PIT Port definitions */
+#define BR7N9600 0x01
+#define BR7N28800 0x02
+#define BR7N38400 0x06
+#define BR7N57600 0x03
+#define BR8N38400 0x08
+#define FORCEBUG 0x30
+
+READ8_MEMBER (vme_fccpu20_device::pita_r)
+{
+ LOG("%s\n", FUNCNAME);
+ return FORCEBUG | BR7N9600;
+}
+
+/* Enabling/Disabling of VME IRQ 1-7 */
+READ8_MEMBER (vme_fccpu20_device::pitb_r)
+{
+ LOG("%s\n", FUNCNAME);
+ return 0xff;
+}
+
+/* VME board ID bit and bus release software settings (output) (ROR, RAT, RATAR, RATBCLR, RORAT, RORRAT */
+READ8_MEMBER (vme_fccpu20_device::pitc_r)
+{
+ uint8_t board_id = 0;
+
+ LOG("%s Board id:%02x\n", FUNCNAME, m_board_id);
+
+ switch (m_board_id)
+ {
+ case cpu20:
+ board_id = CPU20;
+ break;
+ case cpu21a:
+ case cpu21ya:
+ case cpu21b:
+ case cpu21yb:
+ case cpu21s:
+ case cpu21:
+ board_id = CPU21;
+ break;
+ default: logerror("Attempt to set unknown board type %02x, defaulting to CPU20\n", board_id);
+ board_id = CPU20;
+ }
+
+ return board_id | 0xbf;
+}
+
+/* ROM definitions */
+ROM_START (fccpu20) /* This is an original rom dump */
+ ROM_REGION32_BE(0x10000, "roms", 0)
+ ROM_LOAD32_BYTE("L.BIN", 0x000002, 0x4000, CRC (174ab801) SHA1 (0d7b8ed29d5fdd4bd2073005008120c5f20128dd))
+ ROM_LOAD32_BYTE("LL.BIN", 0x000003, 0x4000, CRC (9fd9e3e4) SHA1 (e5a7c87021e6be412dd5a8166d9f62b681169eda))
+ ROM_LOAD32_BYTE("U.BIN", 0x000001, 0x4000, CRC (d1afe4c0) SHA1 (b5baf9798d73632f7bb843cbc4b306c8c03f4296))
+ ROM_LOAD32_BYTE("UU.BIN", 0x000000, 0x4000, CRC (b54d623b) SHA1 (49b272184a04570b09004de71fae0ed0d1bf5929))
+ROM_END
+
+/* These cpu-21 boards are supported by the latest cpu-20 rom */
+#define rom_fccpu21s rom_fccpu20
+#define rom_fccpu21 rom_fccpu20
+#define rom_fccpu21a rom_fccpu20
+#define rom_fccpu21ya rom_fccpu20
+#define rom_fccpu21b rom_fccpu20
+#define rom_fccpu21yb rom_fccpu20
+
+const tiny_rom_entry *vme_fccpu20_device::device_rom_region() const
+{
+ LOG("%s\n", FUNCNAME);
+
+ switch (m_board_id)
+ {
+ case cpu20: return ROM_NAME( fccpu20 ); break;
+ case cpu21a: return ROM_NAME( fccpu21a ); break;
+ case cpu21ya: return ROM_NAME( fccpu21ya ); break;
+ case cpu21b: return ROM_NAME( fccpu21b ); break;
+ case cpu21yb: return ROM_NAME( fccpu21yb ); break;
+ case cpu21s: return ROM_NAME( fccpu21s ); break;
+ case cpu21: return ROM_NAME( fccpu21 ); break;
+ default: logerror("Attempt to get rom set for unknown board type %02x, defaulting to CPU20\n", m_board_id);
+ return ROM_NAME( fccpu20 );
+ }
+}
+
+/*
+ * System ROM information
+ *
+ * FORCEbug SYS68K/CPU-20 Debugging Tool Version 1.3 22-Jan-87
+ * FORCE PDOS Bootstrap , Revision 2.3 22-Jan-87
+ *
+ * BIM setup: (reordered for improved reading)
+ * : 0 Reg vector <- 1f
+ * : 1 Reg vector <- 1c
+ * : 2 Reg vector <- 1d
+ * : 3 Reg vector <- 1c
+ * : 0 Reg control <- 57 - Lev:7 Auto Disable:0 Int Enable:1 Vector:0 Auto Clear:1 Flag:0
+ * : 1 Reg control <- 54 - Lev:4 Auto Disable:0 Int Enable:1 Vector:0 Auto Clear:1 Flag:0
+ * : 2 Reg control <- 55 - Lev:5 Auto Disable:0 Int Enable:1 Vector:0 Auto Clear:1 Flag:0
+ * : 3 Reg control <- 54 - Lev:4 Auto Disable:0 Int Enable:1 Vector:0 Auto Clear:1 Flag:0
+ *
+ * PIT setup:
+ * :pit Reg 0a -> 00
+ * :pit Reg 00 <- 30 - PGCR - Mode 0, H34:enabled, H12:enabled, Sense assert H4:Lo, H3:Lo, H2:Lo, H1:Lo
+ * :pit Reg 01 <- 08 - PSSR - PC4 pin activated, PC5 pin support no interrupts, H prio mode:0
+ * :pit Reg 06 <- 84 - PACR
+ * :pit Reg 02 <- 00 - PADDR: 00
+ * :pit Reg 07 <- 84 - PBCR
+ * :pit Reg 09 <- ff - PBDR
+ * :pit Reg 03 <- ff - PBDDR: ff
+ * :pit Reg 0c <- 07 - PCDR
+ * :pit Reg 04 <- 87 - PCDDR: 87
+ * :pit Reg 15 <- d8 - CPRL
+ * :pit Reg 14 <- 09 - CPRM
+ * :pit Reg 13 <- 00 - CPRH
+ * :pit Reg 10 <- e1 - TCR - PC3 used as TOUT and PC7 used as I/O pin, Interrupts enabled
+ - PC2 used as I/O pin,CLK and x32 prescaler are used
+ - Timer reload the preload values when reaching 0 (zero)
+ - Timer is enabled
+ * MPCC setup
+ * : Reg 19 <- 1e - PSR2: Byte mode, 1 Stop bit, 8 bit data, ASYNC mode
+ * : Reg 1c <- 8a - BRDR1: Baud Rate Divider 1
+ * : Reg 1d <- 00 - BRDR1: Baud Rate Divider 2
+ * : Reg 1e <- 1c - CCR: x3 Mode, TxC is output, internal RxC, ISOC
+ * : Reg 1f <- 00 - ECR: No parity
+ * : Reg 0d <- 00 - TIER: interrupts disabled
+ * : Reg 15 <- 00 - SIER: interrupts disabled
+ * : Reg 05 <- 80 - RIER: enable RDA interrupts
+ * : Reg 01 <- 01 - RCR: Reset receiver command
+ * : Reg 01 <- 00 - RCR: Reciver in normal operation
+ * : Reg 09 <- 01 - TCR: Reset transmitter command
+ * : Reg 09 <- 80 - TCR: Transmitter in normal operation
+ * : Reg 11 <- c0 - SICR: Assert RTS, Assert DTR
+ * : Reg 08 -> 80 - TSR: Tx FIFO has room
+ * : Reg 0a <- 0a - TDR: send 0x0a to Tx FIFO... etc
+ *
+ * TDR outputs:
+ * "Disk Controller installed
+ * Disk #0: Header sector error = 145
+ * Disk #1: Header sector error = 145
+ * Out of PDOS boot disk table entries.
+ * I'LL Retry them all."
+ *
+ */
diff --git a/src/devices/bus/vme/vme_fccpu20.h b/src/devices/bus/vme/vme_fccpu20.h
new file mode 100644
index 00000000000..fd506da11ca
--- /dev/null
+++ b/src/devices/bus/vme/vme_fccpu20.h
@@ -0,0 +1,143 @@
+// license:BSD-3-Clause
+// copyright-holders:Joakim Larsson Edstrom
+#ifndef VME_FCCPU20_H
+#define VME_FCCPU20_H
+#pragma once
+
+#include "emu.h"
+
+#include "machine/68561mpcc.h"
+#include "machine/68230pit.h"
+#include "machine/68153bim.h"
+#include "bus/vme/vme.h"
+
+extern const device_type VME_FCCPU20;
+extern const device_type VME_FCCPU21S;
+extern const device_type VME_FCCPU21;
+extern const device_type VME_FCCPU21A;
+extern const device_type VME_FCCPU21YA;
+extern const device_type VME_FCCPU21B;
+extern const device_type VME_FCCPU21YB;
+
+// PIT port C Board ID bits
+#define CPU20 0x40
+#define CPU21 0x00
+
+/* Board types */
+enum fc_board_t {
+ cpu20,
+ cpu21,
+ cpu21a,
+ cpu21ya,
+ cpu21b,
+ cpu21yb,
+ cpu21s
+};
+
+//**************************************************************************
+// Base Device declaration
+//**************************************************************************
+class vme_fccpu20_device : public device_t, public device_vme_card_interface
+{
+public:
+ vme_fccpu20_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source, fc_board_t board_id);
+
+ // optional information overrides
+ virtual machine_config_constructor device_mconfig_additions() const override;
+ virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual void device_start() override;
+
+ // Below are duplicated declarations from src/mame/drivers/fccpu20.cpp
+ DECLARE_READ32_MEMBER (bootvect_r);
+ DECLARE_WRITE32_MEMBER (bootvect_w);
+
+ DECLARE_WRITE_LINE_MEMBER(bim_irq_callback);
+ uint8_t bim_irq_state;
+ int bim_irq_level;
+
+ /* PIT callbacks */
+ DECLARE_READ8_MEMBER (pita_r);
+ DECLARE_READ8_MEMBER (pitb_r);
+ DECLARE_READ8_MEMBER (pitc_r);
+
+private:
+ required_device<cpu_device> m_maincpu;
+ required_device<pit68230_device> m_pit;
+ required_device<bim68153_device> m_bim;
+ required_device<mpcc68561_device> m_mpcc;
+ required_device<mpcc68561_device> m_mpcc2;
+ required_device<mpcc68561_device> m_mpcc3;
+
+ // Pointer to System ROMs needed by bootvect_r and masking RAM buffer for post reset accesses
+ uint32_t *m_sysrom;
+ uint32_t m_sysram[2];
+ void update_irq_to_maincpu();
+ fc_board_t m_board_id;
+
+ // Below replaces machine_start and machine_reset from src/mame/drivers/fccpu20.cpp
+protected:
+ virtual void device_reset() override;
+};
+
+//**************************************************************************
+// Board Device declarations
+//**************************************************************************
+
+class vme_fccpu20_card_device : public vme_fccpu20_device
+{
+public :
+ vme_fccpu20_card_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ vme_fccpu20_card_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source)
+ : vme_fccpu20_device( mconfig, type, name, tag, owner, clock, shortname, source, cpu20) { }
+};
+
+class vme_fccpu21s_card_device : public vme_fccpu20_device
+{
+public :
+ vme_fccpu21s_card_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ vme_fccpu21s_card_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source)
+ : vme_fccpu20_device( mconfig, type, name, tag, owner, clock, shortname, source, cpu21s) { }
+};
+
+class vme_fccpu21_card_device : public vme_fccpu20_device
+{
+public :
+ vme_fccpu21_card_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ vme_fccpu21_card_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source)
+ : vme_fccpu20_device( mconfig, type, name, tag, owner, clock, shortname, source, cpu21) { }
+};
+
+class vme_fccpu21a_card_device : public vme_fccpu20_device
+{
+public :
+ vme_fccpu21a_card_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ vme_fccpu21a_card_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source)
+ : vme_fccpu20_device( mconfig, type, name, tag, owner, clock, shortname, source, cpu21a) { }
+};
+
+class vme_fccpu21ya_card_device : public vme_fccpu20_device
+{
+public :
+ vme_fccpu21ya_card_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ vme_fccpu21ya_card_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source)
+ : vme_fccpu20_device( mconfig, type, name, tag, owner, clock, shortname, source, cpu21ya) { }
+};
+
+class vme_fccpu21b_card_device : public vme_fccpu20_device
+{
+public :
+ vme_fccpu21b_card_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ vme_fccpu21b_card_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source)
+ : vme_fccpu20_device( mconfig, type, name, tag, owner, clock, shortname, source, cpu21b) { }
+};
+
+class vme_fccpu21yb_card_device : public vme_fccpu20_device
+{
+public :
+ vme_fccpu21yb_card_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ vme_fccpu21yb_card_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source)
+ : vme_fccpu20_device( mconfig, type, name, tag, owner, clock, shortname, source, cpu21yb) { }
+};
+
+
+#endif // VME_FCCPU20_H
diff --git a/src/devices/bus/vme/vme_fcisio.cpp b/src/devices/bus/vme/vme_fcisio.cpp
index 5845603f108..75d325f2c81 100644
--- a/src/devices/bus/vme/vme_fcisio.cpp
+++ b/src/devices/bus/vme/vme_fcisio.cpp
@@ -94,7 +94,7 @@
*
* VME side A24 address map - Dual ported RAM
* ----------------------------------------------------------
- * Offset Range Description
+ * Offset Range Description
* ----------------------------------------------------------
* 000000 - 0007FF BIM
* 000800 - 000FFF Status registers
@@ -158,7 +158,7 @@
#endif
//**************************************************************************
-// GLOBAL VARIABLES
+// GLOBAL VARIABLES
//**************************************************************************
const device_type VME_FCISIO1 = &device_creator<vme_fcisio1_card_device>;
@@ -195,7 +195,7 @@ static MACHINE_CONFIG_FRAGMENT (fcisio1)
MCFG_RS232_PORT_ADD ("rs232trm", default_rs232_devices, "terminal")
MCFG_RS232_RXD_HANDLER (DEVWRITELINE ("duscc0", duscc68562_device, rxa_w))
MCFG_RS232_CTS_HANDLER (DEVWRITELINE ("duscc0", duscc68562_device, ctsa_w))
-// MCFG_DEVICE_CARD_DEVICE_INPUT_DEFAULTS("terminal", fcisio_terminal)
+// MCFG_DEVICE_CARD_DEVICE_INPUT_DEFAULTS("terminal", fcisio_terminal)
MCFG_DUSCC68562_ADD("duscc1", DUSCC_CLOCK, 0, 0, 0, 0 )
MCFG_DUSCC68562_ADD("duscc2", DUSCC_CLOCK, 0, 0, 0, 0 )
diff --git a/src/devices/bus/vme/vme_fcisio.h b/src/devices/bus/vme/vme_fcisio.h
index 1152589e314..fc668cc276a 100644
--- a/src/devices/bus/vme/vme_fcisio.h
+++ b/src/devices/bus/vme/vme_fcisio.h
@@ -11,7 +11,7 @@
extern const device_type VME_FCISIO1;
-class vme_fcisio1_card_device :
+class vme_fcisio1_card_device :
public device_t
,public device_vme_card_interface
{
diff --git a/src/devices/bus/vme/vme_fcscsi.cpp b/src/devices/bus/vme/vme_fcscsi.cpp
index 3dcf7c17117..96e8548a86f 100644
--- a/src/devices/bus/vme/vme_fcscsi.cpp
+++ b/src/devices/bus/vme/vme_fcscsi.cpp
@@ -72,10 +72,10 @@
* - 68010 CPU for local control (10MHz)
* - 68450 DMA Controller for local transfers (10MHz)
* - Dual Ported l28Kbyte 0 wait state static RAM between the VMEbus and the local CPU
- * - SCSlbus interface built with the NCR 5386S SCSlbus controller.
+ * - SCSlbus interface built with the NCR 5386S SCSlbus controller.
* o Programmable as an initiator or target
* o Transfer rate up to 1.5Mbyte/s
- * - SHUGART compatible floppy interface with the WD1772 FDC. Up to 4 floppy drives can be
+ * - SHUGART compatible floppy interface with the WD1772 FDC. Up to 4 floppy drives can be
* controlled independent of the SCSlbus
* - All I/O signals available on P2 connector 4 different interrupt request signals to the VMEbus. Each
* channel contains a software programmable IRQ level (1 to 7) and vector
@@ -102,7 +102,7 @@
*
* VME side A24 address map - Dual ported RAM
* ----------------------------------------------------------
- * Default Range Description
+ * Default Range Description
* ----------------------------------------------------------
* A00000 - A00000 Status word Bits 8:RESET 9:HALT 10:WD
* A00001 - A0000F BIM - See below
@@ -176,7 +176,7 @@
#endif
//**************************************************************************
-// GLOBAL VARIABLES
+// GLOBAL VARIABLES
//**************************************************************************
const device_type VME_FCSCSI1 = &device_creator<vme_fcscsi1_card_device>;
diff --git a/src/devices/bus/vme/vme_fcscsi.h b/src/devices/bus/vme/vme_fcscsi.h
index 719f12df5b6..91b65a91552 100644
--- a/src/devices/bus/vme/vme_fcscsi.h
+++ b/src/devices/bus/vme/vme_fcscsi.h
@@ -11,7 +11,7 @@
extern const device_type VME_FCSCSI1;
-class vme_fcscsi1_card_device :
+class vme_fcscsi1_card_device :
public device_t
,public device_vme_card_interface
{
diff --git a/src/devices/bus/vme/vme_mvme350.cpp b/src/devices/bus/vme/vme_mvme350.cpp
index 69afff9490a..b4caeb65ab9 100644
--- a/src/devices/bus/vme/vme_mvme350.cpp
+++ b/src/devices/bus/vme/vme_mvme350.cpp
@@ -155,7 +155,7 @@
#endif
//**************************************************************************
-// GLOBAL VARIABLES
+// GLOBAL VARIABLES
//**************************************************************************
const device_type VME_MVME350 = &device_creator<vme_mvme350_card_device>;
@@ -178,8 +178,8 @@ static ADDRESS_MAP_START( mvme350_mem, AS_PROGRAM, 16, vme_mvme350_card_device )
ADDRESS_MAP_END
//-------------------------------------------------
-// machine_config_additions - device-specific
-// machine configurations
+// machine_config_additions - device-specific
+// machine configurations
//-------------------------------------------------
MACHINE_CONFIG_FRAGMENT( mvme350 )
@@ -236,10 +236,10 @@ void vme_mvme350_card_device::device_start()
/* From MVME166 Single Board Computer Installation Guide:
Controller Type First board Second board
- CLUN Address CLUN Address
+ CLUN Address CLUN Address
---------------------------------------------------
MVME350 - Streaming $04 $FFFF5000 $05 $FFFF5100
- Tape Controller
+ Tape Controller
---------------------------------------------------
*/
uint32_t base = 0xFFFF5000;
diff --git a/src/devices/bus/vme/vme_mvme350.h b/src/devices/bus/vme/vme_mvme350.h
index 5d79fa3d306..54aecc1ec82 100644
--- a/src/devices/bus/vme/vme_mvme350.h
+++ b/src/devices/bus/vme/vme_mvme350.h
@@ -8,7 +8,7 @@
extern const device_type VME_MVME350;
-class vme_mvme350_card_device :
+class vme_mvme350_card_device :
public device_t
,public device_vme_card_interface
{
@@ -21,8 +21,8 @@ public:
virtual const tiny_rom_entry *device_rom_region() const override;
// Shared memory methods to be exported to the VME bus
-// virtual DECLARE_READ16_MEMBER (read16) override;
-// virtual DECLARE_WRITE16_MEMBER (write16) override;
+// virtual DECLARE_READ16_MEMBER (read16) override;
+// virtual DECLARE_WRITE16_MEMBER (write16) override;
protected:
virtual void device_start() override;
virtual void device_reset() override;
diff --git a/src/devices/bus/vme/vme_mzr8105.cpp b/src/devices/bus/vme/vme_mzr8105.cpp
index 8239c0992f1..9b3813ee488 100644
--- a/src/devices/bus/vme/vme_mzr8105.cpp
+++ b/src/devices/bus/vme/vme_mzr8105.cpp
@@ -27,14 +27,14 @@
#endif
//**************************************************************************
-// GLOBAL VARIABLES
+// GLOBAL VARIABLES
//**************************************************************************
const device_type VME_MZR8105 = &device_creator<vme_mzr8105_card_device>;
//-------------------------------------------------
-// machine_config_additions - device-specific
-// machine configurations
+// machine_config_additions - device-specific
+// machine configurations
//-------------------------------------------------
MACHINE_CONFIG_EXTERN( mzr8105 );
diff --git a/src/devices/bus/vme/vme_mzr8300.cpp b/src/devices/bus/vme/vme_mzr8300.cpp
index 04ddd02636e..550cf2f3c2d 100644
--- a/src/devices/bus/vme/vme_mzr8300.cpp
+++ b/src/devices/bus/vme/vme_mzr8300.cpp
@@ -6,15 +6,15 @@
*
* 23/09/2015
*
- * This device was drycoded based on OS9 boot strap code on a Mizar mz8105 board
+ * This device was drycoded based on OS9 boot strap code on a Mizar mz8105 board
* which expects to find a SIO on the VME bus + photos of a Mizar 8300 board on Ebay
* I have found no formal documents for this board so far, so needs verification.
- *
- * ||
- * ||
- * ||
- * ||
- * ||____________________________________________________________ ___
+ *
+ * ||
+ * ||
+ * ||
+ * ||
+ * ||____________________________________________________________ ___
* \+++====|| U2|AM26LS32| | NEC | |74LS04N||74LS645 ||_| |
* \=/- o|| +--------+ | D7201C | ++-----+++----------+| | |
* | | || +-------+ +--------------------+ | | |SN74LS374N|| | |
@@ -32,14 +32,14 @@
* /=\- o||J1 K1 U4| xxx | xxx | 74LS164| K6 |AM25LS2521|| | |
* /+++====|| J2 +-------+--------+--------+--------+ +----------+|_| |
* ||Rev G U3| MC1488| MC1488 | 74LS161| 74F85 | K8 | |___|
- * ||-----------+-------+-----------------------------------------
- * ||
- * ||
+ * ||-----------+-------+-----------------------------------------
+ * ||
+ * ||
*
*
- * Misc links about this board:
+ * Misc links about this board:
* http://www.ebay.com/itm/MIZAR-INC-8300-0-01-REV-J-INTERFACE-CONTROL-BOARD-W-RIBBON-AND-PLATE-/231508658429?hash=item35e6fdc8fd
- *
+ *
* Description
* ------------
* The Mizar mz8300 is a Quad Serial board.
@@ -52,8 +52,8 @@
* --------------------------------------------------------------------------
* Local VME Decscription
* -------------------------------------------------------------------------
- * n/a 0xff0000 0xff0003 mzr8105.c Bootstrap expects to find a
- * UPD7201 serial device here - configurable!
+ * n/a 0xff0000 0xff0003 mzr8105.c Bootstrap expects to find a
+ * UPD7201 serial device here - configurable!
* --------------------------------------------------------------------------
*
* Interrupt sources MVME
@@ -61,15 +61,15 @@
* Description Device Lvl IRQ VME board
* /Board Vector Address
* ----------------------------------------------------------
- * On board Sources
- *
+ * On board Sources
+ *
* Off board Sources (other VME boards)
*
* ----------------------------------------------------------
*
* DMAC Channel Assignments
* ----------------------------------------------------------
- * Channel
+ * Channel
* ----------------------------------------------------------
*
* TODO:
@@ -110,7 +110,7 @@
#endif
//**************************************************************************
-// GLOBAL VARIABLES
+// GLOBAL VARIABLES
//**************************************************************************
const device_type VME_MZR8300 = &device_creator<vme_mzr8300_card_device>;
@@ -135,8 +135,8 @@ MACHINE_CONFIG_FRAGMENT( mzr8300 )
MACHINE_CONFIG_END
//-------------------------------------------------
-// machine_config_additions - device-specific
-// machine configurations
+// machine_config_additions - device-specific
+// machine configurations
//-------------------------------------------------
diff --git a/src/devices/bus/vme/vme_mzr8300.h b/src/devices/bus/vme/vme_mzr8300.h
index 73482cb5b77..b7145037073 100644
--- a/src/devices/bus/vme/vme_mzr8300.h
+++ b/src/devices/bus/vme/vme_mzr8300.h
@@ -8,7 +8,7 @@
extern const device_type VME_MZR8300;
-class vme_mzr8300_card_device :
+class vme_mzr8300_card_device :
public device_t
,public device_vme_card_interface
{
@@ -19,8 +19,8 @@ public:
// optional information overrides
virtual machine_config_constructor device_mconfig_additions() const override;
-// virtual DECLARE_READ8_MEMBER (read8) override;
-// virtual DECLARE_WRITE8_MEMBER (write8) override;
+// virtual DECLARE_READ8_MEMBER (read8) override;
+// virtual DECLARE_WRITE8_MEMBER (write8) override;
protected:
virtual void device_start() override;
virtual void device_reset() override;
diff --git a/src/devices/cpu/amis2000/amis2000.cpp b/src/devices/cpu/amis2000/amis2000.cpp
index a9b45e865b3..c79c858780c 100644
--- a/src/devices/cpu/amis2000/amis2000.cpp
+++ b/src/devices/cpu/amis2000/amis2000.cpp
@@ -55,15 +55,15 @@ ADDRESS_MAP_END
// device definitions
-amis2000_cpu_device::amis2000_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+amis2000_cpu_device::amis2000_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: amis2000_base_device(mconfig, AMI_S2000, "AMI S2000", tag, owner, clock, 2, 10, 3, 13, ADDRESS_MAP_NAME(program_1k), 6, ADDRESS_MAP_NAME(data_64x4), "amis2000", __FILE__)
{ }
-amis2150_cpu_device::amis2150_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+amis2150_cpu_device::amis2150_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: amis2000_base_device(mconfig, AMI_S2150, "AMI S2150", tag, owner, clock, 3, 11, 3, 13, ADDRESS_MAP_NAME(program_1_5k), 7, ADDRESS_MAP_NAME(data_80x4), "amis2150", __FILE__)
{ }
-amis2152_cpu_device::amis2152_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+amis2152_cpu_device::amis2152_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: amis2000_base_device(mconfig, AMI_S2152, "AMI S2152", tag, owner, clock, 3, 11, 3, 13, ADDRESS_MAP_NAME(program_1_5k), 7, ADDRESS_MAP_NAME(data_80x4), "amis2152", __FILE__)
{ }
@@ -89,7 +89,7 @@ void amis2000_base_device::state_string_export(const device_state_entry &entry,
}
}
-offs_t amis2000_base_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options)
+offs_t amis2000_base_device::disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options)
{
extern CPU_DISASSEMBLE(amis2000);
return CPU_DISASSEMBLE_NAME(amis2000)(this, stream, pc, oprom, opram, options);
diff --git a/src/devices/cpu/amis2000/amis2000.h b/src/devices/cpu/amis2000/amis2000.h
index 76190cb3090..f72e5a5322d 100644
--- a/src/devices/cpu/amis2000/amis2000.h
+++ b/src/devices/cpu/amis2000/amis2000.h
@@ -14,25 +14,25 @@
// generic input pins (4 bits each)
#define MCFG_AMI_S2000_READ_K_CB(_devcb) \
- amis2000_base_device::set_read_k_callback(*device, DEVCB_##_devcb);
+ devcb = &amis2000_base_device::set_read_k_callback(*device, DEVCB_##_devcb);
#define MCFG_AMI_S2000_READ_I_CB(_devcb) \
- amis2000_base_device::set_read_i_callback(*device, DEVCB_##_devcb);
+ devcb = &amis2000_base_device::set_read_i_callback(*device, DEVCB_##_devcb);
// 8-bit external databus coupled as input/output pins
#define MCFG_AMI_S2000_READ_D_CB(_devcb) \
- amis2000_base_device::set_read_d_callback(*device, DEVCB_##_devcb);
+ devcb = &amis2000_base_device::set_read_d_callback(*device, DEVCB_##_devcb);
#define MCFG_AMI_S2000_WRITE_D_CB(_devcb) \
- amis2000_base_device::set_write_d_callback(*device, DEVCB_##_devcb);
+ devcb = &amis2000_base_device::set_write_d_callback(*device, DEVCB_##_devcb);
// 13-bit external address bus coupled as output pins
#define MCFG_AMI_S2000_WRITE_A_CB(_devcb) \
- amis2000_base_device::set_write_a_callback(*device, DEVCB_##_devcb);
+ devcb = &amis2000_base_device::set_write_a_callback(*device, DEVCB_##_devcb);
// F_out pin (only for S2152)
#define MCFG_AMI_S2152_FOUT_CB(_devcb) \
- amis2000_base_device::set_write_f_callback(*device, DEVCB_##_devcb);
+ devcb = &amis2000_base_device::set_write_f_callback(*device, DEVCB_##_devcb);
// S2000 has a hardcoded 7seg table, that (unlike S2200) is officially
// uncustomizable, but wildfire proves to be an exception to that rule.
@@ -44,7 +44,7 @@ class amis2000_base_device : public cpu_device
{
public:
// construction/destruction
- amis2000_base_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint8_t bu_bits, uint8_t callstack_bits, uint8_t callstack_depth, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
+ amis2000_base_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, u8 bu_bits, u8 callstack_bits, u8 callstack_depth, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
: cpu_device(mconfig, type, name, tag, owner, clock, shortname, source)
, m_program_config("program", ENDIANNESS_BIG, 8, prgwidth, 0, program)
, m_data_config("data", ENDIANNESS_BIG, 8, datawidth, 0, data)
@@ -67,7 +67,7 @@ public:
template<class _Object> static devcb_base &set_write_d_callback(device_t &device, _Object object) { return downcast<amis2000_base_device &>(device).m_write_d.set_callback(object); }
template<class _Object> static devcb_base &set_write_a_callback(device_t &device, _Object object) { return downcast<amis2000_base_device &>(device).m_write_a.set_callback(object); }
template<class _Object> static devcb_base &set_write_f_callback(device_t &device, _Object object) { return downcast<amis2000_base_device &>(device).m_write_f.set_callback(object); }
- static void set_7seg_table(device_t &device, const uint8_t *ptr) { downcast<amis2000_base_device &>(device).m_7seg_table = ptr; }
+ static void set_7seg_table(device_t &device, const u8 *ptr) { downcast<amis2000_base_device &>(device).m_7seg_table = ptr; }
protected:
// device-level overrides
@@ -75,20 +75,20 @@ protected:
virtual void device_reset() override;
// device_execute_interface overrides
- virtual uint64_t execute_clocks_to_cycles(uint64_t clocks) const override { return (clocks + 4 - 1) / 4; } // 4 cycles per machine cycle
- virtual uint64_t execute_cycles_to_clocks(uint64_t cycles) const override { return (cycles * 4); } // "
- virtual uint32_t execute_min_cycles() const override { return 1; }
- virtual uint32_t execute_max_cycles() const override { return 2; }
- virtual uint32_t execute_input_lines() const override { return 1; }
+ virtual u64 execute_clocks_to_cycles(u64 clocks) const override { return (clocks + 4 - 1) / 4; } // 4 cycles per machine cycle
+ virtual u64 execute_cycles_to_clocks(u64 cycles) const override { return (cycles * 4); } // "
+ virtual u32 execute_min_cycles() const override { return 1; }
+ virtual u32 execute_max_cycles() const override { return 2; }
+ virtual u32 execute_input_lines() const override { return 1; }
virtual void execute_run() override;
// device_memory_interface overrides
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return(spacenum == AS_PROGRAM) ? &m_program_config : ((spacenum == AS_DATA) ? &m_data_config : nullptr); }
// device_disasm_interface overrides
- virtual uint32_t disasm_min_opcode_bytes() const override { return 1; }
- virtual uint32_t disasm_max_opcode_bytes() const override { return 1; }
- virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override;
+ virtual u32 disasm_min_opcode_bytes() const override { return 1; }
+ virtual u32 disasm_max_opcode_bytes() const override { return 1; }
+ virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options) override;
// device_state_interface overrides
virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
@@ -98,33 +98,33 @@ protected:
address_space *m_program;
address_space *m_data;
- uint8_t m_bu_bits;
- uint16_t m_bu_mask;
- uint8_t m_callstack_bits; // number of program counter bits held in callstack
- uint16_t m_callstack_mask;
- uint8_t m_callstack_depth; // callstack levels: 3 on 2000/2150, 5 on 2200/2400
- uint16_t m_callstack[5]; // max 5
+ u8 m_bu_bits;
+ u16 m_bu_mask;
+ u8 m_callstack_bits; // number of program counter bits held in callstack
+ u16 m_callstack_mask;
+ u8 m_callstack_depth; // callstack levels: 3 on 2000/2150, 5 on 2200/2400
+ u16 m_callstack[5]; // max 5
int m_icount;
- uint16_t m_pc; // 13-bit program counter
- uint8_t m_ppr; // prepared page register (PP 1)
- uint8_t m_pbr; // prepared bank register (PP 2)
- bool m_skip; // skip next opcode, including PP prefixes
- uint8_t m_op;
- uint8_t m_prev_op; // previous opcode, needed for PP, LAI, LB*
- uint8_t m_f; // generic flags: 2 on 2000/2150, 6 on 2200/2400
- uint8_t m_carry; // carry flag
- uint8_t m_bl; // 4-bit ram index x
- uint8_t m_bu; // 2/3-bit ram index y
- uint8_t m_acc; // 4-bit accumulator
- uint8_t m_e; // 4-bit generic register
- uint8_t m_ki_mask; // 4-bit k/i-pins select latch
- uint8_t m_d; // 8-bit d-pins latch
- bool m_d_active; // d-pins available for direct i/o(floating), or outputting d-latch
- uint8_t m_d_polarity; // invert d-latch output
- uint16_t m_a; // 13-bit a-pins latch (master strobe latch)
+ u16 m_pc; // 13-bit program counter
+ u8 m_ppr; // prepared page register (PP 1)
+ u8 m_pbr; // prepared bank register (PP 2)
+ bool m_skip; // skip next opcode, including PP prefixes
+ u8 m_op;
+ u8 m_prev_op; // previous opcode, needed for PP, LAI, LB*
+ u8 m_f; // generic flags: 2 on 2000/2150, 6 on 2200/2400
+ u8 m_carry; // carry flag
+ u8 m_bl; // 4-bit ram index x
+ u8 m_bu; // 2/3-bit ram index y
+ u8 m_acc; // 4-bit accumulator
+ u8 m_e; // 4-bit generic register
+ u8 m_ki_mask; // 4-bit k/i-pins select latch
+ u8 m_d; // 8-bit d-pins latch
+ bool m_d_active; // d-pins available for direct i/o(floating), or outputting d-latch
+ u8 m_d_polarity; // invert d-latch output
+ u16 m_a; // 13-bit a-pins latch (master strobe latch)
// i/o handlers
- const uint8_t *m_7seg_table;
+ const u8 *m_7seg_table;
devcb_read8 m_read_k;
devcb_read8 m_read_i;
devcb_read8 m_read_d;
@@ -133,8 +133,8 @@ protected:
devcb_write_line m_write_f;
// misc internal helpers
- uint8_t ram_r();
- void ram_w(uint8_t data);
+ u8 ram_r();
+ void ram_w(u8 data);
void pop_callstack();
void push_callstack();
void d_latch_out(bool active);
@@ -203,21 +203,21 @@ protected:
class amis2000_cpu_device : public amis2000_base_device
{
public:
- amis2000_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ amis2000_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class amis2150_cpu_device : public amis2000_base_device
{
public:
- amis2150_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ amis2150_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class amis2152_cpu_device : public amis2000_base_device
{
public:
- amis2152_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ amis2152_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
protected:
// device-level overrides
@@ -225,7 +225,7 @@ protected:
virtual void device_reset() override;
// digital-to-frequency converter
- uint8_t m_d2f_latch;
+ u8 m_d2f_latch;
emu_timer *m_d2f_timer;
int m_fout_state;
diff --git a/src/devices/cpu/amis2000/amis2000d.cpp b/src/devices/cpu/amis2000/amis2000d.cpp
index 2dd3433718f..adf5e2ed338 100644
--- a/src/devices/cpu/amis2000/amis2000d.cpp
+++ b/src/devices/cpu/amis2000/amis2000d.cpp
@@ -32,7 +32,7 @@ static const char *const s_mnemonics[] =
};
// number of bits per opcode parameter, negative indicates complement
-static const int8_t s_bits[] =
+static const s8 s_bits[] =
{
0, 0, 4, 2, 2, 2, 2, 0, 0, 0,
-2, -2, -2, -2, 2, 2,
@@ -45,7 +45,7 @@ static const int8_t s_bits[] =
#define _OVER DASMFLAG_STEP_OVER
#define _OUT DASMFLAG_STEP_OUT
-static const uint32_t s_flags[] =
+static const u32 s_flags[] =
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,
@@ -56,7 +56,7 @@ static const uint32_t s_flags[] =
};
-static const uint8_t s2000_mnemonic[0x100] =
+static const u8 s2000_mnemonic[0x100] =
{
/* 0x00 */
mNOP, mHALT, mRT, mRTS, mPSH, mPSL, mAND, mSOS,
@@ -103,8 +103,8 @@ static const uint8_t s2000_mnemonic[0x100] =
CPU_DISASSEMBLE(amis2000)
{
int pos = 0;
- uint8_t op = oprom[pos++];
- uint8_t instr = s2000_mnemonic[op];
+ u8 op = oprom[pos++];
+ u8 instr = s2000_mnemonic[op];
util::stream_format(stream, "%-5s ", s_mnemonics[instr]);
@@ -117,7 +117,7 @@ CPU_DISASSEMBLE(amis2000)
if (mask != 0)
{
- uint8_t param = op;
+ u8 param = op;
if (complement)
param = ~param;
param &= mask;
diff --git a/src/devices/cpu/amis2000/amis2000op.cpp b/src/devices/cpu/amis2000/amis2000op.cpp
index 2962f5327cc..685be166c3e 100644
--- a/src/devices/cpu/amis2000/amis2000op.cpp
+++ b/src/devices/cpu/amis2000/amis2000op.cpp
@@ -8,15 +8,15 @@
// internal helpers
-inline uint8_t amis2000_base_device::ram_r()
+inline u8 amis2000_base_device::ram_r()
{
- uint16_t address = m_bu << 4 | m_bl;
+ u16 address = m_bu << 4 | m_bl;
return m_data->read_byte(address) & 0xf;
}
-inline void amis2000_base_device::ram_w(uint8_t data)
+inline void amis2000_base_device::ram_w(u8 data)
{
- uint16_t address = m_bu << 4 | m_bl;
+ u16 address = m_bu << 4 | m_bl;
m_data->write_byte(address, data & 0xf);
}
@@ -49,7 +49,7 @@ void amis2000_base_device::op_lai()
// note: only execute the first one in a sequence of LAI
if ((m_prev_op & 0xf0) != (m_op & 0xf0))
{
- uint8_t param = m_op & 0x0f;
+ u8 param = m_op & 0x0f;
m_acc = param;
m_ki_mask = param;
}
@@ -70,7 +70,7 @@ void amis2000_base_device::op_lae()
void amis2000_base_device::op_xab()
{
// XAB: exchange ACC with BL
- uint8_t old_acc = m_acc;
+ u8 old_acc = m_acc;
m_acc = m_bl;
m_bl = old_acc;
}
@@ -78,7 +78,7 @@ void amis2000_base_device::op_xab()
void amis2000_base_device::op_xabu()
{
// XABU: exchange ACC with BU
- uint8_t old_acc = m_acc;
+ u8 old_acc = m_acc;
m_acc = (m_acc & ~m_bu_mask) | (m_bu & m_bu_mask);
m_bu = old_acc & m_bu_mask;
}
@@ -86,7 +86,7 @@ void amis2000_base_device::op_xabu()
void amis2000_base_device::op_xae()
{
// XAE: exchange ACC with E
- uint8_t old_acc = m_acc;
+ u8 old_acc = m_acc;
m_acc = m_e;
m_e = old_acc;
}
@@ -97,7 +97,7 @@ void amis2000_base_device::op_lbe()
// note: only execute the first one in a sequence of LB*
if ((m_prev_op & 0xf0) != (m_op & 0xf0))
{
- uint8_t param = m_op & 0x03;
+ u8 param = m_op & 0x03;
m_bu = param & m_bu_mask;
m_bl = m_e;
}
@@ -109,7 +109,7 @@ void amis2000_base_device::op_lbep()
// note: only execute the first one in a sequence of LB*
if ((m_prev_op & 0xf0) != (m_op & 0xf0))
{
- uint8_t param = m_op & 0x03;
+ u8 param = m_op & 0x03;
m_bu = param & m_bu_mask;
m_bl = (m_e + 1) & 0xf;
}
@@ -121,7 +121,7 @@ void amis2000_base_device::op_lbz()
// note: only execute the first one in a sequence of LB*
if ((m_prev_op & 0xf0) != (m_op & 0xf0))
{
- uint8_t param = m_op & 0x03;
+ u8 param = m_op & 0x03;
m_bu = param & m_bu_mask;
m_bl = 0;
}
@@ -133,7 +133,7 @@ void amis2000_base_device::op_lbf()
// note: only execute the first one in a sequence of LB*
if ((m_prev_op & 0xf0) != (m_op & 0xf0))
{
- uint8_t param = m_op & 0x03;
+ u8 param = m_op & 0x03;
m_bu = param & m_bu_mask;
m_bl = 0xf;
}
@@ -146,17 +146,17 @@ void amis2000_base_device::op_lam()
{
// LAM _Y: load ACC with RAM, xor BU with _Y
m_acc = ram_r();
- uint8_t param = ~m_op & 0x03;
+ u8 param = ~m_op & 0x03;
m_bu ^= (param & m_bu_mask);
}
void amis2000_base_device::op_xc()
{
// XC _Y: exchange ACC with RAM, xor BU with _Y
- uint8_t old_acc = m_acc;
+ u8 old_acc = m_acc;
m_acc = ram_r();
ram_w(old_acc);
- uint8_t param = ~m_op & 0x03;
+ u8 param = ~m_op & 0x03;
m_bu ^= (param & m_bu_mask);
}
@@ -179,14 +179,14 @@ void amis2000_base_device::op_xcd()
void amis2000_base_device::op_stm()
{
// STM Z: set RAM bit Z
- uint8_t param = 1 << (m_op & 0x03);
+ u8 param = 1 << (m_op & 0x03);
ram_w(ram_r() | param);
}
void amis2000_base_device::op_rsm()
{
// RSM Z: reset RAM bit Z
- uint8_t param = 1 << (m_op & 0x03);
+ u8 param = 1 << (m_op & 0x03);
ram_w(ram_r() & ~param);
}
@@ -196,7 +196,7 @@ void amis2000_base_device::op_rsm()
void amis2000_base_device::op_inp()
{
// INP: input D-pins to ACC and RAM
- uint8_t in = m_d_active ? m_d : m_read_d(0, 0xff);
+ u8 in = m_d_active ? m_d : m_read_d(0, 0xff);
m_acc = in & 0xf;
ram_w(in >> 4 & 0xf);
}
@@ -217,12 +217,12 @@ void amis2000_base_device::op_disb()
void amis2000_base_device::op_disn()
{
// DISN: set D-latch to ACC+carry via on-die segment decoder
- static const uint8_t lut_segment_decoder[0x10] =
+ static const u8 lut_segment_decoder[0x10] =
{
// 0-F digits in bit order [DP]abcdefg
0x7e, 0x30, 0x6d, 0x79, 0x33, 0x5b, 0x5f, 0x70, 0x7f, 0x7b, 0x77, 0x1f, 0x4e, 0x3d, 0x4f, 0x47
};
- const uint8_t *ptr = (m_7seg_table != nullptr) ? m_7seg_table : lut_segment_decoder;
+ const u8 *ptr = (m_7seg_table != nullptr) ? m_7seg_table : lut_segment_decoder;
m_d = ptr[m_acc] | (m_carry ? 0x80 : 0x00);
d_latch_out(true);
}
@@ -301,7 +301,7 @@ void amis2000_base_device::op_eur()
void amis2000_base_device::op_pp()
{
// PP _X: prepare page/bank with _X
- uint8_t param = ~m_op & 0x0f;
+ u8 param = ~m_op & 0x0f;
if ((m_prev_op & 0xf0) != (m_op & 0xf0))
m_ppr = param;
else
@@ -311,8 +311,8 @@ void amis2000_base_device::op_pp()
void amis2000_base_device::op_jmp()
{
// JMP X: jump to X(+PP)
- uint16_t mask = 0x3f;
- uint16_t param = m_op & mask;
+ u16 mask = 0x3f;
+ u16 param = m_op & mask;
// if previous opcode was PP, change PC high bits too
if ((m_prev_op & 0xf0) == 0x60)
@@ -371,7 +371,7 @@ void amis2000_base_device::op_szc()
void amis2000_base_device::op_szm()
{
// SZM Z: skip next on zero RAM bit Z
- uint8_t param = 1 << (m_op & 0x03);
+ u8 param = 1 << (m_op & 0x03);
m_skip = !(ram_r() & param);
}
@@ -432,7 +432,7 @@ void amis2000_base_device::op_adcs()
void amis2000_base_device::op_adis()
{
// ADIS X: add X to ACC, skip next on not carry
- uint8_t param = m_op & 0x0f;
+ u8 param = m_op & 0x0f;
m_acc += param;
m_skip = !(m_acc & 0x10);
m_acc &= 0xf;
diff --git a/src/devices/cpu/clipper/clipper.cpp b/src/devices/cpu/clipper/clipper.cpp
new file mode 100644
index 00000000000..3c4741d39dd
--- /dev/null
+++ b/src/devices/cpu/clipper/clipper.cpp
@@ -0,0 +1,1401 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+
+/*
+ * An implementation of the Fairchild/Intergraph CLIPPER CPU family.
+ *
+ * Primary source: http://bitsavers.trailing-edge.com/pdf/fairchild/clipper/Clipper_Instruction_Set_Oct85.pdf
+ *
+ * TODO:
+ * - save/restore state
+ * - unimplemented instructions
+ * - C100, C300, C400 variants
+ * - correct boot logic
+ * - condition codes for multiply instructions
+ * - most cpu traps/faults
+ * - instruction timing
+ * - big endian support (not present in the wild)
+ */
+
+#include "emu.h"
+#include "debugger.h"
+#include "clipper.h"
+
+#define VERBOSE 0
+#if VERBOSE
+#define LOG_INTERRUPT(...) logerror(__VA_ARGS__)
+#else
+#define LOG_INTERRUPT(...)
+#endif
+
+const device_type CLIPPER_C100 = &device_creator<clipper_c100_device>;
+const device_type CLIPPER_C300 = &device_creator<clipper_c300_device>;
+const device_type CLIPPER_C400 = &device_creator<clipper_c400_device>;
+
+clipper_c100_device::clipper_c100_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : clipper_device(mconfig, CLIPPER_C100, "C100 CLIPPER", tag, owner, clock, "C100", __FILE__) { }
+
+clipper_c300_device::clipper_c300_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : clipper_device(mconfig, CLIPPER_C300, "C300 CLIPPER", tag, owner, clock, "C300", __FILE__) { }
+
+clipper_c400_device::clipper_c400_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : clipper_device(mconfig, CLIPPER_C400, "C400 CLIPPER", tag, owner, clock, "C400", __FILE__) { }
+
+clipper_device::clipper_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, const char *shortname, const char *source)
+ : cpu_device(mconfig, type, name, tag, owner, clock, shortname, source),
+ m_pc(0),
+ m_r(m_rs),
+ m_insn_config("insn", ENDIANNESS_LITTLE, 32, 32, 0),
+ m_data_config("data", ENDIANNESS_LITTLE, 32, 32, 0),
+ m_insn(nullptr),
+ m_data(nullptr),
+ m_icount(0)
+{
+}
+
+// rotate helpers to replace MSVC intrinsics
+inline u32 rotl32(u32 x, u8 shift)
+{
+ shift &= 31;
+ return (x << shift) | (x >> ((32 - shift) & 31));
+}
+
+inline u32 rotr32(u32 x, u8 shift)
+{
+ shift &= 31;
+ return (x >> shift) | (x << ((32 - shift) & 31));
+}
+
+inline u64 rotl64(u64 x, u8 shift)
+{
+ shift &= 63;
+ return (x << shift) | (x >> ((64 - shift) & 63));
+}
+
+inline u64 rotr64(u64 x, u8 shift)
+{
+ shift &= 63;
+ return (x >> shift) | (x << ((64 - shift) & 63));
+}
+
+void clipper_device::device_start()
+{
+ // get our address spaces
+ m_insn = &space(AS_PROGRAM);
+ m_data = &space(AS_DATA);
+
+ // set our instruction counter
+ m_icountptr = &m_icount;
+
+ //save_item(NAME(m_pc));
+
+ state_add(STATE_GENPC, "GENPC", m_pc).noshow();
+ state_add(STATE_GENPCBASE, "CURPC", m_pc).noshow();
+ state_add(STATE_GENSP, "GENSP", m_r[15]).noshow();
+ state_add(STATE_GENFLAGS, "GENFLAGS", m_psw).mask(0xf).formatstr("%4s").noshow();
+
+ state_add(CLIPPER_PC, "pc", m_pc);
+ state_add(CLIPPER_PSW, "psw", m_psw);
+ state_add(CLIPPER_SSW, "ssw", m_ssw);
+
+ state_add(CLIPPER_R0, "r0", m_r[0]);
+ state_add(CLIPPER_R1, "r1", m_r[1]);
+ state_add(CLIPPER_R2, "r2", m_r[2]);
+ state_add(CLIPPER_R3, "r3", m_r[3]);
+ state_add(CLIPPER_R4, "r4", m_r[4]);
+ state_add(CLIPPER_R5, "r5", m_r[5]);
+ state_add(CLIPPER_R6, "r6", m_r[6]);
+ state_add(CLIPPER_R7, "r7", m_r[7]);
+ state_add(CLIPPER_R8, "r8", m_r[8]);
+ state_add(CLIPPER_R9, "r9", m_r[9]);
+ state_add(CLIPPER_R10, "r10", m_r[10]);
+ state_add(CLIPPER_R11, "r11", m_r[11]);
+ state_add(CLIPPER_R12, "r12", m_r[12]);
+ state_add(CLIPPER_R13, "r13", m_r[13]);
+ state_add(CLIPPER_R14, "r14", m_r[14]);
+ state_add(CLIPPER_R15, "r15", m_r[15]);
+
+ state_add(CLIPPER_F0, "f0", m_f[0]);
+ state_add(CLIPPER_F1, "f1", m_f[1]);
+ state_add(CLIPPER_F2, "f2", m_f[2]);
+ state_add(CLIPPER_F3, "f3", m_f[3]);
+ state_add(CLIPPER_F4, "f4", m_f[4]);
+ state_add(CLIPPER_F5, "f5", m_f[5]);
+ state_add(CLIPPER_F6, "f6", m_f[6]);
+ state_add(CLIPPER_F7, "f7", m_f[7]);
+
+ // C400 has 8 additional floating point registers
+ if (type() == CLIPPER_C400)
+ {
+ state_add(CLIPPER_F8, "f8", m_f[8]);
+ state_add(CLIPPER_F9, "f9", m_f[9]);
+ state_add(CLIPPER_F10, "f10", m_f[10]);
+ state_add(CLIPPER_F11, "f11", m_f[11]);
+ state_add(CLIPPER_F12, "f12", m_f[12]);
+ state_add(CLIPPER_F13, "f13", m_f[13]);
+ state_add(CLIPPER_F14, "f14", m_f[14]);
+ state_add(CLIPPER_F15, "f15", m_f[15]);
+ }
+}
+
+void clipper_device::device_reset()
+{
+ /*
+ * From C300 documentation, on reset:
+ * psw: T cleared, BIG set from hardware, others undefined
+ * ssw: EI, TP, M, U, K, KU, UU, P cleared, ID set from hardware, others undefined
+ */
+ m_psw = 0;
+ m_ssw = 0;
+
+ m_r = SSW(U) ? m_ru : m_rs;
+
+ // we'll opt to clear the integer and floating point registers too
+ memset(m_r, 0, sizeof(s32)*16);
+ memset(m_f, 0, sizeof(m_f));
+
+ // FIXME: figure out how to branch to the boot code properly
+ m_pc = 0x7f100000;
+ m_irq = 0;
+ m_nmi = 0;
+}
+
+void clipper_device::state_string_export(const device_state_entry &entry, std::string &str) const
+{
+ switch (entry.index())
+ {
+ case STATE_GENFLAGS:
+ str = string_format("%c%c%c%c",
+ PSW(C) ? 'C' : '.',
+ PSW(V) ? 'V' : '.',
+ PSW(Z) ? 'Z' : '.',
+ PSW(N) ? 'N' : '.');
+ break;
+ }
+}
+
+void clipper_device::execute_run()
+{
+ u16 insn;
+
+ // check for non-maskable and prioritised interrupts
+ if (m_nmi)
+ {
+ // acknowledge non-maskable interrupt
+ standard_irq_callback(INPUT_LINE_NMI);
+
+ LOG_INTERRUPT("non-maskable interrupt - current pc = 0x%08x\n", m_pc);
+ m_pc = intrap(EXCEPTION_INTERRUPT_BASE, m_pc);
+ }
+ else if (SSW(EI) && m_irq)
+ {
+ // FIXME: sample interrupt vector from the bus without acknowledging the interrupt
+ u8 ivec = standard_irq_callback(-1);
+ LOG_INTERRUPT("received prioritised interrupt with vector 0x%04x\n", ivec);
+
+ // allow equal/higher priority interrupts
+ if ((ivec >> 4) <= SSW(IL))
+ {
+ // acknowledge interrupt
+ standard_irq_callback(INPUT_LINE_IRQ0);
+
+ LOG_INTERRUPT("accepting interrupt vector 0x%04x - current pc = %08x\n", ivec, m_pc);
+ m_pc = intrap(EXCEPTION_INTERRUPT_BASE + ivec * 8, m_pc);
+ }
+ }
+
+ while (m_icount > 0) {
+
+ debugger_instruction_hook(this, m_pc);
+
+ // fetch instruction word
+ insn = m_insn->read_word(m_pc + 0);
+
+ decode_instruction(insn);
+
+ // decode and execute instruction, return next pc
+ m_pc = execute_instruction();
+
+ // FIXME: some instructions take longer (significantly) than one cycle
+ // and also the timings are often slower for the C100 and C300
+ m_icount--;
+ }
+}
+
+void clipper_device::execute_set_input(int inputnum, int state)
+{
+ switch (inputnum)
+ {
+ case INPUT_LINE_IRQ0:
+ m_irq = state;
+ break;
+
+ case INPUT_LINE_NMI:
+ m_nmi = state;
+ break;
+ }
+}
+
+/*
+ * The CLIPPER has a true Harvard architecture. In the InterPro, these are tied back together
+ * again by the MMU, which then directs the access to one of 3 address spaces: main, i/o or boot.
+ */
+const address_space_config *clipper_device::memory_space_config(address_spacenum spacenum) const
+{
+ switch (spacenum)
+ {
+ case AS_PROGRAM: return &m_insn_config;
+ case AS_DATA: return &m_data_config;
+ default: break;
+ }
+
+ return nullptr;
+}
+
+/*
+ * This function decodes instruction operands and computes effective addresses (for
+ * instructions with addressing modes). The results are contained in the m_info
+ * structure to simplify passing between here and execute_instruction().
+ */
+void clipper_device::decode_instruction (u16 insn)
+{
+ // decode the primary parcel
+ m_info.opcode = insn >> 8;
+ m_info.subopcode = insn & 0xff;
+ m_info.r1 = (insn & 0x00f0) >> 4;
+ m_info.r2 = insn & 0x000f;
+
+ // initialise the other fields
+ m_info.imm = 0;
+ m_info.macro = 0;
+ m_info.size = 0;
+ m_info.address = 0;
+
+ if ((insn & 0xf800) == 0x3800)
+ {
+ // instruction has a 16 bit immediate operand
+
+ // fetch 16 bit immediate and sign extend
+ m_info.imm = (s16)m_insn->read_word(m_pc + 2);
+ m_info.size = 4;
+ }
+ else if ((insn & 0xd300) == 0x8300)
+ {
+ // instruction has an immediate operand, either 16 or 32 bit
+ if (insn & 0x0080)
+ {
+ // fetch 16 bit immediate and sign extend
+ m_info.imm = (s16)m_insn->read_word(m_pc + 2);
+ m_info.size = 4;
+ }
+ else
+ {
+ // fetch 32 bit immediate and sign extend
+ m_info.imm = (s32)m_insn->read_dword_unaligned(m_pc + 2);
+ m_info.size = 6;
+ }
+ }
+ else if ((insn & 0xc000) == 0x4000)
+ {
+ // instructions with addresses
+ if (insn & 0x0100)
+ {
+ // instructions with complex modes
+ u16 temp;
+
+ switch (insn & 0x00f0)
+ {
+ case ADDR_MODE_PC32:
+ m_info.address = m_pc + (s32)m_insn->read_dword_unaligned(m_pc + 2);
+ m_info.size = 6;
+ break;
+
+ case ADDR_MODE_ABS32:
+ m_info.address = m_insn->read_dword_unaligned(m_pc + 2);
+ m_info.size = 6;
+ break;
+
+ case ADDR_MODE_REL32:
+ m_info.r2 = m_insn->read_word(m_pc + 2) & 0xf;
+ m_info.address = m_r[insn & 0xf] + (s32)m_insn->read_dword_unaligned(m_pc + 4);
+ m_info.size = 8;
+ break;
+
+ case ADDR_MODE_PC16:
+ m_info.address = m_pc + (s16)m_insn->read_word(m_pc + 2);
+ m_info.size = 4;
+ break;
+
+ case ADDR_MODE_REL12:
+ temp = m_insn->read_word(m_pc + 2);
+
+ m_info.r2 = temp & 0xf;
+ m_info.address = m_r[insn & 0xf] + ((s16)temp >> 4);
+ m_info.size = 4;
+ break;
+
+ case ADDR_MODE_ABS16:
+ m_info.address = (s16)m_insn->read_word(m_pc + 2);
+ m_info.size = 4;
+ break;
+
+ case ADDR_MODE_PCX:
+ temp = m_insn->read_word(m_pc + 2);
+
+ m_info.r2 = temp & 0xf;
+ m_info.address = m_pc + m_r[(temp >> 4) & 0xf];
+ m_info.size = 4;
+ break;
+
+ case ADDR_MODE_RELX:
+ temp = m_insn->read_word(m_pc + 2);
+
+ m_info.r2 = temp & 0xf;
+ m_info.address = m_r[insn & 0xf] + m_r[(temp >> 4) & 0xf];
+ m_info.size = 4;
+ break;
+
+ default:
+ logerror("illegal addressing mode pc = 0x%08x\n", m_pc);
+ machine().debug_break();
+ break;
+ }
+ }
+ else
+ {
+ // relative addressing mode
+ m_info.address = m_r[m_info.r1];
+ m_info.size = 2;
+ }
+ }
+ else if ((insn & 0xfd00) == 0xb400)
+ {
+ // macro instructions
+ m_info.macro = m_insn->read_word(m_pc + 2);
+ m_info.size = 4;
+ }
+ else
+ // all other instruction formats are 16 bits
+ m_info.size = 2;
+}
+
+int clipper_device::execute_instruction ()
+{
+ // the address of the next instruction
+ u32 next_pc;
+
+ // next instruction follows the current one by default, but
+ // may be changed for branch, call or trap instructions
+ next_pc = m_pc + m_info.size;
+
+ switch (m_info.opcode)
+ {
+ case 0x00: // noop
+ break;
+
+ case 0x10:
+ // movwp: move word to processor register
+ // treated as a noop if target ssw in user mode
+ // R1 == 3 means "fast" mode - avoids pipeline flush
+ if (R1 == 0)
+ m_psw = m_r[R2];
+ else if (!SSW(U) && (R1 == 1 || R1 == 3))
+ {
+ m_ssw = m_r[R2];
+ m_r = SSW(U) ? m_ru : m_rs;
+ }
+ // FLAGS: CVZN
+ break;
+ case 0x11:
+ // movpw: move processor register to word
+ switch (R1)
+ {
+ case 0: m_r[R2] = m_psw; break;
+ case 1: m_r[R2] = m_ssw; break;
+ }
+ break;
+ case 0x12:
+ // calls: call supervisor
+ next_pc = intrap(EXCEPTION_SUPERVISOR_CALL_BASE + (m_info.subopcode & 0x7f) * 8, next_pc);
+ break;
+ case 0x13:
+ // ret: return from subroutine
+ next_pc = m_data->read_dword(m_r[R2]);
+ m_r[R2] += 4;
+ // TRAPS: C,U,A,P,R
+ break;
+ case 0x14:
+ // pushw: push word
+ m_r[R1] -= 4;
+ m_data->write_dword(m_r[R1], m_r[R2]);
+ // TRAPS: A,P,W
+ break;
+
+ case 0x16:
+ // popw: pop word
+ m_r[R2] = m_data->read_dword(m_r[R1]);
+ m_r[R1] += 4;
+ // TRAPS: C,U,A,P,R
+ break;
+
+ case 0x20:
+ // adds: add single floating
+ *((float *)&m_f[R2]) += *((float *)&m_f[R1]);
+ // TRAPS: F_IVUX
+ break;
+ case 0x21:
+ // subs: subtract single floating
+ *((float *)&m_f[R2]) -= *((float *)&m_f[R1]);
+ // TRAPS: F_IVUX
+ break;
+ case 0x22:
+ // addd: add double floating
+ m_f[R2] += m_f[R1];
+ // TRAPS: F_IVUX
+ break;
+ case 0x23:
+ // subd: subtract double floating
+ m_f[R2] -= m_f[R1];
+ // TRAPS: F_IVUX
+ break;
+ case 0x24:
+ // movs: move single floating
+ *((float *)&m_f[R2]) = *((float *)&m_f[R1]);
+ break;
+ case 0x25:
+ // cmps: compare single floating
+ FLAGS(0, 0, *((float *)&m_f[R2]) == *((float *)&m_f[R1]), *((float *)&m_f[R2]) < *((float *)&m_f[R1]))
+ break;
+ case 0x26:
+ // movd: move double floating
+ m_f[R2] = m_f[R1];
+ break;
+ case 0x27:
+ // cmpd: compare double floating
+ FLAGS(0, 0, m_f[R2] == m_f[R1], m_f[R2] < m_f[R1])
+ // FLAGS: 00ZN
+ break;
+ case 0x28:
+ // muls: multiply single floating
+ *((float *)&m_f[R2]) *= *((float *)&m_f[R1]);
+ // TRAPS: F_IVUX
+ break;
+ case 0x29:
+ // divs: divide single floating
+ *((float *)&m_f[R2]) /= *((float *)&m_f[R1]);
+ // TRAPS: F_IVDUX
+ break;
+ case 0x2a:
+ // muld: multiply double floating
+ m_f[R2] *= m_f[R1];
+ // TRAPS: F_IVUX
+ break;
+ case 0x2b:
+ // divd: divide double floating
+ m_f[R2] /= m_f[R1];
+ // TRAPS: F_IVDUX
+ break;
+ case 0x2c:
+ // movsw: move single floating to word
+ m_r[R2] = *((s32 *)&m_f[R1]);
+ break;
+ case 0x2d:
+ // movws: move word to single floating
+ *((s32 *)&m_f[R2]) = m_r[R1];
+ break;
+ case 0x2e:
+ // movdl: move double floating to longword
+ ((double *)m_r)[R2 >> 1] = m_f[R1];
+ break;
+ case 0x2f:
+ // movld: move longword to double floating
+ m_f[R2] = ((double *)m_r)[R1 >> 1];
+ break;
+ case 0x30:
+ // shaw: shift arithmetic word
+ if (m_r[R1] > 0)
+ {
+ // save the bits that will be shifted out plus new sign bit
+ s32 v = m_r[R2] >> (31 - m_r[R1]);
+
+ m_r[R2] <<= m_r[R1];
+
+ // overflow is set if sign changes during shift
+ FLAGS(0, v != 0 && v != -1, m_r[R2] == 0, m_r[R2] < 0)
+ }
+ else
+ {
+ m_r[R2] >>= -m_r[R1];
+ FLAGS(0, 0, m_r[R2] == 0, m_r[R2] < 0)
+ }
+ // FLAGS: 0VZN
+ break;
+ case 0x31:
+ // shal: shift arithmetic longword
+ if (m_r[R1] > 0)
+ {
+ // save the bits that will be shifted out plus new sign bit
+ s64 v = ((s64 *)m_r)[R2 >> 1] >> (63 - m_r[R1]);
+
+ ((s64 *)m_r)[R2 >> 1] <<= m_r[R1];
+
+ // overflow is set if sign changes during shift
+ FLAGS(0, v != 0 && v != -1, ((s64 *)m_r)[R2 >> 1] == 0, ((s64 *)m_r)[R2 >> 1] < 0)
+ }
+ else
+ {
+ ((s64 *)m_r)[R2 >> 1] >>= -m_r[R1];
+ FLAGS(0, 0, ((s64 *)m_r)[R2 >> 1] == 0, ((s64 *)m_r)[R2 >> 1] < 0)
+ }
+ // FLAGS: 0VZN
+ break;
+ case 0x32:
+ // shlw: shift logical word
+ if (m_r[R1] > 0)
+ m_r[R2] <<= m_r[R1];
+ else
+ ((u32 *)m_r)[R2] >>= -m_r[R1];
+ // FLAGS: 00ZN
+ FLAGS(0, 0, m_r[R2] == 0, m_r[R2] < 0);
+ break;
+ case 0x33:
+ // shll: shift logical longword
+ if (m_r[R1] > 0)
+ ((u64 *)m_r)[R2 >> 1] <<= m_r[R1];
+ else
+ ((u64 *)m_r)[R2 >> 1] >>= -m_r[R1];
+ // FLAGS: 00ZN
+ FLAGS(0, 0, ((s64 *)m_r)[R2 >> 1] == 0, ((s64 *)m_r)[R2 >> 1] < 0);
+ break;
+ case 0x34:
+ // rotw: rotate word
+ if (m_r[R1] > 0)
+ m_r[R2] = rotl32(m_r[R2], m_r[R1]);
+ else
+ m_r[R2] = rotr32(m_r[R2], -m_r[R1]);
+ // FLAGS: 00ZN
+ FLAGS(0, 0, m_r[R2] == 0, m_r[R2] < 0);
+ break;
+ case 0x35:
+ // rotl: rotate longword
+ if (m_r[R1] > 0)
+ ((u64 *)m_r)[R2 >> 1] = rotl64(((u64 *)m_r)[R2 >> 1], m_r[R1]);
+ else
+ ((u64 *)m_r)[R2 >> 1] = rotr64(((u64 *)m_r)[R2 >> 1], -m_r[R1]);
+ // FLAGS: 00ZN
+ FLAGS(0, 0, ((s64 *)m_r)[R2 >> 1] == 0, ((s64 *)m_r)[R2 >> 1] < 0);
+ break;
+
+ case 0x38:
+ // shai: shift arithmetic immediate
+ if (m_info.imm > 0)
+ {
+ // save the bits that will be shifted out plus new sign bit
+ s32 v = m_r[R2] >> (31 - m_info.imm);
+
+ m_r[R2] <<= m_info.imm;
+
+ // overflow is set if sign changes during shift
+ FLAGS(0, v != 0 && v != -1, m_r[R2] == 0, m_r[R2] < 0)
+ }
+ else
+ {
+ m_r[R2] >>= -m_info.imm;
+ FLAGS(0, 0, m_r[R2] == 0, m_r[R2] < 0)
+ }
+ // FLAGS: 0VZN
+ // TRAPS: I
+ break;
+ case 0x39:
+ // shali: shift arithmetic longword immediate
+ if (m_info.imm > 0)
+ {
+ // save the bits that will be shifted out plus new sign bit
+ s64 v = ((s64 *)m_r)[R2 >> 1] >> (63 - m_info.imm);
+
+ ((s64 *)m_r)[R2 >> 1] <<= m_info.imm;
+
+ // overflow is set if sign changes during shift
+ FLAGS(0, v != 0 && v != -1, ((s64 *)m_r)[R2 >> 1] == 0, ((s64 *)m_r)[R2 >> 1] < 0)
+ }
+ else
+ {
+ ((s64 *)m_r)[R2 >> 1] >>= -m_info.imm;
+ FLAGS(0, 0, ((s64 *)m_r)[R2 >> 1] == 0, ((s64 *)m_r)[R2 >> 1] < 0)
+ }
+ // FLAGS: 0VZN
+ // TRAPS: I
+ break;
+ case 0x3a:
+ // shli: shift logical immediate
+ if (m_info.imm > 0)
+ m_r[R2] <<= m_info.imm;
+ else
+ ((u32 *)m_r)[R2] >>= -m_info.imm;
+ FLAGS(0, 0, m_r[R2] == 0, m_r[R2] < 0);
+ // FLAGS: 00ZN
+ // TRAPS: I
+ break;
+ case 0x3b:
+ // shlli: shift logical longword immediate
+ if (m_info.imm > 0)
+ ((u64 *)m_r)[R2 >> 1] <<= m_info.imm;
+ else
+ ((u64 *)m_r)[R2 >> 1] >>= -m_info.imm;
+ FLAGS(0, 0, ((s64 *)m_r)[R2 >> 1] == 0, ((s64 *)m_r)[R2 >> 1] < 0);
+ // FLAGS: 00ZN
+ // TRAPS: I
+ break;
+ case 0x3c:
+ // roti: rotate immediate
+ if (m_info.imm > 0)
+ m_r[R2] = rotl32(m_r[R2], m_info.imm);
+ else
+ m_r[R2] = rotr32(m_r[R2], -m_info.imm);
+ FLAGS(0, 0, m_r[R2] == 0, m_r[R2] < 0);
+ // FLAGS: 00ZN
+ // TRAPS: I
+ break;
+ case 0x3d:
+ // rotli: rotate longword immediate
+ if (m_info.imm > 0)
+ ((u64 *)m_r)[R2 >> 1] = rotl64(((u64 *)m_r)[R2 >> 1], m_info.imm);
+ else
+ ((u64 *)m_r)[R2 >> 1] = rotr64(((u64 *)m_r)[R2 >> 1], -m_info.imm);
+ FLAGS(0, 0, ((s64 *)m_r)[R2 >> 1] == 0, ((s64 *)m_r)[R2 >> 1] < 0);
+ // FLAGS: 00ZN
+ // TRAPS: I
+ break;
+
+ case 0x44:
+ case 0x45:
+ // call: call subroutine
+ m_r[R2] -= 4;
+ m_data->write_dword(m_r[R2], next_pc);
+ next_pc = m_info.address;
+ // TRAPS: A,P,W
+ break;
+#ifdef UNIMPLEMENTED_C400
+ case 0x46:
+ case 0x47:
+ // loadd2:
+ break;
+#endif
+ case 0x48:
+ case 0x49:
+ // b*: branch on condition
+ if (evaluate_branch())
+ next_pc = m_info.address;
+ // TRAPS: A,I
+ break;
+#ifdef UNIMPLEMENTED_C400
+ case 0x4a:
+ case 0x4b:
+ // cdb:
+ break;
+ case 0x4c:
+ case 0x4d:
+ // cdbeq:
+ break;
+ case 0x4e:
+ case 0x4f:
+ // cdbne:
+ break;
+ case 0x50:
+ case 0x51:
+ // db*:
+ break;
+#endif
+#ifdef UNIMPLEMENTED
+ case 0x4c:
+ case 0x4d:
+ // bf*:
+ break;
+#endif
+
+ case 0x60:
+ case 0x61:
+ // loadw: load word
+ m_r[R2] = m_data->read_dword(m_info.address);
+ // TRAPS: C,U,A,P,R,I
+ break;
+ case 0x62:
+ case 0x63:
+ // loada: load address
+ m_r[R2] = m_info.address;
+ // TRAPS: I
+ break;
+ case 0x64:
+ case 0x65:
+ // loads: load single floating
+ ((u64 *)&m_f)[R2] = m_data->read_dword(m_info.address);
+ // TRAPS: C,U,A,P,R,I
+ break;
+ case 0x66:
+ case 0x67:
+ // loadd: load double floating
+ ((u64 *)&m_f)[R2] = m_data->read_qword(m_info.address);
+ // TRAPS: C,U,A,P,R,I
+ break;
+ case 0x68:
+ case 0x69:
+ // loadb: load byte
+ m_r[R2] = (s8)m_data->read_byte(m_info.address);
+ // TRAPS: C,U,A,P,R,I
+ break;
+ case 0x6a:
+ case 0x6b:
+ // loadbu: load byte unsigned
+ m_r[R2] = m_data->read_byte(m_info.address);
+ // TRAPS: C,U,A,P,R,I
+ break;
+ case 0x6c:
+ case 0x6d:
+ // loadh: load halfword
+ m_r[R2] = (s16)m_data->read_word(m_info.address);
+ // TRAPS: C,U,A,P,R,I
+ break;
+ case 0x6e:
+ case 0x6f:
+ // loadhu: load halfword unsigned
+ m_r[R2] = m_data->read_word(m_info.address);
+ // TRAPS: C,U,A,P,R,I
+ break;
+ case 0x70:
+ case 0x71:
+ // storw: store word
+ m_data->write_dword(m_info.address, m_r[R2]);
+ // TRAPS: A,P,W,I
+ break;
+ case 0x72:
+ case 0x73:
+ // tsts: test and set
+ m_r[R2] = m_data->read_dword(m_info.address);
+ m_data->write_dword(m_info.address, m_r[R2] | 0x80000000);
+ // TRAPS: C,U,A,P,R,W,I
+ break;
+ case 0x74:
+ case 0x75:
+ // stors: store single floating
+ m_data->write_dword(m_info.address, *((u32 *)&m_f[R2]));
+ // TRAPS: A,P,W,I
+ break;
+ case 0x76:
+ case 0x77:
+ // stord: store double floating
+ m_data->write_qword(m_info.address, *((u64 *)&m_f[R2]));
+ // TRAPS: A,P,W,I
+ break;
+ case 0x78:
+ case 0x79:
+ // storb: store byte
+ m_data->write_byte(m_info.address, (u8)m_r[R2]);
+ // TRAPS: A,P,W,I
+ break;
+
+ case 0x7c:
+ case 0x7d:
+ // storh: store halfword
+ m_data->write_word(m_info.address, (u16)m_r[R2]);
+ // TRAPS: A,P,W,I
+ break;
+
+ case 0x80:
+ // addw: add word
+ FLAGS_CV(C_ADD(m_r[R2], m_r[R1]), V_ADD(m_r[R2], m_r[R1]))
+ m_r[R2] += m_r[R1];
+ FLAGS_ZN(m_r[R2] == 0, m_r[R2] < 0)
+ // FLAGS: CVZN
+ break;
+
+ case 0x82:
+ // addq: add quick
+ FLAGS_CV(C_ADD(m_r[R2], R1), V_ADD(m_r[R2], R1))
+ m_r[R2] += R1;
+ FLAGS_ZN(m_r[R2] == 0, m_r[R2] < 0)
+ // FLAGS: CVZN
+ break;
+ case 0x83:
+ // addi: add immediate
+ FLAGS_CV(C_ADD(m_r[R2], m_info.imm), V_ADD(m_r[R2], m_info.imm))
+ m_r[R2] += m_info.imm;
+ FLAGS_ZN(m_r[R2] == 0, m_r[R2] < 0)
+ // FLAGS: CVZN
+ // TRAPS: I
+ break;
+ case 0x84:
+ // movw: move word
+ m_r[R2] = m_r[R1];
+ FLAGS(0, 0, m_r[R2] == 0, m_r[R2] < 0)
+ // FLAGS: 00ZN
+ break;
+
+ case 0x86:
+ // loadq: load quick
+ m_r[R2] = R1;
+ FLAGS(0, 0, m_r[R2] == 0, 0)
+ // FLAGS: 00Z0
+ break;
+ case 0x87:
+ // loadi: load immediate
+ m_r[R2] = m_info.imm;
+ FLAGS(0, 0, m_r[R2] == 0, m_r[R2] < 0)
+ // FLAGS: 00ZN
+ // TRAPS: I
+ break;
+ case 0x88:
+ // andw: and word
+ m_r[R2] &= m_r[R1];
+ FLAGS(0, 0, m_r[R2] == 0, m_r[R2] < 0)
+ // FLAGS: 00ZN
+ break;
+
+ case 0x8b:
+ // andi: and immediate
+ m_r[R2] &= m_info.imm;
+ FLAGS(0, 0, m_r[R2] == 0, m_r[R2] < 0)
+ // FLAGS: 00ZN
+ // TRAPS: I
+ break;
+ case 0x8c:
+ // orw: or word
+ m_r[R2] |= m_r[R1];
+ FLAGS(0, 0, m_r[R2] == 0, m_r[R2] < 0)
+ // FLAGS: 00ZN
+ break;
+
+ case 0x8f:
+ // ori: or immediate
+ m_r[R2] |= m_info.imm;
+ FLAGS(0, 0, m_r[R2] == 0, m_r[R2] < 0)
+ // FLAGS: 00ZN
+ // TRAPS: I
+ break;
+ case 0x90:
+ // addwc: add word with carry
+ FLAGS_CV(C_ADD(m_r[R2], (m_r[R1] + (PSW(C) ? 1 : 0))), V_ADD(m_r[R2], (m_r[R1] + (PSW(C) ? 1 : 0))))
+ m_r[R2] += m_r[R1] + (PSW(C) ? 1 : 0);
+ FLAGS_ZN(m_r[R2] == 0, m_r[R2] < 0)
+ // FLAGS: CVZN
+ break;
+ case 0x91:
+ // subwc: subtract word with carry
+ FLAGS_CV(C_SUB(m_r[R2], (m_r[R1] + (PSW(C) ? 1 : 0))), V_SUB(m_r[R2], (m_r[R1] + (PSW(C) ? 1 : 0))))
+ m_r[R2] -= m_r[R1] + (PSW(C) ? 1 : 0);
+ FLAGS_ZN(m_r[R2] == 0, m_r[R2] < 0)
+ // FLAGS: CVZN
+ break;
+
+ case 0x93:
+ // negw: negate word
+ FLAGS_CV(m_r[R1] != 0, m_r[R1] == INT32_MIN)
+ m_r[R2] = -m_r[R1];
+ FLAGS_ZN(m_r[R2] == 0, m_r[R2] < 0)
+ // FLAGS: CVZN
+ break;
+
+ case 0x98:
+ // mulw: multiply word
+ m_r[R2] = m_r[R2] * m_r[R1];
+ // FLAGS: 0V00
+ break;
+ case 0x99:
+ // mulwx: multiply word extended
+ ((s64 *)m_r)[R2 >> 1] = (s64)m_r[R2] * (s64)m_r[R1];
+ // FLAGS: 0V00
+ break;
+ case 0x9a:
+ // mulwu: multiply word unsigned
+ m_r[R2] = (u32)m_r[R2] * (u32)m_r[R1];
+ // FLAGS: 0V00
+ break;
+ case 0x9b:
+ // mulwux: multiply word unsigned extended
+ ((u64 *)m_r)[R2 >> 1] = (u64)m_r[R2] * (u64)m_r[R1];
+ // FLAGS: 0V00
+ break;
+ case 0x9c:
+ // divw: divide word
+ if (m_r[R1] != 0)
+ {
+ FLAGS(0, m_r[R2] == INT32_MIN && m_r[R1] == -1, 0, 0)
+ m_r[R2] = m_r[R2] / m_r[R1];
+ }
+ else
+ next_pc = intrap(EXCEPTION_INTEGER_DIVIDE_BY_ZERO, next_pc, CTS_DIVIDE_BY_ZERO);
+ // FLAGS: 0V00
+ // TRAPS: D
+ break;
+ case 0x9d:
+ // modw: modulus word
+ if (m_r[R1] != 0)
+ {
+ FLAGS(0, m_r[R2] == INT32_MIN && m_r[R1] == -1, 0, 0)
+ m_r[R2] = m_r[R2] % m_r[R1];
+ }
+ else
+ next_pc = intrap(EXCEPTION_INTEGER_DIVIDE_BY_ZERO, next_pc, CTS_DIVIDE_BY_ZERO);
+ // FLAGS: 0V00
+ // TRAPS: D
+ break;
+ case 0x9e:
+ // divwu: divide word unsigned
+ if ((u32)m_r[R1] != 0)
+ m_r[R2] = (u32)m_r[R2] / (u32)m_r[R1];
+ else
+ next_pc = intrap(EXCEPTION_INTEGER_DIVIDE_BY_ZERO, next_pc, CTS_DIVIDE_BY_ZERO);
+ FLAGS(0, 0, 0, 0)
+ // FLAGS: 0000
+ // TRAPS: D
+ break;
+ case 0x9f:
+ // modwu: modulus word unsigned
+ if ((u32)m_r[R1] != 0)
+ m_r[R2] = (u32)m_r[R2] % (u32)m_r[R1];
+ else
+ next_pc = intrap(EXCEPTION_INTEGER_DIVIDE_BY_ZERO, next_pc, CTS_DIVIDE_BY_ZERO);
+ FLAGS(0, 0, 0, 0)
+ // FLAGS: 0000
+ // TRAPS: D
+ break;
+ case 0xa0:
+ // subw: subtract word
+ FLAGS_CV(C_SUB(m_r[R2], m_r[R1]), V_SUB(m_r[R2], m_r[R1]))
+ m_r[R2] -= m_r[R1];
+ FLAGS_ZN(m_r[R2] == 0, m_r[R2] < 0)
+ // FLAGS: CVZN
+ break;
+
+ case 0xa2:
+ // subq: subtract quick
+ FLAGS_CV(C_SUB(m_r[R2], R1), V_SUB(m_r[R2], R1))
+ m_r[R2] -= R1;
+ FLAGS_ZN(m_r[R2] == 0, m_r[R2] < 0)
+ // FLAGS: CVZN
+ break;
+ case 0xa3:
+ // subi: subtract immediate
+ FLAGS_CV(C_SUB(m_r[R2], m_info.imm), V_SUB(m_r[R2], m_info.imm))
+ m_r[R2] -= m_info.imm;
+ FLAGS_ZN(m_r[R2] == 0, m_r[R2] < 0)
+ // FLAGS: CVZN
+ // TRAPS: I
+ break;
+ case 0xa4:
+ // cmpw: compare word
+ FLAGS(C_SUB(m_r[R2], m_r[R1]), V_SUB(m_r[R2], m_r[R1]), m_r[R2] == m_r[R1], m_r[R2] < m_r[R1])
+ // FLAGS: CVZN
+ break;
+
+ case 0xa6:
+ // cmpq: compare quick
+ FLAGS(C_SUB(m_r[R2], R1), V_SUB(m_r[R2], R1), m_r[R2] == (s32)R1, m_r[R2] < (s32)R1)
+ // FLAGS: CVZN
+ break;
+ case 0xa7:
+ // cmpi: compare immediate
+ FLAGS(C_SUB(m_r[R2], m_info.imm), V_SUB(m_r[R2], m_info.imm), m_r[R2] == m_info.imm, m_r[R2] < m_info.imm)
+ // FLAGS: CVZN
+ // TRAPS: I
+ break;
+ case 0xa8:
+ // xorw: exclusive or word
+ m_r[R2] ^= m_r[R1];
+ FLAGS(0, 0, m_r[R2] == 0, m_r[R2] < 0)
+ // FLAGS: 00ZN
+ break;
+
+ case 0xab:
+ // xori: exclusive or immediate
+ m_r[R2] ^= m_info.imm;
+ FLAGS(0, 0, m_r[R2] == 0, m_r[R2] < 0)
+ // FLAGS: 00ZN
+ // TRAPS: I
+ break;
+ case 0xac:
+ // notw: not word
+ m_r[R2] = ~m_r[R1];
+ FLAGS(0, 0, m_r[R2] == 0, m_r[R2] < 0)
+ // FLAGS: 00ZN
+ break;
+
+ case 0xae:
+ // notq: not quick
+ m_r[R2] = ~R1;
+ FLAGS(0, 0, 0, 1)
+ // FLAGS: 0001
+ break;
+
+#ifdef UNIMPLEMENTED_C400
+ case 0xb0:
+ // abss: absolute value single floating?
+ break;
+
+ case 0xb2:
+ // absd: absolute value double floating?
+ break;
+#endif
+
+ case 0xb4:
+ // unprivileged macro instructions
+ switch (m_info.subopcode)
+ {
+ case 0x00: case 0x01: case 0x02: case 0x03:
+ case 0x04: case 0x05: case 0x06: case 0x07:
+ case 0x08: case 0x09: case 0x0a: case 0x0b:
+ case 0x0c:
+ // savew0..savew12: push registers rN:r14
+
+ // store ri at sp - 4 * (15 - i)
+ for (int i = R2; i < 15; i++)
+ m_data->write_dword(m_r[15] - 4 * (15 - i), m_r[i]);
+
+ // decrement sp after push to allow restart on exceptions
+ m_r[15] -= 4 * (15 - R2);
+ // TRAPS: A,P,W
+ break;
+ // NOTE: the movc, initc and cmpc macro instructions are implemented in a very basic way because
+ // at some point they will need to be improved to deal with possible exceptions (e.g. page faults)
+ // that may occur during execution. The implementation here is intended to allow the instructions
+ // to be "continued" after such exceptions.
+ case 0x0d:
+ // movc: copy r0 bytes from r1 to r2
+
+ while (m_r[0])
+ {
+ m_data->write_byte(m_r[2], m_data->read_byte(m_r[1]));
+
+ m_r[0]--;
+ m_r[1]++;
+ m_r[2]++;
+ }
+ // TRAPS: C,U,P,R,W
+ break;
+ case 0x0e:
+ // initc: initialise r0 bytes at r1 with value in r2
+ while (m_r[0])
+ {
+ m_data->write_byte(m_r[1], m_r[2] & 0xff);
+
+ m_r[0]--;
+ m_r[1]++;
+ m_r[2] = rotr32(m_r[2], 8);
+ }
+ // TRAPS: P,W
+ break;
+ case 0x0f:
+ // cmpc: compare r0 bytes at r1 with r2
+
+ // set condition codes assuming strings match
+ FLAGS(0, 0, 1, 0);
+
+ while (m_r[0])
+ {
+ // set condition codes and abort the loop if the current byte does not match
+ s32 byte1 = (s8)m_data->read_byte(m_r[1]);
+ s32 byte2 = (s8)m_data->read_byte(m_r[2]);
+ if (byte1 != byte2)
+ {
+ FLAGS(C_SUB(byte2, byte1), V_SUB(byte2, byte1), byte2 == byte1, byte2 < byte1)
+ break;
+ }
+
+ m_r[0]--;
+ m_r[1]++;
+ m_r[2]++;
+ }
+ // TRAPS: C,U,P,R
+ break;
+ case 0x10: case 0x11: case 0x12: case 0x13:
+ case 0x14: case 0x15: case 0x16: case 0x17:
+ case 0x18: case 0x19: case 0x1a: case 0x1b:
+ case 0x1c:
+ // restwN..restw12: pop registers rN:r14
+
+ // load ri from sp + 4 * (i - N)
+ for (int i = R2; i < 15; i++)
+ m_r[i] = m_data->read_dword(m_r[15] + 4 * (i - R2));
+
+ // increment sp after pop to allow restart on exceptions
+ m_r[15] += 4 * (15 - R2);
+ // TRAPS: C,U,A,P,R
+ break;
+
+ case 0x20: case 0x21: case 0x22: case 0x23:
+ case 0x24: case 0x25: case 0x26: case 0x27:
+ // saved0..saved7: push registers fN:f7
+
+ // store fi at sp - 8 * (8 - i)
+ for (int i = R2; i < 8; i++)
+ m_data->write_qword(m_r[15] - 8 * (8 - i), m_f[i]);
+
+ // decrement sp after push to allow restart on exceptions
+ m_r[15] -= 8 * (8 - R2);
+ // TRAPS: A,P,W
+ break;
+ case 0x28: case 0x29: case 0x2a: case 0x2b:
+ case 0x2c: case 0x2d: case 0x2e: case 0x2f:
+ // restd0..restd7: pop registers fN:f7
+
+ // load fi from sp + 8 * (i - N)
+ for (int i = R2; i < 8; i++)
+ m_f[i] = m_data->read_qword(m_r[15] + 8 * (i - R2));
+
+ // increment sp after pop to allow restart on exceptions
+ m_r[15] += 8 * (8 - R2);
+ // TRAPS: C,U,A,P,R
+ break;
+#ifdef UNIMPLEMENTED
+ case 0x30:
+ // cnvsw
+ case 0x31:
+ // cnvrsw
+ // TRAPS: F_IX
+ case 0x32:
+ // cnvtsw
+ // TRAPS: F_IX
+ case 0x33:
+ // cnvws
+ // TRAPS: F_X
+ case 0x34:
+ // cnvdw
+ // TRAPS: F_IX
+ case 0x35:
+ // cnvrdw
+ // TRAPS: F_IX
+ break;
+#endif
+ case 0x36: // cnvtdw
+ m_r[m_info.macro & 0xf] = (s32)m_f[(m_info.macro >> 4) & 0xf];
+ // TRAPS: F_IX
+ break;
+ case 0x37: // cnvwd
+ m_f[m_info.macro & 0xf] = (double)m_r[(m_info.macro >> 4) & 0xf];
+ break;
+#ifdef UNIMPLEMENTED
+ case 0x38:
+ // cnvsd
+ // TRAPS: F_I
+ case 0x39:
+ // cnvds
+ // TRAPS: F_IVUX
+ case 0x3a:
+ // negs
+ case 0x3b:
+ // negds
+ case 0x3c:
+ // scalbs
+ // TRAPS: F_IVUX
+ case 0x3d:
+ // scalbd
+ // FLAGS: N
+ // TRAPS: F_IVUX
+ case 0x3e:
+ // trapfn
+ // TRAPS: I
+ case 0x3f:
+ // loadfs
+ break;
+#endif
+ default:
+ logerror("illegal unprivileged macro opcode at 0x%08x\n", m_pc);
+ next_pc = intrap(EXCEPTION_ILLEGAL_OPERATION, next_pc, CTS_ILLEGAL_OPERATION);
+ machine().debug_break();
+ break;
+ }
+
+ break;
+
+ case 0xb6:
+ // privileged macro instructions
+ if (!SSW(U))
+ {
+ switch (m_info.subopcode)
+ {
+ case 0x00:
+ // movus: move user to supervisor
+ m_rs[m_info.macro & 0xf] = m_ru[(m_info.macro >> 4) & 0xf];
+ FLAGS(0, 0, m_rs[m_info.macro & 0xf] == 0, m_rs[m_info.macro & 0xf] < 0)
+ // FLAGS: 00ZN
+ // TRAPS: S
+ break;
+ case 0x01:
+ // movsu: move supervisor to user
+ m_ru[m_info.macro & 0xf] = m_rs[(m_info.macro >> 4) & 0xf];
+ FLAGS(0, 0, m_ru[m_info.macro & 0xf] == 0, m_ru[m_info.macro & 0xf] < 0)
+ // FLAGS: 00ZN
+ // TRAPS: S
+ break;
+ case 0x02:
+ // saveur: save user registers
+ for (int i = 0; i < 16; i++)
+ m_data->write_dword(m_rs[(m_info.macro >> 4) & 0xf] - 4 * (i + 1), m_ru[15 - i]);
+
+ m_rs[(m_info.macro >> 4) & 0xf] -= 64;
+ // TRAPS: A,P,W,S
+ break;
+ case 0x03:
+ // restur: restore user registers
+ for (int i = 0; i < 16; i++)
+ m_ru[i] = m_data->read_dword(m_rs[(m_info.macro >> 4) & 0xf] + 4 * i);
+
+ m_rs[(m_info.macro >> 4) & 0xf] += 64;
+ // TRAPS: C,U,A,P,R,S
+ break;
+ case 0x04:
+ // reti: restore psw, ssw and pc from supervisor stack
+ LOG_INTERRUPT("reti r%d, ssp = %08x, pc = %08x, next_pc = %08x\n",
+ (macro >> 4) & 0xf, m_rs[(m_info.macro >> 4) & 0xf], m_pc, m_program->read_dword(m_rs[(m_info.macro >> 4) & 0xf] + 8));
+
+ m_psw = m_data->read_dword(m_rs[(m_info.macro >> 4) & 0xf] + 0);
+ m_ssw = m_data->read_dword(m_rs[(m_info.macro >> 4) & 0xf] + 4);
+ next_pc = m_data->read_dword(m_rs[(m_info.macro >> 4) & 0xf] + 8);
+
+ m_rs[(m_info.macro >> 4) & 0xf] += 12;
+
+ m_r = SSW(U) ? m_ru : m_rs;
+ // TRAPS: S
+ break;
+ case 0x05:
+ // wait: wait for interrupt
+ next_pc = m_pc;
+ // TRAPS: S
+ break;
+#ifdef UNIMPLEMENTED_C400
+ case 0x07:
+ // loadts: unknown?
+ break;
+#endif
+
+ default:
+ // illegal operation
+ logerror("illegal privileged macro opcode at 0x%08x\n", m_pc);
+ next_pc = intrap(EXCEPTION_ILLEGAL_OPERATION, next_pc, CTS_ILLEGAL_OPERATION);
+ machine().debug_break();
+ break;
+ }
+ }
+ else
+ next_pc = intrap(EXCEPTION_PRIVILEGED_INSTRUCTION, next_pc, CTS_PRIVILEGED_INSTRUCTION);
+ break;
+
+#ifdef UNIMPLEMENTED_C400
+ case 0xbc:
+ // waitd:
+ break;
+
+ case 0xc0:
+ // s*:
+ break;
+#endif
+
+ default:
+ logerror("illegal opcode at 0x%08x\n", m_pc);
+ next_pc = intrap(EXCEPTION_ILLEGAL_OPERATION, next_pc, CTS_ILLEGAL_OPERATION);
+ break;
+ }
+
+ return next_pc;
+}
+
+/*
+* Common entry point for transferring control in the event of an interrupt or exception.
+*/
+u32 clipper_device::intrap(u32 vector, u32 pc, u32 cts, u32 mts)
+{
+ LOG_INTERRUPT("intrap - vector %x, pc = 0x%08x, next_pc = 0x%08x, ssp = 0x%08x\n", vector, pc, m_program->read_dword(vector + 4), m_rs[15]);
+
+ // set cts and mts to indicate source of exception
+ m_psw = (m_psw & ~(PSW_CTS | PSW_MTS)) | mts | cts;
+
+ // push pc, psw and ssw onto supervisor stack
+ m_data->write_dword(m_rs[15] - 4, pc);
+ m_data->write_dword(m_rs[15] - 12, m_psw);
+ m_data->write_dword(m_rs[15] - 8, m_ssw);
+
+ // decrement supervisor stack pointer
+
+ // NOTE: while not explicitly stated anywhere, it seems the InterPro boot code has been
+ // developed with the assumption that the SSP is decremented by 24 bytes during an exception,
+ // rather than the 12 bytes that might otherwise be expected. This means the exception handler
+ // code must explicitly increment the SSP by 12 prior to executing the RETI instruction,
+ // as otherwise the SSP will not be pointing at a valid return frame. It's possible this
+ // behaviour might vary with some other version of the CPU, but this is all we know for now.
+ m_rs[15] -= 24;
+
+ // load ssw from trap vector and set previous mode
+ m_ssw = (m_data->read_dword(vector + 0) & ~SSW_P) | (SSW(U) << 1);
+
+ // clear psw
+ m_psw = 0;
+
+ m_r = SSW(U) ? m_ru : m_rs;
+
+ // return new pc from trap vector
+ return m_data->read_dword(vector + 4);
+}
+
+bool clipper_device::evaluate_branch ()
+{
+ switch (m_info.r2)
+ {
+ case BRANCH_T:
+ return true;
+
+ case BRANCH_LT:
+ return (!PSW(V) && !PSW(Z) && !PSW(N))
+ || (PSW(V) && !PSW(Z) && PSW(N));
+
+ case BRANCH_LE:
+ return (!PSW(V) && !PSW(N))
+ || (PSW(V) && !PSW(Z) && PSW(N));
+
+ case BRANCH_EQ:
+ return PSW(Z) && !PSW(N);
+
+ case BRANCH_GT:
+ return (!PSW(V) && !PSW(Z) && PSW(N))
+ || (PSW(V) && !PSW(N));
+
+ case BRANCH_GE:
+ return (PSW(V) && !PSW(N))
+ || (!PSW(V) && !PSW(Z) && PSW(N))
+ || (PSW(Z) && !PSW(N));
+
+ case BRANCH_NE:
+ return (!PSW(Z))
+ || (PSW(Z) && PSW(N));
+
+ case BRANCH_LTU:
+ return (!PSW(C) && !PSW(Z));
+
+ case BRANCH_LEU:
+ return !PSW(C);
+
+ case BRANCH_GTU:
+ return PSW(C);
+
+ case BRANCH_GEU:
+ return PSW(C) || PSW(Z);
+
+ case BRANCH_V:
+ return PSW(V);
+ case BRANCH_NV:
+ return !PSW(V);
+
+ case BRANCH_N:
+ return !PSW(Z) && PSW(N);
+ case BRANCH_NN:
+ return !PSW(N);
+
+ case BRANCH_FN:
+ return PSW(Z) && PSW(N);
+ }
+
+ return false;
+}
+
+offs_t clipper_device::disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options)
+{
+ return CPU_DISASSEMBLE_NAME(clipper)(this, stream, pc, oprom, opram, options);
+}
diff --git a/src/devices/cpu/clipper/clipper.h b/src/devices/cpu/clipper/clipper.h
new file mode 100644
index 00000000000..ff872891bbd
--- /dev/null
+++ b/src/devices/cpu/clipper/clipper.h
@@ -0,0 +1,296 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+#pragma once
+
+#ifndef __CLIPPER_H__
+#define __CLIPPER_H__
+
+#include <limits.h>
+
+enum clipper_registers
+{
+ CLIPPER_R0, CLIPPER_R1, CLIPPER_R2, CLIPPER_R3, CLIPPER_R4, CLIPPER_R5, CLIPPER_R6, CLIPPER_R7,
+ CLIPPER_R8, CLIPPER_R9, CLIPPER_R10, CLIPPER_R11, CLIPPER_R12, CLIPPER_R13, CLIPPER_R14, CLIPPER_R15,
+
+ CLIPPER_F0, CLIPPER_F1, CLIPPER_F2, CLIPPER_F3, CLIPPER_F4, CLIPPER_F5, CLIPPER_F6, CLIPPER_F7,
+ CLIPPER_F8, CLIPPER_F9, CLIPPER_F10, CLIPPER_F11, CLIPPER_F12, CLIPPER_F13, CLIPPER_F14, CLIPPER_F15,
+
+ CLIPPER_PSW,
+ CLIPPER_SSW,
+ CLIPPER_PC,
+};
+
+enum clipper_addressing_modes
+{
+ ADDR_MODE_PC32 = 0x10,
+ ADDR_MODE_ABS32 = 0x30,
+ ADDR_MODE_REL32 = 0x60,
+ ADDR_MODE_PC16 = 0x90,
+ ADDR_MODE_REL12 = 0xa0,
+ ADDR_MODE_ABS16 = 0xb0,
+ ADDR_MODE_PCX = 0xd0,
+ ADDR_MODE_RELX = 0xe0,
+};
+
+// branch conditions
+enum clipper_branch_conditions
+{
+ BRANCH_T = 0x0,
+ BRANCH_LT = 0x1,
+ BRANCH_LE = 0x2,
+ BRANCH_EQ = 0x3,
+ BRANCH_GT = 0x4,
+ BRANCH_GE = 0x5,
+ BRANCH_NE = 0x6,
+ BRANCH_LTU = 0x7,
+ BRANCH_LEU = 0x8,
+ BRANCH_GTU = 0x9,
+ BRANCH_GEU = 0xa,
+ BRANCH_V = 0xb,
+ BRANCH_NV = 0xc,
+ BRANCH_N = 0xd,
+ BRANCH_NN = 0xe,
+ BRANCH_FN = 0xf,
+};
+
+enum clipper_psw
+{
+ PSW_N = 0x00000001, // negative
+ PSW_Z = 0x00000002, // zero
+ PSW_V = 0x00000004, // overflow
+ PSW_C = 0x00000008, // carry out or borrow in
+ PSW_FX = 0x00000010, // floating inexact
+ PSW_FU = 0x00000020, // floating underflow
+ PSW_FD = 0x00000040, // floating divide by zero
+ PSW_FV = 0x00000080, // floating overflow
+ PSW_FI = 0x00000100, // floating invalid operation
+ PSW_EFX = 0x00000200, // enable floating inexact trap
+ PSW_EFU = 0x00000400, // enable floating underflow trap
+ PSW_EFD = 0x00000800, // enable floating divide by zero trap
+ PSW_EFV = 0x00001000, // enable floating overflow trap
+ PSW_EFI = 0x00002000, // enable floating invalid operation trap
+ PSW_EFT = 0x00004000, // enable floating trap
+ PSW_FR = 0x00018000, // floating rounding mode (2 bits)
+ // unused (3 bits)
+ PSW_DSP = 0x00300000, // c400 - delay slot pointer (2 bits)
+ PSW_BIG = 0x00400000, // c400 - big endian (hardware)
+ PSW_T = 0x00800000, // trace trap
+ PSW_CTS = 0x0f000000, // cpu trap status (4 bits)
+ PSW_MTS = 0xf0000000, // memory trap status (4 bits)
+};
+
+enum clipper_ssw
+{
+ SSW_IN = 0x0000000f, // interrupt number (4 bits)
+ SSW_IL = 0x000000f0, // interrupt level (4 bits)
+ SSW_EI = 0x00000100, // enable interrupts
+ SSW_ID = 0x0001fe00, // cpu rev # and type (8 bits)
+ // unused (5 bits)
+ SSW_FRD = 0x00400000, // floating registers dirty
+ SSW_TP = 0x00800000, // trace trap pending
+ SSW_ECM = 0x01000000, // enabled corrected memory error
+ SSW_DF = 0x02000000, // fpu disabled
+ SSW_M = 0x04000000, // mapped mode
+ SSW_KU = 0x08000000, // user protect key
+ SSW_UU = 0x10000000, // user data mode
+ SSW_K = 0x20000000, // protect key
+ SSW_U = 0x40000000, // user mode
+ SSW_P = 0x80000000, // previous mode
+};
+
+enum clipper_exception_vectors
+{
+ // data memory trap group
+ EXCEPTION_D_CORRECTED_MEMORY_ERROR = 0x108,
+ EXCEPTION_D_UNCORRECTABLE_MEMORY_ERROR = 0x110,
+ EXCEPTION_D_ALIGNMENT_FAULT = 0x120,
+ EXCEPTION_D_PAGE_FAULT = 0x128,
+ EXCEPTION_D_READ_PROTECT_FAULT = 0x130,
+ EXCEPTION_D_WRITE_PROTECT_FAULT = 0x138,
+
+ // floating-point arithmetic trap group
+ EXCEPTION_FLOATING_INEXACT = 0x180,
+ EXCEPTION_FLOATING_UNDERFLOW = 0x188,
+ EXCEPTION_FLOATING_DIVIDE_BY_ZERO = 0x190,
+ EXCEPTION_FLOATING_OVERFLOW = 0x1a0,
+ EXCEPTION_FLOATING_INVALID_OPERATION = 0x1c0,
+
+ // integer arithmetic trap group
+ EXCEPTION_INTEGER_DIVIDE_BY_ZERO = 0x208,
+
+ // instruction memory trap group
+ EXCEPTION_I_CORRECTED_MEMORY_ERROR = 0x288,
+ EXCEPTION_I_UNCORRECTABLE_MEMORY_ERROR = 0x290,
+ EXCEPTION_I_ALIGNMENT_FAULT = 0x2a0,
+ EXCEPTION_I_PAGE_FAULT = 0x2a8,
+ EXCEPTION_I_EXECUTE_PROTECT_FAULT = 0x2b0,
+
+ // illegal operation trap group
+ EXCEPTION_ILLEGAL_OPERATION = 0x300,
+ EXCEPTION_PRIVILEGED_INSTRUCTION = 0x308,
+
+ // diagnostic trap group
+ EXCEPTION_TRACE = 0x380,
+
+ // supervisor calls (0x400-0x7f8)
+ EXCEPTION_SUPERVISOR_CALL_BASE = 0x400,
+
+ // prioritized interrupts (0x800-0xff8)
+ EXCEPTION_INTERRUPT_BASE = 0x800,
+};
+
+// trap source values are shifted into the correct field in the psw
+enum clipper_cpu_trap_sources
+{
+ CTS_NO_CPU_TRAP = 0 << 24,
+ CTS_DIVIDE_BY_ZERO = 2 << 24,
+ CTS_ILLEGAL_OPERATION = 4 << 24,
+ CTS_PRIVILEGED_INSTRUCTION = 5 << 24,
+ CTS_TRACE_TRAP = 7 << 24,
+};
+
+enum clipper_memory_trap_sources
+{
+ MTS_NO_MEMORY_TRAP = 0 << 28,
+ MTS_CORRECTED_MEMORY_ERROR = 1 << 28,
+ MTS_UNCORRECTABLE_MEMORY_ERROR = 2 << 28,
+ MTS_ALIGNMENT_FAULT = 4 << 28,
+ MTS_PAGE_FAULT = 5 << 28,
+ MTS_READ_OR_EXECUTE_PROTECT_FAULT = 6 << 28,
+ MTS_WRITE_PROTECT_FAULT = 7 << 28,
+};
+
+// convenience macros for frequently used instruction fields
+#define R1 (m_info.r1)
+#define R2 (m_info.r2)
+
+// convenience macros for dealing with the psw
+#define PSW(mask) (m_psw & PSW_##mask)
+#define SSW(mask) (m_ssw & SSW_##mask)
+
+// macros for setting psw condition codes
+#define FLAGS(C,V,Z,N) \
+ m_psw = (m_psw & ~(PSW_C | PSW_V | PSW_Z | PSW_N)) | (((C) << 3) | ((V) << 2) | ((Z) << 1) | ((N) << 0));
+#define FLAGS_CV(C,V) \
+ m_psw = (m_psw & ~(PSW_C | PSW_V)) | (((C) << 3) | ((V) << 2));
+#define FLAGS_ZN(Z,N) \
+ m_psw = (m_psw & ~(PSW_Z | PSW_N)) | (((Z) << 1) | ((N) << 0));
+
+// over/underflow for addition/subtraction from here: http://stackoverflow.com/questions/199333/how-to-detect-integer-overflow-in-c-c
+#define OF_ADD(a, b) ((b > 0) && (a > INT_MAX - b))
+#define UF_ADD(a, b) ((b < 0) && (a < INT_MIN - b))
+#define OF_SUB(a, b) ((b < 0) && (a > INT_MAX + b))
+#define UF_SUB(a, b) ((b > 0) && (a < INT_MIN + b))
+
+// CLIPPER logic for carry and overflow flags
+#define C_ADD(a, b) ((u32)a + (u32)b < (u32)a)
+#define V_ADD(a, b) (OF_ADD((s32)a, (s32)b) || UF_ADD((s32)a, (s32)b))
+#define C_SUB(a, b) ((u32)a < (u32)b)
+#define V_SUB(a, b) (OF_SUB((s32)a, (s32)b) || UF_SUB((s32)a, (s32)b))
+
+class clipper_device : public cpu_device
+{
+public:
+ clipper_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, const char *shortname, const char *source);
+
+ DECLARE_READ_LINE_MEMBER(ssw) { return m_ssw; }
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // device_execute_interface overrides
+ virtual u32 execute_min_cycles() const override { return 1; };
+ virtual u32 execute_max_cycles() const override { return 1; }; // FIXME: don't know, especially macro instructions
+ virtual u32 execute_input_lines() const override { return 2; }; // number of input/interrupt lines (irq/nmi)
+ virtual void execute_run() override;
+ virtual void execute_set_input(int inputnum, int state) override;
+
+ // device_memory_interface overrides
+ virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override;
+
+ // device_state_interface overrides
+#if 0
+ virtual void state_import(const device_state_entry &entry) override;
+ virtual void state_export(const device_state_entry &entry) override;
+#endif
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
+
+ // device_disasm_interface overrides
+ virtual uint32_t disasm_min_opcode_bytes() const override { return 2; } // smallest instruction
+ virtual uint32_t disasm_max_opcode_bytes() const override { return 8; } // largest instruction
+ virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options) override;
+
+ // core registers
+ u32 m_pc;
+ u32 m_psw;
+ u32 m_ssw;
+
+ // integer registers
+ s32 *m_r; // active registers
+ s32 m_ru[16]; // user registers
+ s32 m_rs[16]; // supervisor registers
+
+ // floating registers
+ double m_f[16];
+
+private:
+ address_space_config m_insn_config;
+ address_space_config m_data_config;
+
+ address_space *m_insn;
+ address_space *m_data;
+
+ int m_icount;
+
+ int m_irq;
+ int m_nmi;
+
+ // decoded instruction information
+ struct
+ {
+ u8 opcode, subopcode;
+ u8 r1, r2;
+
+ s32 imm;
+ u16 macro;
+
+ // total size of instruction in bytes
+ u32 size;
+
+ // computed effective address
+ u32 address;
+ } m_info;
+
+ void decode_instruction(u16 insn);
+ int execute_instruction();
+ bool evaluate_branch();
+
+ uint32_t intrap(u32 vector, u32 pc, u32 cts = CTS_NO_CPU_TRAP, u32 mts = MTS_NO_MEMORY_TRAP);
+};
+
+class clipper_c100_device : public clipper_device
+{
+public:
+ clipper_c100_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+};
+
+class clipper_c300_device : public clipper_device
+{
+public:
+ clipper_c300_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+};
+
+class clipper_c400_device : public clipper_device
+{
+public:
+ clipper_c400_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+};
+
+extern const device_type CLIPPER_C100;
+extern const device_type CLIPPER_C300;
+extern const device_type CLIPPER_C400;
+
+extern CPU_DISASSEMBLE(clipper);
+#endif /* __CLIPPER_H__ */
diff --git a/src/devices/cpu/clipper/clipperd.cpp b/src/devices/cpu/clipper/clipperd.cpp
new file mode 100644
index 00000000000..735804b2742
--- /dev/null
+++ b/src/devices/cpu/clipper/clipperd.cpp
@@ -0,0 +1,351 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+
+#include "emu.h"
+
+/*
+ * TODO
+ * - dynamically switch between C400 and C100/C300 instruction sets
+ * - handle failures of addressing mode decoding more elegantly
+ * - improve address decoding to use streams
+ * - detect various cases of illegal instruction encoding
+ */
+
+// enable C400 instruction decoding
+#define C400_INSTRUCTIONS 1
+
+// the CLIPPER addressing modes (unshifted)
+enum
+{
+ ADDR_MODE_PC32 = 0x10,
+ ADDR_MODE_ABS32 = 0x30,
+ ADDR_MODE_REL32 = 0x60,
+ ADDR_MODE_PC16 = 0x90,
+ ADDR_MODE_REL12 = 0xa0,
+ ADDR_MODE_ABS16 = 0xb0,
+ ADDR_MODE_PCX = 0xd0,
+ ADDR_MODE_RELX = 0xe0
+};
+
+// macros for decoding various operand fields
+#define R1 ((insn[0] & 0x00f0) >> 4)
+#define R2 (insn[0] & 0x000f)
+
+#define I16 ((int16_t)insn[1])
+#define I32 (*(int32_t *)&insn[1])
+#define IMM_VALUE (insn[0] & 0x0080 ? I16 : I32)
+#define IMM_SIZE (insn[0] & 0x0080 ? 2 : 4)
+
+#define ADDR_MODE (insn[0] & 0x00f0)
+#define ADDR_R2 ((insn[0] & 0x0050) == 0x0010 ? (insn[0] & 0x000f) : (insn[1] & 0x000f))
+#define ADDR_SIZE (ADDR_MODE > ADDR_MODE_REL32 ? 2 : ADDR_MODE == ADDR_MODE_REL32 ? 6 : 4)
+#define ADDR_RX ((insn[1] & 0xf0) >> 4)
+#define ADDR_I12 (((int16_t)insn[1]) >> 4)
+
+/*
+ * Branch condition code mnemonics - the forms beginning with 'c' are
+ * supposed to be used for branches following comparison instructions,
+ * while those beginning with 'r' are for use after move or logical
+ * instructions. We use the first form because we can't know which type
+ * should be used without some kind of dynamic information.
+ */
+static const char *const cc[] =
+{
+ "",
+ "clt", // rgt
+ "cle", // rge
+ "ceq", // req
+ "cgt", // rlt
+ "cge", // rle
+ "cne", // rne
+ "cltu", // rgtu
+ "cleu", // rgeu, nc
+ "cgtu", // rltu, c
+ "cgeu", // rleu
+ "v",
+ "nv",
+ "n",
+ "nn",
+ "fn"
+};
+
+/*
+ * Decode an addressing mode into a string.
+ */
+char *address (offs_t pc, u16 *insn)
+{
+ static char buffer[32];
+
+ switch (ADDR_MODE)
+ {
+ case ADDR_MODE_PC32: sprintf(buffer, "0x%x", pc + I32); break;
+ case ADDR_MODE_ABS32: sprintf(buffer, "0x%x", I32); break;
+ case ADDR_MODE_REL32: sprintf(buffer, "%d(r%d)", *(int32_t *)&insn[2], R2); break;
+ case ADDR_MODE_PC16: sprintf(buffer, "0x%x", pc + I16); break;
+ case ADDR_MODE_REL12: sprintf(buffer, "%d(r%d)", ADDR_I12, R2); break;
+ case ADDR_MODE_ABS16: sprintf(buffer, "0x%x", I16); break;
+ case ADDR_MODE_PCX: sprintf(buffer, "[r%d](pc)", ADDR_RX); break;
+ case ADDR_MODE_RELX: sprintf(buffer, "[r%d](r%d)", ADDR_RX, R2); break;
+ default: sprintf(buffer, "ERROR"); break;
+ }
+
+ return buffer;
+}
+
+/*
+ * CLIPPER instructions are composed of 1, 2, 3 or 4 16-bit "parcels". The first parcel contains
+ * the opcode and enough information to work out how many additional parcels might be required. The
+ * instruction set is fairly typically RISC-ish, except for these variable length instructions, the
+ * 8 addressing modes, and the "macro instructions", which are actually "subroutines" embedded in
+ * an on-CPU macro instruction ROM. It appears at least some of these macro instructions were removed
+ * from the C400 and generate traps which can be used to implement them in software instead.
+ */
+CPU_DISASSEMBLE(clipper)
+{
+ u16 *insn = (u16 *)oprom;
+ u32 flags = DASMFLAG_SUPPORTED;
+ offs_t bytes;
+
+ switch (insn[0] >> 8)
+ {
+ case 0x00:
+ if (oprom[0] == 0)
+ util::stream_format(stream, "noop");
+ else
+ util::stream_format(stream, "noop $%d", oprom[0]);
+ bytes = 2;
+ break;
+
+ case 0x10: util::stream_format(stream, "movwp r%d,%s", R2, R1 == 0 ? "psw" : R1 == 1 ? "ssw" : "sswf"); bytes = 2; break;
+ case 0x11: util::stream_format(stream, "movpw %s,r%d", R1 == 0 ? "psw" : "ssw", R2); bytes = 2; break;
+ case 0x12: util::stream_format(stream, "calls $%d", insn[0] & 0x7F); bytes = 2; flags |= DASMFLAG_STEP_OVER; break;
+ case 0x13: util::stream_format(stream, "ret r%d", R2); bytes = 2; flags |= DASMFLAG_STEP_OUT; break;
+ case 0x14: util::stream_format(stream, "pushw r%d,r%d", R2, R1); bytes = 2; break;
+
+ case 0x16: util::stream_format(stream, "popw r%d,r%d", R1, R2); bytes = 2; break;
+
+ case 0x20: util::stream_format(stream, "adds f%d,f%d", R1, R2); bytes = 2; break;
+ case 0x21: util::stream_format(stream, "subs f%d,f%d", R1, R2); bytes = 2; break;
+ case 0x22: util::stream_format(stream, "addd f%d,f%d", R1, R2); bytes = 2; break;
+ case 0x23: util::stream_format(stream, "subd f%d,f%d", R1, R2); bytes = 2; break;
+ case 0x24: util::stream_format(stream, "movs f%d,f%d", R1, R2); bytes = 2; break;
+ case 0x25: util::stream_format(stream, "cmps f%d,f%d", R1, R2); bytes = 2; break;
+ case 0x26: util::stream_format(stream, "movd f%d,f%d", R1, R2); bytes = 2; break;
+ case 0x27: util::stream_format(stream, "cmpd f%d,f%d", R1, R2); bytes = 2; break;
+ case 0x28: util::stream_format(stream, "muls f%d,f%d", R1, R2); bytes = 2; break;
+ case 0x29: util::stream_format(stream, "divs f%d,f%d", R1, R2); bytes = 2; break;
+ case 0x2a: util::stream_format(stream, "muld f%d,f%d", R1, R2); bytes = 2; break;
+ case 0x2b: util::stream_format(stream, "divd f%d,f%d", R1, R2); bytes = 2; break;
+ case 0x2c: util::stream_format(stream, "movsw f%d,r%d", R1, R2); bytes = 2; break;
+ case 0x2d: util::stream_format(stream, "movws r%d,f%d", R1, R2); bytes = 2; break;
+ case 0x2e: util::stream_format(stream, "movdl f%d,r%d:%d", R1, R2 + 0, R2 + 1); bytes = 2; break;
+ case 0x2f: util::stream_format(stream, "movld r%d:r%d,f%d", R1 + 0, R1 + 1, R2); bytes = 2; break;
+
+ case 0x30: util::stream_format(stream, "shaw r%d,r%d", R1, R2); bytes = 2; break;
+ case 0x31: util::stream_format(stream, "shal r%d,r%d:r%d", R1, R2 + 0, R2 + 1); bytes = 2; break;
+ case 0x32: util::stream_format(stream, "shlw r%d,r%d", R1, R2); bytes = 2; break;
+ case 0x33: util::stream_format(stream, "shll r%d,r%d:r%d", R1, R2 + 0, R2 + 1); bytes = 2; break;
+ case 0x34: util::stream_format(stream, "rotw r%d,r%d", R1, R2); bytes = 2; break;
+ case 0x35: util::stream_format(stream, "rotl r%d,r%d:r%d", R1, R2 + 0, R2 + 1); bytes = 2; break;
+
+ case 0x38: util::stream_format(stream, "shai $%d,r%d", I16, R2); bytes = 4; break;
+ case 0x39: util::stream_format(stream, "shali $%d,r%d:r%d", I16, R2 + 0, R2 + 1); bytes = 4; break;
+ case 0x3a: util::stream_format(stream, "shli $%d,r%d", I16, R2); bytes = 4; break;
+ case 0x3b: util::stream_format(stream, "shlli $%d,r%d:r%d", I16, R2 + 0, R2 + 1); bytes = 4; break;
+ case 0x3c: util::stream_format(stream, "roti $%d,r%d", I16, R2); bytes = 4; break;
+ case 0x3d: util::stream_format(stream, "rotli $%d,r%d:r%d", I16, R2 + 0, R2 + 1); bytes = 4; break;
+
+ case 0x44: util::stream_format(stream, "call r%d,(r%d)", R2, R1); bytes = 2; flags |= DASMFLAG_STEP_OVER; break;
+ case 0x45: util::stream_format(stream, "call r%d,%s", ADDR_R2, address(pc, insn)); bytes = 2 + ADDR_SIZE; flags |= DASMFLAG_STEP_OVER; break;
+#if C400_INSTRUCTIONS
+ case 0x46: util::stream_format(stream, "loadd2 (r%d),f%d", R1, R2); bytes = 2; break;
+ case 0x47: util::stream_format(stream, "loadd2 %s,f%d", address(pc, insn), ADDR_R2); bytes = 2 + ADDR_SIZE; break;
+#endif
+ case 0x48: util::stream_format(stream, "b%-4s (r%d)", cc[R2], R1); bytes = 2; break;
+ case 0x49: util::stream_format(stream, "b%-4s %s", cc[ADDR_R2], address(pc, insn)); bytes = 2 + ADDR_SIZE; break;
+#if C400_INSTRUCTIONS
+ // delayed branches
+ case 0x4a: util::stream_format(stream, "cdb r%d,(r%d)", R2, R1); bytes = 2; break;
+ case 0x4b: util::stream_format(stream, "cdb r%d,%s", ADDR_R2, address(pc, insn)); bytes = 2 + ADDR_SIZE; break;
+ case 0x4c: util::stream_format(stream, "cdbeq r%d,(r%d)", R2, R1); bytes = 2; break;
+ case 0x4d: util::stream_format(stream, "cdbeq r%d,%s", ADDR_R2, address(pc, insn)); bytes = 2 + ADDR_SIZE; break;
+ case 0x4e: util::stream_format(stream, "cdbne r%d,(r%d)", R2, R1); bytes = 2; break;
+ case 0x4f: util::stream_format(stream, "cdbne r%d,%s", ADDR_R2, address(pc, insn)); bytes = 2 + ADDR_SIZE; break;
+ case 0x50: util::stream_format(stream, "db%-4s (r%d)", cc[R2], R1); bytes = 2; break;
+ case 0x51: util::stream_format(stream, "db%-4s %s", cc[ADDR_R2], address(pc, insn)); bytes = 2 + ADDR_SIZE; break;
+#else
+ // these instructions are in the C300 documentation, but appear to be replaced in the C400
+ case 0x4c: util::stream_format(stream, "bf%s (r%d)", R2 == 0 ? "any" : "bad", R1); bytes = 2; break;
+ case 0x4d: util::stream_format(stream, "bf%s %s", ADDR_R2 == 0 ? "any" : "bad", address(pc, insn)); bytes = 2 + ADDR_SIZE; break;
+#endif
+
+ case 0x60: util::stream_format(stream, "loadw (r%d),r%d", R1, R2); bytes = 2; break;
+ case 0x61: util::stream_format(stream, "loadw %s,r%d", address(pc, insn), ADDR_R2); bytes = 2 + ADDR_SIZE; break;
+ case 0x62: util::stream_format(stream, "loada (r%d),r%d", R1, R2); bytes = 2; break;
+ case 0x63: util::stream_format(stream, "loada %s,r%d", address(pc, insn), ADDR_R2); bytes = 2 + ADDR_SIZE; break;
+ case 0x64: util::stream_format(stream, "loads (r%d),f%d", R1, R2); bytes = 2; break;
+ case 0x65: util::stream_format(stream, "loads %s,f%d", address(pc, insn), ADDR_R2); bytes = 2 + ADDR_SIZE; break;
+ case 0x66: util::stream_format(stream, "loadd (r%d),f%d", R1, R2); bytes = 2; break;
+ case 0x67: util::stream_format(stream, "loadd %s,f%d", address(pc, insn), ADDR_R2); bytes = 2 + ADDR_SIZE; break;
+ case 0x68: util::stream_format(stream, "loadb (r%d),r%d", R1, R2); bytes = 2; break;
+ case 0x69: util::stream_format(stream, "loadb %s,r%d", address(pc, insn), ADDR_R2); bytes = 2 + ADDR_SIZE; break;
+ case 0x6a: util::stream_format(stream, "loadbu (r%d),r%d", R1, R2); bytes = 2; break;
+ case 0x6b: util::stream_format(stream, "loadbu %s,r%d", address(pc, insn), ADDR_R2); bytes = 2 + ADDR_SIZE; break;
+ case 0x6c: util::stream_format(stream, "loadh (r%d),r%d", R1, R2); bytes = 2; break;
+ case 0x6d: util::stream_format(stream, "loadh %s,r%d", address(pc, insn), ADDR_R2); bytes = 2 + ADDR_SIZE; break;
+ case 0x6e: util::stream_format(stream, "loadhu (r%d),r%d", R1, R2); bytes = 2; break;
+ case 0x6f: util::stream_format(stream, "loadhu %s,r%d", address(pc, insn), ADDR_R2); bytes = 2 + ADDR_SIZE; break;
+
+ case 0x70: util::stream_format(stream, "storw r%d,(r%d)", R2, R1); bytes = 2; break;
+ case 0x71: util::stream_format(stream, "storw r%d,%s", ADDR_R2, address(pc, insn)); bytes = 2 + ADDR_SIZE; break;
+ case 0x72: util::stream_format(stream, "tsts (r%d),r%d", R1, R2); bytes = 2; break;
+ case 0x73: util::stream_format(stream, "tsts %s,r%d", address(pc, insn), ADDR_R2); bytes = 2 + ADDR_SIZE; break;
+ case 0x74: util::stream_format(stream, "stors f%d,(r%d)", R2, R1); bytes = 2; break;
+ case 0x75: util::stream_format(stream, "stors f%d,%s", ADDR_R2, address(pc, insn)); bytes = 2 + ADDR_SIZE; break;
+ case 0x76: util::stream_format(stream, "stord f%d,(r%d)", R2, R1); bytes = 2; break;
+ case 0x77: util::stream_format(stream, "stord f%d,%s", ADDR_R2, address(pc, insn)); bytes = 2 + ADDR_SIZE; break;
+ case 0x78: util::stream_format(stream, "storb r%d,(r%d)", R2, R1); bytes = 2; break;
+ case 0x79: util::stream_format(stream, "storb r%d,%s", ADDR_R2, address(pc, insn)); bytes = 2 + ADDR_SIZE; break;
+
+ case 0x7c: util::stream_format(stream, "storh r%d,(r%d)", R2, R1); bytes = 2; break;
+ case 0x7d: util::stream_format(stream, "storh r%d,%s", ADDR_R2, address(pc, insn)); bytes = 2 + ADDR_SIZE; break;
+
+ case 0x80: util::stream_format(stream, "addw r%d,r%d", R1, R2); bytes = 2; break;
+
+ case 0x82: util::stream_format(stream, "addq $%d,r%d", R1, R2); bytes = 2; break;
+ case 0x83: util::stream_format(stream, "addi $%d,r%d", IMM_VALUE, R2); bytes = 2 + IMM_SIZE; break;
+ case 0x84: util::stream_format(stream, "movw r%d,r%d", R1, R2); bytes = 2; break;
+
+ case 0x86: util::stream_format(stream, "loadq $%d,r%d", R1, R2); bytes = 2; break;
+ case 0x87: util::stream_format(stream, "loadi $%d,r%d", IMM_VALUE, R2); bytes = 2 + IMM_SIZE; break;
+ case 0x88: util::stream_format(stream, "andw r%d,r%d", R1, R2); bytes = 2; break;
+
+ case 0x8b: util::stream_format(stream, "andi $%d,r%d", IMM_VALUE, R2); bytes = 2 + IMM_SIZE; break;
+ case 0x8c: util::stream_format(stream, "orw r%d,r%d", R1, R2); bytes = 2; break;
+
+ case 0x8f: util::stream_format(stream, "ori $%d,r%d", IMM_VALUE, R2); bytes = 2 + IMM_SIZE; break;
+
+ case 0x90: util::stream_format(stream, "addwc r%d,r%d", R1, R2); bytes = 2; break;
+ case 0x91: util::stream_format(stream, "subwc r%d,r%d", R1, R2); bytes = 2; break;
+
+ case 0x93: util::stream_format(stream, "negw r%d,r%d", R1, R2); bytes = 2; break;
+
+ case 0x98: util::stream_format(stream, "mulw r%d,r%d", R1, R2); bytes = 2; break;
+ case 0x99: util::stream_format(stream, "mulwx r%d,r%d:r%d", R1, R2 + 0, R2 + 1); bytes = 2; break;
+ case 0x9a: util::stream_format(stream, "mulwu r%d,r%d", R1, R2); bytes = 2; break;
+ case 0x9b: util::stream_format(stream, "mulwux r%d,r%d:r%d", R1, R2 + 0, R2 + 1); bytes = 2; break;
+ case 0x9c: util::stream_format(stream, "divw r%d,r%d", R1, R2); bytes = 2; break;
+ case 0x9d: util::stream_format(stream, "modw r%d,r%d", R1, R2); bytes = 2; break;
+ case 0x9e: util::stream_format(stream, "divwu r%d,r%d", R1, R2); bytes = 2; break;
+ case 0x9f: util::stream_format(stream, "modwu r%d,r%d", R1, R2); bytes = 2; break;
+
+ case 0xa0: util::stream_format(stream, "subw r%d,r%d", R1, R2); bytes = 2; break;
+
+ case 0xa2: util::stream_format(stream, "subq $%d,r%d", R1, R2); bytes = 2; break;
+ case 0xa3: util::stream_format(stream, "subi $%d,r%d", IMM_VALUE, R2); bytes = 2 + IMM_SIZE; break;
+ case 0xa4: util::stream_format(stream, "cmpw r%d,r%d", R1, R2); bytes = 2; break;
+
+ case 0xa6: util::stream_format(stream, "cmpq $%d,r%d", R1, R2); bytes = 2; break;
+ case 0xa7: util::stream_format(stream, "cmpi $%d,r%d", IMM_VALUE, R2); bytes = 2 + IMM_SIZE; break;
+ case 0xa8: util::stream_format(stream, "xorw r%d,r%d", R1, R2); bytes = 2; break;
+
+ case 0xab: util::stream_format(stream, "xori $%d,r%d", IMM_VALUE, R2); bytes = 2 + IMM_SIZE; break;
+ case 0xac: util::stream_format(stream, "notw r%d,r%d", R1, R2); bytes = 2; break;
+
+ case 0xae: util::stream_format(stream, "notq $%d,r%d", R1, R2); bytes = 2; break;
+
+#if C400_INSTRUCTIONS
+ case 0xb0: util::stream_format(stream, "abss f%d,f%d", R1, R2); bytes = 2; break;
+ case 0xb2: util::stream_format(stream, "absd f%d,f%d", R1, R2); bytes = 2; break;
+#endif
+
+ case 0xb4:
+ case 0xb5:
+ // unprivileged macro instructions
+ switch (insn[0] & 0xff)
+ {
+ case 0x00: case 0x01: case 0x02: case 0x03:
+ case 0x04: case 0x05: case 0x06: case 0x07:
+ case 0x08: case 0x09: case 0x0a: case 0x0b:
+ case 0x0c:
+ util::stream_format(stream, "savew%d", R2);
+ break;
+
+ case 0x0d: util::stream_format(stream, "movc"); break;
+ case 0x0e: util::stream_format(stream, "initc"); break;
+ case 0x0f: util::stream_format(stream, "cmpc"); break;
+
+ case 0x10: case 0x11: case 0x12: case 0x13:
+ case 0x14: case 0x15: case 0x16: case 0x17:
+ case 0x18: case 0x19: case 0x1a: case 0x1b:
+ case 0x1c:
+ util::stream_format(stream, "restw%d", R2);
+ break;
+
+ case 0x20: case 0x21: case 0x22: case 0x23:
+ case 0x24: case 0x25: case 0x26: case 0x27:
+ util::stream_format(stream, "saved%d", R2);
+ break;
+
+ case 0x28: case 0x29: case 0x2a: case 0x2b:
+ case 0x2c: case 0x2d: case 0x2e: case 0x2f:
+ util::stream_format(stream, "restd%d", R2);
+ break;
+
+ case 0x30: util::stream_format(stream, "cnvsw f%d,r%d", (insn[1] & 0xf0) >> 4, insn[1] & 0xf); break;
+ case 0x31: util::stream_format(stream, "cnvrsw f%d,r%d", (insn[1] & 0xf0) >> 4, insn[1] & 0xf); break;
+ case 0x32: util::stream_format(stream, "cnvtsw f%d,r%d", (insn[1] & 0xf0) >> 4, insn[1] & 0xf); break;
+ case 0x33: util::stream_format(stream, "cnvws r%d,f%d", (insn[1] & 0xf0) >> 4, insn[1] & 0xf); break;
+ case 0x34: util::stream_format(stream, "cnvdw f%d,r%d", (insn[1] & 0xf0) >> 4, insn[1] & 0xf); break;
+ case 0x35: util::stream_format(stream, "cnvrdw f%d,r%d", (insn[1] & 0xf0) >> 4, insn[1] & 0xf); break;
+ case 0x36: util::stream_format(stream, "cnvtdw f%d,r%d", (insn[1] & 0xf0) >> 4, insn[1] & 0xf); break;
+ case 0x37: util::stream_format(stream, "cnvwd r%d,f%d", (insn[1] & 0xf0) >> 4, insn[1] & 0xf); break;
+ case 0x38: util::stream_format(stream, "cnvsd f%d,f%d", (insn[1] & 0xf0) >> 4, insn[1] & 0xf); break;
+ case 0x39: util::stream_format(stream, "cnvds f%d,f%d", (insn[1] & 0xf0) >> 4, insn[1] & 0xf); break;
+ case 0x3a: util::stream_format(stream, "negs f%d,f%d", (insn[1] & 0xf0) >> 4, insn[1] & 0xf); break;
+ case 0x3b: util::stream_format(stream, "negd f%d,f%d", (insn[1] & 0xf0) >> 4, insn[1] & 0xf); break;
+ case 0x3c: util::stream_format(stream, "scalbs r%d,f%d", (insn[1] & 0xf0) >> 4, insn[1] & 0xf); break;
+ case 0x3d: util::stream_format(stream, "scalbd r%d,f%d", (insn[1] & 0xf0) >> 4, insn[1] & 0xf); break;
+ case 0x3e: util::stream_format(stream, "trapfn"); break;
+ case 0x3f: util::stream_format(stream, "loadfs r%d,f%d", (insn[1] & 0xf0) >> 4, insn[1] & 0xf); break;
+
+ default:
+ util::stream_format(stream, "macro 0x%04x 0x%04x", insn[0], insn[1]);
+ break;
+ }
+ bytes = 4;
+ break;
+ case 0xb6:
+ case 0xb7:
+ // privileged macro instructions
+ switch (insn[0] & 0xff)
+ {
+ case 0x00: util::stream_format(stream, "movus r%d,r%d", (insn[1] & 0xf0) >> 4, insn[1] & 0xf); break;
+ case 0x01: util::stream_format(stream, "movsu r%d,r%d", (insn[1] & 0xf0) >> 4, insn[1] & 0xf); break;
+ case 0x02: util::stream_format(stream, "saveur r%d", (insn[1] & 0xf0) >> 4); break;
+ case 0x03: util::stream_format(stream, "restur r%d", (insn[1] & 0xf0) >> 4); break;
+ case 0x04: util::stream_format(stream, "reti r%d", (insn[1] & 0xf0) >> 4); flags |= DASMFLAG_STEP_OUT; break;
+ case 0x05: util::stream_format(stream, "wait"); break;
+#if C400_INSTRUCTIONS
+ case 0x07: util::stream_format(stream, "loadts r%d,f%d", (insn[1] & 0xf0) >> 4, insn[1] & 0xf); break;
+#endif
+ default:
+ util::stream_format(stream, "macro 0x%04x 0x%04x", insn[0], insn[1]);
+ break;
+ }
+ bytes = 4;
+ break;
+
+#if C400_INSTRUCTIONS
+ case 0xbc: util::stream_format(stream, "waitd"); bytes = 2; break;
+ case 0xc0: util::stream_format(stream, "s%-4s r%d", cc[R2], R1); bytes = 2; break;
+#endif
+
+ default:
+ util::stream_format(stream, ".word 0x%04x", insn[0]);
+ bytes = 2;
+ break;
+ }
+
+ return bytes | flags;
+} \ No newline at end of file
diff --git a/src/devices/cpu/cop400/cop400.cpp b/src/devices/cpu/cop400/cop400.cpp
index 459375fb40d..28394aa88f8 100644
--- a/src/devices/cpu/cop400/cop400.cpp
+++ b/src/devices/cpu/cop400/cop400.cpp
@@ -10,29 +10,28 @@
Type ROM RAM G D IN
- COP410 512x8 32x4 none
- COP411 512x8 32x4 0-2 0-1 none
- COP401 none 32x4 none
- COP413?
- COP414?
- COP415?
- COP405?
+ COP410 512x8 32x4 N/A
+ COP411 512x8 32x4 0-2 0-1 N/A
+ COP413 512x8 32x4 N/A N/A
+ COP401 N/A 32x4 N/A
COP420 1024x8 64x4
- COP421 1024x8 64x4 none
- COP422 1024x8 64x4 2-3 2-3 none
- COP402 none 64x4
+ COP421 1024x8 64x4 N/A
+ COP422 1024x8 64x4 2-3 2-3 N/A
+ COP402 N/A 64x4
- COP444 2048x8 128x4
- COP445 2048x8 128x4 none
- COP424 1024x8 64x4
- COP425 1024x8 64x4 none
- COP426 1024x8 64x4 2-3 2-3
- COP404 none none
+ COP444L 2048x8 128x4
+ COP445L 2048x8 128x4 N/A
+ COP404L N/A 128x4
- COP440 2048x8 160x4
- COP441 2048x8 160x4
- COP442 2048x8 160x4
+ COP424C 1024x8 64x4
+ COP425C 1024x8 64x4 N/A
+ COP426C 1024x8 64x4 2-3 2-3
+
+ COP444C 2048x8 128x4
+ COP445C 2048x8 128x4 N/A
+ COP446C 2048x8 128x4 2-3 2-3
+ COP404C N/A 128x4
****************************************************************************
@@ -48,12 +47,9 @@
TODO:
- - opcode support for 2048x8 and 128x4/160x4 memory sizes
- - CKO sync input
+ - COP410L/COP410C
- save internal RAM when CKO is RAM power supply pin
- - COP413/COP414/COP415/COP405
- - COP404 opcode map switching, dual timer, microbus enable
- - COP440/COP441/COP442 (new registers: 2-bit N, 4-bit H, 8-bit R; some new opcodes, 2Kx8 ROM, 160x4 RAM)
+ - COP404L opcode map switching, dual timer, microbus enable
*/
@@ -69,12 +65,17 @@ const device_type COP402 = &device_creator<cop402_cpu_device>;
const device_type COP420 = &device_creator<cop420_cpu_device>;
const device_type COP421 = &device_creator<cop421_cpu_device>;
const device_type COP422 = &device_creator<cop422_cpu_device>;
-const device_type COP404 = &device_creator<cop404_cpu_device>;
-const device_type COP424 = &device_creator<cop424_cpu_device>;
-const device_type COP425 = &device_creator<cop425_cpu_device>;
-const device_type COP426 = &device_creator<cop426_cpu_device>;
-const device_type COP444 = &device_creator<cop444_cpu_device>;
-const device_type COP445 = &device_creator<cop445_cpu_device>;
+const device_type COP404L = &device_creator<cop404l_cpu_device>;
+const device_type COP444L = &device_creator<cop444l_cpu_device>;
+const device_type COP445L = &device_creator<cop445l_cpu_device>;
+const device_type COP404C = &device_creator<cop404c_cpu_device>;
+const device_type COP424C = &device_creator<cop424c_cpu_device>;
+const device_type COP425C = &device_creator<cop425c_cpu_device>;
+const device_type COP426C = &device_creator<cop426c_cpu_device>;
+const device_type COP444C = &device_creator<cop444c_cpu_device>;
+const device_type COP445C = &device_creator<cop445c_cpu_device>;
+const device_type COP446C = &device_creator<cop446c_cpu_device>;
+
/***************************************************************************
@@ -153,12 +154,6 @@ static ADDRESS_MAP_START( data_128b, AS_DATA, 8, cop400_cpu_device )
AM_RANGE(0x00, 0x7f) AM_RAM
ADDRESS_MAP_END
-#ifdef UNUSED_CODE
-static ADDRESS_MAP_START( data_160b, AS_DATA, 8, cop400_cpu_device )
- AM_RANGE(0x00, 0x9f) AM_RAM
-ADDRESS_MAP_END
-#endif
-
cop400_cpu_device::cop400_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source, uint8_t program_addr_bits, uint8_t data_addr_bits, uint8_t featuremask, uint8_t g_mask, uint8_t d_mask, uint8_t in_mask, bool has_counter, bool has_inil, address_map_constructor internal_map_program, address_map_constructor internal_map_data)
: cpu_device(mconfig, type, name, tag, owner, clock, shortname, source)
@@ -185,37 +180,48 @@ cop400_cpu_device::cop400_cpu_device(const machine_config &mconfig, device_type
, m_d_mask(d_mask)
, m_in_mask(in_mask)
{
- int i;
+ for (int i = 0; i < 256; i++) {
+ m_InstLen[i] = 1;
+ }
- /* initialize instruction length array */
- for (i=0; i<256; i++) m_InstLen[i]=1;
+ m_InstLen[0x33] = m_InstLen[0x23] = 2;
switch (featuremask)
{
case COP410_FEATURE:
- /* select opcode map */
m_opcode_map = COP410_OPCODE_MAP;
- /* initialize instruction length array */
- m_InstLen[0x60] = m_InstLen[0x61] = m_InstLen[0x68] =
- m_InstLen[0x69] = m_InstLen[0x33] = m_InstLen[0x23] = 2;
+
+ for (int r = 0; r < 2; r++) {
+ m_InstLen[0x60 + r] = 2; // JMP
+ m_InstLen[0x68 + r] = 2; // JSR
+ }
break;
case COP420_FEATURE:
- /* select opcode map */
m_opcode_map = COP420_OPCODE_MAP;
- /* initialize instruction length array */
- m_InstLen[0x60] = m_InstLen[0x61] = m_InstLen[0x62] = m_InstLen[0x63] =
- m_InstLen[0x68] = m_InstLen[0x69] = m_InstLen[0x6a] = m_InstLen[0x6b] =
- m_InstLen[0x33] = m_InstLen[0x23] = 2;
+
+ for (int r = 0; r < 4; r++) {
+ m_InstLen[0x60 + r] = 2; // JMP
+ m_InstLen[0x68 + r] = 2; // JSR
+ }
break;
- case COP444_FEATURE:
- /* select opcode map */
- m_opcode_map = COP444_OPCODE_MAP;
- /* initialize instruction length array */
- m_InstLen[0x60] = m_InstLen[0x61] = m_InstLen[0x62] = m_InstLen[0x63] =
- m_InstLen[0x68] = m_InstLen[0x69] = m_InstLen[0x6a] = m_InstLen[0x6b] =
- m_InstLen[0x33] = m_InstLen[0x23] = 2;
+ case COP444L_FEATURE:
+ m_opcode_map = COP444L_OPCODE_MAP;
+
+ for (int r = 0; r < 8; r++) {
+ m_InstLen[0x60 + r] = 2; // JMP
+ m_InstLen[0x68 + r] = 2; // JSR
+ }
+ break;
+
+ case COP424C_FEATURE:
+ m_opcode_map = COP424C_OPCODE_MAP;
+
+ for (int r = 0; r < 8; r++) {
+ m_InstLen[0x60 + r] = 2; // JMP
+ m_InstLen[0x68 + r] = 2; // JSR
+ }
break;
default:
@@ -258,36 +264,58 @@ cop422_cpu_device::cop422_cpu_device(const machine_config &mconfig, const char *
{
}
-cop404_cpu_device::cop404_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : cop400_cpu_device(mconfig, COP404, "COP404", tag, owner, clock, "cop404", __FILE__, 11, 7, COP444_FEATURE, 0xf, 0xf, 0xf, true, true, nullptr, ADDRESS_MAP_NAME(data_128b))
+cop404l_cpu_device::cop404l_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : cop400_cpu_device(mconfig, COP404L, "COP404L", tag, owner, clock, "cop404l", __FILE__, 11, 7, COP444L_FEATURE, 0xf, 0xf, 0xf, true, true, nullptr, ADDRESS_MAP_NAME(data_128b))
+{
+}
+
+cop444l_cpu_device::cop444l_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : cop400_cpu_device(mconfig, COP444L, "COP444L", tag, owner, clock, "cop444l", __FILE__, 11, 7, COP444L_FEATURE, 0xf, 0xf, 0xf, true, true, ADDRESS_MAP_NAME(program_2kb), ADDRESS_MAP_NAME(data_128b))
+{
+}
+
+cop445l_cpu_device::cop445l_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : cop400_cpu_device(mconfig, COP445L, "COP445L", tag, owner, clock, "cop445l", __FILE__, 11, 7, COP444L_FEATURE, 0x7, 0x3, 0, true, false, ADDRESS_MAP_NAME(program_2kb), ADDRESS_MAP_NAME(data_128b))
+{
+}
+
+cop404c_cpu_device::cop404c_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : cop400_cpu_device(mconfig, COP404C, "COP404C", tag, owner, clock, "cop404c", __FILE__, 11, 7, COP424C_FEATURE, 0xf, 0xf, 0xf, true, true, nullptr, ADDRESS_MAP_NAME(data_128b))
{
}
-cop424_cpu_device::cop424_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : cop400_cpu_device(mconfig, COP424, "COP424", tag, owner, clock, "cop424", __FILE__, 10, 6, COP444_FEATURE, 0xf, 0xf, 0xf, true, true, ADDRESS_MAP_NAME(program_1kb), ADDRESS_MAP_NAME(data_64b))
+cop424c_cpu_device::cop424c_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : cop400_cpu_device(mconfig, COP424C, "COP424C", tag, owner, clock, "cop424c", __FILE__, 10, 6, COP424C_FEATURE, 0xf, 0xf, 0xf, true, true, ADDRESS_MAP_NAME(program_1kb), ADDRESS_MAP_NAME(data_64b))
{
}
-cop425_cpu_device::cop425_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : cop400_cpu_device(mconfig, COP425, "COP425", tag, owner, clock, "cop425", __FILE__, 10, 6, COP444_FEATURE, 0xf, 0xf, 0, true, false, ADDRESS_MAP_NAME(program_1kb), ADDRESS_MAP_NAME(data_64b))
+cop425c_cpu_device::cop425c_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : cop400_cpu_device(mconfig, COP425C, "COP425C", tag, owner, clock, "cop425c", __FILE__, 10, 6, COP424C_FEATURE, 0xf, 0xf, 0, true, false, ADDRESS_MAP_NAME(program_1kb), ADDRESS_MAP_NAME(data_64b))
{
}
-cop426_cpu_device::cop426_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : cop400_cpu_device(mconfig, COP426, "COP426", tag, owner, clock, "cop426", __FILE__, 10, 6, COP444_FEATURE, 0xe, 0xe, 0xf, true, true, ADDRESS_MAP_NAME(program_1kb), ADDRESS_MAP_NAME(data_64b))
+cop426c_cpu_device::cop426c_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : cop400_cpu_device(mconfig, COP426C, "COP426C", tag, owner, clock, "cop426c", __FILE__, 10, 6, COP424C_FEATURE, 0xe, 0xe, 0xf, true, true, ADDRESS_MAP_NAME(program_1kb), ADDRESS_MAP_NAME(data_64b))
{
}
-cop444_cpu_device::cop444_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : cop400_cpu_device(mconfig, COP444, "COP444", tag, owner, clock, "cop444", __FILE__, 11, 7, COP444_FEATURE, 0xf, 0xf, 0xf, true, true, ADDRESS_MAP_NAME(program_2kb), ADDRESS_MAP_NAME(data_128b))
+cop444c_cpu_device::cop444c_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : cop400_cpu_device(mconfig, COP444C, "COP444C", tag, owner, clock, "cop444c", __FILE__, 11, 7, COP424C_FEATURE, 0xf, 0xf, 0xf, true, true, ADDRESS_MAP_NAME(program_2kb), ADDRESS_MAP_NAME(data_128b))
{
}
-cop445_cpu_device::cop445_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : cop400_cpu_device(mconfig, COP445, "COP445", tag, owner, clock, "cop445", __FILE__, 11, 7, COP444_FEATURE, 0x7, 0x3, 0, true, false, ADDRESS_MAP_NAME(program_2kb), ADDRESS_MAP_NAME(data_128b))
+cop445c_cpu_device::cop445c_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : cop400_cpu_device(mconfig, COP445C, "COP445C", tag, owner, clock, "cop445c", __FILE__, 11, 7, COP424C_FEATURE, 0xf, 0xf, 0, true, false, ADDRESS_MAP_NAME(program_2kb), ADDRESS_MAP_NAME(data_128b))
{
}
+cop446c_cpu_device::cop446c_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : cop400_cpu_device(mconfig, COP446C, "COP446C", tag, owner, clock, "cop446c", __FILE__, 11, 7, COP424C_FEATURE, 0xe, 0xe, 0xf, true, true, ADDRESS_MAP_NAME(program_2kb), ADDRESS_MAP_NAME(data_128b))
+{
+}
+
+
+
/***************************************************************************
INLINE FUNCTIONS
***************************************************************************/
@@ -341,7 +369,7 @@ void cop400_cpu_device::WRITE_G(uint8_t data)
INSTRUCTION(illegal)
{
- logerror("COP400: PC = %04x, Illegal opcode = %02x\n", PC-1, ROM(PC-1));
+ logerror("COP400: PC = %03x, Illegal opcode = %02x\n", PC-1, ROM(PC-1));
}
#include "cop400op.hxx"
@@ -612,7 +640,7 @@ const cop400_cpu_device::cop400_opcode_func cop400_cpu_device::COP420_OPCODE_MAP
OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jid)
};
-const cop400_cpu_device::cop400_opcode_func cop400_cpu_device::COP444_OPCODE_23_MAP[256] =
+const cop400_cpu_device::cop400_opcode_func cop400_cpu_device::COP444L_OPCODE_23_MAP[256] =
{
OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) ,
OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) ,
@@ -651,23 +679,23 @@ const cop400_cpu_device::cop400_opcode_func cop400_cpu_device::COP444_OPCODE_23_
OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad)
};
-void cop400_cpu_device::cop444_op23(uint8_t opcode)
+void cop400_cpu_device::cop444l_op23(uint8_t opcode)
{
uint8_t opcode23 = fetch();
- (this->*COP444_OPCODE_23_MAP[opcode23])(opcode23);
+ (this->*COP444L_OPCODE_23_MAP[opcode23])(opcode23);
}
-const cop400_cpu_device::cop400_opcode_func cop400_cpu_device::COP444_OPCODE_33_MAP[256] =
+const cop400_cpu_device::cop400_opcode_func cop400_cpu_device::COP444L_OPCODE_33_MAP[256] =
{
OP(illegal) , OP(skgbz0) , OP(illegal) , OP(skgbz2) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) ,
OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) ,
OP(illegal) , OP(skgbz1) , OP(illegal) , OP(skgbz3) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) ,
OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) ,
OP(illegal) , OP(skgz) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) ,
- OP(inin) , OP(inil) , OP(ing) , OP(illegal) , OP(cqma) , OP(illegal) , OP(inl) , OP(ctma) ,
+ OP(inin) , OP(inil) , OP(ing) , OP(illegal) , OP(cqma) , OP(illegal) , OP(inl) , OP(illegal) ,
OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) ,
- OP(it) , OP(illegal) , OP(omg) , OP(illegal) , OP(camq) , OP(illegal) , OP(obd) , OP(camt) ,
+ OP(illegal) , OP(illegal) , OP(omg) , OP(illegal) , OP(camq) , OP(illegal) , OP(obd) , OP(illegal) ,
OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) ,
OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) ,
@@ -697,22 +725,22 @@ const cop400_cpu_device::cop400_opcode_func cop400_cpu_device::COP444_OPCODE_33_
OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi)
};
-void cop400_cpu_device::cop444_op33(uint8_t opcode)
+void cop400_cpu_device::cop444l_op33(uint8_t opcode)
{
uint8_t opcode33 = fetch();
- (this->*COP444_OPCODE_33_MAP[opcode33])(opcode33);
+ (this->*COP444L_OPCODE_33_MAP[opcode33])(opcode33);
}
-const cop400_cpu_device::cop400_opcode_func cop400_cpu_device::COP444_OPCODE_MAP[256] =
+const cop400_cpu_device::cop400_opcode_func cop400_cpu_device::COP444L_OPCODE_MAP[256] =
{
OP(clra) , OP(skmbz0) , OP(xor_) , OP(skmbz2) , OP(xis) , OP(ld) , OP(x) , OP(xds) ,
OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) ,
- OP(casc) , OP(skmbz1) , OP(cop444_xabr), OP(skmbz3) , OP(xis) , OP(ld) , OP(x) , OP(xds) ,
+ OP(casc) , OP(skmbz1) , OP(cop444l_xabr), OP(skmbz3) , OP(xis) , OP(ld) , OP(x) , OP(xds) ,
OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) ,
- OP(skc) , OP(ske) , OP(sc) , OP(cop444_op23) , OP(xis) , OP(ld) , OP(x) , OP(xds) ,
+ OP(skc) , OP(ske) , OP(sc) , OP(cop444l_op23) , OP(xis) , OP(ld) , OP(x) , OP(xds) ,
OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) ,
- OP(asc) , OP(add) , OP(rc) , OP(cop444_op33) , OP(xis) , OP(ld) , OP(x) , OP(xds) ,
+ OP(asc) , OP(add) , OP(rc) , OP(cop444l_op33) , OP(xis) , OP(ld) , OP(x) , OP(xds) ,
OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) ,
OP(comp) , OP(skt) , OP(rmb2) , OP(rmb3) , OP(nop) , OP(rmb1) , OP(smb2) , OP(smb1) ,
@@ -743,6 +771,136 @@ const cop400_cpu_device::cop400_opcode_func cop400_cpu_device::COP444_OPCODE_MAP
OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jid)
};
+const cop400_cpu_device::cop400_opcode_func cop400_cpu_device::COP424C_OPCODE_23_MAP[256] =
+{
+ OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) ,
+ OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) ,
+ OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) ,
+ OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) ,
+ OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) ,
+ OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) ,
+ OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) ,
+ OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) ,
+
+ OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) ,
+ OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) ,
+ OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) ,
+ OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) ,
+ OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) ,
+ OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) ,
+ OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) ,
+ OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) , OP(ldd) ,
+
+ OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) ,
+ OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) ,
+ OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) ,
+ OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) ,
+ OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) ,
+ OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) ,
+ OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) ,
+ OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) ,
+
+ OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) ,
+ OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) ,
+ OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) ,
+ OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) ,
+ OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) ,
+ OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) ,
+ OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) ,
+ OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad) , OP(xad)
+};
+
+void cop400_cpu_device::cop424c_op23(uint8_t opcode)
+{
+ uint8_t opcode23 = fetch();
+
+ (this->*COP424C_OPCODE_23_MAP[opcode23])(opcode23);
+}
+
+const cop400_cpu_device::cop400_opcode_func cop400_cpu_device::COP424C_OPCODE_33_MAP[256] =
+{
+ OP(illegal) , OP(skgbz0) , OP(illegal) , OP(skgbz2) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) ,
+ OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) ,
+ OP(illegal) , OP(skgbz1) , OP(illegal) , OP(skgbz3) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) ,
+ OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) ,
+ OP(illegal) , OP(skgz) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) ,
+ OP(inin) , OP(inil) , OP(ing) , OP(illegal) , OP(cqma) , OP(illegal) , OP(inl) , OP(ctma) ,
+ OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) ,
+ OP(it) , OP(illegal) , OP(omg) , OP(illegal) , OP(camq) , OP(illegal) , OP(obd) , OP(camt) ,
+
+ OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) ,
+ OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) ,
+ OP(ogi) , OP(ogi) , OP(ogi) , OP(ogi) , OP(ogi) , OP(ogi) , OP(ogi) , OP(ogi) ,
+ OP(ogi) , OP(ogi) , OP(ogi) , OP(ogi) , OP(ogi) , OP(ogi) , OP(ogi) , OP(ogi) ,
+ OP(lei) , OP(lei) , OP(lei) , OP(lei) , OP(lei) , OP(lei) , OP(lei) , OP(lei) ,
+ OP(lei) , OP(lei) , OP(lei) , OP(lei) , OP(lei) , OP(lei) , OP(lei) , OP(lei) ,
+ OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) ,
+ OP(halt) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) , OP(illegal) ,
+
+ OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) ,
+ OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) ,
+ OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) ,
+ OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) ,
+ OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) ,
+ OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) ,
+ OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) ,
+ OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) ,
+
+ OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) ,
+ OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) ,
+ OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) ,
+ OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) ,
+ OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) ,
+ OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) ,
+ OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) ,
+ OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi)
+};
+
+void cop400_cpu_device::cop424c_op33(uint8_t opcode)
+{
+ uint8_t opcode33 = fetch();
+
+ (this->*COP424C_OPCODE_33_MAP[opcode33])(opcode33);
+}
+
+const cop400_cpu_device::cop400_opcode_func cop400_cpu_device::COP424C_OPCODE_MAP[256] =
+{
+ OP(clra) , OP(skmbz0) , OP(xor_) , OP(skmbz2) , OP(xis) , OP(ld) , OP(x) , OP(xds) ,
+ OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) ,
+ OP(casc) , OP(skmbz1) , OP(cop444l_xabr), OP(skmbz3) , OP(xis) , OP(ld) , OP(x) , OP(xds) ,
+ OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) ,
+ OP(skc) , OP(ske) , OP(sc) , OP(cop444l_op23) , OP(xis) , OP(ld) , OP(x) , OP(xds) ,
+ OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) ,
+ OP(asc) , OP(add) , OP(rc) , OP(cop444l_op33) , OP(xis) , OP(ld) , OP(x) , OP(xds) ,
+ OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) , OP(lbi) ,
+
+ OP(comp) , OP(skt) , OP(rmb2) , OP(rmb3) , OP(nop) , OP(rmb1) , OP(smb2) , OP(smb1) ,
+ OP(cop420_ret) , OP(retsk) , OP(adt) , OP(smb3) , OP(rmb0) , OP(smb0) , OP(cba) , OP(xas) ,
+ OP(cab) , OP(aisc) , OP(aisc) , OP(aisc) , OP(aisc) , OP(aisc) , OP(aisc) , OP(aisc) ,
+ OP(aisc) , OP(aisc) , OP(aisc) , OP(aisc) , OP(aisc) , OP(aisc) , OP(aisc) , OP(aisc) ,
+ OP(jmp) , OP(jmp) , OP(jmp) , OP(jmp) , OP(jmp) , OP(jmp) , OP(jmp) , OP(jmp) ,
+ OP(jsr) , OP(jsr) , OP(jsr) , OP(jsr) , OP(jsr) , OP(jsr) , OP(jsr) , OP(jsr) ,
+ OP(stii) , OP(stii) , OP(stii) , OP(stii) , OP(stii) , OP(stii) , OP(stii) , OP(stii) ,
+ OP(stii) , OP(stii) , OP(stii) , OP(stii) , OP(stii) , OP(stii) , OP(stii) , OP(stii) ,
+
+ OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) ,
+ OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) ,
+ OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) ,
+ OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) ,
+ OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) ,
+ OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) ,
+ OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) ,
+ OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(lqid) ,
+
+ OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) ,
+ OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) ,
+ OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) ,
+ OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) ,
+ OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) ,
+ OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) ,
+ OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) ,
+ OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jp) , OP(jid)
+};
/***************************************************************************
TIMER CALLBACKS
@@ -823,24 +981,11 @@ void cop400_cpu_device::serial_tick()
void cop400_cpu_device::counter_tick()
{
- if (m_featuremask & (COP444_FEATURE | COP440_FEATURE))
- {
- T++;
+ T++;
- if (T == 0)
- {
- m_skt_latch = 1;
-
- if (m_idle)
- {
- m_idle = 0;
- m_halt = 0;
- }
- }
- }
- else
- {
+ if (!T) {
m_skt_latch = 1;
+ m_idle = false;
}
}
@@ -870,17 +1015,17 @@ void cop400_cpu_device::device_timer(emu_timer &timer, device_timer_id id, int p
{
switch (id)
{
- case TIMER_SERIAL:
- serial_tick();
- break;
+ case TIMER_SERIAL:
+ serial_tick();
+ break;
- case TIMER_COUNTER:
- counter_tick();
- break;
+ case TIMER_COUNTER:
+ counter_tick();
+ break;
- case TIMER_INIL:
- inil_tick();
- break;
+ case TIMER_INIL:
+ inil_tick();
+ break;
}
}
@@ -888,13 +1033,11 @@ void cop400_cpu_device::device_timer(emu_timer &timer, device_timer_id id, int p
void cop400_cpu_device::device_start()
{
/* find address spaces */
-
m_program = &space(AS_PROGRAM);
m_direct = &m_program->direct();
m_data = &space(AS_DATA);
/* find i/o handlers */
-
m_read_l.resolve_safe(0);
m_read_l_tristate.resolve_safe(0);
m_write_l.resolve_safe();
@@ -908,29 +1051,18 @@ void cop400_cpu_device::device_start()
m_read_cko.resolve_safe(0);
/* allocate serial timer */
-
m_serial_timer = timer_alloc(TIMER_SERIAL);
m_serial_timer->adjust(attotime::zero, 0, attotime::from_ticks(m_cki, clock()));
/* allocate counter timer */
-
m_counter_timer = nullptr;
if (m_has_counter)
{
m_counter_timer = timer_alloc(TIMER_COUNTER);
-
- if (m_featuremask & (COP444_FEATURE | COP440_FEATURE))
- {
- m_counter_timer->adjust(attotime::zero, 0, attotime::from_ticks(m_cki * 4, clock()));
- }
- else
- {
- m_counter_timer->adjust(attotime::zero, 0, attotime::from_ticks(m_cki * 1024, clock()));
- }
+ m_counter_timer->adjust(attotime::zero, 0, attotime::from_ticks(m_cki * 4, clock()));
}
/* allocate IN latch timer */
-
m_inil_timer = nullptr;
if (m_has_inil)
{
@@ -939,10 +1071,8 @@ void cop400_cpu_device::device_start()
}
/* register for state saving */
-
save_item(NAME(m_pc));
save_item(NAME(m_prevpc));
- save_item(NAME(m_n));
save_item(NAME(m_sa));
save_item(NAME(m_sb));
save_item(NAME(m_sc));
@@ -950,9 +1080,7 @@ void cop400_cpu_device::device_start()
save_item(NAME(m_b));
save_item(NAME(m_c));
save_item(NAME(m_g));
- save_item(NAME(m_h));
save_item(NAME(m_q));
- save_item(NAME(m_r));
save_item(NAME(m_en));
save_item(NAME(m_sio));
save_item(NAME(m_skl));
@@ -966,68 +1094,42 @@ void cop400_cpu_device::device_start()
save_item(NAME(m_halt));
save_item(NAME(m_idle));
- state_add(STATE_GENPC, "GENPC", m_pc).mask(0xfff).noshow();
- state_add(STATE_GENPCBASE, "CURPC", m_prevpc).mask(0xfff).noshow();
- state_add(STATE_GENSP, "GENSP", m_n).mask(0x3).noshow();
- state_add(STATE_GENFLAGS, "GENFLAGS", m_flags).mask(0x3).callimport().callexport().noshow().formatstr("%3s");
-
- state_add(COP400_PC, "PC", m_pc).mask(0xfff);
-
- if (m_featuremask & (COP410_FEATURE | COP420_FEATURE | COP444_FEATURE))
- {
- state_add(COP400_SA, "SA", m_sa).mask(0xfff);
- state_add(COP400_SB, "SB", m_sb).mask(0xfff);
- if (m_featuremask & (COP420_FEATURE | COP444_FEATURE))
- {
- state_add(COP400_SC, "SC", m_sc).mask(0xfff);
- }
- }
- if (m_featuremask & COP440_FEATURE)
- {
- state_add(COP400_N, "N", m_n).mask(0x3);
- }
-
- state_add(COP400_A, "A", m_a).mask(0xf);
- state_add(COP400_B, "B", m_b);
- state_add(COP400_C, "C", m_c).mask(0x1);
-
- state_add(COP400_EN, "EN", m_en).mask(0xf);
- state_add(COP400_G, "G", m_g).mask(0xf);
- if (m_featuremask & COP440_FEATURE)
- {
- state_add(COP400_H, "H", m_h).mask(0xf);
+ // setup debugger state display
+ offs_t pc_mask = m_program->addrmask();
+
+ state_add(STATE_GENPC, "GENPC", m_pc).mask(pc_mask).noshow();
+ state_add(STATE_GENPCBASE, "CURPC", m_prevpc).mask(pc_mask).noshow();
+ state_add(STATE_GENFLAGS, "GENFLAGS", m_flags).mask(0x7).callimport().callexport().noshow().formatstr("%3s");
+ state_add(COP400_PC, "PC", m_pc).mask(pc_mask);
+ state_add(COP400_SA, "SA", m_sa).mask(pc_mask);
+ state_add(COP400_SB, "SB", m_sb).mask(pc_mask);
+ if (!(m_featuremask & COP410_FEATURE)) {
+ state_add(COP400_SC, "SC", m_sc).mask(pc_mask);
}
- state_add(COP400_Q, "Q", m_q);
- if (m_featuremask & COP440_FEATURE)
- {
- state_add(COP400_R, "R", m_r);
- }
-
- state_add(COP400_SIO, "SIO", m_sio).mask(0xf);
- state_add(COP400_SKL, "SKL", m_skl).mask(0x1);
-
- if (m_featuremask & (COP444_FEATURE | COP440_FEATURE))
- {
- state_add(COP400_T, "T", m_t);
+ state_add(COP400_B, "B", m_b);
+ state_add(COP400_A, "A", m_a).mask(0xf);
+ state_add(COP400_G, "G", m_g).mask(0xf);
+ state_add(COP400_Q, "Q", m_q);
+ state_add(COP400_SIO, "SIO", m_sio).mask(0xf);
+ state_add(COP400_EN, "EN", m_en).mask(0xf);
+ if (m_featuremask & COP424C_FEATURE) {
+ state_add(COP400_T, "T", m_t);
}
m_icountptr = &m_icount;
- m_n = 0;
m_q = 0;
m_sa = 0;
m_sb = 0;
m_sc = 0;
m_sio = 0;
- m_h = 0;
- m_r = 0;
m_flags = 0;
m_il = 0;
m_in[0] = m_in[1] = m_in[2] = m_in[3] = 0;
m_si = 0;
m_skip_lbi = 0;
- m_last_skip = 0;
- m_skip = 0;
+ m_last_skip = false;
+ m_skip = false;
}
@@ -1049,8 +1151,8 @@ void cop400_cpu_device::device_reset()
T = 0;
m_skt_latch = 1;
- m_halt = 0;
- m_idle = 0;
+ m_halt = false;
+ m_idle = false;
}
/***************************************************************************
@@ -1068,16 +1170,18 @@ void cop400_cpu_device::execute_run()
{
do
{
- // debugger hook
- m_prevpc = PC;
- debugger_instruction_hook(this, PC);
+ if (!m_skip) {
+ // debugger hook
+ m_prevpc = PC;
+ debugger_instruction_hook(this, PC);
+ }
// halt logic
if (m_cko == COP400_CKO_HALT_IO_PORT) {
m_halt = IN_CKO();
}
- if (m_halt) {
+ if (m_halt || m_idle) {
m_icount--;
continue;
}
@@ -1092,7 +1196,7 @@ void cop400_cpu_device::execute_run()
if ((function != OP(jp)) && (function != OP(jmp)) && (function != OP(jsr)) && !m_skip_lbi) {
// store skip logic
m_last_skip = m_skip;
- m_skip = 0;
+ m_skip = false;
// push next PC
PUSH(PC);
@@ -1114,7 +1218,7 @@ void cop400_cpu_device::execute_run()
opcode = fetch();
}
- m_skip = 0;
+ m_skip = false;
continue;
}
@@ -1138,10 +1242,11 @@ void cop400_cpu_device::state_import(const device_state_entry &entry)
{
switch (entry.index())
{
- case STATE_GENFLAGS:
- m_c = (m_flags >> 1) & 1;
- m_skl = (m_flags >> 0) & 1;
- break;
+ case STATE_GENFLAGS:
+ m_skt_latch = BIT(m_flags, 2);
+ m_c = BIT(m_flags, 1);
+ m_skl = BIT(m_flags, 0);
+ break;
}
}
@@ -1149,9 +1254,9 @@ void cop400_cpu_device::state_export(const device_state_entry &entry)
{
switch (entry.index())
{
- case STATE_GENFLAGS:
- m_flags = (m_c ? 0x02 : 0x00) | (m_skl ? 0x01 : 0x00);
- break;
+ case STATE_GENFLAGS:
+ m_flags = (m_skt_latch ? 0x04 : 0x00) | (m_c ? 0x02 : 0x00) | (m_skl ? 0x01 : 0x00);
+ break;
}
}
@@ -1159,12 +1264,12 @@ void cop400_cpu_device::state_string_export(const device_state_entry &entry, std
{
switch (entry.index())
{
- case STATE_GENFLAGS:
- str = string_format("%c%c%c",
- m_c ? 'C' : '.',
- m_skl ? 'S' : '.',
- m_skt_latch ? 'T' : '.');
- break;
+ case STATE_GENFLAGS:
+ str = string_format("%c%c%c",
+ m_c ? 'C' : '.',
+ m_skl ? 'S' : '.',
+ m_skt_latch ? 'T' : '.');
+ break;
}
}
@@ -1174,8 +1279,14 @@ offs_t cop400_cpu_device::disasm_disassemble(std::ostream &stream, offs_t pc, co
extern CPU_DISASSEMBLE( cop410 );
extern CPU_DISASSEMBLE( cop420 );
extern CPU_DISASSEMBLE( cop444 );
+ extern CPU_DISASSEMBLE( cop424 );
+
+ if ( m_featuremask & COP424C_FEATURE )
+ {
+ return CPU_DISASSEMBLE_NAME(cop424)(this, stream, pc, oprom, opram, options);
+ }
- if ( m_featuremask & COP444_FEATURE )
+ if ( m_featuremask & COP444L_FEATURE )
{
return CPU_DISASSEMBLE_NAME(cop444)(this, stream, pc, oprom, opram, options);
}
diff --git a/src/devices/cpu/cop400/cop400.h b/src/devices/cpu/cop400/cop400.h
index 693210443b1..e2ce7e6577c 100644
--- a/src/devices/cpu/cop400/cop400.h
+++ b/src/devices/cpu/cop400/cop400.h
@@ -17,40 +17,40 @@
// L pins: 8-bit bi-directional
#define MCFG_COP400_READ_L_CB(_devcb) \
- cop400_cpu_device::set_read_l_callback(*device, DEVCB_##_devcb);
+ devcb = &cop400_cpu_device::set_read_l_callback(*device, DEVCB_##_devcb);
#define MCFG_COP400_WRITE_L_CB(_devcb) \
- cop400_cpu_device::set_write_l_callback(*device, DEVCB_##_devcb);
+ devcb = &cop400_cpu_device::set_write_l_callback(*device, DEVCB_##_devcb);
// output state when pins are in tri-state, default 0
#define MCFG_COP400_READ_L_TRISTATE_CB(_devcb) \
- cop400_cpu_device::set_read_l_tristate_callback(*device, DEVCB_##_devcb);
+ devcb = &cop400_cpu_device::set_read_l_tristate_callback(*device, DEVCB_##_devcb);
// G pins: 4-bit bi-directional
#define MCFG_COP400_READ_G_CB(_devcb) \
- cop400_cpu_device::set_read_g_callback(*device, DEVCB_##_devcb);
+ devcb = &cop400_cpu_device::set_read_g_callback(*device, DEVCB_##_devcb);
#define MCFG_COP400_WRITE_G_CB(_devcb) \
- cop400_cpu_device::set_write_g_callback(*device, DEVCB_##_devcb);
+ devcb = &cop400_cpu_device::set_write_g_callback(*device, DEVCB_##_devcb);
// D outputs: 4-bit general purpose output
#define MCFG_COP400_WRITE_D_CB(_devcb) \
- cop400_cpu_device::set_write_d_callback(*device, DEVCB_##_devcb);
+ devcb = &cop400_cpu_device::set_write_d_callback(*device, DEVCB_##_devcb);
// IN inputs: 4-bit general purpose input
#define MCFG_COP400_READ_IN_CB(_devcb) \
- cop400_cpu_device::set_read_in_callback(*device, DEVCB_##_devcb);
+ devcb = &cop400_cpu_device::set_read_in_callback(*device, DEVCB_##_devcb);
// SI/SO lines: serial in/out or counter/gen.purpose
#define MCFG_COP400_READ_SI_CB(_devcb) \
- cop400_cpu_device::set_read_si_callback(*device, DEVCB_##_devcb);
+ devcb = &cop400_cpu_device::set_read_si_callback(*device, DEVCB_##_devcb);
#define MCFG_COP400_WRITE_SO_CB(_devcb) \
- cop400_cpu_device::set_write_so_callback(*device, DEVCB_##_devcb);
+ devcb = &cop400_cpu_device::set_write_so_callback(*device, DEVCB_##_devcb);
// SK output line: logic-controlled clock or gen.purpose
#define MCFG_COP400_WRITE_SK_CB(_devcb) \
- cop400_cpu_device::set_write_sk_callback(*device, DEVCB_##_devcb);
+ devcb = &cop400_cpu_device::set_write_sk_callback(*device, DEVCB_##_devcb);
// CKI/CKO lines: only CKO input here
#define MCFG_COP400_READ_CKO_CB(_devcb) \
- cop400_cpu_device::set_read_cko_callback(*device, DEVCB_##_devcb);
+ devcb = &cop400_cpu_device::set_read_cko_callback(*device, DEVCB_##_devcb);
/***************************************************************************
@@ -64,14 +64,11 @@ enum
COP400_SA,
COP400_SB,
COP400_SC,
- COP400_N,
COP400_A,
COP400_B,
COP400_C,
COP400_G,
- COP400_H,
COP400_Q,
- COP400_R,
COP400_EN,
COP400_SIO,
COP400_SKL,
@@ -87,7 +84,7 @@ enum
COP400_IN2,
COP400_IN3,
- /* COP404 */
+ /* COP404L */
COP400_MB,
COP400_DUAL,
COP400_SEL10,
@@ -194,13 +191,14 @@ protected:
enum {
COP410_FEATURE = 0x01,
COP420_FEATURE = 0x02,
- COP444_FEATURE = 0x04,
- COP440_FEATURE = 0x08
+ COP444L_FEATURE = 0x04,
+ COP424C_FEATURE = 0x08
};
enum {
TIMER_SERIAL,
TIMER_COUNTER,
+ TIMER_COUNTER_T,
TIMER_INIL
};
@@ -223,15 +221,12 @@ protected:
uint8_t m_a; /* 4-bit accumulator */
uint8_t m_b; /* 5/6/7-bit RAM address register */
int m_c; /* 1-bit carry register */
- uint8_t m_n; /* 2-bit stack pointer (COP440 only) */
uint8_t m_en; /* 4-bit enable register */
uint8_t m_g; /* 4-bit general purpose I/O port */
uint8_t m_q; /* 8-bit latch for L port */
- uint16_t m_sa, m_sb, m_sc; /* subroutine save registers (not present in COP440) */
+ uint16_t m_sa, m_sb, m_sc; /* subroutine save registers */
uint8_t m_sio; /* 4-bit shift register and counter */
int m_skl; /* 1-bit latch for SK output */
- uint8_t m_h; /* 4-bit general purpose I/O port (COP440 only) */
- uint8_t m_r; /* 8-bit general purpose I/O port (COP440 only) */
uint8_t m_flags; // used for I/O only
/* counter */
@@ -247,11 +242,11 @@ protected:
uint8_t m_si; /* serial input */
/* skipping logic */
- int m_skip; /* skip next instruction */
+ bool m_skip; /* skip next instruction */
int m_skip_lbi; /* skip until next non-LBI instruction */
- int m_last_skip; /* last value of skip */
- int m_halt; /* halt mode */
- int m_idle; /* idle mode */
+ bool m_last_skip; /* last value of skip */
+ bool m_halt; /* halt mode */
+ bool m_idle; /* idle mode */
/* execution logic */
int m_InstLen[256]; /* instruction length in bytes */
@@ -272,9 +267,12 @@ protected:
static const cop400_opcode_func COP420_OPCODE_23_MAP[256];
static const cop400_opcode_func COP420_OPCODE_33_MAP[256];
static const cop400_opcode_func COP420_OPCODE_MAP[256];
- static const cop400_opcode_func COP444_OPCODE_23_MAP[256];
- static const cop400_opcode_func COP444_OPCODE_33_MAP[256];
- static const cop400_opcode_func COP444_OPCODE_MAP[256];
+ static const cop400_opcode_func COP444L_OPCODE_23_MAP[256];
+ static const cop400_opcode_func COP444L_OPCODE_33_MAP[256];
+ static const cop400_opcode_func COP444L_OPCODE_MAP[256];
+ static const cop400_opcode_func COP424C_OPCODE_23_MAP[256];
+ static const cop400_opcode_func COP424C_OPCODE_33_MAP[256];
+ static const cop400_opcode_func COP424C_OPCODE_MAP[256];
void serial_tick();
void counter_tick();
@@ -333,7 +331,7 @@ protected:
void lbi(uint8_t opcode);
void lei(uint8_t opcode);
void xabr(uint8_t opcode);
- void cop444_xabr(uint8_t opcode);
+ void cop444l_xabr(uint8_t opcode);
void skc(uint8_t opcode);
void ske(uint8_t opcode);
void skgz(uint8_t opcode);
@@ -359,11 +357,12 @@ protected:
void cop410_op33(uint8_t opcode);
void cop420_op23(uint8_t opcode);
void cop420_op33(uint8_t opcode);
- void cop444_op23(uint8_t opcode);
- void cop444_op33(uint8_t opcode);
+ void cop444l_op23(uint8_t opcode);
+ void cop444l_op33(uint8_t opcode);
+ void cop424c_op23(uint8_t opcode);
+ void cop424c_op33(uint8_t opcode);
void skgbz(int bit);
void skmbz(int bit);
-
};
@@ -431,56 +430,92 @@ public:
/* COP444 family */
-// COP404 is a ROMless version of the COP444, which can emulate a COP410C/COP411C, COP424C/COP425C, or a COP444C/COP445C
-class cop404_cpu_device : public cop400_cpu_device
+// COP404L is a ROMless version of the COP444, which can emulate a COP410/COP411, COP424/COP425, or a COP444/COP445
+class cop404l_cpu_device : public cop400_cpu_device
{
public:
// construction/destruction
- cop404_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ cop404l_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
};
-// COP424 is functionally equivalent to COP444, with only 1K ROM and 64x4 bytes RAM
-class cop424_cpu_device : public cop400_cpu_device
+class cop444l_cpu_device : public cop400_cpu_device
{
public:
// construction/destruction
- cop424_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ cop444l_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
};
-// COP425 is a 24-pin package version of the COP424, lacking the IN ports
-class cop425_cpu_device : public cop400_cpu_device
+// COP445 is a 24-pin package version of the COP444, lacking the IN ports
+class cop445l_cpu_device : public cop400_cpu_device
{
public:
// construction/destruction
- cop425_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ cop445l_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
};
-// COP426 is a 20-pin package version of the COP424, with only L0-L7, G2-G3, D2-D3 ports
-class cop426_cpu_device : public cop400_cpu_device
+// COP404C
+class cop404c_cpu_device : public cop400_cpu_device
{
public:
// construction/destruction
- cop426_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ cop404c_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
};
-class cop444_cpu_device : public cop400_cpu_device
+// COP424C is functionally equivalent to COP444C, with only 1K ROM and 64x4 bytes RAM
+class cop424c_cpu_device : public cop400_cpu_device
{
public:
// construction/destruction
- cop444_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ cop424c_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
};
-// COP445 is a 24-pin package version of the COP444, lacking the IN ports
-class cop445_cpu_device : public cop400_cpu_device
+// COP425C is a 24-pin package version of the COP424C, lacking the IN ports
+class cop425c_cpu_device : public cop400_cpu_device
+{
+public:
+ // construction/destruction
+ cop425c_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+};
+
+
+// COP426C is a 20-pin package version of the COP424C, with only L0-L7, G2-G3, D2-D3 ports
+class cop426c_cpu_device : public cop400_cpu_device
+{
+public:
+ // construction/destruction
+ cop426c_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+};
+
+
+// COP444C
+class cop444c_cpu_device : public cop400_cpu_device
+{
+public:
+ // construction/destruction
+ cop444c_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+};
+
+
+// COP445C
+class cop445c_cpu_device : public cop400_cpu_device
{
public:
// construction/destruction
- cop445_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ cop445c_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+};
+
+
+// COP446C
+class cop446c_cpu_device : public cop400_cpu_device
+{
+public:
+ // construction/destruction
+ cop446c_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
};
@@ -491,12 +526,15 @@ extern const device_type COP402;
extern const device_type COP420;
extern const device_type COP421;
extern const device_type COP422;
-extern const device_type COP404;
-extern const device_type COP424;
-extern const device_type COP425;
-extern const device_type COP426;
-extern const device_type COP444;
-extern const device_type COP445;
-
+extern const device_type COP404L;
+extern const device_type COP444L;
+extern const device_type COP445L;
+extern const device_type COP404C;
+extern const device_type COP424C;
+extern const device_type COP425C;
+extern const device_type COP426C;
+extern const device_type COP444C;
+extern const device_type COP445C;
+extern const device_type COP446C;
#endif /* __COP400__ */
diff --git a/src/devices/cpu/cop400/cop400op.hxx b/src/devices/cpu/cop400/cop400op.hxx
index cf363be8ce6..3242973af3d 100644
--- a/src/devices/cpu/cop400/cop400op.hxx
+++ b/src/devices/cpu/cop400/cop400op.hxx
@@ -35,7 +35,7 @@ INSTRUCTION( asc )
if (A > 0xF)
{
C = 1;
- m_skip = 1;
+ m_skip = true;
A &= 0xF;
}
else
@@ -86,7 +86,7 @@ INSTRUCTION( aisc )
if (A > 0x0f)
{
- m_skip = 1;
+ m_skip = true;
A &= 0xF;
}
}
@@ -238,7 +238,7 @@ INSTRUCTION( casc )
if (A > 0xF)
{
C = 1;
- m_skip = 1;
+ m_skip = true;
A &= 0xF;
}
else
@@ -267,7 +267,7 @@ INSTRUCTION( casc )
INSTRUCTION( jid )
{
PC = (PC & 0x700) | (A << 4) | RAM_R(B);
- uint8_t operand = fetch();
+ uint8_t operand = fetch();
PC = (PC & 0x700) | operand;
}
@@ -287,7 +287,7 @@ INSTRUCTION( jid )
INSTRUCTION( jmp )
{
- uint8_t operand = fetch();
+ uint8_t operand = fetch();
PC = ((opcode & 0x07) << 8) | operand;
}
@@ -351,9 +351,9 @@ INSTRUCTION( jp )
INSTRUCTION( jsr )
{
- uint8_t operand = fetch();
+ uint8_t operand = fetch();
PUSH(PC);
- PC = ((opcode & 0x07) << 8) | operand;
+ PC = ((opcode & 0x07) << 8) | operand;
}
/*
@@ -413,7 +413,7 @@ INSTRUCTION( cop420_ret )
INSTRUCTION( retsk )
{
POP();
- m_skip = 1;
+ m_skip = true;
}
/*
@@ -431,7 +431,7 @@ INSTRUCTION( retsk )
INSTRUCTION( halt )
{
- m_halt = 1;
+ m_halt = true;
}
/*
@@ -447,8 +447,8 @@ INSTRUCTION( halt )
INSTRUCTION( it )
{
- m_halt = 1;
- m_idle = 1;
+ m_halt = true;
+ m_idle = true;
}
/***************************************************************************
@@ -553,7 +553,7 @@ INSTRUCTION( lqid )
{
PUSH(PC);
PC = (PC & 0x700) | (A << 4) | RAM_R(B);
- uint8_t operand = fetch();
+ uint8_t operand = fetch();
WRITE_Q(operand);
POP();
}
@@ -732,7 +732,7 @@ INSTRUCTION( xds )
B = B ^ r;
- if (Bd == 0x0f) m_skip = 1;
+ if (Bd == 0x0f) m_skip = true;
}
/*
@@ -767,7 +767,7 @@ INSTRUCTION( xis )
B = B ^ r;
- if (Bd == 0x00) m_skip = 1;
+ if (Bd == 0x00) m_skip = true;
}
/*
@@ -979,7 +979,7 @@ INSTRUCTION( xabr )
/*
- Processor: COP444
+ Processor: COP444L
Mnemonic: XABR
@@ -992,7 +992,7 @@ INSTRUCTION( xabr )
*/
-INSTRUCTION( cop444_xabr )
+INSTRUCTION( cop444l_xabr )
{
uint8_t Br = A & 0x07;
uint8_t Bd = B & 0x0f;
@@ -1020,7 +1020,7 @@ INSTRUCTION( cop444_xabr )
INSTRUCTION( skc )
{
- if (C == 1) m_skip = 1;
+ if (C == 1) m_skip = true;
}
/*
@@ -1038,7 +1038,7 @@ INSTRUCTION( skc )
INSTRUCTION( ske )
{
- if (A == RAM_R(B)) m_skip = 1;
+ if (A == RAM_R(B)) m_skip = true;
}
/*
@@ -1056,7 +1056,7 @@ INSTRUCTION( ske )
INSTRUCTION( skgz )
{
- if (IN_G() == 0) m_skip = 1;
+ if (IN_G() == 0) m_skip = true;
}
/*
@@ -1081,7 +1081,7 @@ INSTRUCTION( skgz )
void cop400_cpu_device::skgbz(int bit)
{
- if (!BIT(IN_G(), bit)) m_skip = 1;
+ if (!BIT(IN_G(), bit)) m_skip = true;
}
INSTRUCTION( skgbz0 ) { skgbz(0); }
@@ -1111,7 +1111,7 @@ INSTRUCTION( skgbz3 ) { skgbz(3); }
void cop400_cpu_device::skmbz(int bit)
{
- if (!BIT(RAM_R(B), bit)) m_skip = 1;
+ if (!BIT(RAM_R(B), bit)) m_skip = true;
}
INSTRUCTION( skmbz0 ) { skmbz(0); }
@@ -1137,7 +1137,7 @@ INSTRUCTION( skt )
if (m_skt_latch)
{
m_skt_latch = 0;
- m_skip = 1;
+ m_skip = true;
}
}
diff --git a/src/devices/cpu/cop400/cop410ds.cpp b/src/devices/cpu/cop400/cop410ds.cpp
index a187506d8b5..4570417538f 100644
--- a/src/devices/cpu/cop400/cop410ds.cpp
+++ b/src/devices/cpu/cop400/cop410ds.cpp
@@ -25,19 +25,19 @@ CPU_DISASSEMBLE(cop410)
if (page == 2 || page == 3) //JP pages 2,3
{
address = (uint16_t)((pc & 0x180) | (opcode & 0x7F));
- util::stream_format(stream, "JP %03x", address);
+ util::stream_format(stream, "JP %03X", address);
}
else
{
if ((opcode & 0xC0) == 0xC0) //JP other pages
{
address = (uint16_t)((pc & 0x1C0) | (opcode & 0x3F));
- util::stream_format(stream, "JP %03x", address);
+ util::stream_format(stream, "JP %03X", address);
}
else //JSRP
{
address = (uint16_t)(0x80 | (opcode & 0x3F));
- util::stream_format(stream, "JSRP %03x", address);
+ util::stream_format(stream, "JSRP %03X", address);
flags = DASMFLAG_STEP_OVER;
}
}
@@ -65,13 +65,13 @@ CPU_DISASSEMBLE(cop410)
else if (opcode >= 0x60 && opcode <= 0x61)
{
address = ((opcode & 0x01) << 8) | next_opcode;
- util::stream_format(stream, "JMP %03x", address);
+ util::stream_format(stream, "JMP %03X", address);
bytes = 2;
}
else if (opcode >= 0x68 && opcode <= 0x69)
{
address = ((opcode & 0x01) << 8) | next_opcode;
- util::stream_format(stream, "JSR %03x", address);
+ util::stream_format(stream, "JSR %03X", address);
flags = DASMFLAG_STEP_OVER;
bytes = 2;
}
diff --git a/src/devices/cpu/cop400/cop420ds.cpp b/src/devices/cpu/cop400/cop420ds.cpp
index 6281e7f53ef..39ea87ba9b4 100644
--- a/src/devices/cpu/cop400/cop420ds.cpp
+++ b/src/devices/cpu/cop400/cop420ds.cpp
@@ -25,19 +25,19 @@ CPU_DISASSEMBLE(cop420)
if (page == 2 || page == 3) //JP pages 2,3
{
address = (uint16_t)((pc & 0x380) | (opcode & 0x7F));
- util::stream_format(stream, "JP %03x", address);
+ util::stream_format(stream, "JP %03X", address);
}
else
{
if ((opcode & 0xC0) == 0xC0) //JP other pages
{
address = (uint16_t)((pc & 0x3C0) | (opcode & 0x3F));
- util::stream_format(stream, "JP %03x", address);
+ util::stream_format(stream, "JP %03X", address);
}
else //JSRP
{
address = (uint16_t)(0x80 | (opcode & 0x3F));
- util::stream_format(stream, "JSRP %03x", address);
+ util::stream_format(stream, "JSRP %03X", address);
flags = DASMFLAG_STEP_OVER;
}
}
@@ -65,13 +65,13 @@ CPU_DISASSEMBLE(cop420)
else if (opcode >= 0x60 && opcode <= 0x63)
{
address = ((opcode & 0x03) << 8) | next_opcode;
- util::stream_format(stream, "JMP %03x", address);
+ util::stream_format(stream, "JMP %03X", address);
bytes = 2;
}
else if (opcode >= 0x68 && opcode <= 0x6B)
{
address = ((opcode & 0x03) << 8) | next_opcode;
- util::stream_format(stream, "JSR %03x", address);
+ util::stream_format(stream, "JSR %03X", address);
flags = DASMFLAG_STEP_OVER;
bytes = 2;
}
diff --git a/src/devices/cpu/cop400/cop440ds.cpp b/src/devices/cpu/cop400/cop424ds.cpp
index 14489f05ab5..fc8396f4903 100644
--- a/src/devices/cpu/cop400/cop440ds.cpp
+++ b/src/devices/cpu/cop400/cop424ds.cpp
@@ -2,15 +2,15 @@
// copyright-holders:Curt Coder
/***************************************************************************
- cop440ds.c
+ cop424ds.c
- National Semiconductor COP440 Emulator.
+ National Semiconductor COP424C/COP444C Emulator.
***************************************************************************/
#include "emu.h"
-CPU_DISASSEMBLE(cop444)
+CPU_DISASSEMBLE(cop424)
{
uint8_t opcode = oprom[0];
uint8_t next_opcode = oprom[1];
@@ -25,19 +25,19 @@ CPU_DISASSEMBLE(cop444)
if (page == 2 || page == 3) //JP pages 2,3
{
address = (uint16_t)((pc & 0x780) | (opcode & 0x7F));
- util::stream_format(stream, "JP %03x", address);
+ util::stream_format(stream, "JP %03X", address);
}
else
{
if ((opcode & 0xC0) == 0xC0) //JP other pages
{
address = (uint16_t)((pc & 0x7C0) | (opcode & 0x3F));
- util::stream_format(stream, "JP %03x", address);
+ util::stream_format(stream, "JP %03X", address);
}
else //JSRP
{
address = (uint16_t)(0x80 | (opcode & 0x3F));
- util::stream_format(stream, "JSRP %03x", address);
+ util::stream_format(stream, "JSRP %03X", address);
flags = DASMFLAG_STEP_OVER;
}
}
@@ -62,16 +62,16 @@ CPU_DISASSEMBLE(cop444)
{
util::stream_format(stream, "AISC %u", opcode & 0xF);
}
- else if (opcode >= 0x60 && opcode <= 0x63)
+ else if (opcode >= 0x60 && opcode <= 0x67)
{
- address = ((opcode & 0x03) << 8) | next_opcode;
- util::stream_format(stream, "JMP %03x", address);
+ address = ((opcode & 0x07) << 8) | next_opcode;
+ util::stream_format(stream, "JMP %03X", address);
bytes = 2;
}
- else if (opcode >= 0x68 && opcode <= 0x6B)
+ else if (opcode >= 0x68 && opcode <= 0x6f)
{
- address = ((opcode & 0x03) << 8) | next_opcode;
- util::stream_format(stream, "JSR %03x", address);
+ address = ((opcode & 0x07) << 8) | next_opcode;
+ util::stream_format(stream, "JSR %03X", address);
flags = DASMFLAG_STEP_OVER;
bytes = 2;
}
@@ -162,19 +162,15 @@ CPU_DISASSEMBLE(cop444)
case 0x23:
bytes = 2;
- if (next_opcode <= 0x3f)
+ if (next_opcode <= 0x7f)
{
- address = (uint16_t)(next_opcode & 0x3F);
- util::stream_format(stream, "LDD %u,%u", ((address & 0x30) >> 4),address & 0x0F);
+ address = (uint16_t)(next_opcode & 0x7F);
+ util::stream_format(stream, "LDD %u,%u", address >> 4, address & 0x0F);
}
- else if (next_opcode >= 0x80 && next_opcode <= 0xbf)
+ else if (next_opcode >= 0x80)
{
- address = (uint16_t)(next_opcode & 0x3F);
- util::stream_format(stream, "XAD %u,%u", ((address & 0x30) >> 4),address & 0x0F);
- }
- else
- {
- util::stream_format(stream, "Invalid");
+ address = (uint16_t)(next_opcode & 0x7f);
+ util::stream_format(stream, "XAD %u,%u", address >> 4, address & 0x0F);
}
break;
@@ -217,21 +213,9 @@ CPU_DISASSEMBLE(cop444)
{
util::stream_format(stream, "LEI %u", next_opcode & 0xF);
}
- else if (next_opcode >= 0x80 && next_opcode <= 0x8F)
- {
- util::stream_format(stream, "LBI 0,%u", next_opcode & 0xF);
- }
- else if (next_opcode >= 0x90 && next_opcode <= 0x9F)
- {
- util::stream_format(stream, "LBI 1,%u", next_opcode & 0xF);
- }
- else if (next_opcode >= 0xA0 && next_opcode <= 0xAF)
- {
- util::stream_format(stream, "LBI 2,%u", next_opcode & 0xF);
- }
- else if (next_opcode >= 0xB0 && next_opcode <= 0xBF)
+ else if (next_opcode >= 0x80)
{
- util::stream_format(stream, "LBI 3,%u", next_opcode & 0xF);
+ util::stream_format(stream, "LBI %u,%u", (next_opcode >> 4) & 0x07, next_opcode & 0xF);
}
else
{
diff --git a/src/devices/cpu/cop400/cop444ds.cpp b/src/devices/cpu/cop400/cop444ds.cpp
new file mode 100644
index 00000000000..cae2274546c
--- /dev/null
+++ b/src/devices/cpu/cop400/cop444ds.cpp
@@ -0,0 +1,384 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/***************************************************************************
+
+ cop444ds.c
+
+ National Semiconductor COP444L Emulator.
+
+***************************************************************************/
+
+#include "emu.h"
+
+CPU_DISASSEMBLE(cop444)
+{
+ uint8_t opcode = oprom[0];
+ uint8_t next_opcode = oprom[1];
+ uint16_t address;
+ uint32_t flags = 0;
+ int bytes = 1;
+
+ if ((opcode >= 0x80 && opcode <= 0xBE) || (opcode >= 0xC0 && opcode <= 0xFE))
+ {
+ int page = pc >> 6;
+
+ if (page == 2 || page == 3) //JP pages 2,3
+ {
+ address = (uint16_t)((pc & 0x780) | (opcode & 0x7F));
+ util::stream_format(stream, "JP %03X", address);
+ }
+ else
+ {
+ if ((opcode & 0xC0) == 0xC0) //JP other pages
+ {
+ address = (uint16_t)((pc & 0x7C0) | (opcode & 0x3F));
+ util::stream_format(stream, "JP %03X", address);
+ }
+ else //JSRP
+ {
+ address = (uint16_t)(0x80 | (opcode & 0x3F));
+ util::stream_format(stream, "JSRP %03X", address);
+ flags = DASMFLAG_STEP_OVER;
+ }
+ }
+ }
+ else if (opcode >= 0x08 && opcode <= 0x0F)
+ {
+ util::stream_format(stream, "LBI 0,%u", ((opcode & 0xF) + 1) & 0xF);
+ }
+ else if (opcode >= 0x18 && opcode <= 0x1F)
+ {
+ util::stream_format(stream, "LBI 1,%u", ((opcode & 0xF) + 1) & 0xF);
+ }
+ else if (opcode >= 0x28 && opcode <= 0x2F)
+ {
+ util::stream_format(stream, "LBI 2,%u", ((opcode & 0xF) + 1) & 0xF);
+ }
+ else if (opcode >= 0x38 && opcode <= 0x3F)
+ {
+ util::stream_format(stream, "LBI 3,%u", ((opcode & 0xF) + 1) & 0xF);
+ }
+ else if (opcode >= 0x51 && opcode <= 0x5F)
+ {
+ util::stream_format(stream, "AISC %u", opcode & 0xF);
+ }
+ else if (opcode >= 0x60 && opcode <= 0x67)
+ {
+ address = ((opcode & 0x07) << 8) | next_opcode;
+ util::stream_format(stream, "JMP %03X", address);
+ bytes = 2;
+ }
+ else if (opcode >= 0x68 && opcode <= 0x6f)
+ {
+ address = ((opcode & 0x07) << 8) | next_opcode;
+ util::stream_format(stream, "JSR %03X", address);
+ flags = DASMFLAG_STEP_OVER;
+ bytes = 2;
+ }
+ else if (opcode >= 0x70 && opcode <= 0x7F)
+ {
+ util::stream_format(stream, "STII %u", opcode & 0xF);
+ }
+ else
+ {
+ switch (opcode)
+ {
+ case 0:
+ util::stream_format(stream, "CLRA");
+ break;
+
+ case 1:
+ util::stream_format(stream, "SKMBZ 0");
+ break;
+
+ case 2:
+ util::stream_format(stream, "XOR");
+ break;
+
+ case 3:
+ util::stream_format(stream, "SKMBZ 2");
+ break;
+
+ case 4:
+ util::stream_format(stream, "XIS 0");
+ break;
+
+ case 5:
+ util::stream_format(stream, "LD 0");
+ break;
+
+ case 6:
+ util::stream_format(stream, "X 0");
+ break;
+
+ case 7:
+ util::stream_format(stream, "XDS 0");
+ break;
+
+ case 0x10:
+ util::stream_format(stream, "CASC");
+ break;
+
+ case 0x11:
+ util::stream_format(stream, "SKMBZ 1");
+ break;
+
+ case 0x12:
+ util::stream_format(stream, "XABR");
+ break;
+
+ case 0x13:
+ util::stream_format(stream, "SKMBZ 3");
+ break;
+
+ case 0x14:
+ util::stream_format(stream, "XIS 1");
+ break;
+
+ case 0x15:
+ util::stream_format(stream, "LD 1");
+ break;
+
+ case 0x16:
+ util::stream_format(stream, "X 1");
+ break;
+
+ case 0x17:
+ util::stream_format(stream, "XDS 1");
+ break;
+
+ case 0x20:
+ util::stream_format(stream, "SKC");
+ break;
+
+ case 0x21:
+ util::stream_format(stream, "SKE");
+ break;
+
+ case 0x22:
+ util::stream_format(stream, "SC");
+ break;
+
+ case 0x23:
+ bytes = 2;
+
+ if (next_opcode <= 0x7f)
+ {
+ address = (uint16_t)(next_opcode & 0x7F);
+ util::stream_format(stream, "LDD %u,%u", address >> 4, address & 0x0F);
+ }
+ else if (next_opcode >= 0x80)
+ {
+ address = (uint16_t)(next_opcode & 0x7f);
+ util::stream_format(stream, "XAD %u,%u", address >> 4, address & 0x0F);
+ }
+ break;
+
+ case 0x24:
+ util::stream_format(stream, "XIS 2");
+ break;
+
+ case 0x25:
+ util::stream_format(stream, "LD 2");
+ break;
+
+ case 0x26:
+ util::stream_format(stream, "X 2");
+ break;
+
+ case 0x27:
+ util::stream_format(stream, "XDS 2");
+ break;
+
+ case 0x30:
+ util::stream_format(stream, "ASC");
+ break;
+
+ case 0x31:
+ util::stream_format(stream, "ADD");
+ break;
+
+ case 0x32:
+ util::stream_format(stream, "RC");
+ break;
+
+ case 0x33:
+ bytes = 2;
+
+ if (next_opcode >= 0x50 && next_opcode <= 0x5F)
+ {
+ util::stream_format(stream, "OGI %u", next_opcode & 0xF);
+ }
+ else if (next_opcode >= 0x60 && next_opcode <= 0x6F)
+ {
+ util::stream_format(stream, "LEI %u", next_opcode & 0xF);
+ }
+ else if (next_opcode >= 0x80)
+ {
+ util::stream_format(stream, "LBI %u,%u", (next_opcode >> 4) & 0x07, next_opcode & 0xF);
+ }
+ else
+ {
+ switch (next_opcode)
+ {
+ case 0x01:
+ util::stream_format(stream, "SKGBZ 0");
+ break;
+
+ case 0x03:
+ util::stream_format(stream, "SKGBZ 2");
+ break;
+
+ case 0x11:
+ util::stream_format(stream, "SKGBZ 1");
+ break;
+
+ case 0x13:
+ util::stream_format(stream, "SKGBZ 3");
+ break;
+
+ case 0x21:
+ util::stream_format(stream, "SKGZ");
+ break;
+
+ case 0x28:
+ util::stream_format(stream, "ININ");
+ break;
+
+ case 0x29:
+ util::stream_format(stream, "INIL");
+ break;
+
+ case 0x2A:
+ util::stream_format(stream, "ING");
+ break;
+
+ case 0x2C:
+ util::stream_format(stream, "CQMA");
+ break;
+
+ case 0x2E:
+ util::stream_format(stream, "INL");
+ break;
+
+ case 0x3A:
+ util::stream_format(stream, "OMG");
+ break;
+
+ case 0x3C:
+ util::stream_format(stream, "CAMQ");
+ break;
+
+ case 0x3E:
+ util::stream_format(stream, "OBD");
+ break;
+
+ default:
+ util::stream_format(stream, "Invalid");
+ break;
+ }
+ }
+ break;
+
+ case 0x34:
+ util::stream_format(stream, "XIS 3");
+ break;
+
+ case 0x35:
+ util::stream_format(stream, "LD 3");
+ break;
+
+ case 0x36:
+ util::stream_format(stream, "X 3");
+ break;
+
+ case 0x37:
+ util::stream_format(stream, "XDS 3");
+ break;
+
+ case 0x40:
+ util::stream_format(stream, "COMP");
+ break;
+
+ case 0x41:
+ util::stream_format(stream, "SKT");
+ break;
+
+ case 0x42:
+ util::stream_format(stream, "RMB 2");
+ break;
+
+ case 0x43:
+ util::stream_format(stream, "RMB 3");
+ break;
+
+ case 0x44:
+ util::stream_format(stream, "NOP");
+ break;
+
+ case 0x45:
+ util::stream_format(stream, "RMB 1");
+ break;
+
+ case 0x46:
+ util::stream_format(stream, "SMB 2");
+ break;
+
+ case 0x47:
+ util::stream_format(stream, "SMB 1");
+ break;
+
+ case 0x48:
+ util::stream_format(stream, "RET");
+ flags = DASMFLAG_STEP_OUT;
+ break;
+
+ case 0x49:
+ util::stream_format(stream, "RETSK");
+ flags = DASMFLAG_STEP_OUT;
+ break;
+
+ case 0x4A:
+ util::stream_format(stream, "ADT");
+ break;
+
+ case 0x4B:
+ util::stream_format(stream, "SMB 3");
+ break;
+
+ case 0x4C:
+ util::stream_format(stream, "RMB 0");
+ break;
+
+ case 0x4D:
+ util::stream_format(stream, "SMB 0");
+ break;
+
+ case 0x4E:
+ util::stream_format(stream, "CBA");
+ break;
+
+ case 0x4F:
+ util::stream_format(stream, "XAS");
+ break;
+
+ case 0x50:
+ util::stream_format(stream, "CAB");
+ break;
+
+ case 0xBF:
+ util::stream_format(stream, "LQID");
+ break;
+
+ case 0xFF:
+ util::stream_format(stream, "JID");
+ break;
+
+ default:
+ util::stream_format(stream, "Invalid");
+ break;
+ }
+ }
+
+ return bytes | flags | DASMFLAG_SUPPORTED;
+}
diff --git a/src/devices/cpu/cp1610/cp1610.h b/src/devices/cpu/cp1610/cp1610.h
index 545c37fbb83..17bb37c2897 100644
--- a/src/devices/cpu/cp1610/cp1610.h
+++ b/src/devices/cpu/cp1610/cp1610.h
@@ -26,7 +26,7 @@ enum
#define CP1610_INT_INTR INPUT_LINE_NMI /* Non-Maskable */
#define MCFG_CP1610_BEXT_CALLBACK(_read) \
- downcast<cp1610_cpu_device *>(device)->set_bext_callback(DEVCB_##_read);
+ devcb = &downcast<cp1610_cpu_device *>(device)->set_bext_callback(DEVCB_##_read);
class cp1610_cpu_device : public cpu_device
@@ -35,9 +35,9 @@ public:
// construction/destruction
cp1610_cpu_device(const machine_config &mconfig, const char *_tag, device_t *_owner, uint32_t _clock);
- template<class _read> void set_bext_callback(_read rd)
+ template<class _read> devcb_base &set_bext_callback(_read rd)
{
- m_read_bext.set_callback(rd);
+ return m_read_bext.set_callback(rd);
}
protected:
diff --git a/src/devices/cpu/drcbec.cpp b/src/devices/cpu/drcbec.cpp
index 28a4abdd9be..ea0a3f08f5a 100644
--- a/src/devices/cpu/drcbec.cpp
+++ b/src/devices/cpu/drcbec.cpp
@@ -1747,7 +1747,7 @@ int drcbe_c::execute(code_handle &entry)
break;
case MAKE_OPCODE_SHORT(OP_ROL, 8, 0): // DROL dst,src,count[,f]
- shift = DPARAM2 & 31;
+ shift = DPARAM2 & 63;
DPARAM0 = (DPARAM1 << shift) | (DPARAM1 >> ((64 - shift) & 63));
break;
diff --git a/src/devices/cpu/e0c6200/e0c6200.cpp b/src/devices/cpu/e0c6200/e0c6200.cpp
index a7ccf514438..e78351b19aa 100644
--- a/src/devices/cpu/e0c6200/e0c6200.cpp
+++ b/src/devices/cpu/e0c6200/e0c6200.cpp
@@ -40,7 +40,7 @@ void e0c6200_cpu_device::state_string_export(const device_state_entry &entry, st
}
}
-offs_t e0c6200_cpu_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options)
+offs_t e0c6200_cpu_device::disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options)
{
extern CPU_DISASSEMBLE(e0c6200);
return CPU_DISASSEMBLE_NAME(e0c6200)(this, stream, pc, oprom, opram, options);
diff --git a/src/devices/cpu/e0c6200/e0c6200.h b/src/devices/cpu/e0c6200/e0c6200.h
index bf43c80ad2b..4a38ae8fbf8 100644
--- a/src/devices/cpu/e0c6200/e0c6200.h
+++ b/src/devices/cpu/e0c6200/e0c6200.h
@@ -16,7 +16,7 @@ class e0c6200_cpu_device : public cpu_device
{
public:
// construction/destruction
- e0c6200_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, address_map_constructor program, address_map_constructor data, const char *shortname, const char *source)
+ e0c6200_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, address_map_constructor program, address_map_constructor data, const char *shortname, const char *source)
: cpu_device(mconfig, type, name, tag, owner, clock, shortname, source)
, m_program_config("program", ENDIANNESS_BIG, 16, 13, -1, program)
, m_data_config("data", ENDIANNESS_BIG, 8, 12, 0, data), m_program(nullptr), m_data(nullptr), m_op(0), m_prev_op(0), m_irq_vector(0), m_irq_id(0), m_possible_irq(false), m_halt(false),
@@ -29,9 +29,9 @@ protected:
virtual void device_reset() override;
// device_execute_interface overrides
- virtual uint32_t execute_min_cycles() const override { return 5; }
- virtual uint32_t execute_max_cycles() const override { return 14; } // longest opcode is 12 cycles, but interrupt service takes up to 14
- virtual uint32_t execute_input_lines() const override { return 1; }
+ virtual u32 execute_min_cycles() const override { return 5; }
+ virtual u32 execute_max_cycles() const override { return 14; } // longest opcode is 12 cycles, but interrupt service takes up to 14
+ virtual u32 execute_input_lines() const override { return 1; }
virtual void execute_run() override;
virtual void execute_one();
virtual bool check_interrupt() { return false; } // nothing to do by default
@@ -41,9 +41,9 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return(spacenum == AS_PROGRAM) ? &m_program_config : ((spacenum == AS_DATA) ? &m_data_config : nullptr); }
// device_disasm_interface overrides
- virtual uint32_t disasm_min_opcode_bytes() const override { return 2; }
- virtual uint32_t disasm_max_opcode_bytes() const override { return 2; }
- virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override;
+ virtual u32 disasm_min_opcode_bytes() const override { return 2; }
+ virtual u32 disasm_max_opcode_bytes() const override { return 2; }
+ virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options) override;
virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
address_space_config m_program_config;
@@ -51,27 +51,27 @@ protected:
address_space *m_program;
address_space *m_data;
- uint16_t m_op;
- uint16_t m_prev_op;
- uint8_t m_irq_vector; // low 4 bits for new programcounter after interrupt
- int m_irq_id; // for standard_irq_callback(id)
- bool m_possible_irq; // indicates interrupts need to be re-checked
- bool m_halt; // cpu halt state
- bool m_sleep; // cpu sleep state
+ u16 m_op;
+ u16 m_prev_op;
+ u8 m_irq_vector; // low 4 bits for new programcounter after interrupt
+ int m_irq_id; // for standard_irq_callback(id)
+ bool m_possible_irq; // indicates interrupts need to be re-checked
+ bool m_halt; // cpu halt state
+ bool m_sleep; // cpu sleep state
int m_icount;
- uint16_t m_pc; // 13-bit programcounter: 1-bit bank, 4-bit page, 8-bit 'step'
- uint16_t m_prev_pc;
- uint16_t m_npc; // new bank/page prepared by pset
- uint16_t m_jpc; // actual bank/page destination for jumps
+ u16 m_pc; // 13-bit programcounter: 1-bit bank, 4-bit page, 8-bit 'step'
+ u16 m_prev_pc;
+ u16 m_npc; // new bank/page prepared by pset
+ u16 m_jpc; // actual bank/page destination for jumps
// all work registers are 4-bit
- uint8_t m_a; // accumulator
- uint8_t m_b; // generic
- uint8_t m_xp, m_xh, m_xl; // 12-bit index register when combined
- uint8_t m_yp, m_yh, m_yl; // "
- uint8_t m_sp; // stackpointer (SPH, SPL)
- uint8_t m_f; // flags
+ u8 m_a; // accumulator
+ u8 m_b; // generic
+ u8 m_xp, m_xh, m_xl; // 12-bit index register when combined
+ u8 m_yp, m_yh, m_yl; // "
+ u8 m_sp; // stackpointer (SPH, SPL)
+ u8 m_f; // flags
enum
{
C_FLAG = 1,
@@ -81,39 +81,39 @@ protected:
};
// internal data memory read/write
- uint8_t read_mx();
- uint8_t read_my();
- uint8_t read_mn();
- void write_mx(uint8_t data);
- void write_my(uint8_t data);
- void write_mn(uint8_t data);
+ u8 read_mx();
+ u8 read_my();
+ u8 read_mn();
+ void write_mx(u8 data);
+ void write_my(u8 data);
+ void write_mn(u8 data);
// common stack ops
- void push(uint8_t data);
- uint8_t pop();
+ void push(u8 data);
+ u8 pop();
void push_pc();
void pop_pc();
// misc internal helpers
- void set_cf(uint8_t data);
- void set_zf(uint8_t data);
+ void set_cf(u8 data);
+ void set_zf(u8 data);
void inc_x();
void inc_y();
void do_branch(int condition = 1);
// opcode handlers
- uint8_t op_inc(uint8_t x);
- uint8_t op_dec(uint8_t x);
- uint8_t op_add(uint8_t x, uint8_t y, int decimal = 0);
- uint8_t op_adc(uint8_t x, uint8_t y, int decimal = 0);
- uint8_t op_sub(uint8_t x, uint8_t y, int decimal = 0);
- uint8_t op_sbc(uint8_t x, uint8_t y, int decimal = 0);
-
- uint8_t op_and(uint8_t x, uint8_t y);
- uint8_t op_or(uint8_t x, uint8_t y);
- uint8_t op_xor(uint8_t x, uint8_t y);
- uint8_t op_rlc(uint8_t x);
- uint8_t op_rrc(uint8_t x);
+ u8 op_inc(u8 x);
+ u8 op_dec(u8 x);
+ u8 op_add(u8 x, u8 y, int decimal = 0);
+ u8 op_adc(u8 x, u8 y, int decimal = 0);
+ u8 op_sub(u8 x, u8 y, int decimal = 0);
+ u8 op_sbc(u8 x, u8 y, int decimal = 0);
+
+ u8 op_and(u8 x, u8 y);
+ u8 op_or(u8 x, u8 y);
+ u8 op_xor(u8 x, u8 y);
+ u8 op_rlc(u8 x);
+ u8 op_rrc(u8 x);
};
diff --git a/src/devices/cpu/e0c6200/e0c6200d.cpp b/src/devices/cpu/e0c6200/e0c6200d.cpp
index eb8c4d55091..fde754ef051 100644
--- a/src/devices/cpu/e0c6200/e0c6200d.cpp
+++ b/src/devices/cpu/e0c6200/e0c6200d.cpp
@@ -34,7 +34,7 @@ static const char *const em_name[] =
#define _OVER DASMFLAG_STEP_OVER
#define _OUT DASMFLAG_STEP_OUT
-static const uint32_t em_flags[] =
+static const u32 em_flags[] =
{
0, _OUT, _OVER, _OVER,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -56,7 +56,7 @@ enum e_params
// 0-digit is number of bits per opcode parameter, 0 bits is literal,
// 0x10-digit is for shift-right, 0x100-digit is special flag for r/q param
-static const uint16_t ep_bits[] =
+static const u16 ep_bits[] =
{
8, 8, 4, 0x102, 0x122, 0x142, 0x102,
0, 0, 0, 0,
@@ -65,7 +65,7 @@ static const uint16_t ep_bits[] =
};
// redirect for r/q param
-static const uint8_t ep_redirect_r[4] = { ep_A, ep_B, ep_MX, ep_MY };
+static const u8 ep_redirect_r[4] = { ep_A, ep_B, ep_MX, ep_MY };
// literal opcode parameter
static const char *const ep_name[] =
@@ -77,11 +77,11 @@ static const char *const ep_name[] =
};
-static char* decode_param(uint16_t opcode, int param, char* buffer)
+static char* decode_param(u16 opcode, int param, char* buffer)
{
int bits = ep_bits[param] & 0xf;
int shift = ep_bits[param] >> 4 & 0xf;
- uint16_t opmask = opcode >> shift & ((1 << bits) - 1);
+ u16 opmask = opcode >> shift & ((1 << bits) - 1);
// redirect r/q to A/B/MX/MY
if (ep_bits[param] & 0x100)
@@ -112,7 +112,7 @@ static char* decode_param(uint16_t opcode, int param, char* buffer)
CPU_DISASSEMBLE(e0c6200)
{
- uint16_t op = (oprom[1] | oprom[0] << 8) & 0xfff;
+ u16 op = (oprom[1] | oprom[0] << 8) & 0xfff;
int m;
int p1 = -1;
diff --git a/src/devices/cpu/e0c6200/e0c6200op.cpp b/src/devices/cpu/e0c6200/e0c6200op.cpp
index ed2d4a06031..94295e43889 100644
--- a/src/devices/cpu/e0c6200/e0c6200op.cpp
+++ b/src/devices/cpu/e0c6200/e0c6200op.cpp
@@ -10,38 +10,38 @@
// MX/MY
-uint8_t e0c6200_cpu_device::read_mx()
+u8 e0c6200_cpu_device::read_mx()
{
- uint16_t address = m_xp << 8 | m_xh << 4 | m_xl;
+ u16 address = m_xp << 8 | m_xh << 4 | m_xl;
return m_data->read_byte(address) & 0xf;
}
-uint8_t e0c6200_cpu_device::read_my()
+u8 e0c6200_cpu_device::read_my()
{
- uint16_t address = m_yp << 8 | m_yh << 4 | m_yl;
+ u16 address = m_yp << 8 | m_yh << 4 | m_yl;
return m_data->read_byte(address) & 0xf;
}
-void e0c6200_cpu_device::write_mx(uint8_t data)
+void e0c6200_cpu_device::write_mx(u8 data)
{
- uint16_t address = m_xp << 8 | m_xh << 4 | m_xl;
+ u16 address = m_xp << 8 | m_xh << 4 | m_xl;
m_data->write_byte(address, data);
}
-void e0c6200_cpu_device::write_my(uint8_t data)
+void e0c6200_cpu_device::write_my(u8 data)
{
- uint16_t address = m_yp << 8 | m_yh << 4 | m_yl;
+ u16 address = m_yp << 8 | m_yh << 4 | m_yl;
m_data->write_byte(address, data);
}
// Mn(RP)
-uint8_t e0c6200_cpu_device::read_mn()
+u8 e0c6200_cpu_device::read_mn()
{
return m_data->read_byte(m_op & 0xf) & 0xf;
}
-void e0c6200_cpu_device::write_mn(uint8_t data)
+void e0c6200_cpu_device::write_mn(u8 data)
{
m_data->write_byte(m_op & 0xf, data);
}
@@ -49,12 +49,12 @@ void e0c6200_cpu_device::write_mn(uint8_t data)
// common stack ops
-void e0c6200_cpu_device::push(uint8_t data)
+void e0c6200_cpu_device::push(u8 data)
{
m_data->write_byte(--m_sp, data);
}
-uint8_t e0c6200_cpu_device::pop()
+u8 e0c6200_cpu_device::pop()
{
return m_data->read_byte(m_sp++) & 0xf;
}
@@ -70,7 +70,7 @@ void e0c6200_cpu_device::push_pc()
void e0c6200_cpu_device::pop_pc()
{
// the highest bit(bank bit) is unchanged
- uint16_t bank = m_pc & 0x1000;
+ u16 bank = m_pc & 0x1000;
m_pc = pop();
m_pc |= pop() << 4;
m_pc |= pop() << 8;
@@ -80,13 +80,13 @@ void e0c6200_cpu_device::pop_pc()
// misc internal helpers
-void e0c6200_cpu_device::set_cf(uint8_t data)
+void e0c6200_cpu_device::set_cf(u8 data)
{
// set carry flag if bit 4 is set, reset otherwise
m_f = (m_f & ~C_FLAG) | ((data & 0x10) ? C_FLAG : 0);
}
-void e0c6200_cpu_device::set_zf(uint8_t data)
+void e0c6200_cpu_device::set_zf(u8 data)
{
// set zero flag if 4-bit data is 0, reset otherwise
m_f = (m_f & ~Z_FLAG) | ((data & 0xf) ? 0 : Z_FLAG);
@@ -121,7 +121,7 @@ void e0c6200_cpu_device::do_branch(int condition)
// arithmetic instructions
-uint8_t e0c6200_cpu_device::op_inc(uint8_t x)
+u8 e0c6200_cpu_device::op_inc(u8 x)
{
// INC x: increment x (flags: C, Z)
m_icount -= 2;
@@ -130,7 +130,7 @@ uint8_t e0c6200_cpu_device::op_inc(uint8_t x)
return x & 0xf;
}
-uint8_t e0c6200_cpu_device::op_dec(uint8_t x)
+u8 e0c6200_cpu_device::op_dec(u8 x)
{
// DEC x: decrement x (flags: C, Z)
m_icount -= 2;
@@ -139,7 +139,7 @@ uint8_t e0c6200_cpu_device::op_dec(uint8_t x)
return x & 0xf;
}
-uint8_t e0c6200_cpu_device::op_add(uint8_t x, uint8_t y, int decimal)
+u8 e0c6200_cpu_device::op_add(u8 x, u8 y, int decimal)
{
// ADD x,y: add y to x (flags: C, Z)
m_icount -= 2;
@@ -157,13 +157,13 @@ uint8_t e0c6200_cpu_device::op_add(uint8_t x, uint8_t y, int decimal)
return x & 0xf;
}
-uint8_t e0c6200_cpu_device::op_adc(uint8_t x, uint8_t y, int decimal)
+u8 e0c6200_cpu_device::op_adc(u8 x, u8 y, int decimal)
{
// ADC x,y: add with carry y to x (flags: C, Z)
return op_add(x, y + (m_f & 1), decimal);
}
-uint8_t e0c6200_cpu_device::op_sub(uint8_t x, uint8_t y, int decimal)
+u8 e0c6200_cpu_device::op_sub(u8 x, u8 y, int decimal)
{
// SUB x,y: subtract y from x (flags: C, Z)
m_icount -= 2;
@@ -178,7 +178,7 @@ uint8_t e0c6200_cpu_device::op_sub(uint8_t x, uint8_t y, int decimal)
return x & 0xf;
}
-uint8_t e0c6200_cpu_device::op_sbc(uint8_t x, uint8_t y, int decimal)
+u8 e0c6200_cpu_device::op_sbc(u8 x, u8 y, int decimal)
{
// SBC x,y: subtract with carry y from x (flags: C, Z)
return op_sub(x, y + (m_f & 1), decimal);
@@ -187,7 +187,7 @@ uint8_t e0c6200_cpu_device::op_sbc(uint8_t x, uint8_t y, int decimal)
// logical instructions
-uint8_t e0c6200_cpu_device::op_and(uint8_t x, uint8_t y)
+u8 e0c6200_cpu_device::op_and(u8 x, u8 y)
{
// AND x,y: logical AND x with y (flags: Z)
m_icount -= 2;
@@ -196,7 +196,7 @@ uint8_t e0c6200_cpu_device::op_and(uint8_t x, uint8_t y)
return x;
}
-uint8_t e0c6200_cpu_device::op_or(uint8_t x, uint8_t y)
+u8 e0c6200_cpu_device::op_or(u8 x, u8 y)
{
// OR x,y: logical OR x with y (flags: Z)
m_icount -= 2;
@@ -205,7 +205,7 @@ uint8_t e0c6200_cpu_device::op_or(uint8_t x, uint8_t y)
return x;
}
-uint8_t e0c6200_cpu_device::op_xor(uint8_t x, uint8_t y)
+u8 e0c6200_cpu_device::op_xor(u8 x, u8 y)
{
// XOR x,y: exclusive-OR x with y (flags: Z)
m_icount -= 2;
@@ -214,7 +214,7 @@ uint8_t e0c6200_cpu_device::op_xor(uint8_t x, uint8_t y)
return x;
}
-uint8_t e0c6200_cpu_device::op_rlc(uint8_t x)
+u8 e0c6200_cpu_device::op_rlc(u8 x)
{
// RLC x: rotate x left through carry (flags: C, Z)
m_icount -= 2;
@@ -223,7 +223,7 @@ uint8_t e0c6200_cpu_device::op_rlc(uint8_t x)
return x & 0xf;
}
-uint8_t e0c6200_cpu_device::op_rrc(uint8_t x)
+u8 e0c6200_cpu_device::op_rrc(u8 x)
{
// RRC x: rotate x right through carry (flags: C, Z)
// note: RRC only takes 5 clock cycles
diff --git a/src/devices/cpu/e0c6200/e0c6s46.cpp b/src/devices/cpu/e0c6200/e0c6s46.cpp
index 4feed3f4e32..49a754adf33 100644
--- a/src/devices/cpu/e0c6200/e0c6s46.cpp
+++ b/src/devices/cpu/e0c6200/e0c6s46.cpp
@@ -45,7 +45,7 @@ ADDRESS_MAP_END
// device definitions
-e0c6s46_device::e0c6s46_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+e0c6s46_device::e0c6s46_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: e0c6200_cpu_device(mconfig, E0C6S46, "E0C6S46", tag, owner, clock, ADDRESS_MAP_NAME(e0c6s46_program), ADDRESS_MAP_NAME(e0c6s46_data), "e0c6s46", __FILE__)
, m_vram1(*this, "vram1")
, m_vram2(*this, "vram2"), m_osc(0), m_svd(0), m_lcd_control(0), m_lcd_contrast(0)
@@ -279,7 +279,7 @@ void e0c6s46_device::execute_set_input(int line, int state)
state = (state) ? 1 : 0;
int port = line >> 2 & 1;
- uint8_t bit = 1 << (line & 3);
+ u8 bit = 1 << (line & 3);
m_port_k[port] = (m_port_k[port] & ~bit) | (state ? bit : 0);
}
@@ -292,13 +292,13 @@ void e0c6s46_device::execute_set_input(int line, int state)
// R output ports
-void e0c6s46_device::write_r(uint8_t port, uint8_t data)
+void e0c6s46_device::write_r(u8 port, u8 data)
{
data &= 0xf;
m_port_r[port] = data;
// ports R0x-R3x can be high-impedance
- uint8_t out = data;
+ u8 out = data;
if (port < 4 && !(m_r_dir >> port & 1))
out = 0xf;
@@ -327,14 +327,14 @@ void e0c6s46_device::write_r4_out()
// R40: _FOUT(clock inverted output)
// R42: FOUT or _BZ
// R43: BZ(buzzer)
- uint8_t out = (m_port_r[4] & 2) | (m_bz_pulse << 3) | (m_bz_pulse << 2 ^ 4);
+ u8 out = (m_port_r[4] & 2) | (m_bz_pulse << 3) | (m_bz_pulse << 2 ^ 4);
m_write_r4(4, out, 0xff);
}
// P I/O ports
-void e0c6s46_device::write_p(uint8_t port, uint8_t data)
+void e0c6s46_device::write_p(u8 port, u8 data)
{
data &= 0xf;
m_port_p[port] = data;
@@ -352,7 +352,7 @@ void e0c6s46_device::write_p(uint8_t port, uint8_t data)
}
}
-uint8_t e0c6s46_device::read_p(uint8_t port)
+u8 e0c6s46_device::read_p(u8 port)
{
// return written value if port direction is set to output
if (m_p_dir >> port & 1)
@@ -416,7 +416,7 @@ void e0c6s46_device::clock_clktimer()
m_clktimer_count++;
// irq on falling edge of 32, 8, 2, 1hz
- uint8_t flag = 0;
+ u8 flag = 0;
if ((m_clktimer_count & 0x07) == 0)
flag |= 1;
if ((m_clktimer_count & 0x1f) == 0)
@@ -488,7 +488,7 @@ void e0c6s46_device::clock_prgtimer()
bool e0c6s46_device::prgtimer_reset_prescaler()
{
// only 2 to 7 are clock dividers
- uint8_t sel = m_prgtimer_select & 7;
+ u8 sel = m_prgtimer_select & 7;
if (sel >= 2)
m_prgtimer_handle->adjust(attotime::from_ticks(2 << (sel ^ 7), unscaled_clock()));
@@ -572,12 +572,12 @@ void e0c6s46_device::clock_bz_1shot()
// LCD Driver
//-------------------------------------------------
-uint32_t e0c6s46_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 e0c6s46_device::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
// call this 32 times per second (osc1/1024: 32hz at default clock of 32768hz)
for (int bank = 0; bank < 2; bank++)
{
- const uint8_t* vram = bank ? m_vram2 : m_vram1;
+ const u8* vram = bank ? m_vram2 : m_vram1;
// determine operating mode
bool lcd_on = false;
@@ -626,7 +626,7 @@ READ8_MEMBER(e0c6s46_device::io_r)
case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05:
{
// irq flags are reset(acked) when read
- uint8_t flag = m_irqflag[offset];
+ u8 flag = m_irqflag[offset];
if (!space.debugger_access())
m_irqflag[offset] = 0;
return flag;
@@ -719,7 +719,7 @@ WRITE8_MEMBER(e0c6s46_device::io_w)
// irq masks
case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15:
{
- static const uint8_t maskmask[6] = { 0xf, 3, 1, 1, 0xf, 0xf };
+ static const u8 maskmask[6] = { 0xf, 3, 1, 1, 0xf, 0xf };
m_irqmask[offset-0x10] = data & maskmask[offset-0x10];
m_possible_irq = true;
break;
diff --git a/src/devices/cpu/e0c6200/e0c6s46.h b/src/devices/cpu/e0c6200/e0c6s46.h
index 0d3ad7c250c..d4e4d0f50af 100644
--- a/src/devices/cpu/e0c6200/e0c6s46.h
+++ b/src/devices/cpu/e0c6200/e0c6s46.h
@@ -16,7 +16,7 @@
// 5 4-bit R output ports
#define MCFG_E0C6S46_WRITE_R_CB(R, _devcb) \
- e0c6s46_device::set_write_r##R##_callback(*device, DEVCB_##_devcb);
+ devcb = &e0c6s46_device::set_write_r##R##_callback(*device, DEVCB_##_devcb);
enum
{
@@ -29,9 +29,9 @@ enum
// 4 4-bit P I/O ports
#define MCFG_E0C6S46_READ_P_CB(R, _devcb) \
- hmcs40_cpu_device::set_read_r##P##_callback(*device, DEVCB_##_devcb);
+ devcb = &hmcs40_cpu_device::set_read_r##P##_callback(*device, DEVCB_##_devcb);
#define MCFG_E0C6S46_WRITE_P_CB(R, _devcb) \
- e0c6s46_device::set_write_r##P##_callback(*device, DEVCB_##_devcb);
+ devcb = &e0c6s46_device::set_write_r##P##_callback(*device, DEVCB_##_devcb);
enum
{
@@ -66,7 +66,7 @@ typedef void (*e0c6s46_pixel_update_func)(device_t &device, bitmap_ind16 &bitmap
class e0c6s46_device : public e0c6200_cpu_device
{
public:
- e0c6s46_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ e0c6s46_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
// static configuration helpers
template<class _Object> static devcb_base &set_write_r0_callback(device_t &device, _Object object) { return downcast<e0c6s46_device &>(device).m_write_r0.set_callback(object); }
@@ -89,7 +89,7 @@ public:
DECLARE_READ8_MEMBER(io_r);
DECLARE_WRITE8_MEMBER(io_w);
- uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
protected:
// device-level overrides
@@ -97,40 +97,40 @@ protected:
virtual void device_reset() override;
// device_execute_interface overrides
- virtual uint32_t execute_input_lines() const override { return 8; }
+ virtual u32 execute_input_lines() const override { return 8; }
virtual void execute_set_input(int line, int state) override;
virtual void execute_one() override;
virtual bool check_interrupt() override;
private:
- required_shared_ptr<uint8_t> m_vram1;
- required_shared_ptr<uint8_t> m_vram2;
+ required_shared_ptr<u8> m_vram1;
+ required_shared_ptr<u8> m_vram2;
- uint8_t m_irqflag[6];
- uint8_t m_irqmask[6];
- uint8_t m_osc;
- uint8_t m_svd;
+ u8 m_irqflag[6];
+ u8 m_irqmask[6];
+ u8 m_osc;
+ u8 m_svd;
- uint8_t m_lcd_control;
- uint8_t m_lcd_contrast;
+ u8 m_lcd_control;
+ u8 m_lcd_contrast;
e0c6s46_pixel_update_func m_pixel_update_handler;
// i/o ports
devcb_write8 m_write_r0, m_write_r1, m_write_r2, m_write_r3, m_write_r4;
devcb_read8 m_read_p0, m_read_p1, m_read_p2, m_read_p3;
devcb_write8 m_write_p0, m_write_p1, m_write_p2, m_write_p3;
- void write_r(uint8_t port, uint8_t data);
+ void write_r(u8 port, u8 data);
void write_r4_out();
- void write_p(uint8_t port, uint8_t data);
- uint8_t read_p(uint8_t port);
+ void write_p(u8 port, u8 data);
+ u8 read_p(u8 port);
- uint8_t m_port_r[5];
- uint8_t m_r_dir;
- uint8_t m_port_p[4];
- uint8_t m_p_dir;
- uint8_t m_p_pullup;
- uint8_t m_port_k[2];
- uint8_t m_dfk0;
+ u8 m_port_r[5];
+ u8 m_r_dir;
+ u8 m_port_p[4];
+ u8 m_p_dir;
+ u8 m_p_pullup;
+ u8 m_port_k[2];
+ u8 m_dfk0;
// timers
int m_256_src_pulse;
@@ -139,34 +139,34 @@ private:
int m_watchdog_count;
void clock_watchdog();
- uint8_t m_clktimer_count;
+ u8 m_clktimer_count;
void clock_clktimer();
- uint8_t m_stopwatch_on;
+ u8 m_stopwatch_on;
int m_swl_cur_pulse;
int m_swl_slice;
int m_swl_count;
int m_swh_count;
void clock_stopwatch();
- uint8_t m_prgtimer_select;
- uint8_t m_prgtimer_on;
+ u8 m_prgtimer_select;
+ u8 m_prgtimer_on;
int m_prgtimer_src_pulse;
int m_prgtimer_cur_pulse;
- uint8_t m_prgtimer_count;
- uint8_t m_prgtimer_reload;
+ u8 m_prgtimer_count;
+ u8 m_prgtimer_reload;
emu_timer *m_prgtimer_handle;
TIMER_CALLBACK_MEMBER(prgtimer_cb);
bool prgtimer_reset_prescaler();
void clock_prgtimer();
- uint8_t m_bz_43_on;
- uint8_t m_bz_freq;
- uint8_t m_bz_envelope;
- uint8_t m_bz_duty_ratio;
- uint8_t m_bz_1shot_on;
+ u8 m_bz_43_on;
+ u8 m_bz_freq;
+ u8 m_bz_envelope;
+ u8 m_bz_duty_ratio;
+ u8 m_bz_1shot_on;
bool m_bz_1shot_running;
- uint8_t m_bz_1shot_count;
+ u8 m_bz_1shot_count;
int m_bz_pulse;
emu_timer *m_buzzer_handle;
TIMER_CALLBACK_MEMBER(buzzer_cb);
diff --git a/src/devices/cpu/hcd62121/hcd62121.cpp b/src/devices/cpu/hcd62121/hcd62121.cpp
index 3c8e98149ea..59930adceec 100644
--- a/src/devices/cpu/hcd62121/hcd62121.cpp
+++ b/src/devices/cpu/hcd62121/hcd62121.cpp
@@ -10,6 +10,10 @@ CFX-9850 (and maybe some other things too).
This CPU core is based on the information provided by Martin Poupe.
Martin Poupe's site can be found at http://martin.poupe.org/casio/
+TODO:
+ - instruction timings
+ - unknown instructions
+
**********************************************************************/
#include "emu.h"
@@ -19,11 +23,11 @@ Martin Poupe's site can be found at http://martin.poupe.org/casio/
/* From the battery check routine at 20:e874 it looks like
bit 3 of the flag register should be the Zero flag. */
-#define _FLAG_Z 0x08
-#define _FLAG_C 0x02
-#define _FLAG_ZL 0x04
-#define _FLAG_CL 0x01
-#define _FLAG_ZH 0x10
+constexpr u8 FLAG_Z = 0x08;
+constexpr u8 FLAG_C = 0x02;
+constexpr u8 FLAG_ZL = 0x04;
+constexpr u8 FLAG_CL = 0x01;
+constexpr u8 FLAG_ZH = 0x10;
const device_type HCD62121 = &device_creator<hcd62121_cpu_device>;
@@ -32,105 +36,105 @@ const device_type HCD62121 = &device_creator<hcd62121_cpu_device>;
hcd62121_cpu_device::hcd62121_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: cpu_device(mconfig, HCD62121, "Hitachi HCD62121", tag, owner, clock, "hcd62121", __FILE__)
, m_program_config("program", ENDIANNESS_BIG, 8, 24, 0)
- , m_io_config("io", ENDIANNESS_BIG, 8, 8, 0), m_prev_pc(0)
- , m_sp(0)
+ , m_prev_pc(0)
+ , m_sp(0)
, m_ip(0)
, m_dsize(0)
, m_cseg(0)
, m_dseg(0)
, m_sseg(0)
, m_f(0)
- , m_lar(0), m_program(nullptr), m_io(nullptr), m_icount(0)
+ , m_lar(0)
+ , m_program(nullptr)
+ , m_icount(0)
+ , m_kol_cb(*this)
+ , m_koh_cb(*this)
+ , m_ki_cb(*this)
+ , m_in0_cb(*this)
{
}
-uint8_t hcd62121_cpu_device::read_op()
+u8 hcd62121_cpu_device::read_op()
{
- uint8_t d = m_program->read_byte( ( m_cseg << 16 ) | m_ip );
+ u8 d = m_program->read_byte( ( m_cseg << 16 ) | m_ip );
m_ip++;
return d;
}
-uint8_t hcd62121_cpu_device::datasize( uint8_t op )
+u8 hcd62121_cpu_device::datasize(u8 op)
{
- switch( op & 0x03 )
+ switch (op & 0x03)
{
case 0:
return 1;
case 1:
return 2;
case 2:
- return ( m_dsize >> 4 ) + 1;
+ return (m_dsize >> 4) + 1;
case 3:
- return ( m_dsize & 0x0f ) + 1;
+ return (m_dsize & 0x0f) + 1;
}
return 1;
}
-void hcd62121_cpu_device::read_reg( int size, uint8_t op1 )
+void hcd62121_cpu_device::read_reg(int size, u8 op1)
{
- int i;
-
- if ( op1 & 0x80 )
+ if (op1 & 0x80)
{
- for ( i = 0; i < size; i++ )
- m_temp1[i] = m_reg[ ( op1 - i ) & 0x7f ];
+ for (int i = 0; i < size; i++)
+ m_temp1[i] = m_reg[(op1 - i) & 0x7f];
}
else
{
- for ( i = 0; i < size; i++ )
- m_temp1[i] = m_reg[ ( op1 + i ) & 0x7f ];
+ for (int i = 0; i < size; i++)
+ m_temp1[i] = m_reg[(op1 + i) & 0x7f];
}
}
-void hcd62121_cpu_device::write_reg( int size, uint8_t op1 )
+void hcd62121_cpu_device::write_reg(int size, u8 op1)
{
- int i;
-
- if ( op1 & 0x80 )
+ if (op1 & 0x80)
{
- for ( i = 0; i < size; i++ )
- m_reg[ ( op1 - i ) & 0x7f ] = m_temp1[i];
+ for (int i = 0; i < size; i++)
+ m_reg[(op1 - i) & 0x7f] = m_temp1[i];
}
else
{
- for ( i = 0; i < size; i++ )
- m_reg[ ( op1 + i ) & 0x7f ] = m_temp1[i];
+ for (int i = 0; i < size; i++)
+ m_reg[(op1 + i) & 0x7f] = m_temp1[i];
}
}
-void hcd62121_cpu_device::read_regreg( int size, uint8_t op1, uint8_t op2, bool op_is_logical )
+void hcd62121_cpu_device::read_regreg(int size, u8 op1, u8 op2, bool op_is_logical)
{
- int i;
+ for (int i = 0; i < size; i++)
+ m_temp1[i] = m_reg[(op1 + i) & 0x7f];
- for ( i = 0; i < size; i++ )
- m_temp1[i] = m_reg[ (op1 + i) & 0x7f];
-
- if ( op1 & 0x80 )
+ if (op1 & 0x80)
{
/* Second operand is an immediate value */
m_temp2[0] = op2;
- for ( i = 1; i < size; i++ )
+ for (int i = 1; i < size; i++)
m_temp2[i] = op_is_logical ? op2 : 0;
}
else
{
/* Second operand is a register */
- for ( i = 0; i < size; i++ )
- m_temp2[i] = m_reg[ (op2 + i) & 0x7f ];
+ for (int i = 0; i < size; i++)
+ m_temp2[i] = m_reg[(op2 + i) & 0x7f];
}
- if ( ! ( op1 & 0x80 ) && ! ( op2 & 0x80 ) )
+ if (!(op1 & 0x80) && !(op2 & 0x80))
{
/* We need to swap parameters */
- for ( i = 0; i < size; i++ )
+ for (int i = 0; i < size; i++)
{
- uint8_t v = m_temp1[i];
+ u8 v = m_temp1[i];
m_temp1[i] = m_temp2[i];
m_temp2[i] = v;
}
@@ -138,57 +142,52 @@ void hcd62121_cpu_device::read_regreg( int size, uint8_t op1, uint8_t op2, bool
}
-void hcd62121_cpu_device::write_regreg( int size, uint8_t op1, uint8_t op2 )
+void hcd62121_cpu_device::write_regreg(int size, u8 op1, u8 op2)
{
- int i;
-
- if ( ( op1 & 0x80 ) || ( op2 & 0x80 ) )
+ if ((op1 & 0x80) || (op2 & 0x80))
{
/* store in reg1 */
- for ( i = 0; i < size; i++ )
- m_reg[ (op1 + i) & 0x7f] = m_temp1[i];
+ for (int i = 0; i < size; i++)
+ m_reg[(op1 + i) & 0x7f] = m_temp1[i];
}
else
{
/* store in reg2 */
- for ( i = 0; i < size; i++ )
- m_reg[ (op2 + i) & 0x7f] = m_temp1[i];
+ for (int i = 0; i < size; i++)
+ m_reg[(op2 + i) & 0x7f] = m_temp1[i];
}
}
-void hcd62121_cpu_device::read_iregreg( int size, uint8_t op1, uint8_t op2 )
+void hcd62121_cpu_device::read_iregreg(int size, u8 op1, u8 op2)
{
- int i;
- uint16_t ad;
+ u16 ad = m_reg[(0x40 | op1) & 0x7f ] | (m_reg[(0x40 | (op1 + 1)) & 0x7f] << 8);
- ad = m_reg[ ( 0x40 | op1 ) & 0x7f ] | ( m_reg[ ( 0x40 | ( op1 + 1 ) ) & 0x7f ] << 8 );
-
- for ( i = 0; i < size; i++ )
+ for (int i = 0; i < size; i++)
{
- m_temp1[i] = m_program->read_byte( ( m_dseg << 16 ) | ad );
- ad += ( op1 & 0x40 ) ? -1 : 1;
+ m_temp1[i] = m_program->read_byte((m_dseg << 16) | ad);
+ ad += (op1 & 0x40) ? -1 : 1;
}
m_lar = ad;
- if ( op1 & 0x80 )
+ if (op1 & 0x80)
{
m_temp2[0] = op2;
- for ( i = 1; i < size; i++ )
+ for (int i = 1; i < size; i++)
m_temp2[i] = 0;
}
else
{
- for ( i = 0; i < size; i++ )
- m_temp2[i] = m_reg[ (op2 + i) & 0x7f ];
+ for (int i = 0; i < size; i++)
+ m_temp2[i] = m_reg[(op2 + i) & 0x7f];
}
- if ( ! ( op1 & 0x80 ) && ! ( op2 & 0x80 ) )
+ if (!(op1 & 0x80) && !(op2 & 0x80))
{
/* We need to swap parameters */
- for ( i = 0; i < size; i++ )
+ for (int i = 0; i < size; i++)
{
- uint8_t v = m_temp1[i];
+ u8 v = m_temp1[i];
m_temp1[i] = m_temp2[i];
m_temp2[i] = v;
}
@@ -196,174 +195,170 @@ void hcd62121_cpu_device::read_iregreg( int size, uint8_t op1, uint8_t op2 )
}
-void hcd62121_cpu_device::write_iregreg( int size, uint8_t op1, uint8_t op2 )
+void hcd62121_cpu_device::write_iregreg(int size, u8 op1, u8 op2)
{
- int i;
-
- if ( ( op1 & 0x80 ) || ( op2 & 0x80 ) )
+ if ((op1 & 0x80) || (op2 & 0x80))
{
/* store in (reg1) */
- uint16_t ad = m_reg[ ( 0x40 | op1 ) & 0x7f ] | ( m_reg[ ( 0x40 | ( op1 + 1 ) ) & 0x7f ] << 8 );
+ u16 ad = m_reg[(0x40 | op1) & 0x7f] | (m_reg[(0x40 | (op1 + 1)) & 0x7f] << 8);
- for ( i = 0; i < size; i++ )
+ for (int i = 0; i < size; i++)
{
- m_program->write_byte( ( m_dseg << 16 ) | ad, m_temp1[i] );
- ad += ( op1 & 0x40 ) ? -1 : 1;
+ m_program->write_byte((m_dseg << 16) | ad, m_temp1[i]);
+ ad += (op1 & 0x40) ? -1 : 1;
}
m_lar = ad;
}
else
{
/* store in reg2 */
- for ( i = 0; i < size; i++ )
- m_reg[ (op2 + i) & 0x7f] = m_temp1[i];
+ for (int i = 0; i < size; i++)
+ m_reg[(op2 + i) & 0x7f] = m_temp1[i];
}
}
-void hcd62121_cpu_device::write_iregreg2( int size, uint8_t op1, uint8_t op2 )
+void hcd62121_cpu_device::write_iregreg2(int size, u8 op1, u8 op2)
{
- int i;
-
- if ( ( op1 & 0x80 ) || ( op2 & 0x80 ) )
+ if ((op1 & 0x80) || (op2 & 0x80))
{
/* store in reg2 */
- for ( i = 0; i < size; i++ )
- m_reg[ (op2 + i) & 0x7f] = m_temp2[i];
+ for (int i = 0; i < size; i++)
+ m_reg[(op2 + i) & 0x7f] = m_temp2[i];
}
else
{
/* store in (reg1) */
- uint16_t ad = m_reg[ ( 0x40 | op1 ) & 0x7f ] | ( m_reg[ ( 0x40 | ( op1 + 1 ) ) & 0x7f ] << 8 );
+ u16 ad = m_reg[(0x40 | op1) & 0x7f] | (m_reg[(0x40 | (op1 + 1)) & 0x7f] << 8);
- for ( i = 0; i < size; i++ )
+ for (int i = 0; i < size; i++)
{
- m_program->write_byte( ( m_dseg << 16 ) | ad, m_temp2[i] );
- ad += ( op1 & 0x40 ) ? -1 : 1;
+ m_program->write_byte((m_dseg << 16) | ad, m_temp2[i]);
+ ad += (op1 & 0x40) ? -1 : 1;
}
m_lar = ad;
}
}
-int hcd62121_cpu_device::check_cond( uint8_t op )
+bool hcd62121_cpu_device::check_cond(u8 op)
{
- switch ( op & 0x07 )
+ switch (op & 0x07)
{
case 0x00: /* ZH set */
- if ( m_f & _FLAG_ZH )
- return 1;
- break;
+ return (m_f & FLAG_ZH);
case 0x01: /* ZL set */
- if ( m_f & _FLAG_ZL )
- return 1;
- break;
+ return (m_f & FLAG_ZL);
case 0x02: /* C set */
- if ( m_f & _FLAG_C )
- return 1;
- break;
+ return (m_f & FLAG_C);
case 0x03: /* Z set */
- if ( m_f & _FLAG_Z )
- return 1;
- break;
+ return (m_f & FLAG_Z);
case 0x04: /* Z or C set */
- if ( m_f & ( _FLAG_Z | _FLAG_C ) )
- return 1;
- break;
+ return (m_f & (FLAG_Z | FLAG_C));
case 0x05: /* CL set */
- if ( m_f & _FLAG_CL )
- return 1;
- break;
+ return (m_f & FLAG_CL);
case 0x06: /* C clear */
- if ( ! ( m_f & _FLAG_C ) )
- return 1;
- break;
+ return (!(m_f & FLAG_C));
case 0x07: /* Z clear */
- if ( ! ( m_f & _FLAG_Z ) )
- return 1;
- break;
+ return (!(m_f & FLAG_Z));
}
- return 0;
+ return false;
}
void hcd62121_cpu_device::device_start()
{
m_program = &space(AS_PROGRAM);
- m_io = &space(AS_IO);
-
- save_item( NAME(m_prev_pc) );
- save_item( NAME(m_sp) );
- save_item( NAME(m_ip) );
- save_item( NAME(m_dsize) );
- save_item( NAME(m_cseg) );
- save_item( NAME(m_dseg) );
- save_item( NAME(m_sseg) );
- save_item( NAME(m_f) );
- save_item( NAME(m_lar) );
- save_item( NAME(m_reg) );
- save_item( NAME(m_temp1) );
- save_item( NAME(m_temp2) );
+
+ m_kol_cb.resolve_safe();
+ m_koh_cb.resolve_safe();
+ m_ki_cb.resolve_safe(0);
+ m_in0_cb.resolve_safe(0);
+
+ save_item(NAME(m_prev_pc));
+ save_item(NAME(m_sp));
+ save_item(NAME(m_ip));
+ save_item(NAME(m_dsize));
+ save_item(NAME(m_cseg));
+ save_item(NAME(m_dseg));
+ save_item(NAME(m_sseg));
+ save_item(NAME(m_f));
+ save_item(NAME(m_lar));
+ save_item(NAME(m_reg));
+ save_item(NAME(m_temp1));
+ save_item(NAME(m_temp2));
// Register state for debugger
- state_add( STATE_GENPC, "GENPC", m_ip ).callexport().formatstr("%8s");
- state_add( STATE_GENPCBASE,"CURPC", m_ip ).callexport().formatstr("%8s");
- state_add( STATE_GENFLAGS, "GENFLAGS", m_f ).callimport().callexport().formatstr("%12s").noshow();
-
- state_add( HCD62121_IP, "IP", m_ip ).callimport().callexport().formatstr("%04X");
- state_add( HCD62121_SP, "SP", m_sp ).callimport().callexport().formatstr("%04X");
- state_add( HCD62121_LAR, "LAR", m_lar ).callimport().callexport().formatstr("%04X");
- state_add( HCD62121_CS, "CS", m_cseg ).callimport().callexport().formatstr("%02X");
- state_add( HCD62121_DS, "DS", m_dseg ).callimport().callexport().formatstr("%02X");
- state_add( HCD62121_SS, "SS", m_sseg ).callimport().callexport().formatstr("%02X");
- state_add( HCD62121_DSIZE, "DSIZE", m_dsize ).callimport().callexport().formatstr("%02X");
- state_add( HCD62121_F, "F", m_f ).callimport().callexport().formatstr("%02X");
-
- state_add( HCD62121_R00, "R00", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R04, "R04", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R08, "R08", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R0C, "R0C", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R10, "R10", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R14, "R14", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R18, "R18", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R1C, "R1C", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R20, "R20", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R24, "R24", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R28, "R28", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R2C, "R2C", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R30, "R30", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R34, "R34", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R38, "R38", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R3C, "R3C", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R40, "R40", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R44, "R44", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R48, "R48", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R4C, "R4C", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R50, "R50", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R54, "R54", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R58, "R58", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R5C, "R5C", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R60, "R60", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R64, "R64", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R68, "R68", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R6C, "R6C", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R70, "R70", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R74, "R74", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R78, "R78", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
- state_add( HCD62121_R7C, "R7C", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
+ state_add(STATE_GENPC, "GENPC", m_rtemp).callexport().formatstr("%8s");
+ state_add(STATE_GENPCBASE,"CURPC", m_rtemp).callexport().formatstr("%8s");
+ state_add(STATE_GENFLAGS, "GENFLAGS", m_f ).callimport().callexport().formatstr("%12s").noshow();
+
+ state_add(HCD62121_IP, "IP", m_ip ).callimport().callexport().formatstr("%04X");
+ state_add(HCD62121_SP, "SP", m_sp ).callimport().callexport().formatstr("%04X");
+ state_add(HCD62121_LAR, "LAR", m_lar ).callimport().callexport().formatstr("%04X");
+ state_add(HCD62121_CS, "CS", m_cseg ).callimport().callexport().formatstr("%02X");
+ state_add(HCD62121_DS, "DS", m_dseg ).callimport().callexport().formatstr("%02X");
+ state_add(HCD62121_SS, "SS", m_sseg ).callimport().callexport().formatstr("%02X");
+ state_add(HCD62121_DSIZE, "DSIZE", m_dsize).callimport().callexport().formatstr("%02X");
+ state_add(HCD62121_F, "F", m_f ).callimport().callexport().formatstr("%02X");
+
+ state_add(HCD62121_R00, "R00", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R04, "R04", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R08, "R08", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R0C, "R0C", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R10, "R10", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R14, "R14", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R18, "R18", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R1C, "R1C", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R20, "R20", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R24, "R24", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R28, "R28", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R2C, "R2C", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R30, "R30", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R34, "R34", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R38, "R38", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R3C, "R3C", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R40, "R40", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R44, "R44", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R48, "R48", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R4C, "R4C", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R50, "R50", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R54, "R54", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R58, "R58", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R5C, "R5C", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R60, "R60", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R64, "R64", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R68, "R68", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R6C, "R6C", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R70, "R70", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R74, "R74", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R78, "R78", m_reg[0x00]).callimport().callexport().formatstr("%8s");
+ state_add(HCD62121_R7C, "R7C", m_reg[0x00]).callimport().callexport().formatstr("%8s");
m_icountptr = &m_icount;
}
+void hcd62121_cpu_device::state_export(const device_state_entry &entry)
+{
+ switch (entry.index())
+ {
+ case STATE_GENPC:
+ case STATE_GENPCBASE:
+ m_rtemp = (m_cseg << 16) | m_ip;
+ break;
+ }
+}
+
+
void hcd62121_cpu_device::state_string_export(const device_state_entry &entry, std::string &str) const
{
switch (entry.index())
@@ -375,11 +370,11 @@ void hcd62121_cpu_device::state_string_export(const device_state_entry &entry, s
case STATE_GENFLAGS:
str = string_format("%s-%s-%s-%c-%c",
- m_f & _FLAG_ZH ? "ZH":"__",
- m_f & _FLAG_CL ? "CL":"__",
- m_f & _FLAG_ZL ? "ZL":"__",
- m_f & _FLAG_C ? 'C':'_',
- m_f & _FLAG_Z ? 'Z':'_'
+ m_f & FLAG_ZH ? "ZH":"__",
+ m_f & FLAG_CL ? "CL":"__",
+ m_f & FLAG_ZL ? "ZL":"__",
+ m_f & FLAG_C ? 'C':'_',
+ m_f & FLAG_Z ? 'Z':'_'
);
break;
@@ -495,38 +490,999 @@ void hcd62121_cpu_device::device_reset()
m_f = 0;
m_dsize = 0;
- for(auto & elem : m_reg)
+ for (auto & elem : m_reg)
{
elem = 0;
}
}
+inline void hcd62121_cpu_device::set_zero_flag(bool is_zero)
+{
+ if (is_zero)
+ m_f |= FLAG_Z;
+ else
+ m_f &= ~FLAG_Z;
+}
+
+
+inline void hcd62121_cpu_device::set_carry_flag(bool is_carry)
+{
+ if (is_carry)
+ m_f |= FLAG_C;
+ else
+ m_f &= ~FLAG_C;
+}
+
+
+inline void hcd62121_cpu_device::set_zl_flag(bool is_zl)
+{
+ if (is_zl)
+ m_f |= FLAG_ZL;
+ else
+ m_f &= ~FLAG_ZL;
+}
+
+
+inline void hcd62121_cpu_device::set_zh_flag(bool is_zh)
+{
+ if (is_zh)
+ m_f |= FLAG_ZH;
+ else
+ m_f &= ~FLAG_ZH;
+}
+
+
+inline void hcd62121_cpu_device::set_cl_flag(bool is_cl)
+{
+ if (is_cl)
+ m_f |= FLAG_CL;
+ else
+ m_f &= ~FLAG_CL;
+}
+
+
+inline void hcd62121_cpu_device::op_msk(int size)
+{
+ bool mskres = true;
+
+ for (int i = 0; i < size; i++)
+ {
+ if ((m_temp1[i] & m_temp2[i]) != m_temp2[i])
+ mskres = false;
+ }
+
+ set_zero_flag(!mskres);
+}
+
+
+inline void hcd62121_cpu_device::op_imsk(int size)
+{
+ bool mskres = true;
+ bool set_zero = false;
+
+ for (int i = 0; i < size; i++)
+ {
+ if ((m_temp1[i] & ~m_temp2[i]) != ~m_temp2[i])
+ mskres = false;
+ if (m_temp1[i] | m_temp2[i])
+ set_zero = true;
+ }
+
+ set_zero_flag(set_zero);
+ set_carry_flag(!mskres);
+}
+
+
+inline void hcd62121_cpu_device::op_and(int size)
+{
+ bool is_zero = true;
+
+ for (int i = 0; i < size; i++)
+ {
+ m_temp1[i] = m_temp1[i] & m_temp2[i];
+ if (m_temp1[i])
+ is_zero = false;
+ }
+
+ set_zero_flag(is_zero);
+ set_zl_flag((m_temp1[0] & 0x0f) == 0);
+ set_zh_flag((m_temp1[0] & 0xf0) == 0);
+}
+
+
+inline void hcd62121_cpu_device::op_or(int size)
+{
+ bool is_zero = true;
+
+ for (int i = 0; i < size; i++)
+ {
+ m_temp1[i] = m_temp1[i] | m_temp2[i];
+ if (m_temp1[i])
+ is_zero = false;
+ }
+
+ set_zero_flag(is_zero);
+ set_zl_flag((m_temp1[0] & 0x0f) == 0);
+ set_zh_flag((m_temp1[0] & 0xf0) == 0);
+}
+
+
+inline void hcd62121_cpu_device::op_xor(int size)
+{
+ bool is_zero = true;
+
+ for (int i = 0; i < size; i++)
+ {
+ m_temp1[i] = m_temp1[i] ^ m_temp2[i];
+ if (m_temp1[i])
+ is_zero = false;
+ }
+
+ set_zero_flag(is_zero);
+ set_zl_flag((m_temp1[0] & 0x0f) == 0);
+ set_zh_flag((m_temp1[0] & 0xf0) == 0);
+}
+
+
+inline void hcd62121_cpu_device::op_add(int size)
+{
+ bool is_zero = true;
+ u8 carry = 0;
+
+ set_cl_flag((m_temp1[0] & 0x0f) + (m_temp2[0] & 0x0f) > 15);
+
+ for (int i = 0; i < size; i++)
+ {
+ u16 res = m_temp1[i] + m_temp2[i] + carry;
+
+ m_temp1[i] = res & 0xff;
+ if (m_temp1[i])
+ is_zero = false;
+
+ carry = (res & 0xff00) ? 1 : 0;
+ }
+
+ set_zero_flag(is_zero);
+ set_carry_flag(carry);
+ set_zl_flag((m_temp1[0] & 0x0f) == 0);
+ set_zh_flag((m_temp1[0] & 0xf0) == 0);
+}
+
+
+// BCD ADD
+inline void hcd62121_cpu_device::op_addb(int size)
+{
+ bool is_zero = true;
+ u8 carry = 0;
+
+ set_cl_flag((m_temp1[0] & 0x0f) + (m_temp2[0] & 0x0f) > 9);
+
+ for (int i = 0; i < size; i++)
+ {
+ u16 res = (m_temp1[i] & 0x0f) + (m_temp2[i] & 0x0f) + carry;
+
+ if (res > 9)
+ {
+ res += 6;
+ }
+ res += (m_temp1[i] & 0xf0) + (m_temp2[i] & 0xf0);
+ if (res > 0x9f)
+ {
+ res += 0x60;
+ }
+ m_temp1[i] = res & 0xff;
+ if (m_temp1[i])
+ is_zero = false;
+
+ carry = (res & 0xff00) ? 1 : 0;
+ }
+
+ set_zero_flag(is_zero);
+ set_carry_flag(carry);
+ set_zl_flag((m_temp1[0] & 0x0f) == 0);
+ set_zh_flag((m_temp1[0] & 0xf0) == 0);
+}
+
+
+inline void hcd62121_cpu_device::op_sub(int size)
+{
+ bool is_zero = true;
+ u8 carry = 0;
+
+ set_cl_flag((m_temp1[0] & 0x0f) < (m_temp2[0] & 0x0f));
+
+ for (int i = 0; i < size; i++)
+ {
+ u16 res = m_temp1[i] - m_temp2[i] - carry;
+
+ m_temp1[i] = res & 0xff;
+ if (m_temp1[i])
+ is_zero = false;
+
+ carry = ( res & 0xff00 ) ? 1 : 0;
+ }
+
+ set_zero_flag(is_zero);
+ set_carry_flag(carry);
+ set_zl_flag((m_temp1[0] & 0x0f) == 0);
+ set_zh_flag((m_temp1[0] & 0xf0) == 0);
+}
+
+
+inline void hcd62121_cpu_device::op_pushw(u16 source)
+{
+ m_program->write_byte(( m_sseg << 16) | m_sp, source & 0xff);
+ m_sp--;
+ m_program->write_byte(( m_sseg << 16) | m_sp, source >> 8);
+ m_sp--;
+}
+
+
+inline u16 hcd62121_cpu_device::op_popw()
+{
+ m_sp++;
+ u16 res = m_program->read_byte((m_sseg << 16) | m_sp) << 8;
+ m_sp++;
+ res |= m_program->read_byte((m_sseg << 16) | m_sp);
+
+ return res;
+}
+
+
void hcd62121_cpu_device::execute_run()
{
do
{
- uint32_t pc = ( m_cseg << 16 ) | m_ip;
- uint8_t op;
+ offs_t pc = (m_cseg << 16) | m_ip;
debugger_instruction_hook(this, pc);
m_prev_pc = pc;
- op = read_op();
+ u8 op = read_op();
+ // actual instruction timings unknown
m_icount -= 4;
- switch ( op )
+ switch (op)
{
-#include "hcd62121_ops.h"
+ case 0x04: /* mskb r1,r2 */
+ case 0x05: /* mskw r1,r2 */
+ case 0x06: /* mskq r1,r2 */
+ case 0x07: /* mskt r1,r2 */
+ {
+ int size = datasize(op);
+ u8 reg1 = read_op();
+ u8 reg2 = read_op();
+
+ read_regreg(size, reg1, reg2, false);
+
+ op_msk(size);
+ }
+ break;
+
+ case 0x08: /* shb r1,4 */
+ case 0x09: /* shw r1,4 */
+ case 0x0A: /* shq r1,4 */
+ case 0x0B: /* sht r1,4 */
+ /* Shift is a nibble shift! */
+ {
+ int size = datasize(op);
+ u8 reg1 = read_op();
+ u8 d1 = 0, d2 = 0;
+
+ read_reg(size, reg1);
+
+ for (int i = 0; i < size; i++)
+ {
+ if (reg1 & 0x80)
+ {
+ d1 = (m_temp1[i] & 0x0f) << 4;
+ m_temp1[i] = (m_temp1[i] >> 4) | d2;
+ }
+ else
+ {
+ d1 = (m_temp1[i] & 0xf0) >> 4;
+ m_temp1[i] = (m_temp1[i] << 4) | d2;
+ }
+ d2 = d1;
+ }
+
+ write_reg(size, reg1);
+ }
+ break;
+
+ case 0x0C: /* testb r1,r2 */
+ case 0x0D: /* testw r1,r2 */
+ case 0x0E: /* testq r1,r2 */
+ case 0x0F: /* testt r1,r2 */
+ {
+ int size = datasize(op);
+ u8 reg1 = read_op();
+ u8 reg2 = read_op();
+
+ read_regreg(size, reg1, reg2, false);
+
+ op_and(size);
+ }
+ break;
+
+ case 0x10: /* xorb r1,r2 */
+ case 0x11: /* xorw r1,r2 */
+ case 0x12: /* xorq r1,r2 */
+ case 0x13: /* xort r1,r2 */
+ {
+ int size = datasize(op);
+ u8 reg1 = read_op();
+ u8 reg2 = read_op();
+
+ read_regreg(size, reg1, reg2, false);
+
+ op_xor(size);
+
+ write_regreg(size, reg1, reg2);
+ }
+ break;
+
+ case 0x14: /* cmpb r1,r2 */
+ case 0x15: /* cmpw r1,r2 */
+ case 0x16: /* cmpq r1,r2 */
+ case 0x17: /* cmpt r1,r2 */
+ {
+ int size = datasize(op);
+ u8 reg1 = read_op();
+ u8 reg2 = read_op();
+
+ read_regreg(size, reg1, reg2, false);
+
+ op_sub(size);
+ }
+ break;
+
+ case 0x18: /* movb r1,r2 */
+ case 0x19: /* movw r1,r2 */
+ case 0x1A: /* movq r1,r2 */
+ case 0x1B: /* movt r1,r2 */
+ {
+ int size = datasize(op);
+ u8 reg1 = read_op();
+ u8 reg2 = read_op();
+
+ read_regreg(size, reg1, reg2, false);
+
+ for (int i = 0; i < size; i++)
+ m_temp1[i] = m_temp2[i];
+
+ write_regreg(size, reg1, reg2);
+ }
+ break;
+
+ case 0x1C: /* imskb r1,r2 */
+ case 0x1D: /* imskw r1,r2 */
+ case 0x1E: /* imskq r1,r2 */
+ case 0x1F: /* imskt r1,r2 */
+ {
+ int size = datasize(op);
+ u8 reg1 = read_op();
+ u8 reg2 = read_op();
+
+ read_regreg(size, reg1, reg2, false);
+
+ op_imsk(size);
+ }
+ break;
+
+ case 0x20: /* shrb r1 */
+ case 0x21: /* shrw r1 */
+ case 0x22: /* shrq r1 */
+ case 0x23: /* shrt r1 */
+ /* Shift is a single shift! */
+ {
+ int size = datasize(op);
+ u8 reg1 = read_op();
+ u8 d1 = 0, d2 = 0;
+
+ read_reg(size, reg1);
+
+ for (int i = 0; i < size; i++)
+ {
+ d1 = (m_temp1[i] & 0x01) << 7;
+ m_temp1[i] = (m_temp1[i] >> 1) | d2;
+ d2 = d1;
+ }
+
+ write_reg(size, reg1);
+ }
+ break;
+
+ case 0x24: /* orb r1,r2 */
+ case 0x25: /* orw r1,r2 */
+ case 0x26: /* orq r1,r2 */
+ case 0x27: /* ort r1,r2 */
+ {
+ int size = datasize(op);
+ u8 reg1 = read_op();
+ u8 reg2 = read_op();
+
+ read_regreg(size, reg1, reg2, false);
+
+ op_or(size);
+
+ write_regreg(size, reg1, reg2);
+ }
+ break;
+
+ case 0x28: /* shlb r1 */
+ case 0x29: /* shlw r1 */
+ case 0x2A: /* shlq r1 */
+ case 0x2B: /* shlt r1 */
+ /* Shift is a single shift! */
+ {
+ int size = datasize(op);
+ u8 reg1 = read_op();
+ u8 d1 = 0, d2 = 0;
+
+ read_reg(size, reg1);
+
+ for (int i = 0; i < size; i++)
+ {
+ d1 = (m_temp1[i] & 0x80) >> 7;
+ m_temp1[i] = (m_temp1[i] << 1) | d2;
+ d2 = d1;
+ }
+
+ write_reg(size, reg1);
+ }
+ break;
+
+ case 0x2C: /* andb r1,r2 */
+ case 0x2D: /* andw r1,r2 */
+ case 0x2E: /* andq r1,r2 */
+ case 0x2F: /* andt r1,r2 */
+ {
+ int size = datasize(op);
+ u8 reg1 = read_op();
+ u8 reg2 = read_op();
+
+ read_regreg(size, reg1, reg2, true);
+
+ op_and(size);
+
+ write_regreg(size, reg1, reg2);
+ }
+ break;
+
+ case 0x34: /* subb r1,r2 */
+ case 0x35: /* subw r1,r2 */
+ case 0x36: /* subq r1,r2 */
+ case 0x37: /* subt r1,r2 */
+ {
+ int size = datasize(op);
+ u8 reg1 = read_op();
+ u8 reg2 = read_op();
+
+ read_regreg(size, reg1, reg2, false);
+
+ op_sub(size);
+
+ write_regreg(size, reg1, reg2);
+ }
+ break;
+
+ case 0x38: /* adbb r1,r2 */
+ case 0x39: /* adbw r1,r2 */
+ case 0x3A: /* adbq r1,r2 */
+ case 0x3B: /* adbt r1,r2 */
+ {
+ int size = datasize(op);
+ u8 reg1 = read_op();
+ u8 reg2 = read_op();
+
+ read_regreg(size, reg1, reg2, false);
+
+ op_addb(size);
+
+ write_regreg(size, reg1, reg2);
+ }
+ break;
+
+ case 0x3C: /* addb r1,r2 */
+ case 0x3D: /* addw r1,r2 */
+ case 0x3E: /* addq r1,r2 */
+ case 0x3F: /* addt r1,r2 */
+ {
+ int size = datasize(op);
+ u8 reg1 = read_op();
+ u8 reg2 = read_op();
+
+ read_regreg(size, reg1, reg2, false);
+
+ op_add(size);
+
+ write_regreg(size, reg1, reg2);
+ }
+ break;
+
+ case 0x4C: /* testb ir1,r2 */
+ case 0x4D: /* testw ir1,r2 */
+ case 0x4E: /* testq ir1,r2 */
+ case 0x4F: /* testt ir1,r2 */
+ {
+ int size = datasize(op);
+ u8 reg1 = read_op();
+ u8 reg2 = read_op();
+
+ read_iregreg(size, reg1, reg2);
+
+ op_and(size);
+ }
+ break;
+
+ case 0x54: /* cmpb ir1,r2 */
+ case 0x55: /* cmpw ir1,r2 */
+ case 0x56: /* cmpq ir1,r2 */
+ case 0x57: /* cmpt ir1,r2 */
+ {
+ int size = datasize(op);
+ u8 reg1 = read_op();
+ u8 reg2 = read_op();
+
+ read_iregreg(size, reg1, reg2);
+
+ op_sub(size);
+ }
+ break;
+
+ case 0x58: /* movb ir1,r2 */
+ case 0x59: /* movw ir1,r2 */
+ case 0x5A: /* movq ir1,r2 */
+ case 0x5B: /* movt ir1,r2 */
+ {
+ int size = datasize(op);
+ u8 reg1 = read_op();
+ u8 reg2 = read_op();
+
+ read_iregreg(size, reg1, reg2);
+
+ for (int i = 0; i < size; i++)
+ m_temp1[i] = m_temp2[i];
+
+ write_iregreg(size, reg1, reg2);
+ }
+ break;
+
+ case 0x64: /* orb ir1,r2 */
+ case 0x65: /* orb ir1,r2 */
+ case 0x66: /* orb ir1,r2 */
+ case 0x67: /* orb ir1,r2 */
+ {
+ int size = datasize(op);
+ u8 reg1 = read_op();
+ u8 reg2 = read_op();
+
+ read_iregreg(size, reg1, reg2);
+
+ op_or(size);
+
+ write_iregreg(size, reg1, reg2);
+ }
+ break;
+
+ case 0x6C: /* andb ir1,r2 */
+ case 0x6D: /* andw ir1,r2 */
+ case 0x6E: /* andq ir1,r2 */
+ case 0x6F: /* andt ir1,r2 */
+ {
+ int size = datasize(op);
+ u8 reg1 = read_op();
+ u8 reg2 = read_op();
+
+ read_iregreg(size, reg1, reg2);
+
+ op_and(size);
+
+ write_iregreg(size, reg1, reg2);
+ }
+ break;
+
+ case 0x7C: /* addb ir1,r2 */
+ case 0x7D: /* addw ir1,r2 */
+ case 0x7E: /* addq ir1,r2 */
+ case 0x7F: /* addt ir1,r2 */
+ {
+ int size = datasize(op);
+ u8 reg1 = read_op();
+ u8 reg2 = read_op();
+
+ read_iregreg(size, reg1, reg2);
+
+ op_add(size);
+
+ write_iregreg(size, reg1, reg2);
+ }
+ break;
+
+ case 0x88: /* jump _a16 */
+ m_ip = (read_op() << 8) | read_op();
+ break;
+
+ case 0x89: /* jumpf cs:a16 */
+ {
+ u8 cs = read_op();
+ u8 a1 = read_op();
+ u8 a2 = read_op();
+
+ m_cseg = cs;
+ m_ip = (a1 << 8) | a2;
+ }
+ break;
+
+ case 0x8A: /* call a16 */
+ {
+ u8 a1 = read_op();
+ u8 a2 = read_op();
+
+ op_pushw(m_ip);
+
+ m_ip = (a1 << 8) | a2;
+ }
+ break;
+
+ case 0x8C: /* unk_8C */
+ case 0x8D: /* unk_8D */
+ case 0x8E: /* unk_8E */
+ logerror("%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op);
+ break;
+
+ case 0x90: /* retzh */
+ case 0x91: /* retzl */
+ case 0x92: /* retc */
+ case 0x93: /* retz */
+ case 0x94: /* retzc */
+ case 0x95: /* retcl */
+ case 0x96: /* retnc */
+ case 0x97: /* retnz */
+ if (check_cond(op))
+ m_ip = op_popw();
+ break;
+
+ case 0x98: /* jump (r1) */
+ {
+ u8 reg1 = read_op();
+ u16 ad = m_reg[(reg1 | 0x40) & 0x7f] << 8;
+
+ if (reg1 & 0x40)
+ ad |= m_reg[((reg1 - 1) | 0x40) & 0x7f];
+ else
+ ad |= m_reg[((reg1 + 1) | 0x40) & 0x7f];
+
+ m_ip = ad;
+ }
+ break;
+
+ case 0x9F: /* ret */
+ m_ip = op_popw();
+ break;
+
+ case 0xA0: /* jmpzh a16 */
+ case 0xA1: /* jmpzl a16 */
+ case 0xA2: /* jmpc a16 */
+ case 0xA3: /* jmpz a16 */
+ case 0xA4: /* jmpzc a16 */
+ case 0xA5: /* jmpcl a16 */
+ case 0xA6: /* jmpnc a16 */
+ case 0xA7: /* jmpnz a16 */
+ {
+ u8 a1 = read_op();
+ u8 a2 = read_op();
+
+ if (check_cond(op))
+ m_ip = (a1 << 8) | a2;
+ }
+ break;
+
+ case 0xA8: /* callzh a16 */
+ case 0xA9: /* callzl a16 */
+ case 0xAA: /* callc a16 */
+ case 0xAB: /* callz a16 */
+ case 0xAC: /* callzc a16 */
+ case 0xAD: /* callcl a16 */
+ case 0xAE: /* callnc a16 */
+ case 0xAF: /* callnz a16 */
+ {
+ u8 a1 = read_op();
+ u8 a2 = read_op();
+
+ if (check_cond(op))
+ {
+ op_pushw(m_ip);
+
+ m_ip = (a1 << 8) | a2;
+ }
+ }
+ break;
+
+ case 0xB1: /* unk_B1 reg/i8 */
+ case 0xB3: /* unk_B3 reg/i8 */
+ logerror("%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op);
+ read_op();
+ break;
+
+ case 0xB4: /* out koh,reg */
+ m_koh_cb(m_reg[read_op() & 0x7f]);
+ break;
+
+ case 0xB5: /* out koh,i8 */
+ m_koh_cb(read_op());
+ break;
+
+ case 0xB6: /* out kol,reg */
+ m_kol_cb(m_reg[read_op() & 0x7f]);
+ break;
+
+ case 0xB7: /* out kol,i8 */
+ m_kol_cb(read_op());
+ break;
+
+ case 0xB9: /* unk_B9 reg/i8 */
+ logerror("%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op);
+ read_op();
+ break;
+
+ case 0xBB: /* jmpcl? a16 */
+ logerror("%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op);
+ {
+ u8 a1 = read_op();
+ u8 a2 = read_op();
+
+ if (m_f & FLAG_CL)
+ m_ip = ( a1 << 8) | a2;
+ }
+ break;
+
+ case 0xBF: /* jmpncl? a16 */
+ logerror("%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op);
+ {
+ u8 a1 = read_op();
+ u8 a2 = read_op();
+
+ if (!(m_f & FLAG_CL))
+ m_ip = (a1 << 8) | a2;
+ }
+ break;
+
+ case 0xC0: /* movb reg,i8 */
+ case 0xC1: /* movw reg,i16 */
+ case 0xC2: /* movw reg,i64 */
+ case 0xC3: /* movw reg,i80 */
+ {
+ int size = datasize(op);
+ u8 reg = read_op();
+
+ for (int i = 0; i < size; i++)
+ {
+ m_reg[(reg + i) & 0x7f] = read_op();
+ }
+ }
+ break;
+
+ case 0xC4: /* movb (lar),r1 / r1,(lar) */
+ case 0xC5: /* movw (lar),r1 / r1,(lar) */
+ case 0xC6: /* movq (lar),r1 / r1,(lar) */
+ case 0xC7: /* movt (lar),r1 / r1,(lar) */
+ {
+ int size = datasize(op);
+ u8 reg1 = read_op();
+ u8 reg2 = read_op();
+ int pre_inc = 0;
+ int post_inc = 1;
+
+ switch (reg1 & 0x60)
+ {
+ case 0x00:
+ pre_inc = 0;
+ post_inc = 1;
+ break;
+ case 0x20:
+ pre_inc = 1;
+ post_inc = 0;
+ break;
+ case 0x40:
+ pre_inc = 0;
+ post_inc = -1;
+ break;
+ case 0x60:
+ pre_inc = -1;
+ post_inc = 0;
+ break;
+ }
+
+ if ((reg1 & 0x80) || (reg2 & 0x80))
+ {
+ /* (lar) <- r1 */
+ for (int i = 0; i < size; i++)
+ {
+ m_lar += pre_inc;
+ m_program->write_byte((m_dseg << 16) | m_lar, m_reg[(reg2 + i) & 0x7f]);
+ m_lar += post_inc;
+ }
+ }
+ else
+ {
+ /* r1 <- (lar) */
+ for (int i = 0; i < size; i++)
+ {
+ m_lar += pre_inc;
+ m_reg[(reg2 + i) & 0x7f] = m_program->read_byte((m_dseg << 16) | m_lar);
+ m_lar += post_inc;
+ }
+ }
+ }
+ break;
+
+ case 0xCC: /* swapb ir1,r2 */
+ case 0xCD: /* swapw ir1,r2 */
+ case 0xCE: /* swapq ir1,r2 */
+ case 0xCF: /* swapt ir1,r2? */
+ {
+ int size = datasize(op);
+ u8 reg1 = read_op();
+ u8 reg2 = read_op();
+
+ read_iregreg(size, reg1, reg2);
+
+ for (int i = 0; i < size; i++)
+ {
+ u8 d = m_temp1[i];
+ m_temp1[i] = m_temp2[i];
+ m_temp2[i] = d;
+ }
+
+ write_iregreg(size, reg1, reg2);
+ write_iregreg2(size, reg1, reg2);
+ }
+ break;
+
+ case 0xD0: /* movb cs,reg */
+ m_cseg = m_reg[read_op() & 0x7f];
+ break;
+
+ case 0xD1: /* movb cs,i8 */
+ m_cseg = read_op();
+ break;
+
+ case 0xD2: /* movb dsize,reg */
+ m_dsize = m_reg[read_op() & 0x7f];
+ break;
+
+ case 0xD3: /* movb dsize,i8 */
+ m_dsize = read_op();
+ break;
+
+ case 0xD4: /* movb ss,reg */
+ m_sseg = m_reg[read_op() & 0x7f];
+ break;
+
+ case 0xD5: /* movb ss,i8 */
+ m_sseg = read_op();
+ break;
+
+ case 0xD6: /* movw sp,reg */
+ {
+ u8 reg1 = read_op();
+
+ m_sp = m_reg[reg1 & 0x7f] | (m_reg[(reg1 + 1) & 0x7f] << 8);
+ }
+ break;
+
+ case 0xD7: /* movw sp,i16 */
+ m_sp = read_op() << 8;
+ m_sp |= read_op();
+ break;
+
+ case 0xD8: /* movb f,reg */
+ m_f = m_reg[read_op() & 0x7f];
+ break;
+
+ case 0xD9: /* movb f,i8 */
+ m_f = read_op();
+ break;
+
+ case 0xDC: /* movb ds,reg */
+ m_dseg = m_reg[read_op() & 0x7f];
+ break;
+
+ case 0xDD: /* movb ds,i8 */
+ m_dseg = read_op();
+ break;
+
+ case 0xDE: /* movw lar,reg */
+ {
+ u8 reg1 = read_op();
+
+ m_lar = m_reg[reg1 & 0x7f] | (m_reg[( reg1 + 1) & 0x7f] << 8);
+ }
+ break;
+
+ case 0xE0: /* in0 reg */
+ {
+ u8 reg1 = read_op();
+
+ m_reg[reg1 & 0x7f] = m_in0_cb();
+ }
+ break;
+
+ case 0xE1: /* unk_E1 reg/i8 (in?) */
+ logerror("%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op);
+ read_op();
+ break;
+
+ case 0xE2: /* in kb, reg */
+ m_reg[read_op() & 0x7f] = m_ki_cb();
+ break;
+
+ case 0xE3: /* unk_e3 reg/i8 (in?) */
+ case 0xE4: /* unk_e4 reg/i8 (in?) */
+ case 0xE5: /* unk_e5 reg/i8 (in?) */
+ case 0xE6: /* unk_e6 reg/i8 (in?) */
+ case 0xE7: /* unk_e7 reg/i8 (in?) */
+ logerror("%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op);
+ read_op();
+ break;
+
+ case 0xE8: /* movw r1,lar */
+ {
+ u8 reg1 = read_op();
+
+ m_reg[reg1 & 0x7f] = m_lar & 0xff;
+ m_reg[(reg1 + 1) & 0x7f] = m_lar >> 8;
+ }
+ break;
+
+ case 0xEB: /* movw reg,ss */
+ {
+ u8 reg1 = read_op();
+
+ m_reg[reg1 & 0x7f] = m_sp & 0xff;
+ m_reg[(reg1 + 1) & 0x7f] = m_sp >> 8;
+ }
+ break;
+
+ case 0xEF: /* movb reg,ss */
+ m_reg[read_op() & 0x7f] = m_sseg;
+ break;
+
+ case 0xF0: /* unk_F0 reg/i8 (out?) */
+ case 0xF1: /* unk_F1 reg/i8 (out?) */
+ case 0xF2: /* unk_F2 reg/i8 (out?) */
+ case 0xF3: /* unk_F3 reg/i8 (out?) */
+ case 0xF4: /* unk_F4 reg/i8 (out?) */
+ case 0xF5: /* unk_F5 reg/i8 (out?) */
+ case 0xF6: /* unk_F6 reg/i8 (out?) */
+ case 0xF7: /* unk_F7 reg/i8 (out?) */
+ logerror("%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op);
+ read_op();
+ break;
+
+ case 0xFC: /* unk_FC - disable interrupts?? */
+ case 0xFD: /* unk_FD */
+ case 0xFE: /* unk_FE */
+ logerror("%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op);
+ break;
+
+ case 0xFF: /* nop */
+ break;
+
+ default:
+ fatalerror("%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op);
};
} while (m_icount > 0);
}
-offs_t hcd62121_cpu_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options)
+offs_t hcd62121_cpu_device::disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, uint32_t options)
{
- extern CPU_DISASSEMBLE( hcd62121 );
+ extern CPU_DISASSEMBLE(hcd62121);
return CPU_DISASSEMBLE_NAME(hcd62121)(this, stream, pc, oprom, opram, options);
}
diff --git a/src/devices/cpu/hcd62121/hcd62121.h b/src/devices/cpu/hcd62121/hcd62121.h
index af105c2a3a3..a7dd123f051 100644
--- a/src/devices/cpu/hcd62121/hcd62121.h
+++ b/src/devices/cpu/hcd62121/hcd62121.h
@@ -20,17 +20,10 @@ enum
};
-/* I/O ports */
-enum
-{
- /* Output ports */
- HCD62121_KOL=0x00,
- HCD62121_KOH,
- /* Input ports */
- HCD62121_KI,
- /* Other I/O ports */
- HCD62121_IN0
-};
+#define MCFG_HCD62121_KOL_CB(_devcb) devcb = &hcd62121_cpu_device::set_kol_callback(*device, DEVCB_##_devcb);
+#define MCFG_HCD62121_KOH_CB(_devcb) devcb = &hcd62121_cpu_device::set_koh_callback(*device, DEVCB_##_devcb);
+#define MCFG_HCD62121_KI_CB(_devcb) devcb = &hcd62121_cpu_device::set_ki_callback(*device, DEVCB_##_devcb);
+#define MCFG_HCD62121_IN0_CB(_devcb) devcb = &hcd62121_cpu_device::set_in0_callback(*device, DEVCB_##_devcb);
class hcd62121_cpu_device : public cpu_device
@@ -39,58 +32,85 @@ public:
// construction/destruction
hcd62121_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template<class _Object> static devcb_base &set_kol_callback(device_t &device, _Object object) { return downcast<hcd62121_cpu_device &>(device).m_kol_cb.set_callback(object); }
+ template<class _Object> static devcb_base &set_koh_callback(device_t &device, _Object object) { return downcast<hcd62121_cpu_device &>(device).m_koh_cb.set_callback(object); }
+ template<class _Object> static devcb_base &set_ki_callback(device_t &device, _Object object) { return downcast<hcd62121_cpu_device &>(device).m_ki_cb.set_callback(object); }
+ template<class _Object> static devcb_base &set_in0_callback(device_t &device, _Object object) { return downcast<hcd62121_cpu_device &>(device).m_in0_cb.set_callback(object); }
+
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
// device_execute_interface overrides
- virtual uint32_t execute_min_cycles() const override { return 4; }
- virtual uint32_t execute_max_cycles() const override { return 48; }
- virtual uint32_t execute_input_lines() const override { return 2; }
+ virtual u32 execute_min_cycles() const override { return 4; }
+ virtual u32 execute_max_cycles() const override { return 48; }
+ virtual u32 execute_input_lines() const override { return 2; }
virtual void execute_run() override;
// device_memory_interface overrides
- virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO) ? &m_io_config : nullptr ); }
+ virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return (spacenum == AS_PROGRAM) ? &m_program_config : nullptr; }
// device_state_interface overrides
+ virtual void state_export(const device_state_entry &entry) override;
virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
- virtual uint32_t disasm_min_opcode_bytes() const override { return 1; }
- virtual uint32_t disasm_max_opcode_bytes() const override { return 18; }
- virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override;
-
- uint8_t read_op();
- uint8_t datasize( uint8_t op );
- void read_reg( int size, uint8_t op1 );
- void write_reg( int size, uint8_t op1 );
- void read_regreg( int size, uint8_t op1, uint8_t op2, bool op_is_logical );
- void write_regreg( int size, uint8_t op1, uint8_t op2 );
- void read_iregreg( int size, uint8_t op1, uint8_t op2 );
- void write_iregreg( int size, uint8_t op1, uint8_t op2 );
- void write_iregreg2( int size, uint8_t op1, uint8_t op2 );
- int check_cond( uint8_t op );
+ virtual u32 disasm_min_opcode_bytes() const override { return 1; }
+ virtual u32 disasm_max_opcode_bytes() const override { return 18; }
+ virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options) override;
+
+private:
+ u8 read_op();
+ u8 datasize(u8 op);
+ void read_reg(int size, u8 op1);
+ void write_reg(int size, u8 op1);
+ void read_regreg(int size, u8 op1, u8 op2, bool op_is_logical);
+ void write_regreg(int size, u8 op1, u8 op2);
+ void read_iregreg(int size, u8 op1, u8 op2);
+ void write_iregreg(int size, u8 op1, u8 op2);
+ void write_iregreg2(int size, u8 op1, u8 op2);
+ bool check_cond(u8 op);
+ void set_zero_flag(bool is_zero);
+ void set_carry_flag(bool is_carry);
+ void set_zl_flag(bool is_zl);
+ void set_zh_flag(bool is_zh);
+ void set_cl_flag(bool is_cl);
+ void op_msk(int size);
+ void op_imsk(int size);
+ void op_and(int size);
+ void op_or(int size);
+ void op_xor(int size);
+ void op_add(int size);
+ void op_addb(int size);
+ void op_sub(int size);
+ void op_pushw(u16 source);
+ u16 op_popw();
address_space_config m_program_config;
- address_space_config m_io_config;
-
- uint32_t m_prev_pc;
- uint16_t m_sp;
- uint16_t m_ip;
- uint8_t m_dsize;
- uint8_t m_cseg;
- uint8_t m_dseg;
- uint8_t m_sseg;
- uint8_t m_f;
- uint16_t m_lar;
- uint8_t m_reg[0x80];
- uint8_t m_temp1[0x10];
- uint8_t m_temp2[0x10];
+
+ u32 m_prev_pc;
+ u16 m_sp;
+ u16 m_ip;
+ u8 m_dsize;
+ u8 m_cseg;
+ u8 m_dseg;
+ u8 m_sseg;
+ u8 m_f;
+ u16 m_lar;
+ u8 m_reg[0x80];
+ u8 m_temp1[0x10];
+ u8 m_temp2[0x10];
+ u32 m_rtemp;
address_space *m_program;
- address_space *m_io;
+
int m_icount;
+
+ devcb_write8 m_kol_cb;
+ devcb_write8 m_koh_cb;
+ devcb_read8 m_ki_cb;
+ devcb_read8 m_in0_cb;
};
diff --git a/src/devices/cpu/hcd62121/hcd62121_ops.h b/src/devices/cpu/hcd62121/hcd62121_ops.h
deleted file mode 100644
index 57c1f6b7d52..00000000000
--- a/src/devices/cpu/hcd62121/hcd62121_ops.h
+++ /dev/null
@@ -1,1022 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Wilbert Pol
-
-#define HCD62121_MSK \
- { \
- int i; \
- uint8_t mskres = 1; \
- \
- for ( i = 0; i < size; i++ ) \
- { \
- if ( ( m_temp1[i] & m_temp2[i] ) != m_temp2[i] ) \
- mskres = 0; \
- } \
- \
- if ( mskres ) \
- m_f &= ~_FLAG_Z; \
- else \
- m_f |= _FLAG_Z; \
- }
-
-#define HCD62121_IMSK \
- { \
- int i; \
- uint8_t mskres = 1; \
- uint8_t set_zero = 0; \
- \
- for ( i = 0; i < size; i++ ) \
- { \
- if ( ( m_temp1[i] & ~m_temp2[i] ) != ~m_temp2[i] ) \
- mskres = 0; \
- if ( m_temp1[i] | m_temp2[i] ) \
- set_zero = 1; \
- } \
- \
- if ( set_zero ) \
- m_f |= _FLAG_Z; \
- else \
- m_f &= ~_FLAG_Z; \
- \
- if ( mskres ) \
- m_f &= ~_FLAG_C; \
- else \
- m_f |= _FLAG_C; \
- }
-
-
-#define HCD62121_AND \
- { \
- int i; \
- uint8_t is_zero = 1; \
- \
- for ( i = 0; i < size; i++ ) \
- { \
- m_temp1[i] = m_temp1[i] & m_temp2[i]; \
- if ( m_temp1[i] ) \
- is_zero = 0; \
- } \
- \
- if ( is_zero ) \
- m_f |= _FLAG_Z; \
- else \
- m_f &= ~_FLAG_Z; \
- \
- if ( m_temp1[0] & 0x0f ) \
- m_f &= ~_FLAG_ZL; \
- else \
- m_f |= _FLAG_ZL; \
- \
- if ( m_temp1[0] & 0xf0 ) \
- m_f &= ~_FLAG_ZH; \
- else \
- m_f |= _FLAG_ZH; \
- }
-
-#define HCD62121_OR \
- { \
- int i; \
- uint8_t is_zero = 1; \
- \
- for ( i = 0; i < size; i++ ) \
- { \
- m_temp1[i] = m_temp1[i] | m_temp2[i]; \
- if ( m_temp1[i] ) \
- is_zero = 0; \
- } \
- \
- if ( is_zero ) \
- m_f |= _FLAG_Z; \
- else \
- m_f &= ~_FLAG_Z; \
- \
- if ( m_temp1[0] & 0x0f ) \
- m_f &= ~_FLAG_ZL; \
- else \
- m_f |= _FLAG_ZL; \
- \
- if ( m_temp1[0] & 0xf0 ) \
- m_f &= ~_FLAG_ZH; \
- else \
- m_f |= _FLAG_ZH; \
- }
-
-#define HCD62121_XOR \
- { \
- int i; \
- uint8_t is_zero = 1; \
- \
- for ( i = 0; i < size; i++ ) \
- { \
- m_temp1[i] = m_temp1[i] ^ m_temp2[i]; \
- if ( m_temp1[i] ) \
- is_zero = 0; \
- } \
- \
- if ( is_zero ) \
- m_f |= _FLAG_Z; \
- else \
- m_f &= ~_FLAG_Z; \
- \
- if ( m_temp1[0] & 0x0f ) \
- m_f &= ~_FLAG_ZL; \
- else \
- m_f |= _FLAG_ZL; \
- \
- if ( m_temp1[0] & 0xf0 ) \
- m_f &= ~_FLAG_ZH; \
- else \
- m_f |= _FLAG_ZH; \
- }
-
-#define HCD62121_ADD \
- { \
- int i; \
- uint8_t is_zero = 1, carry = 0; \
- \
- if ( ( m_temp1[0] & 0x0f ) + ( m_temp2[0] & 0x0f ) > 15 ) \
- m_f |= _FLAG_CL; \
- else \
- m_f &= ~_FLAG_CL; \
- \
- for ( i = 0; i < size; i++ ) \
- { \
- uint16_t res = m_temp1[i] + m_temp2[i] + carry; \
- \
- m_temp1[i] = res & 0xff; \
- if ( m_temp1[i] ) \
- is_zero = 0; \
- \
- carry = ( res & 0xff00 ) ? 1 : 0; \
- } \
- \
- if ( is_zero ) \
- m_f |= _FLAG_Z; \
- else \
- m_f &= ~_FLAG_Z; \
- \
- if ( carry ) \
- m_f |= _FLAG_C; \
- else \
- m_f &= ~_FLAG_C; \
- \
- if ( m_temp1[0] & 0x0f ) \
- m_f &= ~_FLAG_ZL; \
- else \
- m_f |= _FLAG_ZL; \
- \
- if ( m_temp1[0] & 0xf0 ) \
- m_f &= ~_FLAG_ZH; \
- else \
- m_f |= _FLAG_ZH; \
- }
-
-/* BCD ADD */
-#define HCD62121_ADDB \
- { \
- int i; \
- uint8_t is_zero = 1, carry = 0; \
- \
- if ( ( m_temp1[0] & 0x0f ) + ( m_temp2[0] & 0x0f ) > 9 ) \
- m_f |= _FLAG_CL; \
- else \
- m_f &= ~_FLAG_CL; \
- \
- for ( i = 0; i < size; i++ ) \
- { \
- uint16_t res = ( m_temp1[i] & 0x0f ) + ( m_temp2[i] & 0x0f ) + carry; \
- \
- if ( res > 9 ) \
- { \
- res += 6; \
- } \
- res += ( m_temp1[i] & 0xf0 ) + ( m_temp2[i] & 0xf0 ); \
- if ( res > 0x9f ) \
- { \
- res += 0x60; \
- } \
- m_temp1[i] = res & 0xff; \
- if ( m_temp1[i] ) \
- is_zero = 0; \
- \
- carry = ( res & 0xff00 ) ? 1 : 0; \
- } \
- \
- if ( is_zero ) \
- m_f |= _FLAG_Z; \
- else \
- m_f &= ~_FLAG_Z; \
- \
- if ( carry ) \
- m_f |= _FLAG_C; \
- else \
- m_f &= ~_FLAG_C; \
- \
- if ( m_temp1[0] & 0x0f ) \
- m_f &= ~_FLAG_ZL; \
- else \
- m_f |= _FLAG_ZL; \
- \
- if ( m_temp1[0] & 0xf0 ) \
- m_f &= ~_FLAG_ZH; \
- else \
- m_f |= _FLAG_ZH; \
- }
-
-#define HCD62121_SUB \
- { \
- int i; \
- uint8_t is_zero = 1, carry = 0; \
- \
- if ( ( m_temp1[0] & 0x0f ) < ( m_temp2[0] & 0x0f ) ) \
- m_f |= _FLAG_CL; \
- else \
- m_f &= ~_FLAG_CL; \
- \
- for ( i = 0; i < size; i++ ) \
- { \
- uint16_t res = m_temp1[i] - m_temp2[i] - carry; \
- \
- m_temp1[i] = res & 0xff; \
- if ( m_temp1[i] ) \
- is_zero = 0; \
- \
- carry = ( res & 0xff00 ) ? 1 : 0; \
- } \
- \
- if ( is_zero ) \
- m_f |= _FLAG_Z; \
- else \
- m_f &= ~_FLAG_Z; \
- \
- if ( carry ) \
- m_f |= _FLAG_C; \
- else \
- m_f &= ~_FLAG_C; \
- \
- if ( m_temp1[0] & 0x0f ) \
- m_f &= ~_FLAG_ZL; \
- else \
- m_f |= _FLAG_ZL; \
- \
- if ( m_temp1[0] & 0xf0 ) \
- m_f &= ~_FLAG_ZH; \
- else \
- m_f |= _FLAG_ZH; \
- }
-
-#define HCD62121_PUSHW(source) \
- { \
- uint16_t address = source; \
- m_program->write_byte( ( m_sseg << 16 ) | m_sp, ( address ) & 0xff ); \
- m_sp--; \
- m_program->write_byte( ( m_sseg << 16 ) | m_sp, ( address ) >> 8 ); \
- m_sp--; \
- }
-
-#define HCD62121_POPW(dest) \
- { \
- uint16_t res; \
- m_sp++; \
- res = m_program->read_byte( ( m_sseg << 16 ) | m_sp ) << 8; \
- m_sp++; \
- res |= m_program->read_byte( ( m_sseg << 16 ) | m_sp ); \
- dest = res; \
- }
-
-case 0x04: /* mskb r1,r2 */
-case 0x05: /* mskw r1,r2 */
-case 0x06: /* mskq r1,r2 */
-case 0x07: /* mskt r1,r2 */
- {
- int size = datasize( op );
- uint8_t reg1 = read_op();
- uint8_t reg2 = read_op();
-
- read_regreg( size, reg1, reg2, false );
-
- HCD62121_MSK;
- }
- break;
-
-case 0x08: /* shb r1,4 */
-case 0x09: /* shw r1,4 */
-case 0x0A: /* shq r1,4 */
-case 0x0B: /* sht r1,4 */
- /* Shift is a nibble shift! */
- {
- int i;
- int size = datasize( op );
- uint8_t reg1 = read_op();
- uint8_t d1 = 0, d2 = 0;
-
- read_reg( size, reg1 );
-
- for ( i = 0; i < size; i++ )
- {
- if ( reg1 & 0x80 )
- {
- d1 = ( m_temp1[i] & 0x0f ) << 4;
- m_temp1[i] = ( m_temp1[i] >> 4 ) | d2;
- }
- else
- {
- d1 = ( m_temp1[i] & 0xf0 ) >> 4;
- m_temp1[i] = ( m_temp1[i] << 4 ) | d2;
- }
- d2 = d1;
- }
-
- write_reg( size, reg1 );
- }
- break;
-
-case 0x0C: /* testb r1,r2 */
-case 0x0D: /* testw r1,r2 */
-case 0x0E: /* testq r1,r2 */
-case 0x0F: /* testt r1,r2 */
- {
- int size = datasize( op );
- uint8_t reg1 = read_op();
- uint8_t reg2 = read_op();
-
- read_regreg( size, reg1, reg2, false );
-
- HCD62121_AND;
- }
- break;
-
-case 0x10: /* xorb r1,r2 */
-case 0x11: /* xorw r1,r2 */
-case 0x12: /* xorq r1,r2 */
-case 0x13: /* xort r1,r2 */
- {
- int size = datasize( op );
- uint8_t reg1 = read_op();
- uint8_t reg2 = read_op();
-
- read_regreg( size, reg1, reg2, false );
-
- HCD62121_XOR;
-
- write_regreg( size, reg1, reg2 );
- }
- break;
-
-case 0x14: /* cmpb r1,r2 */
-case 0x15: /* cmpw r1,r2 */
-case 0x16: /* cmpq r1,r2 */
-case 0x17: /* cmpt r1,r2 */
- {
- int size = datasize( op );
- uint8_t reg1 = read_op();
- uint8_t reg2 = read_op();
-
- read_regreg( size, reg1, reg2, false );
-
- HCD62121_SUB;
- }
- break;
-
-case 0x18: /* movb r1,r2 */
-case 0x19: /* movw r1,r2 */
-case 0x1A: /* movq r1,r2 */
-case 0x1B: /* movt r1,r2 */
- {
- int i;
- int size = datasize( op );
- uint8_t reg1 = read_op();
- uint8_t reg2 = read_op();
-
- read_regreg( size, reg1, reg2, false );
-
- for ( i = 0; i < size; i++ )
- m_temp1[i] = m_temp2[i];
-
- write_regreg( size, reg1, reg2 );
- }
- break;
-
-case 0x1C: /* imskb r1,r2 */
-case 0x1D: /* imskw r1,r2 */
-case 0x1E: /* imskq r1,r2 */
-case 0x1F: /* imskt r1,r2 */
- {
- int size = datasize( op );
- uint8_t reg1 = read_op();
- uint8_t reg2 = read_op();
-
- read_regreg( size, reg1, reg2, false );
-
- HCD62121_IMSK;
- }
- break;
-
-case 0x20: /* shrb r1 */
-case 0x21: /* shrw r1 */
-case 0x22: /* shrq r1 */
-case 0x23: /* shrt r1 */
- /* Shift is a single shift! */
- {
- int i;
- int size = datasize( op );
- uint8_t reg1 = read_op();
- uint8_t d1 = 0, d2 = 0;
-
- read_reg( size, reg1 );
-
- for ( i = 0; i < size; i++ )
- {
- d1 = ( m_temp1[i] & 0x01 ) << 7;
- m_temp1[i] = ( m_temp1[i] >> 1 ) | d2;
- d2 = d1;
- }
-
- write_reg( size, reg1 );
- }
- break;
-
-case 0x24: /* orb r1,r2 */
-case 0x25: /* orw r1,r2 */
-case 0x26: /* orq r1,r2 */
-case 0x27: /* ort r1,r2 */
- {
- int size = datasize( op );
- uint8_t reg1 = read_op();
- uint8_t reg2 = read_op();
-
- read_regreg( size, reg1, reg2, false );
-
- HCD62121_OR;
-
- write_regreg( size, reg1, reg2 );
- }
- break;
-
-case 0x28: /* shlb r1 */
-case 0x29: /* shlw r1 */
-case 0x2A: /* shlq r1 */
-case 0x2B: /* shlt r1 */
- /* Shift is a single shift! */
- {
- int i;
- int size = datasize( op );
- uint8_t reg1 = read_op();
- uint8_t d1 = 0, d2 = 0;
-
- read_reg( size, reg1 );
-
- for ( i = 0; i < size; i++ )
- {
- d1 = ( m_temp1[i] & 0x80 ) >> 7;
- m_temp1[i] = ( m_temp1[i] << 1 ) | d2;
- d2 = d1;
- }
-
- write_reg( size, reg1 );
- }
- break;
-
-case 0x2C: /* andb r1,r2 */
-case 0x2D: /* andw r1,r2 */
-case 0x2E: /* andq r1,r2 */
-case 0x2F: /* andt r1,r2 */
- {
- int size = datasize( op );
- uint8_t reg1 = read_op();
- uint8_t reg2 = read_op();
-
- read_regreg( size, reg1, reg2, true );
-
- HCD62121_AND;
-
- write_regreg( size, reg1, reg2 );
- }
- break;
-
-case 0x34: /* subb r1,r2 */
-case 0x35: /* subw r1,r2 */
-case 0x36: /* subq r1,r2 */
-case 0x37: /* subt r1,r2 */
- {
- int size = datasize( op );
- uint8_t reg1 = read_op();
- uint8_t reg2 = read_op();
-
- read_regreg( size, reg1, reg2, false );
-
- HCD62121_SUB;
-
- write_regreg( size, reg1, reg2 );
- }
- break;
-
-case 0x38: /* adbb r1,r2 */
-case 0x39: /* adbw r1,r2 */
-case 0x3A: /* adbq r1,r2 */
-case 0x3B: /* adbt r1,r2 */
- {
- int size = datasize( op );
- uint8_t reg1 = read_op();
- uint8_t reg2 = read_op();
-
- read_regreg( size, reg1, reg2, false );
-
- HCD62121_ADDB;
-
- write_regreg( size, reg1, reg2 );
- }
- break;
-
-case 0x3C: /* addb r1,r2 */
-case 0x3D: /* addw r1,r2 */
-case 0x3E: /* addq r1,r2 */
-case 0x3F: /* addt r1,r2 */
- {
- int size = datasize( op );
- uint8_t reg1 = read_op();
- uint8_t reg2 = read_op();
-
- read_regreg( size, reg1, reg2, false );
-
- HCD62121_ADD;
-
- write_regreg( size, reg1, reg2 );
- }
- break;
-
-case 0x4C: /* testb ir1,r2 */
-case 0x4D: /* testw ir1,r2 */
-case 0x4E: /* testq ir1,r2 */
-case 0x4F: /* testt ir1,r2 */
- {
- int size = datasize( op );
- uint8_t reg1 = read_op();
- uint8_t reg2 = read_op();
-
- read_iregreg( size, reg1, reg2 );
-
- HCD62121_AND;
- }
- break;
-
-case 0x54: /* cmpb ir1,r2 */
-case 0x55: /* cmpw ir1,r2 */
-case 0x56: /* cmpq ir1,r2 */
-case 0x57: /* cmpt ir1,r2 */
- {
- int size = datasize( op );
- uint8_t reg1 = read_op();
- uint8_t reg2 = read_op();
-
- read_iregreg( size, reg1, reg2 );
-
- HCD62121_SUB;
- }
- break;
-
-case 0x58: /* movb ir1,r2 */
-case 0x59: /* movw ir1,r2 */
-case 0x5A: /* movq ir1,r2 */
-case 0x5B: /* movt ir1,r2 */
- {
- int i;
- int size = datasize( op );
- uint8_t reg1 = read_op();
- uint8_t reg2 = read_op();
-
- read_iregreg( size, reg1, reg2 );
-
- for ( i = 0; i < size; i++ )
- m_temp1[i] = m_temp2[i];
-
- write_iregreg( size, reg1, reg2 );
- }
- break;
-
-case 0x64: /* orb ir1,r2 */
-case 0x65: /* orb ir1,r2 */
-case 0x66: /* orb ir1,r2 */
-case 0x67: /* orb ir1,r2 */
- {
- int size = datasize( op );
- uint8_t reg1 = read_op();
- uint8_t reg2 = read_op();
-
- read_iregreg( size, reg1, reg2 );
-
- HCD62121_OR;
-
- write_iregreg( size, reg1, reg2 );
- }
- break;
-
-case 0x6C: /* andb ir1,r2 */
-case 0x6D: /* andw ir1,r2 */
-case 0x6E: /* andq ir1,r2 */
-case 0x6F: /* andt ir1,r2 */
- {
- int size = datasize( op );
- uint8_t reg1 = read_op();
- uint8_t reg2 = read_op();
-
- read_iregreg( size, reg1, reg2 );
-
- HCD62121_AND;
-
- write_iregreg( size, reg1, reg2 );
- }
- break;
-
-case 0x7C: /* addb ir1,r2 */
-case 0x7D: /* addw ir1,r2 */
-case 0x7E: /* addq ir1,r2 */
-case 0x7F: /* addt ir1,r2 */
- {
- int size = datasize( op );
- uint8_t reg1 = read_op();
- uint8_t reg2 = read_op();
-
- read_iregreg( size, reg1, reg2 );
-
- HCD62121_ADD;
-
- write_iregreg( size, reg1, reg2 );
- }
- break;
-
-case 0x88: /* jump _a16 */
- m_ip = ( read_op() << 8 ) | read_op();
- break;
-
-case 0x89: /* jumpf cs:a16 */
- {
- uint8_t cs = read_op();
- uint8_t a1 = read_op();
- uint8_t a2 = read_op();
-
- m_cseg = cs;
- m_ip = ( a1 << 8 ) | a2;
- }
- break;
-
-case 0x8A: /* call a16 */
- {
- uint8_t a1 = read_op();
- uint8_t a2 = read_op();
-
- HCD62121_PUSHW( m_ip );
-
- m_ip = ( a1 << 8 ) | a2;
- }
- break;
-
-case 0x8C: /* unk_8C */
-case 0x8D: /* unk_8D */
-case 0x8E: /* unk_8E */
- logerror( "%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op );
- break;
-
-case 0x90: /* retzh */
-case 0x91: /* retzl */
-case 0x92: /* retc */
-case 0x93: /* retz */
-case 0x94: /* retzc */
-case 0x95: /* retcl */
-case 0x96: /* retnc */
-case 0x97: /* retnz */
- if ( check_cond( op ) )
- HCD62121_POPW( m_ip );
- break;
-
-case 0x98: /* jump (r1) */
- {
- uint8_t reg1 = read_op();
- uint16_t ad = m_reg[ ( reg1 | 0x40 ) & 0x7f ] << 8;
-
- if ( reg1 & 0x40 )
- ad |= m_reg[ ( ( reg1 - 1 ) | 0x40 ) & 0x7f ];
- else
- ad |= m_reg[ ( ( reg1 + 1 ) | 0x40 ) & 0x7f ];
-
- m_ip = ad;
- }
- break;
-
-case 0x9F: /* ret */
- HCD62121_POPW( m_ip );
- break;
-
-case 0xA0: /* jmpzh a16 */
-case 0xA1: /* jmpzl a16 */
-case 0xA2: /* jmpc a16 */
-case 0xA3: /* jmpz a16 */
-case 0xA4: /* jmpzc a16 */
-case 0xA5: /* jmpcl a16 */
-case 0xA6: /* jmpnc a16 */
-case 0xA7: /* jmpnz a16 */
- {
- uint8_t a1 = read_op();
- uint8_t a2 = read_op();
-
- if ( check_cond( op ) )
- m_ip = ( a1 << 8 ) | a2;
- }
- break;
-
-case 0xA8: /* callzh a16 */
-case 0xA9: /* callzl a16 */
-case 0xAA: /* callc a16 */
-case 0xAB: /* callz a16 */
-case 0xAC: /* callzc a16 */
-case 0xAD: /* callcl a16 */
-case 0xAE: /* callnc a16 */
-case 0xAF: /* callnz a16 */
- {
- uint8_t a1 = read_op();
- uint8_t a2 = read_op();
-
- if ( check_cond( op ) )
- {
- HCD62121_PUSHW( m_ip );
-
- m_ip = ( a1 << 8 ) | a2;
- }
- }
- break;
-
-case 0xB1: /* unk_B1 reg/i8 */
-case 0xB3: /* unk_B3 reg/i8 */
- logerror( "%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op );
- read_op();
- break;
-
-case 0xB4: /* out koh,reg */
- m_io->write_byte( HCD62121_KOH, m_reg[ read_op() & 0x7f ] );
- break;
-
-case 0xB5: /* out koh,i8 */
- m_io->write_byte( HCD62121_KOH, read_op() );
- break;
-
-case 0xB6: /* out kol,reg */
- m_io->write_byte( HCD62121_KOL, m_reg[ read_op() & 0x7f ] );
- break;
-
-case 0xB7: /* out kol,i8 */
- m_io->write_byte( HCD62121_KOL, read_op() );
- break;
-
-case 0xB9: /* unk_B9 reg/i8 */
- logerror( "%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op );
- read_op();
- break;
-
-case 0xBB: /* jmpcl? a16 */
- logerror( "%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op );
- {
- uint8_t a1 = read_op();
- uint8_t a2 = read_op();
-
- if ( m_f & _FLAG_CL )
- m_ip = ( a1 << 8 ) | a2;
- }
- break;
-
-case 0xBF: /* jmpncl? a16 */
- logerror( "%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op );
- {
- uint8_t a1 = read_op();
- uint8_t a2 = read_op();
-
- if ( ! ( m_f & _FLAG_CL ) )
- m_ip = ( a1 << 8 ) | a2;
- }
- break;
-
-case 0xC0: /* movb reg,i8 */
-case 0xC1: /* movw reg,i16 */
-case 0xC2: /* movw reg,i64 */
-case 0xC3: /* movw reg,i80 */
- {
- int i;
- int size = datasize( op );
- uint8_t reg = read_op();
-
- for( i = 0; i < size; i++ )
- {
- m_reg[(reg + i) & 0x7f] = read_op();
- }
- }
- break;
-
-case 0xC4: /* movb (lar),r1 / r1,(lar) */
-case 0xC5: /* movw (lar),r1 / r1,(lar) */
-case 0xC6: /* movq (lar),r1 / r1,(lar) */
-case 0xC7: /* movt (lar),r1 / r1,(lar) */
- {
- int i;
- int size = datasize( op );
- uint8_t reg1 = read_op();
- uint8_t reg2 = read_op();
- int pre_inc = 0;
- int post_inc = 1;
-
- switch( reg1 & 0x60 )
- {
- case 0x00:
- pre_inc = 0;
- post_inc = 1;
- break;
- case 0x20:
- pre_inc = 1;
- post_inc = 0;
- break;
- case 0x40:
- pre_inc = 0;
- post_inc = -1;
- break;
- case 0x60:
- pre_inc = -1;
- post_inc = 0;
- break;
- }
-
- if ( ( reg1 & 0x80 ) || ( reg2 & 0x80 ) )
- {
- /* (lar) <- r1 */
- for ( i = 0; i < size; i++ )
- {
- m_lar += pre_inc;
- m_program->write_byte( ( m_dseg << 16 ) | m_lar, m_reg[ ( reg2 + i ) & 0x7f ] );
- m_lar += post_inc;
- }
- }
- else
- {
- /* r1 <- (lar) */
- for ( i = 0; i < size; i++ )
- {
- m_lar += pre_inc;
- m_reg[ ( reg2 + i ) & 0x7f ] = m_program->read_byte( ( m_dseg << 16 ) | m_lar );
- m_lar += post_inc;
- }
- }
- }
- break;
-
-case 0xCC: /* swapb ir1,r2 */
-case 0xCD: /* swapw ir1,r2 */
-case 0xCE: /* swapq ir1,r2 */
-case 0xCF: /* swapt ir1,r2? */
- {
- int i;
- int size = datasize( op );
- uint8_t reg1 = read_op();
- uint8_t reg2 = read_op();
-
- read_iregreg( size, reg1, reg2 );
-
- for ( i = 0; i < size; i++ )
- {
- uint8_t d = m_temp1[i];
- m_temp1[i] = m_temp2[i];
- m_temp2[i] = d;
- }
-
- write_iregreg( size, reg1, reg2 );
- write_iregreg2( size, reg1, reg2 );
- }
- break;
-
-case 0xD0: /* movb cs,reg */
- m_cseg = m_reg[ read_op() & 0x7f ];
- break;
-
-case 0xD1: /* movb cs,i8 */
- m_cseg = read_op();
- break;
-
-case 0xD2: /* movb dsize,reg */
- m_dsize = m_reg[ read_op() & 0x7f ];
- break;
-
-case 0xD3: /* movb dsize,i8 */
- m_dsize = read_op();
- break;
-
-case 0xD4: /* movb ss,reg */
- m_sseg = m_reg[ read_op() & 0x7f ];
- break;
-
-case 0xD5: /* movb ss,i8 */
- m_sseg = read_op();
- break;
-
-case 0xD6: /* movw sp,reg */
- {
- uint8_t reg1 = read_op();
-
- m_sp = m_reg[ reg1 & 0x7f ] | ( m_reg[ ( reg1 + 1 ) & 0x7f ] << 8 );
- }
- break;
-
-case 0xD7: /* movw sp,i16 */
- m_sp = read_op() << 8;
- m_sp |= read_op();
- break;
-
-case 0xD8: /* movb f,reg */
- m_f = m_reg[ read_op() & 0x7f ];
- break;
-
-case 0xD9: /* movb f,i8 */
- m_f = read_op();
- break;
-
-case 0xDC: /* movb ds,reg */
- m_dseg = m_reg[ read_op() & 0x7f ];
- break;
-
-case 0xDD: /* movb ds,i8 */
- m_dseg = read_op();
- break;
-
-case 0xDE: /* movw lar,reg */
- {
- uint8_t reg1 = read_op();
-
- m_lar = m_reg[ reg1 & 0x7f ] | ( m_reg[ ( reg1 + 1 ) & 0x7f ] << 8 );
- }
- break;
-
-case 0xE0: /* in0 reg */
- {
- uint8_t reg1 = read_op();
-
- m_reg[ reg1 & 0x7f ] = m_io->read_byte( HCD62121_IN0 );
- }
- break;
-
-case 0xE1: /* unk_E1 reg/i8 (in?) */
- logerror( "%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op );
- read_op();
- break;
-
-case 0xE2: /* in kb, reg */
- m_reg[ read_op() & 0x7f ] = m_io->read_byte( HCD62121_KI );
- break;
-
-case 0xE3: /* unk_e3 reg/i8 (in?) */
-case 0xE4: /* unk_e4 reg/i8 (in?) */
-case 0xE5: /* unk_e5 reg/i8 (in?) */
-case 0xE6: /* unk_e6 reg/i8 (in?) */
-case 0xE7: /* unk_e7 reg/i8 (in?) */
- logerror( "%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op );
- read_op();
- break;
-
-case 0xE8: /* movw r1,lar */
- {
- uint8_t reg1 = read_op();
-
- m_reg[ reg1 & 0x7f ] = m_lar & 0xff;
- m_reg[ ( reg1 + 1 ) & 0x7f ] = m_lar >> 8;
- }
- break;
-
-case 0xEB: /* movw reg,ss */
- {
- uint8_t reg1 = read_op();
-
- m_reg[ reg1 & 0x7f ] = m_sp & 0xff;
- m_reg[ ( reg1 + 1 ) & 0x7f ] = m_sp >> 8;
- }
- break;
-
-case 0xEF: /* movb reg,ss */
- m_reg[ read_op() & 0x7f ] = m_sseg;
- break;
-
-case 0xF0: /* unk_F0 reg/i8 (out?) */
-case 0xF1: /* unk_F1 reg/i8 (out?) */
-case 0xF2: /* unk_F2 reg/i8 (out?) */
-case 0xF3: /* unk_F3 reg/i8 (out?) */
-case 0xF4: /* unk_F4 reg/i8 (out?) */
-case 0xF5: /* unk_F5 reg/i8 (out?) */
-case 0xF6: /* unk_F6 reg/i8 (out?) */
-case 0xF7: /* unk_F7 reg/i8 (out?) */
- logerror( "%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op );
- read_op();
- break;
-
-case 0xFC: /* unk_FC */
-case 0xFD: /* unk_FD */
-case 0xFE: /* unk_FE */
- logerror( "%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op );
- break;
-
-case 0xFF: /* nop */
- break;
-
-default:
- /*logerror*/fatalerror( "%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op );
diff --git a/src/devices/cpu/hcd62121/hcd62121d.cpp b/src/devices/cpu/hcd62121/hcd62121d.cpp
index d355385f793..5c85f193224 100644
--- a/src/devices/cpu/hcd62121/hcd62121d.cpp
+++ b/src/devices/cpu/hcd62121/hcd62121d.cpp
@@ -2,139 +2,214 @@
// copyright-holders:Wilbert Pol
#include "emu.h"
-#include "debugger.h"
-#include "hcd62121.h"
-
-#ifdef _MSC_VER
-#undef _SP
-#endif
enum
{
- _REG=1, /* register */
- _REGREG, /* register1, register2, or register2, register1 or register1, imm byte */
- _IRG, /* register indirect */
- _IRGREG, /* 2 register indirect */
- _A16, /* 16bit address */
- _A24, /* seg:address */
- _F, /* flag register */
- _CS, /* cs register */
- _DS, /* ds register */
- _SS, /* ss register */
- _PC, /* program counter */
- _SP, /* stack pointer */
- _I8, /* immediate 8 bit value */
- _I16, /* immediate 16 bit value */
- _I64, /* immediate 64 bit value */
- _I80, /* immediate 80 bit value */
- _ILR, /* indirect last address register access */
- _LAR, /* last address register */
- _DSZ, /* dsize register? */
- _TIM, /* timing related register? */
- _KLO, /* KO1 - KO8 output lines */
- _KHI, /* KO9 - KO14(?) output lines */
- _KI, /* K input lines */
- _4 /* for nibble shifts */
+ ARG_NONE=0, /* no argument or unknown */
+ ARG_REG, /* register */
+ ARG_REGREG, /* register1, register2, or register2, register1 or register1, imm byte */
+ ARG_IRG, /* register indirect */
+ ARG_IRGREG, /* 2 register indirect */
+ ARG_A16, /* 16bit address */
+ ARG_A24, /* seg:address */
+ ARG_F, /* flag register */
+ ARG_CS, /* cs register */
+ ARG_DS, /* ds register */
+ ARG_SS, /* ss register */
+ ARG_PC, /* program counter */
+ ARG_SP, /* stack pointer */
+ ARG_I8, /* immediate 8 bit value */
+ ARG_I16, /* immediate 16 bit value */
+ ARG_I64, /* immediate 64 bit value */
+ ARG_I80, /* immediate 80 bit value */
+ ARG_ILR, /* indirect last address register access */
+ ARG_LAR, /* last address register */
+ ARG_DSZ, /* dsize register? */
+ ARG_TIM, /* timing related register? */
+ ARG_KLO, /* KO1 - KO8 output lines */
+ ARG_KHI, /* KO9 - KO14(?) output lines */
+ ARG_KI, /* K input lines */
+ ARG_4 /* for nibble shifts */
};
struct hcd62121_dasm
{
const char *str;
- uint8_t arg1;
- uint8_t arg2;
+ u8 arg1;
+ u8 arg2;
};
static const hcd62121_dasm hcd62121_ops[256] =
{
/* 0x00 */
- { "un00?", 0, 0 }, { "un01?", 0, 0 }, { "un02?", 0, 0 }, { "un03?", 0, 0 },
- { "mskb", _REGREG, 0 }, { "mskw", _REGREG, 0 }, { "mskq", _REGREG, 0 }, { "mskt", _REGREG, 0 },
- { "sh?b", _REG, _4 }, { "sh?w", _REG, _4 }, { "sh?q", _REG, _4 }, { "sh?t", _REG, _4 },
- { "tstb", _REGREG, 0 }, { "tstw", _REGREG, 0 }, { "tstq", _REGREG, 0 }, { "tstt", _REGREG, 0 },
- { "xorb", _REGREG, 0 }, { "xorw", _REGREG, 0 }, { "xorq", _REGREG, 0 }, { "xort", _REGREG, 0 },
- { "cmpb", _REGREG, 0 }, { "cmpw", _REGREG, 0 }, { "cmpq", _REGREG, 0 }, { "cmpt", _REGREG, 0 },
- { "movb", _REGREG, 0 }, { "movw", _REGREG, 0 }, { "movq", _REGREG, 0 }, { "movt", _REGREG, 0 },
- { "imskb", _REGREG, 0 }, { "imskw", _REGREG, 0 }, { "imskq", _REGREG, 0 }, { "imskt", _REGREG, 0 },
+ { "un00?", ARG_NONE, ARG_NONE }, { "un01?", ARG_NONE, ARG_NONE },
+ { "un02?", ARG_NONE, ARG_NONE }, { "un03?", ARG_NONE, ARG_NONE },
+ { "mskb", ARG_REGREG, ARG_NONE }, { "mskw", ARG_REGREG, ARG_NONE },
+ { "mskq", ARG_REGREG, ARG_NONE }, { "mskt", ARG_REGREG, ARG_NONE },
+ { "sh?b", ARG_REG, ARG_4 }, { "sh?w", ARG_REG, ARG_4 },
+ { "sh?q", ARG_REG, ARG_4 }, { "sh?t", ARG_REG, ARG_4 },
+ { "tstb", ARG_REGREG, ARG_NONE }, { "tstw", ARG_REGREG, ARG_NONE },
+ { "tstq", ARG_REGREG, ARG_NONE }, { "tstt", ARG_REGREG, ARG_NONE },
+
+ /* 0x10 */
+ { "xorb", ARG_REGREG, ARG_NONE }, { "xorw", ARG_REGREG, ARG_NONE },
+ { "xorq", ARG_REGREG, ARG_NONE }, { "xort", ARG_REGREG, ARG_NONE },
+ { "cmpb", ARG_REGREG, ARG_NONE }, { "cmpw", ARG_REGREG, ARG_NONE },
+ { "cmpq", ARG_REGREG, ARG_NONE }, { "cmpt", ARG_REGREG, ARG_NONE },
+ { "movb", ARG_REGREG, ARG_NONE }, { "movw", ARG_REGREG, ARG_NONE },
+ { "movq", ARG_REGREG, ARG_NONE }, { "movt", ARG_REGREG, ARG_NONE },
+ { "imskb", ARG_REGREG, ARG_NONE }, { "imskw", ARG_REGREG, ARG_NONE },
+ { "imskq", ARG_REGREG, ARG_NONE }, { "imskt", ARG_REGREG, ARG_NONE },
/* 0x20 */
- { "shrb", _REG, 0 }, { "shrw", _REG, 0 }, { "shrq", _REG, 0 }, { "shrt", _REG, 0 },
- { "orb", _REGREG, 0 }, { "orw", _REGREG, 0 }, { "orq", _REGREG, 0 }, { "ort", _REGREG, 0 },
- { "shlb", _REG, 0 }, { "shlw", _REG, 0 }, { "shlq", _REG, 0 }, { "shlt", _REG, 0 },
- { "andb", _REGREG, 0 }, { "andw", _REGREG, 0 }, { "andq", _REGREG, 0 }, { "andt", _REGREG, 0 },
- { "sbbb", _REGREG, 0 }, { "sbbw", _REGREG, 0 }, { "sbbq", _REGREG, 0 }, { "sbbt", _REGREG, 0 }, /* BCD SUB */
- { "subb", _REGREG, 0 }, { "subw", _REGREG, 0 }, { "subq", _REGREG, 0 }, { "subt", _REGREG, 0 },
- { "adbb", _REGREG, 0 }, { "adbw", _REGREG, 0 }, { "adbq", _REGREG, 0 }, { "adbt", _REGREG, 0 }, /* BCD ADD */
- { "addb", _REGREG, 0 }, { "addw", _REGREG, 0 }, { "addq", _REGREG, 0 }, { "addt", _REGREG, 0 },
+ { "shrb", ARG_REG, ARG_NONE }, { "shrw", ARG_REG, ARG_NONE },
+ { "shrq", ARG_REG, ARG_NONE }, { "shrt", ARG_REG, ARG_NONE },
+ { "orb", ARG_REGREG, ARG_NONE }, { "orw", ARG_REGREG, ARG_NONE },
+ { "orq", ARG_REGREG, ARG_NONE }, { "ort", ARG_REGREG, ARG_NONE },
+ { "shlb", ARG_REG, ARG_NONE }, { "shlw", ARG_REG, ARG_NONE },
+ { "shlq", ARG_REG, ARG_NONE }, { "shlt", ARG_REG, ARG_NONE },
+ { "andb", ARG_REGREG, ARG_NONE }, { "andw", ARG_REGREG, ARG_NONE },
+ { "andq", ARG_REGREG, ARG_NONE }, { "andt", ARG_REGREG, ARG_NONE },
+
+ /* 0x30 */
+ { "sbbb", ARG_REGREG, ARG_NONE }, { "sbbw", ARG_REGREG, ARG_NONE }, /* BCD SUB */
+ { "sbbq", ARG_REGREG, ARG_NONE }, { "sbbt", ARG_REGREG, ARG_NONE }, /* BCD SUB */
+ { "subb", ARG_REGREG, ARG_NONE }, { "subw", ARG_REGREG, ARG_NONE },
+ { "subq", ARG_REGREG, ARG_NONE }, { "subt", ARG_REGREG, ARG_NONE },
+ { "adbb", ARG_REGREG, ARG_NONE }, { "adbw", ARG_REGREG, ARG_NONE }, /* BCD ADD */
+ { "adbq", ARG_REGREG, ARG_NONE }, { "adbt", ARG_REGREG, ARG_NONE }, /* BCD ADD */
+ { "addb", ARG_REGREG, ARG_NONE }, { "addw", ARG_REGREG, ARG_NONE },
+ { "addq", ARG_REGREG, ARG_NONE }, { "addt", ARG_REGREG, ARG_NONE },
/* 0x40 */
- { "shrb?", _IRG, 0 }, { "shrw?", _IRG, 0 }, { "shrq?", _IRG, 0 }, { "shrt?", _IRG, 0 },
- { "mskb", _IRGREG, 0 }, { "mskw", _IRGREG, 0 }, { "mskq", _IRGREG, 0 }, { "mskt", _IRGREG, 0 },
- { "shrb", _IRG, 0 }, { "shrw", _IRG, 0 }, { "shrq", _IRG, 0 }, { "shrt", _IRG, 0 },
- { "tstb", _IRGREG, 0 }, { "tstw", _IRGREG, 0 }, { "tstq", _IRGREG, 0 }, { "tstt", _IRGREG, 0 },
- { "xorb", _IRGREG, 0 }, { "xorw", _IRGREG, 0 }, { "xorq", _IRGREG, 0 }, { "xort", _IRGREG, 0 },
- { "cmpb", _IRGREG, 0 }, { "cmpw", _IRGREG, 0 }, { "cmpq", _IRGREG, 0 }, { "cmpt", _IRGREG, 0 },
- { "movb", _IRGREG, 0 }, { "movw", _IRGREG, 0 }, { "movq", _IRGREG, 0 }, { "movt", _IRGREG, 0 },
- { "imskb", _IRGREG, 0 }, { "imskw", _IRGREG, 0 }, { "imskq", _IRGREG, 0 }, { "imskt", _IRGREG, 0 },
+ { "shrb?", ARG_IRG, ARG_NONE }, { "shrw?", ARG_IRG, ARG_NONE },
+ { "shrq?", ARG_IRG, ARG_NONE }, { "shrt?", ARG_IRG, ARG_NONE },
+ { "mskb", ARG_IRGREG, ARG_NONE }, { "mskw", ARG_IRGREG, ARG_NONE },
+ { "mskq", ARG_IRGREG, ARG_NONE }, { "mskt", ARG_IRGREG, ARG_NONE },
+ { "shrb", ARG_IRG, ARG_NONE }, { "shrw", ARG_IRG, ARG_NONE },
+ { "shrq", ARG_IRG, ARG_NONE }, { "shrt", ARG_IRG, ARG_NONE },
+ { "tstb", ARG_IRGREG, ARG_NONE }, { "tstw", ARG_IRGREG, ARG_NONE },
+ { "tstq", ARG_IRGREG, ARG_NONE }, { "tstt", ARG_IRGREG, ARG_NONE },
+
+ /* 0x50 */
+ { "xorb", ARG_IRGREG, ARG_NONE }, { "xorw", ARG_IRGREG, ARG_NONE },
+ { "xorq", ARG_IRGREG, ARG_NONE }, { "xort", ARG_IRGREG, ARG_NONE },
+ { "cmpb", ARG_IRGREG, ARG_NONE }, { "cmpw", ARG_IRGREG, ARG_NONE },
+ { "cmpq", ARG_IRGREG, ARG_NONE }, { "cmpt", ARG_IRGREG, ARG_NONE },
+ { "movb", ARG_IRGREG, ARG_NONE }, { "movw", ARG_IRGREG, ARG_NONE },
+ { "movq", ARG_IRGREG, ARG_NONE }, { "movt", ARG_IRGREG, ARG_NONE },
+ { "imskb", ARG_IRGREG, ARG_NONE }, { "imskw", ARG_IRGREG, ARG_NONE },
+ { "imskq", ARG_IRGREG, ARG_NONE }, { "imskt", ARG_IRGREG, ARG_NONE },
/* 0x60 */
- { "shrb", _IRG, 0 }, { "shrw", _IRG, 0 }, { "shrq", _IRG, 0 }, { "shrt", _IRG, 0 },
- { "orb", _IRGREG, 0 }, { "orw", _IRGREG, 0 }, { "orq", _IRGREG, 0 }, { "ort", _IRGREG, 0 },
- { "shlb", _IRG, 0 }, { "shlw", _IRG, 0 }, { "shlq", _IRG, 0 }, { "shlt", _IRG, 0 },
- { "andb", _IRGREG, 0 }, { "andw", _IRGREG, 0 }, { "andq", _IRGREG, 0 }, { "andt", _IRGREG, 0 },
- { "sbbb", _IRGREG, 0 }, { "sbbw", _IRGREG, 0 }, { "sbbq", _IRGREG, 0 }, { "sbbt", _IRGREG, 0 }, /* BCD SUB */
- { "subb", _IRGREG, 0 }, { "subw", _IRGREG, 0 }, { "subq", _IRGREG, 0 }, { "subt", _IRGREG, 0 },
- { "adbb", _IRGREG, 0 }, { "adbw", _IRGREG, 0 }, { "adbq", _IRGREG, 0 }, { "adbt", _IRGREG, 0 }, /* BCD ADD */
- { "addb", _IRGREG, 0 }, { "addw", _IRGREG, 0 }, { "addq", _IRGREG, 0 }, { "addt", _IRGREG, 0 },
+ { "shrb", ARG_IRG, ARG_NONE }, { "shrw", ARG_IRG, ARG_NONE },
+ { "shrq", ARG_IRG, ARG_NONE }, { "shrt", ARG_IRG, ARG_NONE },
+ { "orb", ARG_IRGREG, ARG_NONE }, { "orw", ARG_IRGREG, ARG_NONE },
+ { "orq", ARG_IRGREG, ARG_NONE }, { "ort", ARG_IRGREG, ARG_NONE },
+ { "shlb", ARG_IRG, ARG_NONE }, { "shlw", ARG_IRG, ARG_NONE },
+ { "shlq", ARG_IRG, ARG_NONE }, { "shlt", ARG_IRG, ARG_NONE },
+ { "andb", ARG_IRGREG, ARG_NONE }, { "andw", ARG_IRGREG, ARG_NONE },
+ { "andq", ARG_IRGREG, ARG_NONE }, { "andt", ARG_IRGREG, ARG_NONE },
+
+ /* 0x70 */
+ { "sbbb", ARG_IRGREG, ARG_NONE }, { "sbbw", ARG_IRGREG, ARG_NONE }, /* BCD SUB */
+ { "sbbq", ARG_IRGREG, ARG_NONE }, { "sbbt", ARG_IRGREG, ARG_NONE }, /* BCD SUB */
+ { "subb", ARG_IRGREG, ARG_NONE }, { "subw", ARG_IRGREG, ARG_NONE },
+ { "subq", ARG_IRGREG, ARG_NONE }, { "subt", ARG_IRGREG, ARG_NONE },
+ { "adbb", ARG_IRGREG, ARG_NONE }, { "adbw", ARG_IRGREG, ARG_NONE }, /* BCD ADD */
+ { "adbq", ARG_IRGREG, ARG_NONE }, { "adbt", ARG_IRGREG, ARG_NONE }, /* BCD ADD */
+ { "addb", ARG_IRGREG, ARG_NONE }, { "addw", ARG_IRGREG, ARG_NONE },
+ { "addq", ARG_IRGREG, ARG_NONE }, { "addt", ARG_IRGREG, ARG_NONE },
/* 0x80 */
- { "un80?", 0, 0 }, { "un81?", 0, 0 }, { "un82?", 0, 0 }, { "un83?", 0, 0 },
- { "un84?", 0, 0 }, { "un85?", 0, 0 }, { "un86?", 0, 0 }, { "un87?", 0, 0 },
- { "jump", _A16, 0 }, { "jump", _A24, 0 }, { "call", _A16, 0 }, { "un8b?", 0, 0 },
- { "un8C?", 0, 0 }, { "un8D?", 0, 0 }, { "un8E?", 0, 0 }, { "un8F?", 0, 0 },
- { "retzh", 0, 0 }, { "retzl", 0, 0 }, { "retc", 0, 0 }, { "retz", 0, 0 },
- { "retzc", 0, 0 }, { "retcl", 0, 0 }, { "retnc", 0, 0 }, { "retnz", 0, 0 },
- { "jump", _IRG, 0 }, { "un99?", 0, 0 }, { "un9A?", 0, 0 }, { "un9b?", 0, 0 },
- { "un9C?", 0, 0 }, { "un9D?", 0, 0 }, { "reti", 0, 0 }, { "ret", 0, 0 },
+ { "un80?", ARG_NONE, ARG_NONE }, { "un81?", ARG_NONE, ARG_NONE },
+ { "un82?", ARG_NONE, ARG_NONE }, { "un83?", ARG_NONE, ARG_NONE },
+ { "un84?", ARG_NONE, ARG_NONE }, { "un85?", ARG_NONE, ARG_NONE },
+ { "un86?", ARG_NONE, ARG_NONE }, { "un87?", ARG_NONE, ARG_NONE },
+ { "jump", ARG_A16, ARG_NONE }, { "jump", ARG_A24, ARG_NONE },
+ { "call", ARG_A16, ARG_NONE }, { "un8b?", ARG_NONE, ARG_NONE },
+ { "un8C?", ARG_NONE, ARG_NONE }, { "un8D?", ARG_NONE, ARG_NONE },
+ { "un8E?", ARG_NONE, ARG_NONE }, { "un8F?", ARG_NONE, ARG_NONE },
+
+ /* 0x90 */
+ { "retzh", ARG_NONE, ARG_NONE }, { "retzl", ARG_NONE, ARG_NONE },
+ { "retc", ARG_NONE, ARG_NONE }, { "retz", ARG_NONE, ARG_NONE },
+ { "retzc", ARG_NONE, ARG_NONE }, { "retcl", ARG_NONE, ARG_NONE },
+ { "retnc", ARG_NONE, ARG_NONE }, { "retnz", ARG_NONE, ARG_NONE },
+ { "jump", ARG_IRG, ARG_NONE }, { "un99?", ARG_NONE, ARG_NONE },
+ { "un9A?", ARG_NONE, ARG_NONE }, { "un9b?", ARG_NONE, ARG_NONE },
+ { "un9C?", ARG_NONE, ARG_NONE }, { "un9D?", ARG_NONE, ARG_NONE },
+ { "reti", ARG_NONE, ARG_NONE }, { "ret", ARG_NONE, ARG_NONE },
/* 0xa0 */
- { "jmpzh", _A16, 0 }, { "jmpzl", _A16, 0 }, { "jmpc", _A16, 0 }, { "jmpz", _A16, 0 },
- { "jmpzc", _A16, 0 }, { "jmpcl", _A16, 0 }, { "jmpnc", _A16, 0 }, { "jmpnz", _A16, 0 },
- { "callzh", _A16, 0 }, { "callzl", _A16, 0 }, { "callc", _A16, 0 }, { "callz", _A16, 0 },
- { "callzc", _A16, 0 }, { "callcl", _A16, 0 }, { "callnc", _A16, 0 }, { "callnz", _A16, 0 },
- { "unB0?", 0, 0 }, { "unB1?", _I8, 0 }, { "unB2?", 0, 0 }, { "unB3?", _I8, 0 },
- { "out", _KHI, _REG }, { "out", _KHI, _I8 }, { "out", _KLO, _REG }, { "out", _KLO, _I8 },
- { "unB8?", 0, 0 }, { "unB9?", _I8, 0 }, { "unBA?", 0, 0 }, { "jmpcl?", _A16, 0 },
- { "unBC?", 0, 0 }, { "unBD?", 0, 0 }, { "unBE?", 0, 0 }, { "jmpncl?", _A16, 0 },
+ { "jmpzh", ARG_A16, ARG_NONE }, { "jmpzl", ARG_A16, ARG_NONE },
+ { "jmpc", ARG_A16, ARG_NONE }, { "jmpz", ARG_A16, ARG_NONE },
+ { "jmpzc", ARG_A16, ARG_NONE }, { "jmpcl", ARG_A16, ARG_NONE },
+ { "jmpnc", ARG_A16, ARG_NONE }, { "jmpnz", ARG_A16, ARG_NONE },
+ { "callzh", ARG_A16, ARG_NONE }, { "callzl", ARG_A16, ARG_NONE },
+ { "callc", ARG_A16, ARG_NONE }, { "callz", ARG_A16, ARG_NONE },
+ { "callzc", ARG_A16, ARG_NONE }, { "callcl", ARG_A16, ARG_NONE },
+ { "callnc", ARG_A16, ARG_NONE }, { "callnz", ARG_A16, ARG_NONE },
+
+ /* 0xb0 */
+ { "unB0?", ARG_NONE, ARG_NONE }, { "unB1?", ARG_I8, ARG_NONE },
+ { "unB2?", ARG_NONE, ARG_NONE }, { "unB3?", ARG_I8, ARG_NONE },
+ { "out", ARG_KHI, ARG_REG }, { "out", ARG_KHI, ARG_I8 },
+ { "out", ARG_KLO, ARG_REG }, { "out", ARG_KLO, ARG_I8 },
+ { "unB8?", ARG_NONE, ARG_NONE }, { "unB9?", ARG_I8, ARG_NONE },
+ { "unBA?", ARG_NONE, ARG_NONE }, { "jmpcl?", ARG_A16, ARG_NONE },
+ { "unBC?", ARG_NONE, ARG_NONE }, { "unBD?", ARG_NONE, ARG_NONE },
+ { "unBE?", ARG_NONE, ARG_NONE }, { "jmpncl?", ARG_A16, ARG_NONE },
/* 0xc0 */
- { "movb", _REG, _I8 }, { "movw", _REG, _I16 }, { "movq", _REG, _I64 }, { "movt", _REG, _I80 },
- { "movb", _ILR, _ILR }, { "movw", _ILR, _ILR }, { "movq", _ILR, _ILR }, { "movt", _ILR, _ILR },
- { "unC8?", 0, 0 }, { "unC9?", 0, 0 }, { "unCA?", 0, 0 }, { "unCb?", 0, 0 },
- { "swapb", _IRGREG, 0 }, { "swapw", _IRGREG, 0 }, { "swapq", _IRGREG, 0 }, { "swapt", _IRGREG, 0 },
- { "movb", _CS, _REG }, { "movb", _CS, _I8 }, { "movb", _DSZ, _REG }, { "movb", _DSZ, _I8 },
- { "movb", _SS, _REG }, { "movb", _SS, _I8 }, { "movw", _SP, _REG }, { "movw", _SP, _I16 },
- { "movb", _F, _REG }, { "movb", _F, _I8 }, { "unDA?", 0, 0 }, { "unDb?", 0, 0 },
- { "movb", _DS, _REG }, { "movb", _DS, _I8 }, { "movw", _LAR, _REG }, { "movw?", _LAR, _I16 },
+ { "movb", ARG_REG, ARG_I8 }, { "movw", ARG_REG, ARG_I16 },
+ { "movq", ARG_REG, ARG_I64 }, { "movt", ARG_REG, ARG_I80 },
+ { "movb", ARG_ILR, ARG_ILR }, { "movw", ARG_ILR, ARG_ILR },
+ { "movq", ARG_ILR, ARG_ILR }, { "movt", ARG_ILR, ARG_ILR },
+ { "unC8?", ARG_NONE, ARG_NONE }, { "unC9?", ARG_NONE, ARG_NONE },
+ { "unCA?", ARG_NONE, ARG_NONE }, { "unCb?", ARG_NONE, ARG_NONE },
+ { "swapb", ARG_IRGREG, ARG_NONE }, { "swapw", ARG_IRGREG, ARG_NONE },
+ { "swapq", ARG_IRGREG, ARG_NONE }, { "swapt", ARG_IRGREG, ARG_NONE },
+
+ /* 0xd0 */
+ { "movb", ARG_CS, ARG_REG }, { "movb", ARG_CS, ARG_I8 },
+ { "movb", ARG_DSZ, ARG_REG }, { "movb", ARG_DSZ, ARG_I8 },
+ { "movb", ARG_SS, ARG_REG }, { "movb", ARG_SS, ARG_I8 },
+ { "movw", ARG_SP, ARG_REG }, { "movw", ARG_SP, ARG_I16 },
+ { "movb", ARG_F, ARG_REG }, { "movb", ARG_F, ARG_I8 },
+ { "unDA?", ARG_NONE, ARG_NONE }, { "unDb?", ARG_NONE, ARG_NONE },
+ { "movb", ARG_DS, ARG_REG }, { "movb", ARG_DS, ARG_I8 },
+ { "movw", ARG_LAR, ARG_REG }, { "movw?", ARG_LAR, ARG_I16 },
/* 0xe0 */
- { "in0", _REG, 0 }, { "unE1?", _I8, 0 }, { "in", _REG, _KI }, { "movb", _REG, _DSZ },
- { "movb", _REG, _F }, { "movb", _REG, _TIM }, { "unE6?", _I8, 0 }, { "unE7?", _I8, 0 },
- { "movw", _REG, _LAR }, { "movw?", _REG, _LAR }, { "movw", _REG, _PC }, { "movw", _REG, _SP },
- { "unEC?", 0, 0 }, { "movb", _REG, _DS }, { "movb", _REG, _CS }, { "movb", _REG, _SS },
- { "unF0?", _I8, 0 }, { "unF1?", _I8, 0 }, { "unF2?", _I8, 0 }, { "unF3?", _I8, 0 },
- { "unF4?", _I8, 0 }, { "unF5?", _I8, 0 }, { "unF6?", _I8, 0 }, { "unF7?", _I8, 0 },
- { "unF8?", 0, 0 }, { "unF9?", 0, 0 }, { "unFA?", 0, 0 }, { "unFb?", 0, 0 },
- { "unFC?", 0, 0 }, { "unFD?", 0, 0 }, { "unFE?", 0, 0 }, { "nop", 0, 0 }
+ { "in0", ARG_REG, ARG_NONE }, { "unE1?", ARG_I8, ARG_NONE },
+ { "in", ARG_REG, ARG_KI }, { "movb", ARG_REG, ARG_DSZ },
+ { "movb", ARG_REG, ARG_F }, { "movb", ARG_REG, ARG_TIM },
+ { "unE6?", ARG_I8, ARG_NONE }, { "unE7?", ARG_I8, ARG_NONE },
+ { "movw", ARG_REG, ARG_LAR }, { "movw?", ARG_REG, ARG_LAR },
+ { "movw", ARG_REG, ARG_PC }, { "movw", ARG_REG, ARG_SP },
+ { "unEC?", ARG_NONE, ARG_NONE }, { "movb", ARG_REG, ARG_DS },
+ { "movb", ARG_REG, ARG_CS }, { "movb", ARG_REG, ARG_SS },
+
+ /* 0xf0 */
+ { "unF0?", ARG_I8, ARG_NONE }, { "unF1?", ARG_I8, ARG_NONE },
+ { "unF2?", ARG_I8, ARG_NONE }, { "unF3?", ARG_I8, ARG_NONE },
+ { "unF4?", ARG_I8, ARG_NONE }, { "unF5?", ARG_I8, ARG_NONE },
+ { "unF6?", ARG_I8, ARG_NONE }, { "unF7?", ARG_I8, ARG_NONE },
+ { "unF8?", ARG_NONE, ARG_NONE }, { "unF9?", ARG_NONE, ARG_NONE },
+ { "unFA?", ARG_NONE, ARG_NONE }, { "unFb?", ARG_NONE, ARG_NONE },
+ { "unFC?", ARG_NONE, ARG_NONE }, { "unFD?", ARG_NONE, ARG_NONE },
+ { "unFE?", ARG_NONE, ARG_NONE }, { "nop", ARG_NONE, ARG_NONE }
};
CPU_DISASSEMBLE(hcd62121)
{
- uint8_t op;
- uint8_t op1;
- uint8_t op2;
- int pos = 0;
+ u8 op;
+ u8 op1;
+ u8 op2;
+ u32 pos = 0;
const hcd62121_dasm *inst;
op = oprom[pos++];
@@ -142,213 +217,213 @@ CPU_DISASSEMBLE(hcd62121)
inst = &hcd62121_ops[op];
/* Special case for nibble shift instruction */
- if ( inst->arg2 == _4 )
- util::stream_format(stream, "sh%c%c ", ( oprom[pos] & 0x80 ) ? 'l' : 'r', inst->str[3]);
+ if (inst->arg2 == ARG_4)
+ util::stream_format(stream, "sh%c%c ", (oprom[pos] & 0x80) ? 'l' : 'r', inst->str[3]);
else
util::stream_format(stream, "%-8s", inst->str);
- switch( inst->arg1 )
+ switch(inst->arg1)
{
- case _REGREG:
+ case ARG_REGREG:
op1 = oprom[pos++];
op2 = oprom[pos++];
- if ( op1 & 0x80 )
+ if (op1 & 0x80)
{
- util::stream_format( stream, "r%02x,0x%02x", op1 & 0x7f, op2 );
+ util::stream_format(stream, "r%02x,0x%02x", op1 & 0x7f, op2);
}
else
{
- if ( op2 & 0x80 )
- util::stream_format( stream, "r%02x,r%02x", op1 & 0x7f, op2 & 0x7f );
+ if (op2 & 0x80)
+ util::stream_format(stream, "r%02x,r%02x", op1 & 0x7f, op2 & 0x7f);
else
- util::stream_format( stream, "r%02x,r%02x", op2 & 0x7f, op1 & 0x7f );
+ util::stream_format(stream, "r%02x,r%02x", op2 & 0x7f, op1 & 0x7f);
}
break;
- case _REG:
- util::stream_format( stream, "r%02x", oprom[pos++] & 0x7f );
+ case ARG_REG:
+ util::stream_format(stream, "r%02x", oprom[pos++] & 0x7f);
break;
- case _IRGREG:
+ case ARG_IRGREG:
/* bit 6 = direction. 0 - regular, 1 - reverse */
op1 = oprom[pos++];
op2 = oprom[pos++];
- if ( op1 & 0x80 )
+ if (op1 & 0x80)
{
- util::stream_format( stream, "(r%02x),0x%02x", 0x40 | ( op1 & 0x3f ), op2 );
+ util::stream_format(stream, "(r%02x),0x%02x", 0x40 | (op1 & 0x3f), op2);
}
else
{
- if ( op2 & 0x80 )
- util::stream_format( stream, "(r%02x%s),r%02x", 0x40 | ( op1 & 0x3f ), (op1 & 0x40) ? ".r" : "", op2 & 0x7f );
+ if (op2 & 0x80)
+ util::stream_format(stream, "(r%02x%s),r%02x", 0x40 | (op1 & 0x3f), (op1 & 0x40) ? ".r" : "", op2 & 0x7f);
else
- util::stream_format( stream, "r%02x,(r%02x%s)", op2 & 0x7f, 0x40 | ( op1 & 0x3f ), (op1 & 0x40) ? ".r" : "" );
+ util::stream_format(stream, "r%02x,(r%02x%s)", op2 & 0x7f, 0x40 | (op1 & 0x3f), (op1 & 0x40) ? ".r" : "");
}
break;
- case _IRG:
+ case ARG_IRG:
/* bit 6 = direction. 0 - regular, 1 - reverse */
op1 = oprom[pos++];
- util::stream_format( stream, "(r%02x%s)", 0x40 | ( op1 & 0x3f ), (op1 & 0x40) ? ".r" : "" );
- break;
- case _F:
- util::stream_format( stream, "F" );
- break;
- case _CS:
- util::stream_format( stream, "CS" );
- break;
- case _DS:
- util::stream_format( stream, "DS" );
- break;
- case _SS:
- util::stream_format( stream, "SS" );
- break;
- case _PC:
- util::stream_format( stream, "PC" );
- break;
- case _SP:
- util::stream_format( stream, "SP" );
- break;
- case _I8:
- util::stream_format( stream, "0x%02x", oprom[pos++] );
- break;
- case _I16:
- case _A16:
- util::stream_format( stream, "0x%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- break;
- case _I64:
- util::stream_format( stream, "0x%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- break;
- case _I80:
- util::stream_format( stream, "0x%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- break;
- case _A24:
- util::stream_format( stream, "0x%02x:", oprom[pos++] );
- util::stream_format( stream, "0x%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- break;
- case _ILR:
+ util::stream_format(stream, "(r%02x%s)", 0x40 | (op1 & 0x3f), (op1 & 0x40) ? ".r" : "");
+ break;
+ case ARG_F:
+ util::stream_format(stream, "F");
+ break;
+ case ARG_CS:
+ util::stream_format(stream, "CS");
+ break;
+ case ARG_DS:
+ util::stream_format(stream, "DS");
+ break;
+ case ARG_SS:
+ util::stream_format(stream, "SS");
+ break;
+ case ARG_PC:
+ util::stream_format(stream, "PC");
+ break;
+ case ARG_SP:
+ util::stream_format(stream, "SP");
+ break;
+ case ARG_I8:
+ util::stream_format(stream, "0x%02x", oprom[pos++]);
+ break;
+ case ARG_I16:
+ case ARG_A16:
+ util::stream_format(stream, "0x%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ break;
+ case ARG_I64:
+ util::stream_format(stream, "0x%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ break;
+ case ARG_I80:
+ util::stream_format(stream, "0x%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ break;
+ case ARG_A24:
+ util::stream_format(stream, "0x%02x:", oprom[pos++]);
+ util::stream_format(stream, "0x%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ break;
+ case ARG_ILR:
op1 = oprom[pos++];
op2 = oprom[pos++];
- if ( ( op1 & 0x80 ) || ( op2 & 0x80 ) )
+ if ((op1 & 0x80) || (op2 & 0x80))
{
/* (lar),reg */
- util::stream_format( stream, "(%slar%s),r%02x", (op1 & 0x20) ? ( (op1 & 0x40) ? "--" : "++" ) : "", (op1 & 0x20) ? "" : ( (op1 & 0x40) ? "--" : "++" ), op2 & 0x7f );
+ util::stream_format(stream, "(%slar%s),r%02x", (op1 & 0x20) ? ((op1 & 0x40) ? "--" : "++") : "", (op1 & 0x20) ? "" : ((op1 & 0x40) ? "--" : "++"), op2 & 0x7f);
}
else
{
/* reg,(lar) */
- util::stream_format( stream, "r%02x,(%slar%s)", op2 & 0x7f, (op1 & 0x20) ? ( (op1 & 0x40) ? "--" : "++" ) : "", (op1 & 0x20) ? "" : ( (op1 & 0x40) ? "--" : "++" ) );
+ util::stream_format(stream, "r%02x,(%slar%s)", op2 & 0x7f, (op1 & 0x20) ? ((op1 & 0x40) ? "--" : "++") : "", (op1 & 0x20) ? "" : ((op1 & 0x40) ? "--" : "++"));
}
break;
- case _LAR:
- util::stream_format( stream, "lar" );
+ case ARG_LAR:
+ util::stream_format(stream, "lar");
break;
- case _DSZ:
- util::stream_format( stream, "dsize" );
+ case ARG_DSZ:
+ util::stream_format(stream, "dsize");
break;
- case _TIM:
- util::stream_format( stream, "TIM?" );
+ case ARG_TIM:
+ util::stream_format(stream, "TIM?");
break;
- case _KLO:
- util::stream_format( stream, "KOL" );
+ case ARG_KLO:
+ util::stream_format(stream, "KOL");
break;
- case _KHI:
- util::stream_format( stream, "KOH" );
+ case ARG_KHI:
+ util::stream_format(stream, "KOH");
break;
default:
break;
}
- switch( inst->arg2 )
+ switch(inst->arg2)
{
- case _REG:
- util::stream_format( stream, ",r%02x", oprom[pos++] & 0x7f );
- break;
- case _F:
- util::stream_format( stream, ",F" );
- break;
- case _CS:
- util::stream_format( stream, ",CS" );
- break;
- case _DS:
- util::stream_format( stream, ",DS" );
- break;
- case _SS:
- util::stream_format( stream, ",SS" );
- break;
- case _PC:
- util::stream_format( stream, ",PC" );
- break;
- case _SP:
- util::stream_format( stream, ",SP" );
- break;
- case _I8:
- util::stream_format( stream, ",0x%02x", oprom[pos++] );
- break;
- case _I16:
- case _A16:
- util::stream_format( stream, ",0x%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- break;
- case _I64:
- util::stream_format( stream, ",0x%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- break;
- case _I80:
- util::stream_format( stream, ",0x%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- break;
- case _A24:
- util::stream_format( stream, ",0x%02x:", oprom[pos++] );
- util::stream_format( stream, "0x%02x", oprom[pos++] );
- util::stream_format( stream, "%02x", oprom[pos++] );
- break;
- case _ILR:
- /* Implemented by _ILR section for arg1 */
- break;
- case _LAR:
- util::stream_format( stream, ",lar" );
- break;
- case _DSZ:
- util::stream_format( stream, ",dsize" );
- break;
- case _TIM:
- util::stream_format( stream, ",TIM?" );
- break;
- case _KI:
- util::stream_format( stream, ",KI" );
- break;
- case _4:
- util::stream_format( stream, ",4" );
+ case ARG_REG:
+ util::stream_format(stream, ",r%02x", oprom[pos++] & 0x7f);
+ break;
+ case ARG_F:
+ util::stream_format(stream, ",F");
+ break;
+ case ARG_CS:
+ util::stream_format(stream, ",CS");
+ break;
+ case ARG_DS:
+ util::stream_format(stream, ",DS");
+ break;
+ case ARG_SS:
+ util::stream_format(stream, ",SS");
+ break;
+ case ARG_PC:
+ util::stream_format(stream, ",PC");
+ break;
+ case ARG_SP:
+ util::stream_format(stream, ",SP");
+ break;
+ case ARG_I8:
+ util::stream_format(stream, ",0x%02x", oprom[pos++]);
+ break;
+ case ARG_I16:
+ case ARG_A16:
+ util::stream_format(stream, ",0x%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ break;
+ case ARG_I64:
+ util::stream_format(stream, ",0x%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ break;
+ case ARG_I80:
+ util::stream_format(stream, ",0x%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ break;
+ case ARG_A24:
+ util::stream_format(stream, ",0x%02x:", oprom[pos++]);
+ util::stream_format(stream, "0x%02x", oprom[pos++]);
+ util::stream_format(stream, "%02x", oprom[pos++]);
+ break;
+ case ARG_ILR:
+ /* Implemented by ARG_ILR section for arg1 */
+ break;
+ case ARG_LAR:
+ util::stream_format(stream, ",lar");
+ break;
+ case ARG_DSZ:
+ util::stream_format(stream, ",dsize");
+ break;
+ case ARG_TIM:
+ util::stream_format(stream, ",TIM?");
+ break;
+ case ARG_KI:
+ util::stream_format(stream, ",KI");
+ break;
+ case ARG_4:
+ util::stream_format(stream, ",4");
break;
default:
break;
diff --git a/src/devices/cpu/hmcs40/hmcs40.cpp b/src/devices/cpu/hmcs40/hmcs40.cpp
index a15b7cc907c..fcc61b40fe7 100644
--- a/src/devices/cpu/hmcs40/hmcs40.cpp
+++ b/src/devices/cpu/hmcs40/hmcs40.cpp
@@ -78,56 +78,56 @@ ADDRESS_MAP_END
// device definitions
-hmcs43_cpu_device::hmcs43_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint16_t polarity, const char *shortname)
+hmcs43_cpu_device::hmcs43_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, u16 polarity, const char *shortname)
: hmcs40_cpu_device(mconfig, type, name, tag, owner, clock, HMCS40_FAMILY_HMCS43, polarity, 3 /* stack levels */, 10 /* pc width */, 11 /* prg width */, ADDRESS_MAP_NAME(program_1k), 7 /* data width */, ADDRESS_MAP_NAME(data_80x4), shortname, __FILE__)
{ }
-hd38750_device::hd38750_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+hd38750_device::hd38750_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: hmcs43_cpu_device(mconfig, HD38750, "HD38750", tag, owner, clock, IS_PMOS, "hd38750")
{ }
-hd38755_device::hd38755_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+hd38755_device::hd38755_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: hmcs43_cpu_device(mconfig, HD38755, "HD38755", tag, owner, clock, IS_PMOS, "hd38755")
{ }
-hd44750_device::hd44750_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+hd44750_device::hd44750_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: hmcs43_cpu_device(mconfig, HD44750, "HD44750", tag, owner, clock, IS_CMOS, "hd44750")
{ }
-hd44758_device::hd44758_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+hd44758_device::hd44758_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: hmcs43_cpu_device(mconfig, HD44758, "HD44758", tag, owner, clock, IS_CMOS, "hd44758")
{ }
-hmcs44_cpu_device::hmcs44_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint16_t polarity, const char *shortname)
+hmcs44_cpu_device::hmcs44_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, u16 polarity, const char *shortname)
: hmcs40_cpu_device(mconfig, type, name, tag, owner, clock, HMCS40_FAMILY_HMCS44, polarity, 4, 11, 12, ADDRESS_MAP_NAME(program_2k), 8, ADDRESS_MAP_NAME(data_160x4), shortname, __FILE__)
{ }
-hd38800_device::hd38800_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+hd38800_device::hd38800_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: hmcs44_cpu_device(mconfig, HD38800, "HD38800", tag, owner, clock, IS_PMOS, "hd38800")
{ }
-hd38805_device::hd38805_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+hd38805_device::hd38805_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: hmcs44_cpu_device(mconfig, HD38805, "HD38805", tag, owner, clock, IS_PMOS, "hd38805")
{ }
-hd44801_device::hd44801_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+hd44801_device::hd44801_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: hmcs44_cpu_device(mconfig, HD44801, "HD44801", tag, owner, clock, IS_CMOS, "hd44801")
{ }
-hd44808_device::hd44808_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+hd44808_device::hd44808_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: hmcs44_cpu_device(mconfig, HD44808, "HD44808", tag, owner, clock, IS_CMOS, "hd44808")
{ }
-hmcs45_cpu_device::hmcs45_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint16_t polarity, const char *shortname)
+hmcs45_cpu_device::hmcs45_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, u16 polarity, const char *shortname)
: hmcs40_cpu_device(mconfig, type, name, tag, owner, clock, HMCS40_FAMILY_HMCS45, polarity, 4, 11, 12, ADDRESS_MAP_NAME(program_2k), 8, ADDRESS_MAP_NAME(data_160x4), shortname, __FILE__)
{ }
-hd38820_device::hd38820_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+hd38820_device::hd38820_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: hmcs45_cpu_device(mconfig, HD38820, "HD38820", tag, owner, clock, IS_PMOS, "hd38820")
{ }
-hd38825_device::hd38825_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+hd38825_device::hd38825_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: hmcs45_cpu_device(mconfig, HD38825, "HD38825", tag, owner, clock, IS_PMOS, "hd38825")
{ }
-hd44820_device::hd44820_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+hd44820_device::hd44820_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: hmcs45_cpu_device(mconfig, HD44820, "HD44820", tag, owner, clock, IS_CMOS, "hd44820")
{ }
-hd44828_device::hd44828_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+hd44828_device::hd44828_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: hmcs45_cpu_device(mconfig, HD44828, "HD44828", tag, owner, clock, IS_CMOS, "hd44828")
{ }
@@ -148,7 +148,7 @@ void hmcs40_cpu_device::state_string_export(const device_state_entry &entry, std
}
}
-offs_t hmcs40_cpu_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options)
+offs_t hmcs40_cpu_device::disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options)
{
extern CPU_DISASSEMBLE(hmcs40);
return CPU_DISASSEMBLE_NAME(hmcs40)(this, stream, pc, oprom, opram, options);
@@ -306,10 +306,10 @@ void hmcs40_cpu_device::device_reset()
// i/o handling
//-------------------------------------------------
-uint8_t hmcs40_cpu_device::read_r(int index)
+u8 hmcs40_cpu_device::read_r(int index)
{
index &= 7;
- uint8_t inp = 0;
+ u8 inp = 0;
switch (index)
{
@@ -329,7 +329,7 @@ uint8_t hmcs40_cpu_device::read_r(int index)
return (inp | m_r[index]) & 0xf;
}
-void hmcs40_cpu_device::write_r(int index, uint8_t data)
+void hmcs40_cpu_device::write_r(int index, u8 data)
{
index &= 7;
data &= 0xf;
@@ -371,7 +371,7 @@ void hmcs40_cpu_device::write_d(int index, int state)
// R0 is input-only, R1 is i/o, R2,R3 are output-only, no R4-R7
// D0-D3 are i/o, D4-D15 are output-only
-uint8_t hmcs43_cpu_device::read_r(int index)
+u8 hmcs43_cpu_device::read_r(int index)
{
index &= 7;
@@ -381,7 +381,7 @@ uint8_t hmcs43_cpu_device::read_r(int index)
return hmcs40_cpu_device::read_r(index);
}
-void hmcs43_cpu_device::write_r(int index, uint8_t data)
+void hmcs43_cpu_device::write_r(int index, u8 data)
{
index &= 7;
@@ -405,7 +405,7 @@ int hmcs43_cpu_device::read_d(int index)
// R0-R3 are i/o, R4,R5 are extra registers, no R6,R7
// D0-D15 are i/o
-uint8_t hmcs44_cpu_device::read_r(int index)
+u8 hmcs44_cpu_device::read_r(int index)
{
index &= 7;
@@ -415,7 +415,7 @@ uint8_t hmcs44_cpu_device::read_r(int index)
return hmcs40_cpu_device::read_r(index);
}
-void hmcs44_cpu_device::write_r(int index, uint8_t data)
+void hmcs44_cpu_device::write_r(int index, u8 data)
{
index &= 7;
@@ -429,7 +429,7 @@ void hmcs44_cpu_device::write_r(int index, uint8_t data)
// R0-R5 are i/o, R6 is output-only, no R7
// D0-D15 are i/o
-uint8_t hmcs45_cpu_device::read_r(int index)
+u8 hmcs45_cpu_device::read_r(int index)
{
index &= 7;
@@ -439,7 +439,7 @@ uint8_t hmcs45_cpu_device::read_r(int index)
return hmcs40_cpu_device::read_r(index);
}
-void hmcs45_cpu_device::write_r(int index, uint8_t data)
+void hmcs45_cpu_device::write_r(int index, u8 data)
{
index &= 7;
@@ -553,8 +553,8 @@ void hmcs40_cpu_device::increment_tc()
inline void hmcs40_cpu_device::increment_pc()
{
// PC lower bits is a LFSR identical to TI TMS1000
- uint8_t mask = 0x3f;
- uint8_t low = m_pc & mask;
+ u8 mask = 0x3f;
+ u8 low = m_pc & mask;
int fb = (low << 1 & 0x20) == (low & 0x20);
if (low == (mask >> 1))
diff --git a/src/devices/cpu/hmcs40/hmcs40.h b/src/devices/cpu/hmcs40/hmcs40.h
index 38a6d20169d..1eaed0bab37 100644
--- a/src/devices/cpu/hmcs40/hmcs40.h
+++ b/src/devices/cpu/hmcs40/hmcs40.h
@@ -16,15 +16,15 @@
// max 8 4-bit R ports
#define MCFG_HMCS40_READ_R_CB(R, _devcb) \
- hmcs40_cpu_device::set_read_r##R##_callback(*device, DEVCB_##_devcb);
+ devcb = &hmcs40_cpu_device::set_read_r##R##_callback(*device, DEVCB_##_devcb);
#define MCFG_HMCS40_WRITE_R_CB(R, _devcb) \
- hmcs40_cpu_device::set_write_r##R##_callback(*device, DEVCB_##_devcb);
+ devcb = &hmcs40_cpu_device::set_write_r##R##_callback(*device, DEVCB_##_devcb);
// 16-bit discrete
#define MCFG_HMCS40_READ_D_CB(_devcb) \
- hmcs40_cpu_device::set_read_d_callback(*device, DEVCB_##_devcb);
+ devcb = &hmcs40_cpu_device::set_read_d_callback(*device, DEVCB_##_devcb);
#define MCFG_HMCS40_WRITE_D_CB(_devcb) \
- hmcs40_cpu_device::set_write_d_callback(*device, DEVCB_##_devcb);
+ devcb = &hmcs40_cpu_device::set_write_d_callback(*device, DEVCB_##_devcb);
enum
{
@@ -116,7 +116,7 @@ class hmcs40_cpu_device : public cpu_device
{
public:
// construction/destruction
- hmcs40_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, int family, uint16_t polarity, int stack_levels, int pcwidth, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
+ hmcs40_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, int family, u16 polarity, int stack_levels, int pcwidth, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
: cpu_device(mconfig, type, name, tag, owner, clock, shortname, source)
, m_program_config("program", ENDIANNESS_LITTLE, 16, prgwidth, -1, program)
, m_data_config("data", ENDIANNESS_LITTLE, 8, datawidth, 0, data)
@@ -160,11 +160,11 @@ protected:
virtual void device_reset() override;
// device_execute_interface overrides
- virtual uint64_t execute_clocks_to_cycles(uint64_t clocks) const override { return (clocks + 4 - 1) / 4; } // 4 cycles per machine cycle
- virtual uint64_t execute_cycles_to_clocks(uint64_t cycles) const override { return (cycles * 4); } // "
- virtual uint32_t execute_min_cycles() const override { return 1; }
- virtual uint32_t execute_max_cycles() const override { return 2; }
- virtual uint32_t execute_input_lines() const override { return 2+1; } // 3rd one is internal
+ virtual u64 execute_clocks_to_cycles(u64 clocks) const override { return (clocks + 4 - 1) / 4; } // 4 cycles per machine cycle
+ virtual u64 execute_cycles_to_clocks(u64 cycles) const override { return (cycles * 4); } // "
+ virtual u32 execute_min_cycles() const override { return 1; }
+ virtual u32 execute_max_cycles() const override { return 2; }
+ virtual u32 execute_input_lines() const override { return 2+1; } // 3rd one is internal
virtual void execute_set_input(int line, int state) override;
virtual void execute_run() override;
@@ -172,9 +172,9 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return(spacenum == AS_PROGRAM) ? &m_program_config : ((spacenum == AS_DATA) ? &m_data_config : nullptr); }
// device_disasm_interface overrides
- virtual uint32_t disasm_min_opcode_bytes() const override { return 2; }
- virtual uint32_t disasm_max_opcode_bytes() const override { return 2; }
- virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override;
+ virtual u32 disasm_min_opcode_bytes() const override { return 2; }
+ virtual u32 disasm_max_opcode_bytes() const override { return 2; }
+ virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options) override;
virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
address_space_config m_program_config;
@@ -182,46 +182,46 @@ protected:
address_space *m_program;
address_space *m_data;
- int m_pcwidth; // Program Counter bit-width
+ int m_pcwidth; // Program Counter bit-width
int m_prgwidth;
int m_datawidth;
int m_pcmask;
int m_prgmask;
int m_datamask;
- int m_family; // MCU family (42-47)
- uint16_t m_polarity; // i/o polarity (pmos vs cmos)
- int m_stack_levels; // number of callstack levels
- uint16_t m_stack[4]; // max 4
- uint16_t m_op; // current opcode
- uint16_t m_prev_op;
- uint8_t m_i; // 4-bit immediate opcode param
- int m_eint_line; // which input_line caused an interrupt
+ int m_family; // MCU family (42-47)
+ u16 m_polarity; // i/o polarity (pmos vs cmos)
+ int m_stack_levels; // number of callstack levels
+ u16 m_stack[4]; // max 4
+ u16 m_op; // current opcode
+ u16 m_prev_op;
+ u8 m_i; // 4-bit immediate opcode param
+ int m_eint_line; // which input_line caused an interrupt
emu_timer *m_timer;
- int m_halt; // internal HLT state
+ int m_halt; // internal HLT state
attotime m_timer_halted_remain;
int m_icount;
- uint16_t m_pc; // Program Counter
- uint16_t m_prev_pc;
- uint8_t m_page; // LPU prepared page
- uint8_t m_a; // 4-bit Accumulator
- uint8_t m_b; // 4-bit B register
- uint8_t m_x; // 1/3/4-bit X register
- uint8_t m_spx; // 1/3/4-bit SPX register
- uint8_t m_y; // 4-bit Y register
- uint8_t m_spy; // 4-bit SPY register
- uint8_t m_s; // Status F/F (F/F = flip-flop)
- uint8_t m_c; // Carry F/F
- uint8_t m_tc; // Timer/Counter
- uint8_t m_cf; // CF F/F (timer mode or counter mode)
- uint8_t m_ie; // I/E(Interrupt Enable) F/F
- uint8_t m_iri; // external interrupt pending I/RI F/F
- uint8_t m_irt; // timer interrupt pending I/RT F/F
- uint8_t m_if[2]; // external interrupt mask IF0,1 F/F
- uint8_t m_tf; // timer interrupt mask TF F/F
- uint8_t m_int[2]; // INT0/1 pins state
- uint8_t m_r[8]; // R outputs state
- uint16_t m_d; // D pins state
+ u16 m_pc; // Program Counter
+ u16 m_prev_pc;
+ u8 m_page; // LPU prepared page
+ u8 m_a; // 4-bit Accumulator
+ u8 m_b; // 4-bit B register
+ u8 m_x; // 1/3/4-bit X register
+ u8 m_spx; // 1/3/4-bit SPX register
+ u8 m_y; // 4-bit Y register
+ u8 m_spy; // 4-bit SPY register
+ u8 m_s; // Status F/F (F/F = flip-flop)
+ u8 m_c; // Carry F/F
+ u8 m_tc; // Timer/Counter
+ u8 m_cf; // CF F/F (timer mode or counter mode)
+ u8 m_ie; // I/E(Interrupt Enable) F/F
+ u8 m_iri; // external interrupt pending I/RI F/F
+ u8 m_irt; // timer interrupt pending I/RT F/F
+ u8 m_if[2]; // external interrupt mask IF0,1 F/F
+ u8 m_tf; // timer interrupt mask TF F/F
+ u8 m_int[2]; // INT0/1 pins state
+ u8 m_r[8]; // R outputs state
+ u16 m_d; // D pins state
// i/o handlers
devcb_read8 m_read_r0, m_read_r1, m_read_r2, m_read_r3, m_read_r4, m_read_r5, m_read_r6, m_read_r7;
@@ -232,13 +232,13 @@ protected:
// misc internal helpers
void increment_pc();
- uint8_t ram_r();
- void ram_w(uint8_t data);
+ u8 ram_r();
+ void ram_w(u8 data);
void pop_stack();
void push_stack();
- virtual uint8_t read_r(int index);
- virtual void write_r(int index, uint8_t data);
+ virtual u8 read_r(int index);
+ virtual void write_r(int index, u8 data);
virtual int read_d(int index);
virtual void write_d(int index, int state);
@@ -349,109 +349,109 @@ protected:
class hmcs43_cpu_device : public hmcs40_cpu_device
{
public:
- hmcs43_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint16_t polarity, const char *shortname);
+ hmcs43_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, u16 polarity, const char *shortname);
protected:
// overrides
- virtual uint8_t read_r(int index) override;
- virtual void write_r(int index, uint8_t data) override;
+ virtual u8 read_r(int index) override;
+ virtual void write_r(int index, u8 data) override;
virtual int read_d(int index) override;
};
class hd38750_device : public hmcs43_cpu_device
{
public:
- hd38750_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ hd38750_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class hd38755_device : public hmcs43_cpu_device
{
public:
- hd38755_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ hd38755_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class hd44750_device : public hmcs43_cpu_device
{
public:
- hd44750_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ hd44750_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class hd44758_device : public hmcs43_cpu_device
{
public:
- hd44758_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ hd44758_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class hmcs44_cpu_device : public hmcs40_cpu_device
{
public:
- hmcs44_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint16_t polarity, const char *shortname);
+ hmcs44_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, u16 polarity, const char *shortname);
protected:
// overrides
- virtual uint8_t read_r(int index) override;
- virtual void write_r(int index, uint8_t data) override;
+ virtual u8 read_r(int index) override;
+ virtual void write_r(int index, u8 data) override;
};
class hd38800_device : public hmcs44_cpu_device
{
public:
- hd38800_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ hd38800_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class hd38805_device : public hmcs44_cpu_device
{
public:
- hd38805_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ hd38805_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class hd44801_device : public hmcs44_cpu_device
{
public:
- hd44801_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ hd44801_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class hd44808_device : public hmcs44_cpu_device
{
public:
- hd44808_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ hd44808_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class hmcs45_cpu_device : public hmcs40_cpu_device
{
public:
- hmcs45_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint16_t polarity, const char *shortname);
+ hmcs45_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, u16 polarity, const char *shortname);
protected:
// overrides
- virtual uint8_t read_r(int index) override;
- virtual void write_r(int index, uint8_t data) override;
+ virtual u8 read_r(int index) override;
+ virtual void write_r(int index, u8 data) override;
};
class hd38820_device : public hmcs45_cpu_device
{
public:
- hd38820_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ hd38820_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class hd38825_device : public hmcs45_cpu_device
{
public:
- hd38825_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ hd38825_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class hd44820_device : public hmcs45_cpu_device
{
public:
- hd44820_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ hd44820_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class hd44828_device : public hmcs45_cpu_device
{
public:
- hd44828_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ hd44828_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
diff --git a/src/devices/cpu/hmcs40/hmcs40d.cpp b/src/devices/cpu/hmcs40/hmcs40d.cpp
index 867972d82db..0b05d8b3f76 100644
--- a/src/devices/cpu/hmcs40/hmcs40d.cpp
+++ b/src/devices/cpu/hmcs40/hmcs40d.cpp
@@ -46,7 +46,7 @@ static const char *const s_mnemonics[] =
};
// number of bits per opcode parameter, 99 means (XY) parameter, negative means reversed bit-order
-static const int8_t s_bits[] =
+static const s8 s_bits[] =
{
0,
0, 0, 0, 0, 0, 4,
@@ -65,7 +65,7 @@ static const int8_t s_bits[] =
#define _OVER DASMFLAG_STEP_OVER
#define _OUT DASMFLAG_STEP_OUT
-static const uint32_t s_flags[] =
+static const u32 s_flags[] =
{
0,
0, 0, 0, 0, 0, 0,
@@ -82,7 +82,7 @@ static const uint32_t s_flags[] =
};
// next program counter in sequence (relative)
-static const int8_t s_next_pc[0x40] =
+static const s8 s_next_pc[0x40] =
{
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32+0x40 /* rollback */,
@@ -91,7 +91,7 @@ static const int8_t s_next_pc[0x40] =
};
-static const uint8_t hmcs40_mnemonic[0x400] =
+static const u8 hmcs40_mnemonic[0x400] =
{
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
/* 0x000 */
@@ -186,9 +186,9 @@ static const uint8_t hmcs40_mnemonic[0x400] =
CPU_DISASSEMBLE(hmcs40)
{
- uint16_t op = (oprom[0] | oprom[1] << 8) & 0x3ff;
- uint8_t instr = hmcs40_mnemonic[op];
- int8_t bits = s_bits[instr];
+ u16 op = (oprom[0] | oprom[1] << 8) & 0x3ff;
+ u8 instr = hmcs40_mnemonic[op];
+ s8 bits = s_bits[instr];
// special case for (XY) opcode
if (bits == 99)
@@ -207,7 +207,7 @@ CPU_DISASSEMBLE(hmcs40)
// opcode parameter
if (bits != 0)
{
- uint8_t param = op;
+ u8 param = op;
// reverse bits
if (bits < 0)
diff --git a/src/devices/cpu/hmcs40/hmcs40op.cpp b/src/devices/cpu/hmcs40/hmcs40op.cpp
index 31a74d76905..da89ff44fe7 100644
--- a/src/devices/cpu/hmcs40/hmcs40op.cpp
+++ b/src/devices/cpu/hmcs40/hmcs40op.cpp
@@ -8,15 +8,15 @@
// internal helpers
-inline uint8_t hmcs40_cpu_device::ram_r()
+inline u8 hmcs40_cpu_device::ram_r()
{
- uint8_t address = (m_x << 4 | m_y) & m_datamask;
+ u8 address = (m_x << 4 | m_y) & m_datamask;
return m_data->read_byte(address) & 0xf;
}
-inline void hmcs40_cpu_device::ram_w(uint8_t data)
+inline void hmcs40_cpu_device::ram_w(u8 data)
{
- uint8_t address = (m_x << 4 | m_y) & m_datamask;
+ u8 address = (m_x << 4 | m_y) & m_datamask;
m_data->write_byte(address, data & 0xf);
}
@@ -81,7 +81,7 @@ void hmcs40_cpu_device::op_xamr()
// XAMR m: Exchange A and MR(m)
// determine MR(Memory Register) location
- uint8_t address = m_op & 0xf;
+ u8 address = m_op & 0xf;
// HMCS42: MR0 on file 0, MR4-MR15 on file 4 (there is no file 1-3)
// HMCS43: MR0-MR3 on file 0-3, MR4-MR15 on file 4
@@ -93,7 +93,7 @@ void hmcs40_cpu_device::op_xamr()
address |= 0xf0;
address &= m_datamask;
- uint8_t old_a = m_a;
+ u8 old_a = m_a;
m_a = m_data->read_byte(address) & 0xf;
m_data->write_byte(address, old_a & 0xf);
}
@@ -160,13 +160,13 @@ void hmcs40_cpu_device::op_xsp()
// XSP (XY): Exchange X and SPX, Y and SPY, or NOP if 0
if (m_op & 1)
{
- uint8_t old_x = m_x;
+ u8 old_x = m_x;
m_x = m_spx;
m_spx = old_x;
}
if (m_op & 2)
{
- uint8_t old_y = m_y;
+ u8 old_y = m_y;
m_y = m_spy;
m_spy = old_y;
}
@@ -192,7 +192,7 @@ void hmcs40_cpu_device::op_lbm()
void hmcs40_cpu_device::op_xma()
{
// XMA (XY): Exchange Memory and A
- uint8_t old_a = m_a;
+ u8 old_a = m_a;
m_a = ram_r();
ram_w(old_a);
op_xsp();
@@ -201,7 +201,7 @@ void hmcs40_cpu_device::op_xma()
void hmcs40_cpu_device::op_xmb()
{
// XMB (XY): Exchange Memory and B
- uint8_t old_b = m_b;
+ u8 old_b = m_b;
m_b = ram_r();
ram_w(old_b);
op_xsp();
@@ -357,7 +357,7 @@ void hmcs40_cpu_device::op_rotl()
void hmcs40_cpu_device::op_rotr()
{
// ROTR: Rotate Right A with Carry
- uint8_t c = m_a & 1;
+ u8 c = m_a & 1;
m_a = m_a >> 1 | m_c << 3;
m_c = c;
}
@@ -470,7 +470,7 @@ void hmcs40_cpu_device::op_lpu()
void hmcs40_cpu_device::op_tbr()
{
// TBR p: Table Branch
- uint16_t address = m_a | m_b << 4 | m_c << 8 | (m_op & 7) << 9 | (m_pc & ~0x3f);
+ u16 address = m_a | m_b << 4 | m_c << 8 | (m_op & 7) << 9 | (m_pc & ~0x3f);
m_pc = address & m_pcmask;
}
@@ -661,8 +661,8 @@ void hmcs40_cpu_device::op_p()
{
// P p: Pattern Generation
m_icount--;
- uint16_t address = m_a | m_b << 4 | m_c << 8 | (m_op & 7) << 9 | (m_pc & ~0x3f);
- uint16_t o = m_program->read_word((address & m_prgmask) << 1);
+ u16 address = m_a | m_b << 4 | m_c << 8 | (m_op & 7) << 9 | (m_pc & ~0x3f);
+ u16 o = m_program->read_word((address & m_prgmask) << 1);
// destination is determined by the 2 highest bits
if (o & 0x100)
diff --git a/src/devices/cpu/hphybrid/hphybrid.h b/src/devices/cpu/hphybrid/hphybrid.h
index c4f85f196b5..62e4724139a 100644
--- a/src/devices/cpu/hphybrid/hphybrid.h
+++ b/src/devices/cpu/hphybrid/hphybrid.h
@@ -77,7 +77,7 @@
// PA changed callback
#define MCFG_HPHYBRID_PA_CHANGED(_devcb) \
- hp_hybrid_cpu_device::set_pa_changed_func(*device , DEVCB_##_devcb);
+ devcb = &hp_hybrid_cpu_device::set_pa_changed_func(*device , DEVCB_##_devcb);
class hp_hybrid_cpu_device : public cpu_device
{
diff --git a/src/devices/cpu/i386/i386.h b/src/devices/cpu/i386/i386.h
index c4abab31915..ca299b6cf1d 100644
--- a/src/devices/cpu/i386/i386.h
+++ b/src/devices/cpu/i386/i386.h
@@ -20,7 +20,7 @@
#define MCFG_I386_SMIACT(_devcb) \
- i386_device::set_smiact(*device, DEVCB_##_devcb);
+ devcb = &i386_device::set_smiact(*device, DEVCB_##_devcb);
#define X86_NUM_CPUS 4
diff --git a/src/devices/cpu/i8085/i8085.h b/src/devices/cpu/i8085/i8085.h
index 71074291d1a..46f6e1eee0b 100644
--- a/src/devices/cpu/i8085/i8085.h
+++ b/src/devices/cpu/i8085/i8085.h
@@ -34,19 +34,19 @@ enum
/* STATUS changed callback */
#define MCFG_I8085A_STATUS(_devcb) \
- i8085a_cpu_device::set_out_status_func(*device, DEVCB_##_devcb);
+ devcb = &i8085a_cpu_device::set_out_status_func(*device, DEVCB_##_devcb);
/* INTE changed callback */
#define MCFG_I8085A_INTE(_devcb) \
- i8085a_cpu_device::set_out_inte_func(*device, DEVCB_##_devcb);
+ devcb = &i8085a_cpu_device::set_out_inte_func(*device, DEVCB_##_devcb);
/* SID changed callback (8085A only) */
#define MCFG_I8085A_SID(_devcb) \
- i8085a_cpu_device::set_in_sid_func(*device, DEVCB_##_devcb);
+ devcb = &i8085a_cpu_device::set_in_sid_func(*device, DEVCB_##_devcb);
/* SOD changed callback (8085A only) */
#define MCFG_I8085A_SOD(_devcb) \
- i8085a_cpu_device::set_out_sod_func(*device, DEVCB_##_devcb);
+ devcb = &i8085a_cpu_device::set_out_sod_func(*device, DEVCB_##_devcb);
class i8085a_cpu_device : public cpu_device
diff --git a/src/devices/cpu/i8089/i8089.h b/src/devices/cpu/i8089/i8089.h
index 4354ceffdf2..81c84089300 100644
--- a/src/devices/cpu/i8089/i8089.h
+++ b/src/devices/cpu/i8089/i8089.h
@@ -23,10 +23,10 @@
i8089_device::set_databus_width(*device, _databus_width);
#define MCFG_I8089_SINTR1(_sintr1) \
- downcast<i8089_device *>(device)->set_sintr1_callback(DEVCB_##_sintr1);
+ devcb = &downcast<i8089_device *>(device)->set_sintr1_callback(DEVCB_##_sintr1);
#define MCFG_I8089_SINTR2(_sintr2) \
- downcast<i8089_device *>(device)->set_sintr2_callback(DEVCB_##_sintr2);
+ devcb = &downcast<i8089_device *>(device)->set_sintr2_callback(DEVCB_##_sintr2);
//**************************************************************************
@@ -47,8 +47,8 @@ public:
i8089_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// callbacks
- template<class _sintr1> void set_sintr1_callback(_sintr1 sintr1) { m_write_sintr1.set_callback(sintr1); }
- template<class _sintr2> void set_sintr2_callback(_sintr2 sintr2) { m_write_sintr2.set_callback(sintr2); }
+ template<class _sintr1> devcb_base &set_sintr1_callback(_sintr1 sintr1) { return m_write_sintr1.set_callback(sintr1); }
+ template<class _sintr2> devcb_base &set_sintr2_callback(_sintr2 sintr2) { return m_write_sintr2.set_callback(sintr2); }
// static configuration helpers
static void set_databus_width(device_t &device, uint8_t databus_width) { downcast<i8089_device &>(device).m_databus_width = databus_width; }
diff --git a/src/devices/cpu/lh5801/lh5801.h b/src/devices/cpu/lh5801/lh5801.h
index 4b693c1961c..d48c8661e01 100644
--- a/src/devices/cpu/lh5801/lh5801.h
+++ b/src/devices/cpu/lh5801/lh5801.h
@@ -61,7 +61,7 @@ enum
#define MCFG_LH5801_IN(_devcb) \
- lh5801_cpu_device::set_in_func(*device, DEVCB_##_devcb);
+ devcb = &lh5801_cpu_device::set_in_func(*device, DEVCB_##_devcb);
class lh5801_cpu_device : public cpu_device
diff --git a/src/devices/cpu/lr35902/lr35902.h b/src/devices/cpu/lr35902/lr35902.h
index ad032fbebba..b1b511db760 100644
--- a/src/devices/cpu/lr35902/lr35902.h
+++ b/src/devices/cpu/lr35902/lr35902.h
@@ -7,7 +7,7 @@
#define MCFG_LR35902_TIMER_CB(_devcb) \
- lr35902_cpu_device::set_timer_cb(*device, DEVCB_##_devcb);
+ devcb = &lr35902_cpu_device::set_timer_cb(*device, DEVCB_##_devcb);
// The first release of this CPU has a bug where the programcounter
// is not incremented properly after an interrupt after the halt opcode.
@@ -19,7 +19,7 @@
// a 16-bit register in the $fe** region.
// note: oldval is in hiword, newval is in loword
#define MCFG_LR35902_INCDEC16_CB(_devcb) \
- lr35902_cpu_device::set_incdec16_cb(*device, DEVCB_##_devcb);
+ devcb = &lr35902_cpu_device::set_incdec16_cb(*device, DEVCB_##_devcb);
enum
diff --git a/src/devices/cpu/m6800/m6800.h b/src/devices/cpu/m6800/m6800.h
index c81f98c6fb3..df58ecd27c6 100644
--- a/src/devices/cpu/m6800/m6800.h
+++ b/src/devices/cpu/m6800/m6800.h
@@ -67,9 +67,9 @@ enum
#define MCFG_M6801_SC2(_devcb) \
- m6800_cpu_device::set_out_sc2_func(*device, DEVCB_##_devcb);
+ devcb = &m6800_cpu_device::set_out_sc2_func(*device, DEVCB_##_devcb);
#define MCFG_M6801_SER_TX(_devcb) \
- m6800_cpu_device::set_out_sertx_func(*device, DEVCB_##_devcb);
+ devcb = &m6800_cpu_device::set_out_sertx_func(*device, DEVCB_##_devcb);
class m6800_cpu_device : public cpu_device
{
diff --git a/src/devices/cpu/m6805/6805dasm.cpp b/src/devices/cpu/m6805/6805dasm.cpp
index 010840061e2..e8cca5bf4e3 100644
--- a/src/devices/cpu/m6805/6805dasm.cpp
+++ b/src/devices/cpu/m6805/6805dasm.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Aaron Giles
+// copyright-holders:Aaron Giles, Vas Crabb
/*
* A quick-hack 68(7)05 disassembler
*
@@ -18,7 +18,7 @@
namespace {
enum class md {
- IMP, // implicit
+ INH, // inherent
BTR, // bit test and relative
BIT, // bit set/clear
REL, // relative
@@ -30,138 +30,96 @@ enum class md {
IX2 // indexed + word offset
};
-enum op_names {
- adca=0, adda, anda, asl, asla, aslx, asr, asra,
+enum class lvl {
+ HMOS,
+ CMOS,
+ HC
+};
+
+enum class op_names {
+ adca, adda, anda, asl, asla, aslx, asr, asra,
asrx, bcc, bclr, bcs, beq, bhcc, bhcs, bhi,
- bih, bil, bita, bls, bmc, bmi, bms, bne,
+ bih, bil, bit, bls, bmc, bmi, bms, bne,
bpl, bra, brclr, brn, brset, bset, bsr, clc,
cli, clr, clra, clrx, cmpa, com, coma, comx,
cpx, dec, deca, decx, eora, ill, inc, inca,
incx, jmp, jsr, lda, ldx, lsr, lsra, lsrx,
- neg, nega, negx, nop, ora, rol, rola, rolx,
- ror, rora, rorx, rsp, rti, rts, sbca, sec,
- sei, sta, stx, suba, swi, tax, tst, tsta,
- tstx, txa
-};
-
-char const *const op_name_str[] = {
- "adca", "adda", "anda", "asl", "asla", "aslx", "asr", "asra",
- "asrx", "bcc", "bclr", "bcs", "beq", "bhcc", "bhcs", "bhi",
- "bih", "bil", "bita", "bls", "bmc", "bmi", "bms", "bne",
- "bpl", "bra", "brclr","brn", "brset","bset", "bsr", "clc",
- "cli", "clr", "clra", "clrx", "cmpa", "com", "coma", "comx",
- "cpx", "dec", "deca", "decx", "eora", "*ill", "inc", "inca",
- "incx", "jmp", "jsr", "lda", "ldx", "lsr", "lsra", "lsrx",
- "neg", "nega", "negx", "nop", "ora", "rol", "rola", "rolx",
- "ror", "rora", "rorx", "rsp", "rti", "rts", "sbca", "sec",
- "sei", "sta", "stx", "suba", "swi", "tax", "tst", "tsta",
- "tstx", "txa"
+ mul, neg, nega, negx, nop, ora, rol, rola,
+ rolx, ror, rora, rorx, rsp, rti, rts, sbca,
+ sec, sei, sta, stop, stx, suba, swi, tax,
+ tst, tsta, tstx, txa, wait
};
-struct { u8 op; md mode; } const disasm[0x100] = {
- {brset,md::BTR}, {brclr,md::BTR}, {brset,md::BTR}, {brclr,md::BTR}, // 00
- {brset,md::BTR}, {brclr,md::BTR}, {brset,md::BTR}, {brclr,md::BTR},
- {brset,md::BTR}, {brclr,md::BTR}, {brset,md::BTR}, {brclr,md::BTR},
- {brset,md::BTR}, {brclr,md::BTR}, {brset,md::BTR}, {brclr,md::BTR},
- {bset, md::BIT}, {bclr, md::BIT}, {bset, md::BIT}, {bclr, md::BIT}, // 10
- {bset, md::BIT}, {bclr, md::BIT}, {bset, md::BIT}, {bclr, md::BIT},
- {bset, md::BIT}, {bclr, md::BIT}, {bset, md::BIT}, {bclr, md::BIT},
- {bset, md::BIT}, {bclr, md::BIT}, {bset, md::BIT}, {bclr, md::BIT},
- {bra, md::REL}, {brn, md::REL}, {bhi, md::REL}, {bls, md::REL}, // 20
- {bcc, md::REL}, {bcs, md::REL}, {bne, md::REL}, {beq, md::REL},
- {bhcc, md::REL}, {bhcs, md::REL}, {bpl, md::REL}, {bmi, md::REL},
- {bmc, md::REL}, {bms, md::REL}, {bil, md::REL}, {bih, md::REL},
- {neg, md::DIR}, {ill, md::IMP}, {ill, md::IMP}, {com, md::DIR}, // 30
- {lsr, md::DIR}, {ill, md::IMP}, {ror, md::DIR}, {asr, md::DIR},
- {asl, md::DIR}, {rol, md::DIR}, {dec, md::DIR}, {ill, md::IMP},
- {inc, md::DIR}, {tst, md::DIR}, {ill, md::IMP}, {clr, md::DIR},
- {nega, md::IMP}, {ill, md::IMP}, {ill, md::IMP}, {coma, md::IMP}, // 40
- {lsra, md::IMP}, {ill, md::IMP}, {rora, md::IMP}, {asra, md::IMP},
- {asla, md::IMP}, {rola, md::IMP}, {deca, md::IMP}, {ill, md::IMP},
- {inca, md::IMP}, {tsta, md::IMP}, {ill, md::IMP}, {clra, md::IMP},
- {negx, md::IMP}, {ill, md::IMP}, {ill, md::IMP}, {comx, md::IMP}, // 50
- {lsrx, md::IMP}, {ill, md::IMP}, {rorx, md::IMP}, {asrx, md::IMP},
- {aslx, md::IMP}, {rolx, md::IMP}, {decx, md::IMP}, {ill, md::IMP},
- {incx, md::IMP}, {tstx, md::IMP}, {ill, md::IMP}, {clrx, md::IMP},
- {neg, md::IX1}, {ill, md::IMP}, {ill, md::IMP}, {com, md::IX1}, // 60
- {lsr, md::IX1}, {ill, md::IMP}, {ror, md::IX1}, {asr, md::IX1},
- {asl, md::IX1}, {rol, md::IX1}, {dec, md::IX1}, {ill, md::IMP},
- {inc, md::IX1}, {tst, md::IX1}, {jmp, md::IX1}, {clr, md::IX1},
- {neg, md::IDX}, {ill, md::IMP}, {ill, md::IMP}, {com, md::IDX}, // 70
- {lsr, md::IDX}, {ill, md::IMP}, {ror, md::IDX}, {asr, md::IDX},
- {asl, md::IDX}, {rol, md::IDX}, {dec, md::IDX}, {ill, md::IMP},
- {inc, md::IDX}, {tst, md::IDX}, {jmp, md::IDX}, {clr, md::IDX},
- {rti, md::IMP}, {rts, md::IMP}, {ill, md::IMP}, {swi, md::IMP}, // 80
- {ill, md::IMP}, {ill, md::IMP}, {ill, md::IMP}, {ill, md::IMP},
- {ill, md::IMP}, {ill, md::IMP}, {ill, md::IMP}, {ill, md::IMP},
- {ill, md::IMP}, {ill, md::IMP}, {ill, md::IMP}, {ill, md::IMP},
- {ill, md::IMP}, {ill, md::IMP}, {ill, md::IMP}, {ill, md::IMP}, // 90
- {ill, md::IMP}, {ill, md::IMP}, {ill, md::IMP}, {tax, md::IMP},
- {clc, md::IMP}, {sec, md::IMP}, {cli, md::IMP}, {sei, md::IMP},
- {rsp, md::IMP}, {nop, md::IMP}, {ill, md::IMP}, {txa, md::IMP},
- {suba, md::IMM}, {cmpa, md::IMM}, {sbca, md::IMM}, {cpx, md::IMM}, // a0
- {anda, md::IMM}, {bita, md::IMM}, {lda, md::IMM}, {ill, md::IMP},
- {eora, md::IMM}, {adca, md::IMM}, {ora, md::IMM}, {adda, md::IMM},
- {ill, md::IMP}, {bsr, md::REL}, {ldx, md::IMM}, {ill, md::IMP},
- {suba, md::DIR}, {cmpa, md::DIR}, {sbca, md::DIR}, {cpx, md::DIR}, // b0
- {anda, md::DIR}, {bita, md::DIR}, {lda, md::DIR}, {sta, md::DIR},
- {eora, md::DIR}, {adca, md::DIR}, {ora, md::DIR}, {adda, md::DIR},
- {jmp, md::DIR}, {jsr, md::DIR}, {ldx, md::DIR}, {stx, md::DIR},
- {suba, md::EXT}, {cmpa, md::EXT}, {sbca, md::EXT}, {cpx, md::EXT}, // c0
- {anda, md::EXT}, {bita, md::EXT}, {lda, md::EXT}, {sta, md::EXT},
- {eora, md::EXT}, {adca, md::EXT}, {ora, md::EXT}, {adda, md::EXT},
- {jmp, md::EXT}, {jsr, md::EXT}, {ldx, md::EXT}, {stx, md::EXT},
- {suba, md::IX2}, {cmpa, md::IX2}, {sbca, md::IX2}, {cpx, md::IX2}, // d0
- {anda, md::IX2}, {bita, md::IX2}, {lda, md::IX2}, {sta, md::IX2},
- {eora, md::IX2}, {adca, md::IX2}, {ora, md::IX2}, {adda, md::IX2},
- {jmp, md::IX2}, {jsr, md::IX2}, {ldx, md::IX2}, {stx, md::IX2},
- {suba, md::IX1}, {cmpa, md::IX1}, {sbca, md::IX1}, {cpx, md::IX1}, // e0
- {anda, md::IX1}, {bita, md::IX1}, {lda, md::IX1}, {sta, md::IX1},
- {eora, md::IX1}, {adca, md::IX1}, {ora, md::IX1}, {adda, md::IX1},
- {jmp, md::IX1}, {jsr, md::IX1}, {ldx, md::IX1}, {stx, md::IX1},
- {suba, md::IDX}, {cmpa, md::IDX}, {sbca, md::IDX}, {cpx, md::IDX}, // f0
- {anda, md::IDX}, {bita, md::IDX}, {lda, md::IDX}, {sta, md::IDX},
- {eora, md::IDX}, {adca, md::IDX}, {ora, md::IDX}, {adda, md::IDX},
- {jmp, md::IDX}, {jsr, md::IDX}, {ldx, md::IDX}, {stx, md::IDX}
-};
-
-#if 0
-char const *const opcode_strings[0x0100] =
-{
- "brset0", "brclr0", "brset1", "brclr1", "brset2", "brclr2", "brset3", "brclr3", /*00*/
- "brset4", "brclr4", "brset5", "brclr5", "brset6", "brclr6", "brset7", "brclr7",
- "bset0", "bclr0", "bset1", "bclr1", "bset2", "bclr2", "bset3", "bclr3", /*10*/
- "bset4", "bclr4", "bset5", "bclr5", "bset6", "bclr6", "bset7", "bclr7",
- "bra", "brn", "bhi", "bls", "bcc", "bcs", "bne", "beq", /*20*/
- "bhcc", "bhcs", "bpl", "bmi", "bmc", "bms", "bil", "bih",
- "neg_di", "illegal", "illegal", "com_di", "lsr_di", "illegal", "ror_di", "asr_di", /*30*/
- "asl_di", "rol_di", "dec_di", "illegal", "inc_di", "tst_di", "illegal", "clr_di",
- "nega", "illegal", "illegal", "coma", "lsra", "illegal", "rora", "asra", /*40*/
- "asla", "rola", "deca", "illegal", "inca", "tsta", "illegal", "clra",
- "negx", "illegal", "illegal", "comx", "lsrx", "illegal", "rorx", "asrx", /*50*/
- "aslx", "rolx", "decx", "illegal", "incx", "tstx", "illegal", "clrx",
- "neg_ix1", "illegal", "illegal", "com_ix1", "lsr_ix1", "illegal", "ror_ix1", "asr_ix1", /*60*/
- "asl_ix1", "rol_ix1", "dec_ix1", "illegal", "inc_ix1", "tst_ix1", "jmp_ix1", "clr_ix1",
- "neg_ix", "illegal", "illegal", "com_ix", "lsr_ix", "illegal", "ror_ix", "asr_ix", /*70*/
- "asl_ix", "rol_ix", "dec_ix", "illegal", "inc_ix", "tst_ix", "jmp_ix", "clr_ix",
- "rti", "rts", "illegal", "swi", "illegal", "illegal", "illegal", "illegal", /*80*/
- "illegal", "illegal", "illegal", "illegal", "illegal", "illegal", "illegal", "illegal",
- "illegal", "illegal", "illegal", "illegal", "illegal", "illegal", "illegal", "tax", /*90*/
- "clc", "sec", "cli", "sei", "rsp", "nop", "illegal", "txa",
- "suba_im", "cmpa_im", "sbca_im", "cpx_im", "anda_im", "bita_im", "lda_im", "illegal", /*A0*/
- "eora_im", "adca_im", "ora_im", "adda_im", "illegal", "bsr", "ldx_im", "illegal",
- "suba_di", "cmpa_di", "sbca_di", "cpx_di", "anda_di", "bita_di", "lda_di", "sta_di", /*B0*/
- "eora_di", "adca_di", "ora_di", "adda_di", "jmp_di", "jsr_di", "ldx_di", "stx_di",
- "suba_ex", "cmpa_ex", "sbca_ex", "cpx_ex", "anda_ex", "bita_ex", "lda_ex", "sta_ex", /*C0*/
- "eora_ex", "adca_ex", "ora_ex", "adda_ex", "jmp_ex", "jsr_ex", "ldx_ex", "stx_ex",
- "suba_ix2", "cmpa_ix2", "sbca_ix2", "cpx_ix2", "anda_ix2", "bita_ix2", "lda_ix2", "sta_ix2", /*D0*/
- "eora_ix2", "adca_ix2", "ora_ix2", "adda_ix2", "jmp_ix2", "jsr_ix2", "ldx_ix2", "stx_ix2",
- "suba_ix1", "cmpa_ix1", "sbca_ix1", "cpx_ix1", "anda_ix1", "bita_ix1", "lda_ix1", "sta_ix1", /*E0*/
- "eora_ix1", "adca_ix1", "ora_ix1", "adda_ix1", "jmp_ix1", "jsr_ix1", "ldx_ix1", "stx_ix1",
- "suba_ix", "cmpa_ix", "sbca_ix", "cpx_ix", "anda_ix", "bita_ix", "lda_ix", "sta_ix", /*F0*/
- "eora_ix", "adca_ix", "ora_ix", "adda_ix", "jmp_ix", "jsr_ix", "ldx_ix", "stx_ix"
+#define OP(name, mode) { op_names::name, #name, md::mode, lvl::HMOS }
+#define OPC(name, mode) { op_names::name, #name, md::mode, lvl::CMOS }
+#define OPHC(name, mode) { op_names::name, #name, md::mode, lvl::HC }
+#define ILLEGAL { op_names::ill, nullptr, md::INH, lvl::HMOS }
+struct { op_names op; char const *name; md mode; lvl level; } const disasm[0x100] = {
+ OP (brset,BTR), OP (brclr,BTR), OP (brset,BTR), OP (brclr,BTR), // 00
+ OP (brset,BTR), OP (brclr,BTR), OP (brset,BTR), OP (brclr,BTR),
+ OP (brset,BTR), OP (brclr,BTR), OP (brset,BTR), OP (brclr,BTR),
+ OP (brset,BTR), OP (brclr,BTR), OP (brset,BTR), OP (brclr,BTR),
+ OP (bset, BIT), OP (bclr, BIT), OP (bset, BIT), OP (bclr, BIT), // 10
+ OP (bset, BIT), OP (bclr, BIT), OP (bset, BIT), OP (bclr, BIT),
+ OP (bset, BIT), OP (bclr, BIT), OP (bset, BIT), OP (bclr, BIT),
+ OP (bset, BIT), OP (bclr, BIT), OP (bset, BIT), OP (bclr, BIT),
+ OP (bra, REL), OP (brn, REL), OP (bhi, REL), OP (bls, REL), // 20
+ OP (bcc, REL), OP (bcs, REL), OP (bne, REL), OP (beq, REL),
+ OP (bhcc, REL), OP (bhcs, REL), OP (bpl, REL), OP (bmi, REL),
+ OP (bmc, REL), OP (bms, REL), OP (bil, REL), OP (bih, REL),
+ OP (neg, DIR), ILLEGAL , ILLEGAL , OP (com, DIR), // 30
+ OP (lsr, DIR), ILLEGAL , OP (ror, DIR), OP (asr, DIR),
+ OP (asl, DIR), OP (rol, DIR), OP (dec, DIR), ILLEGAL ,
+ OP (inc, DIR), OP (tst, DIR), ILLEGAL , OP (clr, DIR),
+ OP (nega, INH), ILLEGAL , OPHC(mul, INH), OP (coma, INH), // 40
+ OP (lsra, INH), ILLEGAL , OP (rora, INH), OP (asra, INH),
+ OP (asla, INH), OP (rola, INH), OP (deca, INH), ILLEGAL ,
+ OP (inca, INH), OP (tsta, INH), ILLEGAL , OP (clra, INH),
+ OP (negx, INH), ILLEGAL , ILLEGAL , OP (comx, INH), // 50
+ OP (lsrx, INH), ILLEGAL , OP (rorx, INH), OP (asrx, INH),
+ OP (aslx, INH), OP (rolx, INH), OP (decx, INH), ILLEGAL ,
+ OP (incx, INH), OP (tstx, INH), ILLEGAL , OP (clrx, INH),
+ OP (neg, IX1), ILLEGAL , ILLEGAL , OP (com, IX1), // 60
+ OP (lsr, IX1), ILLEGAL , OP (ror, IX1), OP (asr, IX1),
+ OP (asl, IX1), OP (rol, IX1), OP (dec, IX1), ILLEGAL ,
+ OP (inc, IX1), OP (tst, IX1), OP (jmp, IX1), OP (clr, IX1),
+ OP (neg, IDX), ILLEGAL , ILLEGAL , OP (com, IDX), // 70
+ OP (lsr, IDX), ILLEGAL , OP (ror, IDX), OP (asr, IDX),
+ OP (asl, IDX), OP (rol, IDX), OP (dec, IDX), ILLEGAL ,
+ OP (inc, IDX), OP (tst, IDX), OP (jmp, IDX), OP (clr, IDX),
+ OP (rti, INH), OP (rts, INH), ILLEGAL , OP (swi, INH), // 80
+ ILLEGAL , ILLEGAL , ILLEGAL , ILLEGAL ,
+ ILLEGAL , ILLEGAL , ILLEGAL , ILLEGAL ,
+ ILLEGAL , ILLEGAL , OPC (stop, INH), OPC (wait, INH),
+ ILLEGAL , ILLEGAL , ILLEGAL , ILLEGAL , // 90
+ ILLEGAL , ILLEGAL , ILLEGAL , OP (tax, INH),
+ OP (clc, INH), OP (sec, INH), OP (cli, INH), OP (sei, INH),
+ OP (rsp, INH), OP (nop, INH), ILLEGAL , OP (txa, INH),
+ OP (suba, IMM), OP (cmpa, IMM), OP (sbca, IMM), OP (cpx, IMM), // a0
+ OP (anda, IMM), OP (bit, IMM), OP (lda, IMM), ILLEGAL ,
+ OP (eora, IMM), OP (adca, IMM), OP (ora, IMM), OP (adda, IMM),
+ ILLEGAL , OP (bsr, REL), OP (ldx, IMM), ILLEGAL ,
+ OP (suba, DIR), OP (cmpa, DIR), OP (sbca, DIR), OP (cpx, DIR), // b0
+ OP (anda, DIR), OP (bit, DIR), OP (lda, DIR), OP (sta, DIR),
+ OP (eora, DIR), OP (adca, DIR), OP (ora, DIR), OP (adda, DIR),
+ OP (jmp, DIR), OP (jsr, DIR), OP (ldx, DIR), OP (stx, DIR),
+ OP (suba, EXT), OP (cmpa, EXT), OP (sbca, EXT), OP (cpx, EXT), // c0
+ OP (anda, EXT), OP (bit, EXT), OP (lda, EXT), OP (sta, EXT),
+ OP (eora, EXT), OP (adca, EXT), OP (ora, EXT), OP (adda, EXT),
+ OP (jmp, EXT), OP (jsr, EXT), OP (ldx, EXT), OP (stx, EXT),
+ OP (suba, IX2), OP (cmpa, IX2), OP (sbca, IX2), OP (cpx, IX2), // d0
+ OP (anda, IX2), OP (bit, IX2), OP (lda, IX2), OP (sta, IX2),
+ OP (eora, IX2), OP (adca, IX2), OP (ora, IX2), OP (adda, IX2),
+ OP (jmp, IX2), OP (jsr, IX2), OP (ldx, IX2), OP (stx, IX2),
+ OP (suba, IX1), OP (cmpa, IX1), OP (sbca, IX1), OP (cpx, IX1), // e0
+ OP (anda, IX1), OP (bit, IX1), OP (lda, IX1), OP (sta, IX1),
+ OP (eora, IX1), OP (adca, IX1), OP (ora, IX1), OP (adda, IX1),
+ OP (jmp, IX1), OP (jsr, IX1), OP (ldx, IX1), OP (stx, IX1),
+ OP (suba, IDX), OP (cmpa, IDX), OP (sbca, IDX), OP (cpx, IDX), // f0
+ OP (anda, IDX), OP (bit, IDX), OP (lda, IDX), OP (sta, IDX),
+ OP (eora, IDX), OP (adca, IDX), OP (ora, IDX), OP (adda, IDX),
+ OP (jmp, IDX), OP (jsr, IDX), OP (ldx, IDX), OP (stx, IDX)
};
-#endif
template <typename T>
@@ -182,90 +140,142 @@ void format_address(
util::stream_format(stream, "$%0*X", 2 * sizeof(T), address);
}
-} // anonymous namespace
-
-offs_t CPU_DISASSEMBLE_NAME(m6805)(
+offs_t disassemble(
cpu_device *device,
std::ostream &stream,
offs_t pc,
const u8 *oprom,
const u8 *opram,
int options,
+ lvl level,
std::pair<u16, char const *> const symbols[],
std::size_t symbol_count)
{
u8 const code = oprom[0];
- u32 flags = 0;
- switch (disasm[code].op)
+ if (!disasm[code].name || (disasm[code].level > level))
{
- case bsr:
- case jsr:
- flags = DASMFLAG_STEP_OVER;
- break;
- case rts:
- case rti:
- flags = DASMFLAG_STEP_OUT;
- break;
+ util::stream_format(stream, "%-6s$%02X", "fcb", code);
+ return 1 | DASMFLAG_SUPPORTED;
}
+ else
+ {
+ u32 flags;
+ switch (disasm[code].op)
+ {
+ case op_names::bsr:
+ case op_names::jsr:
+ flags = DASMFLAG_STEP_OVER;
+ break;
+ case op_names::rts:
+ case op_names::rti:
+ flags = DASMFLAG_STEP_OUT;
+ break;
+ default:
+ flags = 0;
+ }
- util::stream_format(stream, "%-6s", op_name_str[disasm[code].op]);
+ util::stream_format(stream, "%-6s", disasm[code].name);
- int bit;
- u16 ea;
- switch (disasm[code].mode)
- {
- case md::IMP: // implicit
- return 1 | flags | DASMFLAG_SUPPORTED;
+ int bit;
+ u16 ea;
+ switch (disasm[code].mode)
+ {
+ case md::INH: // inherent
+ return 1 | flags | DASMFLAG_SUPPORTED;
- case md::BTR: // bit test and relative branch
- bit = (code >> 1) & 7;
- util::stream_format(stream, "%d,", bit);
- format_address(stream, opram[1], symbols, symbol_count);
- util::stream_format(stream, ",$%03X", pc + 3 + s8(opram[2]));
- return 3 | flags | DASMFLAG_SUPPORTED;
+ case md::BTR: // bit test and relative branch
+ bit = (code >> 1) & 7;
+ util::stream_format(stream, "%d,", bit);
+ format_address(stream, opram[1], symbols, symbol_count);
+ util::stream_format(stream, ",$%03X", pc + 3 + s8(opram[2]));
+ return 3 | flags | DASMFLAG_SUPPORTED;
- case md::BIT: // bit test
- bit = (code >> 1) & 7;
- util::stream_format(stream, "%d,", bit);
- format_address(stream, opram[1], symbols, symbol_count);
- return 2 | flags | DASMFLAG_SUPPORTED;
+ case md::BIT: // bit test
+ bit = (code >> 1) & 7;
+ util::stream_format(stream, "%d,", bit);
+ format_address(stream, opram[1], symbols, symbol_count);
+ return 2 | flags | DASMFLAG_SUPPORTED;
- case md::REL: // relative
- util::stream_format(stream, "$%03X", pc + 2 + s8(opram[1]));
- return 2 | flags | DASMFLAG_SUPPORTED;
+ case md::REL: // relative
+ util::stream_format(stream, "$%03X", pc + 2 + s8(opram[1]));
+ return 2 | flags | DASMFLAG_SUPPORTED;
- case md::IMM: // immediate
- util::stream_format(stream, "#$%02X", opram[1]);
- return 2 | flags | DASMFLAG_SUPPORTED;
+ case md::IMM: // immediate
+ util::stream_format(stream, "#$%02X", opram[1]);
+ return 2 | flags | DASMFLAG_SUPPORTED;
- case md::DIR: // direct (zero page address)
- format_address(stream, opram[1], symbols, symbol_count);
- return 2 | flags | DASMFLAG_SUPPORTED;
+ case md::DIR: // direct (zero page address)
+ format_address(stream, opram[1], symbols, symbol_count);
+ return 2 | flags | DASMFLAG_SUPPORTED;
- case md::EXT: // extended (16 bit address)
- ea = (opram[1] << 8) + opram[2];
- format_address(stream, ea, symbols, symbol_count);
- return 3 | flags | DASMFLAG_SUPPORTED;
+ case md::EXT: // extended (16 bit address)
+ ea = (opram[1] << 8) + opram[2];
+ format_address(stream, ea, symbols, symbol_count);
+ return 3 | flags | DASMFLAG_SUPPORTED;
- case md::IDX: // indexed
- util::stream_format(stream, "(x)");
- return 1 | flags | DASMFLAG_SUPPORTED;
+ case md::IDX: // indexed
+ util::stream_format(stream, "(x)");
+ return 1 | flags | DASMFLAG_SUPPORTED;
- case md::IX1: // indexed + byte (zero page)
- util::stream_format(stream, "(x+$%02X)", opram[1]);
- return 2 | flags | DASMFLAG_SUPPORTED;
+ case md::IX1: // indexed + byte (zero page)
+ util::stream_format(stream, "(x+$%02X)", opram[1]);
+ return 2 | flags | DASMFLAG_SUPPORTED;
- case md::IX2: // indexed + word (16 bit address)
- ea = (opram[1] << 8) + opram[2];
- util::stream_format(stream, "(x+$%04X)", ea);
- return 3 | flags | DASMFLAG_SUPPORTED;
+ case md::IX2: // indexed + word (16 bit address)
+ ea = (opram[1] << 8) + opram[2];
+ util::stream_format(stream, "(x+$%04X)", ea);
+ return 3 | flags | DASMFLAG_SUPPORTED;
+ }
+
+ // if we fall off the switch statement something is very wrong
+ throw false;
}
+}
+
+} // anonymous namespace
+
- // if we fall off the switch statement something is very wrong
- throw false;
+offs_t CPU_DISASSEMBLE_NAME(m6805)(
+ cpu_device *device,
+ std::ostream &stream,
+ offs_t pc,
+ const u8 *oprom,
+ const u8 *opram,
+ int options,
+ std::pair<u16, char const *> const symbols[],
+ std::size_t symbol_count)
+{
+ return disassemble(device, stream, pc, oprom, opram, options, lvl::HMOS, symbols, symbol_count);
+}
+
+offs_t CPU_DISASSEMBLE_NAME(m146805)(
+ cpu_device *device,
+ std::ostream &stream,
+ offs_t pc,
+ const u8 *oprom,
+ const u8 *opram,
+ int options,
+ std::pair<u16, char const *> const symbols[],
+ std::size_t symbol_count)
+{
+ return disassemble(device, stream, pc, oprom, opram, options, lvl::CMOS, symbols, symbol_count);
}
+offs_t CPU_DISASSEMBLE_NAME(m68hc05)(
+ cpu_device *device,
+ std::ostream &stream,
+ offs_t pc,
+ const u8 *oprom,
+ const u8 *opram,
+ int options,
+ std::pair<u16, char const *> const symbols[],
+ std::size_t symbol_count)
+{
+ return disassemble(device, stream, pc, oprom, opram, options, lvl::HC, symbols, symbol_count);
+}
-CPU_DISASSEMBLE(m6805) { return CPU_DISASSEMBLE_NAME(m6805)(device, stream, pc, oprom, opram, options, nullptr, 0); }
+CPU_DISASSEMBLE(m6805) { return CPU_DISASSEMBLE_NAME(m6805) (device, stream, pc, oprom, opram, options, nullptr, 0); }
+CPU_DISASSEMBLE(m146805) { return CPU_DISASSEMBLE_NAME(m146805)(device, stream, pc, oprom, opram, options, nullptr, 0); }
+CPU_DISASSEMBLE(m68hc05) { return CPU_DISASSEMBLE_NAME(m68hc05)(device, stream, pc, oprom, opram, options, nullptr, 0); }
diff --git a/src/devices/cpu/m6805/6805ops.hxx b/src/devices/cpu/m6805/6805ops.hxx
index 88e3ae5da8c..f69183a77ed 100644
--- a/src/devices/cpu/m6805/6805ops.hxx
+++ b/src/devices/cpu/m6805/6805ops.hxx
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Aaron Giles
+// copyright-holders:Aaron Giles, Vas Crabb
/*
HNZC
@@ -14,1794 +14,834 @@ HNZC
*/
-#define OP_HANDLER(_name) void m6805_base_device::_name()
-#define DERIVED_OP_HANDLER(_arch,_name) void _arch##_device::_name()
+#define OP_HANDLER(name) void m6805_base_device::name()
+#define OP_HANDLER_BIT(name) template <unsigned B> void m6805_base_device::name()
+#define OP_HANDLER_BRA(name) template <bool C> void m6805_base_device::name()
+#define OP_HANDLER_MODE(name) template <m6805_base_device::addr_mode M> void m6805_base_device::name()
+
+#define DERIVED_OP_HANDLER(arch, name) void arch##_device::name()
-#define OP_HANDLER_BIT(_name) void m6805_base_device::_name(uint8_t bit)
OP_HANDLER( illegal )
{
logerror("M6805: illegal opcode\n");
}
-/* $00/$02/$04/$06/$08/$0A/$0C/$0E BRSET direct,relative ---- */
+// $00/$02/$04/$06/$08/$0A/$0C/$0E BRSET direct,relative ---*
OP_HANDLER_BIT( brset )
{
- uint8_t t,r;
+ u8 t, r;
DIRBYTE(r);
- IMMBYTE(t);
-
+ immbyte(t);
CLC;
-
- if (r&bit) {
- SEC;
- PC+=SIGNED(t);
- }
+ if (BIT(r, B)) { SEC; PC += SIGNED(t); }
}
-/* $01/$03/$05/$07/$09/$0B/$0D/$0F BRCLR direct,relative ---- */
+// $01/$03/$05/$07/$09/$0B/$0D/$0F BRCLR direct,relative ---*
OP_HANDLER_BIT( brclr )
{
- uint8_t t,r;
+ u8 t, r;
DIRBYTE(r);
- IMMBYTE(t);
-
+ immbyte(t);
SEC;
-
- if (!(r&bit)) {
- CLC;
- PC+=SIGNED(t);
- }
+ if (!BIT(r, B)) { CLC; PC += SIGNED(t); }
}
-/* $10/$12/$14/$16/$18/$1A/$1C/$1E BSET direct ---- */
+// $10/$12/$14/$16/$18/$1A/$1C/$1E BSET direct ----
OP_HANDLER_BIT( bset )
{
- uint8_t t,r;
- DIRBYTE(t); r=t|bit;
- WM(EAD,r);
-}
-
-/* $11/$13/$15/$17/$19/$1B/$1D/$1F BCLR direct ---- */
-OP_HANDLER_BIT( bclr)
-{
- uint8_t t,r;
- DIRBYTE(t); r=t&(~bit);
- WM(EAD,r);
-}
-
-/* $20 BRA relative ---- */
-OP_HANDLER( bra )
-{
- uint8_t t;
- IMMBYTE(t);
- PC+=SIGNED(t);
-}
-
-/* $21 BRN relative ---- */
-OP_HANDLER( brn )
-{
- SKIPBYTE();
-}
-
-/* $22 BHI relative ---- */
-OP_HANDLER( bhi )
-{
- BRANCH( !(CC&(CFLAG|ZFLAG)) );
-}
-
-/* $23 BLS relative ---- */
-OP_HANDLER( bls )
-{
- BRANCH( CC&(CFLAG|ZFLAG) );
-}
-
-/* $24 BCC relative ---- */
-OP_HANDLER( bcc )
-{
- BRANCH( !(CC&CFLAG) );
-}
-
-/* $25 BCS relative ---- */
-OP_HANDLER( bcs )
-{
- BRANCH( CC&CFLAG );
+ u8 t;
+ DIRBYTE(t);
+ wm(EAD, t | (u8(1) << B));
}
-/* $26 BNE relative ---- */
-OP_HANDLER( bne )
+// $11/$13/$15/$17/$19/$1B/$1D/$1F BCLR direct ----
+OP_HANDLER_BIT( bclr )
{
- BRANCH( !(CC&ZFLAG) );
+ u8 t;
+ DIRBYTE(t);
+ wm(EAD, t & ~(u8(1) << B));
}
-/* $27 BEQ relative ---- */
-OP_HANDLER( beq )
-{
- BRANCH( CC&ZFLAG );
-}
+// $20 BRA relative ----
+// $21 BRN relative ----
+OP_HANDLER_BRA( bra ) { BRANCH( true ); }
-/* $28 BHCC relative ---- */
-OP_HANDLER( bhcc )
-{
- BRANCH( !(CC&HFLAG) );
-}
+// $22 BHI relative ----
+// $23 BLS relative ----
+OP_HANDLER_BRA( bhi ) { BRANCH( !(CC & (CFLAG | ZFLAG)) ); }
-/* $29 BHCS relative ---- */
-OP_HANDLER( bhcs )
-{
- BRANCH( CC&HFLAG );
-}
+// $24 BCC relative ----
+// $25 BCS relative ----
+OP_HANDLER_BRA( bcc ) { BRANCH( !(CC & CFLAG) ); }
-/* $2a BPL relative ---- */
-OP_HANDLER( bpl )
-{
- BRANCH( !(CC&NFLAG) );
-}
+// $26 BNE relative ----
+// $27 BEQ relative ----
+OP_HANDLER_BRA( bne ) { BRANCH( !(CC & ZFLAG) ); }
-/* $2b BMI relative ---- */
-OP_HANDLER( bmi )
-{
- BRANCH( CC&NFLAG );
-}
+// $28 BHCC relative ----
+// $29 BHCS relative ----
+OP_HANDLER_BRA( bhcc ) { BRANCH( !(CC & HFLAG) ); }
-/* $2c BMC relative ---- */
-OP_HANDLER( bmc )
-{
- BRANCH( !(CC&IFLAG) );
-}
+// $2a BPL relative ----
+// $2b BMI relative ----
+OP_HANDLER_BRA( bpl ) { BRANCH( !(CC & NFLAG) ); }
-/* $2d BMS relative ---- */
-OP_HANDLER( bms )
-{
- BRANCH( CC&IFLAG );
-}
+// $2c BMC relative ----
+// $2d BMS relative ----
+OP_HANDLER_BRA( bmc ) { BRANCH( !(CC & IFLAG) ); }
-/* $2e BIL relative ---- */
+// $2e BIL relative ----
OP_HANDLER( bil )
{
- BRANCH(m_irq_state[M6805_IRQ_LINE] != CLEAR_LINE);
+ bool const C = true;
+ BRANCH( m_irq_state[M6805_IRQ_LINE] != CLEAR_LINE );
}
DERIVED_OP_HANDLER( hd63705, bil )
{
- BRANCH(m_nmi_state != CLEAR_LINE);
+ bool const C = true;
+ BRANCH( m_nmi_state != CLEAR_LINE );
}
-/* $2f BIH relative ---- */
+// $2f BIH relative ----
OP_HANDLER( bih )
{
- BRANCH(m_irq_state[M6805_IRQ_LINE] == CLEAR_LINE);
+ bool const C = false;
+ BRANCH( m_irq_state[M6805_IRQ_LINE] != CLEAR_LINE );
}
DERIVED_OP_HANDLER( hd63705, bih )
{
- BRANCH(m_nmi_state == CLEAR_LINE);
+ bool const C = false;
+ BRANCH( m_nmi_state != CLEAR_LINE );
}
-/* $30 NEG direct -*** */
-OP_HANDLER( neg_di )
+// $30 NEG direct -***
+// $60 NEG indexed, 1 byte offset -***
+// $70 NEG indexed -***
+OP_HANDLER_MODE( neg )
{
- uint8_t t;
- uint16_t r;
- DIRBYTE(t);
- r=-t;
- CLR_NZC;
- SET_FLAGS8(0,t,r);
- WM(EAD,r);
+ u8 t;
+ ARGBYTE(t);
+ u16 const r = -t;
+ clr_nzc();
+ set_nzc8(r);
+ wm(EAD, r);
}
-/* $31 ILLEGAL */
+// $31 ILLEGAL
+// $61 ILLEGAL
+// $71 ILLEGAL
-/* $32 ILLEGAL */
+// $32 ILLEGAL
+// $62 ILLEGAL
+// $72 ILLEGAL
-/* $33 COM direct -**1 */
-OP_HANDLER( com_di )
+// $33 COM direct -**1
+// $63 COM indexed, 1 byte offset -**1
+// $73 COM indexed -**1
+OP_HANDLER_MODE( com )
{
- uint8_t t;
- DIRBYTE(t);
+ u8 t;
+ ARGBYTE(t);
t = ~t;
- CLR_NZ;
- SET_NZ8(t);
+ clr_nz();
+ set_nz8(t);
SEC;
- WM(EAD,t);
+ wm(EAD, t);
}
-/* $34 LSR direct -0** */
-OP_HANDLER( lsr_di )
+// $34 LSR direct -0**
+// $64 LSR indexed, 1 byte offset -0**
+// $74 LSR indexed -0**
+OP_HANDLER_MODE( lsr )
{
- uint8_t t;
- DIRBYTE(t);
- CLR_NZC;
- CC |= (t&0x01);
+ u8 t;
+ ARGBYTE(t);
+ clr_nzc();
+ CC |= BIT(t, 0);
t >>= 1;
- SET_Z8(t);
- WM(EAD,t);
+ set_z8(t);
+ wm(EAD, t);
}
-/* $35 ILLEGAL */
+// $35 ILLEGAL
+// $65 ILLEGAL
+// $75 ILLEGAL
-/* $36 ROR direct -*** */
-OP_HANDLER( ror_di )
+// $36 ROR direct -***
+// $66 ROR indexed, 1 byte offset -***
+// $76 ROR indexed -***
+OP_HANDLER_MODE( ror )
{
- uint8_t t,r;
- DIRBYTE(t);
- r = (CC & 0x01) << 7;
- CLR_NZC;
- CC |= (t & 0x01);
- r |= t>>1;
- SET_NZ8(r);
- WM(EAD,r);
+ u8 t;
+ ARGBYTE(t);
+ u8 r = BIT(CC, 0) << 7;
+ clr_nzc();
+ CC |= BIT(t, 0);
+ r |= t >> 1;
+ set_nz8(r);
+ wm(EAD, r);
}
-/* $37 ASR direct ?*** */
-OP_HANDLER( asr_di )
+// $37 ASR direct -***
+// $67 ASR indexed, 1 byte offset -***
+// $77 ASR indexed -***
+OP_HANDLER_MODE( asr )
{
- uint8_t t;
- DIRBYTE(t);
- CLR_NZC; CC|=(t&0x01);
- t>>=1; t|=((t&0x40)<<1);
- SET_NZ8(t);
- WM(EAD,t);
+ u8 t;
+ ARGBYTE(t);
+ clr_nzc();
+ CC |= BIT(t, 0);
+ t = (t >> 1) | (t & 0x80);
+ set_nz8(t);
+ wm(EAD, t);
}
-/* $38 LSL direct ?*** */
-OP_HANDLER( lsl_di )
+// $38 LSL direct -***
+// $68 LSL indexed, 1 byte offset -***
+// $78 LSL indexed -***
+OP_HANDLER_MODE( lsl )
{
- uint8_t t;
- uint16_t r;
- DIRBYTE(t);
- r = t << 1;
- CLR_NZC;
- SET_FLAGS8(t,t,r);
- WM(EAD,r);
+ u8 t;
+ ARGBYTE(t);
+ u16 const r = u16(t) << 1;
+ clr_nzc();
+ set_nzc8(r);
+ wm(EAD, r);
}
-/* $39 ROL direct -*** */
-OP_HANDLER( rol_di )
+// $39 ROL direct -***
+// $69 ROL indexed, 1 byte offset -***
+// $79 ROL indexed -***
+OP_HANDLER_MODE( rol )
{
- uint16_t t,r;
- DIRBYTE(t);
- r = CC & 0x01;
- r |= t << 1;
- CLR_NZC;
- SET_FLAGS8(t,t,r);
- WM(EAD,r);
+ u16 t;
+ ARGBYTE(t);
+ u16 const r = BIT(CC, 0) | (t << 1);
+ clr_nzc();
+ set_nzc8(r);
+ wm(EAD, r);
}
-/* $3a DEC direct -**- */
-OP_HANDLER( dec_di )
+// $3a DEC direct -**-
+// $6a DEC indexed, 1 byte offset -**-
+OP_HANDLER_MODE( dec )
{
- uint8_t t;
- DIRBYTE(t);
+ u8 t;
+ ARGBYTE(t);
--t;
- CLR_NZ; SET_FLAGS8D(t);
- WM(EAD,t);
+ clr_nz();
+ set_nz8(t);
+ wm(EAD, t);
}
-/* $3b ILLEGAL */
+// $3b ILLEGAL
+// $6b ILLEGAL
+// $7b ILLEGAL
-/* $3c INC direct -**- */
-OP_HANDLER( inc_di )
+// $3c INC direct -**-
+// $6c INC indexed, 1 byte offset -**-
+// $7c INC indexed -**-
+OP_HANDLER_MODE( inc )
{
- uint8_t t;
- DIRBYTE(t);
+ u8 t;
+ ARGBYTE(t);
++t;
- CLR_NZ; SET_FLAGS8I(t);
- WM(EAD,t);
+ clr_nz();
+ set_nz8(t);
+ wm(EAD, t);
}
-/* $3d TST direct -**- */
-OP_HANDLER( tst_di )
+// $3d TST direct -**-
+// $6d TST indexed, 1 byte offset -**-
+// $7d TST indexed -**-
+OP_HANDLER_MODE( tst )
{
- uint8_t t;
- DIRBYTE(t);
- CLR_NZ; SET_NZ8(t);
+ u8 t;
+ ARGBYTE(t);
+ clr_nz();
+ set_nz8(t);
}
-/* $3e ILLEGAL */
+// $3e ILLEGAL
+// $6e ILLEGAL
+// $7e ILLEGAL
-/* $3f CLR direct -0100 */
-OP_HANDLER( clr_di )
+// $3f CLR direct -01-
+// $6f CLR indexed, 1 byte offset -01-
+// $7f CLR indexed -01-
+OP_HANDLER_MODE( clr )
{
- DIRECT;
- CLR_NZ; SEZ;
- WM(EAD,0);
+ ARGADDR;
+ clr_nz();
+ SEZ;
+ wm(EAD, 0);
}
-/* $40 NEGA inherent ?*** */
+// $40 NEGA inherent -***
OP_HANDLER( nega )
{
- uint16_t r;
- r = -A;
- CLR_NZC; SET_FLAGS8(0,A,r);
+ u16 const r = -A;
+ clr_nzc();
+ set_nzc8(r);
A = r;
}
-/* $41 ILLEGAL */
+// $41 ILLEGAL
-/* $42 ILLEGAL */
+// $42 MUL inherent 0--0
+OP_HANDLER( mul )
+{
+ u16 const r = u16(A) * X;
+ clr_hc();
+ X = u8(r >> 8);
+ A = u8(r);
+}
-/* $43 COMA inherent -**1 */
+// $43 COMA inherent -**1
OP_HANDLER( coma )
{
A = ~A;
- CLR_NZ;
- SET_NZ8(A);
+ clr_nz();
+ set_nz8(A);
SEC;
}
-/* $44 LSRA inherent -0** */
+// $44 LSRA inherent -0**
OP_HANDLER( lsra )
{
- CLR_NZC;
- CC |= (A & 0x01);
+ clr_nzc();
+ CC |= BIT(A, 0);
A >>= 1;
- SET_Z8(A);
+ set_z8(A);
}
-/* $45 ILLEGAL */
+// $45 ILLEGAL
-/* $46 RORA inherent -*** */
+// $46 RORA inherent -***
OP_HANDLER( rora )
{
- uint8_t r;
- r = (CC & 0x01) << 7;
- CLR_NZC;
- CC |= (A & 0x01);
+ u8 r = BIT(CC, 0) << 7;
+ clr_nzc();
+ CC |= BIT(A, 0);
r |= A >> 1;
- SET_NZ8(r);
+ set_nz8(r);
A = r;
}
-/* $47 ASRA inherent ?*** */
+// $47 ASRA inherent -***
OP_HANDLER( asra )
{
- CLR_NZC;
- CC |= (A & 0x01);
+ clr_nzc();
+ CC |= BIT(A, 0);
A = (A & 0x80) | (A >> 1);
- SET_NZ8(A);
+ set_nz8(A);
}
-/* $48 LSLA inherent ?*** */
+// $48 LSLA inherent -***
OP_HANDLER( lsla )
{
- uint16_t r;
- r = A << 1;
- CLR_NZC;
- SET_FLAGS8(A,A,r);
+ u16 const r = u16(A) << 1;
+ clr_nzc();
+ set_nzc8(r);
A = r;
}
-/* $49 ROLA inherent -*** */
+// $49 ROLA inherent -***
OP_HANDLER( rola )
{
- uint16_t t,r;
- t = A;
- r = CC & 0x01;
- r |= t << 1;
- CLR_NZC;
- SET_FLAGS8(t,t,r);
+ u16 const t = A;
+ u16 const r = BIT(CC, 0) | (t << 1);
+ clr_nzc();
+ set_nzc8(r);
A = r;
}
-/* $4a DECA inherent -**- */
+// $4a DECA inherent -**-
OP_HANDLER( deca )
{
--A;
- CLR_NZ;
- SET_FLAGS8D(A);
+ clr_nz();
+ set_nz8(A);
}
-/* $4b ILLEGAL */
+// $4b ILLEGAL
-/* $4c INCA inherent -**- */
+// $4c INCA inherent -**-
OP_HANDLER( inca )
{
++A;
- CLR_NZ;
- SET_FLAGS8I(A);
+ clr_nz();
+ set_nz8(A);
}
-/* $4d TSTA inherent -**- */
+// $4d TSTA inherent -**-
OP_HANDLER( tsta )
{
- CLR_NZ;
- SET_NZ8(A);
+ clr_nz();
+ set_nz8(A);
}
-/* $4e ILLEGAL */
+// $4e ILLEGAL
-/* $4f CLRA inherent -010 */
+// $4f CLRA inherent -01-
OP_HANDLER( clra )
{
A = 0;
- CLR_NZ;
+ clr_nz();
SEZ;
}
-/* $50 NEGX inherent ?*** */
+// $50 NEGX inherent -***
OP_HANDLER( negx )
{
- uint16_t r;
- r = -X;
- CLR_NZC;
- SET_FLAGS8(0,X,r);
+ u16 const r = -X;
+ clr_nzc();
+ set_nzc8(r);
X = r;
}
-/* $51 ILLEGAL */
+// $51 ILLEGAL
-/* $52 ILLEGAL */
+// $52 ILLEGAL
-/* $53 COMX inherent -**1 */
+// $53 COMX inherent -**1
OP_HANDLER( comx )
{
X = ~X;
- CLR_NZ;
- SET_NZ8(X);
+ clr_nz();
+ set_nz8(X);
SEC;
}
-/* $54 LSRX inherent -0** */
+// $54 LSRX inherent -0**
OP_HANDLER( lsrx )
{
- CLR_NZC;
- CC |= (X & 0x01);
+ clr_nzc();
+ CC |= BIT(X, 0);
X >>= 1;
- SET_Z8(X);
+ set_z8(X);
}
-/* $55 ILLEGAL */
+// $55 ILLEGAL
-/* $56 RORX inherent -*** */
+// $56 RORX inherent -***
OP_HANDLER( rorx )
{
- uint8_t r;
- r = (CC & 0x01) << 7;
- CLR_NZC;
- CC |= (X & 0x01);
- r |= X>>1;
- SET_NZ8(r);
+ u8 r = BIT(CC, 0) << 7;
+ clr_nzc();
+ CC |= BIT(X, 0);
+ r |= X >> 1;
+ set_nz8(r);
X = r;
}
-/* $57 ASRX inherent ?*** */
+// $57 ASRX inherent -***
OP_HANDLER( asrx )
{
- CLR_NZC;
- CC |= (X & 0x01);
+ clr_nzc();
+ CC |= BIT(X, 0);
X = (X & 0x80) | (X >> 1);
- SET_NZ8(X);
+ set_nz8(X);
}
-/* $58 ASLX inherent ?*** */
-OP_HANDLER( aslx )
+// $58 LSLX inherent -***
+OP_HANDLER( lslx )
{
- uint16_t r;
- r = X << 1;
- CLR_NZC;
- SET_FLAGS8(X,X,r);
+ u16 r = u16(X) << 1;
+ clr_nzc();
+ set_nzc8(r);
X = r;
}
-/* $59 ROLX inherent -*** */
+// $59 ROLX inherent -***
OP_HANDLER( rolx )
{
- uint16_t t,r;
- t = X;
- r = CC & 0x01;
- r |= t<<1;
- CLR_NZC;
- SET_FLAGS8(t,t,r);
+ u16 const t = X;
+ u16 const r = BIT(CC, 0) | (t << 1);
+ clr_nzc();
+ set_nzc8(r);
X = r;
}
-/* $5a DECX inherent -**- */
+// $5a DECX inherent -**-
OP_HANDLER( decx )
{
--X;
- CLR_NZ;
- SET_FLAGS8D(X);
+ clr_nz();
+ set_nz8(X);
}
-/* $5b ILLEGAL */
+// $5b ILLEGAL
-/* $5c INCX inherent -**- */
+// $5c INCX inherent -**-
OP_HANDLER( incx )
{
++X;
- CLR_NZ;
- SET_FLAGS8I(X);
+ clr_nz();
+ set_nz8(X);
}
-/* $5d TSTX inherent -**- */
+// $5d TSTX inherent -**-
OP_HANDLER( tstx )
{
- CLR_NZ;
- SET_NZ8(X);
+ clr_nz();
+ set_nz8(X);
}
-/* $5e ILLEGAL */
+// $5e ILLEGAL
-/* $5f CLRX inherent -010 */
+// $5f CLRX inherent -01-
OP_HANDLER( clrx )
{
X = 0;
- CLR_NZC;
+ clr_nzc();
SEZ;
}
-/* $60 NEG indexed, 1 byte offset -*** */
-OP_HANDLER( neg_ix1 )
-{
- uint8_t t;
- uint16_t r;
- IDX1BYTE(t); r=-t;
- CLR_NZC; SET_FLAGS8(0,t,r);
- WM(EAD,r);
-}
-
-/* $61 ILLEGAL */
-
-/* $62 ILLEGAL */
-
-/* $63 COM indexed, 1 byte offset -**1 */
-OP_HANDLER( com_ix1 )
-{
- uint8_t t;
- IDX1BYTE(t); t = ~t;
- CLR_NZ; SET_NZ8(t); SEC;
- WM(EAD,t);
-}
-
-/* $64 LSR indexed, 1 byte offset -0** */
-OP_HANDLER( lsr_ix1 )
-{
- uint8_t t;
- IDX1BYTE(t);
- CLR_NZC;
- CC |= (t & 0x01);
- t >>= 1;
- SET_Z8(t);
- WM(EAD,t);
-}
-
-/* $65 ILLEGAL */
-
-/* $66 ROR indexed, 1 byte offset -*** */
-OP_HANDLER( ror_ix1 )
-{
- uint8_t t,r;
- IDX1BYTE(t);
- r = (CC & 0x01) << 7;
- CLR_NZC;
- CC |= (t & 0x01);
- r |= t>>1;
- SET_NZ8(r);
- WM(EAD,r);
-}
-
-/* $67 ASR indexed, 1 byte offset ?*** */
-OP_HANDLER( asr_ix1 )
-{
- uint8_t t;
- IDX1BYTE(t);
- CLR_NZC; CC|=(t&0x01);
- t>>=1; t|=((t&0x40)<<1);
- SET_NZ8(t);
- WM(EAD,t);
-}
-
-/* $68 LSL indexed, 1 byte offset ?*** */
-OP_HANDLER( lsl_ix1 )
-{
- uint8_t t;
- uint16_t r;
- IDX1BYTE(t);
- r = t << 1;
- CLR_NZC;
- SET_FLAGS8(t,t,r);
- WM(EAD,r);
-}
-
-/* $69 ROL indexed, 1 byte offset -*** */
-OP_HANDLER( rol_ix1 )
-{
- uint16_t t,r;
- IDX1BYTE(t);
- r = CC & 0x01;
- r |= t << 1;
- CLR_NZC;
- SET_FLAGS8(t,t,r);
- WM(EAD,r);
-}
-
-/* $6a DEC indexed, 1 byte offset -**- */
-OP_HANDLER( dec_ix1 )
-{
- uint8_t t;
- IDX1BYTE(t);
- --t;
- CLR_NZ; SET_FLAGS8D(t);
- WM(EAD,t);
-}
-
-/* $6b ILLEGAL */
-
-/* $6c INC indexed, 1 byte offset -**- */
-OP_HANDLER( inc_ix1 )
-{
- uint8_t t;
- IDX1BYTE(t);
- ++t;
- CLR_NZ; SET_FLAGS8I(t);
- WM(EAD,t);
-}
-
-/* $6d TST indexed, 1 byte offset -**- */
-OP_HANDLER( tst_ix1 )
-{
- uint8_t t;
- IDX1BYTE(t);
- CLR_NZ; SET_NZ8(t);
-}
-
-/* $6e ILLEGAL */
-
-/* $6f CLR indexed, 1 byte offset -0100 */
-OP_HANDLER( clr_ix1 )
-{
- INDEXED1;
- CLR_NZC; SEZ;
- WM(EAD,0);
-}
-
-/* $70 NEG indexed -*** */
-OP_HANDLER( neg_ix )
-{
- uint8_t t;
- uint16_t r;
- IDXBYTE(t); r=-t;
- CLR_NZC; SET_FLAGS8(0,t,r);
- WM(EAD,r);
-}
-
-/* $71 ILLEGAL */
-
-/* $72 ILLEGAL */
-
-/* $73 COM indexed -**1 */
-OP_HANDLER( com_ix )
-{
- uint8_t t;
- IDXBYTE(t); t = ~t;
- CLR_NZ; SET_NZ8(t); SEC;
- WM(EAD,t);
-}
-
-/* $74 LSR indexed -0** */
-OP_HANDLER( lsr_ix )
-{
- uint8_t t;
- IDXBYTE(t);
- CLR_NZC;
- CC |= (t & 0x01);
- t >>= 1;
- SET_Z8(t);
- WM(EAD,t);
-}
-
-/* $75 ILLEGAL */
-
-/* $76 ROR indexed -*** */
-OP_HANDLER( ror_ix )
-{
- uint8_t t,r;
- IDXBYTE(t);
- r = (CC & 0x01) << 7;
- CLR_NZC;
- CC |= (t & 0x01);
- r |= t >> 1;
- SET_NZ8(r);
- WM(EAD,r);
-}
-
-/* $77 ASR indexed ?*** */
-OP_HANDLER( asr_ix )
-{
- uint8_t t;
- IDXBYTE(t);
- CLR_NZC;
- CC |= (t & 0x01);
- t = (t & 0x80) | (t >> 1);
- SET_NZ8(t);
- WM(EAD,t);
-}
-
-/* $78 LSL indexed ?*** */
-OP_HANDLER( lsl_ix )
-{
- uint8_t t;
- uint16_t r;
- IDXBYTE(t); r=t<<1;
- CLR_NZC; SET_FLAGS8(t,t,r);
- WM(EAD,r);
-}
-
-/* $79 ROL indexed -*** */
-OP_HANDLER( rol_ix )
-{
- uint16_t t,r;
- IDXBYTE(t);
- r = CC & 0x01;
- r |= t << 1;
- CLR_NZC;
- SET_FLAGS8(t,t,r);
- WM(EAD,r);
-}
-
-/* $7a DEC indexed -**- */
-OP_HANDLER( dec_ix )
-{
- uint8_t t;
- IDXBYTE(t);
- --t;
- CLR_NZ; SET_FLAGS8D(t);
- WM(EAD,t);
-}
-
-/* $7b ILLEGAL */
-
-/* $7c INC indexed -**- */
-OP_HANDLER( inc_ix )
-{
- uint8_t t;
- IDXBYTE(t);
- ++t;
- CLR_NZ; SET_FLAGS8I(t);
- WM(EAD,t);
-}
-
-/* $7d TST indexed -**- */
-OP_HANDLER( tst_ix )
-{
- uint8_t t;
- IDXBYTE(t);
- CLR_NZ; SET_NZ8(t);
-}
-
-/* $7e ILLEGAL */
-
-/* $7f CLR indexed -0100 */
-OP_HANDLER( clr_ix )
-{
- INDEXED;
- CLR_NZC; SEZ;
- WM(EAD,0);
-}
-
-/* $80 RTI inherent #### */
+// $80 RTI inherent ####
OP_HANDLER( rti )
{
- PULLBYTE(CC);
- PULLBYTE(A);
- PULLBYTE(X);
- PULLWORD(m_pc);
-#if IRQ_LEVEL_DETECT
- if( m_irq_state != CLEAR_LINE && (CC & IFLAG) == 0 )
- {
- m_pending_interrupts |= M6805_INT_IRQ;
- }
-#endif
+ pullbyte(CC);
+ pullbyte(A);
+ pullbyte(X);
+ pullword(m_pc);
}
-/* $81 RTS inherent ---- */
+// $81 RTS inherent ----
OP_HANDLER( rts )
{
- PULLWORD(m_pc);
+ pullword(m_pc);
}
-/* $82 ILLEGAL */
+// $82 ILLEGAL
-/* $83 SWI absolute indirect ---- */
+// $83 SWI absolute indirect ----
OP_HANDLER( swi )
{
- PUSHWORD(m_pc);
- PUSHBYTE(m_x);
- PUSHBYTE(m_a);
- PUSHBYTE(m_cc);
+ pushword(m_pc);
+ pushbyte(m_x);
+ pushbyte(m_a);
+ pushbyte(m_cc);
SEI;
- RM16(0xfffc, &m_pc);
+ rm16(m_params.m_swi_vector, m_pc);
}
-DERIVED_OP_HANDLER( hd63705, swi )
-{
- PUSHWORD(m_pc);
- PUSHBYTE(m_x);
- PUSHBYTE(m_a);
- PUSHBYTE(m_cc);
- SEI;
- RM16(0x1ffa, &m_pc);
-}
-/* $84 ILLEGAL */
-
-/* $85 ILLEGAL */
-
-/* $86 ILLEGAL */
+// $84 ILLEGAL
-/* $87 ILLEGAL */
+// $85 ILLEGAL
-/* $88 ILLEGAL */
+// $86 ILLEGAL
-/* $89 ILLEGAL */
+// $87 ILLEGAL
-/* $8A ILLEGAL */
-
-/* $8B ILLEGAL */
-
-/* $8C ILLEGAL */
-
-/* $8D ILLEGAL */
-
-/* $8E ILLEGAL */
-
-/* $8F ILLEGAL */
-
-/* $90 ILLEGAL */
-
-/* $91 ILLEGAL */
-
-/* $92 ILLEGAL */
-
-/* $93 ILLEGAL */
-
-/* $94 ILLEGAL */
-
-/* $95 ILLEGAL */
-
-/* $96 ILLEGAL */
-
-/* $97 TAX inherent ---- */
-OP_HANDLER( tax )
-{
- X = A;
-}
-
-/* $98 CLC */
-
-/* $99 SEC */
-
-/* $9A CLI */
-
-/* $9B SEI */
-
-/* $9C RSP inherent ---- */
-OP_HANDLER( rsp )
-{
- S = SP_MASK;
-}
-
-/* $9D NOP inherent ---- */
-OP_HANDLER( nop )
-{
-}
-
-/* $9E ILLEGAL */
-
-/* $9F TXA inherent ---- */
-OP_HANDLER( txa )
-{
- A = X;
-}
+// $88 ILLEGAL
-/* $a0 SUBA immediate ?*** */
-OP_HANDLER( suba_im )
-{
- uint16_t t,r;
- IMMBYTE(t);
- r = A - t;
- CLR_NZC;
- SET_FLAGS8(A,t,r);
- A = r;
-}
+// $89 ILLEGAL
-/* $a1 CMPA immediate ?*** */
-OP_HANDLER( cmpa_im )
-{
- uint16_t t,r;
- IMMBYTE(t);
- r = A - t;
- CLR_NZC;
- SET_FLAGS8(A,t,r);
-}
+// $8A ILLEGAL
-/* $a2 SBCA immediate ?*** */
-OP_HANDLER( sbca_im )
-{
- uint16_t t,r;
- IMMBYTE(t);
- r = A - t - (CC & 0x01);
- CLR_NZC;
- SET_FLAGS8(A,t,r);
- A = r;
-}
+// $8B ILLEGAL
-/* $a3 CPX immediate -*** */
-OP_HANDLER( cpx_im )
-{
- uint16_t t,r;
- IMMBYTE(t);
- r = X - t;
- CLR_NZC;
- SET_FLAGS8(X,t,r);
-}
+// $8C ILLEGAL
-/* $a4 ANDA immediate -**- */
-OP_HANDLER( anda_im )
-{
- uint8_t t;
- IMMBYTE(t);
- A &= t;
- CLR_NZ;
- SET_NZ8(A);
-}
+// $8D ILLEGAL
-/* $a5 BITA immediate -**- */
-OP_HANDLER( bita_im )
+// $8E STOP inherent ----
+OP_HANDLER( stop )
{
- uint8_t t,r;
- IMMBYTE(t);
- r = A & t;
- CLR_NZ;
- SET_NZ8(r);
+ fatalerror("m6805[%s]: unimplemented STOP", tag());
}
-/* $a6 LDA immediate -**- */
-OP_HANDLER( lda_im )
+// $8F WAIT inherent ----
+OP_HANDLER( wait )
{
- IMMBYTE(A);
- CLR_NZ;
- SET_NZ8(A);
+ fatalerror("m6805[%s]: unimplemented WAIT", tag());
}
-/* $a7 ILLEGAL */
-/* $a8 EORA immediate -**- */
-OP_HANDLER( eora_im )
-{
- uint8_t t;
- IMMBYTE(t);
- A ^= t;
- CLR_NZ;
- SET_NZ8(A);
-}
+// $90 ILLEGAL
-/* $a9 ADCA immediate **** */
-OP_HANDLER( adca_im )
-{
- uint16_t t,r;
- IMMBYTE(t);
- r = A + t + (CC & 0x01);
- CLR_HNZC;
- SET_FLAGS8(A,t,r);
- SET_H(A,t,r);
- A = r;
-}
+// $91 ILLEGAL
-/* $aa ORA immediate -**- */
-OP_HANDLER( ora_im )
-{
- uint8_t t;
- IMMBYTE(t);
- A |= t;
- CLR_NZ;
- SET_NZ8(A);
-}
+// $92 ILLEGAL
-/* $ab ADDA immediate **** */
-OP_HANDLER( adda_im )
-{
- uint16_t t,r;
- IMMBYTE(t);
- r = A + t;
- CLR_HNZC;
- SET_FLAGS8(A,t,r);
- SET_H(A,t,r);
- A = r;
-}
+// $93 ILLEGAL
-/* $ac ILLEGAL */
+// $94 ILLEGAL
-/* $ad BSR ---- */
-OP_HANDLER( bsr )
-{
- uint8_t t;
- IMMBYTE(t);
- PUSHWORD(m_pc);
- PC += SIGNED(t);
-}
+// $95 ILLEGAL
-/* $ae LDX immediate -**- */
-OP_HANDLER( ldx_im )
-{
- IMMBYTE(X);
- CLR_NZ;
- SET_NZ8(X);
-}
+// $96 ILLEGAL
-/* $af ILLEGAL */
+// $97 TAX inherent ----
+OP_HANDLER( tax ) { X = A; }
-/* $b0 SUBA direct ?*** */
-OP_HANDLER( suba_di )
-{
- uint16_t t,r;
- DIRBYTE(t);
- r = A - t;
- CLR_NZC;
- SET_FLAGS8(A,t,r);
- A = r;
-}
+// $98 CLC
+OP_HANDLER( clc ) { CLC; }
-/* $b1 CMPA direct ?*** */
-OP_HANDLER( cmpa_di )
-{
- uint16_t t,r;
- DIRBYTE(t);
- r = A - t;
- CLR_NZC;
- SET_FLAGS8(A,t,r);
-}
+// $99 SEC
+OP_HANDLER( sec ) { SEC; }
-/* $b2 SBCA direct ?*** */
-OP_HANDLER( sbca_di )
-{
- uint16_t t,r;
- DIRBYTE(t);
- r = A - t - (CC & 0x01);
- CLR_NZC;
- SET_FLAGS8(A,t,r);
- A = r;
-}
+// $9A CLI
+OP_HANDLER( cli ) { CLI; }
-/* $b3 CPX direct -*** */
-OP_HANDLER( cpx_di )
-{
- uint16_t t,r;
- DIRBYTE(t);
- r = X - t;
- CLR_NZC;
- SET_FLAGS8(X,t,r);
-}
+// $9B SEI
+OP_HANDLER( sei ) { SEI; } // TODO: check behaviour if edge-triggered interrupt was pending when this happens
-/* $b4 ANDA direct -**- */
-OP_HANDLER( anda_di )
-{
- uint8_t t;
- DIRBYTE(t);
- A &= t;
- CLR_NZ;
- SET_NZ8(A);
-}
+// $9C RSP inherent ----
+OP_HANDLER( rsp ) { S = SP_MASK; }
-/* $b5 BITA direct -**- */
-OP_HANDLER( bita_di )
-{
- uint8_t t,r;
- DIRBYTE(t);
- r = A & t;
- CLR_NZ;
- SET_NZ8(r);
-}
+// $9D NOP inherent ----
+OP_HANDLER( nop ) { }
-/* $b6 LDA direct -**- */
-OP_HANDLER( lda_di )
-{
- DIRBYTE(A);
- CLR_NZ;
- SET_NZ8(A);
-}
+// $9E ILLEGAL
-/* $b7 STA direct -**- */
-OP_HANDLER( sta_di )
-{
- CLR_NZ;
- SET_NZ8(A);
- DIRECT;
- WM(EAD,A);
-}
-
-/* $b8 EORA direct -**- */
-OP_HANDLER( eora_di )
-{
- uint8_t t;
- DIRBYTE(t);
- A ^= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $b9 ADCA direct **** */
-OP_HANDLER( adca_di )
-{
- uint16_t t,r;
- DIRBYTE(t);
- r = A + t + (CC & 0x01);
- CLR_HNZC;
- SET_FLAGS8(A,t,r);
- SET_H(A,t,r);
- A = r;
-}
-
-/* $ba ORA direct -**- */
-OP_HANDLER( ora_di )
-{
- uint8_t t;
- DIRBYTE(t);
- A |= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $bb ADDA direct **** */
-OP_HANDLER( adda_di )
-{
- uint16_t t,r;
- DIRBYTE(t);
- r = A + t;
- CLR_HNZC;
- SET_FLAGS8(A,t,r);
- SET_H(A,t,r);
- A = r;
-}
-
-/* $bc JMP direct -*** */
-OP_HANDLER( jmp_di )
-{
- DIRECT;
- PC = EA;
-}
-
-/* $bd JSR direct ---- */
-OP_HANDLER( jsr_di )
-{
- DIRECT;
- PUSHWORD(m_pc);
- PC = EA;
-}
-
-/* $be LDX direct -**- */
-OP_HANDLER( ldx_di )
-{
- DIRBYTE(X);
- CLR_NZ;
- SET_NZ8(X);
-}
-
-/* $bf STX direct -**- */
-OP_HANDLER( stx_di )
-{
- CLR_NZ;
- SET_NZ8(X);
- DIRECT;
- WM(EAD,X);
-}
-
-/* $c0 SUBA extended ?*** */
-OP_HANDLER( suba_ex )
-{
- uint16_t t,r;
- EXTBYTE(t);
- r = A - t;
- CLR_NZC;
- SET_FLAGS8(A,t,r);
- A = r;
-}
-
-/* $c1 CMPA extended ?*** */
-OP_HANDLER( cmpa_ex )
-{
- uint16_t t,r;
- EXTBYTE(t);
- r = A - t;
- CLR_NZC;
- SET_FLAGS8(A,t,r);
-}
-
-/* $c2 SBCA extended ?*** */
-OP_HANDLER( sbca_ex )
-{
- uint16_t t,r;
- EXTBYTE(t);
- r = A - t - (CC & 0x01);
- CLR_NZC;
- SET_FLAGS8(A,t,r);
- A = r;
-}
-
-/* $c3 CPX extended -*** */
-OP_HANDLER( cpx_ex )
-{
- uint16_t t,r;
- EXTBYTE(t);
- r = X - t;
- CLR_NZC;
- SET_FLAGS8(X,t,r);
-}
-
-/* $c4 ANDA extended -**- */
-OP_HANDLER( anda_ex )
-{
- uint8_t t;
- EXTBYTE(t);
- A &= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $c5 BITA extended -**- */
-OP_HANDLER( bita_ex )
-{
- uint8_t t,r;
- EXTBYTE(t);
- r = A & t;
- CLR_NZ;
- SET_NZ8(r);
-}
-
-/* $c6 LDA extended -**- */
-OP_HANDLER( lda_ex )
-{
- EXTBYTE(A);
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $c7 STA extended -**- */
-OP_HANDLER( sta_ex )
-{
- CLR_NZ;
- SET_NZ8(A);
- EXTENDED;
- WM(EAD,A);
-}
-
-/* $c8 EORA extended -**- */
-OP_HANDLER( eora_ex )
-{
- uint8_t t;
- EXTBYTE(t);
- A ^= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $c9 ADCA extended **** */
-OP_HANDLER( adca_ex )
-{
- uint16_t t,r;
- EXTBYTE(t);
- r = A + t + (CC & 0x01);
- CLR_HNZC;
- SET_FLAGS8(A,t,r);
- SET_H(A,t,r);
- A = r;
-}
-
-/* $ca ORA extended -**- */
-OP_HANDLER( ora_ex )
-{
- uint8_t t;
- EXTBYTE(t);
- A |= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $cb ADDA extended **** */
-OP_HANDLER( adda_ex )
-{
- uint16_t t,r;
- EXTBYTE(t);
- r = A + t;
- CLR_HNZC;
- SET_FLAGS8(A,t,r);
- SET_H(A,t,r);
- A = r;
-}
-
-/* $cc JMP extended -*** */
-OP_HANDLER( jmp_ex )
-{
- EXTENDED;
- PC = EA;
-}
-
-/* $cd JSR extended ---- */
-OP_HANDLER( jsr_ex )
-{
- EXTENDED;
- PUSHWORD(m_pc);
- PC = EA;
-}
-
-/* $ce LDX extended -**- */
-OP_HANDLER( ldx_ex )
-{
- EXTBYTE(X);
- CLR_NZ;
- SET_NZ8(X);
-}
-
-/* $cf STX extended -**- */
-OP_HANDLER( stx_ex )
-{
- CLR_NZ;
- SET_NZ8(X);
- EXTENDED;
- WM(EAD,X);
-}
-
-/* $d0 SUBA indexed, 2 byte offset ?*** */
-OP_HANDLER( suba_ix2 )
-{
- uint16_t t,r;
- IDX2BYTE(t);
- r = A - t;
- CLR_NZC;
- SET_FLAGS8(A,t,r);
- A = r;
-}
-
-/* $d1 CMPA indexed, 2 byte offset ?*** */
-OP_HANDLER( cmpa_ix2 )
-{
- uint16_t t,r;
- IDX2BYTE(t);
- r = A - t;
- CLR_NZC;
- SET_FLAGS8(A,t,r);
-}
-
-/* $d2 SBCA indexed, 2 byte offset ?*** */
-OP_HANDLER( sbca_ix2 )
-{
- uint16_t t,r;
- IDX2BYTE(t);
- r = A - t - (CC & 0x01);
- CLR_NZC;
- SET_FLAGS8(A,t,r);
- A = r;
-}
-
-/* $d3 CPX indexed, 2 byte offset -*** */
-OP_HANDLER( cpx_ix2 )
-{
- uint16_t t,r;
- IDX2BYTE(t);
- r = X - t;
- CLR_NZC;
- SET_FLAGS8(X,t,r);
-}
-
-/* $d4 ANDA indexed, 2 byte offset -**- */
-OP_HANDLER( anda_ix2 )
-{
- uint8_t t;
- IDX2BYTE(t);
- A &= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $d5 BITA indexed, 2 byte offset -**- */
-OP_HANDLER( bita_ix2 )
-{
- uint8_t t,r;
- IDX2BYTE(t);
- r = A & t;
- CLR_NZ;
- SET_NZ8(r);
-}
-
-/* $d6 LDA indexed, 2 byte offset -**- */
-OP_HANDLER( lda_ix2 )
-{
- IDX2BYTE(A);
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $d7 STA indexed, 2 byte offset -**- */
-OP_HANDLER( sta_ix2 )
-{
- CLR_NZ;
- SET_NZ8(A);
- INDEXED2;
- WM(EAD,A);
-}
-
-/* $d8 EORA indexed, 2 byte offset -**- */
-OP_HANDLER( eora_ix2 )
-{
- uint8_t t;
- IDX2BYTE(t);
- A ^= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $d9 ADCA indexed, 2 byte offset **** */
-OP_HANDLER( adca_ix2 )
-{
- uint16_t t,r;
- IDX2BYTE(t);
- r = A + t + (CC & 0x01);
- CLR_HNZC;
- SET_FLAGS8(A,t,r);
- SET_H(A,t,r);
- A = r;
-}
-
-/* $da ORA indexed, 2 byte offset -**- */
-OP_HANDLER( ora_ix2 )
-{
- uint8_t t;
- IDX2BYTE(t);
- A |= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $db ADDA indexed, 2 byte offset **** */
-OP_HANDLER( adda_ix2 )
-{
- uint16_t t,r;
- IDX2BYTE(t);
- r = A + t;
- CLR_HNZC;
- SET_FLAGS8(A,t,r);
- SET_H(A,t,r);
- A = r;
-}
-
-/* $dc JMP indexed, 2 byte offset -*** */
-OP_HANDLER( jmp_ix2 )
-{
- INDEXED2;
- PC = EA;
-}
-
-/* $dd JSR indexed, 2 byte offset ---- */
-OP_HANDLER( jsr_ix2 )
-{
- INDEXED2;
- PUSHWORD(m_pc);
- PC = EA;
-}
-
-/* $de LDX indexed, 2 byte offset -**- */
-OP_HANDLER( ldx_ix2 )
-{
- IDX2BYTE(X);
- CLR_NZ;
- SET_NZ8(X);
-}
-
-/* $df STX indexed, 2 byte offset -**- */
-OP_HANDLER( stx_ix2 )
+// $9F TXA inherent ----
+OP_HANDLER( txa )
{
- CLR_NZ;
- SET_NZ8(X);
- INDEXED2;
- WM(EAD,X);
+ A = X;
}
-/* $e0 SUBA indexed, 1 byte offset ?*** */
-OP_HANDLER( suba_ix1 )
+// $a0 SUBA immediate -***
+// $b0 SUBA direct -***
+// $c0 SUBA extended -***
+// $d0 SUBA indexed, 2 byte offset -***
+// $e0 SUBA indexed, 1 byte offset -***
+// $f0 SUBA indexed -***
+OP_HANDLER_MODE( suba )
{
- uint16_t t,r;
- IDX1BYTE(t);
- r = A - t;
- CLR_NZC;
- SET_FLAGS8(A,t,r);
+ u16 t;
+ ARGBYTE(t);
+ u16 const r = A - t;
+ clr_nzc();
+ set_nzc8(r);
A = r;
}
-/* $e1 CMPA indexed, 1 byte offset ?*** */
-OP_HANDLER( cmpa_ix1 )
-{
- uint16_t t,r;
- IDX1BYTE(t);
- r = A - t;
- CLR_NZC;
- SET_FLAGS8(A,t,r);
-}
-
-/* $e2 SBCA indexed, 1 byte offset ?*** */
-OP_HANDLER( sbca_ix1 )
-{
- uint16_t t,r;
- IDX1BYTE(t);
- r = A - t - (CC & 0x01);
- CLR_NZC;
- SET_FLAGS8(A,t,r);
+// $a1 CMPA immediate -***
+// $b1 CMPA direct -***
+// $c1 CMPA extended -***
+// $d1 CMPA indexed, 2 byte offset -***
+// $e1 CMPA indexed, 1 byte offset -***
+// $f1 CMPA indexed -***
+OP_HANDLER_MODE( cmpa )
+{
+ u16 t;
+ ARGBYTE(t);
+ u16 const r = A - t;
+ clr_nzc();
+ set_nzc8(r);
+}
+
+// $a2 SBCA immediate -***
+// $b2 SBCA direct -***
+// $c2 SBCA extended -***
+// $d2 SBCA indexed, 2 byte offset -***
+// $e2 SBCA indexed, 1 byte offset -***
+// $f2 SBCA indexed -***
+OP_HANDLER_MODE( sbca )
+{
+ u16 t;
+ ARGBYTE(t);
+ u16 const r = A - t - BIT(CC, 0);
+ clr_nzc();
+ set_nzc8(r);
A = r;
}
-/* $e3 CPX indexed, 1 byte offset -*** */
-OP_HANDLER( cpx_ix1 )
+// $a3 CPX immediate -***
+// $b3 CPX direct -***
+// $c3 CPX extended -***
+// $d3 CPX indexed, 2 byte offset -***
+// $e3 CPX indexed, 1 byte offset -***
+// $f3 CPX indexed -***
+OP_HANDLER_MODE( cpx )
{
- uint16_t t,r;
- IDX1BYTE(t);
- r = X - t;
- CLR_NZC;
- SET_FLAGS8(X,t,r);
+ u16 t;
+ ARGBYTE(t);
+ u16 const r = X - t;
+ clr_nzc();
+ set_nzc8(r);
}
-/* $e4 ANDA indexed, 1 byte offset -**- */
-OP_HANDLER( anda_ix1 )
+// $a4 ANDA immediate -**-
+// $b4 ANDA direct -**-
+// $c4 ANDA extended -**-
+// $d4 ANDA indexed, 2 byte offset -**-
+// $e4 ANDA indexed, 1 byte offset -**-
+// $f4 ANDA indexed -**-
+OP_HANDLER_MODE( anda )
{
- uint8_t t;
- IDX1BYTE(t);
+ u8 t;
+ ARGBYTE(t);
A &= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $e5 BITA indexed, 1 byte offset -**- */
-OP_HANDLER( bita_ix1 )
-{
- uint8_t t,r;
- IDX1BYTE(t);
- r = A & t;
- CLR_NZ;
- SET_NZ8(r);
-}
-
-/* $e6 LDA indexed, 1 byte offset -**- */
-OP_HANDLER( lda_ix1 )
-{
- IDX1BYTE(A);
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $e7 STA indexed, 1 byte offset -**- */
-OP_HANDLER( sta_ix1 )
-{
- CLR_NZ;
- SET_NZ8(A);
- INDEXED1;
- WM(EAD,A);
-}
-
-/* $e8 EORA indexed, 1 byte offset -**- */
-OP_HANDLER( eora_ix1 )
-{
- uint8_t t;
- IDX1BYTE(t);
+ clr_nz();
+ set_nz8(A);
+}
+
+// $a5 BITA immediate -**-
+// $b5 BITA direct -**-
+// $c5 BITA extended -**-
+// $d5 BITA indexed, 2 byte offset -**-
+// $e5 BITA indexed, 1 byte offset -**-
+// $f5 BITA indexed -**-
+OP_HANDLER_MODE( bita )
+{
+ u8 t;
+ ARGBYTE(t);
+ u8 const r = A & t;
+ clr_nz();
+ set_nz8(r);
+}
+
+// $a6 LDA immediate -**-
+// $b6 LDA direct -**-
+// $c6 LDA extended -**-
+// $d6 LDA indexed, 2 byte offset -**-
+// $e6 LDA indexed, 1 byte offset -**-
+// $f6 LDA indexed -**-
+OP_HANDLER_MODE( lda )
+{
+ ARGBYTE(A);
+ clr_nz();
+ set_nz8(A);
+}
+
+// $a7 ILLEGAL
+// $b7 STA direct -**-
+// $c7 STA extended -**-
+// $d7 STA indexed, 2 byte offset -**-
+// $e7 STA indexed, 1 byte offset -**-
+// $f7 STA indexed -**-
+OP_HANDLER_MODE( sta )
+{
+ clr_nz();
+ set_nz8(A);
+ ARGADDR;
+ wm(EAD, A);
+}
+
+// $a8 EORA immediate -**-
+// $b8 EORA direct -**-
+// $c8 EORA extended -**-
+// $d8 EORA indexed, 2 byte offset -**-
+// $e8 EORA indexed, 1 byte offset -**-
+// $f8 EORA indexed -**-
+OP_HANDLER_MODE( eora )
+{
+ u8 t;
+ ARGBYTE(t);
A ^= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $e9 ADCA indexed, 1 byte offset **** */
-OP_HANDLER( adca_ix1 )
-{
- uint16_t t,r;
- IDX1BYTE(t);
- r = A + t + (CC & 0x01);
- CLR_HNZC;
- SET_FLAGS8(A,t,r);
- SET_H(A,t,r);
+ clr_nz();
+ set_nz8(A);
+}
+
+// $a9 ADCA immediate ****
+// $b9 ADCA direct ****
+// $c9 ADCA extended ****
+// $d9 ADCA indexed, 2 byte offset ****
+// $e9 ADCA indexed, 1 byte offset ****
+// $f9 ADCA indexed ****
+OP_HANDLER_MODE( adca )
+{
+ u16 t;
+ ARGBYTE(t);
+ u16 const r = A + t + BIT(CC, 0);
+ clr_hnzc();
+ set_hnzc8(A, t, r);
A = r;
}
-/* $ea ORA indexed, 1 byte offset -**- */
-OP_HANDLER( ora_ix1 )
+// $aa ORA immediate -**-
+// $ba ORA direct -**-
+// $ca ORA extended -**-
+// $da ORA indexed, 2 byte offset -**-
+// $ea ORA indexed, 1 byte offset -**-
+// $fa ORA indexed -**-
+OP_HANDLER_MODE( ora )
{
- uint8_t t;
- IDX1BYTE(t);
+ u8 t;
+ ARGBYTE(t);
A |= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $eb ADDA indexed, 1 byte offset **** */
-OP_HANDLER( adda_ix1 )
-{
- uint16_t t,r;
- IDX1BYTE(t);
- r = A + t;
- CLR_HNZC;
- SET_FLAGS8(A,t,r);
- SET_H(A,t,r);
+ clr_nz();
+ set_nz8(A);
+}
+
+// $ab ADDA immediate ****
+// $bb ADDA direct ****
+// $cb ADDA extended ****
+// $db ADDA indexed, 2 byte offset ****
+// $eb ADDA indexed, 1 byte offset ****
+// $fb ADDA indexed ****
+OP_HANDLER_MODE( adda )
+{
+ u16 t;
+ ARGBYTE(t);
+ u16 const r = A + t;
+ clr_hnzc();
+ set_hnzc8(A, t, r);
A = r;
}
-/* $ec JMP indexed, 1 byte offset -*** */
-OP_HANDLER( jmp_ix1 )
-{
- INDEXED1;
- PC = EA;
-}
-
-/* $ed JSR indexed, 1 byte offset ---- */
-OP_HANDLER( jsr_ix1 )
+// $ac ILLEGAL
+// $bc JMP direct -***
+// $cc JMP extended -***
+// $dc JMP indexed, 2 byte offset -***
+// $ec JMP indexed, 1 byte offset -***
+// $fc JMP indexed -***
+OP_HANDLER_MODE( jmp )
{
- INDEXED1;
- PUSHWORD(m_pc);
+ ARGADDR;
PC = EA;
}
-/* $ee LDX indexed, 1 byte offset -**- */
-OP_HANDLER( ldx_ix1 )
-{
- IDX1BYTE(X);
- CLR_NZ;
- SET_NZ8(X);
-}
-
-/* $ef STX indexed, 1 byte offset -**- */
-OP_HANDLER( stx_ix1 )
-{
- CLR_NZ;
- SET_NZ8(X);
- INDEXED1;
- WM(EAD,X);
-}
-
-/* $f0 SUBA indexed ?*** */
-OP_HANDLER( suba_ix )
-{
- uint16_t t,r;
- IDXBYTE(t);
- r = A - t;
- CLR_NZC;
- SET_FLAGS8(A,t,r);
- A = r;
-}
-
-/* $f1 CMPA indexed ?*** */
-OP_HANDLER( cmpa_ix )
-{
- uint16_t t,r;
- IDXBYTE(t);
- r = A - t;
- CLR_NZC;
- SET_FLAGS8(A,t,r);
-}
-
-/* $f2 SBCA indexed ?*** */
-OP_HANDLER( sbca_ix )
-{
- uint16_t t,r;
- IDXBYTE(t);
- r = A - t - (CC & 0x01);
- CLR_NZC;
- SET_FLAGS8(A,t,r);
- A = r;
-}
-
-/* $f3 CPX indexed -*** */
-OP_HANDLER( cpx_ix )
-{
- uint16_t t,r;
- IDXBYTE(t);
- r = X - t;
- CLR_NZC;
- SET_FLAGS8(X,t,r);
-}
-
-/* $f4 ANDA indexed -**- */
-OP_HANDLER( anda_ix )
-{
- uint8_t t;
- IDXBYTE(t);
- A &= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $f5 BITA indexed -**- */
-OP_HANDLER( bita_ix )
-{
- uint8_t t,r;
- IDXBYTE(t);
- r = A & t;
- CLR_NZ;
- SET_NZ8(r);
-}
-
-/* $f6 LDA indexed -**- */
-OP_HANDLER( lda_ix )
-{
- IDXBYTE(A);
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $f7 STA indexed -**- */
-OP_HANDLER( sta_ix )
-{
- CLR_NZ;
- SET_NZ8(A);
- INDEXED;
- WM(EAD,A);
-}
-
-/* $f8 EORA indexed -**- */
-OP_HANDLER( eora_ix )
-{
- uint8_t t;
- IDXBYTE(t);
- A ^= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $f9 ADCA indexed **** */
-OP_HANDLER( adca_ix )
-{
- uint16_t t,r;
- IDXBYTE(t);
- r = A + t + (CC & 0x01);
- CLR_HNZC;
- SET_FLAGS8(A,t,r);
- SET_H(A,t,r);
- A = r;
-}
-
-/* $fa ORA indexed -**- */
-OP_HANDLER( ora_ix )
-{
- uint8_t t;
- IDXBYTE(t);
- A |= t;
- CLR_NZ;
- SET_NZ8(A);
-}
-
-/* $fb ADDA indexed **** */
-OP_HANDLER( adda_ix )
-{
- uint16_t t,r;
- IDXBYTE(t);
- r = A + t;
- CLR_HNZC;
- SET_FLAGS8(A,t,r);
- SET_H(A,t,r);
- A = r;
-}
-
-/* $fc JMP indexed -*** */
-OP_HANDLER( jmp_ix )
+// $ad BSR ----
+OP_HANDLER( bsr )
{
- INDEXED;
- PC = EA;
+ u8 t;
+ immbyte(t);
+ pushword(m_pc);
+ PC += SIGNED(t);
}
-/* $fd JSR indexed ---- */
-OP_HANDLER( jsr_ix )
+// $bd JSR direct ----
+// $cd JSR extended ----
+// $dd JSR indexed, 2 byte offset ----
+// $ed JSR indexed, 1 byte offset ----
+// $fd JSR indexed ----
+OP_HANDLER_MODE( jsr )
{
- INDEXED;
- PUSHWORD(m_pc);
+ ARGADDR;
+ pushword(m_pc);
PC = EA;
}
-/* $fe LDX indexed -**- */
-OP_HANDLER( ldx_ix )
+// $ae LDX immediate -**-
+// $be LDX direct -**-
+// $ce LDX extended -**-
+// $de LDX indexed, 2 byte offset -**-
+// $ee LDX indexed, 1 byte offset -**-
+// $fe LDX indexed -**-
+OP_HANDLER_MODE( ldx )
{
- IDXBYTE(X);
- CLR_NZ;
- SET_NZ8(X);
+ ARGBYTE(X);
+ clr_nz();
+ set_nz8(X);
}
-/* $ff STX indexed -**- */
-OP_HANDLER( stx_ix )
+// $af ILLEGAL
+// $bf STX direct -**-
+// $cf STX extended -**-
+// $df STX indexed, 2 byte offset -**-
+// $ef STX indexed, 1 byte offset -**-
+// $ff STX indexed -**-
+OP_HANDLER_MODE( stx )
{
- CLR_NZ;
- SET_NZ8(X);
- INDEXED;
- WM(EAD,X);
+ clr_nz();
+ set_nz8(X);
+ ARGADDR;
+ wm(EAD, X);
}
diff --git a/src/devices/cpu/m6805/m6805.cpp b/src/devices/cpu/m6805/m6805.cpp
index bc1844f5bbf..4cb9301151b 100644
--- a/src/devices/cpu/m6805/m6805.cpp
+++ b/src/devices/cpu/m6805/m6805.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Aaron Giles
+// copyright-holders:Aaron Giles, Vas Crabb
/*** m6805: Portable 6805 emulator ******************************************
m6805.c (Also supports hd68705 and hd63705 variants)
@@ -40,56 +40,135 @@
#include <algorithm>
-#define IRQ_LEVEL_DETECT 0
-
-const uint8_t m6805_base_device::m_flags8i[256]= /* increment */
-{
- 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04
+#define OP(name) (&m6805_base_device::name)
+#define OP_T(name) (&m6805_base_device::name<true>)
+#define OP_F(name) (&m6805_base_device::name<false>)
+#define OP_IM(name) (&m6805_base_device::name<addr_mode::IM>)
+#define OP_DI(name) (&m6805_base_device::name<addr_mode::DI>)
+#define OP_EX(name) (&m6805_base_device::name<addr_mode::EX>)
+#define OP_IX(name) (&m6805_base_device::name<addr_mode::IX>)
+#define OP_IX1(name) (&m6805_base_device::name<addr_mode::IX1>)
+#define OP_IX2(name) (&m6805_base_device::name<addr_mode::IX2>)
+
+const m6805_base_device::op_handler_table m6805_base_device::s_hmos_ops =
+{
+ /* 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F */
+ /* 0 */ OP(brset<0>),OP(brclr<0>),OP(brset<1>),OP(brclr<1>),OP(brset<2>),OP(brclr<2>),OP(brset<3>),OP(brclr<3>),
+ OP(brset<4>),OP(brclr<4>),OP(brset<5>),OP(brclr<5>),OP(brset<6>),OP(brclr<6>),OP(brset<7>),OP(brclr<7>),
+ /* 1 */ OP(bset<0>), OP(bclr<0>), OP(bset<1>), OP(bclr<1>), OP(bset<2>), OP(bclr<2>), OP(bset<3>), OP(bclr<3>),
+ OP(bset<4>), OP(bclr<4>), OP(bset<5>), OP(bclr<5>), OP(bset<6>), OP(bclr<6>), OP(bset<7>), OP(bclr<7>),
+ /* 2 */ OP_T(bra), OP_F(bra), OP_T(bhi), OP_F(bhi), OP_T(bcc), OP_F(bcc), OP_T(bne), OP_F(bne),
+ OP_T(bhcc), OP_F(bhcc), OP_T(bpl), OP_F(bpl), OP_T(bmc), OP_F(bmc), OP(bil), OP(bih),
+ /* 3 */ OP_DI(neg), OP(illegal), OP(illegal), OP_DI(com), OP_DI(lsr), OP(illegal), OP_DI(ror), OP_DI(asr),
+ OP_DI(lsl), OP_DI(rol), OP_DI(dec), OP(illegal), OP_DI(inc), OP_DI(tst), OP(illegal), OP_DI(clr),
+ /* 4 */ OP(nega), OP(illegal), OP(illegal), OP(coma), OP(lsra), OP(illegal), OP(rora), OP(asra),
+ OP(lsla), OP(rola), OP(deca), OP(illegal), OP(inca), OP(tsta), OP(illegal), OP(clra),
+ /* 5 */ OP(negx), OP(illegal), OP(illegal), OP(comx), OP(lsrx), OP(illegal), OP(rorx), OP(asrx),
+ OP(lslx), OP(rolx), OP(decx), OP(illegal), OP(incx), OP(tstx), OP(illegal), OP(clrx),
+ /* 6 */ OP_IX1(neg), OP(illegal), OP(illegal), OP_IX1(com), OP_IX1(lsr), OP(illegal), OP_IX1(ror), OP_IX1(asr),
+ OP_IX1(lsl), OP_IX1(rol), OP_IX1(dec), OP(illegal), OP_IX1(inc), OP_IX1(tst), OP(illegal), OP_IX1(clr),
+ /* 7 */ OP_IX(neg), OP(illegal), OP(illegal), OP_IX(com), OP_IX(lsr), OP(illegal), OP_IX(ror), OP_IX(asr),
+ OP_IX(lsl), OP_IX(rol), OP_IX(dec), OP(illegal), OP_IX(inc), OP_IX(tst), OP(illegal), OP_IX(clr),
+ /* 8 */ OP(rti), OP(rts), OP(illegal), OP(swi), OP(illegal), OP(illegal), OP(illegal), OP(illegal),
+ OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal),
+ /* 9 */ OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(tax),
+ OP(clc), OP(sec), OP(cli), OP(sei), OP(rsp), OP(nop), OP(illegal), OP(txa),
+ /* A */ OP_IM(suba), OP_IM(cmpa), OP_IM(sbca), OP_IM(cpx), OP_IM(anda), OP_IM(bita), OP_IM(lda), OP(illegal),
+ OP_IM(eora), OP_IM(adca), OP_IM(ora), OP_IM(adda), OP(illegal), OP(bsr), OP_IM(ldx), OP(illegal),
+ /* B */ OP_DI(suba), OP_DI(cmpa), OP_DI(sbca), OP_DI(cpx), OP_DI(anda), OP_DI(bita), OP_DI(lda), OP_DI(sta),
+ OP_DI(eora), OP_DI(adca), OP_DI(ora), OP_DI(adda), OP_DI(jmp), OP_DI(jsr), OP_DI(ldx), OP_DI(stx),
+ /* C */ OP_EX(suba), OP_EX(cmpa), OP_EX(sbca), OP_EX(cpx), OP_EX(anda), OP_EX(bita), OP_EX(lda), OP_EX(sta),
+ OP_EX(eora), OP_EX(adca), OP_EX(ora), OP_EX(adda), OP_EX(jmp), OP_EX(jsr), OP_EX(ldx), OP_EX(stx),
+ /* D */ OP_IX2(suba),OP_IX2(cmpa),OP_IX2(sbca),OP_IX2(cpx), OP_IX2(anda),OP_IX2(bita),OP_IX2(lda), OP_IX2(sta),
+ OP_IX2(eora),OP_IX2(adca),OP_IX2(ora), OP_IX2(adda),OP_IX2(jmp), OP_IX2(jsr), OP_IX2(ldx), OP_IX2(stx),
+ /* E */ OP_IX1(suba),OP_IX1(cmpa),OP_IX1(sbca),OP_IX1(cpx), OP_IX1(anda),OP_IX1(bita),OP_IX1(lda), OP_IX1(sta),
+ OP_IX1(eora),OP_IX1(adca),OP_IX1(ora), OP_IX1(adda),OP_IX1(jmp), OP_IX1(jsr), OP_IX1(ldx), OP_IX1(stx),
+ /* F */ OP_IX(suba), OP_IX(cmpa), OP_IX(sbca), OP_IX(cpx), OP_IX(anda), OP_IX(bita), OP_IX(lda), OP_IX(sta),
+ OP_IX(eora), OP_IX(adca), OP_IX(ora), OP_IX(adda), OP_IX(jmp), OP_IX(jsr), OP_IX(ldx), OP_IX(stx)
};
-const uint8_t m6805_base_device::m_flags8d[256]= /* decrement */
-{
- 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,
- 0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04
+const m6805_base_device::op_handler_table m6805_base_device::s_cmos_ops =
+{
+ /* 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F */
+ /* 0 */ OP(brset<0>),OP(brclr<0>),OP(brset<1>),OP(brclr<1>),OP(brset<2>),OP(brclr<2>),OP(brset<3>),OP(brclr<3>),
+ OP(brset<4>),OP(brclr<4>),OP(brset<5>),OP(brclr<5>),OP(brset<6>),OP(brclr<6>),OP(brset<7>),OP(brclr<7>),
+ /* 1 */ OP(bset<0>), OP(bclr<0>), OP(bset<1>), OP(bclr<1>), OP(bset<2>), OP(bclr<2>), OP(bset<3>), OP(bclr<3>),
+ OP(bset<4>), OP(bclr<4>), OP(bset<5>), OP(bclr<5>), OP(bset<6>), OP(bclr<6>), OP(bset<7>), OP(bclr<7>),
+ /* 2 */ OP_T(bra), OP_F(bra), OP_T(bhi), OP_F(bhi), OP_T(bcc), OP_F(bcc), OP_T(bne), OP_F(bne),
+ OP_T(bhcc), OP_F(bhcc), OP_T(bpl), OP_F(bpl), OP_T(bmc), OP_F(bmc), OP(bil), OP(bih),
+ /* 3 */ OP_DI(neg), OP(illegal), OP(illegal), OP_DI(com), OP_DI(lsr), OP(illegal), OP_DI(ror), OP_DI(asr),
+ OP_DI(lsl), OP_DI(rol), OP_DI(dec), OP(illegal), OP_DI(inc), OP_DI(tst), OP(illegal), OP_DI(clr),
+ /* 4 */ OP(nega), OP(illegal), OP(illegal), OP(coma), OP(lsra), OP(illegal), OP(rora), OP(asra),
+ OP(lsla), OP(rola), OP(deca), OP(illegal), OP(inca), OP(tsta), OP(illegal), OP(clra),
+ /* 5 */ OP(negx), OP(illegal), OP(illegal), OP(comx), OP(lsrx), OP(illegal), OP(rorx), OP(asrx),
+ OP(lslx), OP(rolx), OP(decx), OP(illegal), OP(incx), OP(tstx), OP(illegal), OP(clrx),
+ /* 6 */ OP_IX1(neg), OP(illegal), OP(illegal), OP_IX1(com), OP_IX1(lsr), OP(illegal), OP_IX1(ror), OP_IX1(asr),
+ OP_IX1(lsl), OP_IX1(rol), OP_IX1(dec), OP(illegal), OP_IX1(inc), OP_IX1(tst), OP(illegal), OP_IX1(clr),
+ /* 7 */ OP_IX(neg), OP(illegal), OP(illegal), OP_IX(com), OP_IX(lsr), OP(illegal), OP_IX(ror), OP_IX(asr),
+ OP_IX(lsl), OP_IX(rol), OP_IX(dec), OP(illegal), OP_IX(inc), OP_IX(tst), OP(illegal), OP_IX(clr),
+ /* 8 */ OP(rti), OP(rts), OP(illegal), OP(swi), OP(illegal), OP(illegal), OP(illegal), OP(illegal),
+ OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(stop), OP(wait),
+ /* 9 */ OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(tax),
+ OP(clc), OP(sec), OP(cli), OP(sei), OP(rsp), OP(nop), OP(illegal), OP(txa),
+ /* A */ OP_IM(suba), OP_IM(cmpa), OP_IM(sbca), OP_IM(cpx), OP_IM(anda), OP_IM(bita), OP_IM(lda), OP(illegal),
+ OP_IM(eora), OP_IM(adca), OP_IM(ora), OP_IM(adda), OP(illegal), OP(bsr), OP_IM(ldx), OP(illegal),
+ /* B */ OP_DI(suba), OP_DI(cmpa), OP_DI(sbca), OP_DI(cpx), OP_DI(anda), OP_DI(bita), OP_DI(lda), OP_DI(sta),
+ OP_DI(eora), OP_DI(adca), OP_DI(ora), OP_DI(adda), OP_DI(jmp), OP_DI(jsr), OP_DI(ldx), OP_DI(stx),
+ /* C */ OP_EX(suba), OP_EX(cmpa), OP_EX(sbca), OP_EX(cpx), OP_EX(anda), OP_EX(bita), OP_EX(lda), OP_EX(sta),
+ OP_EX(eora), OP_EX(adca), OP_EX(ora), OP_EX(adda), OP_EX(jmp), OP_EX(jsr), OP_EX(ldx), OP_EX(stx),
+ /* D */ OP_IX2(suba),OP_IX2(cmpa),OP_IX2(sbca),OP_IX2(cpx), OP_IX2(anda),OP_IX2(bita),OP_IX2(lda), OP_IX2(sta),
+ OP_IX2(eora),OP_IX2(adca),OP_IX2(ora), OP_IX2(adda),OP_IX2(jmp), OP_IX2(jsr), OP_IX2(ldx), OP_IX2(stx),
+ /* E */ OP_IX1(suba),OP_IX1(cmpa),OP_IX1(sbca),OP_IX1(cpx), OP_IX1(anda),OP_IX1(bita),OP_IX1(lda), OP_IX1(sta),
+ OP_IX1(eora),OP_IX1(adca),OP_IX1(ora), OP_IX1(adda),OP_IX1(jmp), OP_IX1(jsr), OP_IX1(ldx), OP_IX1(stx),
+ /* F */ OP_IX(suba), OP_IX(cmpa), OP_IX(sbca), OP_IX(cpx), OP_IX(anda), OP_IX(bita), OP_IX(lda), OP_IX(sta),
+ OP_IX(eora), OP_IX(adca), OP_IX(ora), OP_IX(adda), OP_IX(jmp), OP_IX(jsr), OP_IX(ldx), OP_IX(stx)
};
-/* what they say it is ... */
-const uint8_t m6805_base_device::m_cycles1[] =
+const m6805_base_device::op_handler_table m6805_base_device::s_hc_ops =
+{
+ /* 0/8 1/9 2/A 3/B 4/C 5/D 6/E 7/F */
+ /* 0 */ OP(brset<0>),OP(brclr<0>),OP(brset<1>),OP(brclr<1>),OP(brset<2>),OP(brclr<2>),OP(brset<3>),OP(brclr<3>),
+ OP(brset<4>),OP(brclr<4>),OP(brset<5>),OP(brclr<5>),OP(brset<6>),OP(brclr<6>),OP(brset<7>),OP(brclr<7>),
+ /* 1 */ OP(bset<0>), OP(bclr<0>), OP(bset<1>), OP(bclr<1>), OP(bset<2>), OP(bclr<2>), OP(bset<3>), OP(bclr<3>),
+ OP(bset<4>), OP(bclr<4>), OP(bset<5>), OP(bclr<5>), OP(bset<6>), OP(bclr<6>), OP(bset<7>), OP(bclr<7>),
+ /* 2 */ OP_T(bra), OP_F(bra), OP_T(bhi), OP_F(bhi), OP_T(bcc), OP_F(bcc), OP_T(bne), OP_F(bne),
+ OP_T(bhcc), OP_F(bhcc), OP_T(bpl), OP_F(bpl), OP_T(bmc), OP_F(bmc), OP(bil), OP(bih),
+ /* 3 */ OP_DI(neg), OP(illegal), OP(illegal), OP_DI(com), OP_DI(lsr), OP(illegal), OP_DI(ror), OP_DI(asr),
+ OP_DI(lsl), OP_DI(rol), OP_DI(dec), OP(illegal), OP_DI(inc), OP_DI(tst), OP(illegal), OP_DI(clr),
+ /* 4 */ OP(nega), OP(illegal), OP(mul), OP(coma), OP(lsra), OP(illegal), OP(rora), OP(asra),
+ OP(lsla), OP(rola), OP(deca), OP(illegal), OP(inca), OP(tsta), OP(illegal), OP(clra),
+ /* 5 */ OP(negx), OP(illegal), OP(illegal), OP(comx), OP(lsrx), OP(illegal), OP(rorx), OP(asrx),
+ OP(lslx), OP(rolx), OP(decx), OP(illegal), OP(incx), OP(tstx), OP(illegal), OP(clrx),
+ /* 6 */ OP_IX1(neg), OP(illegal), OP(illegal), OP_IX1(com), OP_IX1(lsr), OP(illegal), OP_IX1(ror), OP_IX1(asr),
+ OP_IX1(lsl), OP_IX1(rol), OP_IX1(dec), OP(illegal), OP_IX1(inc), OP_IX1(tst), OP(illegal), OP_IX1(clr),
+ /* 7 */ OP_IX(neg), OP(illegal), OP(illegal), OP_IX(com), OP_IX(lsr), OP(illegal), OP_IX(ror), OP_IX(asr),
+ OP_IX(lsl), OP_IX(rol), OP_IX(dec), OP(illegal), OP_IX(inc), OP_IX(tst), OP(illegal), OP_IX(clr),
+ /* 8 */ OP(rti), OP(rts), OP(illegal), OP(swi), OP(illegal), OP(illegal), OP(illegal), OP(illegal),
+ OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(stop), OP(wait),
+ /* 9 */ OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(illegal), OP(tax),
+ OP(clc), OP(sec), OP(cli), OP(sei), OP(rsp), OP(nop), OP(illegal), OP(txa),
+ /* A */ OP_IM(suba), OP_IM(cmpa), OP_IM(sbca), OP_IM(cpx), OP_IM(anda), OP_IM(bita), OP_IM(lda), OP(illegal),
+ OP_IM(eora), OP_IM(adca), OP_IM(ora), OP_IM(adda), OP(illegal), OP(bsr), OP_IM(ldx), OP(illegal),
+ /* B */ OP_DI(suba), OP_DI(cmpa), OP_DI(sbca), OP_DI(cpx), OP_DI(anda), OP_DI(bita), OP_DI(lda), OP_DI(sta),
+ OP_DI(eora), OP_DI(adca), OP_DI(ora), OP_DI(adda), OP_DI(jmp), OP_DI(jsr), OP_DI(ldx), OP_DI(stx),
+ /* C */ OP_EX(suba), OP_EX(cmpa), OP_EX(sbca), OP_EX(cpx), OP_EX(anda), OP_EX(bita), OP_EX(lda), OP_EX(sta),
+ OP_EX(eora), OP_EX(adca), OP_EX(ora), OP_EX(adda), OP_EX(jmp), OP_EX(jsr), OP_EX(ldx), OP_EX(stx),
+ /* D */ OP_IX2(suba),OP_IX2(cmpa),OP_IX2(sbca),OP_IX2(cpx), OP_IX2(anda),OP_IX2(bita),OP_IX2(lda), OP_IX2(sta),
+ OP_IX2(eora),OP_IX2(adca),OP_IX2(ora), OP_IX2(adda),OP_IX2(jmp), OP_IX2(jsr), OP_IX2(ldx), OP_IX2(stx),
+ /* E */ OP_IX1(suba),OP_IX1(cmpa),OP_IX1(sbca),OP_IX1(cpx), OP_IX1(anda),OP_IX1(bita),OP_IX1(lda), OP_IX1(sta),
+ OP_IX1(eora),OP_IX1(adca),OP_IX1(ora), OP_IX1(adda),OP_IX1(jmp), OP_IX1(jsr), OP_IX1(ldx), OP_IX1(stx),
+ /* F */ OP_IX(suba), OP_IX(cmpa), OP_IX(sbca), OP_IX(cpx), OP_IX(anda), OP_IX(bita), OP_IX(lda), OP_IX(sta),
+ OP_IX(eora), OP_IX(adca), OP_IX(ora), OP_IX(adda), OP_IX(jmp), OP_IX(jsr), OP_IX(ldx), OP_IX(stx)
+};
+
+
+const m6805_base_device::cycle_count_table m6805_base_device::s_hmos_cycles =
{
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
/*0*/ 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
/*1*/ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
- /*2*/ 4, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- /*3*/ 6, 0, 0, 6, 6, 0, 6, 6, 6, 6, 6, 6, 0, 6, 6, 0,
+ /*2*/ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ /*3*/ 6, 0, 0, 6, 6, 0, 6, 6, 6, 6, 6, 0, 6, 6, 0, 6,
/*4*/ 4, 0, 0, 4, 4, 0, 4, 4, 4, 4, 4, 0, 4, 4, 0, 4,
/*5*/ 4, 0, 0, 4, 4, 0, 4, 4, 4, 4, 4, 0, 4, 4, 0, 4,
/*6*/ 7, 0, 0, 7, 7, 0, 7, 7, 7, 7, 7, 0, 7, 7, 0, 7,
@@ -104,175 +183,83 @@ const uint8_t m6805_base_device::m_cycles1[] =
/*F*/ 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 3, 7, 4, 5
};
-
-void m6805_base_device::rd_s_handler_b(uint8_t *b)
+const m6805_base_device::cycle_count_table m6805_base_device::s_cmos_cycles =
{
- SP_INC;
- *b = RM( S );
-}
-
-void m6805_base_device::rd_s_handler_w(PAIR *p)
-{
- CLEAR_PAIR(p);
- SP_INC;
- p->b.h = RM( S );
- SP_INC;
- p->b.l = RM( S );
-}
-
-void m6805_base_device::wr_s_handler_b(uint8_t *b)
-{
- WM( S, *b );
- SP_DEC;
-}
-
-void m6805_base_device::wr_s_handler_w(PAIR *p)
-{
- WM( S, p->b.l );
- SP_DEC;
- WM( S, p->b.h );
- SP_DEC;
-}
-
-void m6805_base_device::RM16(uint32_t addr, PAIR *p)
-{
- CLEAR_PAIR(p);
- p->b.h = RM(addr);
- ++addr;
-// if( ++addr > AMASK ) addr = 0;
- p->b.l = RM(addr);
-}
-
-void m6805_base_device::interrupt_vector()
-{
- RM16(0xffff - 5, &m_pc);
-}
-
-void m68hc05eg_device::interrupt_vector()
-{
- if ((m_pending_interrupts & (1 << M68HC05EG_INT_IRQ)) != 0)
- {
- m_pending_interrupts &= ~(1 << M68HC05EG_INT_IRQ);
- RM16(0x1ffa, &m_pc);
- }
- else if((m_pending_interrupts & (1 << M68HC05EG_INT_TIMER)) != 0)
- {
- m_pending_interrupts &= ~(1 << M68HC05EG_INT_TIMER);
- RM16(0x1ff8, &m_pc);
- }
- else if((m_pending_interrupts & (1 << M68HC05EG_INT_CPI)) != 0)
- {
- m_pending_interrupts &= ~(1 << M68HC05EG_INT_CPI);
- RM16(0x1ff6, &m_pc);
- }
-}
-
-void hd63705_device::interrupt_vector()
-{
- /* Need to add emulation of other interrupt sources here KW-2/4/99 */
- /* This is just a quick patch for Namco System 2 operation */
-
- if ((m_pending_interrupts & (1 << HD63705_INT_IRQ1)) != 0)
- {
- m_pending_interrupts &= ~(1 << HD63705_INT_IRQ1);
- RM16(0x1ff8, &m_pc);
- }
- else if ((m_pending_interrupts & (1 << HD63705_INT_IRQ2)) != 0)
- {
- m_pending_interrupts &= ~(1 << HD63705_INT_IRQ2);
- RM16(0x1fec, &m_pc);
- }
- else if ((m_pending_interrupts & (1 << HD63705_INT_ADCONV)) != 0)
- {
- m_pending_interrupts &= ~(1 << HD63705_INT_ADCONV);
- RM16(0x1fea, &m_pc);
- }
- else if ((m_pending_interrupts & (1 << HD63705_INT_TIMER1)) != 0)
- {
- m_pending_interrupts &= ~(1 << HD63705_INT_TIMER1);
- RM16(0x1ff6, &m_pc);
- }
- else if ((m_pending_interrupts & (1 << HD63705_INT_TIMER2)) != 0)
- {
- m_pending_interrupts &= ~(1 << HD63705_INT_TIMER2);
- RM16(0x1ff4, &m_pc);
- }
- else if ((m_pending_interrupts & (1 << HD63705_INT_TIMER3)) != 0)
- {
- m_pending_interrupts &= ~(1<<HD63705_INT_TIMER3);
- RM16(0x1ff2, &m_pc);
- }
- else if ((m_pending_interrupts & (1 << HD63705_INT_PCI)) != 0)
- {
- m_pending_interrupts &= ~(1 << HD63705_INT_PCI);
- RM16(0x1ff0, &m_pc);
- }
- else if ((m_pending_interrupts & (1 << HD63705_INT_SCI)) != 0)
- {
- m_pending_interrupts &= ~(1 << HD63705_INT_SCI);
- RM16(0x1fee, &m_pc);
- }
-}
+ /* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+ /*0*/ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ /*1*/ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ /*2*/ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ /*3*/ 5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 5, 0, 5, 4, 0, 5,
+ /*4*/ 3, 0, 0, 3, 3, 0, 3, 3, 3, 3, 3, 0, 3, 3, 0, 3,
+ /*5*/ 3, 0, 0, 3, 3, 0, 3, 3, 3, 3, 3, 0, 3, 3, 0, 3,
+ /*6*/ 6, 0, 0, 6, 6, 0, 6, 6, 6, 6, 6, 0, 6, 5, 0, 6,
+ /*7*/ 5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 5, 0, 5, 4, 0, 5,
+ /*8*/ 9, 6, 0,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2,
+ /*9*/ 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 2,
+ /*A*/ 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 6, 2, 0,
+ /*B*/ 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 2, 5, 3, 4,
+ /*C*/ 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 3, 6, 4, 5,
+ /*D*/ 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 4, 7, 5, 6,
+ /*E*/ 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 3, 6, 4, 5,
+ /*F*/ 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 2, 5, 3, 4
+};
-/* Generate interrupts */
-void m6805_base_device::interrupt()
+const m6805_base_device::cycle_count_table m6805_base_device::s_hc_cycles =
{
- /* the 6805 latches interrupt requests internally, so we don't clear */
- /* pending_interrupts until the interrupt is taken, no matter what the */
- /* external IRQ pin does. */
-
- if ((m_pending_interrupts & (1 << HD63705_INT_NMI)) != 0)
- {
- PUSHWORD(m_pc);
- PUSHBYTE(m_x);
- PUSHBYTE(m_a);
- PUSHBYTE(m_cc);
- SEI;
- /* no vectors supported, just do the callback to clear irq_state if needed */
- standard_irq_callback(0);
-
- RM16(0x1ffc, &m_pc);
- m_pending_interrupts &= ~(1 << HD63705_INT_NMI);
-
- m_icount -= 11;
- burn_cycles(11);
- }
- else if((m_pending_interrupts & ((1 << M6805_IRQ_LINE) | HD63705_INT_MASK)) != 0)
- {
- if ((CC & IFLAG) == 0)
- {
- /* standard IRQ */
- PUSHWORD(m_pc);
- PUSHBYTE(m_x);
- PUSHBYTE(m_a);
- PUSHBYTE(m_cc);
- SEI;
- /* no vectors supported, just do the callback to clear irq_state if needed */
- standard_irq_callback(0);
-
- interrupt_vector();
-
- m_pending_interrupts &= ~(1 << M6805_IRQ_LINE);
- }
- m_icount -= 11;
- burn_cycles(11);
- }
-}
+ /* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+ /*0*/ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ /*1*/ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ /*2*/ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ /*3*/ 5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 5, 0, 5, 4, 0, 5,
+ /*4*/ 3, 0,11, 3, 3, 0, 3, 3, 3, 3, 3, 0, 3, 3, 0, 3,
+ /*5*/ 3, 0, 0, 3, 3, 0, 3, 3, 3, 3, 3, 0, 3, 3, 0, 3,
+ /*6*/ 6, 0, 0, 6, 6, 0, 6, 6, 6, 6, 6, 0, 6, 5, 0, 6,
+ /*7*/ 5, 0, 0, 5, 5, 0, 5, 5, 5, 5, 5, 0, 5, 4, 0, 5,
+ /*8*/ 9, 6, 0,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2,
+ /*9*/ 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 2,
+ /*A*/ 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 6, 2, 0,
+ /*B*/ 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 2, 5, 3, 4,
+ /*C*/ 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 3, 6, 4, 5,
+ /*D*/ 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 4, 7, 5, 6,
+ /*E*/ 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 3, 6, 4, 5,
+ /*F*/ 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 2, 5, 3, 4
+};
//-------------------------------------------------
// m6809_base_device - constructor
//-------------------------------------------------
-m6805_base_device::m6805_base_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, const device_type type, const char *name, uint32_t addr_width, const char *shortname, const char *source)
+m6805_base_device::m6805_base_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock,
+ device_type const type,
+ char const *name,
+ configuration_params const &params,
+ char const *shortname,
+ char const *source)
: cpu_device(mconfig, type, name, tag, owner, clock, shortname, source)
- , m_program_config("program", ENDIANNESS_BIG, 8, addr_width)
+ , m_params(params)
+ , m_program_config("program", ENDIANNESS_BIG, 8, params.m_addr_width)
{
}
-m6805_base_device::m6805_base_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, const device_type type, const char *name, uint32_t addr_width, address_map_delegate internal_map, const char *shortname, const char *source)
+m6805_base_device::m6805_base_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock,
+ device_type const type,
+ char const *name,
+ configuration_params const &params,
+ address_map_delegate internal_map,
+ char const *shortname,
+ char const *source)
: cpu_device(mconfig, type, name, tag, owner, clock, shortname, source)
- , m_program_config("program", ENDIANNESS_BIG, 8, addr_width, 0, internal_map)
+ , m_params(params)
+ , m_program_config("program", ENDIANNESS_BIG, 8, params.m_addr_width, 0, internal_map)
{
}
@@ -298,8 +285,6 @@ void m6805_base_device::device_start()
// register for savestates
save_item(NAME(EA));
- save_item(NAME(SP_MASK));
- save_item(NAME(SP_LOW));
save_item(NAME(A));
save_item(NAME(PC));
save_item(NAME(S));
@@ -312,13 +297,9 @@ void m6805_base_device::device_start()
std::fill(std::begin(m_irq_state), std::end(m_irq_state), 0);
}
-
-
void m6805_base_device::device_reset()
{
m_ea.w.l = 0;
- m_sp_mask = 0x07f;
- m_sp_low = 0x060;
m_pc.w.l = 0;
m_s.w.l = SP_MASK;
m_a = 0;
@@ -334,7 +315,7 @@ void m6805_base_device::device_reset()
/* IRQ disabled */
SEI;
- RM16(0xfffe, &m_pc);
+ rm16(0xfffe, m_pc);
}
@@ -347,10 +328,9 @@ void m6805_base_device::device_reset()
const address_space_config *m6805_base_device::memory_space_config(address_spacenum spacenum) const
{
if (spacenum == AS_PROGRAM)
- {
return &m_program_config;
- }
- return nullptr;
+ else
+ return nullptr;
}
@@ -363,17 +343,69 @@ void m6805_base_device::state_string_export(const device_state_entry &entry, std
{
switch (entry.index())
{
- case STATE_GENFLAGS:
- str = string_format("%c%c%c%c%c%c%c%c",
- (m_cc & 0x80) ? '?' : '.',
- (m_cc & 0x40) ? '?' : '.',
- (m_cc & 0x20) ? '?' : '.',
- (m_cc & 0x10) ? 'H' : '.',
- (m_cc & 0x08) ? 'I' : '.',
- (m_cc & 0x04) ? 'N' : '.',
- (m_cc & 0x02) ? 'Z' : '.',
- (m_cc & 0x01) ? 'C' : '.');
- break;
+ case STATE_GENFLAGS:
+ str = string_format("%c%c%c%c%c%c%c%c",
+ (m_cc & 0x80) ? '?' : '.',
+ (m_cc & 0x40) ? '?' : '.',
+ (m_cc & 0x20) ? '?' : '.',
+ (m_cc & 0x10) ? 'H' : '.',
+ (m_cc & 0x08) ? 'I' : '.',
+ (m_cc & 0x04) ? 'N' : '.',
+ (m_cc & 0x02) ? 'Z' : '.',
+ (m_cc & 0x01) ? 'C' : '.');
+ break;
+ }
+}
+
+
+void m6805_base_device::interrupt_vector()
+{
+ rm16(0xfffa, m_pc);
+}
+
+/* Generate interrupts */
+void m6805_base_device::interrupt()
+{
+ /* the 6805 latches interrupt requests internally, so we don't clear */
+ /* pending_interrupts until the interrupt is taken, no matter what the */
+ /* external IRQ pin does. */
+
+ if ((m_pending_interrupts & (1 << HD63705_INT_NMI)) != 0)
+ {
+ pushword(m_pc);
+ pushbyte(m_x);
+ pushbyte(m_a);
+ pushbyte(m_cc);
+ SEI;
+ /* no vectors supported, just do the callback to clear irq_state if needed */
+ standard_irq_callback(0);
+
+ rm16(0x1ffc, m_pc);
+ m_pending_interrupts &= ~(1 << HD63705_INT_NMI);
+
+ m_icount -= 11;
+ burn_cycles(11);
+ }
+ else if ((m_pending_interrupts & ((1 << M6805_IRQ_LINE) | HD63705_INT_MASK)) != 0)
+ {
+ if ((CC & IFLAG) == 0)
+ {
+ /* standard IRQ */
+ pushword(m_pc);
+ pushbyte(m_x);
+ pushbyte(m_a);
+ pushbyte(m_cc);
+ SEI;
+ /* no vectors supported, just do the callback to clear irq_state if needed */
+ standard_irq_callback(0);
+
+ interrupt_vector();
+
+ m_pending_interrupts &= ~(1 << M6805_IRQ_LINE);
+
+ m_icount -= 11;
+ burn_cycles(11);
+ }
}
}
@@ -407,26 +439,10 @@ uint32_t m6805_base_device::disasm_max_opcode_bytes() const
offs_t m6805_base_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options)
{
- extern CPU_DISASSEMBLE( m6805 );
return CPU_DISASSEMBLE_NAME(m6805)(this, stream, pc, oprom, opram, options);
}
-void m6805_device::execute_set_input(int inputnum, int state)
-{
- /* Basic 6805 only has one IRQ line */
- /* See HD63705 specific version */
- if (m_irq_state[0] != state)
- {
- m_irq_state[0] = state;
-
- if (state != CLEAR_LINE)
- {
- m_pending_interrupts |= 1 << M6805_IRQ_LINE;
- }
- }
-}
-
#include "6805ops.hxx"
//-------------------------------------------------
@@ -458,7 +474,12 @@ uint64_t m6805_base_device::execute_cycles_to_clocks(uint64_t cycles) const
uint32_t m6805_base_device::execute_min_cycles() const
{
- return 2;
+ // get the minimum not including the zero placeholders for illegal instructions
+ u32 const result(*std::min_element(
+ std::begin(m_params.m_cycles),
+ std::end(m_params.m_cycles),
+ [] (u8 x, u8 y) { return u8(x - 1) < u8(y - 1); }));
+ return result;
}
@@ -469,7 +490,8 @@ uint32_t m6805_base_device::execute_min_cycles() const
uint32_t m6805_base_device::execute_max_cycles() const
{
- return 10;
+ u32 const result(*std::max_element(std::begin(m_params.m_cycles), std::end(m_params.m_cycles)));
+ return result;
}
@@ -487,8 +509,6 @@ uint32_t m6805_base_device::execute_input_lines() const
/* execute instructions on this CPU until icount expires */
void m6805_base_device::execute_run()
{
- uint8_t ireg;
-
S = SP_ADJUST( S ); /* Taken from CPU_SET_CONTEXT when pointer'afying */
do
@@ -500,288 +520,68 @@ void m6805_base_device::execute_run()
debugger_instruction_hook(this, PC);
- ireg = M_RDOP(PC++);
+ u8 const ireg = rdop(PC++);
+
+ (this->*m_params.m_ops[ireg])();
+ m_icount -= m_params.m_cycles[ireg];
+ burn_cycles(m_params.m_cycles[ireg]);
+ }
+ while (m_icount > 0);
+}
+
+
+void m6805_device::execute_set_input(int inputnum, int state)
+{
+ /* Basic 6805 only has one IRQ line */
+ /* See HD63705 specific version */
+ if (m_irq_state[0] != state)
+ {
+ m_irq_state[0] = state;
- switch (ireg)
+ if (state != CLEAR_LINE)
{
- case 0x00: brset(0x01); break;
- case 0x01: brclr(0x01); break;
- case 0x02: brset(0x02); break;
- case 0x03: brclr(0x02); break;
- case 0x04: brset(0x04); break;
- case 0x05: brclr(0x04); break;
- case 0x06: brset(0x08); break;
- case 0x07: brclr(0x08); break;
- case 0x08: brset(0x10); break;
- case 0x09: brclr(0x10); break;
- case 0x0A: brset(0x20); break;
- case 0x0B: brclr(0x20); break;
- case 0x0C: brset(0x40); break;
- case 0x0D: brclr(0x40); break;
- case 0x0E: brset(0x80); break;
- case 0x0F: brclr(0x80); break;
- case 0x10: bset(0x01); break;
- case 0x11: bclr(0x01); break;
- case 0x12: bset(0x02); break;
- case 0x13: bclr(0x02); break;
- case 0x14: bset(0x04); break;
- case 0x15: bclr(0x04); break;
- case 0x16: bset(0x08); break;
- case 0x17: bclr(0x08); break;
- case 0x18: bset(0x10); break;
- case 0x19: bclr(0x10); break;
- case 0x1a: bset(0x20); break;
- case 0x1b: bclr(0x20); break;
- case 0x1c: bset(0x40); break;
- case 0x1d: bclr(0x40); break;
- case 0x1e: bset(0x80); break;
- case 0x1f: bclr(0x80); break;
- case 0x20: bra(); break;
- case 0x21: brn(); break;
- case 0x22: bhi(); break;
- case 0x23: bls(); break;
- case 0x24: bcc(); break;
- case 0x25: bcs(); break;
- case 0x26: bne(); break;
- case 0x27: beq(); break;
- case 0x28: bhcc(); break;
- case 0x29: bhcs(); break;
- case 0x2a: bpl(); break;
- case 0x2b: bmi(); break;
- case 0x2c: bmc(); break;
- case 0x2d: bms(); break;
- case 0x2e: bil(); break;
- case 0x2f: bih(); break;
- case 0x30: neg_di(); break;
- case 0x31: illegal(); break;
- case 0x32: illegal(); break;
- case 0x33: com_di(); break;
- case 0x34: lsr_di(); break;
- case 0x35: illegal(); break;
- case 0x36: ror_di(); break;
- case 0x37: asr_di(); break;
- case 0x38: lsl_di(); break;
- case 0x39: rol_di(); break;
- case 0x3a: dec_di(); break;
- case 0x3b: illegal(); break;
- case 0x3c: inc_di(); break;
- case 0x3d: tst_di(); break;
- case 0x3e: illegal(); break;
- case 0x3f: clr_di(); break;
- case 0x40: nega(); break;
- case 0x41: illegal(); break;
- case 0x42: illegal(); break;
- case 0x43: coma(); break;
- case 0x44: lsra(); break;
- case 0x45: illegal(); break;
- case 0x46: rora(); break;
- case 0x47: asra(); break;
- case 0x48: lsla(); break;
- case 0x49: rola(); break;
- case 0x4a: deca(); break;
- case 0x4b: illegal(); break;
- case 0x4c: inca(); break;
- case 0x4d: tsta(); break;
- case 0x4e: illegal(); break;
- case 0x4f: clra(); break;
- case 0x50: negx(); break;
- case 0x51: illegal(); break;
- case 0x52: illegal(); break;
- case 0x53: comx(); break;
- case 0x54: lsrx(); break;
- case 0x55: illegal(); break;
- case 0x56: rorx(); break;
- case 0x57: asrx(); break;
- case 0x58: aslx(); break;
- case 0x59: rolx(); break;
- case 0x5a: decx(); break;
- case 0x5b: illegal(); break;
- case 0x5c: incx(); break;
- case 0x5d: tstx(); break;
- case 0x5e: illegal(); break;
- case 0x5f: clrx(); break;
- case 0x60: neg_ix1(); break;
- case 0x61: illegal(); break;
- case 0x62: illegal(); break;
- case 0x63: com_ix1(); break;
- case 0x64: lsr_ix1(); break;
- case 0x65: illegal(); break;
- case 0x66: ror_ix1(); break;
- case 0x67: asr_ix1(); break;
- case 0x68: lsl_ix1(); break;
- case 0x69: rol_ix1(); break;
- case 0x6a: dec_ix1(); break;
- case 0x6b: illegal(); break;
- case 0x6c: inc_ix1(); break;
- case 0x6d: tst_ix1(); break;
- case 0x6e: illegal(); break;
- case 0x6f: clr_ix1(); break;
- case 0x70: neg_ix(); break;
- case 0x71: illegal(); break;
- case 0x72: illegal(); break;
- case 0x73: com_ix(); break;
- case 0x74: lsr_ix(); break;
- case 0x75: illegal(); break;
- case 0x76: ror_ix(); break;
- case 0x77: asr_ix(); break;
- case 0x78: lsl_ix(); break;
- case 0x79: rol_ix(); break;
- case 0x7a: dec_ix(); break;
- case 0x7b: illegal(); break;
- case 0x7c: inc_ix(); break;
- case 0x7d: tst_ix(); break;
- case 0x7e: illegal(); break;
- case 0x7f: clr_ix(); break;
- case 0x80: rti(); break;
- case 0x81: rts(); break;
- case 0x82: illegal(); break;
- case 0x83: swi(); break;
- case 0x84: illegal(); break;
- case 0x85: illegal(); break;
- case 0x86: illegal(); break;
- case 0x87: illegal(); break;
- case 0x88: illegal(); break;
- case 0x89: illegal(); break;
- case 0x8a: illegal(); break;
- case 0x8b: illegal(); break;
- case 0x8c: illegal(); break;
- case 0x8d: illegal(); break;
- case 0x8e: illegal(); break;
- case 0x8f: illegal(); break;
- case 0x90: illegal(); break;
- case 0x91: illegal(); break;
- case 0x92: illegal(); break;
- case 0x93: illegal(); break;
- case 0x94: illegal(); break;
- case 0x95: illegal(); break;
- case 0x96: illegal(); break;
- case 0x97: tax(); break;
- case 0x98: CLC; break;
- case 0x99: SEC; break;
-#if IRQ_LEVEL_DETECT
- case 0x9a: CLI; if (m_irq_state != CLEAR_LINE) m_pending_interrupts |= 1 << M6805_IRQ_LINE; break;
-#else
- case 0x9a: CLI; break;
-#endif
- case 0x9b: SEI; break;
- case 0x9c: rsp(); break;
- case 0x9d: nop(); break;
- case 0x9e: illegal(); break;
- case 0x9f: txa(); break;
- case 0xa0: suba_im(); break;
- case 0xa1: cmpa_im(); break;
- case 0xa2: sbca_im(); break;
- case 0xa3: cpx_im(); break;
- case 0xa4: anda_im(); break;
- case 0xa5: bita_im(); break;
- case 0xa6: lda_im(); break;
- case 0xa7: illegal(); break;
- case 0xa8: eora_im(); break;
- case 0xa9: adca_im(); break;
- case 0xaa: ora_im(); break;
- case 0xab: adda_im(); break;
- case 0xac: illegal(); break;
- case 0xad: bsr(); break;
- case 0xae: ldx_im(); break;
- case 0xaf: illegal(); break;
- case 0xb0: suba_di(); break;
- case 0xb1: cmpa_di(); break;
- case 0xb2: sbca_di(); break;
- case 0xb3: cpx_di(); break;
- case 0xb4: anda_di(); break;
- case 0xb5: bita_di(); break;
- case 0xb6: lda_di(); break;
- case 0xb7: sta_di(); break;
- case 0xb8: eora_di(); break;
- case 0xb9: adca_di(); break;
- case 0xba: ora_di(); break;
- case 0xbb: adda_di(); break;
- case 0xbc: jmp_di(); break;
- case 0xbd: jsr_di(); break;
- case 0xbe: ldx_di(); break;
- case 0xbf: stx_di(); break;
- case 0xc0: suba_ex(); break;
- case 0xc1: cmpa_ex(); break;
- case 0xc2: sbca_ex(); break;
- case 0xc3: cpx_ex(); break;
- case 0xc4: anda_ex(); break;
- case 0xc5: bita_ex(); break;
- case 0xc6: lda_ex(); break;
- case 0xc7: sta_ex(); break;
- case 0xc8: eora_ex(); break;
- case 0xc9: adca_ex(); break;
- case 0xca: ora_ex(); break;
- case 0xcb: adda_ex(); break;
- case 0xcc: jmp_ex(); break;
- case 0xcd: jsr_ex(); break;
- case 0xce: ldx_ex(); break;
- case 0xcf: stx_ex(); break;
- case 0xd0: suba_ix2(); break;
- case 0xd1: cmpa_ix2(); break;
- case 0xd2: sbca_ix2(); break;
- case 0xd3: cpx_ix2(); break;
- case 0xd4: anda_ix2(); break;
- case 0xd5: bita_ix2(); break;
- case 0xd6: lda_ix2(); break;
- case 0xd7: sta_ix2(); break;
- case 0xd8: eora_ix2(); break;
- case 0xd9: adca_ix2(); break;
- case 0xda: ora_ix2(); break;
- case 0xdb: adda_ix2(); break;
- case 0xdc: jmp_ix2(); break;
- case 0xdd: jsr_ix2(); break;
- case 0xde: ldx_ix2(); break;
- case 0xdf: stx_ix2(); break;
- case 0xe0: suba_ix1(); break;
- case 0xe1: cmpa_ix1(); break;
- case 0xe2: sbca_ix1(); break;
- case 0xe3: cpx_ix1(); break;
- case 0xe4: anda_ix1(); break;
- case 0xe5: bita_ix1(); break;
- case 0xe6: lda_ix1(); break;
- case 0xe7: sta_ix1(); break;
- case 0xe8: eora_ix1(); break;
- case 0xe9: adca_ix1(); break;
- case 0xea: ora_ix1(); break;
- case 0xeb: adda_ix1(); break;
- case 0xec: jmp_ix1(); break;
- case 0xed: jsr_ix1(); break;
- case 0xee: ldx_ix1(); break;
- case 0xef: stx_ix1(); break;
- case 0xf0: suba_ix(); break;
- case 0xf1: cmpa_ix(); break;
- case 0xf2: sbca_ix(); break;
- case 0xf3: cpx_ix(); break;
- case 0xf4: anda_ix(); break;
- case 0xf5: bita_ix(); break;
- case 0xf6: lda_ix(); break;
- case 0xf7: sta_ix(); break;
- case 0xf8: eora_ix(); break;
- case 0xf9: adca_ix(); break;
- case 0xfa: ora_ix(); break;
- case 0xfb: adda_ix(); break;
- case 0xfc: jmp_ix(); break;
- case 0xfd: jsr_ix(); break;
- case 0xfe: ldx_ix(); break;
- case 0xff: stx_ix(); break;
+ m_pending_interrupts |= 1 << M6805_IRQ_LINE;
}
- m_icount -= m_cycles1[ireg];
- burn_cycles(m_cycles1[ireg]);
}
- while (m_icount > 0);
+}
+
+
+m6805_device::m6805_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : m6805_base_device(
+ mconfig,
+ tag,
+ owner,
+ clock,
+ M6805,
+ "M6805",
+ { s_hmos_ops, s_hmos_cycles, 12, 0x007f, 0x0060, 0xfffc },
+ "m6805",
+ __FILE__)
+{
}
/****************************************************************************
* M68HC05EG section
****************************************************************************/
+m68hc05eg_device::m68hc05eg_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : m6805_base_device(
+ mconfig,
+ tag,
+ owner,
+ clock,
+ M68HC05EG,
+ "M68HC05EG",
+ { s_hmos_ops, s_hmos_cycles, 13, 0x00ff, 0x00c0, 0xfffc }, // completely wrong, but it preserves existing behaviour
+ "m68hc05eg",
+ __FILE__)
+{
+}
+
void m68hc05eg_device::device_reset()
{
m6805_base_device::device_reset();
- m_sp_mask = 0xff;
- m_sp_low = 0xc0;
-
- RM16(0x1ffe, &m_pc);
+ rm16(0x1ffe, m_pc);
}
void m68hc05eg_device::execute_set_input(int inputnum, int state)
@@ -797,19 +597,49 @@ void m68hc05eg_device::execute_set_input(int inputnum, int state)
}
}
+void m68hc05eg_device::interrupt_vector()
+{
+ if ((m_pending_interrupts & (1 << M68HC05EG_INT_IRQ)) != 0)
+ {
+ m_pending_interrupts &= ~(1 << M68HC05EG_INT_IRQ);
+ rm16(0x1ffa, m_pc);
+ }
+ else if((m_pending_interrupts & (1 << M68HC05EG_INT_TIMER)) != 0)
+ {
+ m_pending_interrupts &= ~(1 << M68HC05EG_INT_TIMER);
+ rm16(0x1ff8, m_pc);
+ }
+ else if((m_pending_interrupts & (1 << M68HC05EG_INT_CPI)) != 0)
+ {
+ m_pending_interrupts &= ~(1 << M68HC05EG_INT_CPI);
+ rm16(0x1ff6, m_pc);
+ }
+}
+
/****************************************************************************
* HD63705 section
****************************************************************************/
+hd63705_device::hd63705_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : m6805_base_device(mconfig,
+ tag,
+ owner,
+ clock,
+ HD63705,
+ "HD63705",
+ { s_hmos_ops, s_hmos_cycles, 16, 0x017f, 0x0100, 0x1ffa },
+ "hd63705",
+ __FILE__)
+{
+}
+
void hd63705_device::device_reset()
{
m6805_base_device::device_reset();
- m_sp_mask = 0x17f;
- m_sp_low = 0x100;
m_s.w.l = SP_MASK;
- RM16(0x1ffe, &m_pc);
+ rm16(0x1ffe, m_pc);
}
void hd63705_device::execute_set_input(int inputnum, int state)
@@ -840,6 +670,54 @@ void hd63705_device::execute_set_input(int inputnum, int state)
}
}
+void hd63705_device::interrupt_vector()
+{
+ /* Need to add emulation of other interrupt sources here KW-2/4/99 */
+ /* This is just a quick patch for Namco System 2 operation */
+
+ if ((m_pending_interrupts & (1 << HD63705_INT_IRQ1)) != 0)
+ {
+ m_pending_interrupts &= ~(1 << HD63705_INT_IRQ1);
+ rm16(0x1ff8, m_pc);
+ }
+ else if ((m_pending_interrupts & (1 << HD63705_INT_IRQ2)) != 0)
+ {
+ m_pending_interrupts &= ~(1 << HD63705_INT_IRQ2);
+ rm16(0x1fec, m_pc);
+ }
+ else if ((m_pending_interrupts & (1 << HD63705_INT_ADCONV)) != 0)
+ {
+ m_pending_interrupts &= ~(1 << HD63705_INT_ADCONV);
+ rm16(0x1fea, m_pc);
+ }
+ else if ((m_pending_interrupts & (1 << HD63705_INT_TIMER1)) != 0)
+ {
+ m_pending_interrupts &= ~(1 << HD63705_INT_TIMER1);
+ rm16(0x1ff6, m_pc);
+ }
+ else if ((m_pending_interrupts & (1 << HD63705_INT_TIMER2)) != 0)
+ {
+ m_pending_interrupts &= ~(1 << HD63705_INT_TIMER2);
+ rm16(0x1ff4, m_pc);
+ }
+ else if ((m_pending_interrupts & (1 << HD63705_INT_TIMER3)) != 0)
+ {
+ m_pending_interrupts &= ~(1<<HD63705_INT_TIMER3);
+ rm16(0x1ff2, m_pc);
+ }
+ else if ((m_pending_interrupts & (1 << HD63705_INT_PCI)) != 0)
+ {
+ m_pending_interrupts &= ~(1 << HD63705_INT_PCI);
+ rm16(0x1ff0, m_pc);
+ }
+ else if ((m_pending_interrupts & (1 << HD63705_INT_SCI)) != 0)
+ {
+ m_pending_interrupts &= ~(1 << HD63705_INT_SCI);
+ rm16(0x1fee, m_pc);
+ }
+}
+
+
const device_type M6805 = &device_creator<m6805_device>;
const device_type M68HC05EG = &device_creator<m68hc05eg_device>;
const device_type HD63705 = &device_creator<hd63705_device>;
diff --git a/src/devices/cpu/m6805/m6805.h b/src/devices/cpu/m6805/m6805.h
index 5d0dfede083..3aa8e08bc99 100644
--- a/src/devices/cpu/m6805/m6805.h
+++ b/src/devices/cpu/m6805/m6805.h
@@ -21,12 +21,92 @@ extern const device_type HD63705;
// Used by core CPU interface
class m6805_base_device : public cpu_device
{
-public:
- // construction/destruction
- m6805_base_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, const device_type type, const char *name, uint32_t addr_width, const char *shortname, const char *source);
-
protected:
- m6805_base_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, const device_type type, const char *name, uint32_t addr_width, address_map_delegate internal_map, const char *shortname, const char *source);
+ // addressing mode selector for opcode handler templates
+ enum class addr_mode { IM, DI, EX, IX, IX1, IX2 };
+
+ // state index constants
+ enum
+ {
+ M6805_PC = 1,
+ M6805_S,
+ M6805_CC,
+ M6805_A,
+ M6805_X,
+ M6805_IRQ_STATE
+ };
+
+ // CC masks H INZC
+ // 7654 3210
+ enum
+ {
+ CFLAG = 0x01,
+ ZFLAG = 0x02,
+ NFLAG = 0x04,
+ IFLAG = 0x08,
+ HFLAG = 0x10
+ };
+
+ typedef void (m6805_base_device::*op_handler_func)();
+ typedef op_handler_func const op_handler_table[256];
+ typedef u8 const cycle_count_table[256];
+
+ struct configuration_params
+ {
+ configuration_params(
+ op_handler_table &ops,
+ cycle_count_table &cycles,
+ u32 addr_width,
+ u32 sp_mask,
+ u32 sp_floor,
+ u16 swi_vector)
+ : m_ops(ops)
+ , m_cycles(cycles)
+ , m_addr_width(addr_width)
+ , m_sp_mask(sp_mask)
+ , m_sp_floor(sp_floor)
+ , m_swi_vector(swi_vector)
+ {
+ }
+
+ op_handler_table &m_ops;
+ cycle_count_table &m_cycles;
+ u32 m_addr_width;
+ u32 m_sp_mask;
+ u32 m_sp_floor;
+ u16 m_swi_vector;
+ };
+
+ // opcode tables
+ static op_handler_table s_hmos_ops;
+ static op_handler_table s_cmos_ops;
+ static op_handler_table s_hc_ops;
+ static cycle_count_table s_hmos_cycles;
+ static cycle_count_table s_cmos_cycles;
+ static cycle_count_table s_hc_cycles;
+
+ // construction/destruction
+ m6805_base_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock,
+ device_type const type,
+ char const *name,
+ configuration_params const &params,
+ char const *shortname,
+ char const *source);
+ m6805_base_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock,
+ device_type const type,
+ char const *name,
+ configuration_params const &params,
+ address_map_delegate internal_map,
+ char const *shortname,
+ char const *source);
// device-level overrides
virtual void device_start() override;
@@ -55,65 +135,70 @@ protected:
// for devices with timing-sensitive peripherals
virtual void burn_cycles(unsigned count) { }
-private:
- // opcode/condition tables
- static const uint8_t m_flags8i[256];
- static const uint8_t m_flags8d[256];
- static const uint8_t m_cycles1[256];
-
-protected:
- enum
- {
- M6805_PC = 1,
- M6805_S,
- M6805_CC,
- M6805_A,
- M6805_X,
- M6805_IRQ_STATE
- };
-
- void rd_s_handler_b(uint8_t *b);
- void rd_s_handler_w(PAIR *p);
- void wr_s_handler_b(uint8_t *b);
- void wr_s_handler_w(PAIR *p);
- void RM16(uint32_t addr, PAIR *p);
-
- void brset(uint8_t bit);
- void brclr(uint8_t bit);
- void bset(uint8_t bit);
- void bclr(uint8_t bit);
-
- void bra();
- void brn();
- void bhi();
- void bls();
- void bcc();
- void bcs();
- void bne();
- void beq();
- void bhcc();
- void bhcs();
- void bpl();
- void bmi();
- void bmc();
- void bms();
+ void clr_nz() { m_cc &= ~(NFLAG | ZFLAG); }
+ void clr_nzc() { m_cc &= ~(NFLAG | ZFLAG | CFLAG); }
+ void clr_hc() { m_cc &= ~(HFLAG | CFLAG); }
+ void clr_hnzc() { m_cc &= ~(HFLAG | NFLAG | ZFLAG | CFLAG); }
+
+ // macros for CC -- CC bits affected should be reset before calling
+ void set_z8(u8 a) { if (!a) m_cc |= ZFLAG; }
+ void set_n8(u8 a) { m_cc |= (a & 0x80) >> 5; }
+ void set_h(u8 a, u8 b, u8 r) { m_cc |= (a ^ b ^ r) & 0x10; }
+ void set_c8(u16 a) { m_cc |= BIT(a, 8); }
+
+ // combos
+ void set_nz8(u8 a) { set_n8(a); set_z8(a); }
+ void set_nzc8(u16 a) { set_nz8(a); set_c8(a); }
+ void set_hnzc8(u8 a, u8 b, u16 r) { set_h(a, b, r); set_nzc8(r); }
+
+ unsigned rdmem(u32 addr) { return unsigned(m_program->read_byte(addr)); }
+ void wrmem(u32 addr, u8 value) { m_program->write_byte(addr, value); }
+ unsigned rdop(u32 addr) { return unsigned(m_direct->read_byte(addr)); }
+ unsigned rdop_arg(u32 addr) { return unsigned(m_direct->read_byte(addr)); }
+
+ unsigned rm(u32 addr) { return rdmem(addr); }
+ void rm16(u32 addr, PAIR &p);
+ void wm(u32 addr, u8 value) { wrmem(addr, value); }
+
+ void pushbyte(u8 b);
+ void pushword(PAIR const &p);
+ void pullbyte(u8 &b);
+ void pullword(PAIR &p);
+
+ template <typename T> void immbyte(T &b);
+ void immword(PAIR &w);
+ void skipbyte();
+
+ template <unsigned B> void brset();
+ template <unsigned B> void brclr();
+ template <unsigned B> void bset();
+ template <unsigned B> void bclr();
+
+ template <bool C> void bra();
+ template <bool C> void bhi();
+ template <bool C> void bcc();
+ template <bool C> void bne();
+ template <bool C> void bhcc();
+ template <bool C> void bpl();
+ template <bool C> void bmc();
virtual void bil();
virtual void bih();
void bsr();
- void neg_di();
- void com_di();
- void lsr_di();
- void ror_di();
- void asr_di();
- void lsl_di();
- void rol_di();
- void dec_di();
- void inc_di();
- void tst_di();
- void clr_di();
+ template <addr_mode M> void neg();
+ template <addr_mode M> void com();
+ template <addr_mode M> void lsr();
+ template <addr_mode M> void ror();
+ template <addr_mode M> void asr();
+ template <addr_mode M> void lsl();
+ template <addr_mode M> void rol();
+ template <addr_mode M> void dec();
+ template <addr_mode M> void inc();
+ template <addr_mode M> void tst();
+ template <addr_mode M> void clr();
void nega();
+ void mul();
void coma();
void lsra();
void rora();
@@ -130,162 +215,65 @@ protected:
void lsrx();
void rorx();
void asrx();
- void aslx();
-// void lslx();
+ void lslx();
void rolx();
void decx();
void incx();
void tstx();
void clrx();
- void neg_ix1();
- void com_ix1();
- void lsr_ix1();
- void ror_ix1();
- void asr_ix1();
- void lsl_ix1();
- void rol_ix1();
- void dec_ix1();
- void inc_ix1();
- void tst_ix1();
- void clr_ix1();
-
- void neg_ix();
- void com_ix();
- void lsr_ix();
- void ror_ix();
- void asr_ix();
- void lsl_ix();
- void rol_ix();
- void dec_ix();
- void inc_ix();
- void tst_ix();
- void clr_ix();
-
void rti();
void rts();
- virtual void swi();
+ void swi();
+ void stop();
+ void wait();
void tax();
void txa();
+ void clc();
+ void sec();
+ void cli();
+ void sei();
+
void rsp();
void nop();
- void suba_im();
- void cmpa_im();
- void sbca_im();
- void cpx_im();
- void anda_im();
- void bita_im();
- void lda_im();
- void eora_im();
- void adca_im();
- void ora_im();
- void adda_im();
-
- void ldx_im();
- void suba_di();
- void cmpa_di();
- void sbca_di();
- void cpx_di();
- void anda_di();
- void bita_di();
- void lda_di();
- void sta_di();
- void eora_di();
- void adca_di();
- void ora_di();
- void adda_di();
- void jmp_di();
- void jsr_di();
- void ldx_di();
- void stx_di();
- void suba_ex();
- void cmpa_ex();
- void sbca_ex();
- void cpx_ex();
- void anda_ex();
- void bita_ex();
- void lda_ex();
- void sta_ex();
- void eora_ex();
- void adca_ex();
- void ora_ex();
- void adda_ex();
- void jmp_ex();
- void jsr_ex();
- void ldx_ex();
- void stx_ex();
- void suba_ix2();
- void cmpa_ix2();
- void sbca_ix2();
- void cpx_ix2();
- void anda_ix2();
- void bita_ix2();
- void lda_ix2();
- void sta_ix2();
- void eora_ix2();
- void adca_ix2();
- void ora_ix2();
- void adda_ix2();
- void jmp_ix2();
- void jsr_ix2();
- void ldx_ix2();
- void stx_ix2();
- void suba_ix1();
- void cmpa_ix1();
- void sbca_ix1();
- void cpx_ix1();
- void anda_ix1();
- void bita_ix1();
- void lda_ix1();
- void sta_ix1();
- void eora_ix1();
- void adca_ix1();
- void ora_ix1();
- void adda_ix1();
- void jmp_ix1();
- void jsr_ix1();
- void ldx_ix1();
- void stx_ix1();
- void suba_ix();
- void cmpa_ix();
- void sbca_ix();
- void cpx_ix();
- void anda_ix();
- void bita_ix();
- void lda_ix();
- void sta_ix();
- void eora_ix();
- void adca_ix();
- void ora_ix();
- void adda_ix();
- void jmp_ix();
- void jsr_ix();
- void ldx_ix();
- void stx_ix();
+ template <addr_mode M> void suba();
+ template <addr_mode M> void cmpa();
+ template <addr_mode M> void sbca();
+ template <addr_mode M> void cpx();
+ template <addr_mode M> void anda();
+ template <addr_mode M> void bita();
+ template <addr_mode M> void lda();
+ template <addr_mode M> void sta();
+ template <addr_mode M> void eora();
+ template <addr_mode M> void adca();
+ template <addr_mode M> void ora();
+ template <addr_mode M> void adda();
+ template <addr_mode M> void jmp();
+ template <addr_mode M> void jsr();
+ template <addr_mode M> void ldx();
+ template <addr_mode M> void stx();
void illegal();
virtual void interrupt();
virtual void interrupt_vector();
- const char *m_tag;
+ configuration_params const m_params;
// address spaces
- const address_space_config m_program_config;
+ address_space_config const m_program_config;
// CPU registers
- PAIR m_ea; /* effective address */
+ PAIR m_ea; // effective address (should really be a temporary in opcode handlers)
- uint32_t m_sp_mask; /* Stack pointer address mask */
- uint32_t m_sp_low; /* Stack pointer low water mark (or floor) */
- PAIR m_pc; /* Program counter */
- PAIR m_s; /* Stack pointer */
- uint8_t m_a; /* Accumulator */
- uint8_t m_x; /* Index register */
- uint8_t m_cc; /* Condition codes */
+ PAIR m_pc; // Program counter
+ PAIR m_s; // Stack pointer
+ u8 m_a; // Accumulator
+ u8 m_x; // Index register
+ u8 m_cc; // Condition codes
uint16_t m_pending_interrupts; /* MB */
@@ -307,8 +295,7 @@ class m6805_device : public m6805_base_device
{
public:
// construction/destruction
- m6805_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : m6805_base_device(mconfig, tag, owner, clock, M6805, "M6805", 12, "m6805", __FILE__) { }
+ m6805_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
virtual void execute_set_input(int inputnum, int state) override;
@@ -321,8 +308,7 @@ class m68hc05eg_device : public m6805_base_device
{
public:
// construction/destruction
- m68hc05eg_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : m6805_base_device(mconfig, tag, owner, clock, M68HC05EG, "M68HC05EG", 13, "m68hc05eg", __FILE__) { }
+ m68hc05eg_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
// device-level overrides
@@ -339,8 +325,7 @@ class hd63705_device : public m6805_base_device
{
public:
// construction/destruction
- hd63705_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : m6805_base_device(mconfig, tag, owner, clock, HD63705, "HD63705", 16, "hd63705", __FILE__) { }
+ hd63705_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
// device-level overrides
@@ -353,7 +338,6 @@ protected:
// opcodes
virtual void bil() override;
virtual void bih() override;
- virtual void swi() override;
};
#define M6805_IRQ_LINE 0
@@ -393,5 +377,7 @@ protected:
#define HD63705_INT_NMI 0x08
CPU_DISASSEMBLE( m6805 );
+CPU_DISASSEMBLE( m146805 );
+CPU_DISASSEMBLE( m68hc05 );
#endif // MAME_CPU_M6805_M6805_H
diff --git a/src/devices/cpu/m6805/m6805defs.h b/src/devices/cpu/m6805/m6805defs.h
index 2fc83194500..670beda2683 100644
--- a/src/devices/cpu/m6805/m6805defs.h
+++ b/src/devices/cpu/m6805/m6805defs.h
@@ -5,101 +5,72 @@
#pragma once
-/****************************************************************************/
-/* Read a byte from given memory location */
-/****************************************************************************/
-#define M6805_RDMEM(addr) ((unsigned)m_program->read_byte(addr))
-
-/****************************************************************************/
-/* Write a byte to given memory location */
-/****************************************************************************/
-#define M6805_WRMEM(addr, value) (m_program->write_byte(addr, value))
-
-/****************************************************************************/
-/* M6805_RDOP() is identical to M6805_RDMEM() except it is used for reading */
-/* opcodes. In case of system with memory mapped I/O, this function can be */
-/* used to greatly speed up emulation */
-/****************************************************************************/
-#define M6805_RDOP(addr) ((unsigned)m_direct->read_byte(addr))
-
-/****************************************************************************/
-/* M6805_RDOP_ARG() is identical to M6805_RDOP() but it's used for reading */
-/* opcode arguments. This difference can be used to support systems that */
-/* use different encoding mechanisms for opcodes and opcode arguments */
-/****************************************************************************/
-#define M6805_RDOP_ARG(addr) ((unsigned)m_direct->read_byte(addr))
-
-#define SP_MASK m_sp_mask /* stack pointer mask */
-#define SP_LOW m_sp_low /* stack pointer low water mark */
-#define PC m_pc.w.l /* program counter lower word */
-#define S m_s.w.l /* stack pointer lower word */
-#define A m_a /* accumulator */
-#define X m_x /* index register */
-#define CC m_cc /* condition codes */
-
-#define EAD m_ea.d
-#define EA m_ea.w.l
-
-
-/* DS -- THESE ARE RE-DEFINED IN m6805.h TO RAM, ROM or FUNCTIONS IN cpuintrf.c */
-#define RM(addr) M6805_RDMEM(addr)
-#define WM(addr, value) M6805_WRMEM(addr, value)
-#define M_RDOP(addr) M6805_RDOP(addr)
-#define M_RDOP_ARG(addr) M6805_RDOP_ARG(addr)
+#define SP_MASK m_params.m_sp_mask // stack pointer mask
+#define SP_LOW m_params.m_sp_floor // stack pointer low water mark
+#define PC m_pc.w.l // program counter lower word
+#define S m_s.w.l // stack pointer lower word
+#define A m_a // accumulator
+#define X m_x // index register
+#define CC m_cc // condition codes
+
+#define EAD m_ea.d
+#define EA m_ea.w.l
+
+// pre-clear a PAIR union; clearing h2 and h3 only might be faster?
+inline void clear_pair(PAIR &p) { p.d = 0; }
/* macros to tweak the PC and SP */
-#define SP_INC if( ++S > SP_MASK) S = SP_LOW
-#define SP_DEC if( --S < SP_LOW) S = SP_MASK
-#define SP_ADJUST(s) ( ( (s) & SP_MASK ) | SP_LOW )
+#define SP_INC if (++S > SP_MASK) S = SP_LOW
+#define SP_DEC if (--S < SP_LOW) S = SP_MASK
+#define SP_ADJUST(s) (((s) & SP_MASK) | SP_LOW)
+
+inline void m6805_base_device::rm16(u32 addr, PAIR &p)
+{
+ clear_pair(p);
+ p.b.h = rm(addr);
+ p.b.l = rm(addr + 1);
+}
+
+inline void m6805_base_device::pushbyte(u8 b)
+{
+ wm(S, b);
+ SP_DEC;
+}
+
+inline void m6805_base_device::pushword(PAIR const &p)
+{
+ pushbyte(p.b.l);
+ pushbyte(p.b.h);
+}
+
+inline void m6805_base_device::pullbyte(u8 &b)
+{
+ SP_INC;
+ b = rm(S);
+}
+
+inline void m6805_base_device::pullword(PAIR &p)
+{
+ clear_pair(p);
+ pullbyte(p.b.h);
+ pullbyte(p.b.l);
+}
/* macros to access memory */
-#define IMMBYTE(b) {b = M_RDOP_ARG(PC++);}
-#define IMMWORD(w) {w.d = 0; w.b.h = M_RDOP_ARG(PC); w.b.l = M_RDOP_ARG(PC+1); PC+=2;}
-#define SKIPBYTE() {M_RDOP_ARG(PC++);}
-
-#define PUSHBYTE(b) wr_s_handler_b(&b)
-#define PUSHWORD(w) wr_s_handler_w(&w)
-#define PULLBYTE(b) rd_s_handler_b(&b)
-#define PULLWORD(w) rd_s_handler_w(&w)
-
-/* CC masks H INZC
- 7654 3210 */
-#define CFLAG 0x01
-#define ZFLAG 0x02
-#define NFLAG 0x04
-#define IFLAG 0x08
-#define HFLAG 0x10
-
-#define CLR_NZ CC&=~(NFLAG|ZFLAG)
-#define CLR_HNZC CC&=~(HFLAG|NFLAG|ZFLAG|CFLAG)
-#define CLR_Z CC&=~(ZFLAG)
-#define CLR_NZC CC&=~(NFLAG|ZFLAG|CFLAG)
-#define CLR_ZC CC&=~(ZFLAG|CFLAG)
-
-/* macros for CC -- CC bits affected should be reset before calling */
-#define SET_Z(a) if(!a)SEZ
-#define SET_Z8(a) SET_Z((uint8_t)a)
-#define SET_N8(a) CC|=((a&0x80)>>5)
-#define SET_H(a,b,r) CC|=((a^b^r)&0x10)
-#define SET_C8(a) CC|=((a&0x100)>>8)
-
-#define SET_FLAGS8I(a) {CC |= m_flags8i[(a) & 0xff];}
-#define SET_FLAGS8D(a) {CC |= m_flags8d[(a) & 0xff];}
-
-/* combos */
-#define SET_NZ8(a) {SET_N8(a); SET_Z(a);}
-#define SET_FLAGS8(a,b,r) {SET_N8(r); SET_Z8(r); SET_C8(r);}
+template <typename T> inline void m6805_base_device::immbyte(T &b) { b = rdop_arg(PC++); }
+inline void m6805_base_device::immword(PAIR &w) { w.d = 0; immbyte(w.b.h); immbyte(w.b.l); }
+inline void m6805_base_device::skipbyte() { rdop_arg(PC++); }
/* for treating an unsigned uint8_t as a signed int16_t */
-#define SIGNED(b) ((int16_t)(b & 0x80 ? b | 0xff00 : b))
+#define SIGNED(b) (int16_t(b & 0x80 ? b | 0xff00 : b))
/* Macros for addressing modes */
-#define DIRECT EAD=0; IMMBYTE(m_ea.b.l)
-#define IMM8 EA = PC++
-#define EXTENDED IMMWORD(m_ea)
-#define INDEXED EA = X
-#define INDEXED1 {EAD = 0; IMMBYTE(m_ea.b.l); EA += X;}
-#define INDEXED2 {IMMWORD(m_ea); EA += X;}
+#define DIRECT do { EAD=0; immbyte(m_ea.b.l); } while (false)
+#define IMM8 do { EA = PC++; } while (false)
+#define EXTENDED immword(m_ea)
+#define INDEXED do { EA = X; } while (false)
+#define INDEXED1 do { EAD = 0; immbyte(m_ea.b.l); EA += X; } while (false)
+#define INDEXED2 do { immword(m_ea); EA += X;} while (false)
/* macros to set status flags */
#if defined(SEC)
@@ -117,16 +88,53 @@
#define CLI CC &=~ IFLAG
/* macros for convenience */
-#define DIRBYTE(b) {DIRECT; b = RM(EAD);}
-#define EXTBYTE(b) {EXTENDED; b = RM(EAD);}
-#define IDXBYTE(b) {INDEXED; b = RM(EAD);}
-#define IDX1BYTE(b) {INDEXED1; b = RM(EAD);}
-#define IDX2BYTE(b) {INDEXED2; b = RM(EAD);}
+#define ARGADDR \
+ do { switch (M) { \
+ case addr_mode::IM: static_assert(addr_mode::IM != M, "invalid mode for this instruction"); break; \
+ case addr_mode::DI: DIRECT; break; \
+ case addr_mode::EX: EXTENDED; break; \
+ case addr_mode::IX: INDEXED; break; \
+ case addr_mode::IX1: INDEXED1; break; \
+ case addr_mode::IX2: INDEXED2; break; \
+ } } while (false)
+#define DIRBYTE(b) do { DIRECT; b = rm(EAD); } while (false)
+#define EXTBYTE(b) do { EXTENDED; b = rm(EAD); } while (false)
+#define IDXBYTE(b) do { INDEXED; b = rm(EAD); } while (false)
+#define IDX1BYTE(b) do { INDEXED1; b = rm(EAD); } while (false)
+#define IDX2BYTE(b) do { INDEXED2; b = rm(EAD); } while (false)
+#define ARGBYTE(b) \
+ do { switch (M) { \
+ case addr_mode::IM: immbyte(b); break; \
+ case addr_mode::DI: DIRBYTE(b); break; \
+ case addr_mode::EX: EXTBYTE(b); break; \
+ case addr_mode::IX: IDXBYTE(b); break; \
+ case addr_mode::IX1: IDX1BYTE(b); break; \
+ case addr_mode::IX2: IDX2BYTE(b); break; \
+ default: b = 0; break; \
+ } } while (false)
+
/* Macros for branch instructions */
-#define BRANCH(f) { uint8_t t; IMMBYTE(t); if(f) { PC += SIGNED(t); } }
+#define BRANCH(f) do { u8 t; immbyte(t); if (bool(f) == bool(C)) PC += SIGNED(t); } while (false)
-/* pre-clear a PAIR union; clearing h2 and h3 only might be faster? */
-#define CLEAR_PAIR(p) p->d = 0
+offs_t CPU_DISASSEMBLE_NAME(m146805)(
+ cpu_device *device,
+ std::ostream &stream,
+ offs_t pc,
+ const u8 *oprom,
+ const u8 *opram,
+ int options,
+ std::pair<u16, char const *> const symbols[],
+ std::size_t symbol_count);
+
+offs_t CPU_DISASSEMBLE_NAME(m68hc05)(
+ cpu_device *device,
+ std::ostream &stream,
+ offs_t pc,
+ const u8 *oprom,
+ const u8 *opram,
+ int options,
+ std::pair<u16, char const *> const symbols[],
+ std::size_t symbol_count);
offs_t CPU_DISASSEMBLE_NAME(m6805)(
cpu_device *device,
@@ -151,4 +159,30 @@ inline offs_t CPU_DISASSEMBLE_NAME(m6805)(
return CPU_DISASSEMBLE_NAME(m6805)(device, stream, pc, oprom, opram, options, symbols, N);
}
+template <size_t N>
+inline offs_t CPU_DISASSEMBLE_NAME(m146805)(
+ cpu_device *device,
+ std::ostream &stream,
+ offs_t pc,
+ const u8 *oprom,
+ const u8 *opram,
+ int options,
+ std::pair<u16, char const *> const (&symbols)[N])
+{
+ return CPU_DISASSEMBLE_NAME(m146805)(device, stream, pc, oprom, opram, options, symbols, N);
+}
+
+template <size_t N>
+inline offs_t CPU_DISASSEMBLE_NAME(m68hc05)(
+ cpu_device *device,
+ std::ostream &stream,
+ offs_t pc,
+ const u8 *oprom,
+ const u8 *opram,
+ int options,
+ std::pair<u16, char const *> const (&symbols)[N])
+{
+ return CPU_DISASSEMBLE_NAME(m68hc05)(device, stream, pc, oprom, opram, options, symbols, N);
+}
+
#endif // MAME_CPU_M6805_M6805DEFS_H
diff --git a/src/devices/cpu/m6805/m68705.cpp b/src/devices/cpu/m6805/m68705.cpp
index b678954e386..bcb2d1a858b 100644
--- a/src/devices/cpu/m6805/m68705.cpp
+++ b/src/devices/cpu/m6805/m68705.cpp
@@ -1,7 +1,29 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
#include "emu.h"
#include "m68705.h"
#include "m6805defs.h"
+/****************************************************************************
+ * Configurable logging
+ ****************************************************************************/
+
+#define LOG_GENERAL (1U << 0)
+#define LOG_INT (1U << 1)
+#define LOG_IOPORT (1U << 2)
+#define LOG_TIMER (1U << 3)
+#define LOG_EPROM (1U << 4)
+
+//#define VERBOSE (LOG_GENERAL | LOG_IOPORT | LOG_TIMER | LOG_EPROM)
+//#define LOG_OUTPUT_FUNC printf
+#include "logmacro.h"
+
+#define LOGINT(...) LOGMASKED(LOG_INT, __VA_ARGS__)
+#define LOGIOPORT(...) LOGMASKED(LOG_IOPORT, __VA_ARGS__)
+#define LOGTIMER(...) LOGMASKED(LOG_TIMER, __VA_ARGS__)
+#define LOGEPROM(...) LOGMASKED(LOG_EPROM, __VA_ARGS__)
+
+
namespace {
std::pair<u16, char const *> const m68705p_syms[] = {
@@ -41,7 +63,7 @@ ROM_END
ROM_START( m68705r3 )
ROM_REGION(0x0078, "bootstrap", 0)
- ROM_LOAD("bootstrap.bin", 0x0000, 0x0078, CRC(5946479b) SHA1(834ea00aef5de12dbcd6421a6e21d5ea96cfbf37) BAD_DUMP)
+ ROM_LOAD("bootstrap.bin", 0x0000, 0x0078, CRC(5946479b) SHA1(834ea00aef5de12dbcd6421a6e21d5ea96cfbf37))
ROM_END
ROM_START( m68705u3 )
@@ -49,90 +71,30 @@ ROM_START( m68705u3 )
ROM_LOAD("bootstrap.bin", 0x0000, 0x0078, CRC(5946479b) SHA1(834ea00aef5de12dbcd6421a6e21d5ea96cfbf37))
ROM_END
-} // anonymous namespace
+constexpr u16 M68705_VECTOR_BOOTSTRAP = 0xfff6;
+constexpr u16 M68705_VECTOR_TIMER = 0xfff8;
+//constexpr u16 M68705_VECTOR_INT2 = 0xfff8;
+constexpr u16 M68705_VECTOR_INT = 0xfffa;
+constexpr u16 M68705_VECTOR_SWI = 0xfffc;
+constexpr u16 M68705_VECTOR_RESET = 0xfffe;
+constexpr u16 M68705_INT_MASK = 0x03;
-device_type const M68705 = &device_creator<m68705_device>;
-device_type const M68705P3 = &device_creator<m68705p3_device>;
-device_type const M68705P5 = &device_creator<m68705p5_device>;
-device_type const M68705R3 = &device_creator<m68705r3_device>;
-device_type const M68705U3 = &device_creator<m68705u3_device>;
+} // anonymous namespace
/****************************************************************************
- * M68705 device (no peripherals)
+ * Global variables
****************************************************************************/
-m68705_device::m68705_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock)
- : m6805_base_device(mconfig, tag, owner, clock, M68705, "M68705", 12, "m68705", __FILE__)
-{
-}
-
-m68705_device::m68705_device(
- machine_config const &mconfig,
- char const *tag,
- device_t *owner,
- u32 clock,
- device_type type,
- char const *name,
- u32 addr_width,
- address_map_delegate internal_map,
- char const *shortname,
- char const *source)
- : m6805_base_device(mconfig, tag, owner, clock, type, name, addr_width, internal_map, shortname, source)
-{
-}
-
-/* Generate interrupt - m68705 version */
-void m68705_device::interrupt()
-{
- if ((m_pending_interrupts & ((1 << M6805_IRQ_LINE) | M68705_INT_MASK)) != 0 )
- {
- if ((CC & IFLAG) == 0)
- {
- PUSHWORD(m_pc);
- PUSHBYTE(m_x);
- PUSHBYTE(m_a);
- PUSHBYTE(m_cc);
- SEI;
- standard_irq_callback(0);
-
- if ((m_pending_interrupts & (1 << M68705_IRQ_LINE)) != 0 )
- {
- m_pending_interrupts &= ~(1 << M68705_IRQ_LINE);
- RM16(0xfffa, &m_pc);
- }
- else if ((m_pending_interrupts & (1 << M68705_INT_TIMER)) != 0)
- {
- m_pending_interrupts &= ~(1 << M68705_INT_TIMER);
- RM16(0xfff8, &m_pc);
- }
- }
- m_icount -= 11;
- }
-}
-
-void m68705_device::device_reset()
-{
- m6805_base_device::device_reset();
-
- RM16(0xfffe, &m_pc);
-}
-
-void m68705_device::execute_set_input(int inputnum, int state)
-{
- if (m_irq_state[inputnum] != state)
- {
- m_irq_state[inputnum] = (state == ASSERT_LINE) ? ASSERT_LINE : CLEAR_LINE;
-
- if (state != CLEAR_LINE)
- m_pending_interrupts |= 1 << inputnum;
- }
-}
+device_type const M68705P3 = &device_creator<m68705p3_device>;
+device_type const M68705P5 = &device_creator<m68705p5_device>;
+device_type const M68705R3 = &device_creator<m68705r3_device>;
+device_type const M68705U3 = &device_creator<m68705u3_device>;
/****************************************************************************
- * M68705 "new" device
+ * M68705 base device
****************************************************************************/
/*
@@ -223,7 +185,7 @@ Ux Parts:
*/
-m68705_new_device::m68705_new_device(
+m68705_device::m68705_device(
machine_config const &mconfig,
char const *tag,
device_t *owner,
@@ -234,7 +196,17 @@ m68705_new_device::m68705_new_device(
address_map_delegate internal_map,
char const *shortname,
char const *source)
- : m68705_device(mconfig, tag, owner, clock, type, name, addr_width, internal_map, shortname, source)
+ : m6805_base_device(
+ mconfig,
+ tag,
+ owner,
+ clock,
+ type,
+ name,
+ { s_hmos_ops, s_hmos_cycles, addr_width, 0x007f, 0x0060, M68705_VECTOR_SWI },
+ internal_map,
+ shortname,
+ source)
, device_nvram_interface(mconfig, *this)
, m_user_rom(*this, DEVICE_SELF, u32(1) << addr_width)
, m_port_open_drain{ false, false, false, false }
@@ -254,14 +226,20 @@ m68705_new_device::m68705_new_device(
{
}
-template <offs_t B> READ8_MEMBER(m68705_new_device::eprom_r)
+template <offs_t B> READ8_MEMBER(m68705_device::eprom_r)
{
+ if (pcr_vpon() && !pcr_ple())
+ LOGEPROM("read EPROM %04X prevented when Vpp high and /PLE = 0\n", B + offset);
+
// read locked out when /VPON and /PLE are asserted
return (!pcr_vpon() || !pcr_ple()) ? m_user_rom[B + offset] : 0xff;
}
-template <offs_t B> WRITE8_MEMBER(m68705_new_device::eprom_w)
+template <offs_t B> WRITE8_MEMBER(m68705_device::eprom_w)
{
+ LOGEPROM("EPROM programming latch write%s%s: %04X = %02\n",
+ !pcr_vpon() ? " [Vpp low]" : "", !pcr_ple() ? " [disabled]" : "", B + offset, data);
+
// programming latch enabled when /VPON and /PLE are asserted
if (pcr_vpon() && pcr_ple())
{
@@ -273,70 +251,85 @@ template <offs_t B> WRITE8_MEMBER(m68705_new_device::eprom_w)
else
{
// this causes undefined behaviour, which is bad when EPROM programming is involved
- logerror("warning: write to EPROM when /PGE = 0 (%x = %x)\n", B + offset, data);
+ logerror("warning: write to EPROM when /PGE = 0 (%04X = %02X)\n", B + offset, data);
}
}
}
-template <std::size_t N> void m68705_new_device::set_port_open_drain(bool value)
+template <std::size_t N> void m68705_device::set_port_open_drain(bool value)
{
m_port_open_drain[N] = value;
}
-template <std::size_t N> void m68705_new_device::set_port_mask(u8 mask)
+template <std::size_t N> void m68705_device::set_port_mask(u8 mask)
{
+ if (configured() || started())
+ throw emu_fatalerror("Attempt to set physical port mask after configuration");
m_port_mask[N] = mask;
}
-template <std::size_t N> READ8_MEMBER(m68705_new_device::port_r)
+template <std::size_t N> READ8_MEMBER(m68705_device::port_r)
{
- if (!m_port_cb_r[N].isnull()) m_port_input[N] = m_port_cb_r[N](space, 0, ~m_port_ddr[N]);
+ if (!m_port_cb_r[N].isnull())
+ {
+ u8 const newval(m_port_cb_r[N](space, 0, ~m_port_ddr[N] & ~m_port_mask[N]) & ~m_port_mask[N]);
+ if (newval != m_port_input[N])
+ {
+ LOGIOPORT("read PORT%c: new input = %02X & %02X (was %02X)\n",
+ char('A' + N), newval, ~m_port_ddr[N] & ~m_port_mask[N], m_port_input[N]);
+ }
+ m_port_input[N] = newval;
+ }
return m_port_mask[N] | (m_port_latch[N] & m_port_ddr[N]) | (m_port_input[N] & ~m_port_ddr[N]);
}
-template <std::size_t N> WRITE8_MEMBER(m68705_new_device::port_latch_w)
+template <std::size_t N> WRITE8_MEMBER(m68705_device::port_latch_w)
{
data &= ~m_port_mask[N];
u8 const diff = m_port_latch[N] ^ data;
+ if (diff)
+ LOGIOPORT("write PORT%c latch: %02X & %02X (was %02X)\n", char('A' + N), data, m_port_ddr[N], m_port_latch[N]);
m_port_latch[N] = data;
if (diff & m_port_ddr[N])
port_cb_w<N>();
}
-template <std::size_t N> WRITE8_MEMBER(m68705_new_device::port_ddr_w)
+template <std::size_t N> WRITE8_MEMBER(m68705_device::port_ddr_w)
{
data &= ~m_port_mask[N];
if (data != m_port_ddr[N])
{
+ LOGIOPORT("write DDR%c: %02X (was %02X)\n", char('A' + N), data, m_port_ddr[N]);
m_port_ddr[N] = data;
port_cb_w<N>();
}
}
-template <std::size_t N> void m68705_new_device::port_cb_w()
+template <std::size_t N> void m68705_device::port_cb_w()
{
u8 const data(m_port_open_drain[N] ? m_port_latch[N] | ~m_port_ddr[N] : m_port_latch[N]);
u8 const mask(m_port_open_drain[N] ? (~m_port_latch[N] & m_port_ddr[N]) : m_port_ddr[N]);
m_port_cb_w[N](space(AS_PROGRAM), 0, data, mask);
}
-READ8_MEMBER(m68705_new_device::tdr_r)
+READ8_MEMBER(m68705_device::tdr_r)
{
return m_tdr;
}
-WRITE8_MEMBER(m68705_new_device::tdr_w)
+WRITE8_MEMBER(m68705_device::tdr_w)
{
+ LOGTIMER("write TDR: %02X * (1 << %u)\n", data, tcr_ps());
m_tdr = data;
}
-READ8_MEMBER(m68705_new_device::tcr_r)
+READ8_MEMBER(m68705_device::tcr_r)
{
// in MOR controlled mode, only TIR, TIM and TOPT are visible
return m_tcr | (tcr_topt() ? 0x37 : 0x00);
}
-WRITE8_MEMBER(m68705_new_device::tcr_w)
+WRITE8_MEMBER(m68705_device::tcr_w)
{
// 7 TIR RW Timer Interrupt Request Status
// 6 TIM RW Timer Interrupt Mask
@@ -363,39 +356,42 @@ WRITE8_MEMBER(m68705_new_device::tcr_w)
if (tcr_topt())
{
- m_tcr = (m_tcr & 0x3f) | (data & 0xc0);
+ LOGTIMER("write TCR: TIR=%u (%s) TIM=%u\n",
+ BIT(data, 7), (tcr_tir() && !BIT(data, 7)) ? "cleared" : "unaffected", BIT(data, 6));
+ m_tcr = (m_tcr & ((data & 0x80) | 0x3f)) | (data & 0x40);
}
else
{
+ LOGTIMER("write TCR: TIR=%u (%s) TIM=%u TIN=%u TIE=%u PSC=%u PS=(1 << %u)\n",
+ BIT(data, 7), (tcr_tir() && !BIT(data, 7)) ? "cleared" : "unaffected", BIT(data, 6),
+ BIT(data, 5), BIT(data, 4),
+ BIT(data, 3), data & 0x07);
if (BIT(data, 3))
m_prescaler = 0;
- m_tcr = (m_tcr & 0x08) | (data & 0xf7);
+ m_tcr = (m_tcr & ((data & 0x80) | 0x08)) | (data & 0x77);
}
- // TODO: this is tied up with /INT2 on R/U devices
- if (tcr_tir() && !tcr_tim())
- set_input_line(M68705_INT_TIMER, ASSERT_LINE);
- else
- set_input_line(M68705_INT_TIMER, CLEAR_LINE);
+ // this is a level-sensitive interrupt (unlike the edge-triggered inputs)
+ execute_set_input(M68705_INT_TIMER, (tcr_tir() && !tcr_tim()) ? ASSERT_LINE : CLEAR_LINE);
}
-READ8_MEMBER(m68705_new_device::misc_r)
+READ8_MEMBER(m68705_device::misc_r)
{
logerror("unsupported read MISC\n");
return 0xff;
}
-WRITE8_MEMBER(m68705_new_device::misc_w)
+WRITE8_MEMBER(m68705_device::misc_w)
{
logerror("unsupported write MISC = %02X\n", data);
}
-READ8_MEMBER(m68705_new_device::pcr_r)
+READ8_MEMBER(m68705_device::pcr_r)
{
return m_pcr;
}
-WRITE8_MEMBER(m68705_new_device::pcr_w)
+WRITE8_MEMBER(m68705_device::pcr_w)
{
// 7 1
// 6 1
@@ -406,23 +402,30 @@ WRITE8_MEMBER(m68705_new_device::pcr_w)
// 1 /PGE RW Program Enable
// 0 /PLE RW Programming Latch Enable
+ LOGEPROM("write PCR: /PGE=%u%s /PLE=%u\n", BIT(data, 1), BIT(data, 0) ? " [inhibited]" : "", BIT(data, 0));
+
// lock out /PGE if /PLE is not asserted
data |= ((data & 0x01) << 1);
// write EPROM if /PGE is asserted (erase requires UV so don't clear bits)
- if (pcr_vpon() && !pcr_pge() && !BIT(data, 1))
- m_user_rom[m_pl_addr] |= m_pl_data;
+ if (!pcr_pge() && !BIT(data, 1))
+ {
+ LOGEPROM("write EPROM%s: %04X = %02X | %02X\n",
+ pcr_vpon() ? "" : " prevented when Vpp low", m_pl_addr, m_pl_data, m_user_rom[m_pl_addr]);
+ if (pcr_vpon())
+ m_user_rom[m_pl_addr] |= m_pl_data;
+ }
m_pcr = (m_pcr & 0xfc) | (data & 0x03);
}
-READ8_MEMBER(m68705_new_device::acr_r)
+READ8_MEMBER(m68705_device::acr_r)
{
logerror("unsupported read ACR\n");
return 0xff;
}
-WRITE8_MEMBER(m68705_new_device::acr_w)
+WRITE8_MEMBER(m68705_device::acr_w)
{
// 7 conversion complete
// 6
@@ -450,20 +453,20 @@ WRITE8_MEMBER(m68705_new_device::acr_w)
logerror("unsupported write ACR = %02X\n", data);
}
-READ8_MEMBER(m68705_new_device::arr_r)
+READ8_MEMBER(m68705_device::arr_r)
{
logerror("unsupported read ARR\n");
return 0xff;
}
-WRITE8_MEMBER(m68705_new_device::arr_w)
+WRITE8_MEMBER(m68705_device::arr_w)
{
logerror("unsupported write ARR = %02X\n", data);
}
-void m68705_new_device::device_start()
+void m68705_device::device_start()
{
- m68705_device::device_start();
+ m6805_base_device::device_start();
save_item(NAME(m_port_input));
save_item(NAME(m_port_latch));
@@ -496,9 +499,9 @@ void m68705_new_device::device_start()
m_pl_addr = 0xffff;
}
-void m68705_new_device::device_reset()
+void m68705_device::device_reset()
{
- m68705_device::device_reset();
+ m6805_base_device::device_reset();
// reset digital I/O
port_ddr_w<0>(space(AS_PROGRAM), 0, 0x00, 0xff);
@@ -516,10 +519,18 @@ void m68705_new_device::device_reset()
m_pcr |= 0xfb; // b2 (/VPON) is driven by external input and hence unaffected by reset
if (CLEAR_LINE != m_vihtp)
- RM16(0xfff6, &m_pc);
+ {
+ LOG("loading bootstrap vector\n");
+ rm16(M68705_VECTOR_BOOTSTRAP, m_pc);
+ }
+ else
+ {
+ LOG("loading reset vector\n");
+ rm16(M68705_VECTOR_RESET, m_pc);
+ }
}
-void m68705_new_device::execute_set_input(int inputnum, int state)
+void m68705_device::execute_set_input(int inputnum, int state)
{
switch (inputnum)
{
@@ -531,25 +542,67 @@ void m68705_new_device::execute_set_input(int inputnum, int state)
m_vihtp = (ASSERT_LINE == state) ? ASSERT_LINE : CLEAR_LINE;
break;
default:
- m68705_device::execute_set_input(inputnum, state);
+ if (m_irq_state[inputnum] != state)
+ {
+ m_irq_state[inputnum] = (state == ASSERT_LINE) ? ASSERT_LINE : CLEAR_LINE;
+
+ if (state != CLEAR_LINE)
+ m_pending_interrupts |= 1 << inputnum;
+ else if (M68705_INT_TIMER == inputnum)
+ m_pending_interrupts &= ~(1 << inputnum); // this one's is level-sensitive
+ }
}
}
-void m68705_new_device::nvram_default()
+void m68705_device::nvram_default()
{
}
-void m68705_new_device::nvram_read(emu_file &file)
+void m68705_device::nvram_read(emu_file &file)
{
file.read(&m_user_rom[0], m_user_rom.bytes());
}
-void m68705_new_device::nvram_write(emu_file &file)
+void m68705_device::nvram_write(emu_file &file)
{
file.write(&m_user_rom[0], m_user_rom.bytes());
}
-void m68705_new_device::burn_cycles(unsigned count)
+void m68705_device::interrupt()
+{
+ if (m_pending_interrupts & M68705_INT_MASK)
+ {
+ if ((CC & IFLAG) == 0)
+ {
+ pushword(m_pc);
+ pushbyte(m_x);
+ pushbyte(m_a);
+ pushbyte(m_cc);
+ SEI;
+ standard_irq_callback(0);
+
+ if (BIT(m_pending_interrupts, M68705_IRQ_LINE))
+ {
+ LOGINT("servicing /INT interrupt\n");
+ m_pending_interrupts &= ~(1 << M68705_IRQ_LINE);
+ rm16(M68705_VECTOR_INT, m_pc);
+ }
+ else if (BIT(m_pending_interrupts, M68705_INT_TIMER))
+ {
+ LOGINT("servicing timer/counter interrupt\n");
+ rm16(M68705_VECTOR_TIMER, m_pc);
+ }
+ else
+ {
+ throw emu_fatalerror("Unknown pending interrupt");
+ }
+ m_icount -= 11;
+ burn_cycles(11);
+ }
+ }
+}
+
+void m68705_device::burn_cycles(unsigned count)
{
// handle internal timer/counter source
if (!tcr_tin()) // TODO: check tcr_tie() and gate on TIMER if appropriate
@@ -560,6 +613,7 @@ void m68705_new_device::burn_cycles(unsigned count)
if (decrements && (decrements >= m_tdr))
{
+ LOGTIMER("timer/counter expired%s%s\n", tcr_tir() ? " [overrun]" : "", tcr_tim() ? " [masked]" : "");
m_tcr |= 0x80;
if (!tcr_tim())
set_input_line(M68705_INT_TIMER, ASSERT_LINE);
@@ -569,6 +623,30 @@ void m68705_new_device::burn_cycles(unsigned count)
}
}
+template <std::size_t N> void m68705_device::add_port_latch_state()
+{
+ state_add(M68705_LATCHA + N, util::string_format("LATCH%c", 'A' + N).c_str(), m_port_latch[N]).mask(~m_port_mask[N] & 0xff);
+}
+
+template <std::size_t N> void m68705_device::add_port_ddr_state()
+{
+ state_add(M68705_DDRA + N, util::string_format("DDR%c", 'A' + N).c_str(), m_port_ddr[N]).mask(~m_port_mask[N] & 0xff);
+}
+
+void m68705_device::add_timer_state()
+{
+ state_add(M68705_PS, "PS", m_prescaler).mask(0x7f);
+ state_add(M68705_TDR, "TDR", m_tdr).mask(0xff);
+ state_add(M68705_TCR, "TCR", m_tcr).mask(0xff);
+}
+
+void m68705_device::add_eprom_state()
+{
+ state_add(M68705_PCR, "PCR", m_pcr).mask(0xff);
+ state_add(M68705_PLA, "PLA", m_pl_addr).mask(0xffff);
+ state_add(M68705_PLD, "PLD", m_pl_data).mask(0xff);
+}
+
/****************************************************************************
* M68705Px family
@@ -606,13 +684,28 @@ m68705p_device::m68705p_device(
char const *name,
char const *shortname,
char const *source)
- : m68705_new_device(mconfig, tag, owner, clock, type, name, 11, address_map_delegate(FUNC(m68705p_device::p_map), this), shortname, source)
+ : m68705_device(mconfig, tag, owner, clock, type, name, 11, address_map_delegate(FUNC(m68705p_device::p_map), this), shortname, source)
{
set_port_open_drain<0>(true); // Port A is open drain with internal pull-ups
set_port_mask<2>(0xf0); // Port C is four bits wide
set_port_mask<3>(0xff); // Port D isn't present
}
+void m68705p_device::device_start()
+{
+ m68705_device::device_start();
+
+ add_port_latch_state<0>();
+ add_port_latch_state<1>();
+ add_port_latch_state<2>();
+ add_port_ddr_state<0>();
+ add_port_ddr_state<1>();
+ add_port_ddr_state<2>();
+ add_timer_state();
+ add_eprom_state();
+ state_add(M68705_MOR, "MOR", get_user_rom()[0x0784]).mask(0xff);
+}
+
offs_t m68705p_device::disasm_disassemble(
std::ostream &stream,
offs_t pc,
@@ -662,7 +755,7 @@ m68705u_device::m68705u_device(
address_map_delegate internal_map,
char const *shortname,
char const *source)
- : m68705_new_device(mconfig, tag, owner, clock, type, name, 12, internal_map, shortname, source)
+ : m68705_device(mconfig, tag, owner, clock, type, name, 12, internal_map, shortname, source)
{
set_port_open_drain<0>(true); // Port A is open drain with internal pull-ups
}
@@ -680,6 +773,24 @@ m68705u_device::m68705u_device(
{
}
+void m68705u_device::device_start()
+{
+ m68705_device::device_start();
+
+ add_port_latch_state<0>();
+ add_port_latch_state<1>();
+ add_port_latch_state<2>();
+ add_port_latch_state<3>();
+ add_port_ddr_state<0>();
+ add_port_ddr_state<1>();
+ add_port_ddr_state<2>();
+ add_timer_state();
+ add_eprom_state();
+ state_add(M68705_MOR, "MOR", get_user_rom()[0x0f38]).mask(0xff);
+
+ // TODO: MISC register
+}
+
offs_t m68705u_device::disasm_disassemble(
std::ostream &stream,
offs_t pc,
@@ -734,6 +845,13 @@ m68705r_device::m68705r_device(
{
}
+void m68705r_device::device_start()
+{
+ m68705u_device::device_start();
+
+ // TODO: ADC
+}
+
offs_t m68705r_device::disasm_disassemble(
std::ostream &stream,
offs_t pc,
@@ -801,7 +919,7 @@ tiny_rom_entry const *m68705r3_device::device_rom_region() const
u8 m68705r3_device::get_mask_options() const
{
- return get_user_rom()[0x0784] & 0xf7; // no SNM bit
+ return get_user_rom()[0x0f38] & 0xf7; // no SNM bit
}
@@ -821,5 +939,5 @@ tiny_rom_entry const *m68705u3_device::device_rom_region() const
u8 m68705u3_device::get_mask_options() const
{
- return get_user_rom()[0x0784] & 0xf7; // no SNM bit
+ return get_user_rom()[0x0f38] & 0xf7; // no SNM bit
}
diff --git a/src/devices/cpu/m6805/m68705.h b/src/devices/cpu/m6805/m68705.h
index e89517e5735..6241079f912 100644
--- a/src/devices/cpu/m6805/m68705.h
+++ b/src/devices/cpu/m6805/m68705.h
@@ -7,11 +7,11 @@
#include "m6805.h"
+
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
-extern device_type const M68705;
extern device_type const M68705P3;
extern device_type const M68705P5;
extern device_type const M68705R3;
@@ -24,80 +24,74 @@ extern device_type const M68705U3;
// ======================> m68705_device
-class m68705_device : public m6805_base_device
-{
-public:
- m68705_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock);
-
-protected:
- enum
- {
- M68705_A = M6805_A,
- M68705_PC = M6805_PC,
- M68705_S = M6805_S,
- M68705_X = M6805_X,
- M68705_CC = M6805_CC,
- M68705_IRQ_STATE = M6805_IRQ_STATE
- };
-
- m68705_device(
- machine_config const &mconfig,
- char const *tag,
- device_t *owner,
- u32 clock,
- device_type type,
- char const *name,
- u32 addr_width,
- address_map_delegate internal_map,
- char const *shortname,
- char const *source);
-
- virtual void device_reset() override;
- virtual void execute_set_input(int inputnum, int state) override;
- virtual void interrupt() override;
-};
-
-
-// ======================> m68705_new_device
-
#define MCFG_M68705_PORTA_R_CB(obj) \
- devcb = &m68705_new_device::set_port_cb_r<0>(*device, DEVCB_##obj);
+ devcb = &m68705_device::set_port_cb_r<0>(*device, DEVCB_##obj);
#define MCFG_M68705_PORTB_R_CB(obj) \
- devcb = &m68705_new_device::set_port_cb_r<1>(*device, DEVCB_##obj);
+ devcb = &m68705_device::set_port_cb_r<1>(*device, DEVCB_##obj);
#define MCFG_M68705_PORTC_R_CB(obj) \
- devcb = &m68705_new_device::set_port_cb_r<2>(*device, DEVCB_##obj);
+ devcb = &m68705_device::set_port_cb_r<2>(*device, DEVCB_##obj);
#define MCFG_M68705_PORTD_R_CB(obj) \
- devcb = &m68705_new_device::set_port_cb_r<3>(*device, DEVCB_##obj);
+ devcb = &m68705_device::set_port_cb_r<3>(*device, DEVCB_##obj);
#define MCFG_M68705_PORTA_W_CB(obj) \
- devcb = &m68705_new_device::set_port_cb_w<0>(*device, DEVCB_##obj);
+ devcb = &m68705_device::set_port_cb_w<0>(*device, DEVCB_##obj);
#define MCFG_M68705_PORTB_W_CB(obj) \
- devcb = &m68705_new_device::set_port_cb_w<1>(*device, DEVCB_##obj);
+ devcb = &m68705_device::set_port_cb_w<1>(*device, DEVCB_##obj);
#define MCFG_M68705_PORTC_W_CB(obj) \
- devcb = &m68705_new_device::set_port_cb_w<2>(*device, DEVCB_##obj);
+ devcb = &m68705_device::set_port_cb_w<2>(*device, DEVCB_##obj);
-class m68705_new_device : public m68705_device, public device_nvram_interface
+class m68705_device : public m6805_base_device, public device_nvram_interface
{
public:
// static configuration helpers
template<std::size_t N, typename Object> static devcb_base &set_port_cb_r(device_t &device, Object &&obj)
- { return downcast<m68705_new_device &>(device).m_port_cb_r[N].set_callback(std::forward<Object>(obj)); }
+ { return downcast<m68705_device &>(device).m_port_cb_r[N].set_callback(std::forward<Object>(obj)); }
template<std::size_t N, typename Object> static devcb_base &set_port_cb_w(device_t &device, Object &&obj)
- { return downcast<m68705_new_device &>(device).m_port_cb_w[N].set_callback(std::forward<Object>(obj)); }
+ { return downcast<m68705_device &>(device).m_port_cb_w[N].set_callback(std::forward<Object>(obj)); }
protected:
+ // state index constants
+ enum
+ {
+ M68705_A = M6805_A,
+ M68705_PC = M6805_PC,
+ M68705_S = M6805_S,
+ M68705_X = M6805_X,
+ M68705_CC = M6805_CC,
+ M68705_IRQ_STATE = M6805_IRQ_STATE,
+
+ M68705_LATCHA = 0x10,
+ M68705_LATCHB,
+ M68705_LATCHC,
+ M68705_LATCHD,
+ M68705_DDRA,
+ M68705_DDRB,
+ M68705_DDRC,
+ M68705_DDRD,
+
+ M68705_PS,
+ M68705_TDR,
+ M68705_TCR,
+
+ M68705_PCR,
+ M68705_PLD,
+ M68705_PLA,
+
+ M68705_MOR
+ };
+
enum
{
PORT_COUNT = 4
};
- m68705_new_device(
+ m68705_device(
machine_config const &mconfig,
char const *tag,
device_t *owner,
@@ -143,11 +137,17 @@ protected:
virtual void nvram_read(emu_file &file) override;
virtual void nvram_write(emu_file &file) override;
+ virtual void interrupt() override;
virtual void burn_cycles(unsigned count) override;
u8 *const get_user_rom() const { return &m_user_rom[0]; }
virtual u8 get_mask_options() const = 0;
+ template <std::size_t N> void add_port_latch_state();
+ template <std::size_t N> void add_port_ddr_state();
+ void add_timer_state();
+ void add_eprom_state();
+
private:
bool tcr_tir() const { return BIT(m_tcr, 7); }
bool tcr_tim() const { return BIT(m_tcr, 6); }
@@ -186,7 +186,7 @@ private:
// ======================> m68705p_device
-class m68705p_device : public m68705_new_device
+class m68705p_device : public m68705_device
{
public:
DECLARE_WRITE8_MEMBER(pa_w) { port_input_w<0>(space, offset, data, mem_mask); }
@@ -206,6 +206,8 @@ protected:
char const *shortname,
char const *source);
+ virtual void device_start() override;
+
virtual offs_t disasm_disassemble(
std::ostream &stream,
offs_t pc,
@@ -217,7 +219,7 @@ protected:
// ======================> m68705u_device
-class m68705u_device : public m68705_new_device
+class m68705u_device : public m68705_device
{
public:
DECLARE_WRITE8_MEMBER(pa_w) { port_input_w<0>(space, offset, data, mem_mask); }
@@ -248,6 +250,8 @@ protected:
char const *shortname,
char const *source);
+ virtual void device_start() override;
+
virtual offs_t disasm_disassemble(
std::ostream &stream,
offs_t pc,
@@ -277,6 +281,8 @@ protected:
char const *shortname,
char const *source);
+ virtual void device_start() override;
+
virtual offs_t disasm_disassemble(
std::ostream &stream,
offs_t pc,
@@ -346,7 +352,6 @@ protected:
* 68705 section
****************************************************************************/
-#define M68705_INT_MASK 0x03
#define M68705_IRQ_LINE (M6805_IRQ_LINE + 0)
#define M68705_INT_TIMER (M6805_IRQ_LINE + 1)
#define M68705_VPP_LINE (M6805_IRQ_LINE + 2)
diff --git a/src/devices/cpu/m6805/m68hc05.cpp b/src/devices/cpu/m6805/m68hc05.cpp
new file mode 100644
index 00000000000..c1821965736
--- /dev/null
+++ b/src/devices/cpu/m6805/m68hc05.cpp
@@ -0,0 +1,961 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+/*
+High-speed CMOS 6805-compatible microcontrollers
+
+The M68HC05 family uses the M6805 instruction set with a few additions
+but runs at two clocks per machine cycle, and has incompatible on-board
+peripherals. It comes in mask ROM (M68HC05), EPROM (M68HC705) and
+EEPROM (M68HC805) variants. The suffix gives some indication of the
+memory sizes and on-board peripherals, but there's not a lot of
+consistency across the ROM/EPROM/EEPROM variants.
+
+All devices in this family have a 16-bit free-running counter fed from
+the internal clock. The counter value can be captured on an input edge,
+and an output can be automatically set when the counter reaches a
+certain value.
+*/
+#include "emu.h"
+#include "m68hc05.h"
+#include "m6805defs.h"
+
+
+/****************************************************************************
+ * Configurable logging
+ ****************************************************************************/
+
+#define LOG_GENERAL (1U << 0)
+#define LOG_INT (1U << 1)
+#define LOG_IOPORT (1U << 2)
+#define LOG_TIMER (1U << 3)
+#define LOG_COP (1U << 4)
+
+//#define VERBOSE (LOG_GENERAL | LOG_INT | LOG_IOPORT | LOG_TIMER | LOG_COP)
+//#define LOG_OUTPUT_FUNC printf
+#include "logmacro.h"
+
+#define LOGINT(...) LOGMASKED(LOG_INT, __VA_ARGS__)
+#define LOGIOPORT(...) LOGMASKED(LOG_IOPORT, __VA_ARGS__)
+#define LOGTIMER(...) LOGMASKED(LOG_TIMER, __VA_ARGS__)
+#define LOGCOP(...) LOGMASKED(LOG_COP, __VA_ARGS__)
+
+
+namespace {
+
+std::pair<u16, char const *> const m68hc05c4_syms[] = {
+ { 0x0000, "PORTA" }, { 0x0001, "PORTB" }, { 0x0002, "PORTC" }, { 0x0003, "PORTD" },
+ { 0x0004, "DDRA" }, { 0x0005, "DDRB" }, { 0x0006, "DDRC" },
+ { 0x000a, "SPCR" }, { 0x000b, "SPSR" }, { 0x000c, "SPDR" },
+ { 0x000d, "BAUD" }, { 0x000e, "SCCR1" }, { 0x000f, "SCCR2" }, { 0x0010, "SCSR" }, { 0x0011, "SCDR" },
+ { 0x0012, "TCR" }, { 0x0013, "TSR" },
+ { 0x0014, "ICRH" }, { 0x0015, "ICRL" }, { 0x0016, "OCRH" }, { 0x0017, "OCRL" },
+ { 0x0018, "TRH" }, { 0x0019, "TRL" }, { 0x001a, "ATRH" }, { 0x001b, "ATRL" } };
+
+std::pair<u16, char const *> const m68hc705c8a_syms[] = {
+ { 0x0000, "PORTA" }, { 0x0001, "PORTB" }, { 0x0002, "PORTC" }, { 0x0003, "PORTD" },
+ { 0x0004, "DDRA" }, { 0x0005, "DDRB" }, { 0x0006, "DDRC" },
+ { 0x000a, "SPCR" }, { 0x000b, "SPSR" }, { 0x000c, "SPDR" },
+ { 0x000d, "BAUD" }, { 0x000e, "SCCR1" }, { 0x000f, "SCCR2" }, { 0x0010, "SCSR" }, { 0x0011, "SCDR" },
+ { 0x0012, "TCR" }, { 0x0013, "TSR" },
+ { 0x0014, "ICRH" }, { 0x0015, "ICRL" }, { 0x0016, "OCRH" }, { 0x0017, "OCRL" },
+ { 0x0018, "TRH" }, { 0x0019, "TRL" }, { 0x001a, "ATRH" }, { 0x001b, "ATRL" },
+ { 0x001c, "PROG" },
+ { 0x001d, "COPRST" }, { 0x001e, "COPCR" } };
+
+
+ROM_START( m68hc705c8a )
+ ROM_REGION(0x00f0, "bootstrap", 0)
+ ROM_LOAD("bootstrap.bin", 0x0000, 0x00f0, NO_DUMP)
+ROM_END
+
+
+//constexpr u16 M68HC05_VECTOR_SPI = 0xfff4;
+//constexpr u16 M68HC05_VECTOR_SCI = 0xfff6;
+constexpr u16 M68HC05_VECTOR_TIMER = 0xfff8;
+constexpr u16 M68HC05_VECTOR_IRQ = 0xfffa;
+constexpr u16 M68HC05_VECTOR_SWI = 0xfffc;
+//constexpr u16 M68HC05_VECTOR_RESET = 0xfffe;
+
+constexpr u16 M68HC05_INT_IRQ = u16(1) << 0;
+constexpr u16 M68HC05_INT_TIMER = u16(1) << 1;
+
+constexpr u16 M68HC05_INT_MASK = M68HC05_INT_IRQ | M68HC05_INT_TIMER;
+
+} // anonymous namespace
+
+
+
+/****************************************************************************
+ * Global variables
+ ****************************************************************************/
+
+device_type const M68HC05C4 = &device_creator<m68hc05c4_device>;
+device_type const M68HC05C8 = &device_creator<m68hc05c8_device>;
+device_type const M68HC705C8A = &device_creator<m68hc705c8a_device>;
+
+
+
+/****************************************************************************
+ * M68HC05 base device
+ ****************************************************************************/
+
+m68hc05_device::m68hc05_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ u32 clock,
+ device_type type,
+ char const *name,
+ address_map_delegate internal_map,
+ char const *shortname,
+ char const *source)
+ : m6805_base_device(
+ mconfig,
+ tag,
+ owner,
+ clock,
+ type,
+ name,
+ { s_hc_ops, s_hc_cycles, 13, 0x00ff, 0x00c0, M68HC05_VECTOR_SWI },
+ internal_map,
+ shortname,
+ source)
+ , m_port_cb_r{ *this, *this, *this, *this }
+ , m_port_cb_w{ *this, *this, *this, *this }
+ , m_port_bits{ 0xff, 0xff, 0xff, 0xff }
+ , m_port_interrupt{ 0x00, 0x00, 0x00, 0x00 }
+ , m_port_input{ 0xff, 0xff, 0xff, 0xff }
+ , m_port_latch{ 0xff, 0xff, 0xff, 0xff }
+ , m_port_ddr{ 0x00, 0x00, 0x00, 0x00 }
+ , m_port_irq_state(false)
+ , m_irq_line_state(false)
+ , m_irq_latch(0)
+ , m_tcmp_cb(*this)
+ , m_tcap_state(false)
+ , m_tcr(0x00)
+ , m_tsr(0x00), m_tsr_seen(0x00)
+ , m_prescaler(0x00)
+ , m_counter(0xfffc), m_icr(0x0000), m_ocr(0x0000)
+ , m_inhibit_cap(false), m_inhibit_cmp(false)
+ , m_trl_buf{ 0xfc, 0xfc }
+ , m_trl_latched{ false, false }
+ , m_pcop_cnt(0)
+ , m_ncop_cnt(0)
+ , m_coprst(0x00)
+ , m_copcr(0x00)
+ , m_ncope(0)
+{
+}
+
+
+void m68hc05_device::set_port_bits(std::array<u8, PORT_COUNT> const &bits)
+{
+ if (configured() || started())
+ throw emu_fatalerror("Attempt to set physical port bits after configuration");
+
+ for (unsigned i = 0; PORT_COUNT > i; ++i)
+ m_port_bits[i] = bits[i];
+}
+
+void m68hc05_device::set_port_interrupt(std::array<u8, PORT_COUNT> const &interrupt)
+{
+ u8 diff(0x00);
+ for (unsigned i = 0; PORT_COUNT > i; ++i)
+ {
+ diff |= (m_port_interrupt[i] ^ interrupt[i]) & ~m_port_ddr[i];
+ m_port_interrupt[i] = interrupt[i];
+ if (interrupt[i] && !m_port_cb_r[i].isnull())
+ logerror("PORT%c has interrupts enabled with pulled inputs, behaviour may be incorrect\n", 'A' + i);
+ }
+ if (diff) update_port_irq();
+}
+
+READ8_MEMBER(m68hc05_device::port_r)
+{
+ offset &= PORT_COUNT - 1;
+ if (!space.debugger_access() && !m_port_cb_r[offset].isnull())
+ {
+ u8 const newval(m_port_cb_r[offset](space, 0, ~m_port_ddr[offset] & m_port_bits[offset]) & m_port_bits[offset]);
+ u8 const diff(newval ^ m_port_input[offset]);
+ if (diff)
+ {
+ LOGIOPORT("read PORT%c: new input = %02X & %02X (was %02X)\n",
+ char('A' + offset), newval, ~m_port_ddr[offset] & m_port_bits[offset], m_port_input[offset]);
+ }
+ m_port_input[offset] = newval;
+ if (diff & m_port_interrupt[offset] & ~m_port_ddr[offset])
+ update_port_irq();
+ }
+ return port_value(offset);
+}
+
+WRITE8_MEMBER(m68hc05_device::port_latch_w)
+{
+ offset &= PORT_COUNT - 1;
+ data &= m_port_bits[offset];
+ u8 const diff = m_port_latch[offset] ^ data;
+ if (diff)
+ {
+ LOGIOPORT("write PORT%c latch: %02X & %02X (was %02X)\n",
+ char('A' + offset), data, m_port_ddr[offset], m_port_latch[offset]);
+ }
+ m_port_latch[offset] = data;
+ if (diff & m_port_ddr[offset])
+ m_port_cb_w[offset](space, 0, port_value(offset), m_port_ddr[offset]);
+}
+
+READ8_MEMBER(m68hc05_device::port_ddr_r)
+{
+ return m_port_ddr[offset & (PORT_COUNT - 1)];
+}
+
+WRITE8_MEMBER(m68hc05_device::port_ddr_w)
+{
+ offset &= PORT_COUNT - 1;
+ data &= m_port_bits[offset];
+ u8 const diff(data ^ m_port_ddr[offset]);
+ if (diff)
+ {
+ LOGIOPORT("write DDR%c: %02X (was %02X)\n", char('A' + offset), data, m_port_ddr[offset]);
+ m_port_ddr[offset] = data;
+ if (diff & m_port_interrupt[offset])
+ {
+ if (!m_port_cb_r[offset].isnull())
+ {
+ u8 const newval(m_port_cb_r[offset](space, 0, ~m_port_ddr[offset] & m_port_bits[offset]) & m_port_bits[offset]);
+ u8 const diff(newval ^ m_port_input[offset]);
+ if (diff)
+ {
+ LOGIOPORT("read PORT%c: new input = %02X & %02X (was %02X)\n",
+ char('A' + offset), newval, ~m_port_ddr[offset] & m_port_bits[offset], m_port_input[offset]);
+ }
+ m_port_input[offset] = newval;
+ }
+ update_port_irq();
+ }
+ m_port_cb_w[offset](space, 0, port_value(offset), m_port_ddr[offset]);
+ }
+}
+
+
+READ8_MEMBER(m68hc05_device::tcr_r)
+{
+ return m_tcr;
+}
+
+WRITE8_MEMBER(m68hc05_device::tcr_w)
+{
+ data &= 0xe3;
+ LOGTIMER("write TCR: ICIE=%u OCIE=%u TOIE=%u IEDG=%u OLVL=%u\n",
+ BIT(data, 7), BIT(data, 6), BIT(data, 5), BIT(data, 1), BIT(data, 0));
+ m_tcr = data;
+ if (m_tcr & m_tsr & 0xe0)
+ m_pending_interrupts |= M68HC05_INT_TIMER;
+ else
+ m_pending_interrupts &= ~M68HC05_INT_TIMER;
+}
+
+READ8_MEMBER(m68hc05_device::tsr_r)
+{
+ if (!space.debugger_access())
+ {
+ u8 const events(m_tsr & ~m_tsr_seen);
+ if (events)
+ {
+ LOGTIMER("read TSR: seen%s%s%s\n",
+ BIT(events, 7) ? " ICF" : "", BIT(events, 6) ? " OCF" : "", BIT(events, 5) ? " TOF" : "");
+ }
+ m_tsr_seen = m_tsr;
+ }
+ return m_tsr;
+}
+
+READ8_MEMBER(m68hc05_device::icr_r)
+{
+ // reading IRCH inhibits capture until ICRL is read
+ // reading ICRL after reading TCR with ICF set clears ICF
+
+ u8 const low(BIT(offset, 0));
+ if (!space.debugger_access())
+ {
+ if (low)
+ {
+ if (BIT(m_tsr_seen, 7))
+ {
+ LOGTIMER("read ICRL, clear ICF\n");
+ m_tsr &= 0x7f;
+ m_tsr_seen &= 0x7f;
+ if (!(m_tcr & m_tsr & 0xe0)) m_pending_interrupts &= ~M68HC05_INT_TIMER;
+ }
+ if (m_inhibit_cap) LOGTIMER("read ICRL, enable capture\n");
+ m_inhibit_cap = false;
+ }
+ else
+ {
+ if (!m_inhibit_cap) LOGTIMER("read ICRH, inhibit capture\n");
+ m_inhibit_cap = true;
+ }
+ }
+ return u8(m_icr >> (low ? 0 : 8));
+}
+
+READ8_MEMBER(m68hc05_device::ocr_r)
+{
+ // reading OCRL after reading TCR with OCF set clears OCF
+
+ u8 const low(BIT(offset, 0));
+ if (!space.debugger_access() && low && BIT(m_tsr_seen, 6))
+ {
+ LOGTIMER("read OCRL, clear OCF\n");
+ m_tsr &= 0xbf;
+ m_tsr_seen &= 0xbf;
+ if (!(m_tcr & m_tsr & 0xe0)) m_pending_interrupts &= ~M68HC05_INT_TIMER;
+ }
+ return u8(m_ocr >> (low ? 0 : 8));
+}
+
+WRITE8_MEMBER(m68hc05_device::ocr_w)
+{
+ // writing ORCH inhibits compare until OCRL is written
+ // writing OCRL after reading TCR with OCF set clears OCF
+
+ u8 const low(BIT(offset, 0));
+ if (!space.debugger_access())
+ {
+ if (low)
+ {
+ if (BIT(m_tsr_seen, 6))
+ {
+ LOGTIMER("write OCRL, clear OCF\n");
+ m_tsr &= 0xbf;
+ m_tsr_seen &= 0xbf;
+ if (!(m_tcr & m_tsr & 0xe0)) m_pending_interrupts &= ~M68HC05_INT_TIMER;
+ }
+ if (m_inhibit_cmp) LOGTIMER("write OCRL, enable compare\n");
+ m_inhibit_cmp = false;
+ }
+ else
+ {
+ if (!m_inhibit_cmp) LOGTIMER("write OCRH, inhibit compare\n");
+ m_inhibit_cmp = true;
+ }
+ }
+ m_ocr = (m_ocr & (low ? 0xff00 : 0x00ff)) | (u16(data) << (low ? 0 : 8));
+}
+
+READ8_MEMBER(m68hc05_device::timer_r)
+{
+ // reading [A]TRH returns current counter MSB and latches [A]TRL buffer
+ // reading [A]TRL returns current [A]TRL buffer and completes read sequence
+ // reading TRL after reading TSR with TOF set clears TOF
+ // reading ATRL doesn't affect TOF
+
+ u8 const low(BIT(offset, 0));
+ u8 const alt(BIT(offset, 1));
+ if (low)
+ {
+ if (!space.debugger_access())
+ {
+ if (m_trl_latched[alt]) LOGTIMER("read %sTRL, read sequence complete\n", alt ? "A" : "");
+ m_trl_latched[alt] = false;
+ if (!alt && BIT(m_tsr_seen, 5))
+ {
+ LOGTIMER("read TRL, clear TOF\n");
+ m_tsr &= 0xdf;
+ m_tsr_seen &= 0xdf;
+ if (!(m_tcr & m_tsr & 0xe0)) m_pending_interrupts &= ~M68HC05_INT_TIMER;
+ }
+ }
+ return m_trl_buf[alt];
+ }
+ else
+ {
+ if (!space.debugger_access() && !m_trl_latched[alt])
+ {
+ LOGTIMER("read %sTRH, latch %sTRL\n", alt ? "A" : "", alt ? "A" : "");
+ m_trl_latched[alt] = true;
+ m_trl_buf[alt] = u8(m_counter);
+ }
+ return u8(m_counter >> 8);
+ }
+}
+
+
+WRITE8_MEMBER(m68hc05_device::coprst_w)
+{
+ LOGCOP("write COPRST=%02x%s\n", data, ((0xaa == data) && (0x55 == m_coprst)) ? ", reset" : "");
+ if (0x55 == data)
+ {
+ m_coprst = data;
+ }
+ else if (0xaa == data)
+ {
+ if (0x55 == m_coprst) m_pcop_cnt &= 0x00007fff;
+ m_coprst = data;
+ }
+}
+
+READ8_MEMBER(m68hc05_device::copcr_r)
+{
+ if (copcr_copf()) LOGCOP("read COPCR, clear COPF\n");
+ u8 const result(m_copcr);
+ m_copcr &= 0xef;
+ return result;
+}
+
+WRITE8_MEMBER(m68hc05_device::copcr_w)
+{
+ LOGCOP("write COPCR: CME=%u PCOPE=%u [%s] CM=%u\n",
+ BIT(data, 3), BIT(data, 2), (!copcr_pcope() && BIT(data, 2)) ? "set" : "ignored", data & 0x03);
+ m_copcr = (m_copcr & 0xf4) | (data & 0x0f); // PCOPE is set-only, hence the mask overlap
+}
+
+WRITE8_MEMBER(m68hc05_device::copr_w)
+{
+ LOGCOP("write COPR: COPC=%u\n", BIT(data, 0));
+ if (!BIT(data, 0)) m_ncop_cnt = 0;
+}
+
+
+void m68hc05_device::device_start()
+{
+ m6805_base_device::device_start();
+
+ // resolve callbacks
+ for (devcb_read8 &cb : m_port_cb_r) cb.resolve();
+ for (devcb_write8 &cb : m_port_cb_w) cb.resolve_safe();
+ m_tcmp_cb.resolve_safe();
+
+ // save digital I/O
+ save_item(NAME(m_port_interrupt));
+ save_item(NAME(m_port_input));
+ save_item(NAME(m_port_latch));
+ save_item(NAME(m_port_ddr));
+ save_item(NAME(m_port_irq_state));
+ save_item(NAME(m_irq_line_state));
+ save_item(NAME(m_irq_latch));
+
+ // save timer/counter
+ save_item(NAME(m_tcap_state));
+ save_item(NAME(m_tcr));
+ save_item(NAME(m_tsr));
+ save_item(NAME(m_tsr_seen));
+ save_item(NAME(m_prescaler));
+ save_item(NAME(m_counter));
+ save_item(NAME(m_icr));
+ save_item(NAME(m_ocr));
+ save_item(NAME(m_inhibit_cap));;
+ save_item(NAME(m_inhibit_cmp));
+ save_item(NAME(m_trl_buf));
+ save_item(NAME(m_trl_latched));
+
+ // save COP watchdogs
+ save_item(NAME(m_pcop_cnt));
+ save_item(NAME(m_ncop_cnt));
+ save_item(NAME(m_coprst));
+ save_item(NAME(m_copcr));
+ save_item(NAME(m_ncope));
+
+ // digital I/O state unaffected by reset
+ std::fill(std::begin(m_port_interrupt), std::end(m_port_interrupt), 0x00);
+ std::fill(std::begin(m_port_input), std::end(m_port_input), 0xff);
+ std::fill(std::begin(m_port_latch), std::end(m_port_latch), 0xff);
+ m_irq_line_state = false;
+
+ // timer state unaffected by reset
+ m_tcap_state = false;
+ m_tcr = 0x00;
+ m_tsr = 0x00;
+ m_icr = 0x0000;
+ m_ocr = 0x0000;
+
+ // COP watchdog state unaffected by reset
+ m_pcop_cnt = 0;
+ m_coprst = 0x00;
+ m_copcr = 0x00;
+ m_ncope = 0;
+
+ // expose most basic state to debugger
+ state_add(M68HC05_IRQLATCH, "IRQLATCH", m_irq_latch).mask(0x01);
+}
+
+void m68hc05_device::device_reset()
+{
+ m6805_base_device::device_reset();
+
+ // digital I/O reset
+ std::fill(std::begin(m_port_ddr), std::end(m_port_ddr), 0x00);
+ m_irq_latch = 0;
+ update_port_irq();
+
+ // timer reset
+ m_tcr &= 0x02;
+ m_tsr_seen = 0x00;
+ m_prescaler = 0;
+ m_counter = 0xfffc;
+ m_inhibit_cap = m_inhibit_cmp = false;
+ m_trl_buf[0] = m_trl_buf[1] = u8(m_counter);
+ m_trl_latched[0] = m_trl_latched[1] = false;
+
+ // COP watchdog reset
+ m_ncop_cnt = 0;
+ m_copcr &= 0x10;
+}
+
+
+void m68hc05_device::execute_set_input(int inputnum, int state)
+{
+ switch (inputnum)
+ {
+ case M68HC05_IRQ_LINE:
+ if ((CLEAR_LINE != state) && !m_irq_line_state)
+ {
+ LOGINT("/IRQ edge%s\n", (m_port_irq_state || m_irq_latch) ? "" : ", set IRQ latch");
+ if (!m_port_irq_state)
+ {
+ m_irq_latch = 1;
+ m_pending_interrupts |= M68HC05_INT_IRQ;
+ }
+ }
+ m_irq_line_state = ASSERT_LINE == state;
+ break;
+ case M68HC05_TCAP_LINE:
+ if ((bool(state) != m_tcap_state) && (bool(state) == tcr_iedg()))
+ {
+ LOGTIMER("input capture %04X%s\n", m_counter, m_inhibit_cap ? " [inhibited]" : "");
+ if (!m_inhibit_cap)
+ {
+ m_tsr |= 0x80;
+ m_icr = m_counter;
+ if (m_tcr & m_tsr & 0xe0) m_pending_interrupts |= M68HC05_INT_TIMER;
+ }
+ }
+ m_tcap_state = bool(state);
+ break;
+ default:
+ fatalerror("m68hc05[%s]: unknown input line %d", tag(), inputnum);
+ }
+}
+
+u64 m68hc05_device::execute_clocks_to_cycles(u64 clocks) const
+{
+ return (clocks + 1) / 2;
+}
+
+u64 m68hc05_device::execute_cycles_to_clocks(u64 cycles) const
+{
+ return cycles * 2;
+}
+
+
+offs_t m68hc05_device::disasm_disassemble(
+ std::ostream &stream,
+ offs_t pc,
+ const u8 *oprom,
+ const u8 *opram,
+ u32 options)
+{
+ return CPU_DISASSEMBLE_NAME(m68hc05)(this, stream, pc, oprom, opram, options);
+}
+
+
+void m68hc05_device::interrupt()
+{
+ if ((m_pending_interrupts & M68HC05_INT_MASK) && !(CC & IFLAG))
+ {
+ pushword(m_pc);
+ pushbyte(m_x);
+ pushbyte(m_a);
+ pushbyte(m_cc);
+ SEI;
+ standard_irq_callback(0);
+
+ if (m_pending_interrupts & M68HC05_INT_IRQ)
+ {
+ LOGINT("servicing external interrupt\n");
+ m_irq_latch = 0;
+ m_pending_interrupts &= ~M68HC05_INT_IRQ;
+ rm16(M68HC05_VECTOR_IRQ, m_pc);
+ }
+ else if (m_pending_interrupts & M68HC05_INT_TIMER)
+ {
+ LOGINT("servicing timer interrupt\n");
+ rm16(M68HC05_VECTOR_TIMER, m_pc);
+ }
+ else
+ {
+ fatalerror("m68hc05[%s]: unknown pending interrupt(s) %x", tag(), m_pending_interrupts);
+ }
+ m_icount -= 10;
+ burn_cycles(10);
+ }
+}
+
+void m68hc05_device::burn_cycles(unsigned count)
+{
+ // calculate new timer values (fixed prescaler of four)
+ unsigned const ps_opt(4);
+ unsigned const ps_mask((1 << ps_opt) - 1);
+ unsigned const increments((count + (m_prescaler & ps_mask)) >> ps_opt);
+ u32 const new_counter(u32(m_counter) + increments);
+ bool const timer_rollover((0x010000 > m_counter) && (0x010000 <= new_counter));
+ bool const output_compare_match((m_ocr > m_counter) && (m_ocr <= new_counter));
+ m_prescaler = (count + m_prescaler) & ps_mask;
+ m_counter = u16(new_counter);
+ if (timer_rollover)
+ {
+ LOGTIMER("timer rollover\n");
+ m_tsr |= 0x20;
+ }
+ if (output_compare_match)
+ {
+ LOGTIMER("output compare match %s\n", m_inhibit_cmp ? " [inhibited]" : "");
+ if (!m_inhibit_cmp)
+ {
+ m_tsr |= 0x40;
+ m_tcmp_cb(tcr_olvl() ? 1 : 0);
+ }
+ }
+ if (m_tcr & m_tsr & 0xe0) m_pending_interrupts |= M68HC05_INT_TIMER;
+
+ // run programmable COP
+ u32 const pcop_timeout(u32(1) << ((copcr_cm() << 1) + 15));
+ if (copcr_pcope() && (pcop_timeout <= ((m_pcop_cnt & (pcop_timeout - 1)) + count)))
+ {
+ LOGCOP("PCOP reset\n");
+ m_copcr |= 0x10;
+ set_input_line(INPUT_LINE_RESET, PULSE_LINE);
+ }
+ m_pcop_cnt = (m_pcop_cnt + count) & ((u32(1) << 21) - 1);
+
+ // run non-programmable COP
+ m_ncop_cnt += count;
+ if ((u32(1) << 17) <= m_ncop_cnt)
+ {
+ set_input_line(INPUT_LINE_RESET, PULSE_LINE);
+ LOGCOP("NCOP reset\n");
+ }
+ m_ncop_cnt &= (u32(1) << 17) - 1;
+}
+
+
+void m68hc05_device::add_port_state(std::array<bool, PORT_COUNT> const &ddr)
+{
+ for (unsigned i = 0; PORT_COUNT > i; ++i)
+ {
+ if (m_port_bits[i])
+ state_add(M68HC05_LATCHA + i, util::string_format("LATCH%c", 'A' + i).c_str(), m_port_latch[i]).mask(m_port_bits[i]);
+ }
+ for (unsigned i = 0; PORT_COUNT > i; ++i)
+ {
+ if (ddr[i] && m_port_bits[i])
+ state_add(M68HC05_DDRA + i, util::string_format("DDR%c", 'A' + i).c_str(), m_port_ddr[i]).mask(m_port_bits[i]);
+ }
+}
+
+void m68hc05_device::add_timer_state()
+{
+ state_add(M68HC05_TCR, "TCR", m_tcr).mask(0x7f);
+ state_add(M68HC05_TSR, "TSR", m_tsr).mask(0xff);
+ state_add(M68HC05_ICR, "ICR", m_icr).mask(0xffff);
+ state_add(M68HC05_OCR, "OCR", m_ocr).mask(0xffff);
+ state_add(M68HC05_PS, "PS", m_prescaler).mask(0x03);
+ state_add(M68HC05_TR, "TR", m_counter).mask(0xffff);
+}
+
+void m68hc05_device::add_pcop_state()
+{
+ state_add(M68HC05_COPRST, "COPRST", m_coprst).mask(0xff);
+ state_add(M68HC05_COPCR, "COPCR", m_copcr).mask(0x1f);
+ state_add(M68HC05_PCOP, "PCOP", m_pcop_cnt).mask(0x001fffff);
+}
+
+void m68hc05_device::add_ncop_state()
+{
+ state_add(M68HC05_NCOPE, "NCOPE", m_ncope).mask(0x01);
+ state_add(M68HC05_NCOP, "NCOP", m_ncop_cnt).mask(0x0001ffff);
+}
+
+
+u8 m68hc05_device::port_value(unsigned offset) const
+{
+ return (m_port_latch[offset] & m_port_ddr[offset]) | (m_port_input[offset] & ~m_port_ddr[offset]);
+}
+
+void m68hc05_device::update_port_irq()
+{
+ u8 state(0x00);
+ for (unsigned i = 0; i < PORT_COUNT; ++i)
+ state |= m_port_interrupt[i] & ~m_port_ddr[i] & ~m_port_input[i];
+
+ if (bool(state) != m_port_irq_state)
+ {
+ LOGINT("I/O port IRQ state now %u%s\n",
+ state ? 1 : 0, (!m_irq_line_state && state && !m_irq_latch) ? ", set IRQ latch" : "");
+ m_port_irq_state = bool(state);
+ if (!m_irq_line_state && state)
+ {
+ m_irq_latch = 1;
+ m_pending_interrupts |= M68HC05_INT_IRQ;
+ }
+ }
+}
+
+
+
+/****************************************************************************
+ * M68HC705 base device
+ ****************************************************************************/
+
+m68hc705_device::m68hc705_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ u32 clock,
+ device_type type,
+ char const *name,
+ address_map_delegate internal_map,
+ char const *shortname,
+ char const *source)
+ : m68hc05_device(mconfig, tag, owner, clock, type, name, internal_map, shortname, source)
+{
+}
+
+
+
+/****************************************************************************
+ * MC68HC05C4 device
+ ****************************************************************************/
+
+DEVICE_ADDRESS_MAP_START( c4_map, 8, m68hc05c4_device )
+ ADDRESS_MAP_GLOBAL_MASK(0x1fff)
+ ADDRESS_MAP_UNMAP_HIGH
+
+ AM_RANGE(0x0000, 0x0003) AM_READWRITE(port_r, port_latch_w)
+ AM_RANGE(0x0004, 0x0006) AM_READWRITE(port_ddr_r, port_ddr_w)
+ // 0x0007-0x0009 unused
+ // 0x000a SPCR
+ // 0x000b SPSR
+ // 0x000c SPDR
+ // 0x000d BAUD
+ // 0x000e SCCR1
+ // 0x000f SCCR2
+ // 0x0010 SCSR
+ // 0x0011 SCDR
+ AM_RANGE(0x0012, 0x0012) AM_READWRITE(tcr_r, tcr_w)
+ AM_RANGE(0x0013, 0x0013) AM_READ(tsr_r)
+ AM_RANGE(0x0014, 0x0015) AM_READ(icr_r)
+ AM_RANGE(0x0016, 0x0017) AM_READWRITE(ocr_r, ocr_w)
+ AM_RANGE(0x0018, 0x001b) AM_READ(timer_r)
+ // 0x001c-0x001f unused
+ AM_RANGE(0x0020, 0x004f) AM_ROM // user ROM
+ AM_RANGE(0x0050, 0x00ff) AM_RAM // RAM/stack
+ AM_RANGE(0x0100, 0x10ff) AM_ROM // user ROM
+ // 0x1100-0x1eff unused
+ AM_RANGE(0x1f00, 0x1fef) AM_ROM // self-check
+ // 0x1ff0-0x1ff3 unused
+ AM_RANGE(0x1ff4, 0x1fff) AM_ROM // user vectors
+ADDRESS_MAP_END
+
+
+m68hc05c4_device::m68hc05c4_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock)
+ : m68hc05_device(
+ mconfig,
+ tag,
+ owner,
+ clock,
+ M68HC05C4,
+ "MC68HC05C4",
+ address_map_delegate(FUNC(m68hc05c4_device::c4_map), this),
+ "m68hc05c4",
+ __FILE__)
+{
+ set_port_bits(std::array<u8, PORT_COUNT>{{ 0xff, 0xff, 0xff, 0xbf }});
+}
+
+
+
+void m68hc05c4_device::device_start()
+{
+ m68hc05_device::device_start();
+
+ add_port_state(std::array<bool, PORT_COUNT>{{ true, true, true, false }});
+ add_timer_state();
+}
+
+
+offs_t m68hc05c4_device::disasm_disassemble(
+ std::ostream &stream,
+ offs_t pc,
+ const u8 *oprom,
+ const u8 *opram,
+ u32 options)
+{
+ return CPU_DISASSEMBLE_NAME(m68hc05)(this, stream, pc, oprom, opram, options, m68hc05c4_syms);
+}
+
+
+
+/****************************************************************************
+ * MC68HC05C8 device
+ ****************************************************************************/
+
+DEVICE_ADDRESS_MAP_START( c8_map, 8, m68hc05c8_device )
+ ADDRESS_MAP_GLOBAL_MASK(0x1fff)
+ ADDRESS_MAP_UNMAP_HIGH
+
+ AM_RANGE(0x0000, 0x0003) AM_READWRITE(port_r, port_latch_w)
+ AM_RANGE(0x0004, 0x0006) AM_READWRITE(port_ddr_r, port_ddr_w)
+ // 0x0007-0x0009 unused
+ // 0x000a SPCR
+ // 0x000b SPSR
+ // 0x000c SPDR
+ // 0x000d BAUD
+ // 0x000e SCCR1
+ // 0x000f SCCR2
+ // 0x0010 SCSR
+ // 0x0011 SCDR
+ AM_RANGE(0x0012, 0x0012) AM_READWRITE(tcr_r, tcr_w)
+ AM_RANGE(0x0013, 0x0013) AM_READ(tsr_r)
+ AM_RANGE(0x0014, 0x0015) AM_READ(icr_r)
+ AM_RANGE(0x0016, 0x0017) AM_READWRITE(ocr_r, ocr_w)
+ AM_RANGE(0x0018, 0x001b) AM_READ(timer_r)
+ // 0x001c-0x001f unused
+ AM_RANGE(0x0020, 0x004f) AM_ROM // user ROM
+ AM_RANGE(0x0050, 0x00ff) AM_RAM // RAM/stack
+ AM_RANGE(0x0100, 0x1eff) AM_ROM // user ROM
+ AM_RANGE(0x1f00, 0x1fef) AM_ROM // self-check
+ // 0x1ff0-0x1ff3 unused
+ AM_RANGE(0x1ff4, 0x1fff) AM_ROM // user vectors
+ADDRESS_MAP_END
+
+
+m68hc05c8_device::m68hc05c8_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock)
+ : m68hc05_device(
+ mconfig,
+ tag,
+ owner,
+ clock,
+ M68HC05C8,
+ "MC68HC05C8",
+ address_map_delegate(FUNC(m68hc05c8_device::c8_map), this),
+ "m68hc05c8",
+ __FILE__)
+{
+ set_port_bits(std::array<u8, PORT_COUNT>{{ 0xff, 0xff, 0xff, 0xbf }});
+}
+
+
+void m68hc05c8_device::device_start()
+{
+ m68hc05_device::device_start();
+
+ add_port_state(std::array<bool, PORT_COUNT>{{ true, true, true, false }});
+ add_timer_state();
+}
+
+
+offs_t m68hc05c8_device::disasm_disassemble(
+ std::ostream &stream,
+ offs_t pc,
+ const u8 *oprom,
+ const u8 *opram,
+ u32 options)
+{
+ // same I/O registers as MC68HC05C4
+ return CPU_DISASSEMBLE_NAME(m68hc05)(this, stream, pc, oprom, opram, options, m68hc05c4_syms);
+}
+
+
+
+/****************************************************************************
+ * MC68HC705C8A device
+ ****************************************************************************/
+
+DEVICE_ADDRESS_MAP_START( c8a_map, 8, m68hc705c8a_device )
+ ADDRESS_MAP_GLOBAL_MASK(0x1fff)
+ ADDRESS_MAP_UNMAP_HIGH
+
+ AM_RANGE(0x0000, 0x0003) AM_READWRITE(port_r, port_latch_w)
+ AM_RANGE(0x0004, 0x0006) AM_READWRITE(port_ddr_r, port_ddr_w)
+ // 0x0007-0x0009 unused
+ // 0x000a SPCR
+ // 0x000b SPSR
+ // 0x000c SPDR
+ // 0x000d BAUD
+ // 0x000e SCCR1
+ // 0x000f SCCR2
+ // 0x0010 SCSR
+ // 0x0011 SCDR
+ AM_RANGE(0x0012, 0x0012) AM_READWRITE(tcr_r, tcr_w)
+ AM_RANGE(0x0013, 0x0013) AM_READ(tsr_r)
+ AM_RANGE(0x0014, 0x0015) AM_READ(icr_r)
+ AM_RANGE(0x0016, 0x0017) AM_READWRITE(ocr_r, ocr_w)
+ AM_RANGE(0x0018, 0x001b) AM_READ(timer_r)
+ // 0x001c PROG
+ AM_RANGE(0x001d, 0x001d) AM_WRITE(coprst_w)
+ AM_RANGE(0x001e, 0x001e) AM_READWRITE(copcr_r, copcr_w)
+ // 0x001f unused
+ AM_RANGE(0x0020, 0x004f) AM_ROM // user PROM FIXME: banked with RAM
+ AM_RANGE(0x0050, 0x00ff) AM_RAM // RAM/stack
+ AM_RANGE(0x0100, 0x015f) AM_ROM // user PROM FIXME: banked with RAM
+ AM_RANGE(0x0160, 0x1eff) AM_ROM // user PROM
+ AM_RANGE(0x1f00, 0x1fde) AM_ROM AM_REGION("bootstrap", 0x0000) // bootloader
+ // 0x1fdf option register FIXME: controls banking
+ AM_RANGE(0x1fe0, 0x1fef) AM_ROM AM_REGION("bootstrap", 0x00e0) // boot ROM vectors
+ AM_RANGE(0x1ff0, 0x1ff0) AM_WRITE(copr_w)
+ AM_RANGE(0x1ff0, 0x1fff) AM_ROM // user vectors
+ADDRESS_MAP_END
+
+
+m68hc705c8a_device::m68hc705c8a_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock)
+ : m68hc705_device(
+ mconfig,
+ tag,
+ owner,
+ clock,
+ M68HC705C8A,
+ "MC68HC705C8A",
+ address_map_delegate(FUNC(m68hc705c8a_device::c8a_map), this),
+ "m68hc705c8a",
+ __FILE__)
+{
+ set_port_bits(std::array<u8, PORT_COUNT>{{ 0xff, 0xff, 0xff, 0xbf }});
+}
+
+
+tiny_rom_entry const *m68hc705c8a_device::device_rom_region() const
+{
+ return ROM_NAME(m68hc705c8a);
+}
+
+
+void m68hc705c8a_device::device_start()
+{
+ m68hc705_device::device_start();
+
+ add_port_state(std::array<bool, PORT_COUNT>{{ true, true, true, false }});
+ add_timer_state();
+ add_pcop_state();
+ add_ncop_state();
+}
+
+void m68hc705c8a_device::device_reset()
+{
+ m68hc705_device::device_reset();
+
+ // latch MOR registers on reset
+ set_port_interrupt(std::array<u8, PORT_COUNT>{{ 0x00, u8(rdmem(0xfff0)), 0x00, 0x00 }});
+ set_ncope(BIT(rdmem(0xfff1), 0));
+}
+
+
+offs_t m68hc705c8a_device::disasm_disassemble(
+ std::ostream &stream,
+ offs_t pc,
+ const u8 *oprom,
+ const u8 *opram,
+ u32 options)
+{
+ return CPU_DISASSEMBLE_NAME(m68hc05)(this, stream, pc, oprom, opram, options, m68hc705c8a_syms);
+}
diff --git a/src/devices/cpu/m6805/m68hc05.h b/src/devices/cpu/m6805/m68hc05.h
new file mode 100644
index 00000000000..cd0de3a31c0
--- /dev/null
+++ b/src/devices/cpu/m6805/m68hc05.h
@@ -0,0 +1,298 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+#ifndef MAME_CPU_M6805_M68HC05_H
+#define MAME_CPU_M6805_M68HC05_H
+
+#pragma once
+
+#include "m6805.h"
+
+#include <array>
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+extern device_type const M68HC05C4;
+extern device_type const M68HC05C8;
+extern device_type const M68HC705C8A;
+
+
+//**************************************************************************
+// TYPE DECLARATIONS
+//**************************************************************************
+
+// ======================> m68hc05_device
+
+#define MCFG_M68HC05_PORTA_R_CB(obj) \
+ devcb = &m68hc05_device::set_port_cb_r<0>(*device, DEVCB_##obj);
+
+#define MCFG_M68HC05_PORTB_R_CB(obj) \
+ devcb = &m68hc05_device::set_port_cb_r<1>(*device, DEVCB_##obj);
+
+#define MCFG_M68HC05_PORTC_R_CB(obj) \
+ devcb = &m68hc05_device::set_port_cb_r<2>(*device, DEVCB_##obj);
+
+#define MCFG_M68HC05_PORTD_R_CB(obj) \
+ devcb = &m68hc05_device::set_port_cb_r<3>(*device, DEVCB_##obj);
+
+#define MCFG_M68HC05_PORTA_W_CB(obj) \
+ devcb = &m68hc05_device::set_port_cb_w<0>(*device, DEVCB_##obj);
+
+#define MCFG_M68HC05_PORTB_W_CB(obj) \
+ devcb = &m68hc05_device::set_port_cb_w<1>(*device, DEVCB_##obj);
+
+#define MCFG_M68HC05_PORTC_W_CB(obj) \
+ devcb = &m68hc05_device::set_port_cb_w<2>(*device, DEVCB_##obj);
+
+#define MCFG_M68HC05_PORTD_W_CB(obj) \
+ devcb = &m68hc05_device::set_port_cb_w<3>(*device, DEVCB_##obj);
+
+#define MCFG_M68HC05_TCMP_CB(obj) \
+ devcb = &m68hc05_device::set_tcmp_cb(*device, DEVCB_##obj);
+
+
+class m68hc05_device : public m6805_base_device
+{
+public:
+ // static configuration helpers
+ template<std::size_t N, typename Object> static devcb_base &set_port_cb_r(device_t &device, Object &&obj)
+ { return downcast<m68hc05_device &>(device).m_port_cb_r[N].set_callback(std::forward<Object>(obj)); }
+ template<std::size_t N, typename Object> static devcb_base &set_port_cb_w(device_t &device, Object &&obj)
+ { return downcast<m68hc05_device &>(device).m_port_cb_w[N].set_callback(std::forward<Object>(obj)); }
+ template<typename Object> static devcb_base &set_tcmp_cb(device_t &device, Object &&obj)
+ { return downcast<m68hc05_device &>(device).m_tcmp_cb.set_callback(std::forward<Object>(obj)); }
+
+protected:
+ // state index constants
+ enum
+ {
+ M68HC05_A = M6805_A,
+ M68HC05_PC = M6805_PC,
+ M68HC05_S = M6805_S,
+ M68HC05_X = M6805_X,
+ M68HC05_CC = M6805_CC,
+ M68HC05_IRQ_STATE = M6805_IRQ_STATE,
+
+ M68HC05_IRQLATCH = 0x10,
+
+ M68HC05_LATCHA,
+ M68HC05_LATCHB,
+ M68HC05_LATCHC,
+ M68HC05_LATCHD,
+ M68HC05_DDRA,
+ M68HC05_DDRB,
+ M68HC05_DDRC,
+ M68HC05_DDRD,
+
+ M68HC05_TCR,
+ M68HC05_TSR,
+ M68HC05_ICR,
+ M68HC05_OCR,
+ M68HC05_PS,
+ M68HC05_TR,
+
+ M68HC05_COPRST,
+ M68HC05_COPCR,
+ M68HC05_PCOP,
+ M68HC05_NCOPE,
+ M68HC05_NCOP
+ };
+
+ enum { PORT_COUNT = 4 };
+
+ m68hc05_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ u32 clock,
+ device_type type,
+ char const *name,
+ address_map_delegate internal_map,
+ char const *shortname,
+ char const *source);
+
+ void set_port_bits(std::array<u8, PORT_COUNT> const &bits);
+ void set_port_interrupt(std::array<u8, PORT_COUNT> const &interrupt);
+ DECLARE_READ8_MEMBER(port_r);
+ DECLARE_WRITE8_MEMBER(port_latch_w);
+ DECLARE_READ8_MEMBER(port_ddr_r);
+ DECLARE_WRITE8_MEMBER(port_ddr_w);
+
+ DECLARE_READ8_MEMBER(tcr_r);
+ DECLARE_WRITE8_MEMBER(tcr_w);
+ DECLARE_READ8_MEMBER(tsr_r);
+ DECLARE_READ8_MEMBER(icr_r);
+ DECLARE_READ8_MEMBER(ocr_r);
+ DECLARE_WRITE8_MEMBER(ocr_w);
+ DECLARE_READ8_MEMBER(timer_r);
+
+ void set_ncope(bool state) { m_ncope = state ? 1 : 0; }
+ DECLARE_WRITE8_MEMBER(coprst_w);
+ DECLARE_READ8_MEMBER(copcr_r);
+ DECLARE_WRITE8_MEMBER(copcr_w);
+ DECLARE_WRITE8_MEMBER(copr_w);
+
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ virtual void execute_set_input(int inputnum, int state) override;
+ virtual u64 execute_clocks_to_cycles(u64 clocks) const override;
+ virtual u64 execute_cycles_to_clocks(u64 cycles) const override;
+
+ virtual offs_t disasm_disassemble(
+ std::ostream &stream,
+ offs_t pc,
+ const u8 *oprom,
+ const uint8_t *opram,
+ u32 options) override;
+
+ virtual void interrupt() override;
+ virtual void burn_cycles(unsigned count) override;
+
+ void add_port_state(std::array<bool, PORT_COUNT> const &ddr);
+ void add_timer_state();
+ void add_pcop_state();
+ void add_ncop_state();
+
+private:
+ u8 port_value(unsigned offset) const;
+ void update_port_irq();
+
+ bool tcr_icie() const { return BIT(m_tcr, 7); }
+ bool tcr_ocie() const { return BIT(m_tcr, 6); }
+ bool tcr_toie() const { return BIT(m_tcr, 5); }
+ bool tcr_iedg() const { return BIT(m_tcr, 1); }
+ bool tcr_olvl() const { return BIT(m_tcr, 0); }
+
+ bool tsr_icf() const { return BIT(m_tsr, 7); }
+ bool tsr_ocf() const { return BIT(m_tsr, 6); }
+ bool tsr_tof() const { return BIT(m_tsr, 5); }
+
+ bool copcr_copf() const { return BIT(m_copcr, 4); }
+ bool copcr_cme() const { return BIT(m_copcr, 3); }
+ bool copcr_pcope() const { return BIT(m_copcr, 2); }
+ u8 copcr_cm() const { return m_copcr & 0x03; }
+
+ // digital I/O
+ devcb_read8 m_port_cb_r[PORT_COUNT];
+ devcb_write8 m_port_cb_w[PORT_COUNT];
+ u8 m_port_bits[PORT_COUNT];
+ u8 m_port_interrupt[PORT_COUNT];
+ u8 m_port_input[PORT_COUNT];
+ u8 m_port_latch[PORT_COUNT];
+ u8 m_port_ddr[PORT_COUNT];
+ bool m_port_irq_state, m_irq_line_state;
+ u8 m_irq_latch;
+
+ // timer/counter
+ devcb_write_line m_tcmp_cb;
+ bool m_tcap_state;
+ u8 m_tcr;
+ u8 m_tsr, m_tsr_seen;
+ u8 m_prescaler;
+ u16 m_counter, m_icr, m_ocr;
+ bool m_inhibit_cap, m_inhibit_cmp;
+ u8 m_trl_buf[2];
+ bool m_trl_latched[2];
+
+ // COP watchdogs
+ u32 m_pcop_cnt, m_ncop_cnt;
+ u8 m_coprst, m_copcr;
+ u8 m_ncope;
+};
+
+
+// ======================> m68hc705_device
+
+class m68hc705_device : public m68hc05_device
+{
+protected:
+ m68hc705_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ u32 clock,
+ device_type type,
+ char const *name,
+ address_map_delegate internal_map,
+ char const *shortname,
+ char const *source);
+};
+
+
+// ======================> m68hc05c4_device
+
+class m68hc05c4_device : public m68hc05_device
+{
+public:
+ m68hc05c4_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock);
+
+protected:
+ DECLARE_ADDRESS_MAP(c4_map, 8);
+
+ virtual void device_start() override;
+
+ virtual offs_t disasm_disassemble(
+ std::ostream &stream,
+ offs_t pc,
+ const u8 *oprom,
+ const u8 *opram,
+ u32 options) override;
+};
+
+
+// ======================> m68hc05c8_device
+
+class m68hc05c8_device : public m68hc05_device
+{
+public:
+ m68hc05c8_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock);
+
+protected:
+ DECLARE_ADDRESS_MAP(c8_map, 8);
+
+ virtual void device_start() override;
+
+ virtual offs_t disasm_disassemble(
+ std::ostream &stream,
+ offs_t pc,
+ const u8 *oprom,
+ const u8 *opram,
+ u32 options) override;
+};
+
+
+// ======================> m68hc705c8a_device
+
+class m68hc705c8a_device : public m68hc705_device
+{
+public:
+ m68hc705c8a_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock);
+
+protected:
+ DECLARE_ADDRESS_MAP(c8a_map, 8);
+
+ virtual tiny_rom_entry const *device_rom_region() const override;
+
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ virtual offs_t disasm_disassemble(
+ std::ostream &stream,
+ offs_t pc,
+ const u8 *oprom,
+ const u8 *opram,
+ u32 options) override;
+};
+
+
+/****************************************************************************
+ * 68HC05 section
+ ****************************************************************************/
+
+#define M68HC05_IRQ_LINE (M6805_IRQ_LINE + 0)
+#define M68HC05_TCAP_LINE (M6805_IRQ_LINE + 1)
+
+#endif // MAME_CPU_M6805_M68HC05_H
diff --git a/src/devices/cpu/m6809/m6809.h b/src/devices/cpu/m6809/m6809.h
index 73f8477d51e..96f245cc535 100644
--- a/src/devices/cpu/m6809/m6809.h
+++ b/src/devices/cpu/m6809/m6809.h
@@ -310,7 +310,7 @@ public:
// ======================> m6809e_device
#define MCFG_M6809E_LIC_CB(_devcb) \
- m6809e_device::set_lic_cb(*device, DEVCB_##_devcb);
+ devcb = &m6809e_device::set_lic_cb(*device, DEVCB_##_devcb);
class m6809e_device : public m6809_base_device
diff --git a/src/devices/cpu/mb86233/mb86233.h b/src/devices/cpu/mb86233/mb86233.h
index 135227a2524..65a2c370b07 100644
--- a/src/devices/cpu/mb86233/mb86233.h
+++ b/src/devices/cpu/mb86233/mb86233.h
@@ -41,10 +41,14 @@ enum
};
-#define MCFG_MB86233_FIFO_READ_CB(_devcb) mb86233_cpu_device::set_fifo_read_cb(*device, DEVCB_##_devcb);
-#define MCFG_MB86233_FIFO_READ_OK_CB(_devcb) mb86233_cpu_device::set_fifo_read_ok_cb(*device, DEVCB_##_devcb);
-#define MCFG_MB86233_FIFO_WRITE_CB(_devcb) mb86233_cpu_device::set_fifo_write_cb(*device, DEVCB_##_devcb);
-#define MCFG_MB86233_TABLE_REGION(_region) mb86233_cpu_device::set_tablergn(*device, _region);
+#define MCFG_MB86233_FIFO_READ_CB(_devcb) \
+ devcb = &mb86233_cpu_device::set_fifo_read_cb(*device, DEVCB_##_devcb);
+#define MCFG_MB86233_FIFO_READ_OK_CB(_devcb) \
+ devcb = &mb86233_cpu_device::set_fifo_read_ok_cb(*device, DEVCB_##_devcb);
+#define MCFG_MB86233_FIFO_WRITE_CB(_devcb) \
+ devcb = &mb86233_cpu_device::set_fifo_write_cb(*device, DEVCB_##_devcb);
+#define MCFG_MB86233_TABLE_REGION(_region) \
+ mb86233_cpu_device::set_tablergn(*device, _region);
class mb86233_cpu_device : public cpu_device
diff --git a/src/devices/cpu/melps4/melps4.h b/src/devices/cpu/melps4/melps4.h
index d3b84a01aa5..3605cd441f2 100644
--- a/src/devices/cpu/melps4/melps4.h
+++ b/src/devices/cpu/melps4/melps4.h
@@ -16,37 +16,37 @@
// K input or A/D input port, up to 16 pins
#define MCFG_MELPS4_READ_K_CB(_devcb) \
- melps4_cpu_device::set_read_k_callback(*device, DEVCB_##_devcb);
+ devcb = &melps4_cpu_device::set_read_k_callback(*device, DEVCB_##_devcb);
// D discrete I/O port, up to 16 pins - offset 0-15 for bit, 16 for all pins clear
#define MCFG_MELPS4_READ_D_CB(_devcb) \
- melps4_cpu_device::set_read_d_callback(*device, DEVCB_##_devcb);
+ devcb = &melps4_cpu_device::set_read_d_callback(*device, DEVCB_##_devcb);
#define MCFG_MELPS4_WRITE_D_CB(_devcb) \
- melps4_cpu_device::set_write_d_callback(*device, DEVCB_##_devcb);
+ devcb = &melps4_cpu_device::set_write_d_callback(*device, DEVCB_##_devcb);
// 8-bit S generic I/O port
#define MCFG_MELPS4_READ_S_CB(_devcb) \
- melps4_cpu_device::set_read_s_callback(*device, DEVCB_##_devcb);
+ devcb = &melps4_cpu_device::set_read_s_callback(*device, DEVCB_##_devcb);
#define MCFG_MELPS4_WRITE_S_CB(_devcb) \
- melps4_cpu_device::set_write_s_callback(*device, DEVCB_##_devcb);
+ devcb = &melps4_cpu_device::set_write_s_callback(*device, DEVCB_##_devcb);
// 4-bit F generic I/O port
#define MCFG_MELPS4_READ_F_CB(_devcb) \
- melps4_cpu_device::set_read_f_callback(*device, DEVCB_##_devcb);
+ devcb = &melps4_cpu_device::set_read_f_callback(*device, DEVCB_##_devcb);
#define MCFG_MELPS4_WRITE_F_CB(_devcb) \
- melps4_cpu_device::set_write_f_callback(*device, DEVCB_##_devcb);
+ devcb = &melps4_cpu_device::set_write_f_callback(*device, DEVCB_##_devcb);
// 4-bit G generic output port
#define MCFG_MELPS4_WRITE_G_CB(_devcb) \
- melps4_cpu_device::set_write_g_callback(*device, DEVCB_##_devcb);
+ devcb = &melps4_cpu_device::set_write_g_callback(*device, DEVCB_##_devcb);
// 1-bit U generic output port
#define MCFG_MELPS4_WRITE_U_CB(_devcb) \
- melps4_cpu_device::set_write_u_callback(*device, DEVCB_##_devcb);
+ devcb = &melps4_cpu_device::set_write_u_callback(*device, DEVCB_##_devcb);
// T timer I/O pin (use execute_set_input for reads)
#define MCFG_MELPS4_WRITE_T_CB(_devcb) \
- melps4_cpu_device::set_write_t_callback(*device, DEVCB_##_devcb);
+ devcb = &melps4_cpu_device::set_write_t_callback(*device, DEVCB_##_devcb);
#define MELPS4_PORTD_CLR 16
diff --git a/src/devices/cpu/mn10200/mn10200.h b/src/devices/cpu/mn10200/mn10200.h
index cfa5c53457e..4eb0947ab2b 100644
--- a/src/devices/cpu/mn10200/mn10200.h
+++ b/src/devices/cpu/mn10200/mn10200.h
@@ -13,9 +13,9 @@
// port setup
#define MCFG_MN10200_READ_PORT_CB(X, _devcb) \
- mn10200_device::set_read_port##X##_callback(*device, DEVCB_##_devcb);
+ devcb = &mn10200_device::set_read_port##X##_callback(*device, DEVCB_##_devcb);
#define MCFG_MN10200_WRITE_PORT_CB(X, _devcb) \
- mn10200_device::set_write_port##X##_callback(*device, DEVCB_##_devcb);
+ devcb = &mn10200_device::set_write_port##X##_callback(*device, DEVCB_##_devcb);
enum
{
diff --git a/src/devices/cpu/nanoprocessor/nanoprocessor.h b/src/devices/cpu/nanoprocessor/nanoprocessor.h
index fb112d647e0..56bf23dbf72 100644
--- a/src/devices/cpu/nanoprocessor/nanoprocessor.h
+++ b/src/devices/cpu/nanoprocessor/nanoprocessor.h
@@ -63,12 +63,12 @@
// DC0 is in bit 0, DC1 in bit 1 and so on.
// Keep in mind that DC7 usually masks the interrupt signal.
#define MCFG_HP_NANO_DC_CHANGED(_devcb) \
- hp_nanoprocessor_device::set_dc_changed_func(*device , DEVCB_##_devcb);
+ devcb = &hp_nanoprocessor_device::set_dc_changed_func(*device , DEVCB_##_devcb);
// Callback to read the input state of DC lines
// All lines that are not in input are to be reported at "1"
#define MCFG_HP_NANO_READ_DC_CB(_devcb) \
- hp_nanoprocessor_device::set_read_dc_func(*device , DEVCB_##_devcb);
+ devcb = &hp_nanoprocessor_device::set_read_dc_func(*device , DEVCB_##_devcb);
class hp_nanoprocessor_device : public cpu_device
{
diff --git a/src/devices/cpu/pic16c5x/pic16c5x.h b/src/devices/cpu/pic16c5x/pic16c5x.h
index ef0f7dbbbd4..e675489ff41 100644
--- a/src/devices/cpu/pic16c5x/pic16c5x.h
+++ b/src/devices/cpu/pic16c5x/pic16c5x.h
@@ -27,25 +27,25 @@ enum
// port a, 4 bits, 2-way
#define MCFG_PIC16C5x_READ_A_CB(_devcb) \
- pic16c5x_device::set_read_a_callback(*device, DEVCB_##_devcb);
+ devcb = &pic16c5x_device::set_read_a_callback(*device, DEVCB_##_devcb);
#define MCFG_PIC16C5x_WRITE_A_CB(_devcb) \
- pic16c5x_device::set_write_a_callback(*device, DEVCB_##_devcb);
+ devcb = &pic16c5x_device::set_write_a_callback(*device, DEVCB_##_devcb);
// port b, 8 bits, 2-way
#define MCFG_PIC16C5x_READ_B_CB(_devcb) \
- pic16c5x_device::set_read_b_callback(*device, DEVCB_##_devcb);
+ devcb = &pic16c5x_device::set_read_b_callback(*device, DEVCB_##_devcb);
#define MCFG_PIC16C5x_WRITE_B_CB(_devcb) \
- pic16c5x_device::set_write_b_callback(*device, DEVCB_##_devcb);
+ devcb = &pic16c5x_device::set_write_b_callback(*device, DEVCB_##_devcb);
// port c, 8 bits, 2-way
#define MCFG_PIC16C5x_READ_C_CB(_devcb) \
- pic16c5x_device::set_read_c_callback(*device, DEVCB_##_devcb);
+ devcb = &pic16c5x_device::set_read_c_callback(*device, DEVCB_##_devcb);
#define MCFG_PIC16C5x_WRITE_C_CB(_devcb) \
- pic16c5x_device::set_write_c_callback(*device, DEVCB_##_devcb);
+ devcb = &pic16c5x_device::set_write_c_callback(*device, DEVCB_##_devcb);
// T0 pin (readline)
#define MCFG_PIC16C5x_T0_CB(_devcb) \
- pic16c5x_device::set_t0_callback(*device, DEVCB_##_devcb);
+ devcb = &pic16c5x_device::set_t0_callback(*device, DEVCB_##_devcb);
// CONFIG register
#define MCFG_PIC16C5x_SET_CONFIG(_data) \
diff --git a/src/devices/cpu/sh4/sh4.cpp b/src/devices/cpu/sh4/sh4.cpp
index 72ceae2c0a2..17c8b0a7459 100644
--- a/src/devices/cpu/sh4/sh4.cpp
+++ b/src/devices/cpu/sh4/sh4.cpp
@@ -2556,21 +2556,7 @@ inline void sh34_base_device::PREFM(const uint16_t opcode)
* OPCODE DISPATCHERS
*****************************************************************************/
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+// TODO: current SZ=1(64bit) FMOVs correct for SH4 in LE mode only
/* FMOV.S @Rm+,FRn PR=0 SZ=0 1111nnnnmmmm1001 */
/* FMOV @Rm+,DRn PR=0 SZ=1 1111nnn0mmmm1001 */
@@ -2580,33 +2566,34 @@ inline void sh34_base_device::FMOVMRIFR(const uint16_t opcode)
{
uint32_t m = Rm; uint32_t n = Rn;
- if (m_fpu_pr) { /* PR = 1 */
- n = n & 14;
- m_ea = m_r[m];
- m_r[m] += 8;
- m_xf[n+NATIVE_ENDIAN_VALUE_LE_BE(1,0)] = RL(m_ea );
- m_xf[n+NATIVE_ENDIAN_VALUE_LE_BE(0,1)] = RL(m_ea+4 );
- } else { /* PR = 0 */
- if (m_fpu_sz) { /* SZ = 1 */
- if (n & 1) {
- n = n & 14;
- m_ea = m_r[m];
- m_xf[n] = RL(m_ea );
- m_r[m] += 4;
- m_xf[n+1] = RL(m_ea+4 );
- m_r[m] += 4;
- } else {
- m_ea = m_r[m];
- m_fr[n] = RL(m_ea );
- m_r[m] += 4;
- m_fr[n+1] = RL(m_ea+4 );
- m_r[m] += 4;
- }
- } else { /* SZ = 0 */
+ if (m_fpu_sz) { /* SZ = 1 */
+ if (n & 1) {
+ n &= 14;
+#ifdef LSB_FIRST
+ n ^= m_fpu_pr;
+#endif
+ m_ea = m_r[m];
+ m_xf[n] = RL(m_ea );
+ m_r[m] += 4;
+ m_xf[n^1] = RL(m_ea+4 );
+ m_r[m] += 4;
+ } else {
+#ifdef LSB_FIRST
+ n ^= m_fpu_pr;
+#endif
m_ea = m_r[m];
m_fr[n] = RL(m_ea );
m_r[m] += 4;
+ m_fr[n^1] = RL(m_ea+4 );
+ m_r[m] += 4;
}
+ } else { /* SZ = 0 */
+ m_ea = m_r[m];
+#ifdef LSB_FIRST
+ n ^= m_fpu_pr;
+#endif
+ m_fr[n] = RL(m_ea );
+ m_r[m] += 4;
}
}
@@ -2618,27 +2605,29 @@ inline void sh34_base_device::FMOVFRMR(const uint16_t opcode)
{
uint32_t m = Rm; uint32_t n = Rn;
- if (m_fpu_pr) { /* PR = 1 */
- m= m & 14;
- m_ea = m_r[n];
- WL(m_ea,m_xf[m+NATIVE_ENDIAN_VALUE_LE_BE(1,0)] );
- WL(m_ea+4,m_xf[m+NATIVE_ENDIAN_VALUE_LE_BE(0,1)] );
- } else { /* PR = 0 */
- if (m_fpu_sz) { /* SZ = 1 */
- if (m & 1) {
- m= m & 14;
- m_ea = m_r[n];
- WL(m_ea,m_xf[m] );
- WL(m_ea+4,m_xf[m+1] );
- } else {
- m_ea = m_r[n];
- WL(m_ea,m_fr[m] );
- WL(m_ea+4,m_fr[m+1] );
- }
- } else { /* SZ = 0 */
+ if (m_fpu_sz) { /* SZ = 1 */
+ if (m & 1) {
+ m &= 14;
+#ifdef LSB_FIRST
+ m ^= m_fpu_pr;
+#endif
+ m_ea = m_r[n];
+ WL(m_ea,m_xf[m] );
+ WL(m_ea+4,m_xf[m^1] );
+ } else {
+#ifdef LSB_FIRST
+ m ^= m_fpu_pr;
+#endif
m_ea = m_r[n];
WL(m_ea,m_fr[m] );
+ WL(m_ea+4,m_fr[m^1] );
}
+ } else { /* SZ = 0 */
+ m_ea = m_r[n];
+#ifdef LSB_FIRST
+ m ^= m_fpu_pr;
+#endif
+ WL(m_ea,m_fr[m] );
}
}
@@ -2650,31 +2639,32 @@ inline void sh34_base_device::FMOVFRMDR(const uint16_t opcode)
{
uint32_t m = Rm; uint32_t n = Rn;
- if (m_fpu_pr) { /* PR = 1 */
- m= m & 14;
- m_r[n] -= 8;
- m_ea = m_r[n];
- WL(m_ea,m_xf[m+NATIVE_ENDIAN_VALUE_LE_BE(1,0)] );
- WL(m_ea+4,m_xf[m+NATIVE_ENDIAN_VALUE_LE_BE(0,1)] );
- } else { /* PR = 0 */
- if (m_fpu_sz) { /* SZ = 1 */
- if (m & 1) {
- m= m & 14;
- m_r[n] -= 8;
- m_ea = m_r[n];
- WL(m_ea,m_xf[m] );
- WL(m_ea+4,m_xf[m+1] );
- } else {
- m_r[n] -= 8;
- m_ea = m_r[n];
- WL(m_ea,m_fr[m] );
- WL(m_ea+4,m_fr[m+1] );
- }
- } else { /* SZ = 0 */
- m_r[n] -= 4;
+ if (m_fpu_sz) { /* SZ = 1 */
+ if (m & 1) {
+ m &= 14;
+#ifdef LSB_FIRST
+ m ^= m_fpu_pr;
+#endif
+ m_r[n] -= 8;
+ m_ea = m_r[n];
+ WL(m_ea,m_xf[m] );
+ WL(m_ea+4,m_xf[m^1] );
+ } else {
+#ifdef LSB_FIRST
+ m ^= m_fpu_pr;
+#endif
+ m_r[n] -= 8;
m_ea = m_r[n];
WL(m_ea,m_fr[m] );
+ WL(m_ea+4,m_fr[m^1] );
}
+ } else { /* SZ = 0 */
+ m_r[n] -= 4;
+ m_ea = m_r[n];
+#ifdef LSB_FIRST
+ m ^= m_fpu_pr;
+#endif
+ WL(m_ea,m_fr[m] );
}
}
@@ -2686,27 +2676,29 @@ inline void sh34_base_device::FMOVFRS0(const uint16_t opcode)
{
uint32_t m = Rm; uint32_t n = Rn;
- if (m_fpu_pr) { /* PR = 1 */
- m= m & 14;
- m_ea = m_r[0] + m_r[n];
- WL(m_ea,m_xf[m+NATIVE_ENDIAN_VALUE_LE_BE(1,0)] );
- WL(m_ea+4,m_xf[m+NATIVE_ENDIAN_VALUE_LE_BE(0,1)] );
- } else { /* PR = 0 */
- if (m_fpu_sz) { /* SZ = 1 */
- if (m & 1) {
- m= m & 14;
- m_ea = m_r[0] + m_r[n];
- WL(m_ea,m_xf[m] );
- WL(m_ea+4,m_xf[m+1] );
- } else {
- m_ea = m_r[0] + m_r[n];
- WL(m_ea,m_fr[m] );
- WL(m_ea+4,m_fr[m+1] );
- }
- } else { /* SZ = 0 */
+ if (m_fpu_sz) { /* SZ = 1 */
+ if (m & 1) {
+ m &= 14;
+#ifdef LSB_FIRST
+ m ^= m_fpu_pr;
+#endif
+ m_ea = m_r[0] + m_r[n];
+ WL(m_ea,m_xf[m] );
+ WL(m_ea+4,m_xf[m^1] );
+ } else {
+#ifdef LSB_FIRST
+ m ^= m_fpu_pr;
+#endif
m_ea = m_r[0] + m_r[n];
WL(m_ea,m_fr[m] );
+ WL(m_ea+4,m_fr[m^1] );
}
+ } else { /* SZ = 0 */
+ m_ea = m_r[0] + m_r[n];
+#ifdef LSB_FIRST
+ m ^= m_fpu_pr;
+#endif
+ WL(m_ea,m_fr[m] );
}
}
@@ -2718,27 +2710,29 @@ inline void sh34_base_device::FMOVS0FR(const uint16_t opcode)
{
uint32_t m = Rm; uint32_t n = Rn;
- if (m_fpu_pr) { /* PR = 1 */
- n= n & 14;
- m_ea = m_r[0] + m_r[m];
- m_xf[n+NATIVE_ENDIAN_VALUE_LE_BE(1,0)] = RL(m_ea );
- m_xf[n+NATIVE_ENDIAN_VALUE_LE_BE(0,1)] = RL(m_ea+4 );
- } else { /* PR = 0 */
- if (m_fpu_sz) { /* SZ = 1 */
- if (n & 1) {
- n= n & 14;
- m_ea = m_r[0] + m_r[m];
- m_xf[n] = RL(m_ea );
- m_xf[n+1] = RL(m_ea+4 );
- } else {
- m_ea = m_r[0] + m_r[m];
- m_fr[n] = RL(m_ea );
- m_fr[n+1] = RL(m_ea+4 );
- }
- } else { /* SZ = 0 */
+ if (m_fpu_sz) { /* SZ = 1 */
+ if (n & 1) {
+ n &= 14;
+#ifdef LSB_FIRST
+ n ^= m_fpu_pr;
+#endif
+ m_ea = m_r[0] + m_r[m];
+ m_xf[n] = RL(m_ea );
+ m_xf[n^1] = RL(m_ea+4 );
+ } else {
+#ifdef LSB_FIRST
+ n ^= m_fpu_pr;
+#endif
m_ea = m_r[0] + m_r[m];
m_fr[n] = RL(m_ea );
+ m_fr[n^1] = RL(m_ea+4 );
}
+ } else { /* SZ = 0 */
+ m_ea = m_r[0] + m_r[m];
+#ifdef LSB_FIRST
+ n ^= m_fpu_pr;
+#endif
+ m_fr[n] = RL(m_ea );
}
}
@@ -2751,35 +2745,29 @@ inline void sh34_base_device::FMOVMRFR(const uint16_t opcode)
{
uint32_t m = Rm; uint32_t n = Rn;
- if (m_fpu_pr) { /* PR = 1 */
+ if (m_fpu_sz) { /* SZ = 1 */
if (n & 1) {
- n= n & 14;
+ n &= 14;
+#ifdef LSB_FIRST
+ n ^= m_fpu_pr;
+#endif
m_ea = m_r[m];
- m_xf[n+NATIVE_ENDIAN_VALUE_LE_BE(1,0)] = RL(m_ea );
- m_xf[n+NATIVE_ENDIAN_VALUE_LE_BE(0,1)] = RL(m_ea+4 );
+ m_xf[n] = RL(m_ea );
+ m_xf[n^1] = RL(m_ea+4 );
} else {
- n= n & 14;
- m_ea = m_r[m];
- m_fr[n+NATIVE_ENDIAN_VALUE_LE_BE(1,0)] = RL(m_ea );
- m_fr[n+NATIVE_ENDIAN_VALUE_LE_BE(0,1)] = RL(m_ea+4 );
- }
- } else { /* PR = 0 */
- if (m_fpu_sz) { /* SZ = 1 */
- if (n & 1) {
- n= n & 14;
- m_ea = m_r[m];
- m_xf[n] = RL(m_ea );
- m_xf[n+1] = RL(m_ea+4 );
- } else {
- n= n & 14;
- m_ea = m_r[m];
- m_fr[n] = RL(m_ea );
- m_fr[n+1] = RL(m_ea+4 );
- }
- } else { /* SZ = 0 */
+#ifdef LSB_FIRST
+ n ^= m_fpu_pr;
+#endif
m_ea = m_r[m];
m_fr[n] = RL(m_ea );
+ m_fr[n^1] = RL(m_ea+4 );
}
+ } else { /* SZ = 0 */
+ m_ea = m_r[m];
+#ifdef LSB_FIRST
+ n ^= m_fpu_pr;
+#endif
+ m_fr[n] = RL(m_ea );
}
}
@@ -2792,9 +2780,14 @@ inline void sh34_base_device::FMOVFR(const uint16_t opcode)
{
uint32_t m = Rm; uint32_t n = Rn;
- if ((m_fpu_sz == 0) && (m_fpu_pr == 0)) /* SZ = 0 */
+ if (m_fpu_sz == 0) { /* SZ = 0 */
+#ifdef LSB_FIRST
+ n ^= m_fpu_pr;
+ m ^= m_fpu_pr;
+#endif
m_fr[n] = m_fr[m];
- else { /* SZ = 1 or PR = 1 */
+ }
+ else { /* SZ = 1 */
if (m & 1) {
if (n & 1) {
m_xf[n & 14] = m_xf[m & 14];
@@ -2818,25 +2811,41 @@ inline void sh34_base_device::FMOVFR(const uint16_t opcode)
/* FLDI1 FRn 1111nnnn10011101 */
inline void sh34_base_device::FLDI1(const uint16_t opcode)
{
+#ifdef LSB_FIRST
+ m_fr[Rn ^ m_fpu_pr] = 0x3F800000;
+#else
m_fr[Rn] = 0x3F800000;
+#endif
}
/* FLDI0 FRn 1111nnnn10001101 */
inline void sh34_base_device::FLDI0(const uint16_t opcode)
{
+#ifdef LSB_FIRST
+ m_fr[Rn ^ m_fpu_pr] = 0;
+#else
m_fr[Rn] = 0;
+#endif
}
/* FLDS FRm,FPUL 1111mmmm00011101 */
inline void sh34_base_device:: FLDS(const uint16_t opcode)
{
+#ifdef LSB_FIRST
+ m_fpul = m_fr[Rn ^ m_fpu_pr];
+#else
m_fpul = m_fr[Rn];
+#endif
}
/* FSTS FPUL,FRn 1111nnnn00001101 */
inline void sh34_base_device:: FSTS(const uint16_t opcode)
{
+#ifdef LSB_FIRST
+ m_fr[Rn ^ m_fpu_pr] = m_fpul;
+#else
m_fr[Rn] = m_fpul;
+#endif
}
/* FRCHG 1111101111111101 */
diff --git a/src/devices/cpu/sm510/kb1013vk1-2.h b/src/devices/cpu/sm510/kb1013vk1-2.h
index 56896c940ac..031fa1d6bcf 100644
--- a/src/devices/cpu/sm510/kb1013vk1-2.h
+++ b/src/devices/cpu/sm510/kb1013vk1-2.h
@@ -23,10 +23,10 @@
class kb1013vk12_device : public sm500_device
{
public:
- kb1013vk12_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ kb1013vk12_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
protected:
- virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override;
+ virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options) override;
virtual void execute_one() override;
// opcode handlers
diff --git a/src/devices/cpu/sm510/kb1013vk1-2core.cpp b/src/devices/cpu/sm510/kb1013vk1-2core.cpp
index b7286e97401..a6848bb7696 100644
--- a/src/devices/cpu/sm510/kb1013vk1-2core.cpp
+++ b/src/devices/cpu/sm510/kb1013vk1-2core.cpp
@@ -28,13 +28,13 @@ static ADDRESS_MAP_START(data_5x13x4, AS_DATA, 8, sm510_base_device)
ADDRESS_MAP_END
// device definitions
-kb1013vk12_device::kb1013vk12_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+kb1013vk12_device::kb1013vk12_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: sm500_device(mconfig, KB1013VK12, "KB1013VK1-2", tag, owner, clock, 1 /* stack levels */, 11 /* prg width */, ADDRESS_MAP_NAME(program_1_8k), 7 /* data width */, ADDRESS_MAP_NAME(data_5x13x4), "kb1013vk1-2", __FILE__)
{ }
// disasm
-offs_t kb1013vk12_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options)
+offs_t kb1013vk12_device::disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options)
{
extern CPU_DISASSEMBLE(kb1013vk12);
return CPU_DISASSEMBLE_NAME(kb1013vk12)(this, stream, pc, oprom, opram, options);
diff --git a/src/devices/cpu/sm510/sm500.h b/src/devices/cpu/sm510/sm500.h
index 262c75fc29b..8c6cc5bd4e5 100644
--- a/src/devices/cpu/sm510/sm500.h
+++ b/src/devices/cpu/sm510/sm500.h
@@ -46,11 +46,11 @@ O36 48 | * | 13 K2
class sm500_device : public sm510_base_device
{
public:
- sm500_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- sm500_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, int stack_levels, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source);
+ sm500_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+ sm500_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, int stack_levels, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source);
protected:
- virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override;
+ virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options) override;
virtual void execute_one() override;
virtual void get_opcode_param() override;
diff --git a/src/devices/cpu/sm510/sm500core.cpp b/src/devices/cpu/sm510/sm500core.cpp
index 84c1c557eb6..370a4c14ebd 100644
--- a/src/devices/cpu/sm510/sm500core.cpp
+++ b/src/devices/cpu/sm510/sm500core.cpp
@@ -28,17 +28,17 @@ ADDRESS_MAP_END
// device definitions
-sm500_device::sm500_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+sm500_device::sm500_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: sm510_base_device(mconfig, SM500, "SM500", tag, owner, clock, 1 /* stack levels */, 11 /* prg width */, ADDRESS_MAP_NAME(program_1_2k), 6 /* data width */, ADDRESS_MAP_NAME(data_4x10x4), "sm500", __FILE__)
{ }
-sm500_device::sm500_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, int stack_levels, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
+sm500_device::sm500_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, int stack_levels, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
: sm510_base_device(mconfig, type, name, tag, owner, clock, stack_levels, prgwidth, program, datawidth, data, shortname, source)
{ }
// disasm
-offs_t sm500_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options)
+offs_t sm500_device::disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options)
{
extern CPU_DISASSEMBLE(sm500);
return CPU_DISASSEMBLE_NAME(sm500)(this, stream, pc, oprom, opram, options);
diff --git a/src/devices/cpu/sm510/sm510.cpp b/src/devices/cpu/sm510/sm510.cpp
index decfcce4e56..6fcd0fe21b5 100644
--- a/src/devices/cpu/sm510/sm510.cpp
+++ b/src/devices/cpu/sm510/sm510.cpp
@@ -148,13 +148,13 @@ void sm510_base_device::device_reset()
// lcd driver
//-------------------------------------------------
-inline uint16_t sm510_base_device::get_lcd_row(int column, uint8_t* ram)
+inline u16 sm510_base_device::get_lcd_row(int column, u8* ram)
{
// output 0 if lcd blackpate/bleeder is off, or in case row doesn't exist
if (ram == nullptr || m_bc || !m_bp)
return 0;
- uint16_t rowdata = 0;
+ u16 rowdata = 0;
for (int i = 0; i < 0x10; i++)
rowdata |= (ram[i] >> column & 1) << i;
@@ -172,7 +172,7 @@ TIMER_CALLBACK_MEMBER(sm510_base_device::lcd_timer_cb)
m_write_segc(h | SM510_PORT_SEGC, get_lcd_row(h, m_lcd_ram_c), 0xffff);
// bs output from L/X and Y regs
- uint8_t bs = (m_l >> h & 1) | ((m_x*2) >> h & 2);
+ u8 bs = (m_l >> h & 1) | ((m_x*2) >> h & 2);
m_write_segbs(h | SM510_PORT_SEGBS, (m_bc || !m_bp) ? 0 : bs, 0xffff);
}
@@ -200,7 +200,7 @@ void sm510_base_device::clock_melody()
// tone cycle table (SM511/SM512 datasheet fig.5)
// cmd 0 = cmd, 1 = stop, > 13 = illegal(unknown)
- static const uint8_t lut_tone_cycles[4*16] =
+ static const u8 lut_tone_cycles[4*16] =
{
0, 0, 7, 8, 8, 9, 9, 10,11,11,12,13,14,14, 7*2, 8*2,
0, 0, 8, 8, 9, 9, 10,11,11,12,13,13,14,15, 8*2, 8*2,
@@ -208,8 +208,8 @@ void sm510_base_device::clock_melody()
0, 0, 8, 9, 9, 10,10,11,11,12,13,14,14,15, 8*2, 9*2
};
- uint8_t cmd = m_melody_rom[m_melody_address] & 0x3f;
- uint8_t out = 0;
+ u8 cmd = m_melody_rom[m_melody_address] & 0x3f;
+ u8 out = 0;
// clock duty cycle if tone is active
if ((cmd & 0xf) > 1)
@@ -234,7 +234,7 @@ void sm510_base_device::clock_melody()
// clock time base on F8(d7)
if ((m_div & 0x7f) == 0)
{
- uint8_t mask = (cmd & 0x20) ? 0x1f : 0x0f;
+ u8 mask = (cmd & 0x20) ? 0x1f : 0x0f;
m_melody_step_count = (m_melody_step_count + 1) & mask;
if (m_melody_step_count == 0)
@@ -257,7 +257,7 @@ void sm510_base_device::init_melody()
// verify melody rom
for (int i = 0; i < 0x100; i++)
{
- uint8_t data = m_melody_rom[i];
+ u8 data = m_melody_rom[i];
if (data & 0xc0 || (data & 0x0f) > 13)
logerror("%s unknown melody ROM data $%02X at $%02X\n", tag(), data, i);
}
diff --git a/src/devices/cpu/sm510/sm510.h b/src/devices/cpu/sm510/sm510.h
index c60b0395af2..fe9e01484d1 100644
--- a/src/devices/cpu/sm510/sm510.h
+++ b/src/devices/cpu/sm510/sm510.h
@@ -16,38 +16,38 @@
// 4-bit K input port (pull-down)
#define MCFG_SM510_READ_K_CB(_devcb) \
- sm510_base_device::set_read_k_callback(*device, DEVCB_##_devcb);
+ devcb = &sm510_base_device::set_read_k_callback(*device, DEVCB_##_devcb);
// when in halt state, any K input going High can wake up the CPU,
// driver is required to use execute_set_input(SM510_INPUT_LINE_K, state)
#define SM510_INPUT_LINE_K 0
// 1-bit BA(aka alpha) input pin (pull-up)
#define MCFG_SM510_READ_BA_CB(_devcb) \
- sm510_base_device::set_read_ba_callback(*device, DEVCB_##_devcb);
+ devcb = &sm510_base_device::set_read_ba_callback(*device, DEVCB_##_devcb);
// 1-bit B(beta) input pin (pull-up)
#define MCFG_SM510_READ_B_CB(_devcb) \
- sm510_base_device::set_read_b_callback(*device, DEVCB_##_devcb);
+ devcb = &sm510_base_device::set_read_b_callback(*device, DEVCB_##_devcb);
// 8-bit S strobe output port
#define MCFG_SM510_WRITE_S_CB(_devcb) \
- sm510_base_device::set_write_s_callback(*device, DEVCB_##_devcb);
+ devcb = &sm510_base_device::set_write_s_callback(*device, DEVCB_##_devcb);
// 2-bit R melody output port
#define MCFG_SM510_WRITE_R_CB(_devcb) \
- sm510_base_device::set_write_r_callback(*device, DEVCB_##_devcb);
+ devcb = &sm510_base_device::set_write_r_callback(*device, DEVCB_##_devcb);
// LCD segment outputs: H1-4 as offset(low), a/b/c 1-16 as data d0-d15
#define MCFG_SM510_WRITE_SEGA_CB(_devcb) \
- sm510_base_device::set_write_sega_callback(*device, DEVCB_##_devcb);
+ devcb = &sm510_base_device::set_write_sega_callback(*device, DEVCB_##_devcb);
#define MCFG_SM510_WRITE_SEGB_CB(_devcb) \
- sm510_base_device::set_write_segb_callback(*device, DEVCB_##_devcb);
+ devcb = &sm510_base_device::set_write_segb_callback(*device, DEVCB_##_devcb);
#define MCFG_SM510_WRITE_SEGC_CB(_devcb) \
- sm510_base_device::set_write_segc_callback(*device, DEVCB_##_devcb);
+ devcb = &sm510_base_device::set_write_segc_callback(*device, DEVCB_##_devcb);
// LCD bs output: same as above, but only up to 2 bits used
#define MCFG_SM510_WRITE_SEGBS_CB(_devcb) \
- sm510_base_device::set_write_segbs_callback(*device, DEVCB_##_devcb);
+ devcb = &sm510_base_device::set_write_segbs_callback(*device, DEVCB_##_devcb);
enum
{
@@ -92,7 +92,7 @@ class sm510_base_device : public cpu_device
{
public:
// construction/destruction
- sm510_base_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, int stack_levels, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
+ sm510_base_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, int stack_levels, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
: cpu_device(mconfig, type, name, tag, owner, clock, shortname, source)
, m_program_config("program", ENDIANNESS_LITTLE, 8, prgwidth, 0, program)
, m_data_config("data", ENDIANNESS_LITTLE, 8, datawidth, 0, data)
@@ -126,11 +126,11 @@ protected:
virtual void device_reset() override;
// device_execute_interface overrides
- virtual uint64_t execute_clocks_to_cycles(uint64_t clocks) const override { return (clocks + 2 - 1) / 2; } // default 2 cycles per machine cycle
- virtual uint64_t execute_cycles_to_clocks(uint64_t cycles) const override { return (cycles * 2); } // "
- virtual uint32_t execute_min_cycles() const override { return 1; }
- virtual uint32_t execute_max_cycles() const override { return 2; }
- virtual uint32_t execute_input_lines() const override { return 1; }
+ virtual u64 execute_clocks_to_cycles(u64 clocks) const override { return (clocks + 2 - 1) / 2; } // default 2 cycles per machine cycle
+ virtual u64 execute_cycles_to_clocks(u64 cycles) const override { return (cycles * 2); } // "
+ virtual u32 execute_min_cycles() const override { return 1; }
+ virtual u32 execute_max_cycles() const override { return 2; }
+ virtual u32 execute_input_lines() const override { return 1; }
virtual void execute_set_input(int line, int state) override;
virtual void execute_run() override;
virtual void execute_one() { } // -> child class
@@ -139,8 +139,8 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return(spacenum == AS_PROGRAM) ? &m_program_config : ((spacenum == AS_DATA) ? &m_data_config : nullptr); }
// device_disasm_interface overrides
- virtual uint32_t disasm_min_opcode_bytes() const override { return 1; }
- virtual uint32_t disasm_max_opcode_bytes() const override { return 0x40; } // actually 2, but debugger doesn't like non-linear pc
+ virtual u32 disasm_min_opcode_bytes() const override { return 1; }
+ virtual u32 disasm_max_opcode_bytes() const override { return 0x40; } // actually 2, but debugger doesn't like non-linear pc
address_space_config m_program_config;
address_space_config m_data_config;
@@ -152,51 +152,51 @@ protected:
int m_prgmask;
int m_datamask;
- uint16_t m_pc, m_prev_pc;
- uint16_t m_op, m_prev_op;
- uint8_t m_param;
+ u16 m_pc, m_prev_pc;
+ u16 m_op, m_prev_op;
+ u8 m_param;
int m_stack_levels;
- uint16_t m_stack[2];
+ u16 m_stack[2];
int m_icount;
- uint8_t m_acc;
- uint8_t m_bl;
- uint8_t m_bm;
+ u8 m_acc;
+ u8 m_bl;
+ u8 m_bm;
bool m_sbm;
- uint8_t m_c;
+ u8 m_c;
bool m_skip;
- uint8_t m_w;
- uint8_t m_r;
+ u8 m_w;
+ u8 m_r;
bool m_k_active;
bool m_halt;
// lcd driver
- optional_shared_ptr<uint8_t> m_lcd_ram_a, m_lcd_ram_b, m_lcd_ram_c;
+ optional_shared_ptr<u8> m_lcd_ram_a, m_lcd_ram_b, m_lcd_ram_c;
devcb_write16 m_write_sega, m_write_segb, m_write_segc, m_write_segbs;
emu_timer *m_lcd_timer;
- uint8_t m_l, m_x;
- uint8_t m_y;
+ u8 m_l, m_x;
+ u8 m_y;
bool m_bp;
bool m_bc;
- uint16_t get_lcd_row(int column, uint8_t* ram);
+ u16 get_lcd_row(int column, u8* ram);
TIMER_CALLBACK_MEMBER(lcd_timer_cb);
virtual void init_lcd_driver();
// melody controller
- optional_region_ptr<uint8_t> m_melody_rom;
- uint8_t m_melody_rd;
- uint8_t m_melody_step_count;
- uint8_t m_melody_duty_count;
- uint8_t m_melody_duty_index;
- uint8_t m_melody_address;
+ optional_region_ptr<u8> m_melody_rom;
+ u8 m_melody_rd;
+ u8 m_melody_step_count;
+ u8 m_melody_duty_count;
+ u8 m_melody_duty_index;
+ u8 m_melody_address;
void clock_melody();
void init_melody();
// interrupt/divider
emu_timer *m_div_timer;
- uint16_t m_div;
+ u16 m_div;
bool m_1s;
bool wake_me_up();
@@ -215,12 +215,12 @@ protected:
virtual void get_opcode_param() { }
virtual void update_w_latch() { }
- uint8_t ram_r();
- void ram_w(uint8_t data);
+ u8 ram_r();
+ void ram_w(u8 data);
void pop_stack();
void push_stack();
- void do_branch(uint8_t pu, uint8_t pm, uint8_t pl);
- uint8_t bitmask(uint16_t param);
+ void do_branch(u8 pu, u8 pm, u8 pl);
+ u8 bitmask(u16 param);
// opcode handlers
virtual void op_lb();
@@ -295,10 +295,10 @@ protected:
class sm510_device : public sm510_base_device
{
public:
- sm510_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ sm510_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
protected:
- virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override;
+ virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options) override;
virtual void execute_one() override;
virtual void get_opcode_param() override;
@@ -309,11 +309,11 @@ protected:
class sm511_device : public sm510_base_device
{
public:
- sm511_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- sm511_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, int stack_levels, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source);
+ sm511_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+ sm511_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, int stack_levels, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source);
protected:
- virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override;
+ virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options) override;
virtual void execute_one() override;
virtual void get_opcode_param() override;
};
@@ -321,7 +321,7 @@ protected:
class sm512_device : public sm511_device
{
public:
- sm512_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ sm512_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
diff --git a/src/devices/cpu/sm510/sm510core.cpp b/src/devices/cpu/sm510/sm510core.cpp
index de503fcbc54..c886c178cfa 100644
--- a/src/devices/cpu/sm510/sm510core.cpp
+++ b/src/devices/cpu/sm510/sm510core.cpp
@@ -30,13 +30,13 @@ ADDRESS_MAP_END
// device definitions
-sm510_device::sm510_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+sm510_device::sm510_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: sm510_base_device(mconfig, SM510, "SM510", tag, owner, clock, 2 /* stack levels */, 12 /* prg width */, ADDRESS_MAP_NAME(program_2_7k), 7 /* data width */, ADDRESS_MAP_NAME(data_96_32x4), "sm510", __FILE__)
{ }
// disasm
-offs_t sm510_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options)
+offs_t sm510_device::disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options)
{
extern CPU_DISASSEMBLE(sm510);
return CPU_DISASSEMBLE_NAME(sm510)(this, stream, pc, oprom, opram, options);
diff --git a/src/devices/cpu/sm510/sm510d.cpp b/src/devices/cpu/sm510/sm510d.cpp
index 3929c52a82f..030b2157f63 100644
--- a/src/devices/cpu/sm510/sm510d.cpp
+++ b/src/devices/cpu/sm510/sm510d.cpp
@@ -69,7 +69,7 @@ static const char *const s_mnemonics[] =
};
// number of bits per opcode parameter, 8 or larger means 2-byte opcode
-static const uint8_t s_bits[] =
+static const u8 s_bits[] =
{
0, 8,
4, 8, 0, 0, 0, 0,
@@ -99,7 +99,7 @@ static const uint8_t s_bits[] =
#define _OVER DASMFLAG_STEP_OVER
#define _OUT DASMFLAG_STEP_OUT
-static const uint32_t s_flags[] =
+static const u32 s_flags[] =
{
0, 0,
0, 0, 0, 0, 0, 0,
@@ -127,7 +127,7 @@ static const uint32_t s_flags[] =
};
// next program counter in sequence (relative)
-static const int8_t s_next_pc[0x40] =
+static const s8 s_next_pc[0x40] =
{
32, -1 /* rollback */, -1, 30, 30, -3, -3, 28, 28, -5, -5, 26, 26, -7, -7, 24,
24, -9, -9, 22, 22, -11, -11, 20, 20, -13, -13, 18, 18, -15, -15, 16,
@@ -139,16 +139,16 @@ static const int8_t s_next_pc[0x40] =
// common disasm
-static offs_t sm510_common_disasm(const uint8_t *lut_mnemonic, const uint8_t *lut_extended, std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram)
+static offs_t sm510_common_disasm(const u8 *lut_mnemonic, const u8 *lut_extended, std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram)
{
// get raw opcode
- uint8_t op = oprom[0];
- uint8_t instr = lut_mnemonic[op];
+ u8 op = oprom[0];
+ u8 instr = lut_mnemonic[op];
int len = 1;
int bits = s_bits[instr];
- uint8_t mask = op & ((1 << (bits & 7)) - 1);
- uint16_t param = mask;
+ u8 mask = op & ((1 << (bits & 7)) - 1);
+ u16 param = mask;
if (bits >= 8)
{
// note: disasm view shows correct parameter, but raw view does not
@@ -180,7 +180,7 @@ static offs_t sm510_common_disasm(const uint8_t *lut_mnemonic, const uint8_t *lu
}
else
{
- uint16_t address = (param << 4 & 0xc00) | (mask << 6 & 0x3c0) | (param & 0x03f);
+ u16 address = (param << 4 & 0xc00) | (mask << 6 & 0x3c0) | (param & 0x03f);
util::stream_format(stream, "$%03X", address);
}
@@ -195,7 +195,7 @@ static offs_t sm510_common_disasm(const uint8_t *lut_mnemonic, const uint8_t *lu
// SM510 disasm
-static const uint8_t sm510_mnemonic[0x100] =
+static const u8 sm510_mnemonic[0x100] =
{
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
mSKIP, mATBP, mSBM, mATPL, mRM, mRM, mRM, mRM, mADD, mADD11,mCOMA, mEXBLA,mSM, mSM, mSM, mSM, // 0
@@ -227,7 +227,7 @@ CPU_DISASSEMBLE(sm510)
// SM511 disasm
-static const uint8_t sm511_mnemonic[0x100] =
+static const u8 sm511_mnemonic[0x100] =
{
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
mROT, mDTA, mSBM, mATPL, mRM, mRM, mRM, mRM, mADD, mADD11,mCOMA, mEXBLA,mSM, mSM, mSM, mSM, // 0
@@ -251,7 +251,7 @@ static const uint8_t sm511_mnemonic[0x100] =
mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM, mTM // F
};
-static const uint8_t sm511_extended[0x10] =
+static const u8 sm511_extended[0x10] =
{
mRME, mSME, mTMEL, mATFC, mBDC, mATBP, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 60 3
};
@@ -259,7 +259,7 @@ static const uint8_t sm511_extended[0x10] =
CPU_DISASSEMBLE(sm511)
{
// create extended opcode table
- uint8_t ext[0x100];
+ u8 ext[0x100];
memset(ext, 0, 0x100);
memcpy(ext + 0x30, sm511_extended, 0x10);
@@ -269,7 +269,7 @@ CPU_DISASSEMBLE(sm511)
// SM500 disasm
-static const uint8_t sm500_mnemonic[0x100] =
+static const u8 sm500_mnemonic[0x100] =
{
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
mSKIP, mATR, mEXKSA,mATBP, mRM, mRM, mRM, mRM, mADD, mADDC, mCOMA, mEXBLA,mSM, mSM, mSM, mSM, // 0
@@ -293,7 +293,7 @@ static const uint8_t sm500_mnemonic[0x100] =
mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS, mTRS // F
};
-static const uint8_t sm500_extended[0x10] =
+static const u8 sm500_extended[0x10] =
{
mCEND, 0, 0, 0, mDTA, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 5E 0
};
@@ -301,7 +301,7 @@ static const uint8_t sm500_extended[0x10] =
CPU_DISASSEMBLE(sm500)
{
// create extended opcode table
- uint8_t ext[0x100];
+ u8 ext[0x100];
memset(ext, 0, 0x100);
memcpy(ext + 0x00, sm500_extended, 0x10);
@@ -311,7 +311,7 @@ CPU_DISASSEMBLE(sm500)
// KB1013VK1-2 disasm
-static const uint8_t kb1013vk12_mnemonic[0x100] =
+static const u8 kb1013vk12_mnemonic[0x100] =
{
/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
mNOP, mOAR, mBS1, mEN, mBM0, mBM0, mBM0, mBM0, mAM, mAC, mCOM, mXL, mBM1, mBM1, mBM1, mBM1, // 0
@@ -335,7 +335,7 @@ static const uint8_t kb1013vk12_mnemonic[0x100] =
mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR, mCBR // F
};
-static const uint8_t kb1013vk12_extended[0x10] =
+static const u8 kb1013vk12_extended[0x10] =
{
mHLT, 0, 0, 0, mLDF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 5E 0
};
@@ -343,7 +343,7 @@ static const uint8_t kb1013vk12_extended[0x10] =
CPU_DISASSEMBLE(kb1013vk12)
{
// create extended opcode table
- uint8_t ext[0x100];
+ u8 ext[0x100];
memset(ext, 0, 0x100);
memcpy(ext + 0x00, kb1013vk12_extended, 0x10);
diff --git a/src/devices/cpu/sm510/sm510op.cpp b/src/devices/cpu/sm510/sm510op.cpp
index a18e39bac67..01ab9eee9d9 100644
--- a/src/devices/cpu/sm510/sm510op.cpp
+++ b/src/devices/cpu/sm510/sm510op.cpp
@@ -8,17 +8,17 @@
// internal helpers
-inline uint8_t sm510_base_device::ram_r()
+inline u8 sm510_base_device::ram_r()
{
int bmh = (m_sbm) ? (1 << (m_datawidth-1)) : 0; // from SBM
- uint8_t address = (bmh | m_bm << 4 | m_bl) & m_datamask;
+ u8 address = (bmh | m_bm << 4 | m_bl) & m_datamask;
return m_data->read_byte(address) & 0xf;
}
-inline void sm510_base_device::ram_w(uint8_t data)
+inline void sm510_base_device::ram_w(u8 data)
{
int bmh = (m_sbm) ? (1 << (m_datawidth-1)) : 0; // from SBM
- uint8_t address = (bmh | m_bm << 4 | m_bl) & m_datamask;
+ u8 address = (bmh | m_bm << 4 | m_bl) & m_datamask;
m_data->write_byte(address, data & 0xf);
}
@@ -36,13 +36,13 @@ void sm510_base_device::push_stack()
m_stack[0] = m_pc;
}
-void sm510_base_device::do_branch(uint8_t pu, uint8_t pm, uint8_t pl)
+void sm510_base_device::do_branch(u8 pu, u8 pm, u8 pl)
{
// set new PC(Pu/Pm/Pl)
m_pc = ((pu << 10 & 0xc00) | (pm << 6 & 0x3c0) | (pl & 0x03f)) & m_prgmask;
}
-inline uint8_t sm510_base_device::bitmask(uint16_t param)
+inline u8 sm510_base_device::bitmask(u16 param)
{
// bitmask from immediate opcode param
return 1 << (param & 3);
@@ -64,7 +64,7 @@ void sm510_base_device::op_lb()
m_bl = (m_op >> 2 & 3);
// bl(high) is still unclear, official doc is confusing
- uint8_t hi = 0;
+ u8 hi = 0;
switch (m_bl)
{
case 0: hi = 0; break;
@@ -90,7 +90,7 @@ void sm510_base_device::op_sbm()
void sm510_base_device::op_exbla()
{
// EXBLA: exchange BL with ACC
- uint8_t a = m_acc;
+ u8 a = m_acc;
m_acc = m_bl;
m_bl = a;
}
@@ -155,7 +155,7 @@ void sm510_base_device::op_tm()
// TM x: indirect subroutine call, pointers(IDX) are in page 0
m_icount--;
push_stack();
- uint8_t idx = m_program->read_byte(m_op & 0x3f);
+ u8 idx = m_program->read_byte(m_op & 0x3f);
do_branch(idx >> 6 & 3, 4, idx & 0x3f);
}
@@ -166,7 +166,7 @@ void sm510_base_device::op_tm()
void sm510_base_device::op_exc()
{
// EXC x: exchange ACC with RAM, xor BM with x
- uint8_t a = m_acc;
+ u8 a = m_acc;
m_acc = ram_r();
ram_w(a);
m_bm ^= (m_op & 3);
@@ -304,7 +304,7 @@ void sm510_base_device::op_coma()
void sm510_base_device::op_rot()
{
// ROT: rotate ACC right through carry
- uint8_t c = m_acc & 1;
+ u8 c = m_acc & 1;
m_acc = m_acc >> 1 | m_c << 3;
m_c = c;
}
diff --git a/src/devices/cpu/sm510/sm511core.cpp b/src/devices/cpu/sm510/sm511core.cpp
index ce134b24588..a241ef09b52 100644
--- a/src/devices/cpu/sm510/sm511core.cpp
+++ b/src/devices/cpu/sm510/sm511core.cpp
@@ -35,7 +35,7 @@ ADDRESS_MAP_END
// disasm
-offs_t sm511_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options)
+offs_t sm511_device::disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options)
{
extern CPU_DISASSEMBLE(sm511);
return CPU_DISASSEMBLE_NAME(sm511)(this, stream, pc, oprom, opram, options);
@@ -43,15 +43,15 @@ offs_t sm511_device::disasm_disassemble(std::ostream &stream, offs_t pc, const u
// device definitions
-sm511_device::sm511_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+sm511_device::sm511_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: sm510_base_device(mconfig, SM511, "SM511", tag, owner, clock, 2 /* stack levels */, 12 /* prg width */, ADDRESS_MAP_NAME(program_4k), 7 /* data width */, ADDRESS_MAP_NAME(data_96_32x4), "sm511", __FILE__)
{ }
-sm511_device::sm511_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, int stack_levels, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
+sm511_device::sm511_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, int stack_levels, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
: sm510_base_device(mconfig, type, name, tag, owner, clock, stack_levels, prgwidth, program, datawidth, data, shortname, source)
{ }
-sm512_device::sm512_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+sm512_device::sm512_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: sm511_device(mconfig, SM512, "SM512", tag, owner, clock, 2, 12, ADDRESS_MAP_NAME(program_4k), 7, ADDRESS_MAP_NAME(data_80_48x4), "sm512", __FILE__)
{ }
diff --git a/src/devices/cpu/sm8500/sm8500.h b/src/devices/cpu/sm8500/sm8500.h
index eb0c1f9f703..5baeed1cd66 100644
--- a/src/devices/cpu/sm8500/sm8500.h
+++ b/src/devices/cpu/sm8500/sm8500.h
@@ -6,10 +6,10 @@
#define __SM8500_H__
#define MCFG_SM8500_DMA_CB(_devcb) \
- sm8500_cpu_device::set_dma_cb(*device, DEVCB_##_devcb);
+ devcb = &sm8500_cpu_device::set_dma_cb(*device, DEVCB_##_devcb);
#define MCFG_SM8500_TIMER_CB(_devcb) \
- sm8500_cpu_device::set_timer_cb(*device, DEVCB_##_devcb);
+ devcb = &sm8500_cpu_device::set_timer_cb(*device, DEVCB_##_devcb);
enum
{
diff --git a/src/devices/cpu/superfx/superfx.h b/src/devices/cpu/superfx/superfx.h
index 7f04f44171c..13dd042ffea 100644
--- a/src/devices/cpu/superfx/superfx.h
+++ b/src/devices/cpu/superfx/superfx.h
@@ -87,7 +87,7 @@ enum
#define MCFG_SUPERFX_OUT_IRQ(_devcb) \
- superfx_device::set_out_irq_func(*device, DEVCB_##_devcb);
+ devcb = &superfx_device::set_out_irq_func(*device, DEVCB_##_devcb);
class superfx_device : public cpu_device
diff --git a/src/devices/cpu/t11/t11.h b/src/devices/cpu/t11/t11.h
index bad743a7645..a25f35f1a17 100644
--- a/src/devices/cpu/t11/t11.h
+++ b/src/devices/cpu/t11/t11.h
@@ -32,7 +32,7 @@ enum
t11_device::set_initial_mode(*device, _mode);
#define MCFG_T11_RESET(_devcb) \
- t11_device::set_out_reset_func(*device, DEVCB_##_devcb);
+ devcb = &t11_device::set_out_reset_func(*device, DEVCB_##_devcb);
class t11_device : public cpu_device
{
diff --git a/src/devices/cpu/tlcs900/tlcs900.h b/src/devices/cpu/tlcs900/tlcs900.h
index 12e6f8f1914..6c922ce66dc 100644
--- a/src/devices/cpu/tlcs900/tlcs900.h
+++ b/src/devices/cpu/tlcs900/tlcs900.h
@@ -615,22 +615,38 @@ protected:
void _F0();
};
-#define MCFG_TMP95C061_PORT1_READ( _port_read ) tmp95c061_device::set_port1_read( *device, DEVCB_##_port_read );
-#define MCFG_TMP95C061_PORT1_WRITE( _port_write ) tmp95c061_device::set_port1_write( *device, DEVCB_##_port_write );
-#define MCFG_TMP95C061_PORT2_WRITE( _port_write ) tmp95c061_device::set_port2_write( *device, DEVCB_##_port_write );
-#define MCFG_TMP95C061_PORT5_READ( _port_read ) tmp95c061_device::set_port5_read( *device, DEVCB_##_port_read );
-#define MCFG_TMP95C061_PORT5_WRITE( _port_write ) tmp95c061_device::set_port5_write( *device, DEVCB_##_port_write );
-#define MCFG_TMP95C061_PORT6_READ( _port_read ) tmp95c061_device::set_port6_read( *device, DEVCB_##_port_read );
-#define MCFG_TMP95C061_PORT6_WRITE( _port_write ) tmp95c061_device::set_port6_write( *device, DEVCB_##_port_write );
-#define MCFG_TMP95C061_PORT7_READ( _port_read ) tmp95c061_device::set_port7_read( *device, DEVCB_##_port_read );
-#define MCFG_TMP95C061_PORT7_WRITE( _port_write ) tmp95c061_device::set_port7_write( *device, DEVCB_##_port_write );
-#define MCFG_TMP95C061_PORT8_READ( _port_read ) tmp95c061_device::set_port8_read( *device, DEVCB_##_port_read );
-#define MCFG_TMP95C061_PORT8_WRITE( _port_write ) tmp95c061_device::set_port8_write( *device, DEVCB_##_port_write );
-#define MCFG_TMP95C061_PORT9_READ( _port_read ) tmp95c061_device::set_port9_read( *device, DEVCB_##_port_read );
-#define MCFG_TMP95C061_PORTA_READ( _port_read ) tmp95c061_device::set_porta_read( *device, DEVCB_##_port_read );
-#define MCFG_TMP95C061_PORTA_WRITE( _port_write ) tmp95c061_device::set_porta_write( *device, DEVCB_##_port_write );
-#define MCFG_TMP95C061_PORTB_READ( _port_read ) tmp95c061_device::set_portb_read( *device, DEVCB_##_port_read );
-#define MCFG_TMP95C061_PORTB_WRITE( _port_write ) tmp95c061_device::set_portb_write( *device, DEVCB_##_port_write );
+#define MCFG_TMP95C061_PORT1_READ( _port_read ) \
+ devcb = &tmp95c061_device::set_port1_read( *device, DEVCB_##_port_read );
+#define MCFG_TMP95C061_PORT1_WRITE( _port_write ) \
+ devcb = &tmp95c061_device::set_port1_write( *device, DEVCB_##_port_write );
+#define MCFG_TMP95C061_PORT2_WRITE( _port_write ) \
+ devcb = &tmp95c061_device::set_port2_write( *device, DEVCB_##_port_write );
+#define MCFG_TMP95C061_PORT5_READ( _port_read ) \
+ devcb = &tmp95c061_device::set_port5_read( *device, DEVCB_##_port_read );
+#define MCFG_TMP95C061_PORT5_WRITE( _port_write ) \
+ devcb = &tmp95c061_device::set_port5_write( *device, DEVCB_##_port_write );
+#define MCFG_TMP95C061_PORT6_READ( _port_read ) \
+ devcb = &tmp95c061_device::set_port6_read( *device, DEVCB_##_port_read );
+#define MCFG_TMP95C061_PORT6_WRITE( _port_write ) \
+ devcb = &tmp95c061_device::set_port6_write( *device, DEVCB_##_port_write );
+#define MCFG_TMP95C061_PORT7_READ( _port_read ) \
+ devcb = &tmp95c061_device::set_port7_read( *device, DEVCB_##_port_read );
+#define MCFG_TMP95C061_PORT7_WRITE( _port_write ) \
+ devcb = &tmp95c061_device::set_port7_write( *device, DEVCB_##_port_write );
+#define MCFG_TMP95C061_PORT8_READ( _port_read ) \
+ devcb = &tmp95c061_device::set_port8_read( *device, DEVCB_##_port_read );
+#define MCFG_TMP95C061_PORT8_WRITE( _port_write ) \
+ devcb = &mp95c061_device::set_port8_write( *device, DEVCB_##_port_write );
+#define MCFG_TMP95C061_PORT9_READ( _port_read ) \
+ devcb = &tmp95c061_device::set_port9_read( *device, DEVCB_##_port_read );
+#define MCFG_TMP95C061_PORTA_READ( _port_read ) \
+ devcb = &tmp95c061_device::set_porta_read( *device, DEVCB_##_port_read );
+#define MCFG_TMP95C061_PORTA_WRITE( _port_write ) \
+ devcb = &tmp95c061_device::set_porta_write( *device, DEVCB_##_port_write );
+#define MCFG_TMP95C061_PORTB_READ( _port_read ) \
+ devcb = &tmp95c061_device::set_portb_read( *device, DEVCB_##_port_read );
+#define MCFG_TMP95C061_PORTB_WRITE( _port_write ) \
+ devcb = &tmp95c061_device::set_portb_write( *device, DEVCB_##_port_write );
class tmp95c061_device : public tlcs900h_device
{
diff --git a/src/devices/cpu/tms1000/tms0270.cpp b/src/devices/cpu/tms1000/tms0270.cpp
index edb9512518d..8c09fa49bea 100644
--- a/src/devices/cpu/tms1000/tms0270.cpp
+++ b/src/devices/cpu/tms1000/tms0270.cpp
@@ -32,7 +32,7 @@ ADDRESS_MAP_END
// device definitions
-tms0270_cpu_device::tms0270_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+tms0270_cpu_device::tms0270_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: tms0980_cpu_device(mconfig, TMS0270, "TMS0270", tag, owner, clock, 16 /* o pins */, 16 /* r pins */, 7 /* pc bits */, 9 /* byte width */, 4 /* x width */, 12 /* prg width */, ADDRESS_MAP_NAME(program_11bit_9), 8 /* data width */, ADDRESS_MAP_NAME(data_144x4), "tms0270", __FILE__)
, m_read_ctl(*this)
, m_write_ctl(*this)
@@ -145,14 +145,14 @@ void tms0270_cpu_device::dynamic_output()
}
}
-uint8_t tms0270_cpu_device::read_k_input()
+u8 tms0270_cpu_device::read_k_input()
{
// external: TMS5100 CTL port via SEG G,B,C,D
if (m_chipsel)
return (m_ctl_dir) ? m_ctl_out : m_read_ctl(0, 0xff) & 0xf;
// standard K-input otherwise
- uint8_t k = m_read_k(0, 0xff) & 0x1f;
+ u8 k = m_read_k(0, 0xff) & 0x1f;
return (k & 0x10) ? 0xf : k; // the TMS0270 KF line asserts all K-inputs
}
diff --git a/src/devices/cpu/tms1000/tms0270.h b/src/devices/cpu/tms1000/tms0270.h
index 77f596cda84..b60395c6329 100644
--- a/src/devices/cpu/tms1000/tms0270.h
+++ b/src/devices/cpu/tms1000/tms0270.h
@@ -14,19 +14,19 @@
// TMS0270 was designed to interface with TMS5100, set it up at driver level
#define MCFG_TMS0270_READ_CTL_CB(_devcb) \
- tms0270_cpu_device::set_read_ctl_callback(*device, DEVCB_##_devcb);
+ devcb = &tms0270_cpu_device::set_read_ctl_callback(*device, DEVCB_##_devcb);
#define MCFG_TMS0270_WRITE_CTL_CB(_devcb) \
- tms0270_cpu_device::set_write_ctl_callback(*device, DEVCB_##_devcb);
+ devcb = &tms0270_cpu_device::set_write_ctl_callback(*device, DEVCB_##_devcb);
#define MCFG_TMS0270_WRITE_PDC_CB(_devcb) \
- tms0270_cpu_device::set_write_pdc_callback(*device, DEVCB_##_devcb);
+ devcb = &tms0270_cpu_device::set_write_pdc_callback(*device, DEVCB_##_devcb);
class tms0270_cpu_device : public tms0980_cpu_device
{
public:
- tms0270_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ tms0270_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
// static configuration helpers
template<class _Object> static devcb_base &set_read_ctl_callback(device_t &device, _Object object) { return downcast<tms0270_cpu_device &>(device).m_read_ctl.set_callback(object); }
@@ -40,8 +40,8 @@ protected:
virtual machine_config_constructor device_mconfig_additions() const override;
- virtual void write_o_output(uint8_t index) override { tms1k_base_device::write_o_output(index); }
- virtual uint8_t read_k_input() override;
+ virtual void write_o_output(u8 index) override { tms1k_base_device::write_o_output(index); }
+ virtual u8 read_k_input() override;
virtual void dynamic_output() override;
virtual void op_setr() override;
@@ -50,15 +50,15 @@ protected:
private:
// state specific to interface with TMS5100
- uint16_t m_r_prev;
- uint8_t m_chipsel;
- uint8_t m_ctl_out;
- uint8_t m_ctl_dir;
- int m_pdc;
-
- uint8_t m_o_latch_low;
- uint8_t m_o_latch;
- uint8_t m_o_latch_prev;
+ u16 m_r_prev;
+ u8 m_chipsel;
+ u8 m_ctl_out;
+ u8 m_ctl_dir;
+ int m_pdc;
+
+ u8 m_o_latch_low;
+ u8 m_o_latch;
+ u8 m_o_latch_prev;
devcb_read8 m_read_ctl;
devcb_write8 m_write_ctl;
diff --git a/src/devices/cpu/tms1000/tms0970.cpp b/src/devices/cpu/tms1000/tms0970.cpp
index b24f1ba6774..0f67ffa4055 100644
--- a/src/devices/cpu/tms1000/tms0970.cpp
+++ b/src/devices/cpu/tms1000/tms0970.cpp
@@ -36,19 +36,19 @@ ADDRESS_MAP_END
// device definitions
-tms0970_cpu_device::tms0970_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+tms0970_cpu_device::tms0970_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: tms1000_cpu_device(mconfig, TMS0970, "TMS0970", tag, owner, clock, 8 /* o pins */, 11 /* r pins */, 6 /* pc bits */, 8 /* byte width */, 2 /* x width */, 10 /* prg width */, ADDRESS_MAP_NAME(program_10bit_8), 6 /* data width */, ADDRESS_MAP_NAME(data_64x4), "tms0970", __FILE__)
{ }
-tms0970_cpu_device::tms0970_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint8_t o_pins, uint8_t r_pins, uint8_t pc_bits, uint8_t byte_bits, uint8_t x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
+tms0970_cpu_device::tms0970_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, u8 o_pins, u8 r_pins, u8 pc_bits, u8 byte_bits, u8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
: tms1000_cpu_device(mconfig, type, name, tag, owner, clock, o_pins, r_pins, pc_bits, byte_bits, x_bits, prgwidth, program, datawidth, data, shortname, source)
{ }
-tms0950_cpu_device::tms0950_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+tms0950_cpu_device::tms0950_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: tms0970_cpu_device(mconfig, TMS0950, "TMS0950", tag, owner, clock, 8, 11, 6, 8, 2, 10, ADDRESS_MAP_NAME(program_10bit_8), 6, ADDRESS_MAP_NAME(data_64x4), "tms0950", __FILE__)
{ }
-tms1990_cpu_device::tms1990_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+tms1990_cpu_device::tms1990_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: tms0970_cpu_device(mconfig, TMS1990, "TMS1990", tag, owner, clock, 8, 11, 6, 8, 2, 10, ADDRESS_MAP_NAME(program_10bit_8), 6, ADDRESS_MAP_NAME(data_64x4), "tms1990", __FILE__)
{ }
@@ -97,9 +97,9 @@ void tms0970_cpu_device::device_reset()
// pre-decode instructionset
m_fixed_decode.resize(0x100);
- memset(&m_fixed_decode[0], 0, 0x100*sizeof(uint32_t));
+ memset(&m_fixed_decode[0], 0, 0x100*sizeof(u32));
m_micro_decode.resize(0x100);
- memset(&m_micro_decode[0], 0, 0x100*sizeof(uint32_t));
+ memset(&m_micro_decode[0], 0, 0x100*sizeof(u32));
for (int op = 0; op < 0x100; op++)
{
@@ -108,26 +108,26 @@ void tms0970_cpu_device::device_reset()
m_fixed_decode[op] = (op & 0x40) ? F_CALL: F_BR;
// 5 output bits select a microinstruction index
- uint32_t imask = m_ipla->read(op);
- uint8_t msel = imask & 0x1f;
+ u32 imask = m_ipla->read(op);
+ u8 msel = imask & 0x1f;
// but if (from bottom to top) term 1 is active and output bit 5 is 0, R2,R4-R7 directly select a microinstruction index
if (imask & 0x40 && (imask & 0x20) == 0)
msel = (op & 0xf) | (op >> 1 & 0x10);
msel = BITSWAP8(msel,7,6,5,0,1,2,3,4); // lines are reversed
- uint32_t mmask = m_mpla->read(msel);
+ u32 mmask = m_mpla->read(msel);
mmask ^= 0x09fe; // invert active-negative
- // _____ _____ _____ _____ ______ _____ ______ _____ _____
- const uint32_t md[15] = { M_CKM, M_CKP, M_YTP, M_MTP, M_ATN, M_NATN, M_MTN, M_15TN, M_CKN, M_NE, M_C8, M_CIN, M_AUTA, M_AUTY, M_STO };
+ // _____ _____ _____ _____ ______ _____ ______ _____ _____
+ const u32 md[15] = { M_CKM, M_CKP, M_YTP, M_MTP, M_ATN, M_NATN, M_MTN, M_15TN, M_CKN, M_NE, M_C8, M_CIN, M_AUTA, M_AUTY, M_STO };
for (int bit = 0; bit < 15; bit++)
if (mmask & (1 << bit))
m_micro_decode[op] |= md[bit];
// the other ipla terms each select a fixed instruction
- const uint32_t id[8] = { F_LDP, F_TDO, F_COMX, F_LDX, F_SBIT, F_RBIT, F_SETR, F_RETN };
+ const u32 id[8] = { F_LDP, F_TDO, F_COMX, F_LDX, F_SBIT, F_RBIT, F_SETR, F_RETN };
for (int bit = 0; bit < 8; bit++)
if (imask & (0x80 << bit))
@@ -137,7 +137,7 @@ void tms0970_cpu_device::device_reset()
// i/o handling
-void tms0970_cpu_device::write_o_output(uint8_t index)
+void tms0970_cpu_device::write_o_output(u8 index)
{
m_o_index = index;
m_o = m_spla->read(index);
@@ -150,7 +150,7 @@ void tms0970_cpu_device::op_setr()
{
// SETR: set output register
// DDIG line is a coincidence between the selected output pla row(s) and segment pla row(s)
- int ddig = (m_opla->read(m_a) & m_o) ? 1 : 0;
+ int ddig = (~m_opla->read(m_a) & m_o) ? 0 : 1;
m_r = (m_r & ~(1 << m_y)) | (ddig << m_y);
}
diff --git a/src/devices/cpu/tms1000/tms0970.h b/src/devices/cpu/tms1000/tms0970.h
index 360e30a42cb..ca436163374 100644
--- a/src/devices/cpu/tms1000/tms0970.h
+++ b/src/devices/cpu/tms1000/tms0970.h
@@ -15,15 +15,15 @@
class tms0970_cpu_device : public tms1000_cpu_device
{
public:
- tms0970_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- tms0970_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint8_t o_pins, uint8_t r_pins, uint8_t pc_bits, uint8_t byte_bits, uint8_t x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source);
+ tms0970_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+ tms0970_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, u8 o_pins, u8 r_pins, u8 pc_bits, u8 byte_bits, u8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source);
protected:
// overrides
virtual void device_reset() override;
virtual machine_config_constructor device_mconfig_additions() const override;
- virtual void write_o_output(uint8_t index) override;
+ virtual void write_o_output(u8 index) override;
virtual void op_setr() override;
virtual void op_tdo() override;
@@ -32,7 +32,7 @@ protected:
class tms0950_cpu_device : public tms0970_cpu_device
{
public:
- tms0950_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ tms0950_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
protected:
// overrides
@@ -46,7 +46,7 @@ protected:
class tms1990_cpu_device : public tms0970_cpu_device
{
public:
- tms1990_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ tms1990_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
diff --git a/src/devices/cpu/tms1000/tms0980.cpp b/src/devices/cpu/tms1000/tms0980.cpp
index 5e9ea00d178..cb4a00adbde 100644
--- a/src/devices/cpu/tms1000/tms0980.cpp
+++ b/src/devices/cpu/tms1000/tms0980.cpp
@@ -40,15 +40,15 @@ ADDRESS_MAP_END
// device definitions
-tms0980_cpu_device::tms0980_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+tms0980_cpu_device::tms0980_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: tms0970_cpu_device(mconfig, TMS0980, "TMS0980", tag, owner, clock, 8 /* o pins */, 9 /* r pins */, 7 /* pc bits */, 9 /* byte width */, 4 /* x width */, 12 /* prg width */, ADDRESS_MAP_NAME(program_11bit_9), 8 /* data width */, ADDRESS_MAP_NAME(data_144x4), "tms0980", __FILE__)
{ }
-tms0980_cpu_device::tms0980_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint8_t o_pins, uint8_t r_pins, uint8_t pc_bits, uint8_t byte_bits, uint8_t x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
+tms0980_cpu_device::tms0980_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, u8 o_pins, u8 r_pins, u8 pc_bits, u8 byte_bits, u8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
: tms0970_cpu_device(mconfig, type, name, tag, owner, clock, o_pins, r_pins, pc_bits, byte_bits, x_bits, prgwidth, program, datawidth, data, shortname, source)
{ }
-tms1980_cpu_device::tms1980_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+tms1980_cpu_device::tms1980_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: tms0980_cpu_device(mconfig, TMS1980, "TMS1980", tag, owner, clock, 7, 10, 7, 9, 4, 12, ADDRESS_MAP_NAME(program_11bit_9), 8, ADDRESS_MAP_NAME(data_144x4), "tms1980", __FILE__)
{ }
@@ -90,7 +90,7 @@ machine_config_constructor tms1980_cpu_device::device_mconfig_additions() const
// disasm
-offs_t tms0980_cpu_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options)
+offs_t tms0980_cpu_device::disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options)
{
extern CPU_DISASSEMBLE(tms0980);
return CPU_DISASSEMBLE_NAME(tms0980)(this, stream, pc, oprom, opram, options);
@@ -98,13 +98,13 @@ offs_t tms0980_cpu_device::disasm_disassemble(std::ostream &stream, offs_t pc, c
// device_reset
-uint32_t tms0980_cpu_device::decode_fixed(uint16_t op)
+u32 tms0980_cpu_device::decode_fixed(u16 op)
{
- uint32_t decode = 0;
- uint32_t mask = m_ipla->read(op);
+ u32 decode = 0;
+ u32 mask = m_ipla->read(op);
// 1 line per PLA row, no OR-mask
- const uint32_t id[15] = { F_LDP, F_SBL, F_OFF, F_RBIT, F_SAL, F_XDA, F_REAC, F_SETR, F_RETN, F_SBIT, F_TDO, F_COMX8, F_COMX, F_LDX, F_SEAC };
+ const u32 id[15] = { F_LDP, F_SBL, F_OFF, F_RBIT, F_SAL, F_XDA, F_REAC, F_SETR, F_RETN, F_SBIT, F_TDO, F_COMX8, F_COMX, F_LDX, F_SEAC };
for (int bit = 0; bit < 15; bit++)
if (mask & (0x80 << bit))
@@ -113,17 +113,17 @@ uint32_t tms0980_cpu_device::decode_fixed(uint16_t op)
return decode;
}
-uint32_t tms0980_cpu_device::decode_micro(uint8_t sel)
+u32 tms0980_cpu_device::decode_micro(u8 sel)
{
- uint32_t decode = 0;
+ u32 decode = 0;
sel = BITSWAP8(sel,7,6,0,1,2,3,4,5); // lines are reversed
- uint32_t mask = m_mpla->read(sel);
+ u32 mask = m_mpla->read(sel);
mask ^= 0x43fc3; // invert active-negative
// M_RSTR is specific to TMS02x0/TMS1980, it redirects to F_RSTR
// M_UNK1 is specific to TMS0270, unknown/unused yet and apparently not connected on every TMS0270
- // _______ ______ _____ _____ _____ _____ ______ _____ ______ _____ _____
- const uint32_t md[22] = { M_NDMTP, M_DMTP, M_AUTY, M_AUTA, M_CKM, M_SSE, M_CKP, M_YTP, M_MTP, M_ATN, M_NATN, M_MTN, M_15TN, M_CKN, M_NE, M_C8, M_SSS, M_CME, M_CIN, M_STO, M_RSTR, M_UNK1 };
+ // _______ ______ _____ _____ _____ _____ ______ _____ ______ _____ _____
+ const u32 md[22] = { M_NDMTP, M_DMTP, M_AUTY, M_AUTA, M_CKM, M_SSE, M_CKP, M_YTP, M_MTP, M_ATN, M_NATN, M_MTN, M_15TN, M_CKN, M_NE, M_C8, M_SSS, M_CME, M_CIN, M_STO, M_RSTR, M_UNK1 };
for (int bit = 0; bit < 22 && bit < m_mpla->outputs(); bit++)
if (mask & (1 << bit))
@@ -139,11 +139,11 @@ void tms0980_cpu_device::device_reset()
// pre-decode instructionset
m_fixed_decode.resize(0x200);
- memset(&m_fixed_decode[0], 0, 0x200*sizeof(uint32_t));
+ memset(&m_fixed_decode[0], 0, 0x200*sizeof(u32));
m_micro_decode.resize(0x200);
- memset(&m_micro_decode[0], 0, 0x200*sizeof(uint32_t));
+ memset(&m_micro_decode[0], 0, 0x200*sizeof(u32));
- for (uint16_t op = 0; op < 0x200; op++)
+ for (u16 op = 0; op < 0x200; op++)
{
// upper half of the opcodes is always branch/call
if (op & 0x100)
@@ -159,7 +159,7 @@ void tms0980_cpu_device::device_reset()
// like on TMS0970, one of the terms directly select a microinstruction index (via R4-R8),
// but it can't be pre-determined when it's active
m_micro_direct.resize(0x40);
- memset(&m_micro_decode[0], 0, 0x40*sizeof(uint32_t));
+ memset(&m_micro_decode[0], 0, 0x40*sizeof(u32));
for (int op = 0; op < 0x40; op++)
m_micro_direct[op] = decode_micro(op);
@@ -167,7 +167,7 @@ void tms0980_cpu_device::device_reset()
// program counter/opcode decode
-uint32_t tms0980_cpu_device::read_micro()
+u32 tms0980_cpu_device::read_micro()
{
// if ipla term 0 is active, R4-R8 directly select a microinstruction index when R0 or R0^BL is 0
int r0 = m_opcode >> 8 & 1;
@@ -195,10 +195,10 @@ void tms0980_cpu_device::read_opcode()
// i/o handling
-uint8_t tms0980_cpu_device::read_k_input()
+u8 tms0980_cpu_device::read_k_input()
{
- uint8_t k = m_read_k(0, 0xff) & 0x1f;
- uint8_t k3 = (k & 0x10) ? 3: 0; // the TMS0980 K3 line is simply K1|K2
+ u8 k = m_read_k(0, 0xff) & 0x1f;
+ u8 k3 = (k & 0x10) ? 3: 0; // the TMS0980 K3 line is simply K1|K2
return (k & 0xf) | k3;
}
diff --git a/src/devices/cpu/tms1000/tms0980.h b/src/devices/cpu/tms1000/tms0980.h
index afbcaa3647d..24ef6c000ad 100644
--- a/src/devices/cpu/tms1000/tms0980.h
+++ b/src/devices/cpu/tms1000/tms0980.h
@@ -15,24 +15,24 @@
class tms0980_cpu_device : public tms0970_cpu_device
{
public:
- tms0980_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- tms0980_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint8_t o_pins, uint8_t r_pins, uint8_t pc_bits, uint8_t byte_bits, uint8_t x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source);
+ tms0980_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+ tms0980_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, u8 o_pins, u8 r_pins, u8 pc_bits, u8 byte_bits, u8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source);
protected:
// overrides
- virtual uint32_t decode_fixed(uint16_t op);
- virtual uint32_t decode_micro(uint8_t sel);
+ virtual u32 decode_fixed(u16 op);
+ virtual u32 decode_micro(u8 sel);
virtual void device_reset() override;
virtual machine_config_constructor device_mconfig_additions() const override;
- virtual uint32_t disasm_min_opcode_bytes() const override { return 2; }
- virtual uint32_t disasm_max_opcode_bytes() const override { return 2; }
- virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override;
+ virtual u32 disasm_min_opcode_bytes() const override { return 2; }
+ virtual u32 disasm_max_opcode_bytes() const override { return 2; }
+ virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options) override;
- virtual uint8_t read_k_input() override;
+ virtual u8 read_k_input() override;
virtual void set_cki_bus() override;
- virtual uint32_t read_micro();
+ virtual u32 read_micro();
virtual void read_opcode() override;
virtual void op_comx() override;
@@ -41,14 +41,14 @@ protected:
class tms1980_cpu_device : public tms0980_cpu_device
{
public:
- tms1980_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ tms1980_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
protected:
// overrides
virtual machine_config_constructor device_mconfig_additions() const override;
- virtual void write_o_output(uint8_t index) override { tms1k_base_device::write_o_output(index); }
- virtual uint8_t read_k_input() override { return tms1k_base_device::read_k_input(); }
+ virtual void write_o_output(u8 index) override { tms1k_base_device::write_o_output(index); }
+ virtual u8 read_k_input() override { return tms1k_base_device::read_k_input(); }
virtual void op_setr() override { tms1k_base_device::op_setr(); }
virtual void op_tdo() override;
diff --git a/src/devices/cpu/tms1000/tms1000.cpp b/src/devices/cpu/tms1000/tms1000.cpp
index 05ff12e03c6..a971b3e01b8 100644
--- a/src/devices/cpu/tms1000/tms1000.cpp
+++ b/src/devices/cpu/tms1000/tms1000.cpp
@@ -47,31 +47,31 @@ ADDRESS_MAP_END
// device definitions
-tms1000_cpu_device::tms1000_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+tms1000_cpu_device::tms1000_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: tms1k_base_device(mconfig, TMS1000, "TMS1000", tag, owner, clock, 8 /* o pins */, 11 /* r pins */, 6 /* pc bits */, 8 /* byte width */, 2 /* x width */, 10 /* prg width */, ADDRESS_MAP_NAME(program_10bit_8), 6 /* data width */, ADDRESS_MAP_NAME(data_64x4), "tms1000", __FILE__)
{ }
-tms1000_cpu_device::tms1000_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint8_t o_pins, uint8_t r_pins, uint8_t pc_bits, uint8_t byte_bits, uint8_t x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
+tms1000_cpu_device::tms1000_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, u8 o_pins, u8 r_pins, u8 pc_bits, u8 byte_bits, u8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
: tms1k_base_device(mconfig, type, name, tag, owner, clock, o_pins, r_pins, pc_bits, byte_bits, x_bits, prgwidth, program, datawidth, data, shortname, source)
{ }
-tms1070_cpu_device::tms1070_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+tms1070_cpu_device::tms1070_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: tms1000_cpu_device(mconfig, TMS1070, "TMS1070", tag, owner, clock, 8, 11, 6, 8, 2, 10, ADDRESS_MAP_NAME(program_10bit_8), 6, ADDRESS_MAP_NAME(data_64x4), "tms1070", __FILE__)
{ }
-tms1040_cpu_device::tms1040_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+tms1040_cpu_device::tms1040_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: tms1000_cpu_device(mconfig, TMS1040, "TMS1040", tag, owner, clock, 8, 11, 6, 8, 2, 10, ADDRESS_MAP_NAME(program_10bit_8), 6, ADDRESS_MAP_NAME(data_64x4), "tms1040", __FILE__)
{ }
-tms1200_cpu_device::tms1200_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+tms1200_cpu_device::tms1200_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: tms1000_cpu_device(mconfig, TMS1200, "TMS1200", tag, owner, clock, 8, 13, 6, 8, 2, 10, ADDRESS_MAP_NAME(program_10bit_8), 6, ADDRESS_MAP_NAME(data_64x4), "tms1200", __FILE__)
{ }
-tms1700_cpu_device::tms1700_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+tms1700_cpu_device::tms1700_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: tms1000_cpu_device(mconfig, TMS1700, "TMS1700", tag, owner, clock, 8, 9, 6, 8, 2, 10, ADDRESS_MAP_NAME(program_9bit_8), 6, ADDRESS_MAP_NAME(data_32x4), "tms1700", __FILE__)
{ }
-tms1730_cpu_device::tms1730_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+tms1730_cpu_device::tms1730_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: tms1000_cpu_device(mconfig, TMS1730, "TMS1730", tag, owner, clock, 8, 9, 6, 8, 2, 10, ADDRESS_MAP_NAME(program_9bit_8), 6, ADDRESS_MAP_NAME(data_32x4), "tms1730", __FILE__)
{ }
@@ -93,7 +93,7 @@ machine_config_constructor tms1000_cpu_device::device_mconfig_additions() const
// disasm
-offs_t tms1000_cpu_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options)
+offs_t tms1000_cpu_device::disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options)
{
extern CPU_DISASSEMBLE(tms1000);
return CPU_DISASSEMBLE_NAME(tms1000)(this, stream, pc, oprom, opram, options);
@@ -108,15 +108,15 @@ void tms1000_cpu_device::device_reset()
// pre-decode instructionset
m_fixed_decode.resize(0x100);
- memset(&m_fixed_decode[0], 0, 0x100*sizeof(uint32_t));
+ memset(&m_fixed_decode[0], 0, 0x100*sizeof(u32));
m_micro_decode.resize(0x100);
- memset(&m_micro_decode[0], 0, 0x100*sizeof(uint32_t));
+ memset(&m_micro_decode[0], 0, 0x100*sizeof(u32));
for (int op = 0; op < 0x100; op++)
{
- // _____ _____ ______ _____ ______ _____ _____ _____ _____
- const uint32_t md[16] = { M_STSL, M_AUTY, M_AUTA, M_CIN, M_C8, M_NE, M_CKN, M_15TN, M_MTN, M_NATN, M_ATN, M_MTP, M_YTP, M_CKP, M_CKM, M_STO };
- uint16_t mask = m_mpla->read(op);
+ // _____ _____ ______ _____ ______ _____ _____ _____ _____
+ const u32 md[16] = { M_STSL, M_AUTY, M_AUTA, M_CIN, M_C8, M_NE, M_CKN, M_15TN, M_MTN, M_NATN, M_ATN, M_MTP, M_YTP, M_CKP, M_CKM, M_STO };
+ u16 mask = m_mpla->read(op);
mask ^= 0x3fc8; // invert active-negative
for (int bit = 0; bit < 16; bit++)
diff --git a/src/devices/cpu/tms1000/tms1000.h b/src/devices/cpu/tms1000/tms1000.h
index 049b24873fd..7e2ac9c0822 100644
--- a/src/devices/cpu/tms1000/tms1000.h
+++ b/src/devices/cpu/tms1000/tms1000.h
@@ -15,8 +15,8 @@
class tms1000_cpu_device : public tms1k_base_device
{
public:
- tms1000_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- tms1000_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint8_t o_pins, uint8_t r_pins, uint8_t pc_bits, uint8_t byte_bits, uint8_t x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source);
+ tms1000_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+ tms1000_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, u8 o_pins, u8 r_pins, u8 pc_bits, u8 byte_bits, u8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source);
protected:
// overrides
@@ -24,39 +24,39 @@ protected:
virtual machine_config_constructor device_mconfig_additions() const override;
- virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override;
+ virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options) override;
};
class tms1070_cpu_device : public tms1000_cpu_device
{
public:
- tms1070_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ tms1070_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class tms1040_cpu_device : public tms1000_cpu_device
{
public:
- tms1040_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ tms1040_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class tms1200_cpu_device : public tms1000_cpu_device
{
public:
- tms1200_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ tms1200_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class tms1700_cpu_device : public tms1000_cpu_device
{
public:
- tms1700_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ tms1700_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class tms1730_cpu_device : public tms1000_cpu_device
{
public:
- tms1730_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ tms1730_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
diff --git a/src/devices/cpu/tms1000/tms1100.cpp b/src/devices/cpu/tms1000/tms1100.cpp
index 93c7c07a69c..f896f60d9eb 100644
--- a/src/devices/cpu/tms1000/tms1100.cpp
+++ b/src/devices/cpu/tms1000/tms1100.cpp
@@ -27,29 +27,29 @@ ADDRESS_MAP_END
// device definitions
-tms1100_cpu_device::tms1100_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+tms1100_cpu_device::tms1100_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: tms1000_cpu_device(mconfig, TMS1100, "TMS1100", tag, owner, clock, 8 /* o pins */, 11 /* r pins */, 6 /* pc bits */, 8 /* byte width */, 3 /* x width */, 11 /* prg width */, ADDRESS_MAP_NAME(program_11bit_8), 7 /* data width */, ADDRESS_MAP_NAME(data_128x4), "tms1100", __FILE__)
{ }
-tms1100_cpu_device::tms1100_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint8_t o_pins, uint8_t r_pins, uint8_t pc_bits, uint8_t byte_bits, uint8_t x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
+tms1100_cpu_device::tms1100_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, u8 o_pins, u8 r_pins, u8 pc_bits, u8 byte_bits, u8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
: tms1000_cpu_device(mconfig, type, name, tag, owner, clock, o_pins, r_pins, pc_bits, byte_bits, x_bits, prgwidth, program, datawidth, data, shortname, source)
{ }
-tms1170_cpu_device::tms1170_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+tms1170_cpu_device::tms1170_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: tms1100_cpu_device(mconfig, TMS1170, "TMS1170", tag, owner, clock, 8, 11, 6, 8, 3, 11, ADDRESS_MAP_NAME(program_11bit_8), 7, ADDRESS_MAP_NAME(data_128x4), "tms1170", __FILE__)
{ }
-tms1300_cpu_device::tms1300_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+tms1300_cpu_device::tms1300_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: tms1100_cpu_device(mconfig, TMS1300, "TMS1300", tag, owner, clock, 8, 16, 6, 8, 3, 11, ADDRESS_MAP_NAME(program_11bit_8), 7, ADDRESS_MAP_NAME(data_128x4), "tms1300", __FILE__)
{ }
-tms1370_cpu_device::tms1370_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+tms1370_cpu_device::tms1370_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: tms1100_cpu_device(mconfig, TMS1370, "TMS1370", tag, owner, clock, 8, 16, 6, 8, 3, 11, ADDRESS_MAP_NAME(program_11bit_8), 7, ADDRESS_MAP_NAME(data_128x4), "tms1370", __FILE__)
{ }
// disasm
-offs_t tms1100_cpu_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options)
+offs_t tms1100_cpu_device::disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options)
{
extern CPU_DISASSEMBLE(tms1100);
return CPU_DISASSEMBLE_NAME(tms1100)(this, stream, pc, oprom, opram, options);
diff --git a/src/devices/cpu/tms1000/tms1100.h b/src/devices/cpu/tms1000/tms1100.h
index b5df68e40cc..be0b6a70f10 100644
--- a/src/devices/cpu/tms1000/tms1100.h
+++ b/src/devices/cpu/tms1000/tms1100.h
@@ -15,14 +15,14 @@
class tms1100_cpu_device : public tms1000_cpu_device
{
public:
- tms1100_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- tms1100_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint8_t o_pins, uint8_t r_pins, uint8_t pc_bits, uint8_t byte_bits, uint8_t x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source);
+ tms1100_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+ tms1100_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, u8 o_pins, u8 r_pins, u8 pc_bits, u8 byte_bits, u8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source);
protected:
// overrides
virtual void device_reset() override;
- virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override;
+ virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options) override;
virtual void op_setr() override;
virtual void op_rstr() override;
@@ -31,19 +31,19 @@ protected:
class tms1170_cpu_device : public tms1100_cpu_device
{
public:
- tms1170_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ tms1170_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class tms1300_cpu_device : public tms1100_cpu_device
{
public:
- tms1300_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ tms1300_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class tms1370_cpu_device : public tms1100_cpu_device
{
public:
- tms1370_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ tms1370_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
diff --git a/src/devices/cpu/tms1000/tms1400.cpp b/src/devices/cpu/tms1000/tms1400.cpp
index 550911a9752..d8f12700289 100644
--- a/src/devices/cpu/tms1000/tms1400.cpp
+++ b/src/devices/cpu/tms1000/tms1400.cpp
@@ -36,28 +36,28 @@ ADDRESS_MAP_END
// device definitions
-tms1400_cpu_device::tms1400_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+tms1400_cpu_device::tms1400_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: tms1100_cpu_device(mconfig, TMS1400, "TMS1400", tag, owner, clock, 8 /* o pins */, 11 /* r pins */, 6 /* pc bits */, 8 /* byte width */, 3 /* x width */, 12 /* prg width */, ADDRESS_MAP_NAME(program_12bit_8), 7 /* data width */, ADDRESS_MAP_NAME(data_128x4), "tms1400", __FILE__)
{ }
-tms1400_cpu_device::tms1400_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint8_t o_pins, uint8_t r_pins, uint8_t pc_bits, uint8_t byte_bits, uint8_t x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
+tms1400_cpu_device::tms1400_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, u8 o_pins, u8 r_pins, u8 pc_bits, u8 byte_bits, u8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
: tms1100_cpu_device(mconfig, type, name, tag, owner, clock, o_pins, r_pins, pc_bits, byte_bits, x_bits, prgwidth, program, datawidth, data, shortname, source)
{ }
-tms1470_cpu_device::tms1470_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+tms1470_cpu_device::tms1470_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: tms1400_cpu_device(mconfig, TMS1470, "TMS1470", tag, owner, clock, 8, 10, 6, 8, 3, 12, ADDRESS_MAP_NAME(program_12bit_8), 7, ADDRESS_MAP_NAME(data_128x4), "tms1470", __FILE__)
{ }
-tms1600_cpu_device::tms1600_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+tms1600_cpu_device::tms1600_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: tms1400_cpu_device(mconfig, TMS1600, "TMS1600", tag, owner, clock, 8, 16, 6, 8, 3, 12, ADDRESS_MAP_NAME(program_12bit_8), 7, ADDRESS_MAP_NAME(data_128x4), "tms1600", __FILE__)
{ }
-tms1600_cpu_device::tms1600_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint8_t o_pins, uint8_t r_pins, uint8_t pc_bits, uint8_t byte_bits, uint8_t x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
+tms1600_cpu_device::tms1600_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, u8 o_pins, u8 r_pins, u8 pc_bits, u8 byte_bits, u8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
: tms1400_cpu_device(mconfig, type, name, tag, owner, clock, o_pins, r_pins, pc_bits, byte_bits, x_bits, prgwidth, program, datawidth, data, shortname, source)
{ }
-tms1670_cpu_device::tms1670_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+tms1670_cpu_device::tms1670_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: tms1600_cpu_device(mconfig, TMS1670, "TMS1670", tag, owner, clock, 8, 16, 6, 8, 3, 12, ADDRESS_MAP_NAME(program_12bit_8), 7, ADDRESS_MAP_NAME(data_128x4), "tms1670", __FILE__)
{ }
diff --git a/src/devices/cpu/tms1000/tms1400.h b/src/devices/cpu/tms1000/tms1400.h
index 1bfb59a821e..af8498ad28b 100644
--- a/src/devices/cpu/tms1000/tms1400.h
+++ b/src/devices/cpu/tms1000/tms1400.h
@@ -15,8 +15,8 @@
class tms1400_cpu_device : public tms1100_cpu_device
{
public:
- tms1400_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- tms1400_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint8_t o_pins, uint8_t r_pins, uint8_t pc_bits, uint8_t byte_bits, uint8_t x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source);
+ tms1400_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+ tms1400_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, u8 o_pins, u8 r_pins, u8 pc_bits, u8 byte_bits, u8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source);
protected:
// overrides
@@ -34,21 +34,21 @@ protected:
class tms1470_cpu_device : public tms1400_cpu_device
{
public:
- tms1470_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ tms1470_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class tms1600_cpu_device : public tms1400_cpu_device
{
public:
- tms1600_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- tms1600_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint8_t o_pins, uint8_t r_pins, uint8_t pc_bits, uint8_t byte_bits, uint8_t x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source);
+ tms1600_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+ tms1600_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, u8 o_pins, u8 r_pins, u8 pc_bits, u8 byte_bits, u8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source);
};
class tms1670_cpu_device : public tms1600_cpu_device
{
public:
- tms1670_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ tms1670_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
diff --git a/src/devices/cpu/tms1000/tms1k_base.cpp b/src/devices/cpu/tms1000/tms1k_base.cpp
index b8afaa75246..8caa62493c7 100644
--- a/src/devices/cpu/tms1000/tms1k_base.cpp
+++ b/src/devices/cpu/tms1000/tms1k_base.cpp
@@ -220,6 +220,8 @@ void tms1k_base_device::device_reset()
m_eac = 0;
m_bl = 0;
m_add = 0;
+ m_status = 0;
+ m_clatch = 0;
m_opcode = 0;
m_micro = 0;
@@ -274,7 +276,7 @@ void tms1k_base_device::read_opcode()
// i/o handling
//-------------------------------------------------
-void tms1k_base_device::write_o_output(uint8_t index)
+void tms1k_base_device::write_o_output(u8 index)
{
// a hardcoded table is supported if the output pla is unknown
m_o_index = index;
@@ -282,7 +284,7 @@ void tms1k_base_device::write_o_output(uint8_t index)
m_write_o(0, m_o & m_o_mask, 0xffff);
}
-uint8_t tms1k_base_device::read_k_input()
+u8 tms1k_base_device::read_k_input()
{
// K1,2,4,8 (KC test pin is not emulated)
return m_read_k(0, 0xff) & 0xf;
@@ -343,7 +345,7 @@ void tms1k_base_device::op_call()
// CALL/CALLL: conditional call
if (m_status)
{
- uint8_t prev_pa = m_pa;
+ u8 prev_pa = m_pa;
if (m_clatch == 0)
{
diff --git a/src/devices/cpu/tms1000/tms1k_base.h b/src/devices/cpu/tms1000/tms1k_base.h
index 39ccbf31ea1..2363bccabca 100644
--- a/src/devices/cpu/tms1000/tms1k_base.h
+++ b/src/devices/cpu/tms1000/tms1k_base.h
@@ -18,11 +18,11 @@
// K input pins
#define MCFG_TMS1XXX_READ_K_CB(_devcb) \
- tms1k_base_device::set_read_k_callback(*device, DEVCB_##_devcb);
+ devcb = &tms1k_base_device::set_read_k_callback(*device, DEVCB_##_devcb);
// O/Segment output pins
#define MCFG_TMS1XXX_WRITE_O_CB(_devcb) \
- tms1k_base_device::set_write_o_callback(*device, DEVCB_##_devcb);
+ devcb = &tms1k_base_device::set_write_o_callback(*device, DEVCB_##_devcb);
// Use this if the output PLA is unknown:
// If the microinstructions (or other) PLA is unknown, try using one from another romset.
@@ -31,11 +31,11 @@
// R output pins (also called D on some chips)
#define MCFG_TMS1XXX_WRITE_R_CB(_devcb) \
- tms1k_base_device::set_write_r_callback(*device, DEVCB_##_devcb);
+ devcb = &tms1k_base_device::set_write_r_callback(*device, DEVCB_##_devcb);
// OFF request on TMS0980 and up
#define MCFG_TMS1XXX_POWER_OFF_CB(_devcb) \
- tms1k_base_device::set_power_off_callback(*device, DEVCB_##_devcb);
+ devcb = &tms1k_base_device::set_power_off_callback(*device, DEVCB_##_devcb);
// pinout reference
@@ -84,7 +84,7 @@ class tms1k_base_device : public cpu_device
{
public:
// construction/destruction
- tms1k_base_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint8_t o_pins, uint8_t r_pins, uint8_t pc_bits, uint8_t byte_bits, uint8_t x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
+ tms1k_base_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, u8 o_pins, u8 r_pins, u8 pc_bits, u8 byte_bits, u8 x_bits, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
: cpu_device(mconfig, type, name, tag, owner, clock, shortname, source)
, m_program_config("program", ENDIANNESS_BIG, byte_bits > 8 ? 16 : 8, prgwidth, 0, program)
, m_data_config("data", ENDIANNESS_BIG, 8, datawidth, 0, data)
@@ -109,9 +109,9 @@ public:
template<class _Object> static devcb_base &set_write_o_callback(device_t &device, _Object object) { return downcast<tms1k_base_device &>(device).m_write_o.set_callback(object); }
template<class _Object> static devcb_base &set_write_r_callback(device_t &device, _Object object) { return downcast<tms1k_base_device &>(device).m_write_r.set_callback(object); }
template<class _Object> static devcb_base &set_power_off_callback(device_t &device, _Object object) { return downcast<tms1k_base_device &>(device).m_power_off.set_callback(object); }
- static void set_output_pla(device_t &device, const uint16_t *output_pla) { downcast<tms1k_base_device &>(device).m_output_pla_table = output_pla; }
+ static void set_output_pla(device_t &device, const u16 *output_pla) { downcast<tms1k_base_device &>(device).m_output_pla_table = output_pla; }
- uint8_t debug_peek_o_index() { return m_o_index; } // get output PLA index, for debugging (don't use in emulation)
+ u8 debug_peek_o_index() { return m_o_index; } // get output PLA index, for debugging (don't use in emulation)
// microinstructions
enum
@@ -177,25 +177,25 @@ protected:
virtual void device_reset() override;
// device_execute_interface overrides
- virtual uint32_t execute_min_cycles() const override { return 1; }
- virtual uint32_t execute_max_cycles() const override { return 6; }
- virtual uint32_t execute_input_lines() const override { return 1; }
+ virtual u32 execute_min_cycles() const override { return 1; }
+ virtual u32 execute_max_cycles() const override { return 6; }
+ virtual u32 execute_input_lines() const override { return 1; }
virtual void execute_run() override;
// device_memory_interface overrides
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return(spacenum == AS_PROGRAM) ? &m_program_config : ((spacenum == AS_DATA) ? &m_data_config : nullptr); }
// device_disasm_interface overrides
- virtual uint32_t disasm_min_opcode_bytes() const override { return 1; }
- virtual uint32_t disasm_max_opcode_bytes() const override { return 1; }
+ virtual u32 disasm_min_opcode_bytes() const override { return 1; }
+ virtual u32 disasm_max_opcode_bytes() const override { return 1; }
// device_state_interface overrides
virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
void next_pc();
- virtual void write_o_output(uint8_t index);
- virtual uint8_t read_k_input();
+ virtual void write_o_output(u8 index);
+ virtual u8 read_k_input();
virtual void set_cki_bus();
virtual void dynamic_output() { ; } // not used by default
virtual void read_opcode();
@@ -232,70 +232,70 @@ protected:
optional_device<pla_device> m_opla;
optional_device<pla_device> m_spla;
- uint8_t m_pc; // 6 or 7-bit program counter
- uint32_t m_sr; // 6 or 7-bit subroutine return register(s)
- uint8_t m_pa; // 4-bit page address register
- uint8_t m_pb; // 4-bit page buffer register
- uint16_t m_ps; // 4-bit page subroutine register(s)
- uint8_t m_a; // 4-bit accumulator
- uint8_t m_x; // 2,3,or 4-bit RAM X register
- uint8_t m_y; // 4-bit RAM Y register
- uint8_t m_ca; // chapter address register
- uint8_t m_cb; // chapter buffer register
- uint16_t m_cs; // chapter subroutine register(s)
- uint16_t m_r;
- uint16_t m_o;
- uint8_t m_cki_bus;
- uint8_t m_c4;
- uint8_t m_p; // 4-bit adder p(lus)-input
- uint8_t m_n; // 4-bit adder n(egative)-input
- uint8_t m_adder_out; // adder result
- uint8_t m_carry_in; // adder carry-in bit
- uint8_t m_carry_out; // adder carry-out bit
- uint8_t m_status;
- uint8_t m_status_latch;
- uint8_t m_eac; // end around carry bit
- uint8_t m_clatch; // call latch bit(s)
- uint8_t m_add; // add latch bit
- uint8_t m_bl; // branch latch bit
-
- uint8_t m_ram_in;
- uint8_t m_dam_in;
- int m_ram_out; // signed!
- uint8_t m_ram_address;
- uint16_t m_rom_address;
- uint16_t m_opcode;
- uint32_t m_fixed;
- uint32_t m_micro;
- int m_subcycle;
- int m_icount;
- uint8_t m_o_index;
-
- uint8_t m_o_pins; // how many O pins
- uint8_t m_r_pins; // how many R pins
- uint8_t m_pc_bits; // how many program counter bits
- uint8_t m_byte_bits; // how many bits per 'byte'
- uint8_t m_x_bits; // how many X register bits
+ u8 m_pc; // 6 or 7-bit program counter
+ u32 m_sr; // 6 or 7-bit subroutine return register(s)
+ u8 m_pa; // 4-bit page address register
+ u8 m_pb; // 4-bit page buffer register
+ u16 m_ps; // 4-bit page subroutine register(s)
+ u8 m_a; // 4-bit accumulator
+ u8 m_x; // 2,3,or 4-bit RAM X register
+ u8 m_y; // 4-bit RAM Y register
+ u8 m_ca; // chapter address register
+ u8 m_cb; // chapter buffer register
+ u16 m_cs; // chapter subroutine register(s)
+ u16 m_r;
+ u16 m_o;
+ u8 m_cki_bus;
+ u8 m_c4;
+ u8 m_p; // 4-bit adder p(lus)-input
+ u8 m_n; // 4-bit adder n(egative)-input
+ u8 m_adder_out; // adder result
+ u8 m_carry_in; // adder carry-in bit
+ u8 m_carry_out; // adder carry-out bit
+ u8 m_status;
+ u8 m_status_latch;
+ u8 m_eac; // end around carry bit
+ u8 m_clatch; // call latch bit(s)
+ u8 m_add; // add latch bit
+ u8 m_bl; // branch latch bit
+
+ u8 m_ram_in;
+ u8 m_dam_in;
+ int m_ram_out; // signed!
+ u8 m_ram_address;
+ u16 m_rom_address;
+ u16 m_opcode;
+ u32 m_fixed;
+ u32 m_micro;
+ int m_subcycle;
+ int m_icount;
+ u8 m_o_index;
+
+ u8 m_o_pins; // how many O pins
+ u8 m_r_pins; // how many R pins
+ u8 m_pc_bits; // how many program counter bits
+ u8 m_byte_bits; // how many bits per 'byte'
+ u8 m_x_bits; // how many X register bits
address_space *m_program;
address_space *m_data;
- const uint16_t *m_output_pla_table;
+ const u16 *m_output_pla_table;
devcb_read8 m_read_k;
devcb_write16 m_write_o;
devcb_write16 m_write_r;
devcb_write_line m_power_off;
- uint32_t m_o_mask;
- uint32_t m_r_mask;
- uint32_t m_k_mask;
- uint32_t m_pc_mask;
- uint32_t m_x_mask;
+ u32 m_o_mask;
+ u32 m_r_mask;
+ u32 m_k_mask;
+ u32 m_pc_mask;
+ u32 m_x_mask;
// lookup tables
- std::vector<uint32_t> m_fixed_decode;
- std::vector<uint32_t> m_micro_decode;
- std::vector<uint32_t> m_micro_direct;
+ std::vector<u32> m_fixed_decode;
+ std::vector<u32> m_micro_decode;
+ std::vector<u32> m_micro_direct;
};
diff --git a/src/devices/cpu/tms1000/tms1k_dasm.cpp b/src/devices/cpu/tms1000/tms1k_dasm.cpp
index 8987a666726..f0afd660470 100644
--- a/src/devices/cpu/tms1000/tms1k_dasm.cpp
+++ b/src/devices/cpu/tms1000/tms1k_dasm.cpp
@@ -39,7 +39,7 @@ static const char *const s_mnemonic[] =
#define _OVER DASMFLAG_STEP_OVER
#define _OUT DASMFLAG_STEP_OUT
-static const uint32_t s_flags[] =
+static const u32 s_flags[] =
{
0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _OVER, 0,
@@ -57,7 +57,7 @@ enum e_addressing
zB0 = 0, zI2, zI3, zI4, zB7
};
-static const uint8_t s_addressing[] =
+static const u8 s_addressing[] =
{
zB0,
zB0, zB0, zB0, zI4, zI4, zI4, zI4, zB0, zB0, zB7, zB7, zB0,
@@ -73,7 +73,7 @@ static const uint8_t s_addressing[] =
// opcode luts
-static const uint8_t tms1000_mnemonic[256] =
+static const u8 tms1000_mnemonic[256] =
{
/* 0x00 */
zCOMX, zA8AAC, zYNEA, zTAM, zTAMZA, zA10AAC, zA6AAC, zDAN, zTKA, zKNEZ, zTDO, zCLO, zRSTR, zSETR, zIA, zRETN, // 0
@@ -97,7 +97,7 @@ static const uint8_t tms1000_mnemonic[256] =
};
-static const uint8_t tms1100_mnemonic[256] =
+static const u8 tms1100_mnemonic[256] =
{
/* 0x00 */
zMNEA, zALEM, zYNEA, zXMA, zDYN, zIYC, zAMAAC, zDMAN, zTKA, zCOMX, zTDO, zCOMC, zRSTR, zSETR, zKNEZ, zRETN, // 0
@@ -121,7 +121,7 @@ static const uint8_t tms1100_mnemonic[256] =
};
-static const uint8_t tms0980_mnemonic[512] =
+static const u8 tms0980_mnemonic[512] =
{
/* 0x000 */
zCOMX, zALEM, zYNEA, zXMA, zDYN, zIYC, zCLA, zDMAN, zTKA, zMNEA, zTKM, 0, 0, zSETR, zKNEZ, 0, // 0
@@ -163,7 +163,7 @@ static const uint8_t tms0980_mnemonic[512] =
};
-static const uint8_t tp0320_mnemonic[512] =
+static const u8 tp0320_mnemonic[512] =
{
/* 0x000 */
0, zALEM, zYNEA, zXMA, zDYN, zIYC, zCLA, zDMAN, zTKA, zMNEA, zTKM, 0, 0, zSETR, zKNEZ, 0, // 0
@@ -208,31 +208,31 @@ static const uint8_t tp0320_mnemonic[512] =
// disasm
-static const uint8_t i2_value[4] =
+static const u8 i2_value[4] =
{
0, 2, 1, 3
};
-static const uint8_t i3_value[8] =
+static const u8 i3_value[8] =
{
0, 4, 2, 6, 1, 5, 3, 7
};
-static const uint8_t i4_value[16] =
+static const u8 i4_value[16] =
{
0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe, 0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf
};
-static offs_t tms1k_dasm(std::ostream &stream, const uint8_t *oprom, const uint8_t *lut_mnemonic, uint16_t opcode_mask)
+static offs_t tms1k_dasm(std::ostream &stream, const u8 *oprom, const u8 *lut_mnemonic, u16 opcode_mask)
{
// get current opcode
int pos = 0;
- uint16_t op = oprom[pos++];
+ u16 op = oprom[pos++];
if (opcode_mask & 0x100)
op = (op << 8 | oprom[pos++]) & 0x1ff;
// convert to mnemonic/param
- uint16_t instr = lut_mnemonic[op];
+ u16 instr = lut_mnemonic[op];
util::stream_format(stream, "%-8s ", s_mnemonic[instr]);
switch( s_addressing[instr] )
diff --git a/src/devices/cpu/tms1000/tp0320.cpp b/src/devices/cpu/tms1000/tp0320.cpp
index cf427cda589..03c66c87e7f 100644
--- a/src/devices/cpu/tms1000/tp0320.cpp
+++ b/src/devices/cpu/tms1000/tp0320.cpp
@@ -36,7 +36,7 @@ ADDRESS_MAP_END
// device definitions
-tp0320_cpu_device::tp0320_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+tp0320_cpu_device::tp0320_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: tms0980_cpu_device(mconfig, TP0320, "TP0320", tag, owner, clock, 7 /* o pins */, 10 /* r pins */, 7 /* pc bits */, 9 /* byte width */, 4 /* x width */, 12 /* prg width */, ADDRESS_MAP_NAME(program_11bit_9), 8 /* data width */, ADDRESS_MAP_NAME(data_192x4), "tp0320", __FILE__)
{ }
@@ -58,7 +58,7 @@ machine_config_constructor tp0320_cpu_device::device_mconfig_additions() const
// disasm
-offs_t tp0320_cpu_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options)
+offs_t tp0320_cpu_device::disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options)
{
extern CPU_DISASSEMBLE(tp0320);
return CPU_DISASSEMBLE_NAME(tp0320)(this, stream, pc, oprom, opram, options);
@@ -66,16 +66,16 @@ offs_t tp0320_cpu_device::disasm_disassemble(std::ostream &stream, offs_t pc, co
// device_reset
-uint32_t tp0320_cpu_device::decode_micro(uint8_t sel)
+u32 tp0320_cpu_device::decode_micro(u8 sel)
{
- uint32_t decode = 0;
+ u32 decode = 0;
sel = BITSWAP8(sel,7,6,0,1,2,3,4,5); // lines are reversed
- uint32_t mask = m_mpla->read(sel);
+ u32 mask = m_mpla->read(sel);
mask ^= 0x0bff0; // invert active-negative
- // _____ _______ ______ _____ _____ ______ _____ _____ ______ _____ _____
- const uint32_t md[22] = { M_AUTA, M_AUTY, M_SSS, M_STO, M_YTP, M_NDMTP, M_DMTP, M_MTP, M_CKP, M_15TN, M_CKN, M_MTN, M_NATN, M_ATN, M_CME, M_CIN, M_SSE, M_CKM, M_NE, M_C8, M_SETR, M_RSTR };
+ // _____ _______ ______ _____ _____ ______ _____ _____ ______ _____ _____
+ const u32 md[22] = { M_AUTA, M_AUTY, M_SSS, M_STO, M_YTP, M_NDMTP, M_DMTP, M_MTP, M_CKP, M_15TN, M_CKN, M_MTN, M_NATN, M_ATN, M_CME, M_CIN, M_SSE, M_CKM, M_NE, M_C8, M_SETR, M_RSTR };
for (int bit = 0; bit < 22 && bit < m_mpla->outputs(); bit++)
if (mask & (1 << bit))
diff --git a/src/devices/cpu/tms1000/tp0320.h b/src/devices/cpu/tms1000/tp0320.h
index fcff112a900..d5675f0e011 100644
--- a/src/devices/cpu/tms1000/tp0320.h
+++ b/src/devices/cpu/tms1000/tp0320.h
@@ -15,16 +15,16 @@
class tp0320_cpu_device : public tms0980_cpu_device
{
public:
- tp0320_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ tp0320_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
protected:
// overrides
//virtual void device_start() override;
- virtual uint32_t decode_fixed(uint16_t op) override { return 0; } // not yet
- virtual uint32_t decode_micro(uint8_t sel) override;
+ virtual u32 decode_fixed(u16 op) override { return 0; } // not yet
+ virtual u32 decode_micro(u8 sel) override;
virtual void device_reset() override;
- virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override;
+ virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options) override;
virtual machine_config_constructor device_mconfig_additions() const override;
};
diff --git a/src/devices/cpu/ucom4/ucom4.cpp b/src/devices/cpu/ucom4/ucom4.cpp
index 7b804c4c4f3..aca4996b5fa 100644
--- a/src/devices/cpu/ucom4/ucom4.cpp
+++ b/src/devices/cpu/ucom4/ucom4.cpp
@@ -58,19 +58,19 @@ ADDRESS_MAP_END
// device definitions
-upd553_cpu_device::upd553_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+upd553_cpu_device::upd553_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: ucom4_cpu_device(mconfig, NEC_D553, "uPD553", tag, owner, clock, NEC_UCOM43, 3 /* stack levels */, 11 /* prg width */, ADDRESS_MAP_NAME(program_2k), 7 /* data width */, ADDRESS_MAP_NAME(data_96x4), "upd553", __FILE__)
{ }
-upd557l_cpu_device::upd557l_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+upd557l_cpu_device::upd557l_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: ucom4_cpu_device(mconfig, NEC_D557L, "uPD557L", tag, owner, clock, NEC_UCOM43, 3, 11, ADDRESS_MAP_NAME(program_2k), 7, ADDRESS_MAP_NAME(data_96x4), "upd557l", __FILE__)
{ }
-upd650_cpu_device::upd650_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+upd650_cpu_device::upd650_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: ucom4_cpu_device(mconfig, NEC_D650, "uPD650", tag, owner, clock, NEC_UCOM43, 3, 11, ADDRESS_MAP_NAME(program_2k), 7, ADDRESS_MAP_NAME(data_96x4), "upd650", __FILE__)
{ }
-upd552_cpu_device::upd552_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+upd552_cpu_device::upd552_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: ucom4_cpu_device(mconfig, NEC_D552, "uPD552", tag, owner, clock, NEC_UCOM44, 1, 10, ADDRESS_MAP_NAME(program_1k), 6, ADDRESS_MAP_NAME(data_64x4), "upd552", __FILE__)
{ }
@@ -95,7 +95,7 @@ void ucom4_cpu_device::state_string_export(const device_state_entry &entry, std:
}
}
-offs_t ucom4_cpu_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options)
+offs_t ucom4_cpu_device::disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options)
{
extern CPU_DISASSEMBLE(ucom4);
return CPU_DISASSEMBLE_NAME(ucom4)(this, stream, pc, oprom, opram, options);
@@ -220,10 +220,10 @@ void ucom4_cpu_device::device_reset()
// default:
// A,B are inputs, C,D are input/output, E,F,G,H,I are output
-uint8_t ucom4_cpu_device::input_r(int index)
+u8 ucom4_cpu_device::input_r(int index)
{
index &= 0xf;
- uint8_t inp = 0;
+ u8 inp = 0;
switch (index)
{
@@ -240,7 +240,7 @@ uint8_t ucom4_cpu_device::input_r(int index)
return inp & 0xf;
}
-void ucom4_cpu_device::output_w(int index, uint8_t data)
+void ucom4_cpu_device::output_w(int index, u8 data)
{
index &= 0xf;
data &= 0xf;
@@ -266,7 +266,7 @@ void ucom4_cpu_device::output_w(int index, uint8_t data)
// uPD557L:
// ports B,H,I are stripped, port G is reduced to 1 pin
-uint8_t upd557l_cpu_device::input_r(int index)
+u8 upd557l_cpu_device::input_r(int index)
{
index &= 0xf;
@@ -278,7 +278,7 @@ uint8_t upd557l_cpu_device::input_r(int index)
return 0;
}
-void upd557l_cpu_device::output_w(int index, uint8_t data)
+void upd557l_cpu_device::output_w(int index, u8 data)
{
index &= 0xf;
data &= 0xf;
diff --git a/src/devices/cpu/ucom4/ucom4.h b/src/devices/cpu/ucom4/ucom4.h
index ca0701734fb..0dcd43df7f5 100644
--- a/src/devices/cpu/ucom4/ucom4.h
+++ b/src/devices/cpu/ucom4/ucom4.h
@@ -14,35 +14,35 @@
// I/O ports setup
#define MCFG_UCOM4_READ_A_CB(_devcb) \
- ucom4_cpu_device::set_read_a_callback(*device, DEVCB_##_devcb);
+ devcb = &ucom4_cpu_device::set_read_a_callback(*device, DEVCB_##_devcb);
#define MCFG_UCOM4_READ_B_CB(_devcb) \
- ucom4_cpu_device::set_read_b_callback(*device, DEVCB_##_devcb);
+ devcb = &ucom4_cpu_device::set_read_b_callback(*device, DEVCB_##_devcb);
#define MCFG_UCOM4_READ_C_CB(_devcb) \
- ucom4_cpu_device::set_read_c_callback(*device, DEVCB_##_devcb);
+ devcb = &ucom4_cpu_device::set_read_c_callback(*device, DEVCB_##_devcb);
#define MCFG_UCOM4_WRITE_C_CB(_devcb) \
- ucom4_cpu_device::set_write_c_callback(*device, DEVCB_##_devcb);
+ devcb = &ucom4_cpu_device::set_write_c_callback(*device, DEVCB_##_devcb);
#define MCFG_UCOM4_READ_D_CB(_devcb) \
- ucom4_cpu_device::set_read_d_callback(*device, DEVCB_##_devcb);
+ devcb = &ucom4_cpu_device::set_read_d_callback(*device, DEVCB_##_devcb);
#define MCFG_UCOM4_WRITE_D_CB(_devcb) \
- ucom4_cpu_device::set_write_d_callback(*device, DEVCB_##_devcb);
+ devcb = &ucom4_cpu_device::set_write_d_callback(*device, DEVCB_##_devcb);
#define MCFG_UCOM4_WRITE_E_CB(_devcb) \
- ucom4_cpu_device::set_write_e_callback(*device, DEVCB_##_devcb);
+ devcb = &ucom4_cpu_device::set_write_e_callback(*device, DEVCB_##_devcb);
#define MCFG_UCOM4_WRITE_F_CB(_devcb) \
- ucom4_cpu_device::set_write_f_callback(*device, DEVCB_##_devcb);
+ devcb = &ucom4_cpu_device::set_write_f_callback(*device, DEVCB_##_devcb);
#define MCFG_UCOM4_WRITE_G_CB(_devcb) \
- ucom4_cpu_device::set_write_g_callback(*device, DEVCB_##_devcb);
+ devcb = &ucom4_cpu_device::set_write_g_callback(*device, DEVCB_##_devcb);
#define MCFG_UCOM4_WRITE_H_CB(_devcb) \
- ucom4_cpu_device::set_write_h_callback(*device, DEVCB_##_devcb);
+ devcb = &ucom4_cpu_device::set_write_h_callback(*device, DEVCB_##_devcb);
#define MCFG_UCOM4_WRITE_I_CB(_devcb) \
- ucom4_cpu_device::set_write_i_callback(*device, DEVCB_##_devcb);
+ devcb = &ucom4_cpu_device::set_write_i_callback(*device, DEVCB_##_devcb);
enum
{
@@ -100,7 +100,7 @@ class ucom4_cpu_device : public cpu_device
{
public:
// construction/destruction
- ucom4_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, int family, int stack_levels, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
+ ucom4_cpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, int family, int stack_levels, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data, const char *shortname, const char *source)
: cpu_device(mconfig, type, name, tag, owner, clock, shortname, source)
, m_program_config("program", ENDIANNESS_BIG, 8, prgwidth, 0, program)
, m_data_config("data", ENDIANNESS_BIG, 8, datawidth, 0, data)
@@ -141,11 +141,11 @@ protected:
virtual void device_reset() override;
// device_execute_interface overrides
- virtual uint64_t execute_clocks_to_cycles(uint64_t clocks) const override { return (clocks + 4 - 1) / 4; } // 4 cycles per machine cycle
- virtual uint64_t execute_cycles_to_clocks(uint64_t cycles) const override { return (cycles * 4); } // "
- virtual uint32_t execute_min_cycles() const override { return 1; }
- virtual uint32_t execute_max_cycles() const override { return 2; }
- virtual uint32_t execute_input_lines() const override { return 1; }
+ virtual u64 execute_clocks_to_cycles(u64 clocks) const override { return (clocks + 4 - 1) / 4; } // 4 cycles per machine cycle
+ virtual u64 execute_cycles_to_clocks(u64 cycles) const override { return (cycles * 4); } // "
+ virtual u32 execute_min_cycles() const override { return 1; }
+ virtual u32 execute_max_cycles() const override { return 2; }
+ virtual u32 execute_input_lines() const override { return 1; }
virtual void execute_set_input(int line, int state) override;
virtual void execute_run() override;
@@ -153,9 +153,9 @@ protected:
virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override { return(spacenum == AS_PROGRAM) ? &m_program_config : ((spacenum == AS_DATA) ? &m_data_config : nullptr); }
// device_disasm_interface overrides
- virtual uint32_t disasm_min_opcode_bytes() const override { return 1; }
- virtual uint32_t disasm_max_opcode_bytes() const override { return 2; }
- virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override;
+ virtual u32 disasm_min_opcode_bytes() const override { return 1; }
+ virtual u32 disasm_max_opcode_bytes() const override { return 2; }
+ virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const u8 *oprom, const u8 *opram, u32 options) override;
// device_state_interface overrides
virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
@@ -169,30 +169,30 @@ protected:
int m_datawidth;
int m_prgmask;
int m_datamask;
- int m_family; // MCU family (43/44/45)
- int m_stack_levels; // number of callstack levels
- uint16_t m_stack[3]; // max 3
- uint8_t m_port_out[0x10]; // last value written to output port
- uint8_t m_op;
- uint8_t m_prev_op; // previous opcode
- uint8_t m_arg; // opcode argument for 2-byte opcodes
- uint8_t m_bitmask; // opcode bit argument
- bool m_skip; // skip next opcode
+ int m_family; // MCU family (43/44/45)
+ int m_stack_levels; // number of callstack levels
+ u16 m_stack[3]; // max 3
+ u8 m_port_out[0x10]; // last value written to output port
+ u8 m_op;
+ u8 m_prev_op; // previous opcode
+ u8 m_arg; // opcode argument for 2-byte opcodes
+ u8 m_bitmask; // opcode bit argument
+ bool m_skip; // skip next opcode
int m_icount;
emu_timer *m_timer;
- uint16_t m_pc; // program counter
- uint16_t m_prev_pc;
- uint8_t m_acc; // 4-bit accumulator
- uint8_t m_dpl; // 4-bit data pointer low (RAM x)
- uint8_t m_dph; // 4-bit(?) data pointer high (RAM y)
- uint8_t m_dph_mask;
- uint8_t m_carry_f; // carry flag
- uint8_t m_carry_s_f; // carry save flag
- uint8_t m_timer_f; // timer out flag
- uint8_t m_int_f; // interrupt flag
- uint8_t m_inte_f; // interrupt enable flag
- int m_int_line; // interrupt pin state
+ u16 m_pc; // program counter
+ u16 m_prev_pc;
+ u8 m_acc; // 4-bit accumulator
+ u8 m_dpl; // 4-bit data pointer low (RAM x)
+ u8 m_dph; // 4-bit(?) data pointer high (RAM y)
+ u8 m_dph_mask;
+ u8 m_carry_f; // carry flag
+ u8 m_carry_s_f; // carry save flag
+ u8 m_timer_f; // timer out flag
+ u8 m_int_f; // interrupt flag
+ u8 m_inte_f; // interrupt enable flag
+ int m_int_line; // interrupt pin state
// i/o handlers
devcb_read8 m_read_a;
@@ -208,23 +208,23 @@ protected:
devcb_write8 m_write_h;
devcb_write8 m_write_i;
- virtual uint8_t input_r(int index);
- virtual void output_w(int index, uint8_t data);
+ virtual u8 input_r(int index);
+ virtual void output_w(int index, u8 data);
// misc internal helpers
void increment_pc();
void fetch_arg();
void do_interrupt();
- uint8_t ram_r();
- void ram_w(uint8_t data);
+ u8 ram_r();
+ void ram_w(u8 data);
void pop_stack();
void push_stack();
bool check_op_43();
TIMER_CALLBACK_MEMBER( simple_timer_cb );
- uint8_t ucom43_reg_r(int index);
- void ucom43_reg_w(int index, uint8_t data);
+ u8 ucom43_reg_r(int index);
+ void ucom43_reg_w(int index, u8 data);
// opcode handlers
void op_illegal();
@@ -316,32 +316,32 @@ protected:
class upd553_cpu_device : public ucom4_cpu_device
{
public:
- upd553_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ upd553_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class upd557l_cpu_device : public ucom4_cpu_device
{
public:
- upd557l_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ upd557l_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
protected:
- virtual uint8_t input_r(int index) override;
- virtual void output_w(int index, uint8_t data) override;
+ virtual u8 input_r(int index) override;
+ virtual void output_w(int index, u8 data) override;
};
class upd650_cpu_device : public ucom4_cpu_device
{
public:
- upd650_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ upd650_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
class upd552_cpu_device : public ucom4_cpu_device
{
public:
- upd552_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ upd552_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
diff --git a/src/devices/cpu/ucom4/ucom4d.cpp b/src/devices/cpu/ucom4/ucom4d.cpp
index 4b29439b5e9..f83801813ee 100644
--- a/src/devices/cpu/ucom4/ucom4d.cpp
+++ b/src/devices/cpu/ucom4/ucom4d.cpp
@@ -38,7 +38,7 @@ static const char *const s_mnemonics[] =
};
// number of bits per opcode parameter, 2 digits means opcode is 2 bytes
-static const uint8_t s_bits[] =
+static const u8 s_bits[] =
{
4, 0, 2, 80, 4, 0, 0, 0,
0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0,
@@ -54,7 +54,7 @@ static const uint8_t s_bits[] =
#define _OVER DASMFLAG_STEP_OVER
#define _OUT DASMFLAG_STEP_OUT
-static const uint32_t s_flags[] =
+static const u32 s_flags[] =
{
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -68,7 +68,7 @@ static const uint32_t s_flags[] =
};
-static const uint8_t ucom4_mnemonic[0x100] =
+static const u8 ucom4_mnemonic[0x100] =
{
/* 0x00 */
mNOP, mDI, mS, mTIT, mTC, mTTM, mDAA, mTAL,
@@ -116,8 +116,8 @@ static const uint8_t ucom4_mnemonic[0x100] =
CPU_DISASSEMBLE(ucom4)
{
int pos = 0;
- uint8_t op = oprom[pos++];
- uint8_t instr = ucom4_mnemonic[op];
+ u8 op = oprom[pos++];
+ u8 instr = ucom4_mnemonic[op];
util::stream_format(stream,"%-4s ", s_mnemonics[instr]);
@@ -125,10 +125,10 @@ CPU_DISASSEMBLE(ucom4)
int bits = s_bits[instr];
if (bits)
{
- uint16_t param = op & ((1 << (bits % 10)) - 1);
+ u16 param = op & ((1 << (bits % 10)) - 1);
if (bits / 10)
{
- uint8_t op2 = oprom[pos++];
+ u8 op2 = oprom[pos++];
param = (param << (bits / 10)) | (op2 & ((1 << (bits / 10)) - 1));
bits = (bits % 10) + (bits / 10);
}
diff --git a/src/devices/cpu/ucom4/ucom4op.cpp b/src/devices/cpu/ucom4/ucom4op.cpp
index 8c8e69f9ed4..67d12a95dad 100644
--- a/src/devices/cpu/ucom4/ucom4op.cpp
+++ b/src/devices/cpu/ucom4/ucom4op.cpp
@@ -8,15 +8,15 @@
// internal helpers
-inline uint8_t ucom4_cpu_device::ram_r()
+inline u8 ucom4_cpu_device::ram_r()
{
- uint16_t address = m_dph << 4 | m_dpl;
+ u16 address = m_dph << 4 | m_dpl;
return m_data->read_byte(address & m_datamask) & 0xf;
}
-inline void ucom4_cpu_device::ram_w(uint8_t data)
+inline void ucom4_cpu_device::ram_w(u8 data)
{
- uint16_t address = m_dph << 4 | m_dpl;
+ u16 address = m_dph << 4 | m_dpl;
m_data->write_byte(address & m_datamask, data & 0xf);
}
@@ -105,7 +105,7 @@ void ucom4_cpu_device::op_tla()
void ucom4_cpu_device::op_xm()
{
// XM X: Exchange ACC with RAM, xor DPh with X
- uint8_t old_acc = m_acc;
+ u8 old_acc = m_acc;
m_acc = ram_r();
ram_w(old_acc);
m_dph ^= (m_op & 0x03);
@@ -468,12 +468,12 @@ enum
UCOM43_F
};
-inline uint8_t ucom4_cpu_device::ucom43_reg_r(int index)
+inline u8 ucom4_cpu_device::ucom43_reg_r(int index)
{
return m_data->read_byte(m_datamask - index) & 0xf;
}
-inline void ucom4_cpu_device::ucom43_reg_w(int index, uint8_t data)
+inline void ucom4_cpu_device::ucom43_reg_w(int index, u8 data)
{
m_data->write_byte(m_datamask - index, data & 0xf);
}
@@ -527,7 +527,7 @@ void ucom4_cpu_device::op_xaw()
// XAW: Exchange ACC with W
m_icount--;
- uint8_t old_acc = m_acc;
+ u8 old_acc = m_acc;
m_acc = ucom43_reg_r(UCOM43_W);
ucom43_reg_w(UCOM43_W, old_acc);
}
@@ -538,7 +538,7 @@ void ucom4_cpu_device::op_xaz()
// XAZ: Exchange ACC with Z
m_icount--;
- uint8_t old_acc = m_acc;
+ u8 old_acc = m_acc;
m_acc = ucom43_reg_r(UCOM43_Z);
ucom43_reg_w(UCOM43_Z, old_acc);
}
@@ -549,7 +549,7 @@ void ucom4_cpu_device::op_xhr()
// XHR: Exchange DPh with R
m_icount--;
- uint8_t old_dph = m_dph;
+ u8 old_dph = m_dph;
m_dph = ucom43_reg_r(UCOM43_R);
ucom43_reg_w(UCOM43_R, old_dph);
}
@@ -560,7 +560,7 @@ void ucom4_cpu_device::op_xhx()
// XHX: Exchange DPh with X
m_icount--;
- uint8_t old_dph = m_dph;
+ u8 old_dph = m_dph;
m_dph = ucom43_reg_r(UCOM43_X);
ucom43_reg_w(UCOM43_X, old_dph);
}
@@ -571,7 +571,7 @@ void ucom4_cpu_device::op_xls()
// XLS: Exchange DPl with S
m_icount--;
- uint8_t old_dpl = m_dpl;
+ u8 old_dpl = m_dpl;
m_dpl = ucom43_reg_r(UCOM43_S);
ucom43_reg_w(UCOM43_S, old_dpl);
}
@@ -582,7 +582,7 @@ void ucom4_cpu_device::op_xly()
// XLY: Exchange DPl with Y
m_icount--;
- uint8_t old_dpl = m_dpl;
+ u8 old_dpl = m_dpl;
m_dpl = ucom43_reg_r(UCOM43_Y);
ucom43_reg_w(UCOM43_Y, old_dpl);
}
@@ -592,7 +592,7 @@ void ucom4_cpu_device::op_xc()
if (!check_op_43()) return;
// XC: Exchange Carry F/F with Carry Save F/F
- uint8_t c = m_carry_f;
+ u8 c = m_carry_f;
m_carry_f = m_carry_s_f;
m_carry_s_f = c;
}
@@ -644,7 +644,7 @@ void ucom4_cpu_device::op_rar()
if (!check_op_43()) return;
// RAR: Rotate ACC Right through Carry F/F
- uint8_t c = m_acc & 1;
+ u8 c = m_acc & 1;
m_acc = m_acc >> 1 | m_carry_f << 3;
m_carry_f = c;
}
@@ -657,7 +657,7 @@ void ucom4_cpu_device::op_inm()
if (!check_op_43()) return;
// INM: Increment RAM, skip next on carry
- uint8_t val = (ram_r() + 1) & 0xf;
+ u8 val = (ram_r() + 1) & 0xf;
ram_w(val);
m_skip = (val == 0);
}
@@ -667,7 +667,7 @@ void ucom4_cpu_device::op_dem()
if (!check_op_43()) return;
// DEM: Decrement RAM, skip next on carry
- uint8_t val = (ram_r() - 1) & 0xf;
+ u8 val = (ram_r() - 1) & 0xf;
ram_w(val);
m_skip = (val == 0xf);
}
diff --git a/src/devices/cpu/upd7810/upd7810.h b/src/devices/cpu/upd7810/upd7810.h
index 8880be1c1bb..05919e8100c 100644
--- a/src/devices/cpu/upd7810/upd7810.h
+++ b/src/devices/cpu/upd7810/upd7810.h
@@ -51,43 +51,43 @@ enum
#define MCFG_UPD7810_TO(_devcb) \
- upd7810_device::set_to_func(*device, DEVCB_##_devcb);
+ devcb = &upd7810_device::set_to_func(*device, DEVCB_##_devcb);
#define MCFG_UPD7810_CO0(_devcb) \
- upd7810_device::set_co0_func(*device, DEVCB_##_devcb);
+ devcb = &upd7810_device::set_co0_func(*device, DEVCB_##_devcb);
#define MCFG_UPD7810_CO1(_devcb) \
- upd7810_device::set_co1_func(*device, DEVCB_##_devcb);
+ devcb = &upd7810_device::set_co1_func(*device, DEVCB_##_devcb);
#define MCFG_UPD7810_TXD(_devcb) \
- upd7810_device::set_txd_func(*device, DEVCB_##_devcb);
+ devcb = &upd7810_device::set_txd_func(*device, DEVCB_##_devcb);
#define MCFG_UPD7810_RXD(_devcb) \
- upd7810_device::set_rxd_func(*device, DEVCB_##_devcb);
+ devcb = &upd7810_device::set_rxd_func(*device, DEVCB_##_devcb);
#define MCFG_UPD7810_AN0(_devcb) \
- upd7810_device::set_an0_func(*device, DEVCB_##_devcb);
+ devcb = &upd7810_device::set_an0_func(*device, DEVCB_##_devcb);
#define MCFG_UPD7810_AN1(_devcb) \
- upd7810_device::set_an1_func(*device, DEVCB_##_devcb);
+ devcb = &upd7810_device::set_an1_func(*device, DEVCB_##_devcb);
#define MCFG_UPD7810_AN2(_devcb) \
- upd7810_device::set_an2_func(*device, DEVCB_##_devcb);
+ devcb = &upd7810_device::set_an2_func(*device, DEVCB_##_devcb);
#define MCFG_UPD7810_AN3(_devcb) \
- upd7810_device::set_an3_func(*device, DEVCB_##_devcb);
+ devcb = &upd7810_device::set_an3_func(*device, DEVCB_##_devcb);
#define MCFG_UPD7810_AN4(_devcb) \
- upd7810_device::set_an4_func(*device, DEVCB_##_devcb);
+ devcb = &upd7810_device::set_an4_func(*device, DEVCB_##_devcb);
#define MCFG_UPD7810_AN5(_devcb) \
- upd7810_device::set_an5_func(*device, DEVCB_##_devcb);
+ devcb = &upd7810_device::set_an5_func(*device, DEVCB_##_devcb);
#define MCFG_UPD7810_AN6(_devcb) \
- upd7810_device::set_an6_func(*device, DEVCB_##_devcb);
+ devcb = &upd7810_device::set_an6_func(*device, DEVCB_##_devcb);
#define MCFG_UPD7810_AN7(_devcb) \
- upd7810_device::set_an7_func(*device, DEVCB_##_devcb);
+ devcb = &upd7810_device::set_an7_func(*device, DEVCB_##_devcb);
class upd7810_device : public cpu_device
diff --git a/src/devices/machine/40105.h b/src/devices/machine/40105.h
index 47a8ce0b1ab..04495bfa352 100644
--- a/src/devices/machine/40105.h
+++ b/src/devices/machine/40105.h
@@ -32,13 +32,13 @@
///*************************************************************************
#define MCFG_40105_DATA_IN_READY_CB(_dir) \
- downcast<cmos_40105_device *>(device)->set_dir_callback(DEVCB_##_dir);
+ devcb = &downcast<cmos_40105_device *>(device)->set_dir_callback(DEVCB_##_dir);
#define MCFG_40105_DATA_OUT_READY_CB(_dor) \
- downcast<cmos_40105_device *>(device)->set_dor_callback(DEVCB_##_dor);
+ devcb = &downcast<cmos_40105_device *>(device)->set_dor_callback(DEVCB_##_dor);
#define MCFG_40105_DATA_OUT_CB(_out) \
- downcast<cmos_40105_device *>(device)->set_data_out_callback(DEVCB_##_out);
+ devcb = &downcast<cmos_40105_device *>(device)->set_data_out_callback(DEVCB_##_out);
@@ -54,9 +54,9 @@ public:
// construction/destruction
cmos_40105_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
- template<class _dir> void set_dir_callback(_dir dir) { m_write_dir.set_callback(dir); }
- template<class _dor> void set_dor_callback(_dor dor) { m_write_dor.set_callback(dor); }
- template<class _out> void set_data_out_callback(_out out) { m_write_q.set_callback(out); }
+ template<class _dir> devcb_base &set_dir_callback(_dir dir) { return m_write_dir.set_callback(dir); }
+ template<class _dor> devcb_base &set_dor_callback(_dor dor) { return m_write_dor.set_callback(dor); }
+ template<class _out> devcb_base &set_data_out_callback(_out out) { return m_write_q.set_callback(out); }
u8 read();
void write(u8 data);
diff --git a/src/devices/machine/6522via.cpp b/src/devices/machine/6522via.cpp
index 2949b77c594..79085eecbca 100644
--- a/src/devices/machine/6522via.cpp
+++ b/src/devices/machine/6522via.cpp
@@ -31,7 +31,15 @@
PARAMETERS
***************************************************************************/
-#define TRACE_VIA 0
+#define LOG_SETUP (1U << 1)
+#define LOG_SHIFT (1U << 2)
+
+#define VERBOSE 0 // (LOG_SETUP|LOG_SHIFT)
+#define LOG_OUTPUT_FUNC printf
+#include "logmacro.h"
+
+#define LOGSETUP(...) LOGMASKED(LOG_SETUP, __VA_ARGS__)
+#define LOGSHIFT(...) LOGMASKED(LOG_SHIFT, __VA_ARGS__)
/***************************************************************************
@@ -310,10 +318,7 @@ void via6522_device::set_int(int data)
output_irq();
- if (TRACE_VIA)
- {
- logerror("%s:6522VIA chip %s: IFR = %02X\n", machine().describe_context(), tag(), m_ifr);
- }
+ LOG("%s:6522VIA chip %s: IFR = %02X\n", machine().describe_context(), tag(), m_ifr);
}
}
@@ -330,10 +335,7 @@ void via6522_device::clear_int(int data)
output_irq();
- if (TRACE_VIA)
- {
- logerror("%s:6522VIA chip %s: IFR = %02X\n", machine().describe_context(), tag(), m_ifr);
- }
+ LOG("%s:6522VIA chip %s: IFR = %02X\n", machine().describe_context(), tag(), m_ifr);
}
}
@@ -344,14 +346,16 @@ void via6522_device::clear_int(int data)
void via6522_device::shift_out()
{
+ LOGSHIFT("Shift Out SR: %02x->", m_sr);
m_out_cb2 = (m_sr >> 7) & 1;
m_sr = (m_sr << 1) | m_out_cb2;
+ LOGSHIFT("%02x\n", m_sr);
m_cb2_handler(m_out_cb2);
if (!SO_T2_RATE(m_acr))
{
- m_shift_counter = (m_shift_counter + 1) % 8;
+ m_shift_counter = (m_shift_counter - 1) & 7;
if (m_shift_counter == 0)
{
@@ -362,9 +366,11 @@ void via6522_device::shift_out()
void via6522_device::shift_in()
{
+ LOGSHIFT("Shift In SR: %02x->", m_sr);
m_sr = (m_sr << 1) | (m_in_cb2 & 1);
+ LOGSHIFT("%02x\n", m_sr);
- m_shift_counter = (m_shift_counter + 1) % 8;
+ m_shift_counter = (m_shift_counter - 1) & 7;
if (m_shift_counter == 0)
{
@@ -378,31 +384,34 @@ void via6522_device::device_timer(emu_timer &timer, device_timer_id id, int para
switch (id)
{
case TIMER_SHIFT:
- m_out_cb1 = 0;
+ LOGSHIFT("SHIFT timer event\n");
+ m_out_cb1 ^= 1;
m_cb1_handler(m_out_cb1);
- if (SO_T2_RATE(m_acr) || SO_T2_CONTROL(m_acr) || SO_O2_CONTROL(m_acr))
+ if (m_out_cb1 & 1) // raising flank
{
- shift_out();
+ if (SI_T2_CONTROL(m_acr) || SI_O2_CONTROL(m_acr))
+ {
+ shift_in();
+ }
}
-
- m_out_cb1 = 1;
- m_cb1_handler(m_out_cb1);
-
- if (SI_T2_CONTROL(m_acr) || SI_O2_CONTROL(m_acr))
+ else // falling flank
{
- shift_in();
+ if (SO_T2_RATE(m_acr) || SO_T2_CONTROL(m_acr) || SO_O2_CONTROL(m_acr))
+ {
+ shift_out();
+ }
}
if (SO_T2_RATE(m_acr) || m_shift_counter)
{
if (SI_O2_CONTROL(m_acr) || SO_O2_CONTROL(m_acr))
{
- m_shift_timer->adjust(clocks_to_attotime(2));
+ m_shift_timer->adjust(clocks_to_attotime(1));
}
else
{
- m_shift_timer->adjust(clocks_to_attotime((m_t2ll + 2)*2));
+ m_shift_timer->adjust(clocks_to_attotime(m_t2ll + 2));
}
}
break;
@@ -615,17 +624,28 @@ READ8_MEMBER( via6522_device::read )
break;
case VIA_SR:
+ LOGSHIFT("Read SR: %02x ", m_sr);
val = m_sr;
- m_shift_counter=0;
+ m_out_cb1 = 1;
+ m_shift_counter = 8;
clear_int(INT_SR);
+ LOGSHIFT("ACR: %02x ", m_acr);
if (SI_O2_CONTROL(m_acr))
{
- m_shift_timer->adjust(clocks_to_attotime(2));
+ m_shift_timer->adjust(clocks_to_attotime(1));
+ LOGSHIFT("SI_O2 starts timer ");
+ }
+ else if (SI_T2_CONTROL(m_acr))
+ {
+ m_shift_timer->adjust(clocks_to_attotime(m_t2ll + 2));
+ LOGSHIFT("SI_T2 starts timer ");
}
- if (SI_T2_CONTROL(m_acr))
+ else if (! (SO_O2_CONTROL(m_acr) || SO_T2_CONTROL(m_acr) || SO_T2_RATE(m_acr)))
{
- m_shift_timer->adjust(clocks_to_attotime((m_t2ll + 2)*2));
+ m_shift_timer->adjust(attotime::never);
+ LOGSHIFT("Timer stops");
}
+ LOGSHIFT("\n");
break;
case VIA_PCR:
@@ -656,6 +676,8 @@ WRITE8_MEMBER( via6522_device::write )
{
offset &=0x0f;
+ LOGSETUP(" * %s Reg %02x <- %02x \n", tag(), offset, data);
+
switch (offset)
{
case VIA_PB:
@@ -776,25 +798,33 @@ WRITE8_MEMBER( via6522_device::write )
case VIA_SR:
m_sr = data;
- m_shift_counter=0;
+ LOGSHIFT("Write SR: %02x\n", m_sr);
+ m_out_cb1 = 1;
+ m_shift_counter = 8;
clear_int(INT_SR);
+ LOGSHIFT("ACR: %02x ", m_acr);
if (SO_O2_CONTROL(m_acr))
{
- m_shift_timer->adjust(clocks_to_attotime(2));
+ m_shift_timer->adjust(clocks_to_attotime(1));
+ LOGSHIFT("SO_O2 starts timer");
+ }
+ else if (SO_T2_RATE(m_acr) || SO_T2_CONTROL(m_acr))
+ {
+ m_shift_timer->adjust(clocks_to_attotime(m_t2ll + 2));
+ LOGSHIFT("SO_T2 starts timer");
}
- if (SO_T2_RATE(m_acr) || SO_T2_CONTROL(m_acr))
+ else if (! (SI_O2_CONTROL(m_acr) || SI_T2_CONTROL(m_acr)))
{
- m_shift_timer->adjust(clocks_to_attotime((m_t2ll + 2)*2));
+ m_shift_timer->adjust(attotime::never); // In case we change mode before counter expire
+ LOGSHIFT("Timer stops");
}
+ LOGSHIFT("\n");
break;
case VIA_PCR:
m_pcr = data;
- if (TRACE_VIA)
- {
- logerror("%s:6522VIA chip %s: PCR = %02X\n", machine().describe_context(), tag(), data);
- }
+ LOG("%s:6522VIA chip %s: PCR = %02X\n", machine().describe_context(), tag(), data);
if (CA2_FIX_OUTPUT(data) && m_out_ca2 != CA2_OUTPUT_LEVEL(data))
{
@@ -813,14 +843,32 @@ WRITE8_MEMBER( via6522_device::write )
{
uint16_t counter1 = get_counter1_value();
m_acr = data;
+ LOGSHIFT("Write ACR: %02x ", m_acr);
output_pb();
- if (T1_CONTINUOUS(data))
+ LOGSHIFT("Shift mode [%02x]: ", (m_acr >> 2) & 7);
+ if (SR_DISABLED(m_acr)) LOGSHIFT("Disabled");
+ if (SI_T2_CONTROL(m_acr)) LOGSHIFT("IN on T2");
+ if (SI_O2_CONTROL(m_acr)) LOGSHIFT("IN on O2");
+ if (SI_EXT_CONTROL(m_acr)) LOGSHIFT("IN on EXT");
+ if (SO_T2_RATE(m_acr)) LOGSHIFT("OUT on continous T2");
+ if (SO_T2_CONTROL(m_acr)) LOGSHIFT("OUT on T2");
+ if (SO_O2_CONTROL(m_acr)) LOGSHIFT("OUT on O2");
+ if (SO_EXT_CONTROL(m_acr)) LOGSHIFT("OUT on EXT");
+
+ if (SR_DISABLED(m_acr) || SI_EXT_CONTROL(m_acr) || SO_EXT_CONTROL(m_acr))
+ {
+ m_shift_timer->adjust(attotime::never);
+ LOGSHIFT(" Timer stops");
+ }
+
+ if (T1_CONTINUOUS(m_acr))
{
m_t1->adjust(clocks_to_attotime(counter1 + IFR_DELAY));
m_t1_active = 1;
}
+ LOGSHIFT("\n");
}
break;
@@ -870,8 +918,7 @@ WRITE_LINE_MEMBER( via6522_device::write_ca1 )
{
m_in_ca1 = state;
- if (TRACE_VIA)
- logerror("%s:6522VIA chip %s: CA1 = %02X\n", machine().describe_context(), tag(), m_in_ca1);
+ LOG("%s:6522VIA chip %s: CA1 = %02X\n", machine().describe_context(), tag(), m_in_ca1);
if ((m_in_ca1 && CA1_LOW_TO_HIGH(m_pcr)) || (!m_in_ca1 && CA1_HIGH_TO_LOW(m_pcr)))
{
@@ -942,12 +989,12 @@ WRITE_LINE_MEMBER( via6522_device::write_cb1 )
m_latch_b = input_pb();
}
- if (SO_EXT_CONTROL(m_acr))
+ if (!state && SO_EXT_CONTROL(m_acr))
{
shift_out();
}
- if (SI_EXT_CONTROL(m_acr))
+ if (state && SI_EXT_CONTROL(m_acr))
{
shift_in();
}
@@ -960,6 +1007,18 @@ WRITE_LINE_MEMBER( via6522_device::write_cb1 )
m_cb2_handler(1);
}
}
+ else // shift is not controlled by m_pcr
+ {
+ if (!state && SO_EXT_CONTROL(m_acr))
+ {
+ shift_out();
+ }
+
+ if (state && SI_EXT_CONTROL(m_acr))
+ {
+ shift_in();
+ }
+ }
}
}
diff --git a/src/devices/machine/68153bim.cpp b/src/devices/machine/68153bim.cpp
index a5ee8d17542..d7e4fc0f375 100644
--- a/src/devices/machine/68153bim.cpp
+++ b/src/devices/machine/68153bim.cpp
@@ -2,13 +2,13 @@
// copyright-holders: Joakim Larsson Edstrom
/***************************************************************************
- 68153 BIM Bus Interrupter Module
+ 68153 BIM Bus Interrupter Module
- The Bus Interrupter Module (BIM) provides an interface between interrupting devices and a system bus such as
- the VMEbus or VERSAbusâ„¢. It generates a maximum of 7 bus interrupts on the IRQ1-IRQ7 outputs and responds to
- interrupt acknowledge cycles for up to 4 independent slaves. The BIM can also supply an interrupt vector
- during an interrupt acknowledge cycle. Moreover, it sits in the interrupt acknowledge daisychain which allows
- for multiple interrupts on the level acknowledged.
+ The Bus Interrupter Module (BIM) provides an interface between interrupting devices and a system bus such as
+ the VMEbus or VERSAbusâ„¢. It generates a maximum of 7 bus interrupts on the IRQ1-IRQ7 outputs and responds to
+ interrupt acknowledge cycles for up to 4 independent slaves. The BIM can also supply an interrupt vector
+ during an interrupt acknowledge cycle. Moreover, it sits in the interrupt acknowledge daisychain which allows
+ for multiple interrupts on the level acknowledged.
----- Features ----------------------------------------------------------
x 4 channels
@@ -19,7 +19,7 @@
Full functionality is implemented
-------------------------------------------------------------------------
- Level of implementation: x = done p = partial
+ Level of implementation: x = done p = partial
-------------------------------------------------------------------------
*/
@@ -65,7 +65,7 @@
//**************************************************************************
// device type definition
const device_type MC68153_CHANNEL = &device_creator<bim68153_channel>;
-const device_type MC68153 = &device_creator<bim68153_device>;
+const device_type MC68153 = &device_creator<bim68153_device>;
const device_type EI68C153 = &device_creator<ei68c153_device>;
//-------------------------------------------------
@@ -185,14 +185,14 @@ IRQ_CALLBACK_MEMBER(bim68153_device::iack)
{
int vec = M68K_INT_ACK_AUTOVECTOR;
int found = 0;
- // int level = 0;
+ // int level = 0;
int ch = -1;
LOGIACK("%s %s()\n", tag(), FUNCNAME);
- /* 1. No further action required — This occurs if IACKIN is not asserted. Asserting IACKN only starts the BIM activity.
- * If the daisy chain signal never reaches the BIM (IACKIN is not asserted), another interrupter has responded to the
- * IACK cycle. The cycle will end, the IACK is negated, and no additional action is required. */
+ /* 1. No further action required — This occurs if IACKIN is not asserted. Asserting IACKN only starts the BIM activity.
+ * If the daisy chain signal never reaches the BIM (IACKIN is not asserted), another interrupter has responded to the
+ * IACK cycle. The cycle will end, the IACK is negated, and no additional action is required. */
if (m_iackin == CLEAR_LINE)
{
m_out_iackout_cb(CLEAR_LINE);
@@ -205,15 +205,15 @@ IRQ_CALLBACK_MEMBER(bim68153_device::iack)
if (elem->m_int_state == bim68153_channel::PENDING && elem->m_control & bim68153_channel::REG_CNTRL_INT_ENABLE)
{ // and the level matches
if ((elem->m_control & bim68153_channel::REG_CNTRL_INT_LVL_MSK) == irqline)
- { // then remember it
+ { // then remember it
ch = get_channel_index(elem);
}
found = 1;
}
}
- /* 2. Pass on the interrupt daisy chain — For this case, IACKIN input is asserted by the preceding daisy chain interrupter,
- * and IACKOUT output is in turn asserted. The daisy chain signal is passed on when no interrupts are pending on a matching
- * level or when any possible interrupts are disabled. The Interrupt Enable (IRE) bit of a control register can disable any
+ /* 2. Pass on the interrupt daisy chain — For this case, IACKIN input is asserted by the preceding daisy chain interrupter,
+ * and IACKOUT output is in turn asserted. The daisy chain signal is passed on when no interrupts are pending on a matching
+ * level or when any possible interrupts are disabled. The Interrupt Enable (IRE) bit of a control register can disable any
* interrupt requests, and in turn, any possible matches */
if (found == 0)
{
@@ -226,10 +226,10 @@ IRQ_CALLBACK_MEMBER(bim68153_device::iack)
if ((m_chn[ch]->m_control & bim68153_channel::REG_CNTRL_INT_EXT) == 0)
{
- /* 3. Respond internally - For this case, IACKIN is asserted and a match is found. The BIM completes the IACK cycle by
- * supplying an interrupt vector from the proper vector register followed by a DTACK signal asserted because the interrupt
- * acknowledge cycle is completed by this device. For the BIM to respond in this mode of operation, the EXTERNAL/INTERNAl
- * control register bit (X/IN) must be zero. For each source of interrupt request, the associated control register determines
+ /* 3. Respond internally - For this case, IACKIN is asserted and a match is found. The BIM completes the IACK cycle by
+ * supplying an interrupt vector from the proper vector register followed by a DTACK signal asserted because the interrupt
+ * acknowledge cycle is completed by this device. For the BIM to respond in this mode of operation, the EXTERNAL/INTERNAl
+ * control register bit (X/IN) must be zero. For each source of interrupt request, the associated control register determines
* the BIM response to an IACK cycle, and the X/IN bit sets this response either internally (X/IN = 0 ) or externally (X/IN = 1). */
vec = m_chn[ch]->m_vector; // Internal vector
@@ -237,8 +237,8 @@ IRQ_CALLBACK_MEMBER(bim68153_device::iack)
else
{
/* 4. Respond externally — For the final case, IACKIN is also asserted, a match is found and the associated control register has
- * X/IN bit set to one. The BIM does not assert IACKOUT and does assert INTAE low.INTAE signals that the requesting device must
- * complete the IACK cycle (supplying a vector and DTACK) and that the 2-bit code contained on outputs INTALO and INTAL1 shows
+ * X/IN bit set to one. The BIM does not assert IACKOUT and does assert INTAE low.INTAE signals that the requesting device must
+ * complete the IACK cycle (supplying a vector and DTACK) and that the 2-bit code contained on outputs INTALO and INTAL1 shows
* which interrupt source is being acknowledged*/
vec = m_chn[ch]->m_out_iack_cb(); // External vector
@@ -255,7 +255,7 @@ IRQ_CALLBACK_MEMBER(bim68153_device::iack)
m_chn[ch]->m_control &= ~bim68153_channel::REG_CNTRL_INT_ENABLE;
}
- // This is not explicitly said in the 68153 datasheet but what would a flag be used for otherwise?
+ // This is not explicitly said in the 68153 datasheet but what would a flag be used for otherwise?
m_chn[ch]->m_control &= ~bim68153_channel::REG_CNTRL_INT_FLAG;
m_out_iackout_cb(CLEAR_LINE);
@@ -291,7 +291,7 @@ void bim68153_device::trigger_interrupt(int ch)
m_out_iackout_cb(ASSERT_LINE);
// Set flag
- // This is not explicitly said in the 68153 datasheet but what would a flag be used for otherwise?
+ // This is not explicitly said in the 68153 datasheet but what would a flag be used for otherwise?
m_chn[ch]->m_control |= bim68153_channel::REG_CNTRL_INT_FLAG;
// assert interrupt
@@ -306,7 +306,7 @@ READ8_MEMBER( bim68153_device::read )
int vc = offset & REG_VECTOR;
int ch = offset & CHN_MSK;
- LOGR(" * %s %d Reg %s -> %02x \n", m_owner->tag(), ch, vc ? "vector" : "control",
+ LOGR(" * %s %d Reg %s -> %02x \n", m_owner->tag(), ch, vc ? "vector" : "control",
vc ? m_chn[ch]->do_bimreg_vector_r() : m_chn[ch]->do_bimreg_control_r());
return vc ? m_chn[ch]->do_bimreg_vector_r() : m_chn[ch]->do_bimreg_control_r();
@@ -404,10 +404,10 @@ void bim68153_channel::do_bimreg_control_w(uint8_t data)
LOG("%s ch %d set control to %02x\n", FUNCNAME, m_index, data);
LOGSETUP(" - Lev:%d Auto Disable:%d Int Enable:%d Vector:%d Auto Clear:%d Flag:%d\n",
data & REG_CNTRL_INT_LVL_MSK,
- data & REG_CNTRL_INT_AUT_DIS ? 1 : 0,
- data & REG_CNTRL_INT_ENABLE ? 1 : 0,
- data & REG_CNTRL_INT_EXT ? 1 : 0,
- data & REG_CNTRL_INT_AUT_CLR ? 1 : 0,
+ data & REG_CNTRL_INT_AUT_DIS ? 1 : 0,
+ data & REG_CNTRL_INT_ENABLE ? 1 : 0,
+ data & REG_CNTRL_INT_EXT ? 1 : 0,
+ data & REG_CNTRL_INT_AUT_CLR ? 1 : 0,
data & REG_CNTRL_INT_FLAG ? 1 : 0);
m_control = data;
diff --git a/src/devices/machine/68153bim.h b/src/devices/machine/68153bim.h
index 414abebf1b6..f9df8a1b1e1 100644
--- a/src/devices/machine/68153bim.h
+++ b/src/devices/machine/68153bim.h
@@ -10,11 +10,11 @@
* CS* 3 | | 38 A1
* DTACK* 4 | | 37 D7
* IACK* 5 | | 36 D6
-* IACKIN* 6 | | 35 D5
-* IACKOUT* 7 | | 34 D4
-* IRQ1* 8 | | 33 D3
-* GND 9 | | 32 D2
-* GND 10 | | 31 GND
+* IACKIN* 6 | | 35 D5
+* IACKOUT* 7 | | 34 D4
+* IRQ1* 8 | | 33 D3
+* GND 9 | | 32 D2
+* GND 10 | | 31 GND
* Vcc 11 | | 30 VCC
* IRQ2* 12 | MC68153 | 29 D1
* IRQ3* 13 | EI68C153 | 28 D0
@@ -206,7 +206,7 @@ protected:
devcb_write_line m_out_intal1_cb;
// Daisy chain signals
- devcb_read8 m_out_iackout_cb;
+ devcb_read8 m_out_iackout_cb;
int m_iackin;
int m_irq_level;
};
diff --git a/src/devices/machine/6821pia.cpp b/src/devices/machine/6821pia.cpp
index 41d205870cf..ab71db7bfa6 100644
--- a/src/devices/machine/6821pia.cpp
+++ b/src/devices/machine/6821pia.cpp
@@ -16,7 +16,7 @@
#define LOG_GENERAL 0x01
#define LOG_SETUP 0x02
#define LOG_PRINTF 0x04
-#define LOG_CA1 0x08
+#define LOG_CA1 0x08
#define VERBOSE 0 //(LOG_PRINTF | LOG_SETUP | LOG_GENERAL)
diff --git a/src/devices/machine/68230pit.cpp b/src/devices/machine/68230pit.cpp
index 2e03051727a..32b79ccc5a9 100644
--- a/src/devices/machine/68230pit.cpp
+++ b/src/devices/machine/68230pit.cpp
@@ -31,7 +31,7 @@
#define LOG_DR 0x20
#define LOG_INT 0x40
-#define VERBOSE 0 // (LOG_PRINTF | LOG_SETUP | LOG_GENERAL | LOG_INT | LOG_BIT | LOG_DR)
+#define VERBOSE 0 //(LOG_PRINTF | LOG_SETUP | LOG_GENERAL | LOG_INT | LOG_BIT | LOG_DR)
#define LOGMASK(mask, ...) do { if (VERBOSE & mask) logerror(__VA_ARGS__); } while (0)
#define LOGLEVEL(mask, level, ...) do { if ((VERBOSE & mask) >= level) logerror(__VA_ARGS__); } while (0)
@@ -142,19 +142,30 @@ pit68230_device::pit68230_device(const machine_config &mconfig, const char *tag,
//-------------------------------------------------
void pit68230_device::device_start ()
{
- LOG("%s\n", FUNCNAME);
+ LOGSETUP("%s\n", FUNCNAME);
- // resolve callbacks
+ // NOTE:
+ // Not using resolve_safe for the m_px_in_cb's is a temporary way to be able to check
+ // if a handler is installed with isnull(). The safe function installs a dummy default
+ // handler which disable the isnull() test. TODO: Need a better fix?
+
+ // resolve callbacks Port A
m_pa_out_cb.resolve_safe();
m_pa_in_cb.resolve();
+
+ // resolve callbacks Port B
m_pb_out_cb.resolve_safe();
m_pb_in_cb.resolve();
+
+ // resolve callbacks Port C
m_pc_out_cb.resolve_safe();
- m_pc_in_cb.resolve(); // A temporary way to check if handler is installed with isnull(). TODO: Need better fix.
+ m_pc_in_cb.resolve();
+
m_h1_out_cb.resolve_safe();
m_h2_out_cb.resolve_safe();
m_h3_out_cb.resolve_safe();
m_h4_out_cb.resolve_safe();
+
m_tirq_out_cb.resolve_safe();
m_pirq_out_cb.resolve_safe();
@@ -186,7 +197,7 @@ void pit68230_device::device_start ()
//-------------------------------------------------
void pit68230_device::device_reset ()
{
- LOG("%s %s \n",tag(), FUNCNAME);
+ LOGSETUP("%s %s \n",tag(), FUNCNAME);
m_pgcr = 0;
m_psrr = 0;
@@ -203,6 +214,7 @@ void pit68230_device::device_reset ()
m_tcr = 0;
m_tivr = 0x0f; m_tirq_out_cb(CLEAR_LINE);
m_tsr = 0;
+ LOGSETUP("%s %s DONE!\n",tag(), FUNCNAME);
}
/*
@@ -280,9 +292,60 @@ void pit68230_device::device_timer (emu_timer &timer, device_timer_id id, int32_
}
}
-void pit68230_device::h1_set (uint8_t state)
+WRITE_LINE_MEMBER( pit68230_device::h1_w )
+{
+ LOGBIT("%s %s H1 set to %d\n", tag(), FUNCNAME, state);
+
+ // Set the direct level in PSR
+ m_psr = ((state == 0) ? (m_psr & ~REG_PSR_H1L) : (m_psr | REG_PSR_H1L));
+
+ // Set the programmed assert level in PSR
+ if (m_pgcr & REG_PGCR_H1_SENSE)
+ m_psr = ((state != 0) ? (m_psr & ~REG_PSR_H1S) : (m_psr | REG_PSR_H1S));
+ else
+ m_psr = ((state == 0) ? (m_psr & ~REG_PSR_H1S) : (m_psr | REG_PSR_H1S));
+}
+
+WRITE_LINE_MEMBER( pit68230_device::h2_w )
+{
+ LOGBIT("%s %s H2 set to %d\n", tag(), FUNCNAME, state);
+
+ // Set the direct level in PSR
+ m_psr = ((state == 0) ? (m_psr & ~REG_PSR_H2L) : (m_psr | REG_PSR_H2L));
+
+ // Set the programmed assert level in PSR
+ if (m_pgcr & REG_PGCR_H2_SENSE)
+ m_psr = ((state != 0) ? (m_psr & ~REG_PSR_H2S) : (m_psr | REG_PSR_H2S));
+ else
+ m_psr = ((state == 0) ? (m_psr & ~REG_PSR_H2S) : (m_psr | REG_PSR_H2S));
+}
+
+WRITE_LINE_MEMBER( pit68230_device::h3_w )
+{
+ LOGBIT("%s %s H3 set to %d\n", tag(), FUNCNAME, state);
+
+ // Set the direct level in PSR
+ m_psr = ((state == 0) ? (m_psr & ~REG_PSR_H3L) : (m_psr | REG_PSR_H3L));
+
+ // Set the programmed assert level in PSR
+ if (m_pgcr & REG_PGCR_H3_SENSE)
+ m_psr = ((state != 0) ? (m_psr & ~REG_PSR_H3S) : (m_psr | REG_PSR_H3S));
+ else
+ m_psr = ((state == 0) ? (m_psr & ~REG_PSR_H3S) : (m_psr | REG_PSR_H3S));
+}
+
+WRITE_LINE_MEMBER( pit68230_device::h4_w )
{
- if (state) m_psr |= 1; else m_psr &= ~1;
+ LOGBIT("%s %s H4 set to %d\n", tag(), FUNCNAME, state);
+
+ // Set the direct level in PSR
+ m_psr = ((state == 0) ? (m_psr & ~REG_PSR_H4L) : (m_psr | REG_PSR_H4L));
+
+ // Set the programmed assert level in PSR
+ if (m_pgcr & REG_PGCR_H4_SENSE)
+ m_psr = ((state != 0) ? (m_psr & ~REG_PSR_H4S) : (m_psr | REG_PSR_H4S));
+ else
+ m_psr = ((state == 0) ? (m_psr & ~REG_PSR_H4S) : (m_psr | REG_PSR_H4S));
}
// TODO: remove this method and replace it with a call to pb_update_bit() in force68k.cpp
@@ -293,7 +356,7 @@ void pit68230_device::portb_setbit(uint8_t bit, uint8_t state)
void pit68230_device::pa_update_bit(uint8_t bit, uint8_t state)
{
- LOGBIT("%s %s bit %d to %d\n",tag(), FUNCNAME, bit, state);
+ LOGBIT("%s %s bit %d to %d\n", tag(), FUNCNAME, bit, state);
// Check if requested bit is an output bit and can't be affected
if (m_paddr & (1 << bit))
{
@@ -848,7 +911,7 @@ uint8_t pit68230_device::rr_pitreg_pcdr()
{
m_pcdr |= (m_pcil & ~m_pcddr);
}
-
+
if (m_pcdr != 0) { LOGDR("%s %s <- %02x\n",tag(), FUNCNAME, m_pcdr); }
return m_pcdr;
@@ -860,9 +923,8 @@ the instantaneous pin level is read and no input latching is performed except at
data bus interface. Writes to this address are answered with DTACK, but the data is ignored.*/
uint8_t pit68230_device::rr_pitreg_paar()
{
- // NOTE: no side effect emulated so using ..padr
uint8_t ret;
- ret = m_pa_in_cb();
+ ret = m_pa_in_cb.isnull() ? 0 : m_pa_in_cb();
LOGR("%s %s <- %02x\n",tag(), FUNCNAME, ret);
return ret;
}
@@ -873,9 +935,8 @@ the instantaneous pin level is read and no input latching is performed except at
data bus interface.Writes to this address are answered with DTACK, but the data is ignored.*/
uint8_t pit68230_device::rr_pitreg_pbar()
{
- // NOTE: no side effect emulated so using ..pbdr
uint8_t ret;
- ret = m_pb_in_cb();
+ ret = m_pb_in_cb.isnull() ? 0 : m_pb_in_cb();
LOGR("%s %s <- %02x\n",tag(), FUNCNAME, ret);
return ret;
}
diff --git a/src/devices/machine/68230pit.h b/src/devices/machine/68230pit.h
index 79c30aa0b2a..396ba854891 100644
--- a/src/devices/machine/68230pit.h
+++ b/src/devices/machine/68230pit.h
@@ -131,7 +131,8 @@ class pit68230_device : public device_t//, public device_execute_interface
DECLARE_WRITE8_MEMBER (write);
DECLARE_READ8_MEMBER (read);
- void h1_set (uint8_t state);
+ // TODO: remove these methods and replace it with a call to methods below in force68k.cpp
+ void h1_set (uint8_t state){ if (state) m_psr |= 1; else m_psr &= ~1; }
void portb_setbit (uint8_t bit, uint8_t state);
// Bit updaters
@@ -140,6 +141,11 @@ class pit68230_device : public device_t//, public device_execute_interface
void pc_update_bit(uint8_t bit, uint8_t state);
void update_tin(uint8_t);
+ DECLARE_WRITE_LINE_MEMBER( h1_w );
+ DECLARE_WRITE_LINE_MEMBER( h2_w );
+ DECLARE_WRITE_LINE_MEMBER( h3_w );
+ DECLARE_WRITE_LINE_MEMBER( h4_w );
+
DECLARE_WRITE_LINE_MEMBER( pa0_w ){ pa_update_bit(0, state); }
DECLARE_WRITE_LINE_MEMBER( pa1_w ){ pa_update_bit(1, state); }
DECLARE_WRITE_LINE_MEMBER( pa2_w ){ pa_update_bit(2, state); }
@@ -270,6 +276,17 @@ protected:
};
enum {
+ REG_PSR_H1S = 0x01,
+ REG_PSR_H2S = 0x02,
+ REG_PSR_H3S = 0x04,
+ REG_PSR_H4S = 0x08,
+ REG_PSR_H1L = 0x10,
+ REG_PSR_H2L = 0x20,
+ REG_PSR_H3L = 0x40,
+ REG_PSR_H4L = 0x80,
+ };
+
+ enum {
REG_TCR_TIMER_ENABLE = 0x01
};
diff --git a/src/devices/machine/68561mpcc.cpp b/src/devices/machine/68561mpcc.cpp
index 7ee3880877c..ff4c1bb1882 100644
--- a/src/devices/machine/68561mpcc.cpp
+++ b/src/devices/machine/68561mpcc.cpp
@@ -1,481 +1,1195 @@
-// license:BSD-3-Clause
-// copyright-holders:Sergey Svishchev
-/*********************************************************************
+// license:BSD-3-Clause copyright-holders: Joakim Larsson Edstrom
+/***************************************************************************
- 68561mpcc.c
+ MPCC Multi-Protocol Communications Controller emulation
+
+ The MPCC was introduced in the late 80:ies by Rockwell
+
+ The variants in the MPCC family are as follows:
+
+ - 68560 with an 8 bit data bus
+ - 68560A with an 8 bit data bus and some enhancements
+ - 68561 with a 16 bit data bus
+ - 68561A with a 16 bit data bus and some enhancements
+
+FEATURES
+------------------------------------------------------------------
+ * Full duplex synchronous/asynchronous receiver and transmitter
+ * Implements IBM Binary Synchronous Communications (BSC) in two coding formats: ASCII and EBCDIC
+ * Supports other synchronous character -oriented protocols (COP), such as six -bit BSC, X3.28k. ISO IS1745, ECMA-16, etc.
+ * Supports synchronous bit oriented protocols (BOP), such as SDLC, HDLC, X.25, etc.
+ * Asynchronous and isochronous modes
+ * Modem handshake interface
+ * High speed serial data rate (DC to 4 MHz)
+ * Internal oscillator and baud rate generator with programmable data rate
+ * Crystal or TTL level clock input and buffered clock output (8 MHz)
+ * Direct interface to 68008/68000 asynchronous bus
+ * Eight -character receiver and transmitter buffer registers
+ * 22 directly addressable registers for flexible option selection, complete status reporting, and data transfer
+ * Three separate programmable interrupt vector numbers for receiver, transmitter and serial interface
+ * Maskable interrupt conditions for receiver, transmitter and serial interface
+ * Programmable microprocessor bus data transfer; polled, interrupt and two -channel DMA transfer compatible with MC68440/MC68450
+ * Clock control register for receiver clock divisor and receiver and transmitter clock routing
+ * Selectable full/half duplex, autoecho and local loop -back modes
+ * Selectable parity (enable, odd, even) and CRC (control field enable, CRC -16, CCITT V.41, VRC/LRC)
+ *-------------------------------------------------------------------------------------------
+ * x = Features that has been implemented p = partly n = features that will not
+ *-------------------------------------------------------------------------------------------
+*/
- Rockwell 68561 MPCC (Multi Protocol Communications Controller)
+#include "emu.h"
+#include "68561mpcc.h"
- skeleton driver, just enough for besta.c console to work
+//**************************************************************************
+// MACROS / CONSTANTS
+//**************************************************************************
+#define LOG_GENERAL 0x001
+#define LOG_SETUP 0x002
+#define LOG_PRINTF 0x004
+#define LOG_READ 0x008
+#define LOG_INT 0x010
+#define LOG_CMD 0x020
+#define LOG_TX 0x040
+#define LOG_RCV 0x080
+#define LOG_CTS 0x100
+#define LOG_DCD 0x200
+#define LOG_SYNC 0x400
+#define LOG_CHAR 0x800
+#define LOG_RX 0x1000
+
+#define VERBOSE 0 // (LOG_PRINTF | LOG_SETUP | LOG_GENERAL)
+
+#define LOGMASK(mask, ...) do { if (VERBOSE & mask) logerror(__VA_ARGS__); } while (0)
+#define LOGLEVEL(mask, level, ...) do { if ((VERBOSE & mask) >= level) logerror(__VA_ARGS__); } while (0)
+
+#define LOG(...) LOGMASK(LOG_GENERAL, __VA_ARGS__)
+#define LOGSETUP(...) LOGMASK(LOG_SETUP, __VA_ARGS__)
+#define LOGR(...) LOGMASK(LOG_READ, __VA_ARGS__)
+#define LOGINT(...) LOGMASK(LOG_INT, __VA_ARGS__)
+#define LOGCMD(...) LOGMASK(LOG_CMD, __VA_ARGS__)
+#define LOGTX(...) LOGMASK(LOG_TX, __VA_ARGS__)
+#define LOGRCV(...) LOGMASK(LOG_RCV, __VA_ARGS__)
+#define LOGCTS(...) LOGMASK(LOG_CTS, __VA_ARGS__)
+#define LOGDCD(...) LOGMASK(LOG_DCD, __VA_ARGS__)
+#define LOGSYNC(...) LOGMASK(LOG_SYNC, __VA_ARGS__)
+#define LOGCHAR(...) LOGMASK(LOG_CHAR, __VA_ARGS__)
+#define LOGRX(...) LOGMASK(LOG_RX, __VA_ARGS__)
+
+#if VERBOSE & LOG_PRINTF
+#define logerror printf
+#endif
-*********************************************************************/
+#ifdef _MSC_VER
+#define FUNCNAME __func__
+#define LLFORMAT "%I64d"
+#else
+#define FUNCNAME __PRETTY_FUNCTION__
+#define LLFORMAT "%lld"
+#endif
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+// device type definition
+const device_type MPCC = &device_creator<mpcc_device>;
+const device_type MPCC68560 = &device_creator<mpcc68560_device>;
+const device_type MPCC68560A = &device_creator<mpcc68560A_device>;
+const device_type MPCC68561 = &device_creator<mpcc68561_device>;
+const device_type MPCC68561A = &device_creator<mpcc68561A_device>;
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+mpcc_device::mpcc_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source)
+ : device_t(mconfig, type, name, tag, owner, clock, shortname, source),
+ device_serial_interface(mconfig, *this),
+ m_variant(variant),
+ m_rxc(0),
+ m_txc(0),
+ m_brg_rate(0),
+ m_rcv(0),
+ m_rxd(0),
+ m_tra(0),
+ m_out_txd_cb(*this),
+ m_out_dtr_cb(*this),
+ m_out_rts_cb(*this),
+ m_out_rtxc_cb(*this),
+ m_out_trxc_cb(*this),
+ m_out_int_cb(*this),
+ m_rsr(0),
+ m_rcr(0),
+ m_rdr(0),
+ m_rivnr(0),
+ m_rier(0),
+ m_tsr(0),
+ m_tcr(0),
+ m_tdr(0),
+ m_tivnr(0),
+ m_tier(0),
+ m_sisr(0),
+ m_sicr(0),
+ m_sivnr(0),
+ m_sier(0),
+ m_psr1(0),
+ m_psr2(0),
+ m_ar1(0),
+ m_ar2(0),
+ m_brdr1(0),
+ m_brdr2(0),
+ m_ccr(0),
+ m_ecr(0)
+{
+ for (auto & elem : m_int_state)
+ elem = 0;
+}
-#include "emu.h"
-#include "68561mpcc.h"
+mpcc_device::mpcc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, MPCC, "Rockwell MPCC", tag, owner, clock, "mpcc", __FILE__),
+ device_serial_interface(mconfig, *this),
+ m_variant(TYPE_MPCC),
+ m_rxc(0),
+ m_txc(0),
+ m_brg_rate(0),
+ m_rcv(0),
+ m_rxd(0),
+ m_tra(0),
+ m_out_txd_cb(*this),
+ m_out_dtr_cb(*this),
+ m_out_rts_cb(*this),
+ m_out_rtxc_cb(*this),
+ m_out_trxc_cb(*this),
+ m_out_int_cb(*this),
+ m_rsr(0),
+ m_rcr(0),
+ m_rdr(0),
+ m_rivnr(0),
+ m_rier(0),
+ m_tsr(0),
+ m_tcr(0),
+ m_tdr(0),
+ m_tivnr(0),
+ m_tier(0),
+ m_sisr(0),
+ m_sicr(0),
+ m_sivnr(0),
+ m_sier(0),
+ m_psr1(0),
+ m_psr2(0),
+ m_ar1(0),
+ m_ar2(0),
+ m_brdr1(0),
+ m_brdr2(0),
+ m_ccr(0),
+ m_ecr(0)
+{
+ for (auto & elem : m_int_state)
+ elem = 0;
+}
-const device_type MPCC68561 = &device_creator<mpcc68561_t>;
+mpcc68560_device::mpcc68560_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : mpcc_device(mconfig, MPCC68560, "MPCC 68560", tag, owner, clock, TYPE_MPCC68560, "mpcc68560", __FILE__){ }
+mpcc68560A_device::mpcc68560A_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : mpcc_device(mconfig, MPCC68560A, "MPCC 68560A", tag, owner, clock, TYPE_MPCC68560A, "mpcc68560A", __FILE__){ }
-/***************************************************************************
- PARAMETERS
-***************************************************************************/
+mpcc68561_device::mpcc68561_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : mpcc_device(mconfig, MPCC68561, "MPCC 68561", tag, owner, clock, TYPE_MPCC68561, "mpcc68561", __FILE__){ }
-#define LOG_MPCC (1)
+mpcc68561A_device::mpcc68561A_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : mpcc_device(mconfig, MPCC68561A, "MPCC 68561A", tag, owner, clock, TYPE_MPCC68561A, "mpcc68561A", __FILE__){ }
-/***************************************************************************
- IMPLEMENTATION
-***************************************************************************/
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+void mpcc_device::device_start()
+{
+ LOGSETUP("%s\n", FUNCNAME);
+
+ // resolve callbacks
+ m_out_txd_cb.resolve_safe();
+ m_out_dtr_cb.resolve_safe();
+ m_out_rts_cb.resolve_safe();
+ m_out_rtxc_cb.resolve_safe();
+ m_out_trxc_cb.resolve_safe();
+ m_out_int_cb.resolve_safe();
+
+ // state saving
+ save_item(NAME(m_int_state));
+ save_item(NAME(m_rsr));
+ save_item(NAME(m_rcr));
+ save_item(NAME(m_rdr));
+ save_item(NAME(m_rivnr));
+ save_item(NAME(m_rier));
+ save_item(NAME(m_tsr));
+ save_item(NAME(m_tcr));
+ save_item(NAME(m_tdr));
+ save_item(NAME(m_tivnr));
+ save_item(NAME(m_tier));
+ save_item(NAME(m_sisr));
+ save_item(NAME(m_sicr));
+ save_item(NAME(m_sivnr));
+ save_item(NAME(m_sier));
+ save_item(NAME(m_psr1));
+ save_item(NAME(m_psr2));
+ save_item(NAME(m_ar1));
+ save_item(NAME(m_ar2));
+ save_item(NAME(m_brdr1));
+ save_item(NAME(m_brdr2));
+ save_item(NAME(m_ccr));
+ save_item(NAME(m_ecr));
+ LOG(" - MPCC variant %02x\n", m_variant);
+
+ device_serial_interface::register_save_state(machine().save(), this);
+}
-mpcc68561_t::mpcc68561_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
- device_t(mconfig, MPCC68561, "Rockwell 68561 MPCC", tag, owner, clock, "mpcc68561", __FILE__), mode(0), reg(0), status(0), IRQV(0), MasterIRQEnable(0), lastIRQStat(0), IRQType(),
- intrq_cb(*this)
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+void mpcc_device::device_reset()
{
+ LOGSETUP("%s %s \n",tag(), FUNCNAME);
+
+ // Reset RS232 emulation
+ receive_register_reset();
+ transmit_register_reset();
+
+ // Device reset values
+ m_rsr = 0x00;
+ m_rcr = 0x01;
+ m_rivnr = 0x0f;
+ m_rier = 0x00;
+ m_tsr = 0x80;
+ m_tcr = 0x01;
+ m_tivnr = 0x0f;
+ m_tier = 0x00;
+ m_sisr = 0x00;
+ m_sicr = 0x00;
+ m_sivnr = 0x0f;
+ m_sier = 0x00;
+ m_psr1 = 0x00;
+ m_psr2 = 0x00;
+ m_ar1 = 0x00;
+ m_ar2 = 0x00;
+ m_brdr1 = 0x01;
+ m_brdr2 = 0x00;
+ m_ccr = 0x00;
+ m_ecr = 0x04;
+
+ // Clear fifos
+ m_tx_data_fifo.clear();
+ m_rx_data_fifo.clear();
+
+ // Init out callbacks to known inactive state
+ m_out_txd_cb(1);
+ m_out_dtr_cb(1);
+ m_out_rts_cb(1);
+ m_out_rtxc_cb(1);
+ m_out_trxc_cb(1);
+ m_out_int_cb(1);
}
-/*-------------------------------------------------
- mpcc_updateirqs
--------------------------------------------------*/
+/*
+ * Serial device implementation
+ */
-void mpcc68561_t::updateirqs()
+void mpcc_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
- int irqstat;
+ device_serial_interface::device_timer(timer, id, param, ptr);
+}
- irqstat = 0;
- if (MasterIRQEnable)
+WRITE_LINE_MEMBER(mpcc_device::cts_w)
+{
+ if (state == CLEAR_LINE)
{
- if ((channel[0].txIRQEnable) && (channel[0].txIRQPending))
- {
- IRQType = IRQ_B_TX;
- irqstat = 1;
- }
- else if ((channel[1].txIRQEnable) && (channel[1].txIRQPending))
+ uint8_t old_sisr = m_sisr;
+
+ m_sisr &= ~REG_SISR_CTSLVL;
+ if ( (old_sisr & REG_SISR_CTSLVL) &&
+ (m_sicr & REG_SICR_RTSLVL) &&
+ (m_tcr & REG_TCR_TEN))
{
- IRQType = IRQ_A_TX;
- irqstat = 1;
+ m_sisr |= REG_SISR_CTST;
+ if (m_sier & REG_SIER_CTS)
+ {
+ // TODO: make sure interrupt is issued with the next negative transition of TxC
+ trigger_interrupt(INT_SR_CTS);
+ // TODO: Make sure TxC has negative transition after CTS goes inactive before INT can be reset in SISR7
+ }
}
- else if ((channel[0].extIRQEnable) && (channel[0].extIRQPending))
+ }
+ else
+ m_sisr |= REG_SISR_CTSLVL;
+}
+
+WRITE_LINE_MEMBER(mpcc_device::dsr_w)
+{
+ if (state == ASSERT_LINE)
+ {
+ uint8_t old_sisr = m_sisr;
+
+ m_sisr |= REG_SISR_DSRLVL;
+ if ( !(old_sisr & REG_SISR_DSRLVL) &&
+ !(m_rcr & REG_RCR_RRES))
{
- IRQType = IRQ_B_EXT;
- irqstat = 1;
+ m_sisr |= REG_SISR_DSRT;
+ if (m_sier & REG_SIER_DSR)
+ {
+ // TODO: make sure interrupt is issued with the next negative transition of RxC
+ trigger_interrupt(INT_SR_DSR);
+ // TODO: Make sure RxC has negative transition after DSR goes inactive before INT can be reset in SISR6
+ }
}
- else if ((channel[1].extIRQEnable) && (channel[1].extIRQPending))
+ }
+ else
+ m_sisr &= ~REG_SISR_DSRLVL;
+}
+
+WRITE_LINE_MEMBER(mpcc_device::dcd_w)
+{
+ if (state == CLEAR_LINE)
+ {
+ uint8_t old_sisr = m_sisr;
+
+ m_sisr &= ~REG_SISR_DCDLVL;
+ if ( (old_sisr & REG_SISR_DCDLVL) &&
+ !(m_rcr & REG_RCR_RRES))
{
- IRQType = IRQ_A_EXT;
- irqstat = 1;
+ m_sisr |= REG_SISR_DCDT;
+ if (m_sier & REG_SIER_DCD)
+ {
+ // TODO: make sure interrupt is issued with the next negative transition of RxC
+ trigger_interrupt(INT_SR_DCD);
+ // TODO: Make sure RxC has negative transition before INT can be reset in SISR5
+ }
}
}
else
+ m_sisr |= REG_SISR_DCDLVL;
+}
+
+//-------------------------------------------------
+// get_brg_rate - helper function
+//-------------------------------------------------
+uint32_t mpcc_device::get_brg_rate()
+{
+ uint32_t rate;
+ uint32_t brg_const;
+
+ brg_const = (m_brdr1 | m_brdr2 << 8); // Baud rate divider
+ brg_const += (m_ccr & REG_CCR_PSCDIV) ? 3 : 2; // Add prescaler factor
+ brg_const += (m_psr2 & REG_PSR2_PSEL_MSK) == REG_PSR2_PSEL_ASCII ? 2 : 1; // Add K factor
+ rate = clock() / brg_const;
+
+ return rate;
+}
+
+//-------------------------------------------------
+// get_tx_rate - helper function
+//-------------------------------------------------
+uint32_t mpcc_device::get_tx_rate()
+{
+ uint32_t rate;
+
+ // Check if TxC is an input and use it instead of the BRG
+ if ((m_ccr & REG_CCR_TCLO) == 0)
+ {
+ rate = m_txc;
+ }
+ else
{
- IRQType = IRQ_NONE;
+ rate = get_brg_rate();
}
-// printf("mpcc: irqstat %d, last %d\n", irqstat, lastIRQStat);
-// printf("ch0: en %d pd %d ch1: en %d pd %d\n", channel[0].txIRQEnable, channel[0].txIRQPending, channel[1].txIRQEnable, channel[1].txIRQPending);
+ return rate;
+}
- // don't spam the driver with unnecessary transitions
- if (irqstat != lastIRQStat)
- {
- lastIRQStat = irqstat;
+//-------------------------------------------------
+// get_clock_div - helper function
+//-------------------------------------------------
+uint32_t mpcc_device::get_clock_div()
+{
+ uint32_t clk_div = 1;
- // tell the driver the new IRQ line status if possible
-#if LOG_MPCC
- printf("mpcc68561 IRQ status => %d\n", irqstat);
-#endif
- if(!intrq_cb.isnull())
- intrq_cb(irqstat);
+ switch (m_ccr & REG_CCR_CLKDIV_MSK)
+ {
+ case REG_CCR_CLKDIV_X1 : clk_div = 1; break;
+ case REG_CCR_CLKDIV_X16: clk_div = 16; break;
+ case REG_CCR_CLKDIV_X32: clk_div = 32; break;
+ case REG_CCR_CLKDIV_X64: clk_div = 64; break;
}
+
+ return clk_div;
}
-/*-------------------------------------------------
- mpcc_initchannel
--------------------------------------------------*/
-void mpcc68561_t::initchannel(int ch)
+//-------------------------------------------------
+// get_rx_rate - helper function
+//-------------------------------------------------
+uint32_t mpcc_device::get_rx_rate()
{
- channel[ch].syncHunt = 1;
+ uint32_t rate;
+
+ // Check if TxC is an input and use it instead of the BRG
+ if ((m_ccr & REG_CCR_RCLKIN) == 0)
+ {
+ rate = m_rxc / get_clock_div();
+ }
+ else
+ {
+ rate = get_brg_rate();
+ }
+
+ return rate;
}
-/*-------------------------------------------------
- mpcc_resetchannel
--------------------------------------------------*/
-void mpcc68561_t::resetchannel(int ch)
+//-------------------------------------------------
+// get_word_length - get word length
+//-------------------------------------------------
+uint32_t mpcc_device::get_word_length()
{
- emu_timer *timersave = channel[ch].baudtimer;
+ int bits = 5;
+
+ switch (m_psr2 & REG_PSR2_CHLN_MSK)
+ {
+ case REG_PSR2_CHLN_5: bits = 5; break;
+ case REG_PSR2_CHLN_6: bits = 6; break;
+ case REG_PSR2_CHLN_7: bits = 7; break;
+ case REG_PSR2_CHLN_8: bits = 8; break;
+ }
- memset(&channel[ch], 0, sizeof(Chan));
+ return bits;
+}
- channel[ch].txUnderrun = 1;
- channel[ch].baudtimer = timersave;
+//-------------------------------------------------
+// get_stop_bits - translate stop bit settings for serial interface
+//-------------------------------------------------
+device_serial_interface::stop_bits_t mpcc_device::get_stop_bits()
+{
+ switch (m_psr2 & REG_PSR2_STP_MSK)
+ {
+ case REG_PSR2_STP_1: return STOP_BITS_1;
+ case REG_PSR2_STP_1_5: return STOP_BITS_1_5;
+ case REG_PSR2_STP_2: return STOP_BITS_2;
+ }
- channel[ch].baudtimer->adjust(attotime::never, ch);
+ return STOP_BITS_0;
}
-/*-------------------------------------------------
- mpcc68561_baud_expire - baud rate timer expiry
--------------------------------------------------*/
+//-------------------------------------------------
+// get_parity - translate parity settings for serial interface
+//-------------------------------------------------
+device_serial_interface::parity_t mpcc_device::get_parity()
+{
+ parity_t parity;
+
+ if (m_ecr & REG_ECR_PAREN)
+ {
+ if (m_ecr & REG_ECR_ODDPAR)
+ parity = PARITY_ODD;
+ else
+ parity = PARITY_EVEN;
+ }
+ else
+ {
+ parity = PARITY_NONE;
+ }
+ return parity;
+}
-void mpcc68561_t::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+//-------------------------------------------------
+// update_serial -
+//-------------------------------------------------
+void mpcc_device::update_serial()
{
- Chan *pChan = &channel[id];
- int brconst = pChan->reg_val[13]<<8 | pChan->reg_val[14];
- int rate;
+ int data_bits = get_word_length();
+ stop_bits_t stop_bits = get_stop_bits();
+ parity_t parity = get_parity();
- if (brconst)
+ LOGSETUP(" %s() %s Setting data frame %d+%d%c%s\n", FUNCNAME, m_owner->tag(), 1,
+ data_bits, parity == PARITY_NONE ? 'N' : parity == PARITY_EVEN ? 'E' : 'O',
+ stop_bits == STOP_BITS_1 ? "1" : (stop_bits == STOP_BITS_2 ? "2" : "1.5"));
+
+ set_data_frame(1, data_bits, parity, stop_bits);
+
+ // Setup the Receiver
+ // check if the receiver is in reset mode
+ if (m_rcr & REG_RCR_RRES)
{
- rate = clock() / brconst;
+ LOGSETUP("- Rx in reset\n");
+ set_rcv_rate(0);
}
+ // Rx is running
else
{
- rate = 0;
+ LOGSETUP("- Rx enabled\n");
+ m_brg_rate = get_rx_rate();
+
+ LOGSETUP("- BRG rate %d\n", m_brg_rate);
+ set_rcv_rate(m_brg_rate);
}
- // is baud counter IRQ enabled on this channel?
- // always flag pending in case it's enabled after this
- pChan->baudIRQPending = 1;
- if (pChan->baudIRQEnable)
+ // Setup the Transmitter
+ // check if Rx is in reset
+ if (m_tcr & REG_TCR_TRES)
+ {
+ LOGSETUP("- Tx in reset\n");
+ set_tra_rate(0);
+ }
+ // Tx is running
+ else
{
- if (pChan->extIRQEnable)
+ // Check that Tx is enabled
+ if (m_tcr & REG_TCR_TEN)
+ {
+ LOGSETUP("- Tx enabled\n");
+ m_brg_rate = get_tx_rate();
+
+ LOGSETUP("- BRG rate %d\n", m_brg_rate);
+ set_tra_rate(m_brg_rate);
+ }
+ else
{
- pChan->extIRQPending = 1;
- pChan->baudIRQPending = 0;
- updateirqs();
+ LOGSETUP("- Tx disabled\n");
+ set_tra_rate(0);
}
}
+}
- // reset timer according to current register values
- if (rate)
+//-------------------------------------------------
+// tra_callback - is called for each bit that needs to be transmitted
+//-------------------------------------------------
+void mpcc_device::tra_callback()
+{
+ // Check if transmitter is idle as in disabled
+ if (!(m_tcr & REG_TCR_TEN))
+ {
+ // transmit idle TODO: Support TCR TICS bit
+ LOGTX("%s idle bit\n", FUNCNAME);
+ m_out_txd_cb(1);
+ }
+#if 0
+ // Check if we are transmitting break TODO: Figure out Break support
+ else if (...)
{
- timer.adjust(attotime::from_hz(rate), 0, attotime::from_hz(rate));
+ // transmit break
+ m_out_txd_cb(0);
}
+#endif
+ // Check if there is more bits to send
+ else if (!is_transmit_register_empty())
+ {
+ // Get the next bit
+ int db = transmit_register_get_data_bit();
+ LOGTX("%s bit: %d\n", FUNCNAME, db ? 1 : 0);
+
+ // transmit data
+ m_out_txd_cb(db);
+ }
+ // Otherwise we don't know why we are called...
else
{
- timer.adjust(attotime::never, 0, attotime::never);
+ logerror("%s %s Failed to transmit\n", FUNCNAME, m_owner->tag());
}
}
-/*-------------------------------------------------
- device_start - device-specific startup
--------------------------------------------------*/
+//-------------------------------------------------
+// tra_complete - is called when the transmitter shift register has sent the last bit
+//-------------------------------------------------
+void mpcc_device::tra_complete()
+{
+ // check if transmitter is enabled and we are not sending BREAK level
+ if ((m_tcr & REG_TCR_TEN) && !(m_tcr & REG_TCR_TICS))
+ { // check if there are more data in the fifo
+ if (!m_tx_data_fifo.empty())
+ {
+ transmit_register_setup(m_tx_data_fifo.dequeue()); // Reload the shift register
+ m_tsr |= REG_TSR_TDRA; // Mark fifo as having room for more data
+ }
+ else
+ {
+ m_out_rts_cb(CLEAR_LINE); // TODO: respect the RTSLV bit
+ m_sicr &= ~REG_SICR_RTSLVL;
+ }
+
+ // Check if Tx interrupts are enabled
+ if (m_tier & REG_TIER_TDRA)
+ {
+ // TODO: Check circumstances, eg int on first or every character etc
+ trigger_interrupt(INT_TX_TDRA);
+ }
+ } // Check if sending BREAK
+ else if (m_tcr & REG_TCR_TICS)
+ {
+ // TODO: Should transmit content of AR2, needs investigation
+ m_out_txd_cb(0);
+ }
+ else
+ {
+ // transmit mark
+ m_out_txd_cb(1);
+ }
+}
-void mpcc68561_t::device_start()
+//-------------------------------------------------
+// rcv_callback - called when it is time to sample incomming data bit
+//-------------------------------------------------
+void mpcc_device::rcv_callback()
{
- intrq_cb.resolve_safe();
+ // Check if the Receiver is enabled
+ if (!(m_rcr & REG_RCR_RRES))
+ {
+ receive_register_update_bit(m_rxd);
+ }
+}
- memset(channel, 0, sizeof(channel));
+//-------------------------------------------------
+// rcv_complete -
+//-------------------------------------------------
+void mpcc_device::rcv_complete()
+{
+ uint8_t data;
- mode = 0;
- reg = 0;
- status = 0;
- IRQV = 0;
- MasterIRQEnable = 0;
- lastIRQStat = 0;
- IRQType = IRQ_NONE;
+ receive_register_extract();
+ data = get_received_char();
+ LOGRX("%s %02x [%c]\n", FUNCNAME, isascii(data) ? data : ' ', data);
- channel[0].baudtimer = timer_alloc(0);
+ // receive_data(data);
+ if (m_rx_data_fifo.full())
+ {
+ // receive overrun error detected, new data is lost
+ m_rsr |= REG_RSR_ROVRN;
+ // interrupt if rx overrun interrupt is enabled
+ if (m_rier & REG_RIER_ROVRN)
+ {
+ trigger_interrupt(INT_RX_ROVRN);
+ }
+ }
+ else
+ {
+ m_rx_data_fifo.enqueue(data);
+ m_rsr |= REG_RSR_RDA;
+ // interrupt if rx data availble is enabled
+ if (m_rier & REG_RIER_RDA)
+ {
+ trigger_interrupt(INT_RX_RDA);
+ }
+ }
}
-
-/*-------------------------------------------------
- device_reset - device-specific reset
--------------------------------------------------*/
-void mpcc68561_t::device_reset()
+//-------------------------------------------------
+// write_rx - called by terminal through rs232/diserial
+// when character is sent to board
+//-------------------------------------------------
+WRITE_LINE_MEMBER(mpcc_device::write_rx)
{
- IRQType = IRQ_NONE;
- MasterIRQEnable = 0;
- IRQV = 0;
+ LOGRCV("%s(%d)\n", FUNCNAME, state);
+ m_rxd = state;
- initchannel(0);
- resetchannel(0);
+ //only use rx_w when self-clocked
+ if(m_rxc != 0 || m_brg_rate != 0)
+ device_serial_interface::rx_w(state);
}
-/*-------------------------------------------------
- mpcc_set_status
--------------------------------------------------*/
-void mpcc68561_t::set_status(int _status)
+/*
+ * Interrupts
+ */
+//-------------------------------------------------
+// check_interrupts -
+//-------------------------------------------------
+void mpcc_device::check_interrupts()
{
- status = _status;
-}
+ int state = 0;
+ LOGINT("%s %s \n",tag(), FUNCNAME);
-/*-------------------------------------------------
- mpcc_acknowledge
--------------------------------------------------*/
+ // loop over all interrupt sources
+ for (auto & elem : m_int_state)
+ {
+ state |= elem;
+ }
-void mpcc68561_t::acknowledge()
-{
- if(!intrq_cb.isnull())
- intrq_cb(0);
+ // update IRQ line
+ // If we are not serving any interrupt the IRQ is asserted already and we need to do nothing
+ if ((state & INT_ACK) == 0)
+ {
+ // If there is a new interrupt not yet acknowledged IRQ needs to be asserted
+ if (state & INT_REQ)
+ {
+ m_out_int_cb(ASSERT_LINE);
+ }
+ // Otherwise we just clear the IRQ line allowing other devices to interrupt
+ else
+ {
+ m_out_int_cb(CLEAR_LINE);
+ }
+ }
}
-/*-------------------------------------------------
- mpcc_getreg
--------------------------------------------------*/
+//-------------------------------------------------
+// reset_interrupts -
+//-------------------------------------------------
-uint8_t mpcc68561_t::getreg()
+void mpcc_device::reset_interrupts()
{
- /* Not yet implemented */
- #if LOG_MPCC
- printf("mpcc: port A reg %d read 0x%02x\n", reg, channel[0].reg_val[reg]);
- #endif
-
- if (reg == 0)
+ LOGINT("%s %s \n",tag(), FUNCNAME);
+ // reset internal interrupt sources
+ for (auto & elem : m_int_state)
{
- uint8_t rv = 0;
-
- Chan *ourCh = &channel[0];
+ elem = 0;
+ }
- rv |= (ourCh->txUnderrun) ? 0x40 : 0;
- rv |= (ourCh->syncHunt) ? 0x10 : 0;
- rv |= channel[0].reg_val[0] & 0x05; // pick up TXBE and RXBF bits
+ // check external interrupt sources
+ check_interrupts();
+}
- return rv;
- }
- else if (reg == 10)
+//-----------------------------------------------------------------------
+// trigger_interrupt - called when a potential interrupt condition occurs
+//-------------------------------------------------
+void mpcc_device::trigger_interrupt(int source)
+{
+ LOGINT("%s %s: %02x\n",FUNCNAME, tag(), source);
+ switch(source)
{
- return 0;
+ case INT_TX_TDRA:
+ case INT_TX_TFC:
+ case INT_TX_TUNRN:
+ case INT_TX_TFERR:
+ m_int_state[TX_INT_PRIO] = INT_REQ;
+ break;
+ case INT_RX_RDA:
+ case INT_RX_EOF:
+ case INT_RX_CPERR:
+ case INT_RX_FRERR:
+ case INT_RX_ROVRN:
+ case INT_RX_RAB:
+ m_int_state[RX_INT_PRIO] = INT_REQ;
+ break;
+ case INT_SR_CTS:
+ case INT_SR_DSR:
+ case INT_SR_DCD:
+ m_int_state[SR_INT_PRIO] = INT_REQ;
+ break;
}
- return channel[0].reg_val[reg];
+ check_interrupts();
}
-/*-------------------------------------------------
- mpcc_putreg
--------------------------------------------------*/
-
-void mpcc68561_t::putreg(int ch, uint8_t data)
+//-------------------------------------------------
+// Read register
+//-------------------------------------------------
+READ8_MEMBER( mpcc_device::read )
{
- Chan *pChan = &channel[ch];
+ uint8_t data = 0;
- channel[ch].reg_val[reg] = data;
- #if LOG_MPCC
- printf("mpcc: port %c reg %d write 0x%02x\n", 'A'+ch, reg, data);
- #endif
+ switch(offset)
+ {
+ case 0x00: data = do_rsr(); break;
+ case 0x01: data = do_rcr(); break;
+ case 0x02: data = do_rdr(); break;
+ case 0x04: data = m_rivnr; logerror("MPCC: Reg RIVNR not implemented\n"); break;
+ case 0x05: data = do_rier(); break;
+ case 0x08: data = m_tsr; break; logerror("MPCC: Reg TSR not implemented\n"); break;
+ case 0x09: data = do_tcr(); break;
+ //case 0x0a: data = m_tdr; break; // TDR is a write only register
+ case 0x0c: data = do_tivnr(); break;
+ case 0x0d: data = do_tier(); break;
+ case 0x10: data = do_sisr(); break;
+ case 0x11: data = do_sicr(); break;
+ case 0x14: data = m_sivnr; logerror("MPCC: Reg SIVNR not implemented\n"); break;
+ case 0x15: data = do_sier(); break;
+ case 0x18: data = do_psr1(); break;
+ case 0x19: data = do_psr2(); break;
+ case 0x1a: data = m_ar1; logerror("MPCC: Reg AR1 not implemented\n"); break;
+ case 0x1b: data = m_ar2; logerror("MPCC: Reg AR2 not implemented\n"); break;
+ case 0x1c: data = do_brdr1(); break;
+ case 0x1d: data = do_brdr2(); break;
+ case 0x1e: data = do_ccr(); break;
+ case 0x1f: data = do_ecr(); break;
+ default: logerror("%s invalid register accessed: %02x\n", m_owner->tag(), offset);
+ }
+ LOGR(" * %s Reg %02x -> %02x \n", m_owner->tag(), offset, data);
+ return data;
+}
- switch (reg)
+//-------------------------------------------------
+// Write register
+//-------------------------------------------------
+WRITE8_MEMBER( mpcc_device::write )
+{
+ LOGSETUP(" * %s Reg %02x <- %02x \n", m_owner->tag(), offset, data);
+ switch(offset)
{
- case 0: // command register
- switch ((data >> 3) & 7)
- {
- case 1: // select high registers (handled elsewhere)
- break;
-
- case 2: // reset external and status IRQs
- pChan->syncHunt = 0;
- break;
-
- case 5: // ack Tx IRQ
- pChan->txIRQPending = 0;
- updateirqs();
- break;
-
- case 0: // nothing
- case 3: // send SDLC abort
- case 4: // enable IRQ on next Rx byte
- case 6: // reset errors
- case 7: // reset highest IUS
- // we don't handle these yet
- break;
+ case 0x00: do_rsr(data); break;
+ case 0x01: do_rcr(data); break;
+ //case 0x02: m_rdr = data; break; // RDR is a read only register
+ case 0x04: m_rivnr = data; logerror("MPCC: Reg RIVNR not implemented\n"); break;
+ case 0x05: do_rier(data); break;
+ case 0x08: m_tsr = data; logerror("MPCC: Reg TSR not implemented\n"); break;
+ case 0x09: do_tcr(data); break;
+ case 0x0a: m_tdr = data; LOGCHAR("*%c", data); do_tdr(data); break;
+ case 0x0c: do_tivnr(data); break;
+ case 0x0d: do_tier(data); break;
+ case 0x10: do_sisr(data); break;
+ case 0x11: do_sicr(data); break;
+ case 0x14: m_sivnr = data; logerror("MPCC: Reg SIVNR not implemented\n"); break;
+ case 0x15: do_sier(data); break;
+ case 0x18: do_psr1(data); break;
+ case 0x19: do_psr2(data); break;
+ case 0x1a: m_ar1 = data; logerror("MPCC: Reg AR1 not implemented\n"); break;
+ case 0x1b: m_ar2 = data; logerror("MPCC: Reg AR2 not implemented\n"); break;
+ case 0x1c: do_brdr1(data); break;
+ case 0x1d: do_brdr2(data); break;
+ case 0x1e: do_ccr(data); break;
+ case 0x1f: do_ecr(data); break;
+ default: logerror("%s invalid register accessed: %02x\n", m_owner->tag(), offset);
+ }
+}
- }
- break;
+void mpcc_device::do_rsr(uint8_t data)
+{
+ LOG("%s -> %02x\n", FUNCNAME, data);
+ m_rsr = data;
+}
- case 1: // Tx/Rx IRQ and data transfer mode defintion
- pChan->extIRQEnable = (data & 1);
- pChan->txIRQEnable = (data & 2) ? 1 : 0;
- pChan->rxIRQEnable = (data >> 3) & 3;
- updateirqs();
- break;
+uint8_t mpcc_device::do_rsr()
+{
+ uint8_t data = m_rsr;
+ LOG("%s <- %02x\n", FUNCNAME, data);
+ return data;
+}
- case 2: // IRQ vector
- IRQV = data;
- break;
+void mpcc_device::do_rcr(uint8_t data)
+{
+ LOG("%s -> %02x\n", FUNCNAME, data);
+ m_rcr = data;
+ LOGSETUP(" - Rx DMA : %s\n", (m_rcr & REG_RCR_RDSREN) ? "enabled" : "disabled");
+ LOGSETUP(" - Rx DONE out : %s\n", (m_rcr & REG_RCR_DONEEN) ? "enabled" : "disabled");
+ LOGSETUP(" - Rx RSYN out : %s\n", (m_rcr & REG_RCR_RSYNEN) ? "enabled" : "disabled");
+ LOGSETUP(" - Rx strip SYN: %s\n", (m_rcr & REG_RCR_STRSYN) ? "enabled" : "disabled");
+ LOGSETUP(" - Rx Abort : %s\n", (m_rcr & REG_RCR_RABTEN) ? "enabled" : "disabled");
+ LOGSETUP(" - Rx Mode : %s\n", (m_rcr & REG_RCR_RRES ) ? "reset" : "normal");
+
+ update_serial();
+}
- case 3: // Rx parameters and controls
- pChan->rxEnable = (data & 1);
- pChan->syncHunt = (data & 0x10) ? 1 : 0;
- break;
+uint8_t mpcc_device::do_rcr()
+{
+ uint8_t data = m_rcr;
+ LOG("%s <- %02x\n", FUNCNAME, data);
+ return data;
+}
- case 5: // Tx parameters and controls
-// printf("ch %d TxEnable = %d [%02x]\n", ch, data & 8, data);
- pChan->txEnable = data & 8;
+uint8_t mpcc_device::do_rdr()
+{
+ uint8_t data = 0;
- if (pChan->txEnable)
- {
- pChan->reg_val[0] |= 0x04; // Tx empty
- }
- break;
+ if (!m_rx_data_fifo.empty())
+ {
+ // load data from the FIFO
+ data = m_rx_data_fifo.dequeue();
+ }
+ else
+ {
+ LOGRX("data_read: Attempt to read out character from empty FIFO\n");
+ logerror("data_read: Attempt to read out character from empty FIFO\n");
+ }
- case 4: // Tx/Rx misc parameters and modes
- case 6: // sync chars/SDLC address field
- case 7: // sync char/SDLC flag
- break;
+ LOGRX("%s <- %02x [%c]\n", FUNCNAME, isascii(data) ? data : ' ', data);
+ return data;
+}
- case 9: // master IRQ control
- MasterIRQEnable = (data & 8) ? 1 : 0;
- updateirqs();
- // channel reset command
- switch ((data>>6) & 3)
- {
- case 0: // do nothing
- break;
+void mpcc_device::do_rier(uint8_t data)
+{
+ LOG("%s -> %02x\n", FUNCNAME, data);
+ m_rier = data;
+ LOGSETUP(" - Rx INT on Rx data available : %s\n", (m_rier & REG_RIER_RDA) ? "enabled" : "disabled");
+ LOGSETUP(" - Rx INT on End of Frame : %s\n", (m_rier & REG_RIER_EOF) ? "enabled" : "disabled");
+ LOGSETUP(" - Rx INT on CRC/Parity error : %s\n", (m_rier & REG_RIER_CPERR) ? "enabled" : "disabled");
+ LOGSETUP(" - Rx INT on Frame error : %s\n", (m_rier & REG_RIER_FRERR) ? "enabled" : "disabled");
+ LOGSETUP(" - Rx INT on Receiver overrun : %s\n", (m_rier & REG_RIER_ROVRN) ? "enabled" : "disabled");
+ LOGSETUP(" - Rx INT on Abort/Break : %s\n", (m_rier & REG_RIER_RAB) ? "enabled" : "disabled");
+}
- case 1: // reset channel B
- resetchannel(0);
- break;
+uint8_t mpcc_device::do_rier()
+{
+ uint8_t data = m_rier;
+ LOG("%s <- %02x\n", FUNCNAME, data);
+ return data;
+}
- case 3: // force h/w reset (entire chip)
- IRQType = IRQ_NONE;
- MasterIRQEnable = 0;
- IRQV = 0;
+void mpcc_device::do_tdr(uint8_t data)
+{
+ LOG("%s -> %d [%c]\n", FUNCNAME, data, isprint(data) ? data : ' ');
+ // Check of Tx fifo has room
+ if (m_tx_data_fifo.full())
+ {
+ logerror("- TX FIFO is full, discarding data\n");
+ LOGTX("- TX FIFO is full, discarding data\n");
+ }
+ else // ..there is still room
+ {
+ m_tx_data_fifo.enqueue(data);
+ if (m_tx_data_fifo.full())
+ {
+ m_tsr &= ~REG_TSR_TDRA; // Mark fifo as full
+ }
+ }
- initchannel(0);
- resetchannel(0);
+ // Check if Tx is enabled
+ if (m_tcr & REG_TCR_TEN)
+ {
+ LOGTX("- TX is enabled\n");
+ if (is_transmit_register_empty()) // Is the shift register loaded?
+ {
+ LOGTX("- Setting up transmitter\n");
+ transmit_register_setup(m_tx_data_fifo.dequeue()); // Load the shift register, reload is done in tra_complete()
+ m_tsr |= REG_TSR_TDRA; // Now there is a slot in the FIFO available again
+ }
+ else
+ {
+ LOGTX("- Transmitter not empty\n");
+ }
+ }
+}
- // make sure we stop yanking the IRQ line if we were
- updateirqs();
- break;
+void mpcc_device::do_tcr(uint8_t data)
+{
+ LOG("%s -> %02x\n", FUNCNAME, data);
+ m_tcr = data;
+ LOGSETUP(" - Tx : %s\n", (m_tcr & REG_TCR_TEN) ? "enabled" : "disabled");
+ LOGSETUP(" - Tx DMA : %s\n", (m_tcr & REG_TCR_TDSREN) ? "enabled" : "disabled");
+ LOGSETUP(" - Tx Idle character : %s\n", (m_tcr & REG_TCR_TICS) ? "AR2" : "high");
+ LOGSETUP(" - Tx Half Word next : %s\n", (m_tcr & REG_TCR_THW) ? "yes" : "no");
+ LOGSETUP(" - Tx Last character : %s\n", (m_tcr & REG_TCR_TLAST) ? "yes" : "no");
+ LOGSETUP(" - Tx SYN : %s\n", (m_tcr & REG_TCR_TSYN) ? "enabled" : "disabled");
+ LOGSETUP(" - Tx Abort command : %s\n", (m_tcr & REG_TCR_TABT) ? "active" : "inactive");
+ LOGSETUP(" - Tx Mode : %s\n", (m_tcr & REG_TCR_TRES) ? "reset" : "normal");
+
+ update_serial();
+}
- }
- break;
+uint8_t mpcc_device::do_tcr()
+{
+ uint8_t data = m_tcr;
+ LOG("%s <- %02x\n", FUNCNAME, data);
+ return data;
+}
- case 10: // misc transmitter/receiver control bits
- case 11: // clock mode control
- case 12: // lower byte of baud rate gen
- case 13: // upper byte of baud rate gen
- break;
+void mpcc_device::do_tivnr(uint8_t data)
+{
+ LOG("%s -> %02x\n", FUNCNAME, data);
+ m_tivnr = data;
+ LOGSETUP(" - Tx Int vector: %02x\n", m_tivnr);
+}
- case 14: // misc control bits
- if (data & 0x01) // baud rate generator enable?
- {
- int brconst = pChan->reg_val[13]<<8 | pChan->reg_val[14];
- int rate = clock() / brconst;
+uint8_t mpcc_device::do_tivnr()
+{
+ uint8_t data = m_tivnr;
+ LOG("%s <- %02x\n", FUNCNAME, data);
+ return data;
+}
- pChan->baudtimer->adjust(attotime::from_hz(rate), 0, attotime::from_hz(rate));
- }
- break;
+void mpcc_device::do_tier(uint8_t data)
+{
+ LOG("%s -> %02x\n", FUNCNAME, data);
+ m_tier = data;
+ LOGSETUP(" - Tx INT on FIFO slot available : %s\n", (m_tier & REG_TIER_TDRA) ? "enabled" : "disabled");
+ LOGSETUP(" - Tx INT on Frame complete : %s\n", (m_tier & REG_TIER_TFC ) ? "enabled" : "disabled");
+ LOGSETUP(" - Tx INT on Underrun : %s\n", (m_tier & REG_TIER_TUNRN) ? "enabled" : "disabled");
+ LOGSETUP(" - Tx INT on Frame error : %s\n", (m_tier & REG_TIER_TFERR) ? "enabled" : "disabled");
+}
- case 15: // external/status interrupt control
- pChan->baudIRQEnable = (data & 2) ? 1 : 0;
- pChan->DCDEnable = (data & 8) ? 1 : 0;
- pChan->CTSEnable = (data & 0x20) ? 1 : 0;
- pChan->txUnderrunEnable = (data & 0x40) ? 1 : 0;
- break;
- }
+uint8_t mpcc_device::do_tier()
+{
+ uint8_t data = m_tier;
+ LOG("%s <- %02x\n", FUNCNAME, data);
+ return data;
}
-/*-------------------------------------------------
- mpcc68561_get_reg_a
--------------------------------------------------*/
+void mpcc_device::do_sisr(uint8_t data)
+{
+ LOG("%s -> %02x\n", FUNCNAME, data);
+ if (data & REG_SISR_CTST) m_sisr &= ~REG_SISR_CTST;
+ if (data & REG_SISR_DSRT) m_sisr &= ~REG_SISR_DSRT;
+ if (data & REG_SISR_DCDT) m_sisr &= ~REG_SISR_DCDT;
+
+ LOGSETUP(" - CTS %d transitioned: %d\n", (m_sisr & REG_SISR_CTSLVL) ? 1 :0, (m_sisr & REG_SISR_CTST) ? 1 : 0);
+ LOGSETUP(" - DSR %d transitioned: %d\n", (m_sisr & REG_SISR_DSRLVL) ? 1 :0, (m_sisr & REG_SISR_DSRT) ? 1 : 0);
+ LOGSETUP(" - DCD %d transitioned: %d\n", (m_sisr & REG_SISR_DCDLVL) ? 1 :0, (m_sisr & REG_SISR_DCDT) ? 1 : 0);
+}
-uint8_t mpcc68561_t::get_reg_a(int reg)
+uint8_t mpcc_device::do_sisr()
{
- return channel[0].reg_val[reg];
+ uint8_t data = m_sisr;
+ LOG("%s <- %02x\n", FUNCNAME, data);
+ return data;
}
+void mpcc_device::do_sicr(uint8_t data)
+{
+ LOG("%s -> %02x\n", FUNCNAME, data);
+
+ // If RTS is activated the RTS output latch can only be reset by an empty FIFO.
+ if ( !(m_sicr & REG_SICR_RTSLVL) &&
+ (data & REG_SICR_RTSLVL))
+ {
+ m_out_rts_cb(ASSERT_LINE); // TODO: respect the RTSLV bit
+ }
+
+ m_sicr = data;
+ if (m_sicr & REG_SICR_DTRLVL)
+ {
+ m_out_dtr_cb(ASSERT_LINE);
+ }
+ else
+ {
+ m_out_dtr_cb(CLEAR_LINE);
+ }
-/*-------------------------------------------------
- mpcc68561_set_reg_a
--------------------------------------------------*/
+ LOGSETUP(" - RTS level : %s\n", (m_sicr & REG_SICR_RTSLVL) ? "high" : "low");
+ LOGSETUP(" - DTR level : %s\n", (m_sicr & REG_SICR_DTRLVL) ? "high" : "low");
+ LOGSETUP(" - Echo Mode : %s\n", (m_sicr & REG_SICR_ECHO) ? "enabled" : "disabled");
+ LOGSETUP(" - Test Mode : %s\n", (m_sicr & REG_SICR_TEST) ? "enabled" : "disabled");
+}
-void mpcc68561_t::set_reg_a(int reg, uint8_t data)
+uint8_t mpcc_device::do_sicr()
{
- channel[0].reg_val[reg] = data;
+ uint8_t data = m_sicr;
+ LOG("%s <- %02x\n", FUNCNAME, data);
+ return data;
}
+void mpcc_device::do_sier(uint8_t data)
+{
+ LOG("%s -> %02x\n", FUNCNAME, data);
+ m_sier = data;
+ LOGSETUP(" - Serial interface INT on CTS: %s\n", (m_sier & REG_SIER_CTS) ? "enabled" : "disabled");
+ LOGSETUP(" - Serial interface INT on DSR: %s\n", (m_sier & REG_SIER_DSR) ? "enabled" : "disabled");
+ LOGSETUP(" - Serial interface INT on DCD: %s\n", (m_sier & REG_SIER_DCD) ? "enabled" : "disabled");
+}
+uint8_t mpcc_device::do_sier()
+{
+ uint8_t data = m_sier;
+ LOG("%s <- %02x\n", FUNCNAME, data);
+ return data;
+}
-/*-------------------------------------------------
- mpcc68561_r
--------------------------------------------------*/
+void mpcc_device::do_psr1(uint8_t data)
+{
+ LOG("%s -> %02x\n", FUNCNAME, data);
+ m_psr1 = data;
+ LOGSETUP(" - Zero Address option: %s\n", (m_psr1 & REG_PSR1_ADRZ) ? "enabled" : "disabled" );
+ LOGSETUP(" - IPARS option : %s\n", (m_psr1 & REG_PSR1_IPARS) ? "enabled" : "disabled" );
+ LOGSETUP(" - Control Field Width: %s\n", (m_psr1 & REG_PSR1_CTLEX) ? "16 bit" : "8 bit" );
+ LOGSETUP(" - Address Extend : %s\n", (m_psr1 & REG_PSR1_ADDEX) ? "enabled" : "disabled" );
+
+ update_serial();
+}
-READ8_MEMBER( mpcc68561_t::reg_r)
+uint8_t mpcc_device::do_psr1()
{
- uint8_t result = 0;
+ uint8_t data = m_psr1;
+ LOG("%s <- %02x\n", FUNCNAME, data);
+ return data;
+}
- offset %= 4;
+void mpcc_device::do_psr2(uint8_t data)
+{
+ LOG("%s -> %02x\n", FUNCNAME, data);
+ m_psr2 = data;
+ LOGSETUP(" - %s data bus\n", (m_psr2 & REG_PSR2_WDBYT) ? "16 bit (not implemented)" : "8 bit" );
+ LOGSETUP(" - %s stop bits\n",(m_psr2 & REG_PSR2_STP_MSK) == REG_PSR2_STP_1 ? "1" :
+ ( (m_psr2 & REG_PSR2_STP_MSK) == REG_PSR2_STP_1_5 ? "1.5" :
+ ( (m_psr2 & REG_PSR2_STP_MSK) == REG_PSR2_STP_2 ? "2" : "Unknown")));
+ LOGSETUP(" - %d bit characters\n", 5 + ((m_psr2 & REG_PSR2_CHLN_MSK) >> 3));
+ LOGSETUP(" - Protocol %d %s\n", m_psr2 & REG_PSR2_PSEL_MSK, (m_psr2 & REG_PSR2_PSEL_MSK) != REG_PSR2_PSEL_ASCII ? "(not implemented)" : "");
+
+ update_serial();
+}
- switch(offset)
- {
- case 1:
- /* Channel A (Modem Port) Control */
- if (mode == 1)
- mode = 0;
- else
- reg = 0;
+uint8_t mpcc_device::do_psr2()
+{
+ uint8_t data = m_psr2;
+ LOG("%s <- %02x\n", FUNCNAME, data);
+ return data;
+}
- result = getreg();
- break;
+/*
+ * Clocks and Baud Rates
+ */
+void mpcc_device::do_brdr1(uint8_t data)
+{
+ LOG("%s -> %02x\n", FUNCNAME, data);
+ m_brdr1 = data;
+ LOGSETUP(" - Baudrate Divider 1: %02x\n", m_brdr1);
- case 3:
- /* Channel A (Modem Port) Data */
- return channel[0].rxData;
- break;
- }
- return result;
+ update_serial();
}
+uint8_t mpcc_device::do_brdr1()
+{
+ uint8_t data = m_brdr1;
+ LOG("%s <- %02x\n", FUNCNAME, data);
+ return data;
+}
+void mpcc_device::do_brdr2(uint8_t data)
+{
+ LOG("%s -> %02x\n", FUNCNAME, data);
+ m_brdr2 = data;
+ LOGSETUP(" - Baudrate Divider 2: %02x\n", m_brdr2);
-/*-------------------------------------------------
- mpcc68561_w
--------------------------------------------------*/
+ update_serial();
+}
-WRITE8_MEMBER( mpcc68561_t::reg_w )
+uint8_t mpcc_device::do_brdr2()
{
- Chan *pChan;
-
- offset &= 3;
+ uint8_t data = m_brdr2;
+ LOG("%s <- %02x\n", FUNCNAME, data);
+ return data;
+}
-// printf(" mode %d data %x offset %d \n", mode, data, offset);
+void mpcc_device::do_ccr(uint8_t data)
+{
+ LOG("%s -> %02x\n", FUNCNAME, data);
+ m_ccr = data;
+ LOGSETUP(" - Prescaler: x%d\n", (m_ccr & REG_CCR_PSCDIV) ? 3 : 2);
+ LOGSETUP(" - TxC used as: %s\n", (m_ccr & REG_CCR_TCLO) ? "output" : "input");
+ LOGSETUP(" - RxC taken from: %s source, (ASYNC mode only)\n", (m_ccr & REG_CCR_TCLO) ? "internal" : "external");
+ LOGSETUP(" - External RxC divisor: x%d\n",(m_ccr & REG_CCR_CLKDIV_MSK) == REG_CCR_CLKDIV_X1 ? 1 :
+ ( (m_ccr & REG_CCR_CLKDIV_MSK) == REG_CCR_CLKDIV_X16 ? 16 :
+ ( (m_ccr & REG_CCR_CLKDIV_MSK) == REG_CCR_CLKDIV_X32 ? 32 : 64)));
+
+ update_serial();
+}
- switch(offset)
- {
- case 1:
- /* Channel A (Modem Port) Control */
- if (mode == 0)
- {
- if((data & 0xf0) == 0) // not a reset command
- {
- mode = 1;
- reg = data & 0x0f;
-// putareg(data & 0xf0);
- }
- else if (data == 0x10)
- {
- pChan = &channel[0];
- // clear ext. interrupts
- pChan->extIRQPending = 0;
- pChan->baudIRQPending = 0;
- updateirqs();
- }
- }
- else
- {
- mode = 0;
- putreg(0, data);
- }
- break;
+uint8_t mpcc_device::do_ccr()
+{
+ uint8_t data = m_ccr;
+ LOG("%s <- %02x\n", FUNCNAME, data);
+ return data;
+}
- case 3:
- /* Channel A (Modem Port) Data */
- pChan = &channel[0];
+void mpcc_device::do_ecr(uint8_t data)
+{
+ LOG("%s -> %02x\n", FUNCNAME, data);
+ m_ecr = data;
+ LOGSETUP(" - Parity : %s\n", (m_ecr & REG_ECR_PAREN) ? "enabled" : "disabled");
+ LOGSETUP(" - Parity : %s\n", (m_ecr & REG_ECR_ODDPAR) ? "odd" : "even");
+ LOGSETUP(" - CRC : %s\n", (m_ecr & REG_ECR_CFCRC) ? "enabled" : "disabled");
+ LOGSETUP(" - CRC Polynominal: %s\n", (m_ecr & REG_ECR_CRCSEL_MSK) == REG_ECR_CRCSEL_V41 ? "CCITT V.41 (BOP)" :
+ ( (m_ecr & REG_ECR_CRCSEL_MSK) == REG_ECR_CRCSEL_C16 ? "CRC-16 (BSC)" :
+ ( (m_ecr & REG_ECR_CRCSEL_MSK) == REG_ECR_CRCSEL_VRC ? "VRC/LRC (BSC, ASCII, non-transp)" :
+ "Not used")));
+
+ update_serial();
+}
- if (pChan->txEnable)
- {
- pChan->txData = data;
- // local loopback?
- if (pChan->reg_val[14] & 0x10)
- {
- pChan->rxData = data;
- pChan->reg_val[0] |= 0x01; // Rx character available
- }
- pChan->reg_val[1] |= 0x01; // All sent
- pChan->reg_val[0] |= 0x04; // Tx empty
- pChan->txUnderrun = 1;
- pChan->txIRQPending = 1;
- updateirqs();
- }
- break;
- }
+uint8_t mpcc_device::do_ecr()
+{
+ uint8_t data = m_ecr;
+ LOG("%s <- %02x\n", FUNCNAME, data);
+ return data;
}
diff --git a/src/devices/machine/68561mpcc.h b/src/devices/machine/68561mpcc.h
index ed38b7bdb01..2a3b654a50b 100644
--- a/src/devices/machine/68561mpcc.h
+++ b/src/devices/machine/68561mpcc.h
@@ -1,102 +1,461 @@
// license:BSD-3-Clause
-// copyright-holders:Sergey Svishchev
-/*********************************************************************
+// copyright-holders:Joakim Larsson Edstrom
+/***************************************************************************
+
+ MPCC Multi-Protocol Communications Controller emulation
+
+****************************************************************************
+ _____ _____
+ UDS* 1|* \_/ |48 IACK*
+ DTACK* 2| |47 LDS*
+ RxD 3| |46 DTC*
+ D10 4| |45 D9 _____ _____
+ DTR* 5| |44 CS* A0 1|* \_/ |40 IACK*
+ DSR* 6| |43 DACK* DTACK* 2| |39 DS*
+ DCD* 7| |42 GND RxD* 3| |38 DTC*
+ D11 8| |41 D0 DTR* 4| |37 CS*
+ RDSR* 9| |40 D8 DSR* 5| |36 DACK*
+ A1 10| |39 D1 DCD* 6| |35 GND
+ GND 11| |38 D2 RDSR* 7| |34 D0
+ A4 12| |37 D3 A1 8| |33 D1
+ A2 13| R68561 |36 D4 GND 9| R68560 |32 D2
+ A3 14| R68561A |35 D5 A4 10| R68560A |31 D3
+ RxC 15| |34 D6 A2 11| |30 D4
+ D12 16| |33 D15 A3 12| |29 D5
+ TxC 17| |32 D7 RxC 13| |28 D6
+ BCLK 18| |31 RESET* TxC 14| |27 D7
+ EXTAL 19| |30 CTS* BCLK 15| |26 RESET*
+ XTAL 20| |29 Vcc EXTAL 16| |25 CTS*
+ D13 21| |28 D14 XTAL 17| |24 Vcc
+ R/W* 22| |27 DONE* R/W* 18| |23 DONE*
+ IRQ* 23| |26 TxD IRQ* 19| |22 TxD
+ RTS* 24|_____________|25 TDSR* RTS* 20|_____________|21 TDSR*
+ 16 bit data bus 8 bit data bus
+ Also in 68 pin PLCE Also in 44 pin PLCE
+
+***************************************************************************/
+
+#ifndef MPCC68561_H
+#define MPCC68561_H
+
+#include "emu.h"
+
+/* Variant ADD macros - use the right one to enable the right feature set! */
+#define MCFG_MPCC68560_ADD(_tag, _clock, _rx, _tx) \
+ MCFG_DEVICE_ADD(_tag, MPCC68560, _clock) \
+ MCFG_MPCC_CLOCK(_rx, _tx)
+
+#define MCFG_MPCC68560A_ADD(_tag, _clock, _rx, _tx) \
+ MCFG_DEVICE_ADD(_tag, MPCC68560A, _clock) \
+ MCFG_MPCC_CLOCK(_rx, _tx)
- 68561mpcc.h
+#define MCFG_MPCC68561_ADD(_tag, _clock, _rx, _tx) \
+ MCFG_DEVICE_ADD(_tag, MPCC68561, _clock) \
+ MCFG_MPCC_CLOCK(_rx, _tx)
- Rockwell 68561 MPCC (Multi Protocol Communications Controller)
+#define MCFG_MPCC68561A_ADD(_tag, _clock, _rx, _tx) \
+ MCFG_DEVICE_ADD(_tag, MPCC68561A, _clock) \
+ MCFG_MPCC_CLOCK(_rx, _tx)
- skeleton driver
+/* Generic ADD macro - Avoid using it directly, see above for correct variant instead */
+#define MCFG_MPCC_ADD(_tag, _clock, _rxa, _txa, _rxb, _txb) \
+ MCFG_DEVICE_ADD(_tag, MPCC, _clock) \
+ MCFG_MPCC_CLOCK(_rx, _tx)
-*********************************************************************/
+/* Generic macros */
+#define MCFG_MPCC_CLOCK(_rx, _tx) \
+ mpcc_device::configure_clocks(*device, _rx, _tx);
-#ifndef __68561MPCC_H__
-#define __68561MPCC_H__
+/* Callbacks to be called by us for signals driven by the MPCC */
+#define MCFG_MPCC_OUT_TXD_CB(_devcb) \
+ devcb = &mpcc_device::set_out_txd_callback(*device, DEVCB_##_devcb);
-#define MCFG_MPCC68561_INTRQ_CALLBACK(_write) \
- devcb = &mpcc68561_t::set_intrq_wr_callback(*device, DEVCB_##_write);
+#define MCFG_MPCC_OUT_DTR_CB(_devcb) \
+ devcb = &mpcc_device::set_out_dtr_callback(*device, DEVCB_##_devcb);
-class mpcc68561_t : public device_t
+#define MCFG_MPCC_OUT_RTS_CB(_devcb) \
+ devcb = &mpcc_device::set_out_rts_callback(*device, DEVCB_##_devcb);
+
+#define MCFG_MPCC_OUT_TRXC_CB(_devcb) \
+ devcb = &mpcc_device::set_out_trxc_callback(*device, DEVCB_##_devcb);
+
+#define MCFG_MPCC_OUT_RTXC_CB(_devcb) \
+ devcb = &mpcc_device::set_out_rtxc_callback(*device, DEVCB_##_devcb);
+
+#define MCFG_MPCC_OUT_INT_CB(_devcb) \
+ devcb = &mpcc_device::set_out_int_callback(*device, DEVCB_##_devcb);
+
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+class mpcc_device : public device_t,
+ public device_serial_interface
{
public:
- enum IRQType_t {
- IRQ_NONE,
- IRQ_A_RX,
- IRQ_A_RX_SPECIAL,
- IRQ_B_RX,
- IRQ_B_RX_SPECIAL,
- IRQ_A_TX,
- IRQ_B_TX,
- IRQ_A_EXT,
- IRQ_B_EXT
- };
+ // construction/destruction
+ mpcc_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, uint32_t variant, const char *shortname, const char *source);
+ mpcc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- mpcc68561_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template<class _Object> static devcb_base &set_out_txd_callback(device_t &device, _Object object) { return downcast<mpcc_device &>(device).m_out_txd_cb.set_callback(object); }
+ template<class _Object> static devcb_base &set_out_dtr_callback(device_t &device, _Object object) { return downcast<mpcc_device &>(device).m_out_dtr_cb.set_callback(object); }
+ template<class _Object> static devcb_base &set_out_rts_callback(device_t &device, _Object object) { return downcast<mpcc_device &>(device).m_out_rts_cb.set_callback(object); }
+ template<class _Object> static devcb_base &set_out_rtxc_callback(device_t &device, _Object object) { return downcast<mpcc_device &>(device).m_out_rtxc_cb.set_callback(object); }
+ template<class _Object> static devcb_base &set_out_trxc_callback(device_t &device, _Object object) { return downcast<mpcc_device &>(device).m_out_trxc_cb.set_callback(object); }
- template<class _Object> static devcb_base &set_intrq_wr_callback(device_t &device, _Object object) { return downcast<mpcc68561_t &>(device).intrq_cb.set_callback(object); }
+ template<class _Object> static devcb_base &set_out_int_callback(device_t &device, _Object object) { return downcast<mpcc_device &>(device).m_out_int_cb.set_callback(object); }
- uint8_t get_reg_a(int reg);
- void set_reg_a(int reg, uint8_t data);
+ static void configure_clocks(device_t &device, int rxc, int txc)
+ {
+ mpcc_device &dev = downcast<mpcc_device &>(device);
+ dev.m_rxc = rxc;
+ dev.m_txc = txc;
+ }
- void set_status(int status);
+ DECLARE_READ8_MEMBER( read );
+ DECLARE_WRITE8_MEMBER( write );
- DECLARE_READ8_MEMBER(reg_r);
- DECLARE_WRITE8_MEMBER(reg_w);
+ // interrupt acknowledge
+ DECLARE_READ8_MEMBER( iack );
+
+ /* Callbacks to be called by others for signals driven by connected devices */
+ DECLARE_WRITE_LINE_MEMBER( write_rx );
+ DECLARE_WRITE_LINE_MEMBER( cts_w );
+ DECLARE_WRITE_LINE_MEMBER( dsr_w );
+ DECLARE_WRITE_LINE_MEMBER( dcd_w );
+ DECLARE_WRITE_LINE_MEMBER( rxc_w ) {} // { m_chanA->rxc_w(state); }
+ DECLARE_WRITE_LINE_MEMBER( txc_w ) {} // { m_chanA->txc_w(state); }
protected:
+ // device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
-private:
- struct Chan {
- bool txIRQEnable;
- bool rxIRQEnable;
- bool extIRQEnable;
- bool baudIRQEnable;
- bool txIRQPending;
- bool rxIRQPending;
- bool extIRQPending;
- bool baudIRQPending;
- bool txEnable;
- bool rxEnable;
- bool txUnderrun;
- bool txUnderrunEnable;
- bool syncHunt;
- bool DCDEnable;
- bool CTSEnable;
- uint8_t rxData;
- uint8_t txData;
-
- emu_timer *baudtimer;
-
- uint8_t reg_val[22];
- };
-
- int mode;
- int reg;
- int status;
- int IRQV;
- int MasterIRQEnable;
- int lastIRQStat;
- IRQType_t IRQType;
-
- Chan channel[2];
-
- devcb_write_line intrq_cb;
-
- void updateirqs();
- void initchannel(int ch);
- void resetchannel(int ch);
- void acknowledge();
- uint8_t getreg();
- void putreg(int ch, uint8_t data);
-};
+ // device_serial_interface overrides
+ virtual void tra_callback() override;
+ virtual void tra_complete() override;
+ virtual void rcv_callback() override;
+ virtual void rcv_complete() override;
-/***************************************************************************
- MACROS
-***************************************************************************/
+ // serial device setup helpers
+ uint32_t get_brg_rate();
+ uint32_t get_tx_rate();
+ uint32_t get_rx_rate();
+ uint32_t get_clock_div();
+ uint32_t get_word_length();
+ stop_bits_t get_stop_bits();
+ parity_t get_parity();
+ void update_serial();
+
+ /*
+ * Interrupts
+ */
+ void check_interrupts();
+ void reset_interrupts();
+ void trigger_interrupt(int source);
+ enum
+ {
+ INT_TX_TDRA, // Tx char available
+ INT_TX_TFC, // Tx frame complete
+ INT_TX_TUNRN, // Tx underrun detected
+ INT_TX_TFERR, // Tx frame error detected
+ INT_RX_RDA, // Rx interrupt on Receiver Data Available
+ INT_RX_EOF, // Rx interrupt on End of frame
+ INT_RX_CPERR, // Rx interrupt on CRC or Parity error
+ INT_RX_FRERR, // Rx interrupt on Frame error
+ INT_RX_ROVRN, // Rx interrupt on Receiver overrun
+ INT_RX_RAB, // Rx interrupt on Abort/Break
+ INT_SR_CTS, // Serial interface interrupt on CTS asserted
+ INT_SR_DSR, // Serial interface interrupt on DSR asserted
+ INT_SR_DCD, // Serial interface interrupt on DCD asserted
+ };
+
+ enum
+ {
+ RX_INT_PRIO = 0x00, // Highest interrupt priority
+ TX_INT_PRIO = 0x01,
+ SR_INT_PRIO = 0x02 // Lowest interrupt priority
+ };
+
+ enum
+ {
+ INT_REQ = 0x01, // Interrupt requested
+ INT_ACK = 0x02 // Interrupt acknowledged
+ };
+
+ // Variants in the MPCC family
+ enum
+ {
+ TYPE_MPCC = 0x001,
+ TYPE_MPCC68560 = 0x002,
+ TYPE_MPCC68560A = 0x004,
+ TYPE_MPCC68561 = 0x008,
+ TYPE_MPCC68561A = 0x010,
+ };
+
+#define SET_TYPE_A ( mpcc_device::TYPE_MPCC68560A | mpcc_device::TYPE_MPCC68561A )
+
+ // State variables
+ int m_variant;
+ int m_rxc;
+ int m_txc;
+ int m_brg_rate;
+ int m_rcv;
+ int m_rxd;
+ int m_tra;
+ int m_int_state[3]; // Three priority levels Rx, Tx and Serial interface
+
+ // Callbacks
+ devcb_write_line m_out_txd_cb;
+ devcb_write_line m_out_dtr_cb;
+ devcb_write_line m_out_rts_cb;
+ devcb_write_line m_out_rtxc_cb;
+ devcb_write_line m_out_trxc_cb;
+
+ devcb_write_line m_out_int_cb;
+
+ /*
+ * Register handling
+ */
+ // RSR - Rx Status Register
+ uint8_t m_rsr;
+ uint8_t do_rsr();
+ void do_rsr(uint8_t data);
+ enum
+ {
+ REG_RSR_RDA = 0x80, // Rx Data available
+ REG_RSR_EOF = 0x40, // End of frame detected (BOP and BSC modes)
+ REG_RSR_RHW = 0x20, // Odd number of frame data bytes reeived in 16 bit mode.
+ REG_RSR_CPERR = 0x10, // CRC or parity error detected
+ REG_RSR_FRERR = 0x08, // Frame error detected
+ REG_RSR_ROVRN = 0x04, // Rx overrun detected
+ REG_RSR_RAB = 0x02, // Rx Abort break detected
+ REG_RSR_RIDLE = 0x01, // Rx idle detcted (15+ high consecutive bits accounted for)
+ };
+
+ // RCR - Rx Control Register
+ uint8_t m_rcr;
+ uint8_t do_rcr();
+ void do_rcr(uint8_t data);
+ enum
+ {
+ REG_RCR_RDSREN = 0x40, // Rx Data Service Request Enable (DMA)
+ REG_RCR_DONEEN = 0x20, // DONE output enable
+ REG_RCR_RSYNEN = 0x10, // RSYNEN output enable
+ REG_RCR_STRSYN = 0x08, // STRIP SYN character (COP mode)
+ REG_RCR_RABTEN = 0x02, // Receiver Abort Enable (BOP mode)
+ REG_RCR_RRES = 0x01, // Receiver Reset command/Enable
+ };
+
+ uint8_t m_rdr;
+ uint8_t do_rdr();
+ // TODO: investigate if 4 x 16 bit wide FIFO is needed for 16 bit mode
+ util::fifo<uint8_t, 8> m_rx_data_fifo;
+
+ uint8_t m_rivnr;
+
+ // RIER - Rx Interrupt Enable Register
+ uint8_t m_rier;
+ uint8_t do_rier();
+ void do_rier(uint8_t data);
+ enum {
+ REG_RIER_RDA = 0x80, // Rx interrupt on Receiver Data Available
+ REG_RIER_EOF = 0x40, // Rx interrupt on End of frame
+ REG_RIER_CPERR = 0x10, // Rx interrupt on CRC or Parity error
+ REG_RIER_FRERR = 0x08, // Rx interrupt on Frame error
+ REG_RIER_ROVRN = 0x04, // Rx interrupt on Receiver overrun
+ REG_RIER_RAB = 0x02, // Rx interrupt on Abort/Break
+ };
+
+ // TSR - Tx Status Register
+ uint8_t m_tsr;
+ uint8_t do_tsr();
+ void do_tsr(uint8_t data);
+ enum
+ {
+ REG_TSR_TDRA = 0x80, // Tx Fifo Full or not
+ REG_TSR_TFC = 0x40, // Tx Frame Complete
+ REG_TSR_TUNRN = 0x04, // Tx underrun
+ REG_TSR_TFERR = 0x02, // Tx Frame Error
+ };
+
+ // TCR - Tx Control Register
+ uint8_t m_tcr;
+ uint8_t do_tcr();
+ void do_tcr(uint8_t data);
+ enum
+ {
+ REG_TCR_TEN = 0x80, // Tx enable
+ REG_TCR_TDSREN = 0x40, // DMA enable
+ REG_TCR_TICS = 0x20, // Tx Idle Char Select, 'A' variant differs
+ REG_TCR_THW = 0x10, // Indicates that last 16 bit word has only 8 bits, in 16 bits mode only
+ REG_TCR_TLAST = 0x08, // Indicates the last byte to be written in to TDR (BOP, BCS or COP)
+ REG_TCR_TSYN = 0x04, // SYN enable (BCS or COP)
+ REG_TCR_TABT = 0x02, // Abort command (BOP)
+ REG_TCR_TRES = 0x01, // Tx Reset command
+ };
+
+ // TDR - Tx Data Register (write only)
+ uint8_t m_tdr;
+ void do_tdr(uint8_t data);
+ // TODO: investigate if 4 x 16 bit wide FIFO is needed for 16 bit mode
+ util::fifo<uint8_t, 8> m_tx_data_fifo;
+
+ // TIVNR - Tx Interrupt Vector Number Register
+ uint8_t m_tivnr;
+ uint8_t do_tivnr();
+ void do_tivnr(uint8_t data);
+
+ // TIER - Tx Interrupt Enable Register
+ uint8_t m_tier;
+ uint8_t do_tier();
+ void do_tier(uint8_t data);
+ enum
+ {
+ REG_TIER_TDRA = 0x80, // TX Character available interrupt
+ REG_TIER_TFC = 0x40, // TX Frame complete interrupt
+ REG_TIER_TUNRN = 0x04, // TX Underrun interrupt
+ REG_TIER_TFERR = 0x02, // TX Frame error interrupt
+ };
+
+ // SISR - Serial Interface Status Register
+ uint8_t m_sisr;
+ uint8_t do_sisr();
+ void do_sisr(uint8_t data);
+ enum
+ {
+ REG_SISR_CTST = 0x80, // Clear To Send Transition Status
+ REG_SISR_DSRT = 0x40, // Data Set Ready Transition Status
+ REG_SISR_DCDT = 0x20, // Data Carrier Detect Transition Status
+ REG_SISR_CTSLVL = 0x10, // Clear To Send Level
+ REG_SISR_DSRLVL = 0x08, // Data Set Ready Level
+ REG_SISR_DCDLVL = 0x04, // Data Carrier Detect Level
+ };
+
+ // SICR - Serial Interface Control Register
+ uint8_t m_sicr;
+ uint8_t do_sicr();
+ void do_sicr(uint8_t data);
+ enum
+ {
+ REG_SICR_RTSLVL = 0x80, // RTS level
+ REG_SICR_DTRLVL = 0x40, // DTR level
+ REG_SICR_ECHO = 0x04, // Echo Mode
+ REG_SICR_TEST = 0x02, // Test Mode
+ };
+
+ uint8_t m_sivnr;
+ // SIER - Serial interface Interrupt Enable
+ uint8_t m_sier;
+ uint8_t do_sier();
+ void do_sier(uint8_t data);
+ enum
+ {
+ REG_SIER_CTS = 0x80,
+ REG_SIER_DSR = 0x40,
+ REG_SIER_DCD = 0x20,
+ };
+
+ // PSR1 Protocol Selection Register 1
+ uint8_t m_psr1;
+ uint8_t do_psr1();
+ void do_psr1(uint8_t data);
+ enum
+ {
+ REG_PSR1_ADRZ = 0x08, // Zero adress option (BOP) (A models only)
+ REG_PSR1_IPARS = 0x04, // IPARS option (COP)
+ REG_PSR1_CTLEX = 0x02, // Control field width 8/16 bit (BOP) (A models only)
+ REG_PSR1_ADDEX = 0x01, // Address extend option (BOP) (A models only)
+ };
+
+ // PSR2 Protocol Selection Register 2
+ uint8_t m_psr2;
+ uint8_t do_psr2();
+ void do_psr2(uint8_t data);
+ enum
+ {
+ REG_PSR2_WDBYT = 0x80, // 8/16 bit data bus selector
+ REG_PSR2_STP_MSK = 0x60, // Stop bits selection field
+ REG_PSR2_STP_1 = 0x00, // 1 Stop bits
+ REG_PSR2_STP_1_5 = 0x20, // 1.5 Stop bits
+ REG_PSR2_STP_2 = 0x40, // 2 Stop bits
+ REG_PSR2_CHLN_MSK = 0x18, // char len selection field
+ REG_PSR2_CHLN_5 = 0x00, // 5 bit char len
+ REG_PSR2_CHLN_6 = 0x08, // 6 bit char len
+ REG_PSR2_CHLN_7 = 0x10, // 7 bit char len
+ REG_PSR2_CHLN_8 = 0x18, // 8 bit char len
+ REG_PSR2_PSEL_MSK = 0x07, // Protocol selection field
+ REG_PSR2_PSEL_BOPP = 0x00, // Protocol selection BOP Primary
+ REG_PSR2_PSEL_BOPS = 0x01, // Protocol selection BOP Secondary
+ REG_PSR2_PSEL_RSV = 0x02, // Protocol selection Reserved
+ REG_PSR2_PSEL_COP = 0x03, // Protocol selection COP
+ REG_PSR2_PSEL_BCSE = 0x04, // Protocol selection BCS EBCDIC
+ REG_PSR2_PSEL_BCSA = 0x05, // Protocol selection BCS ASCII
+ REG_PSR2_PSEL_ASCII = 0x06, // Protocol selection ASYNC
+ REG_PSR2_PSEL_ISOC = 0x07, // Protocol selection ISOC
+ };
+
+ uint8_t m_ar1;
+ uint8_t m_ar2;
+
+
+ // BRDR1 - Baud Rate Divisor Register 1 (Lo)
+ uint8_t m_brdr1;
+ uint8_t do_brdr1();
+ void do_brdr1(uint8_t data);
+
+ // BRDR2 - Baud Rate Divisor Register 2 (Hi)
+ uint8_t m_brdr2;
+ uint8_t do_brdr2();
+ void do_brdr2(uint8_t data);
+
+ // CCR - Clock Control Register
+ uint8_t m_ccr;
+ uint8_t do_ccr();
+ void do_ccr(uint8_t data);
+ enum
+ {
+ REG_CCR_PSCDIV = 0x10, // Internal prescaler Divider x2 or x3
+ REG_CCR_TCLO = 0x08, // TxC input/output selection
+ REG_CCR_RCLKIN = 0x04, // RxC from internal/external source selection
+ REG_CCR_CLKDIV_MSK = 0x03, // External RxC prescaler Divider
+ REG_CCR_CLKDIV_X1 = 0x00, // x1 - ISOC only
+ REG_CCR_CLKDIV_X16 = 0x01, // x16 - ASYNC only
+ REG_CCR_CLKDIV_X32 = 0x02, // x32 - ASYNC only
+ REG_CCR_CLKDIV_X64 = 0x03, // x64 - ASYNC only
+ };
+
+ // ECR - Error Control Regsiter
+ uint8_t m_ecr;
+ uint8_t do_ecr();
+ void do_ecr(uint8_t data);
+ enum
+ {
+ REG_ECR_PAREN = 0x80, // Parity Enable
+ REG_ECR_ODDPAR = 0x40, // Odd/Even Parity
+ REG_ECR_CFCRC = 0x08, // CRC Enable
+ REG_ECR_CRCPRE = 0x04, // CRC Preset 0 (BSC) or 1 (BOP)
+ REG_ECR_CRCSEL_MSK = 0x03, // CRC Polynominal Selection Mask
+ REG_ECR_CRCSEL_V41 = 0x00, // CCITT V.41 (BOP) CRC Polynomial
+ REG_ECR_CRCSEL_C16 = 0x01, // CRC-16 (BSC) CRC Polynomial
+ REG_ECR_CRCSEL_VRC = 0x02, // VRC/LRC (BSC, ASCII, non-transp) CRC Polynomial
+ };
+
+};
+
+// device type definition
+extern const device_type MPCC;
+extern const device_type MPCC68560;
+extern const device_type MPCC68560A;
extern const device_type MPCC68561;
+extern const device_type MPCC68561A;
+
+class mpcc68560_device : public mpcc_device { public : mpcc68560_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); };
+class mpcc68560A_device : public mpcc_device { public : mpcc68560A_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); };
+class mpcc68561_device : public mpcc_device { public : mpcc68561_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); };
+class mpcc68561A_device : public mpcc_device { public : mpcc68561A_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); };
-#endif /* __68561MPCC_H__ */
+#endif // MPCC68561_H
diff --git a/src/devices/sound/amiga.cpp b/src/devices/machine/8364_paula.cpp
index accf0509705..561ca6738fa 100644
--- a/src/devices/sound/amiga.cpp
+++ b/src/devices/machine/8364_paula.cpp
@@ -1,13 +1,12 @@
-// license:BSD-3-Clause
-// copyright-holders:Aaron Giles
+// license: BSD-3-Clause
+// copyright-holders: Aaron Giles, Dirk Best
/***************************************************************************
- Amiga audio hardware
+ Commodore 8364 "Paula"
***************************************************************************/
-#include "amiga.h"
-#include "includes/amiga.h"
+#include "8364_paula.h"
//**************************************************************************
@@ -22,7 +21,7 @@
// DEVICE DEFINITIONS
//**************************************************************************
-const device_type AMIGA = &device_creator<amiga_sound_device>;
+const device_type PAULA_8364 = &device_creator<paula_8364_device>;
//*************************************************************************
@@ -30,12 +29,14 @@ const device_type AMIGA = &device_creator<amiga_sound_device>;
//**************************************************************************
//-------------------------------------------------
-// amiga_sound_device - constructor
+// paula_8364_device - constructor
//-------------------------------------------------
-amiga_sound_device::amiga_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, AMIGA, "Amiga Paula", tag, owner, clock, "amiga_paula", __FILE__),
+paula_8364_device::paula_8364_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, PAULA_8364, "8364 Paula", tag, owner, clock, "paula_8364", __FILE__),
device_sound_interface(mconfig, *this),
+ m_mem_r(*this), m_int_w(*this),
+ m_dmacon(0), m_adkcon(0),
m_stream(nullptr)
{
}
@@ -44,8 +45,12 @@ amiga_sound_device::amiga_sound_device(const machine_config &mconfig, const char
// device_start - device-specific startup
//-------------------------------------------------
-void amiga_sound_device::device_start()
+void paula_8364_device::device_start()
{
+ // resolve callbacks
+ m_mem_r.resolve_safe(0);
+ m_int_w.resolve_safe();
+
// initialize channels
for (int i = 0; i < 4; i++)
{
@@ -53,73 +58,120 @@ void amiga_sound_device::device_start()
m_channel[i].curticks = 0;
m_channel[i].manualmode = false;
m_channel[i].curlocation = 0;
- m_channel[i].irq_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(amiga_sound_device::signal_irq), this));
+ m_channel[i].irq_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(paula_8364_device::signal_irq), this));
}
// create the stream
m_stream = machine().sound().stream_alloc(*this, 0, 4, clock() / CLOCK_DIVIDER);
}
+//-------------------------------------------------
+// update - stream updater
+//-------------------------------------------------
+
+void paula_8364_device::update()
+{
+ m_stream->update();
+}
+
//*************************************************************************
// IMPLEMENTATION
//**************************************************************************
-//-------------------------------------------------
-// signal_irq - irq signaling
-//-------------------------------------------------
-
-TIMER_CALLBACK_MEMBER( amiga_sound_device::signal_irq )
+READ16_MEMBER( paula_8364_device::reg_r )
{
- amiga_state *state = machine().driver_data<amiga_state>();
+ switch (offset)
+ {
+ case REG_DMACONR:
+ return m_dmacon;
- state->custom_chip_w(REG_INTREQ, INTENA_SETCLR | (0x80 << param));
-}
+ case REG_ADKCONR:
+ return m_adkcon;
+ }
-//-------------------------------------------------
-// dma_reload
-//-------------------------------------------------
+ return 0xffff;
+}
-void amiga_sound_device::dma_reload(audio_channel *chan)
+WRITE16_MEMBER( paula_8364_device::reg_w )
{
- amiga_state *state = machine().driver_data<amiga_state>();
+ if (offset >= 0xa0 && offset <= 0xdf)
+ m_stream->update();
- chan->curlocation = CUSTOM_REG_LONG(REG_AUD0LCH + chan->index * 8);
- chan->curlength = CUSTOM_REG(REG_AUD0LEN + chan->index * 8);
- chan->irq_timer->adjust(attotime::from_hz(15750), chan->index);
-
- LOG(("dma_reload(%d): offs=%05X len=%04X\n", chan->index, chan->curlocation, chan->curlength));
+ switch (offset)
+ {
+ case REG_DMACON:
+ m_stream->update();
+ m_dmacon = (data & 0x8000) ? (m_dmacon | (data & 0x021f)) : (m_dmacon & ~(data & 0x021f)); // only bits 15, 9 and 5 to 0
+ break;
+
+ case REG_ADKCON:
+ m_stream->update();
+ m_adkcon = (data & 0x8000) ? (m_adkcon | (data & 0x7fff)) : (m_adkcon & ~(data & 0x7fff));
+ break;
+
+ // to be moved
+ case REG_AUD0LCL: m_channel[CHAN_0].loc = (m_channel[CHAN_0].loc & 0xffff0000) | ((data & 0xfffe) << 0); break; // 15-bit
+ case REG_AUD0LCH: m_channel[CHAN_0].loc = (m_channel[CHAN_0].loc & 0x0000ffff) | ((data & 0x001f) << 16); break; // 3-bit on ocs, 5-bit ecs
+ case REG_AUD1LCL: m_channel[CHAN_1].loc = (m_channel[CHAN_1].loc & 0xffff0000) | ((data & 0xfffe) << 0); break; // 15-bit
+ case REG_AUD1LCH: m_channel[CHAN_1].loc = (m_channel[CHAN_1].loc & 0x0000ffff) | ((data & 0x001f) << 16); break; // 3-bit on ocs, 5-bit ecs
+ case REG_AUD2LCL: m_channel[CHAN_2].loc = (m_channel[CHAN_2].loc & 0xffff0000) | ((data & 0xfffe) << 0); break; // 15-bit
+ case REG_AUD2LCH: m_channel[CHAN_2].loc = (m_channel[CHAN_2].loc & 0x0000ffff) | ((data & 0x001f) << 16); break; // 3-bit on ocs, 5-bit ecs
+ case REG_AUD3LCL: m_channel[CHAN_3].loc = (m_channel[CHAN_3].loc & 0xffff0000) | ((data & 0xfffe) << 0); break; // 15-bit
+ case REG_AUD3LCH: m_channel[CHAN_3].loc = (m_channel[CHAN_3].loc & 0x0000ffff) | ((data & 0x001f) << 16); break; // 3-bit on ocs, 5-bit ecs
+
+ // audio data
+ case REG_AUD0LEN: m_channel[CHAN_0].len = data; break;
+ case REG_AUD0PER: m_channel[CHAN_0].per = data; break;
+ case REG_AUD0VOL: m_channel[CHAN_0].vol = data; break;
+ case REG_AUD0DAT: m_channel[CHAN_0].dat = data; m_channel[CHAN_0].manualmode = true; break;
+ case REG_AUD1LEN: m_channel[CHAN_1].len = data; break;
+ case REG_AUD1PER: m_channel[CHAN_1].per = data; break;
+ case REG_AUD1VOL: m_channel[CHAN_1].vol = data; break;
+ case REG_AUD1DAT: m_channel[CHAN_1].dat = data; m_channel[CHAN_1].manualmode = true; break;
+ case REG_AUD2LEN: m_channel[CHAN_2].len = data; break;
+ case REG_AUD2PER: m_channel[CHAN_2].per = data; break;
+ case REG_AUD2VOL: m_channel[CHAN_2].vol = data; break;
+ case REG_AUD2DAT: m_channel[CHAN_2].dat = data; m_channel[CHAN_2].manualmode = true; break;
+ case REG_AUD3LEN: m_channel[CHAN_3].len = data; break;
+ case REG_AUD3PER: m_channel[CHAN_3].per = data; break;
+ case REG_AUD3VOL: m_channel[CHAN_3].vol = data; break;
+ case REG_AUD3DAT: m_channel[CHAN_3].dat = data; m_channel[CHAN_3].manualmode = true; break;
+ }
}
//-------------------------------------------------
-// data_w - manual mode data writer
+// signal_irq - irq signaling
//-------------------------------------------------
-void amiga_sound_device::data_w(int which, uint16_t data)
+TIMER_CALLBACK_MEMBER( paula_8364_device::signal_irq )
{
- m_channel[which].manualmode = true;
+ m_int_w(param);
}
//-------------------------------------------------
-// update - stream updater
+// dma_reload
//-------------------------------------------------
-void amiga_sound_device::update()
+void paula_8364_device::dma_reload(audio_channel *chan)
{
- m_stream->update();
+ chan->curlocation = chan->loc;
+ chan->curlength = chan->len;
+ chan->irq_timer->adjust(attotime::from_hz(15750), chan->index); // clock() / 227
+
+ LOG(("dma_reload(%d): offs=%05X len=%04X\n", chan->index, chan->curlocation, chan->curlength));
}
//-------------------------------------------------
// sound_stream_update - handle a stream update
//-------------------------------------------------
-void amiga_sound_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
+void paula_8364_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
{
- amiga_state *state = machine().driver_data<amiga_state>();
int channum, sampoffs = 0;
// if all DMA off, disable all channels
- if (!(CUSTOM_REG(REG_DMACON) & 0x0200))
+ if (BIT(m_dmacon, 9) == 0)
{
m_channel[0].dma_enabled =
m_channel[1].dma_enabled =
@@ -138,9 +190,10 @@ void amiga_sound_device::sound_stream_update(sound_stream &stream, stream_sample
for (channum = 0; channum < 4; channum++)
{
audio_channel *chan = &m_channel[channum];
- if (!chan->dma_enabled && ((CUSTOM_REG(REG_DMACON) >> channum) & 1))
+ if (!chan->dma_enabled && ((m_dmacon >> channum) & 1))
dma_reload(chan);
- chan->dma_enabled = (CUSTOM_REG(REG_DMACON) >> channum) & 1;
+
+ chan->dma_enabled = BIT(m_dmacon, channum);
}
// loop until done
@@ -163,9 +216,9 @@ void amiga_sound_device::sound_stream_update(sound_stream &stream, stream_sample
nextper = nextvol = -1;
for (channum = 0; channum < 4; channum++)
{
- int volume = (nextvol == -1) ? CUSTOM_REG(REG_AUD0VOL + channum * 8) : nextvol;
- int period = (nextper == -1) ? CUSTOM_REG(REG_AUD0PER + channum * 8) : nextper;
audio_channel *chan = &m_channel[channum];
+ int volume = (nextvol == -1) ? chan->vol : nextvol;
+ int period = (nextper == -1) ? chan->per : nextper;
stream_sample_t sample;
int i;
@@ -174,18 +227,18 @@ void amiga_sound_device::sound_stream_update(sound_stream &stream, stream_sample
volume *= 4;
// are we modulating the period of the next channel?
- if ((CUSTOM_REG(REG_ADKCON) >> channum) & 0x10)
+ if ((m_adkcon >> channum) & 0x10)
{
- nextper = CUSTOM_REG(REG_AUD0DAT + channum * 8);
+ nextper = chan->dat;
nextvol = -1;
sample = 0;
}
// are we modulating the volume of the next channel?
- else if ((CUSTOM_REG(REG_ADKCON) >> channum) & 0x01)
+ else if ((m_adkcon >> channum) & 0x01)
{
nextper = -1;
- nextvol = CUSTOM_REG(REG_AUD0DAT + channum * 8);
+ nextvol = chan->dat;
sample = 0;
}
@@ -214,7 +267,8 @@ void amiga_sound_device::sound_stream_update(sound_stream &stream, stream_sample
chan->curlocation++;
if (chan->dma_enabled && !(chan->curlocation & 1))
{
- CUSTOM_REG(REG_AUD0DAT + channum * 8) = state->chip_ram_r(chan->curlocation);
+ chan->dat = m_mem_r(chan->curlocation);
+
if (chan->curlength != 0)
chan->curlength--;
@@ -225,9 +279,9 @@ void amiga_sound_device::sound_stream_update(sound_stream &stream, stream_sample
// latch the next byte of the sample
if (!(chan->curlocation & 1))
- chan->latched = CUSTOM_REG(REG_AUD0DAT + channum * 8) >> 8;
+ chan->latched = chan->dat >> 8;
else
- chan->latched = CUSTOM_REG(REG_AUD0DAT + channum * 8) >> 0;
+ chan->latched = chan->dat >> 0;
// if we're in manual mode, signal an interrupt once we latch the low byte
if (!chan->dma_enabled && chan->manualmode && (chan->curlocation & 1))
diff --git a/src/devices/machine/8364_paula.h b/src/devices/machine/8364_paula.h
new file mode 100644
index 00000000000..df5bfb5832e
--- /dev/null
+++ b/src/devices/machine/8364_paula.h
@@ -0,0 +1,172 @@
+// license: BSD-3-Clause
+// copyright-holders: Aaron Giles, Dirk Best
+/***************************************************************************
+
+ Commodore 8364 "Paula"
+
+ Multi-purpose chip that is part of the Amiga chipset. The name "Paula"
+ is derived from "Ports, Audio, UART and Logic". It features 4-channel
+ DMA driven audio, the floppy controller, a serial receiver/transmitter,
+ analog inputs and contains the interrupt controller.
+
+ ____ ____
+ D8 1 |* u | 48 D9
+ D7 2 | | 47 D10
+ D6 3 | | 46 D11
+ D5 4 | | 45 D12
+ D4 5 | | 44 D13
+ D3 6 | | 43 D14
+ D2 7 | | 42 D15
+ GND 8 | | 41 RXD
+ D1 9 | | 40 TXD
+ D0 10 | | 39 DKWE
+ /RES 11 | | 38 /DKWD
+ DMAL 12 | | 37 /DKRD
+ /IPL0 13 | | 36 POT1Y
+ /IPL1 14 | | 35 POT1X
+ /IPL2 15 | | 34 ANAGND
+ /INT2 16 | | 33 POT0Y
+ /INT3 17 | | 32 POT0X
+ /INT6 18 | | 31 AUDL
+ RGA8 19 | | 30 AUDR
+ RGA7 20 | | 29 CCKQ
+ RGA6 21 | | 28 CCK
+ RGA5 22 | | 27 VCC
+ RGA4 23 | | 26 RGA1
+ RGA3 24 |_________| 25 RGA2
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef MAME_DEVICES_MACHINE_8364_PAULA_H
+#define MAME_DEVICES_MACHINE_8364_PAULA_H
+
+#include "emu.h"
+
+
+//**************************************************************************
+// INTERFACE CONFIGURATION MACROS
+//**************************************************************************
+
+#define MCFG_PAULA_MEM_READ_CB(_devcb) \
+ devcb = &paula_8364_device::set_mem_r_callback(*device, DEVCB_##_devcb);
+
+#define MCFG_PAULA_INT_CB(_devcb) \
+ devcb = &paula_8364_device::set_int_w_callback(*device, DEVCB_##_devcb);
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> paula_8364_device
+
+class paula_8364_device : public device_t, public device_sound_interface
+{
+public:
+ paula_8364_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ ~paula_8364_device() {}
+
+ // configuration
+ template<class _Object> static devcb_base &set_mem_r_callback(device_t &device, _Object object)
+ { return downcast<paula_8364_device &>(device).m_mem_r.set_callback(object); }
+
+ template<class _Object> static devcb_base &set_int_w_callback(device_t &device, _Object object)
+ { return downcast<paula_8364_device &>(device).m_int_w.set_callback(object); }
+
+ DECLARE_READ16_MEMBER(reg_r);
+ DECLARE_WRITE16_MEMBER(reg_w);
+
+ void update();
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+ // sound stream update overrides
+ virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
+
+private:
+ enum
+ {
+ CHAN_0 = 0,
+ CHAN_1 = 1,
+ CHAN_2 = 2,
+ CHAN_3 = 3
+ };
+
+ enum
+ {
+ REG_DMACONR = 0x02/2,
+ REG_ADKCONR = 0x10/2,
+ REG_DMACON = 0x96/2,
+ REG_INTREQ = 0x9c/2,
+ REG_ADKCON = 0x9e/2,
+ REG_AUD0LCH = 0xa0/2, // to be moved, not part of paula
+ REG_AUD0LCL = 0xa2/2, // to be moved, not part of paula
+ REG_AUD0LEN = 0xa4/2,
+ REG_AUD0PER = 0xa6/2,
+ REG_AUD0VOL = 0xa8/2,
+ REG_AUD0DAT = 0xaa/2,
+ REG_AUD1LCH = 0xb0/2, // to be moved, not part of paula
+ REG_AUD1LCL = 0xb2/2, // to be moved, not part of paula
+ REG_AUD1LEN = 0xb4/2,
+ REG_AUD1PER = 0xb6/2,
+ REG_AUD1VOL = 0xb8/2,
+ REG_AUD1DAT = 0xba/2,
+ REG_AUD2LCH = 0xc0/2, // to be moved, not part of paula
+ REG_AUD2LCL = 0xc2/2, // to be moved, not part of paula
+ REG_AUD2LEN = 0xc4/2,
+ REG_AUD2PER = 0xc6/2,
+ REG_AUD2VOL = 0xc8/2,
+ REG_AUD2DAT = 0xca/2,
+ REG_AUD3LCH = 0xd0/2, // to be moved, not part of paula
+ REG_AUD3LCL = 0xd2/2, // to be moved, not part of paula
+ REG_AUD3LEN = 0xd4/2,
+ REG_AUD3PER = 0xd6/2,
+ REG_AUD3VOL = 0xd8/2,
+ REG_AUD3DAT = 0xda/2
+ };
+
+ static const int CLOCK_DIVIDER = 16;
+
+ struct audio_channel
+ {
+ emu_timer *irq_timer;
+ uint32_t curlocation;
+ uint16_t curlength;
+ uint16_t curticks;
+ uint8_t index;
+ bool dma_enabled;
+ bool manualmode;
+ int8_t latched;
+
+ // custom chip registers
+ uint32_t loc; // to be moved, not part of paula
+ uint16_t len;
+ uint16_t per;
+ uint16_t vol;
+ uint16_t dat;
+ };
+
+ void dma_reload(audio_channel *chan);
+
+ // callbacks
+ devcb_read16 m_mem_r;
+ devcb_write_line m_int_w;
+
+ // internal state
+ uint16_t m_dmacon;
+ uint16_t m_adkcon;
+
+ audio_channel m_channel[4];
+ sound_stream *m_stream;
+
+ TIMER_CALLBACK_MEMBER( signal_irq );
+};
+
+// device type definition
+extern const device_type PAULA_8364;
+
+#endif // MAME_DEVICES_MACHINE_8364_PAULA_H
diff --git a/src/devices/machine/cs4031.h b/src/devices/machine/cs4031.h
index 629f3ecd6c3..9a128f67913 100644
--- a/src/devices/machine/cs4031.h
+++ b/src/devices/machine/cs4031.h
@@ -45,31 +45,31 @@
cs4031_device::static_set_keybctag(*device, _keybctag);
#define MCFG_CS4031_IOR(_ior) \
- downcast<cs4031_device *>(device)->set_ior_callback(DEVCB_##_ior);
+ devcb = &downcast<cs4031_device *>(device)->set_ior_callback(DEVCB_##_ior);
#define MCFG_CS4031_IOW(_iow) \
- downcast<cs4031_device *>(device)->set_iow_callback(DEVCB_##_iow);
+ devcb = &downcast<cs4031_device *>(device)->set_iow_callback(DEVCB_##_iow);
#define MCFG_CS4031_TC(_tc) \
- downcast<cs4031_device *>(device)->set_tc_callback(DEVCB_##_tc);
+ devcb = &downcast<cs4031_device *>(device)->set_tc_callback(DEVCB_##_tc);
#define MCFG_CS4031_HOLD(_hold) \
- downcast<cs4031_device *>(device)->set_hold_callback(DEVCB_##_hold);
+ devcb = &downcast<cs4031_device *>(device)->set_hold_callback(DEVCB_##_hold);
#define MCFG_CS4031_NMI(_nmi) \
- downcast<cs4031_device *>(device)->set_nmi_callback(DEVCB_##_nmi);
+ devcb = &downcast<cs4031_device *>(device)->set_nmi_callback(DEVCB_##_nmi);
#define MCFG_CS4031_INTR(_intr) \
- downcast<cs4031_device *>(device)->set_intr_callback(DEVCB_##_intr);
+ devcb = &downcast<cs4031_device *>(device)->set_intr_callback(DEVCB_##_intr);
#define MCFG_CS4031_CPURESET(_cpureset) \
- downcast<cs4031_device *>(device)->set_cpureset_callback(DEVCB_##_cpureset);
+ devcb = &downcast<cs4031_device *>(device)->set_cpureset_callback(DEVCB_##_cpureset);
#define MCFG_CS4031_A20M(_a20m) \
- downcast<cs4031_device *>(device)->set_a20m_callback(DEVCB_##_a20m);
+ devcb = &downcast<cs4031_device *>(device)->set_a20m_callback(DEVCB_##_a20m);
#define MCFG_CS4031_SPKR(_spkr) \
- downcast<cs4031_device *>(device)->set_spkr_callback(DEVCB_##_spkr);
+ devcb = &downcast<cs4031_device *>(device)->set_spkr_callback(DEVCB_##_spkr);
//**************************************************************************
@@ -88,15 +88,15 @@ public:
virtual machine_config_constructor device_mconfig_additions() const override;
// callbacks
- template<class _ior> void set_ior_callback(_ior ior) { m_read_ior.set_callback(ior); }
- template<class _iow> void set_iow_callback(_iow iow) { m_write_iow.set_callback(iow); }
- template<class _tc> void set_tc_callback(_tc tc) { m_write_tc.set_callback(tc); }
- template<class _hold> void set_hold_callback(_hold hold) { m_write_hold.set_callback(hold); }
- template<class _cpureset> void set_cpureset_callback(_cpureset cpureset) { m_write_cpureset.set_callback(cpureset); }
- template<class _nmi> void set_nmi_callback(_nmi nmi) { m_write_nmi.set_callback(nmi); }
- template<class _intr> void set_intr_callback(_intr intr) { m_write_intr.set_callback(intr); }
- template<class _a20m> void set_a20m_callback(_a20m a20m) { m_write_a20m.set_callback(a20m); }
- template<class _spkr> void set_spkr_callback(_spkr spkr) { m_write_spkr.set_callback(spkr); }
+ template<class _ior> devcb_base &set_ior_callback(_ior ior) { return m_read_ior.set_callback(ior); }
+ template<class _iow> devcb_base &set_iow_callback(_iow iow) { return m_write_iow.set_callback(iow); }
+ template<class _tc> devcb_base &set_tc_callback(_tc tc) { return m_write_tc.set_callback(tc); }
+ template<class _hold> devcb_base &set_hold_callback(_hold hold) { return m_write_hold.set_callback(hold); }
+ template<class _cpureset> devcb_base &set_cpureset_callback(_cpureset cpureset) { return m_write_cpureset.set_callback(cpureset); }
+ template<class _nmi> devcb_base &set_nmi_callback(_nmi nmi) { return m_write_nmi.set_callback(nmi); }
+ template<class _intr> devcb_base &set_intr_callback(_intr intr) { return m_write_intr.set_callback(intr); }
+ template<class _a20m> devcb_base &set_a20m_callback(_a20m a20m) { return m_write_a20m.set_callback(a20m); }
+ template<class _spkr> devcb_base &set_spkr_callback(_spkr spkr) { return m_write_spkr.set_callback(spkr); }
// not really public
DECLARE_READ8_MEMBER( dma_read_byte );
diff --git a/src/devices/machine/fdc_pll.cpp b/src/devices/machine/fdc_pll.cpp
index cf616468a12..ef93eda920d 100644
--- a/src/devices/machine/fdc_pll.cpp
+++ b/src/devices/machine/fdc_pll.cpp
@@ -23,11 +23,16 @@ void fdc_pll_t::set_clock(const attotime &_period)
void fdc_pll_t::reset(const attotime &when)
{
+ read_reset(when);
+ write_position = 0;
+ write_start_time = attotime::never;
+}
+
+void fdc_pll_t::read_reset(const attotime &when)
+{
ctime = when;
phase_adjust = attotime::zero;
freq_hist = 0;
- write_position = 0;
- write_start_time = attotime::never;
}
void fdc_pll_t::start_writing(const attotime &tm)
@@ -55,8 +60,13 @@ void fdc_pll_t::commit(floppy_image_device *floppy, const attotime &tm)
int fdc_pll_t::get_next_bit(attotime &tm, floppy_image_device *floppy, const attotime &limit)
{
- attotime edge = floppy ? floppy->get_next_transition(ctime) : attotime::never;
+ attotime edge = floppy ? floppy->get_next_transition(ctime) : attotime::never;
+ return feed_read_data(tm , edge , limit);
+}
+
+int fdc_pll_t::feed_read_data(attotime &tm, const attotime& edge, const attotime &limit)
+{
attotime next = ctime + period + phase_adjust;
#if 0
@@ -70,7 +80,7 @@ int fdc_pll_t::get_next_bit(attotime &tm, floppy_image_device *floppy, const att
ctime = next;
tm = next;
- if(edge.is_never() || edge >= next) {
+ if(edge.is_never() || edge > next) {
// No transition in the window means 0 and pll in free run mode
phase_adjust = attotime::zero;
return 0;
diff --git a/src/devices/machine/fdc_pll.h b/src/devices/machine/fdc_pll.h
index 31eaae07d1b..16de4c0458f 100644
--- a/src/devices/machine/fdc_pll.h
+++ b/src/devices/machine/fdc_pll.h
@@ -21,7 +21,9 @@ public:
void set_clock(const attotime &period);
void reset(const attotime &when);
+ void read_reset(const attotime &when);
int get_next_bit(attotime &tm, floppy_image_device *floppy, const attotime &limit);
+ int feed_read_data(attotime &tm, const attotime& edge, const attotime &limit);
bool write_next_bit(bool bit, attotime &tm, floppy_image_device *floppy, const attotime &limit);
void start_writing(const attotime &tm);
void commit(floppy_image_device *floppy, const attotime &tm);
diff --git a/src/devices/machine/gen_latch.h b/src/devices/machine/gen_latch.h
index 210dbc967fd..a61a8e141ef 100644
--- a/src/devices/machine/gen_latch.h
+++ b/src/devices/machine/gen_latch.h
@@ -63,7 +63,7 @@ protected:
private:
bool m_latch_written;
- devcb_write_line m_data_pending_cb;
+ devcb_write_line m_data_pending_cb;
};
diff --git a/src/devices/machine/i8251.cpp b/src/devices/machine/i8251.cpp
index 2fc9ef798b6..2c33c6decb3 100644
--- a/src/devices/machine/i8251.cpp
+++ b/src/devices/machine/i8251.cpp
@@ -24,7 +24,7 @@
#define VERBOSE 0
-#define LOG(x) do { if (VERBOSE) logerror x; } while (0)
+#define LOG(...) do { if (VERBOSE) logerror(__VA_ARGS__); } while (0)
//**************************************************************************
// DEVICE DEFINITIONS
@@ -33,12 +33,26 @@
const device_type I8251 = &device_creator<i8251_device>;
const device_type V53_SCU = &device_creator<v53_scu_device>;
+template class device_finder<i8251_device, false>;
+template class device_finder<i8251_device, true>;
+template class device_finder<v53_scu_device, false>;
+template class device_finder<v53_scu_device, true>;
+
+
//-------------------------------------------------
// i8251_device - constructor
//-------------------------------------------------
-i8251_device::i8251_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname)
- : device_t(mconfig, type, name, tag, owner, clock, shortname, __FILE__),
+i8251_device::i8251_device(
+ const machine_config &mconfig,
+ device_type type,
+ const char *name,
+ const char *tag,
+ device_t *owner,
+ uint32_t clock,
+ const char *shortname,
+ const char *source)
+ : device_t(mconfig, type, name, tag, owner, clock, shortname, source),
device_serial_interface(mconfig, *this),
m_txd_handler(*this),
m_dtr_handler(*this),
@@ -56,25 +70,12 @@ i8251_device::i8251_device(const machine_config &mconfig, device_type type, cons
}
i8251_device::i8251_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, I8251, "8251 USART", tag, owner, clock, "i8251", __FILE__),
- device_serial_interface(mconfig, *this),
- m_txd_handler(*this),
- m_dtr_handler(*this),
- m_rts_handler(*this),
- m_rxrdy_handler(*this),
- m_txrdy_handler(*this),
- m_txempty_handler(*this),
- m_syndet_handler(*this),
- m_cts(1),
- m_dsr(1),
- m_rxd(0),
- m_rxc(0),
- m_txc(0)
+ : i8251_device(mconfig, I8251, "8251 USART", tag, owner, clock, "i8251", __FILE__)
{
}
v53_scu_device::v53_scu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : i8251_device(mconfig, V53_SCU, "V53 SCU", tag, owner, clock, "v53_scu")
+ : i8251_device(mconfig, V53_SCU, "V53 SCU", tag, owner, clock, "v53_scu", __FILE__)
{
}
@@ -121,15 +122,11 @@ void i8251_device::device_start()
void i8251_device::update_rx_ready()
{
- int state;
-
- state = m_status & I8251_STATUS_RX_READY;
+ int state = m_status & I8251_STATUS_RX_READY;
- /* masked? */
- if ((m_command & (1<<2))==0)
- {
+ // masked?
+ if (!BIT(m_command, 2))
state = 0;
- }
m_rxrdy_handler(state != 0);
}
@@ -142,19 +139,22 @@ void i8251_device::update_rx_ready()
void i8251_device::receive_clock()
{
- m_rxc_count++;
-
- if (m_rxc_count == m_br_factor)
- m_rxc_count = 0;
- else
- return;
-
/* receive enable? */
- if (m_command & (1<<2))
+ if (BIT(m_command, 2))
{
+ const bool sync = is_receive_register_synchronized();
+ if (sync)
+ {
+ --m_rxc_count;
+ if (m_rxc_count)
+ return;
+ }
+
//logerror("I8251\n");
/* get bit received from other side and update receive register */
receive_register_update_bit(m_rxd);
+ if (is_receive_register_synchronized())
+ m_rxc_count = sync ? m_br_factor : (3 * m_br_factor / 2);
if (is_receive_register_full())
{
@@ -167,25 +167,24 @@ void i8251_device::receive_clock()
/*-------------------------------------------------
is_tx_enabled
-------------------------------------------------*/
-bool i8251_device::is_tx_enabled(void) const
+bool i8251_device::is_tx_enabled() const
{
- return BIT(m_command , 0) != 0 && m_cts == 0;
+ return BIT(m_command , 0) && !m_cts;
}
/*-------------------------------------------------
check_for_tx_start
-------------------------------------------------*/
-void i8251_device::check_for_tx_start(void)
+void i8251_device::check_for_tx_start()
{
- if (is_tx_enabled() && (m_status & (I8251_STATUS_TX_EMPTY | I8251_STATUS_TX_READY)) == I8251_STATUS_TX_EMPTY) {
- start_tx();
- }
+ if (is_tx_enabled() && (m_status & (I8251_STATUS_TX_EMPTY | I8251_STATUS_TX_READY)) == I8251_STATUS_TX_EMPTY)
+ start_tx();
}
/*-------------------------------------------------
start_tx
-------------------------------------------------*/
-void i8251_device::start_tx(void)
+void i8251_device::start_tx()
{
transmit_register_setup(m_tx_data);
m_status &= ~I8251_STATUS_TX_EMPTY;
@@ -199,23 +198,25 @@ void i8251_device::start_tx(void)
void i8251_device::transmit_clock()
{
m_txc_count++;
-
- if (m_txc_count == m_br_factor)
- m_txc_count = 0;
- else
+ if (m_txc_count != m_br_factor)
return;
- if (is_transmit_register_empty()) {
- if ((m_status & I8251_STATUS_TX_READY) == 0 && (is_tx_enabled() || (m_flags & I8251_DELAYED_TX_EN) != 0)) {
+ m_txc_count = 0;
+
+ if (is_transmit_register_empty())
+ {
+ if ((m_status & I8251_STATUS_TX_READY) == 0 && (is_tx_enabled() || (m_flags & I8251_DELAYED_TX_EN) != 0))
start_tx();
- } else {
+ else
m_status |= I8251_STATUS_TX_EMPTY;
- }
+
update_tx_ready();
update_tx_empty();
}
+
/* if diserial has bits to send, make them so */
- if (!is_transmit_register_empty()) {
+ if (!is_transmit_register_empty())
+ {
uint8_t data = transmit_register_get_data_bit();
m_txd_handler(data);
}
@@ -223,7 +224,7 @@ void i8251_device::transmit_clock()
#if 0
/* hunt mode? */
/* after each bit has been shifted in, it is compared against the current sync byte */
- if (m_command & (1<<7))
+ if (BIT(m_command, 7))
{
/* data matches sync byte? */
if (m_data == m_sync_bytes[m_sync_byte_offset])
@@ -236,7 +237,7 @@ void i8251_device::transmit_clock()
if (m_sync_byte_offset == m_sync_byte_count)
{
/* ent hunt mode */
- m_command &=~(1<<7);
+ m_command &= ~(1<<7);
}
}
else
@@ -295,7 +296,7 @@ void i8251_device::update_tx_empty()
void i8251_device::device_reset()
{
- LOG(("I8251: Reset\n"));
+ LOG("I8251: Reset\n");
/* what is the default setup when the 8251 has been reset??? */
@@ -342,52 +343,34 @@ void i8251_device::device_reset()
WRITE8_MEMBER(i8251_device::command_w)
{
/* command */
- LOG(("I8251: Command byte\n"));
+ LOG("I8251: Command byte\n");
m_command = data;
- LOG(("Command byte: %02x\n", data));
+ LOG("Command byte: %02x\n", data);
- if (data & (1<<7))
- {
- LOG(("hunt mode\n"));
- }
+ if (BIT(data, 7))
+ LOG("hunt mode\n");
- if (data & (1<<5))
- {
- LOG(("/rts set to 0\n"));
- }
+ if (BIT(data, 5))
+ LOG("/rts set to 0\n");
else
- {
- LOG(("/rts set to 1\n"));
- }
+ LOG("/rts set to 1\n");
- if (data & (1<<2))
- {
- LOG(("receive enable\n"));
- }
+ if (BIT(data, 2))
+ LOG("receive enable\n");
else
- {
- LOG(("receive disable\n"));
- }
+ LOG("receive disable\n");
- if (data & (1<<1))
- {
- LOG(("/dtr set to 0\n"));
- }
+ if (BIT(data, 1))
+ LOG("/dtr set to 0\n");
else
- {
- LOG(("/dtr set to 1\n"));
- }
+ LOG("/dtr set to 1\n");
- if (data & (1<<0))
- {
- LOG(("transmit enable\n"));
- }
+ if (BIT(data, 0))
+ LOG("transmit enable\n");
else
- {
- LOG(("transmit disable\n"));
- }
+ LOG("transmit disable\n");
/* bit 7:
@@ -419,12 +402,10 @@ WRITE8_MEMBER(i8251_device::command_w)
m_rts_handler(!BIT(data, 5));
m_dtr_handler(!BIT(data, 1));
- if (data & (1<<4))
- {
+ if (BIT(data, 4))
m_status &= ~(I8251_STATUS_PARITY_ERROR | I8251_STATUS_OVERRUN_ERROR | I8251_STATUS_FRAMING_ERROR);
- }
- if (data & (1<<6))
+ if (BIT(data, 6))
{
// datasheet says "returns to mode format", not
// completely resets the chip. behavior of DEC Rainbow
@@ -432,15 +413,15 @@ WRITE8_MEMBER(i8251_device::command_w)
m_flags |= I8251_EXPECTING_MODE;
}
- check_for_tx_start();
+ check_for_tx_start();
update_rx_ready();
update_tx_ready();
- update_tx_empty();
+ update_tx_empty();
}
WRITE8_MEMBER(i8251_device::mode_w)
{
- LOG(("I8251: Mode byte\n"));
+ LOG("I8251: Mode byte = %X\n", data);
m_mode_byte = data;
@@ -472,60 +453,56 @@ WRITE8_MEMBER(i8251_device::mode_w)
3 = x64
*/
- LOG(("I8251: Asynchronous operation\n"));
+ LOG("I8251: Asynchronous operation\n");
- LOG(("Character length: %d\n", (((data >> 2) & 0x03) + 5)));
+ const int data_bits_count = ((data >> 2) & 0x03) + 5;
+ LOG("Character length: %d\n", data_bits_count);
parity_t parity;
-
- if (data & (1 << 4))
+ if (BIT(data, 4))
{
- LOG(("enable parity checking\n"));
-
- if (data & (1 << 5))
+ if (BIT(data, 5))
{
- LOG(("even parity\n"));
+ LOG("enable parity checking (even parity)\n");
parity = PARITY_EVEN;
}
else
{
- LOG(("odd parity\n"));
+ LOG("enable parity checking (odd parity)\n");
parity = PARITY_ODD;
}
}
else
{
- LOG(("parity check disabled\n"));
+ LOG("parity check disabled\n");
parity = PARITY_NONE;
}
stop_bits_t stop_bits;
-
switch ((data >> 6) & 0x03)
{
case 0:
default:
stop_bits = STOP_BITS_0;
- LOG(("stop bit: inhibit\n"));
+ LOG("stop bit: inhibit\n");
break;
case 1:
stop_bits = STOP_BITS_1;
- LOG(("stop bit: 1 bit\n"));
+ LOG("stop bit: 1 bit\n");
break;
case 2:
stop_bits = STOP_BITS_1_5;
- LOG(("stop bit: 1.5 bits\n"));
+ LOG("stop bit: 1.5 bits\n");
break;
case 3:
stop_bits = STOP_BITS_2;
- LOG(("stop bit: 2 bits\n"));
+ LOG("stop bit: 2 bits\n");
break;
}
- int data_bits_count = ((data >> 2) & 0x03) + 5;
set_data_frame(1, data_bits_count, parity, stop_bits);
receive_register_reset();
@@ -537,13 +514,13 @@ WRITE8_MEMBER(i8251_device::mode_w)
case 3: m_br_factor = 64; break;
}
- m_rxc_count = m_txc_count = 0;
+ m_txc_count = 0;
#if 0
/* data bits */
m_receive_char_length = (((data >> 2) & 0x03) + 5);
- if (data & (1 << 4))
+ if (BIT(data, 4))
{
/* parity */
m_receive_char_length++;
@@ -580,7 +557,7 @@ WRITE8_MEMBER(i8251_device::mode_w)
3 = 8 bits
bit 1,0 = 0
*/
- LOG(("I8251: Synchronous operation\n"));
+ LOG("I8251: Synchronous operation\n");
/* setup for sync byte(s) */
m_flags |= I8251_EXPECTING_SYNC_BYTE;
@@ -603,9 +580,9 @@ WRITE8_MEMBER(i8251_device::control_w)
{
if (m_flags & I8251_EXPECTING_SYNC_BYTE)
{
- LOG(("I8251: Sync byte\n"));
+ LOG("I8251: Sync byte\n");
- LOG(("Sync byte: %02x\n", data));
+ LOG("Sync byte: %02x\n", data);
/* store sync byte written */
m_sync_bytes[m_sync_byte_offset] = data;
m_sync_byte_offset++;
@@ -639,7 +616,7 @@ READ8_MEMBER(i8251_device::status_r)
{
uint8_t status = (m_dsr << 7) | m_status;
- LOG(("status: %02x\n", status));
+ LOG("status: %02x\n", status);
return status;
}
@@ -653,7 +630,7 @@ WRITE8_MEMBER(i8251_device::data_w)
{
m_tx_data = data;
- LOG(("data_w %02x\n" , data));
+ LOG("data_w %02x\n" , data);
/* writing clears */
m_status &=~I8251_STATUS_TX_READY;
@@ -687,9 +664,8 @@ void i8251_device::receive_character(uint8_t ch)
/* char has not been read and another has arrived! */
if (m_status & I8251_STATUS_RX_READY)
- {
m_status |= I8251_STATUS_OVERRUN_ERROR;
- }
+
m_status |= I8251_STATUS_RX_READY;
update_rx_ready();
@@ -703,7 +679,7 @@ void i8251_device::receive_character(uint8_t ch)
READ8_MEMBER(i8251_device::data_r)
{
- LOG(("read data: %02x, STATUS=%02x\n",m_rx_data,m_status));
+ LOG("read data: %02x, STATUS=%02x\n",m_rx_data,m_status);
/* reading clears */
m_status &= ~I8251_STATUS_RX_READY;
@@ -728,9 +704,9 @@ WRITE_LINE_MEMBER(i8251_device::write_cts)
{
m_cts = state;
- check_for_tx_start();
- update_tx_ready();
- update_tx_empty();
+ check_for_tx_start();
+ update_tx_ready();
+ update_tx_empty();
}
WRITE_LINE_MEMBER(i8251_device::write_dsr)
diff --git a/src/devices/machine/i8251.h b/src/devices/machine/i8251.h
index a556851beb7..82659caed11 100644
--- a/src/devices/machine/i8251.h
+++ b/src/devices/machine/i8251.h
@@ -8,8 +8,8 @@
*********************************************************************/
-#ifndef __I8251_H__
-#define __I8251_H__
+#ifndef MAME_DEVICES_MACHINE_I8251_H
+#define MAME_DEVICES_MACHINE_I8251_H
//**************************************************************************
@@ -42,7 +42,6 @@ class i8251_device : public device_t,
{
public:
// construction/destruction
- i8251_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname);
i8251_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// static configuration helpers
@@ -82,6 +81,16 @@ public:
};
protected:
+ i8251_device(
+ const machine_config &mconfig,
+ device_type type,
+ const char *name,
+ const char *tag,
+ device_t *owner,
+ uint32_t clock,
+ const char *shortname,
+ const char *source);
+
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
@@ -92,9 +101,9 @@ protected:
void update_tx_empty();
void transmit_clock();
void receive_clock();
- bool is_tx_enabled(void) const;
- void check_for_tx_start(void);
- void start_tx(void);
+ bool is_tx_enabled() const;
+ void check_for_tx_start();
+ void start_tx();
enum
@@ -155,5 +164,10 @@ public:
extern const device_type I8251;
extern const device_type V53_SCU;
+extern template class device_finder<i8251_device, false>;
+extern template class device_finder<i8251_device, true>;
+extern template class device_finder<v53_scu_device, false>;
+extern template class device_finder<v53_scu_device, true>;
+
-#endif /* __I8251_H__ */
+#endif // MAME_DEVICES_MACHINE_I8251_H
diff --git a/src/devices/machine/ldv1000.h b/src/devices/machine/ldv1000.h
index ea543159a33..a8cadf1f9a8 100644
--- a/src/devices/machine/ldv1000.h
+++ b/src/devices/machine/ldv1000.h
@@ -27,7 +27,7 @@
MCFG_DEVICE_ADD(_tag, PIONEER_LDV1000, 0)
#define MCFG_LASERDISC_LDV1000_COMMAND_STROBE_CB(_cb) \
- downcast<pioneer_ldv1000_device *>(device)->set_command_strobe_callback(DEVCB_##_cb);
+ devcb = &downcast<pioneer_ldv1000_device *>(device)->set_command_strobe_callback(DEVCB_##_cb);
@@ -53,7 +53,7 @@ public:
// construction/destruction
pioneer_ldv1000_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template<class _cmd_strobe_cb> void set_command_strobe_callback(_cmd_strobe_cb latch) { m_command_strobe_cb.set_callback(latch); }
+ template<class _cmd_strobe_cb> devcb_base &set_command_strobe_callback(_cmd_strobe_cb latch) { return m_command_strobe_cb.set_callback(latch); }
// input and output
void data_w(uint8_t data);
diff --git a/src/devices/machine/mc68681.cpp b/src/devices/machine/mc68681.cpp
index 2f79b82da1b..7428929ab3c 100644
--- a/src/devices/machine/mc68681.cpp
+++ b/src/devices/machine/mc68681.cpp
@@ -1,7 +1,7 @@
// license:BSD-3-Clause
// copyright-holders:Mariusz Wojcieszek, R. Belmont
/*
- 2681 DUART
+ 2681 DUART
68681 DUART
28C94 QUART
@@ -52,8 +52,8 @@ static const int baud_rate_ACR_1[] = { 75, 110, 134, 150, 300, 600, 1200, 2000,
#define CHANA_TAG "cha"
#define CHANB_TAG "chb"
-#define CHANC_TAG "chc"
-#define CHAND_TAG "chd"
+#define CHANC_TAG "chc"
+#define CHAND_TAG "chd"
// device type definition
const device_type MC68681 = &device_creator<mc68681_device>;
@@ -357,12 +357,12 @@ READ8_MEMBER( sc28c94_device::read )
{
uint8_t r = 0;
offset &= 0x1f;
-
+
if (offset < 0x10)
{
return mc68681_base_device::read(space, offset, mem_mask);
}
-
+
switch (offset)
{
case 0x10: /* MR1A/MR2C */
@@ -370,14 +370,14 @@ READ8_MEMBER( sc28c94_device::read )
case 0x13: /* Rx Holding Register C */
r = m_chanC->read_chan_reg(offset & 3);
break;
-
+
case 0x18: /* MR1D/MR2D */
case 0x19: /* SRD */
case 0x1b: /* RHRD */
r = m_chanD->read_chan_reg(offset & 3);
break;
}
-
+
return r;
}
@@ -488,12 +488,12 @@ READ8_MEMBER( mc68681_base_device::read )
WRITE8_MEMBER( sc28c94_device::write )
{
offset &= 0x1f;
-
+
if (offset < 0x10)
{
mc68681_base_device::write(space, offset, data, mem_mask);
}
-
+
switch(offset)
{
case 0x10: /* MRC */
@@ -502,7 +502,7 @@ WRITE8_MEMBER( sc28c94_device::write )
case 0x13: /* THRC */
m_chanC->write_chan_reg(offset&3, data);
break;
-
+
case 0x18: /* MRC */
case 0x19: /* CSRC */
case 0x1a: /* CRC */
@@ -882,7 +882,7 @@ void mc68681_channel::tra_callback()
if ((MR2&0xC0) != 0x80)
{
int bit = transmit_register_get_data_bit();
- //printf("%s ch %d transmit %d\n", tag(), m_ch, bit);
+ //printf("%s ch %d transmit %d\n", tag(), m_ch, bit);
if (m_ch == 0)
{
m_uart->write_a_tx(bit);
@@ -1254,7 +1254,7 @@ void mc68681_channel::write_TX(uint8_t data)
printf("Write %02x to TX when TX not ready!\n", data);
}*/
- //printf("%s ch %d Tx %02x\n", tag(), m_ch, data);
+ //printf("%s ch %d Tx %02x\n", tag(), m_ch, data);
tx_ready = 0;
SR &= ~STATUS_TRANSMITTER_READY;
diff --git a/src/devices/machine/mc68681.h b/src/devices/machine/mc68681.h
index b502a33db12..208a6b9f032 100644
--- a/src/devices/machine/mc68681.h
+++ b/src/devices/machine/mc68681.h
@@ -32,7 +32,7 @@
// SC28C94 specific callbacks
#define MCFG_SC28C94_ADD(_tag, _clock) \
MCFG_DEVICE_ADD(_tag, SC28C94, _clock)
-
+
#define MCFG_SC28C94_C_TX_CALLBACK(_cb) \
devcb = &sc28c94_device::set_c_tx_cb(*device, DEVCB_##_cb);
@@ -182,9 +182,9 @@ private:
void set_ISR_bits(int mask);
void update_interrupts();
- int get_ch(mc68681_channel *ch)
- {
- if (ch == m_chanA)
+ int get_ch(mc68681_channel *ch)
+ {
+ if (ch == m_chanA)
{
return 0;
}
@@ -196,10 +196,10 @@ private:
{
return 2;
}
-
+
return 3;
}
-
+
mc68681_channel *get_channel(int chan);
};
@@ -213,7 +213,7 @@ class sc28c94_device : public mc68681_base_device
{
public:
sc28c94_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
+
template<class _Object> static devcb_base &set_c_tx_cb(device_t &device, _Object object) { return downcast<mc68681_base_device &>(device).write_c_tx.set_callback(object); }
template<class _Object> static devcb_base &set_d_tx_cb(device_t &device, _Object object) { return downcast<mc68681_base_device &>(device).write_d_tx.set_callback(object); }
@@ -222,10 +222,10 @@ public:
virtual DECLARE_READ8_MEMBER(read) override;
virtual DECLARE_WRITE8_MEMBER(write) override;
-
+
protected:
virtual machine_config_constructor device_mconfig_additions() const override;
-
+
private:
};
diff --git a/src/devices/machine/mpu401.h b/src/devices/machine/mpu401.h
index cf98056cc81..3717477a43c 100644
--- a/src/devices/machine/mpu401.h
+++ b/src/devices/machine/mpu401.h
@@ -13,7 +13,7 @@
MCFG_IRQ_FUNC(_irqf)
#define MCFG_IRQ_FUNC(_irqf) \
- downcast<mpu401_device *>(device)->set_irqf(DEVCB_##_irqf);
+ devcb = &downcast<mpu401_device *>(device)->set_irqf(DEVCB_##_irqf);
//**************************************************************************
// TYPE DEFINITIONS
@@ -30,9 +30,9 @@ public:
required_device<m6801_cpu_device> m_ourcpu;
- template<class _write> void set_irqf(_write wr)
+ template<class _write> devcb_base &set_irqf(_write wr)
{
- write_irq.set_callback(wr);
+ return write_irq.set_callback(wr);
}
devcb_write_line write_irq;
diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp
index 89f4cd017ae..19248d00dc5 100644
--- a/src/devices/machine/netlist.cpp
+++ b/src/devices/machine/netlist.cpp
@@ -29,7 +29,6 @@ const device_type NETLIST_SOUND = &device_creator<netlist_mame_sound_device_t>;
const device_type NETLIST_ANALOG_INPUT = &device_creator<netlist_mame_analog_input_t>;
const device_type NETLIST_INT_INPUT = &device_creator<netlist_mame_int_input_t>;
-const device_type NETLIST_ROM_REGION = &device_creator<netlist_mame_rom_t>;
const device_type NETLIST_RAM_POINTER = &device_creator<netlist_ram_pointer_t>;
const device_type NETLIST_LOGIC_INPUT = &device_creator<netlist_mame_logic_input_t>;
const device_type NETLIST_STREAM_INPUT = &device_creator<netlist_mame_stream_input_t>;
@@ -39,6 +38,391 @@ const device_type NETLIST_ANALOG_OUTPUT = &device_creator<netlist_mame_analog_ou
const device_type NETLIST_STREAM_OUTPUT = &device_creator<netlist_mame_stream_output_t>;
// ----------------------------------------------------------------------------------------
+// Special netlist extension devices ....
+// ----------------------------------------------------------------------------------------
+
+class netlist_mame_device_t;
+
+class netlist_mame_t : public netlist::netlist_t
+{
+public:
+
+ netlist_mame_t(netlist_mame_device_t &parent, const pstring &aname)
+ : netlist::netlist_t(aname),
+ m_parent(parent)
+ {}
+ virtual ~netlist_mame_t() { };
+
+ inline running_machine &machine();
+
+ netlist_mame_device_t &parent() { return m_parent; }
+
+protected:
+
+ void vlog(const plib::plog_level &l, const pstring &ls) const override;
+
+private:
+ netlist_mame_device_t &m_parent;
+};
+
+
+// ----------------------------------------------------------------------------------------
+// analog_callback
+// ----------------------------------------------------------------------------------------
+
+class NETLIB_NAME(analog_callback) : public netlist::device_t
+{
+public:
+ NETLIB_NAME(analog_callback)(netlist::netlist_t &anetlist, const pstring &name)
+ : device_t(anetlist, name)
+ , m_in(*this, "IN")
+ , m_cpu_device(nullptr)
+ , m_last(*this, "m_last", 0)
+ {
+ m_cpu_device = downcast<netlist_mame_cpu_device_t *>(&downcast<netlist_mame_t &>(netlist()).parent());
+ }
+
+ ATTR_COLD void reset() override
+ {
+ m_last = 0.0;
+ }
+
+ ATTR_COLD void register_callback(netlist_analog_output_delegate callback)
+ {
+ m_callback = callback;
+ }
+
+ NETLIB_UPDATEI()
+ {
+ nl_double cur = m_in();
+
+ // FIXME: make this a parameter
+ // avoid calls due to noise
+ if (std::fabs(cur - m_last) > 1e-6)
+ {
+ m_cpu_device->update_time_x();
+ m_callback(cur, m_cpu_device->local_time());
+ m_cpu_device->check_mame_abort_slice();
+ m_last = cur;
+ }
+ }
+
+private:
+ netlist::analog_input_t m_in;
+ netlist_analog_output_delegate m_callback;
+ netlist_mame_cpu_device_t *m_cpu_device;
+ netlist::state_var<nl_double> m_last;
+};
+
+// ----------------------------------------------------------------------------------------
+// logic_callback
+// ----------------------------------------------------------------------------------------
+
+class NETLIB_NAME(logic_callback) : public netlist::device_t
+{
+public:
+ NETLIB_NAME(logic_callback)(netlist::netlist_t &anetlist, const pstring &name)
+ : device_t(anetlist, name)
+ , m_in(*this, "IN")
+ , m_cpu_device(nullptr)
+ , m_last(*this, "m_last", 0)
+ {
+ m_cpu_device = downcast<netlist_mame_cpu_device_t *>(&downcast<netlist_mame_t &>(netlist()).parent());
+ }
+
+ ATTR_COLD void reset() override
+ {
+ m_last = 0;
+ }
+
+ ATTR_COLD void register_callback(netlist_logic_output_delegate callback)
+ {
+ m_callback = callback;
+ }
+
+ NETLIB_UPDATEI()
+ {
+ netlist_sig_t cur = m_in();
+
+ // FIXME: make this a parameter
+ // avoid calls due to noise
+ if (cur != m_last)
+ {
+ m_cpu_device->update_time_x();
+ m_callback(cur, m_cpu_device->local_time());
+ m_cpu_device->check_mame_abort_slice();
+ m_last = cur;
+ }
+ }
+
+private:
+ netlist::logic_input_t m_in;
+ netlist_logic_output_delegate m_callback;
+ netlist_mame_cpu_device_t *m_cpu_device;
+ netlist::state_var<netlist_sig_t> m_last;
+};
+
+// ----------------------------------------------------------------------------------------
+// sound_out
+// ----------------------------------------------------------------------------------------
+
+class NETLIB_NAME(sound_out) : public netlist::device_t
+{
+public:
+ NETLIB_NAME(sound_out)(netlist::netlist_t &anetlist, const pstring &name)
+ : netlist::device_t(anetlist, name)
+ , m_channel(*this, "CHAN", 0)
+ , m_mult(*this, "MULT", 1000.0)
+ , m_offset(*this, "OFFSET", 0.0)
+ , m_sample(netlist::netlist_time::from_hz(1)) //sufficiently big enough
+ , m_in(*this, "IN")
+ , m_last_buffer(*this, "m_last_buffer", netlist::netlist_time::zero())
+ {
+ }
+
+ static const int BUFSIZE = 2048;
+
+ ATTR_COLD void reset() override
+ {
+ m_cur = 0.0;
+ m_last_pos = 0;
+ m_last_buffer = netlist::netlist_time::zero();
+ }
+
+ ATTR_HOT void sound_update(const netlist::netlist_time &upto)
+ {
+ int pos = (upto - m_last_buffer) / m_sample;
+ if (pos >= BUFSIZE)
+ netlist().log().fatal("sound {1}: exceeded BUFSIZE\n", name().c_str());
+ while (m_last_pos < pos )
+ {
+ m_buffer[m_last_pos++] = (stream_sample_t) m_cur;
+ }
+ }
+
+ NETLIB_UPDATEI()
+ {
+ nl_double val = m_in() * m_mult() + m_offset();
+ sound_update(netlist().time());
+ /* ignore spikes */
+ if (std::abs(val) < 32767.0)
+ m_cur = val;
+ else if (val > 0.0)
+ m_cur = 32767.0;
+ else
+ m_cur = -32767.0;
+
+ }
+
+public:
+ ATTR_HOT void buffer_reset(const netlist::netlist_time &upto)
+ {
+ m_last_pos = 0;
+ m_last_buffer = upto;
+ m_cur = 0.0;
+ }
+
+ netlist::param_int_t m_channel;
+ netlist::param_double_t m_mult;
+ netlist::param_double_t m_offset;
+ stream_sample_t *m_buffer;
+ netlist::netlist_time m_sample;
+
+private:
+ netlist::analog_input_t m_in;
+ double m_cur;
+ int m_last_pos;
+ netlist::state_var<netlist::netlist_time> m_last_buffer;
+};
+
+// ----------------------------------------------------------------------------------------
+// sound_in
+// ----------------------------------------------------------------------------------------
+
+class NETLIB_NAME(sound_in) : public netlist::device_t
+{
+public:
+ NETLIB_NAME(sound_in)(netlist::netlist_t &anetlist, const pstring &name)
+ : netlist::device_t(anetlist, name)
+ , m_feedback(*this, "FB") // clock part
+ , m_Q(*this, "Q")
+ {
+ connect(m_feedback, m_Q);
+ m_inc = netlist::netlist_time::from_nsec(1);
+
+
+ for (int i = 0; i < MAX_INPUT_CHANNELS; i++)
+ {
+ m_param_name[i] = std::make_unique<netlist::param_str_t>(*this, plib::pfmt("CHAN{1}")(i), "");
+ m_param_mult[i] = std::make_unique<netlist::param_double_t>(*this, plib::pfmt("MULT{1}")(i), 1.0);
+ m_param_offset[i] = std::make_unique<netlist::param_double_t>(*this, plib::pfmt("OFFSET{1}")(i), 0.0);
+ }
+ m_num_channel = 0;
+ }
+
+ static const int MAX_INPUT_CHANNELS = 10;
+
+ ATTR_COLD void reset() override
+ {
+ m_pos = 0;
+ for (auto & elem : m_buffer)
+ elem = nullptr;
+ }
+
+ ATTR_COLD int resolve()
+ {
+ m_pos = 0;
+ for (int i = 0; i < MAX_INPUT_CHANNELS; i++)
+ {
+ if ((*m_param_name[i])() != pstring(""))
+ {
+ if (i != m_num_channel)
+ netlist().log().fatal("sound input numbering has to be sequential!");
+ m_num_channel++;
+ m_param[i] = dynamic_cast<netlist::param_double_t *>(setup().find_param((*m_param_name[i])(), true));
+ }
+ }
+ return m_num_channel;
+ }
+
+ NETLIB_UPDATEI()
+ {
+ for (int i=0; i<m_num_channel; i++)
+ {
+ if (m_buffer[i] == nullptr)
+ break; // stop, called outside of stream_update
+ const nl_double v = m_buffer[i][m_pos];
+ m_param[i]->setTo(v * (*m_param_mult[i])() + (*m_param_offset[i])());
+ }
+ m_pos++;
+ m_Q.push(!m_Q.net().new_Q(), m_inc );
+ }
+
+public:
+ ATTR_HOT void buffer_reset()
+ {
+ m_pos = 0;
+ }
+
+ std::unique_ptr<netlist::param_str_t> m_param_name[MAX_INPUT_CHANNELS];
+ netlist::param_double_t *m_param[MAX_INPUT_CHANNELS];
+ stream_sample_t *m_buffer[MAX_INPUT_CHANNELS];
+ std::unique_ptr<netlist::param_double_t> m_param_mult[MAX_INPUT_CHANNELS];
+ std::unique_ptr<netlist::param_double_t> m_param_offset[MAX_INPUT_CHANNELS];
+ netlist::netlist_time m_inc;
+
+private:
+ netlist::logic_input_t m_feedback;
+ netlist::logic_output_t m_Q;
+
+ int m_pos;
+ int m_num_channel;
+};
+
+// ----------------------------------------------------------------------------------------
+// Extensions to interface netlist with MAME code ....
+// ----------------------------------------------------------------------------------------
+
+class netlist_source_memregion_t : public netlist::source_t
+{
+public:
+ netlist_source_memregion_t(netlist::setup_t &setup, pstring name)
+ : netlist::source_t(setup), m_name(name)
+ {
+ }
+
+ virtual std::unique_ptr<plib::pistream> stream(const pstring &name) override;
+private:
+ pstring m_name;
+};
+
+class netlist_data_memregions_t : public netlist::source_t
+{
+public:
+ netlist_data_memregions_t(netlist::setup_t &setup);
+
+ virtual std::unique_ptr<plib::pistream> stream(const pstring &name) override;
+};
+
+
+netlist::setup_t &netlist_mame_device_t::setup()
+{
+ return m_netlist->setup();
+}
+
+void netlist_mame_device_t::register_memregion_source(netlist::setup_t &setup, const char *name)
+{
+ setup.register_source(plib::make_unique_base<netlist::source_t, netlist_source_memregion_t>(setup, pstring(name, pstring::UTF8)));
+}
+
+running_machine &netlist_mame_t::machine()
+{
+ return m_parent.machine();
+}
+
+void netlist_mame_analog_input_t::write(const double val)
+{
+ if (is_sound_device())
+ {
+ update_to_current_time();
+ m_param->setTo(val * m_mult + m_offset);
+ }
+ else
+ {
+ // FIXME: use device timer ....
+ m_param->setTo(val * m_mult + m_offset);
+ }
+}
+
+
+
+void netlist_mame_int_input_t::write(const uint32_t val)
+{
+ const uint32_t v = (val >> m_shift) & m_mask;
+ if (v != (*m_param)())
+ synchronize(0, v);
+}
+
+void netlist_mame_logic_input_t::write(const uint32_t val)
+{
+ const uint32_t v = (val >> m_shift) & 1;
+ if (v != (*m_param)())
+ synchronize(0, v);
+}
+
+void netlist_mame_int_input_t::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ if (is_sound_device())
+ update_to_current_time();
+ m_param->setTo(param);
+}
+
+void netlist_mame_logic_input_t::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ if (is_sound_device())
+ update_to_current_time();
+ m_param->setTo(param);
+}
+
+void netlist_ram_pointer_t::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ m_data = (*m_param)();
+}
+
+
+void netlist_mame_cpu_device_t::state_string_export(const device_state_entry &entry, std::string &str) const
+{
+ if (entry.index() >= 0)
+ {
+ if (entry.index() & 1)
+ str = string_format("%10.6f", *((double *)entry.dataptr()));
+ else
+ str = string_format("%d", *((netlist_sig_t *)entry.dataptr()));
+ }
+}
+
+
+// ----------------------------------------------------------------------------------------
// netlist_mame_analog_input_t
// ----------------------------------------------------------------------------------------
@@ -68,11 +452,11 @@ void netlist_mame_analog_input_t::static_set_name(device_t &device, const char *
void netlist_mame_analog_input_t::device_start()
{
LOG_DEV_CALLS(("start %s\n", tag()));
- netlist::param_t *p = this->nl_owner().setup().find_param(m_param_name);
+ netlist::param_t *p = this->nl_owner().setup().find_param(pstring(m_param_name, pstring::UTF8));
m_param = dynamic_cast<netlist::param_double_t *>(p);
if (m_param == nullptr)
{
- fatalerror("device %s wrong parameter type for %s\n", basetag(), m_param_name.c_str());
+ fatalerror("device %s wrong parameter type for %s\n", basetag(), m_param_name);
}
if (m_mult != 1.0 || m_offset != 0.0)
{
@@ -103,13 +487,14 @@ void netlist_mame_analog_output_t::static_set_params(device_t &device, const cha
void netlist_mame_analog_output_t::custom_netlist_additions(netlist::setup_t &setup)
{
- pstring dname = "OUT_" + m_in;
+ const pstring pin(m_in, pstring::UTF8);
+ pstring dname = "OUT_" + pin;
m_delegate.bind_relative_to(owner()->machine().root_device());
plib::owned_ptr<netlist::device_t> dev = plib::owned_ptr<netlist::device_t>::Create<NETLIB_NAME(analog_callback)>(setup.netlist(), setup.build_fqn(dname));
static_cast<NETLIB_NAME(analog_callback) *>(dev.get())->register_callback(m_delegate);
setup.netlist().register_dev(std::move(dev));
- setup.register_link(dname + ".IN", m_in);
+ setup.register_link(dname + ".IN", pin);
}
void netlist_mame_analog_output_t::device_start()
@@ -138,13 +523,14 @@ void netlist_mame_logic_output_t::static_set_params(device_t &device, const char
void netlist_mame_logic_output_t::custom_netlist_additions(netlist::setup_t &setup)
{
- pstring dname = "OUT_" + m_in;
+ pstring pin(m_in, pstring::UTF8);
+ pstring dname = "OUT_" + pin;
m_delegate.bind_relative_to(owner()->machine().root_device());
plib::owned_ptr<netlist::device_t> dev = plib::owned_ptr<netlist::device_t>::Create<NETLIB_NAME(logic_callback)>(setup.netlist(), setup.build_fqn(dname));
static_cast<NETLIB_NAME(logic_callback) *>(dev.get())->register_callback(m_delegate);
setup.netlist().register_dev(std::move(dev));
- setup.register_link(dname + ".IN", m_in);
+ setup.register_link(dname + ".IN", pin);
}
void netlist_mame_logic_output_t::device_start()
@@ -179,11 +565,11 @@ void netlist_mame_int_input_t::static_set_params(device_t &device, const char *p
void netlist_mame_int_input_t::device_start()
{
LOG_DEV_CALLS(("start %s\n", tag()));
- netlist::param_t *p = downcast<netlist_mame_device_t *>(this->owner())->setup().find_param(m_param_name);
+ netlist::param_t *p = downcast<netlist_mame_device_t *>(this->owner())->setup().find_param(pstring(m_param_name, pstring::UTF8));
m_param = dynamic_cast<netlist::param_int_t *>(p);
if (m_param == nullptr)
{
- fatalerror("device %s wrong parameter type for %s\n", basetag(), m_param_name.c_str());
+ fatalerror("device %s wrong parameter type for %s\n", basetag(), m_param_name);
}
}
@@ -211,49 +597,14 @@ void netlist_mame_logic_input_t::static_set_params(device_t &device, const char
void netlist_mame_logic_input_t::device_start()
{
LOG_DEV_CALLS(("start %s\n", tag()));
- netlist::param_t *p = downcast<netlist_mame_device_t *>(this->owner())->setup().find_param(m_param_name);
+ netlist::param_t *p = downcast<netlist_mame_device_t *>(this->owner())->setup().find_param(pstring(m_param_name, pstring::UTF8));
m_param = dynamic_cast<netlist::param_logic_t *>(p);
if (m_param == nullptr)
{
- fatalerror("device %s wrong parameter type for %s\n", basetag(), m_param_name.c_str());
+ fatalerror("device %s wrong parameter type for %s\n", basetag(), m_param_name);
}
}
-// ----------------------------------------------------------------------------------------
-// netlist_mame_rom_t
-// ----------------------------------------------------------------------------------------
-
-netlist_mame_rom_t::netlist_mame_rom_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, NETLIST_ROM_REGION, "Netlist ROM Region", tag, owner, clock, "netlist_rom_region", __FILE__)
- , netlist_mame_sub_interface(*owner)
- , m_name("")
- , m_region_tag(nullptr)
- , m_offset(0)
- , m_size(0)
-{
-}
-
-void netlist_mame_rom_t::static_set_params(device_t &device, const char *name, const char* region_tag, std::size_t offset, std::size_t size)
-{
- netlist_mame_rom_t &r = downcast<netlist_mame_rom_t&>(device);
- LOG_DEV_CALLS(("static_set_params %s\n", device.tag()));
- r.m_name = name;
- r.m_region_tag = region_tag;
- r.m_offset = offset;
- r.m_size = size;
-}
-
-void netlist_mame_rom_t::custom_netlist_additions(netlist::setup_t &setup)
-{
- if (memregion(m_region_tag) == nullptr)
- fatalerror("device %s region %s not found\n", basetag(), m_region_tag);
- setup.register_source(plib::make_unique_base<netlist::source_t, netlist_data_memregion_t>(setup,
- m_name, memregion(m_region_tag)->base() + m_offset, m_size));
-}
-
-void netlist_mame_rom_t::device_start()
-{
-}
// ----------------------------------------------------------------------------------------
// netlist_ram_pointer_t
@@ -278,11 +629,11 @@ void netlist_ram_pointer_t::static_set_params(device_t &device, const char *para
void netlist_ram_pointer_t::device_start()
{
LOG_DEV_CALLS(("start %s\n", tag()));
- netlist::param_t *p = downcast<netlist_mame_device_t *>(this->owner())->setup().find_param(m_param_name);
+ netlist::param_t *p = downcast<netlist_mame_device_t *>(this->owner())->setup().find_param(pstring(m_param_name, pstring::UTF8));
m_param = dynamic_cast<netlist::param_ptr_t *>(p);
if (m_param == nullptr)
{
- fatalerror("device %s wrong parameter type for %s\n", basetag(), m_param_name.c_str());
+ fatalerror("device %s wrong parameter type for %s\n", basetag(), m_param_name);
}
m_data = (*m_param)();
@@ -318,7 +669,7 @@ void netlist_mame_stream_input_t::custom_netlist_additions(netlist::setup_t &set
setup.register_dev("NETDEV_SOUND_IN", "STREAM_INPUT");
pstring sparam = plib::pfmt("STREAM_INPUT.CHAN{1}")(m_channel);
- setup.register_param(sparam, m_param_name);
+ setup.register_param(sparam, pstring(m_param_name, pstring::UTF8));
sparam = plib::pfmt("STREAM_INPUT.MULT{1}")(m_channel);
setup.register_param(sparam, m_mult);
sparam = plib::pfmt("STREAM_INPUT.OFFSET{1}")(m_channel);
@@ -360,7 +711,7 @@ void netlist_mame_stream_output_t::custom_netlist_additions(netlist::setup_t &se
setup.register_param(sname + ".CHAN" , m_channel);
setup.register_param(sname + ".MULT", m_mult);
setup.register_param(sname + ".OFFSET", m_offset);
- setup.register_link(sname + ".IN", m_out_name);
+ setup.register_link(sname + ".IN", pstring(m_out_name, pstring::UTF8));
}
@@ -399,10 +750,6 @@ void netlist_mame_t::vlog(const plib::plog_level &l, const pstring &ls) const
// netlist_mame_device_t
// ----------------------------------------------------------------------------------------
-static ADDRESS_MAP_START(program_dummy, AS_PROGRAM, 8, netlist_mame_device_t)
- AM_RANGE(0x000, 0x3ff) AM_ROM
-ADDRESS_MAP_END
-
netlist_mame_device_t::netlist_mame_device_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, NETLIST_CORE, "Netlist core device", tag, owner, clock, "netlist_core", __FILE__),
m_icount(0),
@@ -421,6 +768,11 @@ netlist_mame_device_t::netlist_mame_device_t(const machine_config &mconfig, devi
{
}
+netlist_mame_device_t::~netlist_mame_device_t()
+{
+ pstring::resetmem();
+}
+
void netlist_mame_device_t::static_set_constructor(device_t &device, void (*setup_func)(netlist::setup_t &))
{
LOG_DEV_CALLS(("static_set_constructor\n"));
@@ -456,6 +808,9 @@ void netlist_mame_device_t::device_start()
}
}
+ /* add default data provider for roms */
+ setup().register_source(plib::make_unique_base<netlist::source_t, netlist_data_memregions_t>(setup()));
+
m_setup_func(setup());
/* let sub-devices tweak the netlist */
@@ -598,7 +953,7 @@ netlist_mame_cpu_device_t::netlist_mame_cpu_device_t(const machine_config &mconf
device_state_interface(mconfig, *this),
device_disasm_interface(mconfig, *this),
device_memory_interface(mconfig, *this),
- m_program_config("program", ENDIANNESS_LITTLE, 8, 12, 0, ADDRESS_MAP_NAME(program_dummy))
+ m_program_config("program", ENDIANNESS_LITTLE, 8, 12) // Interface is needed to keep debugger happy
{
}
@@ -619,11 +974,11 @@ void netlist_mame_cpu_device_t::device_start()
netlist::detail::net_t *n = netlist().m_nets[i].get();
if (n->is_logic())
{
- state_add(i*2, n->name().c_str(), downcast<netlist::logic_net_t *>(n)->Q_state_ptr());
+ state_add(i*2, n->name().c_str(), *downcast<netlist::logic_net_t *>(n)->Q_state_ptr());
}
else
{
- state_add(i*2+1, n->name().c_str(), downcast<netlist::analog_net_t *>(n)->Q_Analog_state_ptr()).formatstr("%20s");
+ state_add(i*2+1, n->name().c_str(), *downcast<netlist::analog_net_t *>(n)->Q_Analog_state_ptr()).formatstr("%20s");
}
}
@@ -791,11 +1146,24 @@ std::unique_ptr<plib::pistream> netlist_source_memregion_t::stream(const pstring
return plib::make_unique_base<plib::pistream, plib::pimemstream>(mem->base(), mem->bytes());
}
-std::unique_ptr<plib::pistream> netlist_data_memregion_t::stream(const pstring &name)
+netlist_data_memregions_t::netlist_data_memregions_t(netlist::setup_t &setup)
+: netlist::source_t(setup, netlist::source_t::DATA)
+{
+}
+
+std::unique_ptr<plib::pistream> netlist_data_memregions_t::stream(const pstring &name)
{
- if (name == m_name)
- return plib::make_unique_base<plib::pistream, plib::pimemstream>(m_ptr, m_size);
+ memory_region *mem = downcast<netlist_mame_t &>(setup().netlist()).parent().memregion(name.c_str());
+ //memory_region *mem = downcast<netlist_mame_t &>(setup().netlist()).machine().root_device().memregion(name.c_str());
+ if (mem != nullptr)
+ {
+ return plib::make_unique_base<plib::pistream, plib::pimemstream>(mem->base(), mem->bytes());
+ }
else
+ {
+ // This should be the last data provider being called - last resort
+ fatalerror("data named %s not found in device rom regions\n", name.c_str());
return std::unique_ptr<plib::pistream>(nullptr);
+ }
}
diff --git a/src/devices/machine/netlist.h b/src/devices/machine/netlist.h
index c3c58509089..7aab62b4de7 100644
--- a/src/devices/machine/netlist.h
+++ b/src/devices/machine/netlist.h
@@ -13,8 +13,17 @@
#include "emu.h"
-#include "netlist/nl_base.h"
-#include "netlist/nl_setup.h"
+#include "netlist/nl_time.h"
+
+class netlist_mame_t;
+
+namespace netlist {
+ class setup_t;
+ class param_double_t;
+ class param_int_t;
+ class param_logic_t;
+ class param_ptr_t;
+}
// MAME specific configuration
@@ -49,10 +58,6 @@
MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_INT_INPUT, 0) \
netlist_mame_int_input_t::static_set_params(*device, _name, _mask, _shift);
-#define MCFG_NETLIST_ROM_REGION(_basetag, _tag, _region, _name, _offset, _size) \
- MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_ROM_REGION, 0) \
- netlist_mame_rom_t::static_set_params(*device, _name, ":" _region, _offset, _size);
-
#define MCFG_NETLIST_RAM_POINTER(_basetag, _tag, _name) \
MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_RAM_POINTER, 0) \
netlist_ram_pointer_t::static_set_params(*device, _name ".m_RAM");
@@ -76,7 +81,7 @@
#define MEMREGION_SOURCE(_name) \
- setup.register_source(plib::make_unique_base<netlist::source_t, netlist_source_memregion_t>(setup, _name));
+ netlist_mame_device_t::register_memregion_source(setup, _name);
#define NETDEV_ANALOG_CALLBACK_MEMBER(_name) \
void _name(const double data, const attotime &time)
@@ -85,65 +90,6 @@
void _name(const int data, const attotime &time)
-// ----------------------------------------------------------------------------------------
-// Extensions to interface netlist with MAME code ....
-// ----------------------------------------------------------------------------------------
-
-class netlist_source_memregion_t : public netlist::source_t
-{
-public:
- netlist_source_memregion_t(netlist::setup_t &setup, pstring name)
- : netlist::source_t(setup), m_name(name)
- {
- }
-
- virtual std::unique_ptr<plib::pistream> stream(const pstring &name) override;
-private:
- pstring m_name;
-};
-
-class netlist_data_memregion_t : public netlist::source_t
-{
-public:
- netlist_data_memregion_t(netlist::setup_t &setup,
- pstring name, uint8_t *ptr, std::size_t size)
- : netlist::source_t(setup, netlist::source_t::DATA)
- , m_name(name)
- , m_ptr(ptr)
- , m_size(size)
- {
- }
-
- virtual std::unique_ptr<plib::pistream> stream(const pstring &name) override;
-private:
- pstring m_name;
- uint8_t *m_ptr;
- std::size_t m_size;
-};
-
-class netlist_mame_device_t;
-
-class netlist_mame_t : public netlist::netlist_t
-{
-public:
-
- netlist_mame_t(netlist_mame_device_t &parent, const pstring &aname)
- : netlist::netlist_t(aname),
- m_parent(parent)
- {}
- virtual ~netlist_mame_t() { };
-
- inline running_machine &machine();
-
- netlist_mame_device_t &parent() { return m_parent; }
-
-protected:
-
- void vlog(const plib::plog_level &l, const pstring &ls) const override;
-
-private:
- netlist_mame_device_t &m_parent;
-};
// ----------------------------------------------------------------------------------------
// netlist_mame_device_t
@@ -156,17 +102,19 @@ public:
// construction/destruction
netlist_mame_device_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
netlist_mame_device_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *file);
- virtual ~netlist_mame_device_t() { pstring::resetmem(); }
+ virtual ~netlist_mame_device_t();
static void static_set_constructor(device_t &device, void (*setup_func)(netlist::setup_t &));
- ATTR_HOT inline netlist::setup_t &setup() { return m_netlist->setup(); }
+ ATTR_HOT inline netlist::setup_t &setup();
ATTR_HOT inline netlist_mame_t &netlist() { return *m_netlist; }
ATTR_HOT inline const netlist::netlist_time last_time_update() { return m_old; }
ATTR_HOT void update_time_x();
ATTR_HOT void check_mame_abort_slice();
+ static void register_memregion_source(netlist::setup_t &setup, const char *name);
+
int m_icount;
protected:
@@ -199,11 +147,6 @@ private:
void (*m_setup_func)(netlist::setup_t &);
};
-inline running_machine &netlist_mame_t::machine()
-{
- return m_parent.machine();
-}
-
// ----------------------------------------------------------------------------------------
// netlist_mame_cpu_device_t
// ----------------------------------------------------------------------------------------
@@ -261,16 +204,7 @@ protected:
// device_state_interface overrides
- virtual void state_string_export(const device_state_entry &entry, std::string &str) const override
- {
- if (entry.index() >= 0)
- {
- if (entry.index() & 1)
- str = string_format("%10.6f", *((double *)entry.dataptr()));
- else
- str = string_format("%d", *((netlist_sig_t *)entry.dataptr()));
- }
- }
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
private:
@@ -380,19 +314,7 @@ public:
static void static_set_name(device_t &device, const char *param_name);
- inline void write(const double val)
- {
- if (is_sound_device())
- {
- update_to_current_time();
- m_param->setTo(val * m_mult + m_offset);
- }
- else
- {
- // FIXME: use device timer ....
- m_param->setTo(val * m_mult + m_offset);
- }
- }
+ void write(const double val);
inline DECLARE_INPUT_CHANGED_MEMBER(input_changed)
{
@@ -414,7 +336,7 @@ protected:
private:
netlist::param_double_t *m_param;
bool m_auto_port;
- pstring m_param_name;
+ const char *m_param_name;
};
// ----------------------------------------------------------------------------------------
@@ -440,7 +362,7 @@ protected:
virtual void custom_netlist_additions(netlist::setup_t &setup) override;
private:
- pstring m_in;
+ const char *m_in;
netlist_analog_output_delegate m_delegate;
};
@@ -467,7 +389,7 @@ protected:
virtual void custom_netlist_additions(netlist::setup_t &setup) override;
private:
- pstring m_in;
+ const char *m_in;
netlist_logic_output_delegate m_delegate;
};
@@ -486,12 +408,7 @@ public:
static void static_set_params(device_t &device, const char *param_name, const uint32_t mask, const uint32_t shift);
- inline void write(const uint32_t val)
- {
- const uint32_t v = (val >> m_shift) & m_mask;
- if (v != (*m_param)())
- synchronize(0, v);
- }
+ void write(const uint32_t val);
inline DECLARE_INPUT_CHANGED_MEMBER(input_changed) { write(newval); }
DECLARE_WRITE_LINE_MEMBER(write_line) { write(state); }
@@ -503,18 +420,13 @@ public:
protected:
// device-level overrides
virtual void device_start() override;
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override
- {
- if (is_sound_device())
- update_to_current_time();
- m_param->setTo(param);
- }
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
private:
netlist::param_int_t *m_param;
uint32_t m_mask;
uint32_t m_shift;
- pstring m_param_name;
+ const char *m_param_name;
};
@@ -533,12 +445,7 @@ public:
static void static_set_params(device_t &device, const char *param_name, const uint32_t shift);
- inline void write(const uint32_t val)
- {
- const uint32_t v = (val >> m_shift) & 1;
- if (v != (*m_param)())
- synchronize(0, v);
- }
+ void write(const uint32_t val);
inline DECLARE_INPUT_CHANGED_MEMBER(input_changed) { write(newval); }
DECLARE_WRITE_LINE_MEMBER(write_line) { write(state); }
@@ -550,44 +457,12 @@ public:
protected:
// device-level overrides
virtual void device_start() override;
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override
- {
- if (is_sound_device())
- update_to_current_time();
- m_param->setTo(param);
- }
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
private:
netlist::param_logic_t *m_param;
uint32_t m_shift;
- pstring m_param_name;
-};
-
-// ----------------------------------------------------------------------------------------
-// netlist_mame_rom_t
-// ----------------------------------------------------------------------------------------
-
-class netlist_mame_rom_t : public device_t,
- public netlist_mame_sub_interface
-{
-public:
-
- // construction/destruction
- netlist_mame_rom_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- virtual ~netlist_mame_rom_t() { }
-
- static void static_set_params(device_t &device, const char *name, const char* region_tag, std::size_t offset, std::size_t size);
-
-protected:
- // device-level overrides
- virtual void device_start() override;
- virtual void custom_netlist_additions(netlist::setup_t &setup) override;
-
-private:
- pstring m_name;
- const char* m_region_tag;
- std::size_t m_offset;
- std::size_t m_size;
+ const char *m_param_name;
};
// ----------------------------------------------------------------------------------------
@@ -610,14 +485,11 @@ public:
protected:
// device-level overrides
virtual void device_start() override;
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override
- {
- m_data = (*m_param)();
- }
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
private:
netlist::param_ptr_t *m_param;
- pstring m_param_name;
+ const char *m_param_name;
uint8_t* m_data;
};
@@ -642,7 +514,7 @@ protected:
virtual void custom_netlist_additions(netlist::setup_t &setup) override;
private:
uint32_t m_channel;
- pstring m_param_name;
+ const char *m_param_name;
};
// ----------------------------------------------------------------------------------------
@@ -666,261 +538,9 @@ protected:
virtual void custom_netlist_additions(netlist::setup_t &setup) override;
private:
uint32_t m_channel;
- pstring m_out_name;
-};
-
-// ----------------------------------------------------------------------------------------
-// analog_callback
-// ----------------------------------------------------------------------------------------
-
-class NETLIB_NAME(analog_callback) : public netlist::device_t
-{
-public:
- NETLIB_NAME(analog_callback)(netlist::netlist_t &anetlist, const pstring &name)
- : device_t(anetlist, name)
- , m_in(*this, "IN")
- , m_cpu_device(nullptr)
- , m_last(*this, "m_last", 0)
- {
- m_cpu_device = downcast<netlist_mame_cpu_device_t *>(&downcast<netlist_mame_t &>(netlist()).parent());
- }
-
- ATTR_COLD void reset() override
- {
- m_last = 0.0;
- }
-
- ATTR_COLD void register_callback(netlist_analog_output_delegate callback)
- {
- m_callback = callback;
- }
-
- NETLIB_UPDATEI()
- {
- nl_double cur = m_in();
-
- // FIXME: make this a parameter
- // avoid calls due to noise
- if (std::fabs(cur - m_last) > 1e-6)
- {
- m_cpu_device->update_time_x();
- m_callback(cur, m_cpu_device->local_time());
- m_cpu_device->check_mame_abort_slice();
- m_last = cur;
- }
- }
-
-private:
- netlist::analog_input_t m_in;
- netlist_analog_output_delegate m_callback;
- netlist_mame_cpu_device_t *m_cpu_device;
- netlist::state_var<nl_double> m_last;
-};
-
-// ----------------------------------------------------------------------------------------
-// logic_callback
-// ----------------------------------------------------------------------------------------
-
-class NETLIB_NAME(logic_callback) : public netlist::device_t
-{
-public:
- NETLIB_NAME(logic_callback)(netlist::netlist_t &anetlist, const pstring &name)
- : device_t(anetlist, name)
- , m_in(*this, "IN")
- , m_cpu_device(nullptr)
- , m_last(*this, "m_last", 0)
- {
- m_cpu_device = downcast<netlist_mame_cpu_device_t *>(&downcast<netlist_mame_t &>(netlist()).parent());
- }
-
- ATTR_COLD void reset() override
- {
- m_last = 0;
- }
-
- ATTR_COLD void register_callback(netlist_logic_output_delegate callback)
- {
- m_callback = callback;
- }
-
- NETLIB_UPDATEI()
- {
- netlist_sig_t cur = m_in();
-
- // FIXME: make this a parameter
- // avoid calls due to noise
- if (cur != m_last)
- {
- m_cpu_device->update_time_x();
- m_callback(cur, m_cpu_device->local_time());
- m_cpu_device->check_mame_abort_slice();
- m_last = cur;
- }
- }
-
-private:
- netlist::logic_input_t m_in;
- netlist_logic_output_delegate m_callback;
- netlist_mame_cpu_device_t *m_cpu_device;
- netlist::state_var<netlist_sig_t> m_last;
+ const char *m_out_name;
};
-// ----------------------------------------------------------------------------------------
-// sound_out
-// ----------------------------------------------------------------------------------------
-
-class NETLIB_NAME(sound_out) : public netlist::device_t
-{
-public:
- NETLIB_NAME(sound_out)(netlist::netlist_t &anetlist, const pstring &name)
- : netlist::device_t(anetlist, name)
- , m_channel(*this, "CHAN", 0)
- , m_mult(*this, "MULT", 1000.0)
- , m_offset(*this, "OFFSET", 0.0)
- , m_sample(netlist::netlist_time::from_hz(1)) //sufficiently big enough
- , m_in(*this, "IN")
- , m_last_buffer(*this, "m_last_buffer", netlist::netlist_time::zero())
- {
- }
-
- static const int BUFSIZE = 2048;
-
- ATTR_COLD void reset() override
- {
- m_cur = 0.0;
- m_last_pos = 0;
- m_last_buffer = netlist::netlist_time::zero();
- }
-
- ATTR_HOT void sound_update(const netlist::netlist_time &upto)
- {
- int pos = (upto - m_last_buffer) / m_sample;
- if (pos >= BUFSIZE)
- netlist().log().fatal("sound {1}: exceeded BUFSIZE\n", name().c_str());
- while (m_last_pos < pos )
- {
- m_buffer[m_last_pos++] = (stream_sample_t) m_cur;
- }
- }
-
- NETLIB_UPDATEI()
- {
- nl_double val = m_in() * m_mult() + m_offset();
- sound_update(netlist().time());
- /* ignore spikes */
- if (std::abs(val) < 32767.0)
- m_cur = val;
- else if (val > 0.0)
- m_cur = 32767.0;
- else
- m_cur = -32767.0;
-
- }
-
-public:
- ATTR_HOT void buffer_reset(const netlist::netlist_time &upto)
- {
- m_last_pos = 0;
- m_last_buffer = upto;
- m_cur = 0.0;
- }
-
- netlist::param_int_t m_channel;
- netlist::param_double_t m_mult;
- netlist::param_double_t m_offset;
- stream_sample_t *m_buffer;
- netlist::netlist_time m_sample;
-
-private:
- netlist::analog_input_t m_in;
- double m_cur;
- int m_last_pos;
- netlist::state_var<netlist::netlist_time> m_last_buffer;
-};
-
-// ----------------------------------------------------------------------------------------
-// sound_in
-// ----------------------------------------------------------------------------------------
-
-class NETLIB_NAME(sound_in) : public netlist::device_t
-{
-public:
- NETLIB_NAME(sound_in)(netlist::netlist_t &anetlist, const pstring &name)
- : netlist::device_t(anetlist, name)
- , m_feedback(*this, "FB") // clock part
- , m_Q(*this, "Q")
- {
- connect(m_feedback, m_Q);
- m_inc = netlist::netlist_time::from_nsec(1);
-
-
- for (int i = 0; i < MAX_INPUT_CHANNELS; i++)
- {
- m_param_name[i] = std::make_unique<netlist::param_str_t>(*this, plib::pfmt("CHAN{1}")(i), "");
- m_param_mult[i] = std::make_unique<netlist::param_double_t>(*this, plib::pfmt("MULT{1}")(i), 1.0);
- m_param_offset[i] = std::make_unique<netlist::param_double_t>(*this, plib::pfmt("OFFSET{1}")(i), 0.0);
- }
- m_num_channel = 0;
- }
-
- static const int MAX_INPUT_CHANNELS = 10;
-
- ATTR_COLD void reset() override
- {
- m_pos = 0;
- for (auto & elem : m_buffer)
- elem = nullptr;
- }
-
- ATTR_COLD int resolve()
- {
- m_pos = 0;
- for (int i = 0; i < MAX_INPUT_CHANNELS; i++)
- {
- if ((*m_param_name[i])() != pstring(""))
- {
- if (i != m_num_channel)
- netlist().log().fatal("sound input numbering has to be sequential!");
- m_num_channel++;
- m_param[i] = dynamic_cast<netlist::param_double_t *>(setup().find_param((*m_param_name[i])(), true));
- }
- }
- return m_num_channel;
- }
-
- NETLIB_UPDATEI()
- {
- for (int i=0; i<m_num_channel; i++)
- {
- if (m_buffer[i] == nullptr)
- break; // stop, called outside of stream_update
- const nl_double v = m_buffer[i][m_pos];
- m_param[i]->setTo(v * (*m_param_mult[i])() + (*m_param_offset[i])());
- }
- m_pos++;
- m_Q.push(!m_Q.net().new_Q(), m_inc );
- }
-
-public:
- ATTR_HOT void buffer_reset()
- {
- m_pos = 0;
- }
-
- std::unique_ptr<netlist::param_str_t> m_param_name[MAX_INPUT_CHANNELS];
- netlist::param_double_t *m_param[MAX_INPUT_CHANNELS];
- stream_sample_t *m_buffer[MAX_INPUT_CHANNELS];
- std::unique_ptr<netlist::param_double_t> m_param_mult[MAX_INPUT_CHANNELS];
- std::unique_ptr<netlist::param_double_t> m_param_offset[MAX_INPUT_CHANNELS];
- netlist::netlist_time m_inc;
-
-private:
- netlist::logic_input_t m_feedback;
- netlist::logic_output_t m_Q;
-
- int m_pos;
- int m_num_channel;
-};
// device type definition
extern const device_type NETLIST_CORE;
@@ -929,7 +549,6 @@ extern const device_type NETLIST_SOUND;
extern const device_type NETLIST_ANALOG_INPUT;
extern const device_type NETLIST_LOGIC_INPUT;
extern const device_type NETLIST_INT_INPUT;
-extern const device_type NETLIST_ROM_REGION;
extern const device_type NETLIST_RAM_POINTER;
extern const device_type NETLIST_LOGIC_OUTPUT;
diff --git a/src/devices/machine/nscsi_cb.h b/src/devices/machine/nscsi_cb.h
index 4fab2021fe1..1699de18f4b 100644
--- a/src/devices/machine/nscsi_cb.h
+++ b/src/devices/machine/nscsi_cb.h
@@ -7,22 +7,22 @@
#include "machine/nscsi_bus.h"
#define MCFG_NSCSICB_RST_HANDLER(_line) \
- downcast<nscsi_callback_device *>(device)->set_rst_callback(DEVCB_##_line);
+ devcb = &downcast<nscsi_callback_device *>(device)->set_rst_callback(DEVCB_##_line);
#define MCFG_NSCSICB_ATN_HANDLER(_line) \
- downcast<nscsi_callback_device *>(device)->set_atn_callback(DEVCB_##_line);
+ devcb = &downcast<nscsi_callback_device *>(device)->set_atn_callback(DEVCB_##_line);
#define MCFG_NSCSICB_ACK_HANDLER(_line) \
- downcast<nscsi_callback_device *>(device)->set_ack_callback(DEVCB_##_line);
+ devcb = &downcast<nscsi_callback_device *>(device)->set_ack_callback(DEVCB_##_line);
#define MCFG_NSCSICB_REQ_HANDLER(_line) \
- downcast<nscsi_callback_device *>(device)->set_req_callback(DEVCB_##_line);
+ devcb = &downcast<nscsi_callback_device *>(device)->set_req_callback(DEVCB_##_line);
#define MCFG_NSCSICB_MSG_HANDLER(_line) \
- downcast<nscsi_callback_device *>(device)->set_msg_callback(DEVCB_##_line);
+ devcb = &downcast<nscsi_callback_device *>(device)->set_msg_callback(DEVCB_##_line);
#define MCFG_NSCSICB_IO_HANDLER(_line) \
- downcast<nscsi_callback_device *>(device)->set_io_callback(DEVCB_##_line);
+ devcb = &downcast<nscsi_callback_device *>(device)->set_io_callback(DEVCB_##_line);
#define MCFG_NSCSICB_CD_HANDLER(_line) \
downcast<nscsi_callback_device *>(device)->set_cd_callback(DEVCB_##_line);
@@ -38,15 +38,15 @@ class nscsi_callback_device : public nscsi_device
public:
nscsi_callback_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template<class _line> void set_rst_callback(_line line) { m_write_rst.set_callback(line); }
- template<class _line> void set_atn_callback(_line line) { m_write_atn.set_callback(line); }
- template<class _line> void set_ack_callback(_line line) { m_write_ack.set_callback(line); }
- template<class _line> void set_req_callback(_line line) { m_write_req.set_callback(line); }
- template<class _line> void set_msg_callback(_line line) { m_write_msg.set_callback(line); }
- template<class _line> void set_io_callback(_line line) { m_write_io.set_callback(line); }
- template<class _line> void set_cd_callback(_line line) { m_write_cd.set_callback(line); }
- template<class _line> void set_sel_callback(_line line) { m_write_sel.set_callback(line); }
- template<class _line> void set_bsy_callback(_line line) { m_write_bsy.set_callback(line); }
+ template<class _line> devcb_base &set_rst_callback(_line line) { return m_write_rst.set_callback(line); }
+ template<class _line> devcb_base &set_atn_callback(_line line) { return m_write_atn.set_callback(line); }
+ template<class _line> devcb_base &set_ack_callback(_line line) { return m_write_ack.set_callback(line); }
+ template<class _line> devcb_base &set_req_callback(_line line) { return m_write_req.set_callback(line); }
+ template<class _line> devcb_base &set_msg_callback(_line line) { return m_write_msg.set_callback(line); }
+ template<class _line> devcb_base &set_io_callback(_line line) { return m_write_io.set_callback(line); }
+ template<class _line> devcb_base &set_cd_callback(_line line) { return m_write_cd.set_callback(line); }
+ template<class _line> devcb_base &set_sel_callback(_line line) { return m_write_sel.set_callback(line); }
+ template<class _line> devcb_base &set_bsy_callback(_line line) { return m_write_bsy.set_callback(line); }
virtual void scsi_ctrl_changed() override;
diff --git a/src/devices/machine/phi.cpp b/src/devices/machine/phi.cpp
index f5b91929d9a..18166c068cc 100644
--- a/src/devices/machine/phi.cpp
+++ b/src/devices/machine/phi.cpp
@@ -2,28 +2,28 @@
// copyright-holders:F. Ulivi
/*********************************************************************
- phi.h
+ phi.h
- HP PHI (Processor-to-Hpib-Interface) (1AA6-6x04)
+ HP PHI (Processor-to-Hpib-Interface) (1AA6-6x04)
- PHI supports these features of HP-IB:
- * SH1
- * AH1
- * T1/TE1
- * L1/LE1
- * SR1
- * RL2
- * PP1
- * DC1
- * DT1
- * C1,C2,C3,C4,C5
- * HP non-standard IDENTIFY sequence
+ PHI supports these features of HP-IB:
+ * SH1
+ * AH1
+ * T1/TE1
+ * L1/LE1
+ * SR1
+ * RL2
+ * PP1
+ * DC1
+ * DT1
+ * C1,C2,C3,C4,C5
+ * HP non-standard IDENTIFY sequence
- Fun fact: PHI has no clock input, its FSMs are driven only by
- changes in input signals and by a few internal monostables
+ Fun fact: PHI has no clock input, its FSMs are driven only by
+ changes in input signals and by a few internal monostables
- Main reference for this ASIC:
- HP 12009-90001, sep 82, HP12009A HP-IB Interface Reference Manual
+ Main reference for this ASIC:
+ HP 12009-90001, sep 82, HP12009A HP-IB Interface Reference Manual
*********************************************************************/
@@ -33,6 +33,8 @@
// Debugging
#define VERBOSE 1
#define LOG(x) do { if (VERBOSE) logerror x; } while (0)
+#define VERBOSE_0 0
+#define LOG_0(x) do { if (VERBOSE_0) logerror x; } while (0)
// Macros to clear/set single bits
#define BIT_MASK(n) (1U << (n))
@@ -47,122 +49,122 @@ enum {
// Register addresses
enum {
- REG_R_INT_COND = 0, // R 0: Interrupting conditions
- REG_W_INT_COND = 0, // W 0: Interrupting conditions
- REG_R_INT_MASK = 1, // R 1: Interrupt mask
- REG_W_INT_MASK = 1, // W 1: Interrupt mask
- REG_R_INBOUND_FIFO = 2, // R 2: Inbound FIFO
+ REG_R_INT_COND = 0, // R 0: Interrupting conditions
+ REG_W_INT_COND = 0, // W 0: Interrupting conditions
+ REG_R_INT_MASK = 1, // R 1: Interrupt mask
+ REG_W_INT_MASK = 1, // W 1: Interrupt mask
+ REG_R_INBOUND_FIFO = 2, // R 2: Inbound FIFO
REG_W_OUTBOUND_FIFO = 2,// W 2: Outbound FIFO
- REG_R_STATUS = 3, // R 3: Status
- REG_W_STATUS = 3, // W 3: Status
- REG_R_CONTROL = 4, // R 4: Control
- REG_W_CONTROL = 4, // W 4: Control
- REG_R_ADDRESS = 5, // R 5: HPIB address
- REG_W_ADDRESS = 5, // W 5: HPIB address
- REG_R_1ST_ID = 6, // R 6: 1st ID byte
- REG_W_1ST_ID = 6, // W 6: 1st ID byte
- REG_R_2ND_ID = 7, // R 7: 2nd ID byte
- REG_W_2ND_ID = 7 // W 7: 2nd ID byte
+ REG_R_STATUS = 3, // R 3: Status
+ REG_W_STATUS = 3, // W 3: Status
+ REG_R_CONTROL = 4, // R 4: Control
+ REG_W_CONTROL = 4, // W 4: Control
+ REG_R_ADDRESS = 5, // R 5: HPIB address
+ REG_W_ADDRESS = 5, // W 5: HPIB address
+ REG_R_1ST_ID = 6, // R 6: 1st ID byte
+ REG_W_1ST_ID = 6, // W 6: 1st ID byte
+ REG_R_2ND_ID = 7, // R 7: 2nd ID byte
+ REG_W_2ND_ID = 7 // W 7: 2nd ID byte
};
// All valid bits in registers
-#define REG_ALL_MASK 0xc0ff
+#define REG_ALL_MASK 0xc0ff
// D0 & D1 bits
-#define REG_D0D1_MASK 0xc000 // Mask of D0/D1 bits
-#define REG_D0D1_SHIFT 14 // Position of D0/D1 bits
+#define REG_D0D1_MASK 0xc000 // Mask of D0/D1 bits
+#define REG_D0D1_SHIFT 14 // Position of D0/D1 bits
// D8-D15 bits
-#define REG_D08D15_MASK 0xff // Mask of D8:D15 bits
+#define REG_D08D15_MASK 0xff // Mask of D8:D15 bits
// Bits in INT_COND & INT_MASK
-#define REG_INT_DEV_CLEAR_BIT 0 // Device clear
-#define REG_INT_FIFO_IDLE_BIT 1 // FIFO idle
-#define REG_INT_FIFO_AV_BIT 2 // FIFO bytes available
-#define REG_INT_FIFO_ROOM_BIT 3 // FIFO room available
-#define REG_INT_SRQ_BIT 4 // Service request
-#define REG_INT_PP_RESPONSE_BIT 5 // PP response
-#define REG_INT_PROC_ABORT_BIT 6 // Processor handshake abort
-#define REG_INT_STATUS_CH_BIT 7 // Status change
-#define REG_INT_PARITY_ERR_BIT 14 // Parity error
-#define REG_INT_PENDING_BIT 15 // Interrupt pending
-#define REG_INT_CLEARABLE_MASK 0x40c1 // Mask of clearable bits
-#define REG_INT_STATE_MASK 0x803e // Mask of "state" bits
+#define REG_INT_DEV_CLEAR_BIT 0 // Device clear
+#define REG_INT_FIFO_IDLE_BIT 1 // FIFO idle
+#define REG_INT_FIFO_AV_BIT 2 // FIFO bytes available
+#define REG_INT_FIFO_ROOM_BIT 3 // FIFO room available
+#define REG_INT_SRQ_BIT 4 // Service request
+#define REG_INT_PP_RESPONSE_BIT 5 // PP response
+#define REG_INT_PROC_ABORT_BIT 6 // Processor handshake abort
+#define REG_INT_STATUS_CH_BIT 7 // Status change
+#define REG_INT_PARITY_ERR_BIT 14 // Parity error
+#define REG_INT_PENDING_BIT 15 // Interrupt pending
+#define REG_INT_CLEARABLE_MASK 0x40c1 // Mask of clearable bits
+#define REG_INT_STATE_MASK 0x803e // Mask of "state" bits
// Bits in inbound FIFO
-#define REG_IFIFO_NORMAL_MASK 0x0000 // Mask of D0/D1 bits for "normal" bytes
-#define REG_IFIFO_CNT_EXP_MASK 0x8000 // Mask for a byte that caused byte count to expire
-#define REG_IFIFO_LAST_MASK 0xc000 // Mask for last byte in a record
-#define REG_IFIFO_2_ADDR_MASK 0x4000 // Mask for secondary addresses
-#define REG_IFIFO_TALK_BIT 5 // Bit of "talk" flag
+#define REG_IFIFO_NORMAL_MASK 0x0000 // Mask of D0/D1 bits for "normal" bytes
+#define REG_IFIFO_CNT_EXP_MASK 0x8000 // Mask for a byte that caused byte count to expire
+#define REG_IFIFO_LAST_MASK 0xc000 // Mask for last byte in a record
+#define REG_IFIFO_2_ADDR_MASK 0x4000 // Mask for secondary addresses
+#define REG_IFIFO_TALK_BIT 5 // Bit of "talk" flag
// Bits in outbound FIFO
-#define REG_OFIFO_SPECIAL_BIT 14 // Bit to discriminate between normal bytes and the rest
-#define REG_OFIFO_END_BIT 15 // Bit of EOI
-#define REG_OFIFO_IFCMD_MASK 0x4000 // Mask of interface commands
-#define REG_OFIFO_UNCNT_MASK 0xc000 // Mask of uncounted transfer enable
-#define REG_OFIFO_XFER_EN_MASK 0x0000 // Mask of byte transfer enable
-#define REG_OFIFO_LF_INH_BIT 15 // Bit of LF detection inhibit
+#define REG_OFIFO_SPECIAL_BIT 14 // Bit to discriminate between normal bytes and the rest
+#define REG_OFIFO_END_BIT 15 // Bit of EOI
+#define REG_OFIFO_IFCMD_MASK 0x4000 // Mask of interface commands
+#define REG_OFIFO_UNCNT_MASK 0xc000 // Mask of uncounted transfer enable
+#define REG_OFIFO_XFER_EN_MASK 0x0000 // Mask of byte transfer enable
+#define REG_OFIFO_LF_INH_BIT 15 // Bit of LF detection inhibit
// Bits in status register
-#define REG_STATUS_DATA_FREEZE_BIT 0 // Outbound data freeze
-#define REG_STATUS_LISTEN_BIT 1 // Addressed to listen
-#define REG_STATUS_TALK_BIT 2 // Addressed to talk or identify
-#define REG_STATUS_SYS_CTRL_BIT 3 // System controller
-#define REG_STATUS_CONTROLLER_BIT 4 // Current controller
-#define REG_STATUS_REMOTE_BIT 5 // Remote state
-#define REG_STATUS_D0D1_BIT 6 // D0/D1 bit access
-#define REG_STATUS_STATE_MASK 0x3e // Mask of "state" bits
+#define REG_STATUS_DATA_FREEZE_BIT 0 // Outbound data freeze
+#define REG_STATUS_LISTEN_BIT 1 // Addressed to listen
+#define REG_STATUS_TALK_BIT 2 // Addressed to talk or identify
+#define REG_STATUS_SYS_CTRL_BIT 3 // System controller
+#define REG_STATUS_CONTROLLER_BIT 4 // Current controller
+#define REG_STATUS_REMOTE_BIT 5 // Remote state
+#define REG_STATUS_D0D1_BIT 6 // D0/D1 bit access
+#define REG_STATUS_STATE_MASK 0x3e // Mask of "state" bits
// Bits in control register
-#define REG_CTRL_INIT_OFIFO_BIT 0 // Initialize outbound FIFO
-#define REG_CTRL_DMA_FIFO_BIT 1 // DMA FIFO selection
-#define REG_CTRL_SERVICE_REQ_BIT 2 // Request service
-#define REG_CTRL_PP_RESPONSE_BIT 3 // Respond to PP
-#define REG_CTRL_IFC_BIT 4 // IFC value
-#define REG_CTRL_REN_BIT 5 // REN value
-#define REG_CTRL_PAR_FREEZE_BIT 6 // Parity freeze
-#define REG_CTRL_8BIT_PROC_BIT 7 // 8-bit processor
+#define REG_CTRL_INIT_OFIFO_BIT 0 // Initialize outbound FIFO
+#define REG_CTRL_DMA_FIFO_BIT 1 // DMA FIFO selection
+#define REG_CTRL_SERVICE_REQ_BIT 2 // Request service
+#define REG_CTRL_PP_RESPONSE_BIT 3 // Respond to PP
+#define REG_CTRL_IFC_BIT 4 // IFC value
+#define REG_CTRL_REN_BIT 5 // REN value
+#define REG_CTRL_PAR_FREEZE_BIT 6 // Parity freeze
+#define REG_CTRL_8BIT_PROC_BIT 7 // 8-bit processor
// Bits in address register
-#define REG_ADDR_HPIB_ADDR_BIT 0 // HPIB address
-#define REG_ADDR_LA_BIT 5 // Listen always
-#define REG_ADDR_TA_BIT 6 // Talk always
-#define REG_ADDR_ONLINE_BIT 7 // Online
+#define REG_ADDR_HPIB_ADDR_BIT 0 // HPIB address
+#define REG_ADDR_LA_BIT 5 // Listen always
+#define REG_ADDR_TA_BIT 6 // Talk always
+#define REG_ADDR_ONLINE_BIT 7 // Online
// Interface commands
-#define IFCMD_MASK 0x7f // Mask of interface commands
-#define IFCMD_DCL 0x14 // Device clear
-#define IFCMD_GET 0x08 // Group execute trigger
-#define IFCMD_GTL 0x01 // Go to local
-#define IFCMD_LLO 0x11 // Local lock-out
-#define IFCMD_AG_MASK 0x60 // Mask of bits identifying address group commands
-#define IFCMD_ADDR_MASK 0x1f // Mask of address in AG commands
-#define IFCMD_LAG_VALUE 0x20 // Value of LAG commands
-#define IFCMD_TAG_VALUE 0x40 // Value of TAG commands
-#define IFCMD_SCG_VALUE 0x60 // Value of SCG commands
-#define IFCMD_PPC 0x05 // Parallel poll configure
-#define IFCMD_PPX_MASK 0x70 // Mask of PPE/PPD commands
-#define IFCMD_PPE_VALUE 0x60 // Parallel poll enable
-#define IFCMD_PPE_S_BIT 3 // Position of "S" bit in PPE
-#define IFCMD_PPE_PPR_MASK 7 // Mask in PPE of PPR msg no.
-#define IFCMD_PPD_VALUE 0x70 // Parallel poll disable
-#define IFCMD_PPU 0x15 // Parallel poll unconfigure
-#define IFCMD_SDC 0x04 // Selected device clear
-#define IFCMD_SPD 0x19 // Serial poll disable
-#define IFCMD_SPE 0x18 // Serial poll enable
-#define IFCMD_TCT 0x09 // Take control
-#define IFCMD_UNL 0x3f // Unlisten
-#define IFCMD_UNT 0x5f // Untalk
+#define IFCMD_MASK 0x7f // Mask of interface commands
+#define IFCMD_DCL 0x14 // Device clear
+#define IFCMD_GET 0x08 // Group execute trigger
+#define IFCMD_GTL 0x01 // Go to local
+#define IFCMD_LLO 0x11 // Local lock-out
+#define IFCMD_AG_MASK 0x60 // Mask of bits identifying address group commands
+#define IFCMD_ADDR_MASK 0x1f // Mask of address in AG commands
+#define IFCMD_LAG_VALUE 0x20 // Value of LAG commands
+#define IFCMD_TAG_VALUE 0x40 // Value of TAG commands
+#define IFCMD_SCG_VALUE 0x60 // Value of SCG commands
+#define IFCMD_PPC 0x05 // Parallel poll configure
+#define IFCMD_PPX_MASK 0x70 // Mask of PPE/PPD commands
+#define IFCMD_PPE_VALUE 0x60 // Parallel poll enable
+#define IFCMD_PPE_S_BIT 3 // Position of "S" bit in PPE
+#define IFCMD_PPE_PPR_MASK 7 // Mask in PPE of PPR msg no.
+#define IFCMD_PPD_VALUE 0x70 // Parallel poll disable
+#define IFCMD_PPU 0x15 // Parallel poll unconfigure
+#define IFCMD_SDC 0x04 // Selected device clear
+#define IFCMD_SPD 0x19 // Serial poll disable
+#define IFCMD_SPE 0x18 // Serial poll enable
+#define IFCMD_TCT 0x09 // Take control
+#define IFCMD_UNL 0x3f // Unlisten
+#define IFCMD_UNT 0x5f // Untalk
// Delays
-#define DELAY_T1 2000 // T1: 2 us
-#define DELAY_T7 500 // T7: 0.5 us
-#define DELAY_T9 1500 // T9: 1.5 us
-#define DELAY_T10 1500 // T10: 1.5 us
+#define DELAY_T1 2000 // T1: 2 us
+#define DELAY_T7 500 // T7: 0.5 us
+#define DELAY_T9 1500 // T9: 1.5 us
+#define DELAY_T10 1500 // T10: 1.5 us
// Controller address
-#define CONTROLLER_ADDR 0x1e // PHI always has this address when it's a controller
+#define CONTROLLER_ADDR 0x1e // PHI always has this address when it's a controller
// Device type definition
const device_type PHI = &device_creator<phi_device>;
@@ -250,7 +252,7 @@ void phi_device::set_ext_signal(phi_488_signal_t signal , int state)
state = !state;
if (m_ext_signals[ signal ] != state) {
m_ext_signals[ signal ] = state;
- LOG(("EXT EOI %d DAV %d NRFD %d NDAC %d IFC %d SRQ %d ATN %d REN %d\n" ,
+ LOG_0(("EXT EOI %d DAV %d NRFD %d NDAC %d IFC %d SRQ %d ATN %d REN %d\n" ,
m_ext_signals[ PHI_488_EOI ] ,
m_ext_signals[ PHI_488_DAV ] ,
m_ext_signals[ PHI_488_NRFD ] ,
@@ -409,7 +411,7 @@ void phi_device::device_reset()
void phi_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
- LOG(("tmr %d enabled %d\n" , id , timer.enabled()));
+ LOG_0(("tmr %d enabled %d\n" , id , timer.enabled()));
update_fsm();
}
@@ -521,7 +523,7 @@ uint8_t phi_device::get_dio(void)
void phi_device::set_dio(uint8_t data)
{
if (data != m_dio) {
- LOG(("DIO=%02x\n" , data));
+ LOG_0(("DIO=%02x\n" , data));
m_dio = data;
if (!m_loopback) {
m_dio_write_func(~data);
@@ -542,7 +544,7 @@ void phi_device::set_signal(phi_488_signal_t signal , bool state)
{
if (state != m_signals[ signal ]) {
m_signals[ signal ] = state;
- LOG(("INT EOI %d DAV %d NRFD %d NDAC %d IFC %d SRQ %d ATN %d REN %d\n" ,
+ LOG_0(("INT EOI %d DAV %d NRFD %d NDAC %d IFC %d SRQ %d ATN %d REN %d\n" ,
m_signals[ PHI_488_EOI ] ,
m_signals[ PHI_488_DAV ] ,
m_signals[ PHI_488_NRFD ] ,
@@ -565,9 +567,16 @@ void phi_device::pon_msg(void)
m_t_spms = false;
m_l_state = PHI_L_LIDS;
m_sr_state = PHI_SR_NPRS;
- m_pp_state = PHI_PP_PPIS;
m_pp_pacs = false;
- m_ppr_msg = my_address();
+ uint8_t addr = my_address();
+ if (addr <= 7) {
+ // If address <= 7, PP is automatically enabled and configured for PPR = ~address
+ m_ppr_msg = addr ^ 7;
+ m_pp_state = PHI_PP_PPSS;
+ } else {
+ m_ppr_msg = 0;
+ m_pp_state = PHI_PP_PPIS;
+ }
m_s_sense = true;
m_c_state = PHI_C_CIDS;
m_be_counter = 0;
@@ -610,10 +619,10 @@ void phi_device::update_fsm(void)
// TODO: RL FSM
// Loop until all changes settle
while (changed) {
- LOG(("SH %d AH %d T %d SPMS %d L %d SR %d PP %d PACS %d PPR %u S %d C %d\n" ,
+ LOG_0(("SH %d AH %d T %d SPMS %d L %d SR %d PP %d PACS %d PPR %u S %d C %d\n" ,
m_sh_state , m_ah_state , m_t_state , m_t_spms , m_l_state , m_sr_state ,
m_pp_state , m_pp_pacs , m_ppr_msg , m_s_sense , m_c_state));
- LOG(("O E/F=%d/%d I E/F=%d/%d\n" , m_fifo_out.empty() , m_fifo_out.full() , m_fifo_in.empty() , m_fifo_in.full()));
+ LOG_0(("O E/F=%d/%d I E/F=%d/%d\n" , m_fifo_out.empty() , m_fifo_out.full() , m_fifo_in.empty() , m_fifo_in.full()));
changed = false;
// SH FSM
@@ -641,7 +650,7 @@ void phi_device::update_fsm(void)
if ((m_nba_origin = nba_msg(new_byte , new_eoi)) != NBA_NONE) {
m_sh_state = PHI_SH_SDYS;
m_sh_dly_timer->adjust(attotime::from_nsec(DELAY_T1));
- LOG(("SH DLY enabled %d\n" , m_sh_dly_timer->enabled()));
+ LOG_0(("SH DLY enabled %d\n" , m_sh_dly_timer->enabled()));
}
break;
@@ -653,6 +662,7 @@ void phi_device::update_fsm(void)
case PHI_SH_STRS:
if (!get_signal(PHI_488_NDAC)) {
+ LOG(("TX %02x/%d\n" , m_dio , m_signals[ PHI_488_EOI ]));
m_sh_state = PHI_SH_SGNS;
clear_nba((nba_origin_t)m_nba_origin);
}
@@ -669,15 +679,13 @@ void phi_device::update_fsm(void)
// SH outputs
// EOI is controlled by SH & C FSMs
- bool eoi_signal;
+ bool eoi_signal = false;
+ uint8_t dio_byte = 0;
set_signal(PHI_488_DAV , m_sh_state == PHI_SH_STRS);
if (m_sh_state == PHI_SH_SDYS || m_sh_state == PHI_SH_STRS) {
nba_msg(new_byte , new_eoi);
- set_dio(new_byte);
+ dio_byte = new_byte;
eoi_signal = new_eoi;
- } else {
- set_dio(0);
- eoi_signal = false;
}
// AH FSM
@@ -705,7 +713,7 @@ void phi_device::update_fsm(void)
}
// rdy is always true
// } else if (!get_signal(PHI_488_ATN) && !rdy_msg()) {
- // m_ah_state = PHI_AH_ANRS;
+ // m_ah_state = PHI_AH_ANRS;
// }
break;
@@ -883,8 +891,9 @@ void phi_device::update_fsm(void)
changed = true;
}
// PP outputs
- if (m_pp_state == PHI_PP_PPAS && m_s_sense == !!BIT(m_reg_control , REG_CTRL_PP_RESPONSE_BIT) && m_ppr_msg <= 7) {
- set_dio(1 << m_ppr_msg);
+ if (m_pp_state == PHI_PP_PPAS && m_s_sense == !!BIT(m_reg_control , REG_CTRL_PP_RESPONSE_BIT)) {
+ LOG(("PP %u\n" , m_ppr_msg));
+ dio_byte |= (1U << m_ppr_msg);
}
// C FSM
@@ -913,11 +922,11 @@ void phi_device::update_fsm(void)
m_sh_state != PHI_SH_STRS && m_sh_state != PHI_SH_SDYS) {
if (!m_fifo_out.empty()) {
// Possible cases
- // D0/D1 Meaning of 1st word of OFIFO
+ // D0/D1 Meaning of 1st word of OFIFO
// =====================================
- // x0 Counted transfer enable or byte to be sent
- // 11 Uncounted transfer enable
- // 01 Send interface command (already caught by nba_msg)
+ // x0 Counted transfer enable or byte to be sent
+ // 11 Uncounted transfer enable
+ // 01 Send interface command (already caught by nba_msg)
m_c_state = PHI_C_CSBS;
m_be_counter = 0;
} else if (rpp_msg()) {
@@ -988,6 +997,7 @@ void phi_device::update_fsm(void)
m_c_state == PHI_C_CAWS || m_c_state == PHI_C_CTRS);
eoi_signal = eoi_signal || m_c_state == PHI_C_CPWS || m_c_state == PHI_C_CPPS;
set_signal(PHI_488_EOI , eoi_signal);
+ set_dio(dio_byte);
}
// Update status register
@@ -1264,7 +1274,7 @@ bool phi_device::if_cmd_received(uint8_t byte)
if (m_t_state == PHI_T_TADS) {
BIT_SET(word, REG_IFIFO_TALK_BIT);
}
- m_fifo_in.enqueue(word);
+ rx_n_data_freeze(word);
}
}
}
@@ -1307,20 +1317,15 @@ bool phi_device::byte_received(uint8_t byte , bool eoi)
if (m_l_state == PHI_L_LACS) {
if (m_fifo_in.full() || BIT(m_reg_int_cond , REG_INT_DEV_CLEAR_BIT)) {
// No room for received byte, stall handshake
- LOG(("..stalled\n"));
+ LOG_0(("..stalled\n"));
return false;
} else {
- m_fifo_in.enqueue(word);
- LOG(("..OK\n"));
- if (m_t_state != PHI_T_TACS && m_t_state != PHI_T_ID3 &&
- m_t_state != PHI_T_ID5 && m_t_state != PHI_T_SPAS) {
- // If PHI didn't send this byte to itself, set data freeze
- BIT_SET(m_reg_status, REG_STATUS_DATA_FREEZE_BIT);
- }
+ LOG_0(("..OK\n"));
+ rx_n_data_freeze(word);
}
}
if (end_of_transfer) {
- LOG(("End of byte transfer enable\n"));
+ LOG_0(("End of byte transfer enable\n"));
m_fifo_out.dequeue();
m_be_counter = 0;
} else {
@@ -1330,6 +1335,15 @@ bool phi_device::byte_received(uint8_t byte , bool eoi)
return true;
}
+void phi_device::rx_n_data_freeze(uint16_t word)
+{
+ m_fifo_in.enqueue(word);
+ if (m_sh_state != PHI_SH_STRS) {
+ // If PHI didn't send this byte to itself, set data freeze
+ BIT_SET(m_reg_status, REG_STATUS_DATA_FREEZE_BIT);
+ }
+}
+
bool phi_device::ton_msg(void) const
{
return BIT(m_reg_address , REG_ADDR_TA_BIT);
diff --git a/src/devices/machine/phi.h b/src/devices/machine/phi.h
index 84955d290af..bd1a0906143 100644
--- a/src/devices/machine/phi.h
+++ b/src/devices/machine/phi.h
@@ -2,9 +2,9 @@
// copyright-holders:F. Ulivi
/*********************************************************************
- phi.h
+ phi.h
- HP PHI (Processor-to-Hpib-Interface) (1AA6-6x04)
+ HP PHI (Processor-to-Hpib-Interface) (1AA6-6x04)
*********************************************************************/
@@ -12,45 +12,45 @@
#define _PHI_H_
// Set read and write callbacks to access DIO bus on IEEE-488
-#define MCFG_PHI_DIO_READWRITE_CB(_read , _write) \
- phi_device::set_dio_read_cb(*device , DEVCB_##_read); \
+#define MCFG_PHI_DIO_READWRITE_CB(_read , _write) \
+ phi_device::set_dio_read_cb(*device , DEVCB_##_read); \
phi_device::set_dio_write_cb(*device , DEVCB_##_write);
// Set write callbacks to access uniline signals on IEEE-488
-#define MCFG_PHI_EOI_WRITE_CB(_write) \
+#define MCFG_PHI_EOI_WRITE_CB(_write) \
phi_device::set_488_signal_write_cb(*device , phi_device::PHI_488_EOI , DEVCB_##_write);
-#define MCFG_PHI_DAV_WRITE_CB(_write) \
+#define MCFG_PHI_DAV_WRITE_CB(_write) \
phi_device::set_488_signal_write_cb(*device , phi_device::PHI_488_DAV , DEVCB_##_write);
-#define MCFG_PHI_NRFD_WRITE_CB(_write) \
+#define MCFG_PHI_NRFD_WRITE_CB(_write) \
phi_device::set_488_signal_write_cb(*device , phi_device::PHI_488_NRFD , DEVCB_##_write);
-#define MCFG_PHI_NDAC_WRITE_CB(_write) \
+#define MCFG_PHI_NDAC_WRITE_CB(_write) \
phi_device::set_488_signal_write_cb(*device , phi_device::PHI_488_NDAC , DEVCB_##_write);
-#define MCFG_PHI_IFC_WRITE_CB(_write) \
+#define MCFG_PHI_IFC_WRITE_CB(_write) \
phi_device::set_488_signal_write_cb(*device , phi_device::PHI_488_IFC , DEVCB_##_write);
-#define MCFG_PHI_SRQ_WRITE_CB(_write) \
+#define MCFG_PHI_SRQ_WRITE_CB(_write) \
phi_device::set_488_signal_write_cb(*device , phi_device::PHI_488_SRQ , DEVCB_##_write);
-#define MCFG_PHI_ATN_WRITE_CB(_write) \
+#define MCFG_PHI_ATN_WRITE_CB(_write) \
phi_device::set_488_signal_write_cb(*device , phi_device::PHI_488_ATN , DEVCB_##_write);
-#define MCFG_PHI_REN_WRITE_CB(_write) \
+#define MCFG_PHI_REN_WRITE_CB(_write) \
phi_device::set_488_signal_write_cb(*device , phi_device::PHI_488_REN , DEVCB_##_write);
// Set write callback for INT signal
-#define MCFG_PHI_INT_WRITE_CB(_write) \
+#define MCFG_PHI_INT_WRITE_CB(_write) \
phi_device::set_int_write_cb(*device , DEVCB_##_write);
// Set write callback for DMARQ signal
-#define MCFG_PHI_DMARQ_WRITE_CB(_write) \
+#define MCFG_PHI_DMARQ_WRITE_CB(_write) \
phi_device::set_dmarq_write_cb(*device , DEVCB_##_write);
// Depth of inbound/outbound FIFOs
-#define PHI_FIFO_SIZE 8
+#define PHI_FIFO_SIZE 8
class phi_device : public device_t
{
@@ -102,22 +102,22 @@ public:
// Mapping of PHI register bits:
// Reg. bit PHI bit
// =================
- // 15 0
- // 14 1
- // 13 =0=
- // 12 =0=
- // 11 =0=
- // 10 =0=
- // 9 =0=
- // 8 =0=
- // 7 8
- // 6 9
- // 5 10
- // 4 11
- // 3 12
- // 2 13
- // 1 14
- // 0 15
+ // 15 0
+ // 14 1
+ // 13 =0=
+ // 12 =0=
+ // 11 =0=
+ // 10 =0=
+ // 9 =0=
+ // 8 =0=
+ // 7 8
+ // 6 9
+ // 5 10
+ // 4 11
+ // 3 12
+ // 2 13
+ // 1 14
+ // 0 15
DECLARE_WRITE16_MEMBER(reg16_w);
DECLARE_READ16_MEMBER(reg16_r);
DECLARE_WRITE8_MEMBER(reg8_w);
@@ -153,8 +153,8 @@ private:
// SH (Source Handshake) states
enum {
- PHI_SH_SIDS, // & SIWS
- PHI_SH_SGNS, // & SWNS
+ PHI_SH_SIDS, // & SIWS
+ PHI_SH_SGNS, // & SWNS
PHI_SH_SDYS,
PHI_SH_STRS
};
@@ -167,7 +167,7 @@ private:
PHI_AH_ANRS,
PHI_AH_ACRS,
PHI_AH_ACDS,
- PHI_AH_ACDS_FROZEN, // Non-standard state: IF CMD rejected because of even parity
+ PHI_AH_ACDS_FROZEN, // Non-standard state: IF CMD rejected because of even parity
PHI_AH_AWNS
};
@@ -180,16 +180,16 @@ private:
PHI_T_SPAS,
PHI_T_TACS,
// The following are non-standard states for IDENTIFY sequencing
- PHI_T_ID1, // Untalked
- PHI_T_ID2, // Addressed by secondary address
- PHI_T_ID3, // Sending 1st byte
- PHI_T_ID4, // Waiting to send 2nd byte
- PHI_T_ID5, // Sending 2nd byte
- PHI_T_ID6 // 2nd byte sent, end of sequence
+ PHI_T_ID1, // Untalked
+ PHI_T_ID2, // Addressed by secondary address
+ PHI_T_ID3, // Sending 1st byte
+ PHI_T_ID4, // Waiting to send 2nd byte
+ PHI_T_ID5, // Sending 2nd byte
+ PHI_T_ID6 // 2nd byte sent, end of sequence
};
int m_t_state;
- bool m_t_spms; // False: SPIS, true: SPMS
+ bool m_t_spms; // False: SPIS, true: SPMS
// L (Listener) states
enum {
@@ -276,6 +276,7 @@ private:
void clear_nba(nba_origin_t origin);
bool if_cmd_received(uint8_t byte);
bool byte_received(uint8_t byte , bool eoi);
+ void rx_n_data_freeze(uint16_t word);
bool ton_msg(void) const;
bool lon_msg(void) const;
bool odd_parity(uint8_t byte) const;
diff --git a/src/devices/machine/tms1024.cpp b/src/devices/machine/tms1024.cpp
index d9a268a1280..a1d4cd551db 100644
--- a/src/devices/machine/tms1024.cpp
+++ b/src/devices/machine/tms1024.cpp
@@ -24,19 +24,19 @@ const device_type TMS1025 = &device_creator<tms1025_device>;
// constructor
//-------------------------------------------------
-tms1024_device::tms1024_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+tms1024_device::tms1024_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, TMS1024, "TMS1024 I/O Expander", tag, owner, clock, "tms1024", __FILE__), m_h(0), m_s(0), m_std(0),
m_write_port1(*this), m_write_port2(*this), m_write_port3(*this), m_write_port4(*this), m_write_port5(*this), m_write_port6(*this), m_write_port7(*this)
{
}
-tms1024_device::tms1024_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source)
+tms1024_device::tms1024_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, const char *shortname, const char *source)
: device_t(mconfig, type, name, tag, owner, clock, shortname, source), m_h(0), m_s(0), m_std(0),
m_write_port1(*this), m_write_port2(*this), m_write_port3(*this), m_write_port4(*this), m_write_port5(*this), m_write_port6(*this), m_write_port7(*this)
{
}
-tms1025_device::tms1025_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+tms1025_device::tms1025_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: tms1024_device(mconfig, TMS1025, "TMS1025 I/O Expander", tag, owner, clock, "tms1025", __FILE__)
{
}
diff --git a/src/devices/machine/tms1024.h b/src/devices/machine/tms1024.h
index 323b083e841..54524d27939 100644
--- a/src/devices/machine/tms1024.h
+++ b/src/devices/machine/tms1024.h
@@ -17,7 +17,7 @@
// 4-bit ports (3210 = DCBA)
// valid ports: 4-7 for TMS1024, 1-7 for TMS1025
#define MCFG_TMS1024_WRITE_PORT_CB(X, _devcb) \
- tms1024_device::set_write_port##X##_callback(*device, DEVCB_##_devcb);
+ devcb = &tms1024_device::set_write_port##X##_callback(*device, DEVCB_##_devcb);
enum
{
@@ -64,8 +64,8 @@ enum
class tms1024_device : public device_t
{
public:
- tms1024_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- tms1024_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source);
+ tms1024_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+ tms1024_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, const char *shortname, const char *source);
// static configuration helpers
template<class _Object> static devcb_base &set_write_port1_callback(device_t &device, _Object object) { return downcast<tms1024_device &>(device).m_write_port1.set_callback(object); }
@@ -85,9 +85,9 @@ protected:
virtual void device_start() override;
virtual void device_reset() override;
- uint8_t m_h; // 4-bit data latch
- uint8_t m_s; // 3-bit port select
- uint8_t m_std; // strobe pin
+ u8 m_h; // 4-bit data latch
+ u8 m_s; // 3-bit port select
+ u8 m_std; // strobe pin
// callbacks
devcb_write8 m_write_port1, m_write_port2, m_write_port3, m_write_port4, m_write_port5, m_write_port6, m_write_port7;
@@ -98,7 +98,7 @@ protected:
class tms1025_device : public tms1024_device
{
public:
- tms1025_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ tms1025_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};
diff --git a/src/devices/machine/tms6100.cpp b/src/devices/machine/tms6100.cpp
index fd28ffeae2d..6068a5865aa 100644
--- a/src/devices/machine/tms6100.cpp
+++ b/src/devices/machine/tms6100.cpp
@@ -27,7 +27,7 @@
const device_type TMS6100 = &device_creator<tms6100_device>;
-tms6100_device::tms6100_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source)
+tms6100_device::tms6100_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, const char *shortname, const char *source)
: device_t(mconfig, type, name, tag, owner, clock, shortname, source),
m_rom(*this, DEVICE_SELF),
m_reverse_bits(false),
@@ -35,7 +35,7 @@ tms6100_device::tms6100_device(const machine_config &mconfig, device_type type,
{
}
-tms6100_device::tms6100_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+tms6100_device::tms6100_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, TMS6100, "TMS6100", tag, owner, clock, "tms6100", __FILE__),
m_rom(*this, DEVICE_SELF),
m_reverse_bits(false),
@@ -45,7 +45,7 @@ tms6100_device::tms6100_device(const machine_config &mconfig, const char *tag, d
const device_type M58819 = &device_creator<m58819_device>;
-m58819_device::m58819_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+m58819_device::m58819_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: tms6100_device(mconfig, M58819, "M58819S", tag, owner, clock, "m58819s", __FILE__)
{
}
@@ -144,7 +144,7 @@ WRITE_LINE_MEMBER(tms6100_device::clk_w)
if (m_cs)
{
// new command enabled on rising edge of m0/m1
- uint8_t m = m_m1 << 1 | m_m0;
+ u8 m = m_m1 << 1 | m_m0;
if ((m & ~m_prev_m & 1) || (m & ~m_prev_m & 2))
handle_command(m);
@@ -158,7 +158,7 @@ WRITE_LINE_MEMBER(tms6100_device::clk_w)
// m0/m1 commands
-void tms6100_device::handle_command(uint8_t cmd)
+void tms6100_device::handle_command(u8 cmd)
{
enum
{
@@ -229,7 +229,7 @@ void tms6100_device::handle_command(uint8_t cmd)
// the 8-step counter PLA is shared between LA and TB
if (m_count < 4)
{
- const uint8_t shift = 4 * (m_count+1);
+ const u8 shift = 4 * (m_count+1);
m_address = (m_address & ~(0xf << shift)) | (m_add << shift);
}
@@ -245,7 +245,7 @@ void tms6100_device::handle_command(uint8_t cmd)
m_count = 0;
// load new address bits (14 bits on TMS6100)
- uint16_t rb = m_rom[m_address & m_rommask];
+ u16 rb = m_rom[m_address & m_rommask];
m_address++;
rb |= (m_rom[m_address & m_rommask] << 8);
m_address = (m_address & ~0x3fff) | (rb & 0x3fff);
diff --git a/src/devices/machine/tms6100.h b/src/devices/machine/tms6100.h
index 93a4f06826f..e36cf12615e 100644
--- a/src/devices/machine/tms6100.h
+++ b/src/devices/machine/tms6100.h
@@ -94,8 +94,8 @@
class tms6100_device : public device_t
{
public:
- tms6100_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- tms6100_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source);
+ tms6100_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+ tms6100_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, const char *shortname, const char *source);
static void enable_4bit_mode(device_t &device) { downcast<tms6100_device &>(device).m_4bit_mode = true; }
@@ -113,34 +113,34 @@ protected:
// device-level overrides
virtual void device_start() override;
- void handle_command(uint8_t cmd);
+ void handle_command(u8 cmd);
// internal state
- required_region_ptr<uint8_t> m_rom;
+ required_region_ptr<u8> m_rom;
bool m_reverse_bits;
bool m_4bit_mode;
- uint32_t m_rommask;
- uint32_t m_address; // internal address + chipselect
- uint8_t m_sa; // romdata shift register
- uint8_t m_count; // TB/LA counter (-> PLA)
- uint8_t m_prev_cmd; // previous handled command
- uint8_t m_prev_m; // previous valid m0/m1 state
+ u32 m_rommask;
+ u32 m_address; // internal address + chipselect
+ u8 m_sa; // romdata shift register
+ u8 m_count; // TB/LA counter (-> PLA)
+ u8 m_prev_cmd; // previous handled command
+ u8 m_prev_m; // previous valid m0/m1 state
- uint8_t m_add; // ADD/DATA pins input
- uint8_t m_data; // ADD/DATA pins output
+ u8 m_add; // ADD/DATA pins input
+ u8 m_data; // ADD/DATA pins output
int m_m0;
int m_m1;
- int m_cs; // chipselect pin
- int m_clk; // CLK pin
- int m_rck; // RCK pin (mask/gate to CLK?)
+ int m_cs; // chipselect pin
+ int m_clk; // CLK pin
+ int m_rck; // RCK pin (mask/gate to CLK?)
};
class m58819_device : public tms6100_device
{
public:
- m58819_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ m58819_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
protected:
// device-level overrides
diff --git a/src/devices/machine/upd765.h b/src/devices/machine/upd765.h
index 9da63ed2484..4120754a599 100644
--- a/src/devices/machine/upd765.h
+++ b/src/devices/machine/upd765.h
@@ -130,7 +130,7 @@ public:
void tc_w(bool val) override;
void ready_w(bool val);
- DECLARE_WRITE_LINE_MEMBER(tc_line_w) { tc_w(state == ASSERT_LINE); }
+ DECLARE_WRITE_LINE_MEMBER(tc_line_w) { tc_w(state == ASSERT_LINE); }
void set_rate(int rate); // rate in bps, to be used when the fdc is externally frequency-controlled
diff --git a/src/devices/machine/wd7600.h b/src/devices/machine/wd7600.h
index 8363018d30d..fa3a4323e0d 100644
--- a/src/devices/machine/wd7600.h
+++ b/src/devices/machine/wd7600.h
@@ -26,31 +26,31 @@
wd7600_device::static_set_keybctag(*device, _keybctag);
#define MCFG_WD7600_IOR(_ior) \
- downcast<wd7600_device *>(device)->set_ior_callback(DEVCB_##_ior);
+ devcb = &downcast<wd7600_device *>(device)->set_ior_callback(DEVCB_##_ior);
#define MCFG_WD7600_IOW(_iow) \
- downcast<wd7600_device *>(device)->set_iow_callback(DEVCB_##_iow);
+ devcb = &downcast<wd7600_device *>(device)->set_iow_callback(DEVCB_##_iow);
#define MCFG_WD7600_TC(_tc) \
- downcast<wd7600_device *>(device)->set_tc_callback(DEVCB_##_tc);
+ devcb = &downcast<wd7600_device *>(device)->set_tc_callback(DEVCB_##_tc);
#define MCFG_WD7600_HOLD(_hold) \
- downcast<wd7600_device *>(device)->set_hold_callback(DEVCB_##_hold);
+ devcb = &downcast<wd7600_device *>(device)->set_hold_callback(DEVCB_##_hold);
#define MCFG_WD7600_NMI(_nmi) \
- downcast<wd7600_device *>(device)->set_nmi_callback(DEVCB_##_nmi);
+ devcb = &downcast<wd7600_device *>(device)->set_nmi_callback(DEVCB_##_nmi);
#define MCFG_WD7600_INTR(_intr) \
- downcast<wd7600_device *>(device)->set_intr_callback(DEVCB_##_intr);
+ devcb = &downcast<wd7600_device *>(device)->set_intr_callback(DEVCB_##_intr);
#define MCFG_WD7600_CPURESET(_cpureset) \
- downcast<wd7600_device *>(device)->set_cpureset_callback(DEVCB_##_cpureset);
+ devcb = &downcast<wd7600_device *>(device)->set_cpureset_callback(DEVCB_##_cpureset);
#define MCFG_WD7600_A20M(_a20m) \
- downcast<wd7600_device *>(device)->set_a20m_callback(DEVCB_##_a20m);
+ devcb = &downcast<wd7600_device *>(device)->set_a20m_callback(DEVCB_##_a20m);
#define MCFG_WD7600_SPKR(_spkr) \
- downcast<wd7600_device *>(device)->set_spkr_callback(DEVCB_##_spkr);
+ devcb = &downcast<wd7600_device *>(device)->set_spkr_callback(DEVCB_##_spkr);
//**************************************************************************
@@ -69,15 +69,15 @@ public:
virtual machine_config_constructor device_mconfig_additions() const override;
// callbacks
- template<class _ior> void set_ior_callback(_ior ior) { m_read_ior.set_callback(ior); }
- template<class _iow> void set_iow_callback(_iow iow) { m_write_iow.set_callback(iow); }
- template<class _tc> void set_tc_callback(_tc tc) { m_write_tc.set_callback(tc); }
- template<class _hold> void set_hold_callback(_hold hold) { m_write_hold.set_callback(hold); }
- template<class _cpureset> void set_cpureset_callback(_cpureset cpureset) { m_write_cpureset.set_callback(cpureset); }
- template<class _nmi> void set_nmi_callback(_nmi nmi) { m_write_nmi.set_callback(nmi); }
- template<class _intr> void set_intr_callback(_intr intr) { m_write_intr.set_callback(intr); }
- template<class _a20m> void set_a20m_callback(_a20m a20m) { m_write_a20m.set_callback(a20m); }
- template<class _spkr> void set_spkr_callback(_spkr spkr) { m_write_spkr.set_callback(spkr); }
+ template<class _ior> devcb_base &set_ior_callback(_ior ior) { return m_read_ior.set_callback(ior); }
+ template<class _iow> devcb_base &set_iow_callback(_iow iow) { return m_write_iow.set_callback(iow); }
+ template<class _tc> devcb_base &set_tc_callback(_tc tc) { return m_write_tc.set_callback(tc); }
+ template<class _hold> devcb_base &set_hold_callback(_hold hold) { return m_write_hold.set_callback(hold); }
+ template<class _cpureset> devcb_base &set_cpureset_callback(_cpureset cpureset) { return m_write_cpureset.set_callback(cpureset); }
+ template<class _nmi> devcb_base &set_nmi_callback(_nmi nmi) { return m_write_nmi.set_callback(nmi); }
+ template<class _intr> devcb_base &set_intr_callback(_intr intr) { return m_write_intr.set_callback(intr); }
+ template<class _a20m> devcb_base &set_a20m_callback(_a20m a20m) { return m_write_a20m.set_callback(a20m); }
+ template<class _spkr> devcb_base &set_spkr_callback(_spkr spkr) { return m_write_spkr.set_callback(spkr); }
// inline configuration
static void static_set_cputag(device_t &device, const char *tag);
diff --git a/src/devices/machine/z80scc.cpp b/src/devices/machine/z80scc.cpp
index c08026c95c3..e2d4291b467 100644
--- a/src/devices/machine/z80scc.cpp
+++ b/src/devices/machine/z80scc.cpp
@@ -1,4 +1,5 @@
-// license:BSD-3-Clause copyright-holders: Joakim Larsson Edstrom
+// license:BSD-3-Clause
+// copyright-holders: Joakim Larsson Edstrom
/***************************************************************************
Z80-SCC Serial Communications Controller emulation
@@ -72,41 +73,41 @@ DONE (x) (p=partly) NMOS CMOS ESCC EMSCC
#include "z80scc.h"
+
//**************************************************************************
-// MACROS / CONSTANTS
+// CONFIGURABLE LOGGING
//**************************************************************************
-#define LOG_GENERAL 0x001
-#define LOG_SETUP 0x002
-#define LOG_PRINTF 0x004
-#define LOG_READ 0x008
-#define LOG_INT 0x010
-#define LOG_CMD 0x020
-#define LOG_TX 0x040
-#define LOG_RCV 0x080
-#define LOG_CTS 0x100
-#define LOG_DCD 0x200
-#define LOG_SYNC 0x400
-
-#define VERBOSE 0 // (LOG_PRINTF | LOG_SETUP | LOG_GENERAL)
-
-#define LOGMASK(mask, ...) do { if (VERBOSE & mask) logerror(__VA_ARGS__); } while (0)
-#define LOGLEVEL(mask, level, ...) do { if ((VERBOSE & mask) >= level) logerror(__VA_ARGS__); } while (0)
-
-#define LOG(...) LOGMASK(LOG_GENERAL, __VA_ARGS__)
-#define LOGSETUP(...) LOGMASK(LOG_SETUP, __VA_ARGS__)
-#define LOGR(...) LOGMASK(LOG_READ, __VA_ARGS__)
-#define LOGINT(...) LOGMASK(LOG_INT, __VA_ARGS__)
-#define LOGCMD(...) LOGMASK(LOG_CMD, __VA_ARGS__)
-#define LOGTX(...) LOGMASK(LOG_TX, __VA_ARGS__)
-#define LOGRCV(...) LOGMASK(LOG_RCV, __VA_ARGS__)
-#define LOGCTS(...) LOGMASK(LOG_CTS, __VA_ARGS__)
-#define LOGDCD(...) LOGMASK(LOG_DCD, __VA_ARGS__)
-#define LOGSYNC(...) LOGMASK(LOG_SYNC, __VA_ARGS__)
-
-#if VERBOSE & LOG_PRINTF
-#define logerror printf
-#endif
+#define LOG_GENERAL (1U << 0)
+#define LOG_SETUP (1U << 1)
+#define LOG_PRINTF (1U << 2)
+#define LOG_READ (1U << 3)
+#define LOG_INT (1U << 4)
+#define LOG_CMD (1U << 5)
+#define LOG_TX (1U << 6)
+#define LOG_RCV (1U << 7)
+#define LOG_CTS (1U << 8)
+#define LOG_DCD (1U << 9)
+#define LOG_SYNC (1U << 10)
+
+//#define VERBOSE (LOG_GENERAL | LOG_SETUP)
+//#define LOG_OUTPUT_FUNC printf
+#include "logmacro.h"
+
+#define LOGSETUP(...) LOGMASKED(LOG_SETUP, __VA_ARGS__)
+#define LOGR(...) LOGMASKED(LOG_READ, __VA_ARGS__)
+#define LOGINT(...) LOGMASKED(LOG_INT, __VA_ARGS__)
+#define LOGCMD(...) LOGMASKED(LOG_CMD, __VA_ARGS__)
+#define LOGTX(...) LOGMASKED(LOG_TX, __VA_ARGS__)
+#define LOGRCV(...) LOGMASKED(LOG_RCV, __VA_ARGS__)
+#define LOGCTS(...) LOGMASKED(LOG_CTS, __VA_ARGS__)
+#define LOGDCD(...) LOGMASKED(LOG_DCD, __VA_ARGS__)
+#define LOGSYNC(...) LOGMASKED(LOG_SYNC, __VA_ARGS__)
+
+
+//**************************************************************************
+// MACROS / CONSTANTS
+//**************************************************************************
#ifdef _MSC_VER
#define FUNCNAME __func__
diff --git a/src/devices/sound/amiga.h b/src/devices/sound/amiga.h
deleted file mode 100644
index b1b89e09cc5..00000000000
--- a/src/devices/sound/amiga.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Aaron Giles
-/***************************************************************************
-
- Amiga audio hardware
-
-***************************************************************************/
-
-#pragma once
-
-#ifndef __SOUND_AMIGA_H__
-#define __SOUND_AMIGA_H__
-
-#include "emu.h"
-
-
-//**************************************************************************
-// TYPE DEFINITIONS
-//**************************************************************************
-
-// ======================> amiga_sound_device
-
-class amiga_sound_device : public device_t, public device_sound_interface
-{
-public:
- amiga_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- ~amiga_sound_device() {}
-
- void update();
- void data_w(int which, uint16_t data);
-
-protected:
- // device-level overrides
- virtual void device_start() override;
-
- // sound stream update overrides
- virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
-
-private:
- static const int CLOCK_DIVIDER = 16;
-
- struct audio_channel
- {
- emu_timer *irq_timer;
- uint32_t curlocation;
- uint16_t curlength;
- uint16_t curticks;
- uint8_t index;
- bool dma_enabled;
- bool manualmode;
- int8_t latched;
- };
-
- void dma_reload(audio_channel *chan);
-
- // internal state
- audio_channel m_channel[4];
- sound_stream *m_stream;
-
- TIMER_CALLBACK_MEMBER( signal_irq );
-};
-
-extern const device_type AMIGA;
-
-#endif // __SOUND_AMIGA_H__
diff --git a/src/devices/sound/asc.h b/src/devices/sound/asc.h
index 6363732d219..c9bbc7ae868 100644
--- a/src/devices/sound/asc.h
+++ b/src/devices/sound/asc.h
@@ -53,7 +53,7 @@ enum
#define MCFG_ASC_TYPE(_type) \
asc_device::static_set_type(*device, _type);
#define MCFG_IRQ_FUNC(_irqf) \
- downcast<asc_device *>(device)->set_irqf(DEVCB_##_irqf);
+ devcb = &downcast<asc_device *>(device)->set_irqf(DEVCB_##_irqf);
//**************************************************************************
// TYPE DEFINITIONS
@@ -71,9 +71,9 @@ public:
static void static_set_type(device_t &device, int type);
- template<class _write> void set_irqf(_write wr)
+ template<class _write> devcb_base &set_irqf(_write wr)
{
- write_irq.set_callback(wr);
+ return write_irq.set_callback(wr);
}
devcb_write_line write_irq;
diff --git a/src/mame/audio/dave.cpp b/src/devices/sound/dave.cpp
index 69a7f2aec6f..69a7f2aec6f 100644
--- a/src/mame/audio/dave.cpp
+++ b/src/devices/sound/dave.cpp
diff --git a/src/mame/audio/dave.h b/src/devices/sound/dave.h
index 95bcf38fe92..95bcf38fe92 100644
--- a/src/mame/audio/dave.h
+++ b/src/devices/sound/dave.h
diff --git a/src/devices/sound/es8712.cpp b/src/devices/sound/es8712.cpp
index e7f5aa1fd75..ec5a546bab2 100644
--- a/src/devices/sound/es8712.cpp
+++ b/src/devices/sound/es8712.cpp
@@ -7,9 +7,14 @@
*
* Samples are currently looped, but whether they should and how, is unknown.
* Interface to the chip is also not 100% clear.
- * Should there be any status signals signifying busy, end of sample - etc?
*
- * Heavily borrowed from the OKI M6295 source
+ * This implementation, heavily borrowed from the OKI M6295 source, is based on
+ * almost certainly incorrect assumptions about the chip's nature. It seems
+ * that the ES8712 is actually a programmable counter which can stream ADPCM
+ * samples when hooked up to a ROM and a M5205 or M6585 (whose VCK signal can
+ * drive the counter). Neither of these seem to be used in conjunction with the
+ * ES8712 on Dream 9 and Dream 9 Final, which suggests it may have been used
+ * for an entirely different purpose there (perhaps to do with video timing).
*
**********************************************************************************************/
@@ -325,7 +330,7 @@ void es8712_device::play()
*
***********************************************************************************************/
-WRITE8_MEMBER( es8712_device::es8712_w )
+WRITE8_MEMBER(es8712_device::write)
{
switch (offset)
{
@@ -347,3 +352,12 @@ WRITE8_MEMBER( es8712_device::es8712_w )
}
m_start &= 0xfffff; m_end &= 0xfffff;
}
+
+READ8_MEMBER(es8712_device::read)
+{
+ // busy state (other bits unknown)
+ if (offset == 0)
+ return m_playing ? 1 : 0;
+
+ return 0;
+}
diff --git a/src/devices/sound/es8712.h b/src/devices/sound/es8712.h
index a2f73209930..d56494f894f 100644
--- a/src/devices/sound/es8712.h
+++ b/src/devices/sound/es8712.h
@@ -40,7 +40,8 @@ protected:
virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
public:
- DECLARE_WRITE8_MEMBER( es8712_w );
+ DECLARE_WRITE8_MEMBER(write);
+ DECLARE_READ8_MEMBER(read);
public:
void play();
diff --git a/src/devices/sound/msm5205.cpp b/src/devices/sound/msm5205.cpp
index 845e10737ac..9d84cae1dd4 100644
--- a/src/devices/sound/msm5205.cpp
+++ b/src/devices/sound/msm5205.cpp
@@ -61,28 +61,23 @@ const device_type MSM6585 = &device_creator<msm6585_device>;
msm5205_device::msm5205_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
- : device_t(mconfig, MSM5205, "MSM5205", tag, owner, clock, "msm5205", __FILE__),
- device_sound_interface(mconfig, *this),
- m_s1(false),
- m_s2(false),
- m_bitwidth(4),
- m_vclk_cb(*this)
+ : msm5205_device(mconfig, MSM5205, "MSM5205", tag, owner, clock, "msm5205", __FILE__)
{
}
msm5205_device::msm5205_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, const char *shortname, const char *source)
- : device_t(mconfig, type, name, tag, owner, clock, shortname, source),
- device_sound_interface(mconfig, *this),
- m_s1(false),
- m_s2(false),
- m_bitwidth(4),
- m_vclk_cb(*this)
+ : device_t(mconfig, type, name, tag, owner, clock, shortname, source),
+ device_sound_interface(mconfig, *this),
+ m_s1(false),
+ m_s2(false),
+ m_bitwidth(4),
+ m_vclk_cb(*this)
{
}
msm6585_device::msm6585_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
- : msm5205_device(mconfig, MSM6585, "MSM6585", tag, owner, clock, "msm6585", __FILE__)
+ : msm5205_device(mconfig, MSM6585, "MSM6585", tag, owner, clock, "msm6585", __FILE__)
{
}
diff --git a/src/devices/sound/saa1099.cpp b/src/devices/sound/saa1099.cpp
index 4ea28c6adcf..b43103ca73c 100644
--- a/src/devices/sound/saa1099.cpp
+++ b/src/devices/sound/saa1099.cpp
@@ -221,7 +221,7 @@ void saa1099_device::sound_stream_update(sound_stream &stream, stream_sample_t *
case 0: m_noise[ch].freq = m_master_clock/256.0 * 2; break;
case 1: m_noise[ch].freq = m_master_clock/512.0 * 2; break;
case 2: m_noise[ch].freq = m_master_clock/1024.0 * 2; break;
- case 3: m_noise[ch].freq = m_channels[ch * 3].freq; break;
+ case 3: m_noise[ch].freq = m_channels[ch * 3].freq; break; // todo: this case will be m_master_clock/[ch*3's octave divisor, 0 is = 256*2, higher numbers are higher] * 2 if the tone generator phase reset bit (0x1c bit 1) is set.
}
}
@@ -280,12 +280,14 @@ void saa1099_device::sound_stream_update(sound_stream &stream, stream_sample_t *
for (ch = 0; ch < 2; ch++)
{
- /* check the actual position in noise generator */
+ /* update the state of the noise generator
+ * polynomial is x^18 + x^11 + x (i.e. 0x20400) and is a plain XOR, initial state is probably all 1s
+ * see http://www.vogons.org/viewtopic.php?f=9&t=51695 */
m_noise[ch].counter -= m_noise[ch].freq;
while (m_noise[ch].counter < 0)
{
m_noise[ch].counter += m_sample_rate;
- if( ((m_noise[ch].level & 0x4000) == 0) == ((m_noise[ch].level & 0x0040) == 0) )
+ if( ((m_noise[ch].level & 0x20000) == 0) != ((m_noise[ch].level & 0x0400) == 0) )
m_noise[ch].level = (m_noise[ch].level << 1) | 1;
else
m_noise[ch].level <<= 1;
diff --git a/src/devices/sound/saa1099.h b/src/devices/sound/saa1099.h
index 58b29c58989..6863bd73e76 100644
--- a/src/devices/sound/saa1099.h
+++ b/src/devices/sound/saa1099.h
@@ -56,12 +56,12 @@ struct saa1099_noise
saa1099_noise() :
counter(0.0),
freq(0.0),
- level(0) {}
+ level(0xFFFFFFFF) {}
/* vars to simulate the noise generator output */
double counter;
double freq;
- int level; /* noise polynomial shifter */
+ uint32_t level; /* noise polynomial shifter */
};
diff --git a/src/devices/sound/t6721a.h b/src/devices/sound/t6721a.h
index 784050ab553..8da6737c9ea 100644
--- a/src/devices/sound/t6721a.h
+++ b/src/devices/sound/t6721a.h
@@ -44,16 +44,16 @@
//**************************************************************************
#define MCFG_T6721A_EOS_HANDLER(_eos) \
- downcast<t6721a_device *>(device)->set_eos_callback(DEVCB_##_eos);
+ devcb = &downcast<t6721a_device *>(device)->set_eos_callback(DEVCB_##_eos);
#define MCFG_T6721A_PHI2_HANDLER(_phi2) \
- downcast<t6721a_device *>(device)->set_phi2_callback(DEVCB_##_phi2);
+ devcb = &downcast<t6721a_device *>(device)->set_phi2_callback(DEVCB_##_phi2);
#define MCFG_T6721A_DTRD_HANDLER(_dtrd) \
- downcast<t6721a_device *>(device)->set_dtrd_callback(DEVCB_##_dtrd);
+ devcb = &downcast<t6721a_device *>(device)->set_dtrd_callback(DEVCB_##_dtrd);
#define MCFG_T6721A_APD_HANDLER(_apd) \
- downcast<t6721a_device *>(device)->set_apd_callback(DEVCB_##_apd);
+ devcb = &downcast<t6721a_device *>(device)->set_apd_callback(DEVCB_##_apd);
@@ -70,10 +70,10 @@ public:
t6721a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// static configuration helpers
- template<class _eos> void set_eos_callback(_eos eos) { m_write_eos.set_callback(eos); }
- template<class _phi2> void set_phi2_callback(_phi2 phi2) { m_write_phi2.set_callback(phi2); }
- template<class _dtrd> void set_dtrd_callback(_dtrd dtrd) { m_write_dtrd.set_callback(dtrd); }
- template<class _apd> void set_apd_callback(_apd apd) { m_write_apd.set_callback(apd); }
+ template<class _eos> devcb_base &set_eos_callback(_eos eos) { return m_write_eos.set_callback(eos); }
+ template<class _phi2> devcb_base &set_phi2_callback(_phi2 phi2) { return m_write_phi2.set_callback(phi2); }
+ template<class _dtrd> devcb_base &set_dtrd_callback(_dtrd dtrd) { return m_write_dtrd.set_callback(dtrd); }
+ template<class _apd> devcb_base &set_apd_callback(_apd apd) { return m_write_apd.set_callback(apd); }
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
diff --git a/src/devices/video/hlcd0515.cpp b/src/devices/video/hlcd0515.cpp
new file mode 100644
index 00000000000..eb9f6271c07
--- /dev/null
+++ b/src/devices/video/hlcd0515.cpp
@@ -0,0 +1,203 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/*
+
+ Hughes HLCD 0515/0569 LCD Driver
+
+ 0515: 25 columns(also size of buffer/ram)
+ 0569: 24 columns, no DATA OUT pin, display blank has no effect
+
+ TODO:
+ - read mode is untested
+ - MAME bitmap update callback when needed
+
+*/
+
+#include "video/hlcd0515.h"
+
+
+const device_type HLCD0515 = &device_creator<hlcd0515_device>;
+const device_type HLCD0569 = &device_creator<hlcd0569_device>;
+
+//-------------------------------------------------
+// constructor
+//-------------------------------------------------
+
+hlcd0515_device::hlcd0515_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, u8 colmax, const char *shortname, const char *source)
+ : device_t(mconfig, type, name, tag, owner, clock, shortname, source),
+ m_colmax(colmax), m_write_cols(*this), m_write_data(*this)
+{
+}
+
+hlcd0515_device::hlcd0515_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : hlcd0515_device(mconfig, HLCD0515, "HLCD 0515 LCD Driver", tag, owner, clock, 25, "hlcd0515", __FILE__)
+{
+}
+
+hlcd0569_device::hlcd0569_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : hlcd0515_device(mconfig, HLCD0569, "HLCD 0569 LCD Driver", tag, owner, clock, 24, "hlcd0569", __FILE__)
+{
+}
+
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void hlcd0515_device::device_start()
+{
+ // resolve callbacks
+ m_write_cols.resolve_safe();
+ m_write_data.resolve_safe();
+
+ // timer
+ m_lcd_timer = timer_alloc();
+ m_lcd_timer->adjust(attotime::from_hz(clock() / 2), 0, attotime::from_hz(clock() / 2));
+
+ // zerofill
+ m_cs = 0;
+ m_clock = 0;
+ m_data = 0;
+ m_count = 0;
+ m_control = 0;
+ m_blank = false;
+ m_rowmax = 0;
+ m_rowout = 0;
+ m_rowsel = 0;
+ m_buffer = 0;
+ memset(m_ram, 0, sizeof(m_ram));
+
+ // register for savestates
+ save_item(NAME(m_cs));
+ save_item(NAME(m_clock));
+ save_item(NAME(m_data));
+ save_item(NAME(m_count));
+ save_item(NAME(m_control));
+ save_item(NAME(m_blank));
+ save_item(NAME(m_rowmax));
+ save_item(NAME(m_rowout));
+ save_item(NAME(m_rowsel));
+ save_item(NAME(m_buffer));
+ save_item(NAME(m_ram));
+}
+
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void hlcd0515_device::device_reset()
+{
+}
+
+
+
+//-------------------------------------------------
+// device_timer - handler timer events
+//-------------------------------------------------
+
+void hlcd0515_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ if (m_rowout > m_rowmax)
+ m_rowout = 0;
+
+ // write to COL/ROW pins
+ m_write_cols(m_rowout, m_blank ? 0 : m_ram[m_rowout], 0xffffffff);
+ m_rowout++;
+}
+
+
+
+//-------------------------------------------------
+// handlers
+//-------------------------------------------------
+
+void hlcd0515_device::set_control()
+{
+ // clock 0,1,2: row select
+ m_rowsel = m_control >> 2 & 7;
+
+ // clock 3(,4): initialize
+ if (m_control & 2)
+ {
+ m_rowmax = m_rowsel;
+ m_blank = bool(~m_control & 1);
+ }
+
+ // clock 4: read/write mode
+ m_buffer = (m_control & 1) ? m_ram[m_rowsel] : 0;
+}
+
+void hlcd0569_device::set_control()
+{
+ hlcd0515_device::set_control();
+ m_blank = false; // 0569 doesn't support display blanking
+}
+
+
+void hlcd0515_device::clock_data(int col)
+{
+ if (m_control & 1)
+ {
+ if (col < m_colmax)
+ m_buffer <<= 1;
+
+ m_write_data(m_buffer >> m_colmax & 1);
+ }
+ else
+ {
+ if (col < m_colmax)
+ m_buffer >>= 1;
+
+ // always write last column
+ u32 mask = 1 << (m_colmax - 1);
+ m_buffer = (m_buffer & ~mask) | (m_data ? mask : 0);
+ }
+}
+
+
+WRITE_LINE_MEMBER(hlcd0515_device::write_clock)
+{
+ state = (state) ? 1 : 0;
+
+ // clock/shift data on falling edge
+ if (!m_cs && !state && m_clock)
+ {
+ if (m_count < 5)
+ {
+ // 5-bit mode/control
+ m_control = m_control << 1 | m_data;
+ if (m_count == 4)
+ set_control();
+ }
+
+ else
+ clock_data(m_count - 5);
+
+ if (m_count < (m_colmax + 5))
+ m_count++;
+ }
+
+ m_clock = state;
+}
+
+
+WRITE_LINE_MEMBER(hlcd0515_device::write_cs)
+{
+ state = (state) ? 1 : 0;
+
+ // finish serial sequence on rising edge
+ if (state && !m_cs)
+ {
+ // transfer to ram
+ if (~m_control & 1)
+ m_ram[m_rowsel] = m_buffer;
+
+ m_count = 0;
+ m_control = 0;
+ }
+
+ m_cs = state;
+}
diff --git a/src/devices/video/hlcd0515.h b/src/devices/video/hlcd0515.h
new file mode 100644
index 00000000000..a09af404b55
--- /dev/null
+++ b/src/devices/video/hlcd0515.h
@@ -0,0 +1,115 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/*
+
+ Hughes HLCD 0515/0569 LCD Driver
+
+*/
+
+#ifndef _HLCD0515_H_
+#define _HLCD0515_H_
+
+#include "emu.h"
+
+
+// COL/ROW pins (offset for ROW)
+#define MCFG_HLCD0515_WRITE_COLS_CB(_devcb) \
+ hlcd0515_device::set_write_cols_callback(*device, DEVCB_##_devcb);
+
+// DATA OUT pin, don't use on HLCD0569
+#define MCFG_HLCD0515_WRITE_DATA_CB(_devcb) \
+ hlcd0515_device::set_write_data_callback(*device, DEVCB_##_devcb);
+
+
+// pinout reference
+
+/*
+ ____ ____
+ ROW0 1 |* \_/ | 40 VDD
+ ROW1 2 | | 39 OSC
+ ROW2 3 | | 38 CLOCK
+ ROW3 4 | | 37 DATA IN
+ ROW4 5 | | 36 _CS
+ ROW5 6 | | 35 DATA OUT
+ ROW6 7 | | 34 COL25
+ ROW7 8 | | 33 COL24
+ COL1 9 | | 32 COL23
+ COL2 10 | HLCD 0515 | 31 COL22
+ COL3 11 | | 30 COL21
+ COL4 12 | | 29 COL20
+ COL5 13 | | 28 COL19
+ COL6 14 | | 27 COL18
+ COL7 15 | | 26 COL17
+ COL8 16 | | 25 COL16
+ COL9 17 | | 24 COL15
+ COL10 18 | | 23 COL14
+ COL11 19 | | 22 COL13
+ GND 20 |___________| 21 COL12
+
+ HLCD 0569 doesn't have DATA OUT, instead it has what seems like OSC OUT on pin 34.
+
+ OSC is tied to a capacitor, the result frequency is 50000 * cap(in uF), eg. 0.01uF cap = 500Hz.
+ Internally, this is divided by 2, and by number of rows to get display refresh frequency.
+*/
+
+class hlcd0515_device : public device_t
+{
+public:
+ hlcd0515_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+ hlcd0515_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, u8 colmax, const char *shortname, const char *source);
+
+ // static configuration helpers
+ template<class _Object> static devcb_base &set_write_cols_callback(device_t &device, _Object object) { return downcast<hlcd0515_device &>(device).m_write_cols.set_callback(object); }
+ template<class _Object> static devcb_base &set_write_data_callback(device_t &device, _Object object) { return downcast<hlcd0515_device &>(device).m_write_data.set_callback(object); }
+
+ DECLARE_WRITE_LINE_MEMBER(write_clock);
+ DECLARE_WRITE_LINE_MEMBER(write_cs);
+ DECLARE_WRITE_LINE_MEMBER(write_data) { m_data = (state) ? 1 : 0; }
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+
+ virtual void set_control();
+ void clock_data(int col);
+
+ u8 m_colmax; // number of column pins
+
+ int m_cs; // input pin state
+ int m_clock; // "
+ int m_data; // "
+ int m_count;
+ u8 m_control;
+ bool m_blank; // display blank/visible
+ u8 m_rowmax; // number of rows output by lcd (max 8)
+ u8 m_rowout; // current row for lcd output
+ u8 m_rowsel; // current row for data in/out
+ u32 m_buffer; // data in/out shift register
+ u32 m_ram[8]; // internal lcd ram, 8 rows
+
+ emu_timer *m_lcd_timer;
+
+ // callbacks
+ devcb_write32 m_write_cols;
+ devcb_write_line m_write_data;
+};
+
+
+class hlcd0569_device : public hlcd0515_device
+{
+public:
+ hlcd0569_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+protected:
+ virtual void set_control() override;
+};
+
+
+
+extern const device_type HLCD0515;
+extern const device_type HLCD0569;
+
+
+#endif /* _HLCD0515_H_ */
diff --git a/src/devices/video/huc6261.cpp b/src/devices/video/huc6261.cpp
index ddd11783131..bc5d6357398 100644
--- a/src/devices/video/huc6261.cpp
+++ b/src/devices/video/huc6261.cpp
@@ -27,7 +27,10 @@ const device_type HUC6261 = &device_creator<huc6261_device>;
huc6261_device::huc6261_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, HUC6261, "HuC6261", tag, owner, clock, "huc6261", __FILE__),
- device_video_interface(mconfig, *this), m_huc6270_a_tag(nullptr), m_huc6270_b_tag(nullptr), m_huc6270_a(nullptr), m_huc6270_b(nullptr), m_last_h(0), m_last_v(0), m_height(0), m_address(0), m_palette_latch(0), m_register(0), m_control(0), m_pixels_per_clock(0), m_pixel_data(0), m_pixel_clock(0), m_timer(nullptr), m_bmp(nullptr)
+ device_video_interface(mconfig, *this),
+ m_huc6270_a_tag(nullptr), m_huc6270_b_tag(nullptr), m_huc6272_tag(nullptr),
+ m_huc6270_a(nullptr), m_huc6270_b(nullptr), m_huc6272(nullptr),
+ m_last_h(0), m_last_v(0), m_height(0), m_address(0), m_palette_latch(0), m_register(0), m_control(0), m_pixels_per_clock(0), m_pixel_data_a(0), m_pixel_data_b(0), m_pixel_clock(0), m_timer(nullptr), m_bmp(nullptr)
{
// Set up UV lookup table
for ( int ur = 0; ur < 256; ur++ )
@@ -38,10 +41,10 @@ huc6261_device::huc6261_device(const machine_config &mconfig, const char *tag, d
int32_t u = ur - 128;
int32_t v = vr - 128;
- r = - 1.13983 * v;
+ r = + 1.13983 * v;
g = -0.35465 * u - 0.58060 * v;
b = 2.03211 * u;
-
+
m_uv_lookup[ ( ur << 8 ) | vr ][0] = r;
m_uv_lookup[ ( ur << 8 ) | vr ][1] = g;
m_uv_lookup[ ( ur << 8 ) | vr ][2] = b;
@@ -53,8 +56,8 @@ huc6261_device::huc6261_device(const machine_config &mconfig, const char *tag, d
inline uint32_t huc6261_device::yuv2rgb(uint32_t yuv)
{
int32_t r, g, b;
- uint8_t y = yuv >> 16;
- uint16_t uv = yuv & 0xffff;
+ uint8_t y = yuv >> 8;
+ uint16_t uv = ((yuv & 0xf0) << 8) | ((yuv & 0xf) << 4);
r = y + m_uv_lookup[uv][0];
g = y + m_uv_lookup[uv][1];
@@ -70,6 +73,20 @@ inline uint32_t huc6261_device::yuv2rgb(uint32_t yuv)
return ( r << 16 ) | ( g << 8 ) | b;
}
+void huc6261_device::apply_pal_offs(uint16_t *pix_data)
+{
+ // sprite
+ if(*pix_data & 0x100)
+ {
+ *pix_data &= 0xff;
+ *pix_data += ((m_palette_offset[0] & 0x7f00) >> 8) << 1;
+ }
+ else // background
+ *pix_data += (m_palette_offset[0] & 0x7f) << 1;
+
+ *pix_data &= 0x1ff;
+}
+
void huc6261_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
int vpos = m_screen->vpos();
@@ -77,18 +94,26 @@ void huc6261_device::device_timer(emu_timer &timer, device_timer_id id, int para
int h = m_last_h;
int v = m_last_v;
uint32_t *bitmap_line = &m_bmp->pix32(v);
-
+
while ( h != hpos || v != vpos )
{
if ( m_pixel_clock == 0 )
{
g_profiler.start( PROFILER_VIDEO );
/* Get next pixel information */
- m_pixel_data = m_huc6270_b->next_pixel( machine().dummy_space(), 0, 0xffff );
+ m_pixel_data_a = m_huc6270_a->next_pixel( machine().dummy_space(), 0, 0xffff );
+ m_pixel_data_b = m_huc6270_b->next_pixel( machine().dummy_space(), 0, 0xffff );
+ apply_pal_offs(&m_pixel_data_a);
+ apply_pal_offs(&m_pixel_data_b);
+
g_profiler.stop();
}
- bitmap_line[ h ] = yuv2rgb( ( ( m_palette[m_pixel_data] & 0xff00 ) << 8 ) | ( ( m_palette[m_pixel_data] & 0xf0 ) << 8 ) | ( ( m_palette[m_pixel_data] & 0x0f ) << 4 ) );
+ bitmap_line[ h ] = yuv2rgb( m_palette[ m_pixel_data_a ] );
+ // TODO: is mixing correct?
+ if((m_pixel_data_b & 0xff) != 0)
+ bitmap_line[ h ] = yuv2rgb( m_palette[ m_pixel_data_b ] );
+
m_pixel_clock = ( m_pixel_clock + 1 ) % m_pixels_per_clock;
h = ( h + 1 ) % HUC6261_WPF;
@@ -267,21 +292,21 @@ WRITE16_MEMBER( huc6261_device::write )
switch( m_register )
{
/* Control register */
- // -x-------------- Enable HuC6271: 0 - disabled, 1 - enabled
- // --x------------- Enable HuC6272 BG3: 0 - disabled, 1 - enabled
- // ---x------------ Enable HuC6272 BG2: 0 - disabled, 1 - enabled
- // ----x----------- Enable Huc6272 BG1: 0 - disabled, 1 - enabled
- // -----x---------- Enable HuC6272 BG0: 0 - disabled, 1 - enabled
- // ------x--------- Enable HuC6270 SPR: 0 - disabled, 1 - enabled
- // -------x-------- Enable HuC6270 BG: 0 - disabled, 1 - enabled
- // --------x------- Number of SPR colors?: 0 - 16, 1 - 256
- // ---------x------ Number of BG colors?: 0 - 16, 1 - 256
- // ------------x--- Dot clock: 0 - 5MHz, 1 - 7MHz
- // -------------x-- Synchronization: 0 - internal, 1 - external
- // --------------xx Screen height: 00 - 262 lines, 01 - 263 lines, 10 - interlace, 11 - unknown/undefined
+ // -x-- ---- ---- ---- Enable HuC6271: 0 - disabled, 1 - enabled
+ // --x- ---- ---- ---- Enable HuC6272 BG3: 0 - disabled, 1 - enabled
+ // ---x ---- ---- ---- Enable HuC6272 BG2: 0 - disabled, 1 - enabled
+ // ---- x--- ---- ---- Enable Huc6272 BG1: 0 - disabled, 1 - enabled
+ // ---- -x-- ---- ---- Enable HuC6272 BG0: 0 - disabled, 1 - enabled
+ // ---- --x- ---- ---- Enable HuC6270 SPR: 0 - disabled, 1 - enabled
+ // ---- ---x ---- ---- Enable HuC6270 BG: 0 - disabled, 1 - enabled
+ // ---- ---- x--- ---- Number of SPR colors?: 0 - 16, 1 - 256
+ // ---- ---- -x-- ---- Number of BG colors?: 0 - 16, 1 - 256
+ // ---- ---- ---- x--- Dot clock: 0 - 5MHz, 1 - 7MHz
+ // ---- ---- ---- -x-- Synchronization: 0 - internal, 1 - external
+ // ---- ---- ---- --xx Screen height: 00 - 262 lines, 01 - 263 lines, 10 - interlace, 11 - unknown/undefined
case 0x00:
m_control = data;
- m_pixels_per_clock = ( data & 0x04 ) ? 3 : 4;
+ m_pixels_per_clock = ( data & 0x08 ) ? 3 : 4;
break;
// Palette address
@@ -297,20 +322,12 @@ WRITE16_MEMBER( huc6261_device::write )
m_address = ( m_address + 1 ) & 0x1FF;
break;
- // Palette offset 0
+ // Palette offset 0-3
case 0x04:
- break;
-
- // Palette offset 1
case 0x05:
- break;
-
- // Palette offset 2
case 0x06:
- break;
-
- // Palette offset 3
case 0x07:
+ m_palette_offset[m_register & 3] = data;
break;
// Priority 0
@@ -393,16 +410,19 @@ void huc6261_device::device_start()
/* Make sure we are supplied all our mandatory tags */
assert( m_huc6270_a_tag != nullptr );
assert( m_huc6270_b_tag != nullptr );
+ assert( m_huc6272_tag != nullptr );
m_timer = timer_alloc();
m_huc6270_a = machine().device<huc6270_device>(m_huc6270_a_tag);
m_huc6270_b = machine().device<huc6270_device>(m_huc6270_b_tag);
+ m_huc6272 = machine().device<huc6272_device>(m_huc6272_tag);
m_bmp = std::make_unique<bitmap_rgb32>(HUC6261_WPF, HUC6261_LPF );
/* We want to have valid devices */
assert( m_huc6270_a != nullptr );
assert( m_huc6270_b != nullptr );
+ assert( m_huc6272 != nullptr );
save_item(NAME(m_last_h));
save_item(NAME(m_last_v));
@@ -414,7 +434,8 @@ void huc6261_device::device_start()
save_item(NAME(m_control));
save_item(NAME(m_priority));
save_item(NAME(m_pixels_per_clock));
- save_item(NAME(m_pixel_data));
+ save_item(NAME(m_pixel_data_a));
+ save_item(NAME(m_pixel_data_b));
save_item(NAME(m_pixel_clock));
}
diff --git a/src/devices/video/huc6261.h b/src/devices/video/huc6261.h
index a6f5b0f55a2..f1101397744 100644
--- a/src/devices/video/huc6261.h
+++ b/src/devices/video/huc6261.h
@@ -12,7 +12,7 @@
#include "emu.h"
#include "video/huc6270.h"
-
+#include "video/huc6272.h"
/* Screen timing stuff */
#define HUC6261_WPF 1365 /* width of a line in frame including blanking areas */
@@ -25,6 +25,9 @@
#define MCFG_HUC6261_VDC2(_tag) \
huc6261_device::set_vdc2_tag(*device, _tag);
+#define MCFG_HUC6261_KING(_tag) \
+ huc6261_device::set_king_tag(*device, _tag);
+
class huc6261_device : public device_t,
public device_video_interface
@@ -35,13 +38,12 @@ public:
static void set_vdc1_tag(device_t &device, const char *tag) { downcast<huc6261_device &>(device).m_huc6270_a_tag = tag; }
static void set_vdc2_tag(device_t &device, const char *tag) { downcast<huc6261_device &>(device).m_huc6270_b_tag = tag; }
+ static void set_king_tag(device_t &device, const char *tag) { downcast<huc6261_device &>(device).m_huc6272_tag = tag; }
void video_update(bitmap_rgb32 &bitmap, const rectangle &cliprect);
DECLARE_READ16_MEMBER( read );
DECLARE_WRITE16_MEMBER( write );
- inline uint32_t yuv2rgb(uint32_t yuv);
-
protected:
// device-level overrides
virtual void device_start() override;
@@ -51,9 +53,11 @@ protected:
private:
const char *m_huc6270_a_tag;
const char *m_huc6270_b_tag;
+ const char *m_huc6272_tag;
huc6270_device *m_huc6270_a;
huc6270_device *m_huc6270_b;
+ huc6272_device *m_huc6272;
int m_last_h;
int m_last_v;
int m_height;
@@ -66,12 +70,16 @@ private:
uint8_t m_priority[7];
uint8_t m_pixels_per_clock; /* Number of pixels to output per colour clock */
- uint16_t m_pixel_data;
+ uint16_t m_pixel_data_a;
+ uint16_t m_pixel_data_b;
+ uint16_t m_palette_offset[4];
uint8_t m_pixel_clock;
emu_timer *m_timer;
std::unique_ptr<bitmap_rgb32> m_bmp;
int32_t m_uv_lookup[65536][3];
+ inline uint32_t yuv2rgb(uint32_t yuv);
+ inline void apply_pal_offs(uint16_t *pix_data);
};
diff --git a/src/devices/video/huc6271.cpp b/src/devices/video/huc6271.cpp
new file mode 100644
index 00000000000..7cc4680f8a1
--- /dev/null
+++ b/src/devices/video/huc6271.cpp
@@ -0,0 +1,88 @@
+// license:BSD-3-Clause
+// copyright-holders:Angelo Salese
+/***************************************************************************
+
+ Hudson/NEC HuC6271 "Rainbow" device
+
+***************************************************************************/
+
+#include "emu.h"
+#include "huc6271.h"
+
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+// device type definition
+const device_type huc6271 = &device_creator<huc6271_device>;
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// huc6271_device - constructor
+//-------------------------------------------------
+
+static ADDRESS_MAP_START( data_map, AS_DATA, 32, huc6271_device )
+ AM_RANGE(0x000000, 0x0fffff) AM_RAM
+ADDRESS_MAP_END
+
+huc6271_device::huc6271_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, huc6271, "HuC6271 \"Rainbow\"", tag, owner, clock, "huc6271", __FILE__),
+ device_memory_interface(mconfig, *this),
+ m_data_space_config("data", ENDIANNESS_LITTLE, 32, 32, 0, nullptr, *ADDRESS_MAP_NAME(data_map))
+{
+}
+
+
+
+DEVICE_ADDRESS_MAP_START( regs, 16, huc6271_device )
+ AM_RANGE(0x00, 0x01) AM_WRITENOP // hscroll
+ AM_RANGE(0x02, 0x03) AM_WRITENOP // control
+ AM_RANGE(0x04, 0x05) AM_WRITENOP // hsync
+ AM_RANGE(0x06, 0x07) AM_WRITENOP // base Y
+ AM_RANGE(0x08, 0x09) AM_WRITENOP // base U
+ AM_RANGE(0x0a, 0x0b) AM_WRITENOP // base V
+ADDRESS_MAP_END
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void huc6271_device::device_start()
+{
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void huc6271_device::device_reset()
+{
+}
+
+const address_space_config *huc6271_device::memory_space_config(address_spacenum spacenum) const
+{
+ switch(spacenum)
+ {
+// case AS_PROGRAM: return &m_program_space_config;
+ case AS_DATA: return &m_data_space_config;
+ default: return nullptr;
+ }
+}
+
+//**************************************************************************
+// READ/WRITE HANDLERS
+//**************************************************************************
+
+#if 0
+void huc6271_device::data_transfer(uint32_t offset, uint32_t data)
+{
+ space(AS_DATA).write_dword(offset,data);
+}
+#endif
diff --git a/src/devices/video/huc6271.h b/src/devices/video/huc6271.h
new file mode 100644
index 00000000000..1197991160e
--- /dev/null
+++ b/src/devices/video/huc6271.h
@@ -0,0 +1,63 @@
+// license:BSD-3-Clause
+// copyright-holders:Angelo Salese
+/***************************************************************************
+
+ Hudson/NEC HuC6271 "Rainbow" device
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __HUC6271DEV_H__
+#define __HUC6271DEV_H__
+
+
+
+//**************************************************************************
+// INTERFACE CONFIGURATION MACROS
+//**************************************************************************
+
+#define MCFG_HUC6271_ADD(_tag,_freq) \
+ MCFG_DEVICE_ADD(_tag, huc6271, _freq)
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> huc6271_device
+
+class huc6271_device : public device_t,
+ public device_memory_interface
+{
+public:
+ // construction/destruction
+ huc6271_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ // I/O operations
+ DECLARE_ADDRESS_MAP(regs, 16);
+ //void data_transfer(uint32_t offset, uint32_t data);
+
+protected:
+ // device-level overrides
+// virtual void device_validity_check(validity_checker &valid) const;
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_DATA) const override;
+
+private:
+ const address_space_config m_data_space_config;
+};
+
+
+// device type definition
+extern const device_type huc6271;
+
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+
+
+#endif
diff --git a/src/devices/video/huc6272.cpp b/src/devices/video/huc6272.cpp
index dce9cb7fe5c..d988e616905 100644
--- a/src/devices/video/huc6272.cpp
+++ b/src/devices/video/huc6272.cpp
@@ -1,12 +1,16 @@
// license:BSD-3-Clause
-// copyright-holders:Wilbert Pol
+// copyright-holders:Wilbert Pol, Angelo Salese
/***************************************************************************
Hudson/NEC HuC6272 "King" device
+ TODO:
+ - Use NSCSI instead of legacy one!
+
***************************************************************************/
#include "emu.h"
+
#include "video/huc6272.h"
@@ -18,88 +22,116 @@
// device type definition
const device_type huc6272 = &device_creator<huc6272_device>;
-static ADDRESS_MAP_START( huc6272_vram, AS_0, 32, huc6272_device )
- AM_RANGE(0x000000, 0x0fffff) AM_RAM
- AM_RANGE(0x100000, 0x1fffff) AM_RAM
+static ADDRESS_MAP_START( microprg_map, AS_PROGRAM, 16, huc6272_device )
+ AM_RANGE(0x00, 0x0f) AM_RAM AM_SHARE("microprg_ram")
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( kram_map, AS_DATA, 32, huc6272_device )
+ AM_RANGE(0x000000, 0x0fffff) AM_RAM AM_SHARE("kram_page0")
+ AM_RANGE(0x100000, 0x1fffff) AM_RAM AM_SHARE("kram_page1")
ADDRESS_MAP_END
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
//-------------------------------------------------
-// memory_space_config - return a description of
-// any address spaces owned by this device
+// huc6272_device - constructor
//-------------------------------------------------
-const address_space_config *huc6272_device::memory_space_config(address_spacenum spacenum) const
+huc6272_device::huc6272_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, huc6272, "HuC6272 \"King\"", tag, owner, clock, "huc6272", __FILE__),
+ device_memory_interface(mconfig, *this),
+ m_program_space_config("microprg", ENDIANNESS_LITTLE, 16, 4, 0, nullptr, *ADDRESS_MAP_NAME(microprg_map)),
+ m_data_space_config("kram", ENDIANNESS_LITTLE, 32, 21, 0, nullptr, *ADDRESS_MAP_NAME(kram_map)),
+ m_microprg_ram(*this, "microprg_ram"),
+ m_kram_page0(*this, "kram_page0"),
+ m_kram_page1(*this, "kram_page1"),
+ m_scsibus(*this, "scsi"),
+ m_scsi_data_in(*this, "scsi_data_in"),
+ m_scsi_data_out(*this, "scsi_data_out"),
+ m_scsi_ctrl_in(*this, "scsi_ctrl_in"),
+ m_irq_changed_cb(*this)
{
- return (spacenum == AS_0) ? &m_space_config : nullptr;
}
-//**************************************************************************
-// INLINE HELPERS
-//**************************************************************************
//-------------------------------------------------
-// read_dword - read a dword at the given address
+// device_validity_check - perform validity checks
+// on this device
//-------------------------------------------------
-inline uint32_t huc6272_device::read_dword(offs_t address)
+void huc6272_device::device_validity_check(validity_checker &valid) const
{
- return space().read_dword(address << 2);
}
//-------------------------------------------------
-// write_dword - write a dword at the given address
+// device_start - device-specific startup
//-------------------------------------------------
-inline void huc6272_device::write_dword(offs_t address, uint32_t data)
+void huc6272_device::device_start()
{
- space().write_dword(address << 2, data);
+ m_irq_changed_cb.resolve_safe();
+
+ assert( m_huc6271_tag != nullptr );
+
+ m_huc6271 = machine().device<huc6271_device>(m_huc6271_tag);
+
}
-//**************************************************************************
-// LIVE DEVICE
-//**************************************************************************
//-------------------------------------------------
-// huc6272_device - constructor
+// device_reset - device-specific reset
//-------------------------------------------------
-huc6272_device::huc6272_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, huc6272, "huc6272", tag, owner, clock, "huc6272", __FILE__),
- device_memory_interface(mconfig, *this),
- m_space_config("videoram", ENDIANNESS_LITTLE, 32, 32, 0, nullptr, *ADDRESS_MAP_NAME(huc6272_vram))
+void huc6272_device::device_reset()
{
}
-
//-------------------------------------------------
-// device_validity_check - perform validity checks
-// on this device
+// memory_space_config - return a description of
+// any address spaces owned by this device
//-------------------------------------------------
-void huc6272_device::device_validity_check(validity_checker &valid) const
+const address_space_config *huc6272_device::memory_space_config(address_spacenum spacenum) const
{
+ switch(spacenum)
+ {
+ case AS_PROGRAM: return &m_program_space_config;
+ case AS_DATA: return &m_data_space_config;
+ default: return nullptr;
+ }
}
+//**************************************************************************
+// INLINE HELPERS
+//**************************************************************************
//-------------------------------------------------
-// device_start - device-specific startup
+// read_dword - read a dword at the given address
//-------------------------------------------------
-void huc6272_device::device_start()
+inline uint32_t huc6272_device::read_dword(offs_t address)
{
+ return space(AS_DATA).read_dword(address << 2);
}
//-------------------------------------------------
-// device_reset - device-specific reset
+// write_dword - write a dword at the given address
//-------------------------------------------------
-void huc6272_device::device_reset()
+inline void huc6272_device::write_dword(offs_t address, uint32_t data)
{
+ space(AS_DATA).write_dword(address << 2, data);
}
+void huc6272_device::write_microprg_data(offs_t address, uint16_t data)
+{
+ space(AS_PROGRAM).write_word(address << 1, data);
+}
//**************************************************************************
// READ/WRITE HANDLERS
@@ -128,12 +160,22 @@ READ32_MEMBER( huc6272_device::read )
---- ---- ---- ---- ---- ---- -xxx xxxx register read-back
*/
res = m_register & 0x7f;
- res |= (0) << 16;
+ res |= (m_scsi_ctrl_in->read() & 0xff) << 16;
}
else
{
switch(m_register)
{
+ case 0x00: // SCSI data in
+ res = m_scsi_data_in->read() & 0xff;
+ break;
+
+ case 0x05: // SCSI bus status
+ res = m_scsi_ctrl_in->read() & 0xff;
+ res|= (m_scsi_data_in->read() << 8);
+ break;
+
+
/*
x--- ---- ---- ---- ----
*/
@@ -145,9 +187,9 @@ READ32_MEMBER( huc6272_device::read )
res = (m_kram_addr_w & 0x3ffff) | ((m_kram_inc_w & 0x1ff) << 18) | ((m_kram_page_w & 1) << 31);
break;
- case 0x0e:
+ case 0x0e: // KRAM read data
res = read_dword((m_kram_addr_r)|(m_kram_page_r<<18));
- m_kram_addr_r += (m_kram_inc_r & 0x100) ? ((m_kram_inc_r & 0xff) - 0x100) : (m_kram_inc_r & 0xff);
+ m_kram_addr_r += (m_kram_inc_r & 0x200) ? ((m_kram_inc_r & 0x1ff) - 0x200) : (m_kram_inc_r & 0x1ff);
break;
case 0x0f:
@@ -165,36 +207,61 @@ WRITE32_MEMBER( huc6272_device::write )
if((offset & 1) == 0)
m_register = data & 0x7f;
else
- {
+ {
switch(m_register)
{
- case 0x09: // DMA addr
- //printf("%08x DMA ADDR\n",data);
+ case 0x00: // SCSI data out
+ m_scsi_data_out->write(data & 0xff);
+ break;
+ case 0x01: // SCSI command
+ //m_scsibus->write_bsy(BIT(data, 0)); // bus?
+ m_scsibus->write_atn(BIT(data, 1));
+ m_scsibus->write_sel(BIT(data, 2));
+ m_scsibus->write_ack(BIT(data, 4));
+ m_scsibus->write_rst(BIT(data, 7));
+
+ break;
+
+ case 0x02: // SCSI mode
break;
- case 0x0a: // DMA size
- //printf("%08x DMA SIZE\n",data);
+
+ case 0x03: // SCSI target command
+ m_scsibus->write_io(BIT(data, 0));
+ m_scsibus->write_cd(BIT(data, 1));
+ m_scsibus->write_msg(BIT(data, 2));
+ break;
+
+ case 0x05: // SCSI bus status
+ // bits 7-0: SCSI DMA trigger?
+ m_scsi_data_out->write((data >> 8) & 0xff);
break;
- case 0x0b: // DMA status
- //printf("%08x DMA STATUS\n",data);
+
+ case 0x06: // SCSI input data
+ case 0x07: // SCSI DMA trigger
+ case 0x08: // SCSI subcode
+ case 0x09: // SCSI DMA start address
+ case 0x0a: // SCSI DMA size
+ case 0x0b: // SCSI DMA control
break;
/*
---- ---- ---- ---- ----
*/
case 0x0c: // KRAM load address
m_kram_addr_r = (data & 0x0003ffff);
- m_kram_inc_r = (data & 0x07fc0000) >> 18;
+ m_kram_inc_r = (data & 0x0ffc0000) >> 18;
m_kram_page_r = (data & 0x80000000) >> 31;
break;
case 0x0d: // KRAM write address
m_kram_addr_w = (data & 0x0003ffff);
- m_kram_inc_w = (data & 0x07fc0000) >> 18;
+ m_kram_inc_w = (data & 0x0ffc0000) >> 18;
m_kram_page_w = (data & 0x80000000) >> 31;
break;
- case 0x0e: // KRAM write VRAM
- write_dword((m_kram_addr_w)|(m_kram_page_w<<18),data); /* TODO: there are some 32-bits accesses during BIOS? */
- m_kram_addr_w += (m_kram_inc_w & 0x100) ? ((m_kram_inc_w & 0xff) - 0x100) : (m_kram_inc_w & 0xff);
+ case 0x0e: // KRAM write data
+ // TODO: handle non-dword cases?
+ write_dword((m_kram_addr_w)|(m_kram_page_w<<18),data);
+ m_kram_addr_w += (m_kram_inc_w & 0x200) ? ((m_kram_inc_w & 0x1ff) - 0x200) : (m_kram_inc_w & 0x1ff);
break;
/*
@@ -223,27 +290,120 @@ WRITE32_MEMBER( huc6272_device::write )
// 1011 - 256 color palette block mode
// others - unused/invalid
case 0x10:
- m_bgmode[0] = data & 0x0f;
- m_bgmode[1] = ( data >> 4 ) & 0x0f;
- m_bgmode[2] = ( data >> 8 ) & 0x0f;
- m_bgmode[3] = ( data >> 12 ) & 0x0f;
+ for(int i=0;i<4;i++)
+ m_bg[i].mode = (data >> i*4) & 0x0f;
+
break;
+ /*
+ ---x ---- ---- ---- BG0 rotation enable
+ ---- xxx- ---- ---- BG3 priority
+ ---- ---x xx-- ---- BG2 priority
+ ---- ---- --xx x--- BG1 priority
+ ---- ---- ---- -xxx BG0 priority
+ */
+ case 0x12:
+ for(int i=0;i<4;i++)
+ m_bg[i].priority = (data >> i*3) & 0x07;
+
+ // TODO: rotation enable
+ break;
+
case 0x13:
- m_micro_prg.addr = data & 0xf;
+ m_micro_prg.index = data & 0xf;
break;
case 0x14:
- m_micro_prg.data[m_micro_prg.addr] = data & 0xffff;
- m_micro_prg.addr++;
- m_micro_prg.addr &= 0xf;
+ write_microprg_data(m_micro_prg.index,data & 0xffff);
+ m_micro_prg.index ++;
+ m_micro_prg.index &= 0xf;
break;
case 0x15:
m_micro_prg.ctrl = data & 1;
- break;
+ break;
+
+ // case 0x16: wrap-around enable
+
+ // BAT and CG address setters
+ case 0x20: m_bg[0].bat_address = data * 1024; break;
+ case 0x21: m_bg[0].cg_address = data * 1024; break;
+ case 0x22: m_bg0sub.bat_address = data * 1024; break;
+ case 0x23: m_bg0sub.cg_address = data * 1024; break;
+ case 0x24: m_bg[1].bat_address = data * 1024; break;
+ case 0x25: m_bg[1].cg_address = data * 1024; break;
+ case 0x26: m_bg[2].bat_address = data * 1024; break;
+ case 0x27: m_bg[2].cg_address = data * 1024; break;
+ case 0x28: m_bg[3].bat_address = data * 1024; break;
+ case 0x29: m_bg[3].cg_address = data * 1024; break;
+
+ // Height & Width setters
+ case 0x2c:
+ case 0x2d:
+ case 0x2e:
+ case 0x2f:
+ {
+ uint8_t reg_offs = m_register & 3;
+ m_bg[reg_offs].height = 1 << (data & 0x000f);
+ m_bg[reg_offs].width = 1 << ((data & 0x00f0) >> 4);
+ if(reg_offs == 0)
+ {
+ m_bg0sub.height = 1 << ((data & 0x0f00) >> 8);
+ m_bg0sub.width = 1 << ((data & 0xf000) >> 12);
+ }
+ break;
+ }
+
+ // X & Y scroll values
+ case 0x30:
+ case 0x31:
+ case 0x32:
+ case 0x33:
+ case 0x34:
+ case 0x35:
+ case 0x36:
+ case 0x37:
+ {
+ uint8_t reg_offs = (m_register & 6) >> 1;
+
+ if(m_register & 1)
+ m_bg[reg_offs].yscroll = data & 0xffff;
+ else
+ m_bg[reg_offs].xscroll = data & 0xffff;
+ break;
+ }
+
//default: printf("%04x %04x %08x\n",m_register,data,mem_mask);
}
}
}
+
+static MACHINE_CONFIG_FRAGMENT( king_scsi_intf )
+ MCFG_DEVICE_ADD("scsi", SCSI_PORT, 0)
+ MCFG_SCSI_RST_HANDLER(DEVWRITELINE("scsi_ctrl_in", input_buffer_device, write_bit7))
+ MCFG_SCSI_BSY_HANDLER(DEVWRITELINE("scsi_ctrl_in", input_buffer_device, write_bit6))
+ MCFG_SCSI_REQ_HANDLER(DEVWRITELINE("scsi_ctrl_in", input_buffer_device, write_bit5))
+ MCFG_SCSI_MSG_HANDLER(DEVWRITELINE("scsi_ctrl_in", input_buffer_device, write_bit4))
+ MCFG_SCSI_CD_HANDLER(DEVWRITELINE("scsi_ctrl_in", input_buffer_device, write_bit3))
+ MCFG_SCSI_IO_HANDLER(DEVWRITELINE("scsi_ctrl_in", input_buffer_device, write_bit2))
+ MCFG_SCSI_SEL_HANDLER(DEVWRITELINE("scsi_ctrl_in", input_buffer_device, write_bit1))
+
+ MCFG_SCSI_DATA_INPUT_BUFFER("scsi_data_in")
+
+ MCFG_SCSI_OUTPUT_LATCH_ADD("scsi_data_out", "scsi")
+ MCFG_DEVICE_ADD("scsi_ctrl_in", INPUT_BUFFER, 0)
+ MCFG_DEVICE_ADD("scsi_data_in", INPUT_BUFFER, 0)
+
+ MCFG_SCSIDEV_ADD("scsi:" SCSI_PORT_DEVICE1, "cdrom", SCSICD, SCSI_ID_1)
+MACHINE_CONFIG_END
+
+//-------------------------------------------------
+// machine_config_additions - return a pointer to
+// the device's machine fragment
+//-------------------------------------------------
+
+machine_config_constructor huc6272_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( king_scsi_intf );
+}
diff --git a/src/devices/video/huc6272.h b/src/devices/video/huc6272.h
index 9a2e173f919..3fc71efd051 100644
--- a/src/devices/video/huc6272.h
+++ b/src/devices/video/huc6272.h
@@ -1,8 +1,8 @@
// license:BSD-3-Clause
-// copyright-holders:Wilbert Pol
+// copyright-holders:Wilbert Pol, Angelo Salese
/***************************************************************************
-Template for skeleton device
+ Hudson/NEC HuC6272 "King" device
***************************************************************************/
@@ -11,6 +11,9 @@ Template for skeleton device
#ifndef __huc6272DEV_H__
#define __huc6272DEV_H__
+#include "bus/scsi/scsi.h"
+#include "bus/scsi/scsicd.h"
+#include "video/huc6271.h"
//**************************************************************************
@@ -20,6 +23,12 @@ Template for skeleton device
#define MCFG_HUC6272_ADD(_tag,_freq) \
MCFG_DEVICE_ADD(_tag, huc6272, _freq)
+#define MCFG_HUC6272_IRQ_CHANGED_CB(_devcb) \
+ devcb = &huc6272_device::set_irq_changed_callback(*device, DEVCB_##_devcb);
+
+#define MCFG_HUC6272_RAINBOW(_tag) \
+ huc6272_device::set_rainbow_tag(*device, _tag);
+
//**************************************************************************
// TYPE DEFINITIONS
@@ -34,38 +43,73 @@ public:
// construction/destruction
huc6272_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ template<class _Object> static devcb_base &set_irq_changed_callback(device_t &device, _Object object) { return downcast<huc6272_device &>(device).m_irq_changed_cb.set_callback(object); }
+ static void set_rainbow_tag(device_t &device, const char *tag) { downcast<huc6272_device &>(device).m_huc6271_tag = tag; }
+
// I/O operations
DECLARE_WRITE32_MEMBER( write );
DECLARE_READ32_MEMBER( read );
-
protected:
// device-level overrides
virtual void device_validity_check(validity_checker &valid) const override;
virtual void device_start() override;
virtual void device_reset() override;
- virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override;
+ virtual machine_config_constructor device_mconfig_additions() const override;
+ virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_PROGRAM) const override;
private:
- inline uint32_t read_dword(offs_t address);
- inline void write_dword(offs_t address, uint32_t data);
+ const char *m_huc6271_tag;
+
+ huc6271_device *m_huc6271;
+
uint8_t m_register;
uint32_t m_kram_addr_r, m_kram_addr_w;
uint16_t m_kram_inc_r,m_kram_inc_w;
uint8_t m_kram_page_r,m_kram_page_w;
uint32_t m_page_setting;
- uint8_t m_bgmode[4];
-
+
+ struct{
+ uint32_t bat_address;
+ uint32_t cg_address;
+ uint8_t mode;
+ uint16_t height;
+ uint16_t width;
+ uint16_t xscroll;
+ uint16_t yscroll;
+ uint8_t priority;
+ }m_bg[4];
+
+ struct{
+ uint32_t bat_address;
+ uint32_t cg_address;
+ uint16_t height;
+ uint16_t width;
+ }m_bg0sub;
+
struct{
- uint8_t addr;
+ uint8_t index;
uint8_t ctrl;
- uint16_t data[16];
}m_micro_prg;
-
- const address_space_config m_space_config;
+
+ const address_space_config m_program_space_config;
+ const address_space_config m_data_space_config;
+ required_shared_ptr<uint16_t> m_microprg_ram;
+ required_shared_ptr<uint32_t> m_kram_page0;
+ required_shared_ptr<uint32_t> m_kram_page1;
+ required_device<SCSI_PORT_DEVICE> m_scsibus;
+ required_device<input_buffer_device> m_scsi_data_in;
+ required_device<output_latch_device> m_scsi_data_out;
+ required_device<input_buffer_device> m_scsi_ctrl_in;
+
+ /* Callback for when the irq line may have changed (mandatory) */
+ devcb_write_line m_irq_changed_cb;
+
+ uint32_t read_dword(offs_t address);
+ void write_dword(offs_t address, uint32_t data);
+ void write_microprg_data(offs_t address, uint16_t data);
};
-
// device type definition
extern const device_type huc6272;
diff --git a/src/mame/video/ppu2c0x.cpp b/src/devices/video/ppu2c0x.cpp
index c86bed6c6fb..c86bed6c6fb 100644
--- a/src/mame/video/ppu2c0x.cpp
+++ b/src/devices/video/ppu2c0x.cpp
diff --git a/src/mame/video/ppu2c0x.h b/src/devices/video/ppu2c0x.h
index d426630eb64..d426630eb64 100644
--- a/src/mame/video/ppu2c0x.h
+++ b/src/devices/video/ppu2c0x.h
diff --git a/src/devices/video/tms9927.cpp b/src/devices/video/tms9927.cpp
index 2f77efb875a..b0553642316 100644
--- a/src/devices/video/tms9927.cpp
+++ b/src/devices/video/tms9927.cpp
@@ -214,7 +214,7 @@ WRITE8_MEMBER( tms9927_device::write )
case 0x0d: /* LOAD CURSOR ROW ADDRESS */
osd_printf_debug("Cursor address changed\n");
m_reg[offset - 0x0c + 7] = data;
- /* Recomputing parameters here will break the scrollup on the Attachè
+ /* Recomputing parameters here will break the scrollup on the Attachè
and probably other machines due to m_start_datarow being reset ! */
//recompute_parameters(false);
break;
diff --git a/src/devices/video/v9938.h b/src/devices/video/v9938.h
index ae95f47ff0d..58846d58512 100644
--- a/src/devices/video/v9938.h
+++ b/src/devices/video/v9938.h
@@ -51,7 +51,7 @@
MCFG_SCREEN_PALETTE(_v9938_tag":palette")
#define MCFG_V99X8_INTERRUPT_CALLBACK(_irq) \
- downcast<v99x8_device *>(device)->set_interrupt_callback(DEVCB_##_irq);
+ devcb = &downcast<v99x8_device *>(device)->set_interrupt_callback(DEVCB_##_irq);
//**************************************************************************
@@ -79,8 +79,8 @@ protected:
v99x8_device(const machine_config &mconfig, device_type type, const char *name, const char *shortname, const char *tag, device_t *owner, uint32_t clock);
public:
- template<class _irq> void set_interrupt_callback(_irq irq) {
- m_int_callback.set_callback(irq);
+ template<class _irq> devcb_base &set_interrupt_callback(_irq irq) {
+ return m_int_callback.set_callback(irq);
}
int get_transpen();
bitmap_ind16 &get_bitmap() { return m_bitmap; }
diff --git a/src/devices/video/zeus2.cpp b/src/devices/video/zeus2.cpp
index aca1d3449bb..f77412c5846 100644
--- a/src/devices/video/zeus2.cpp
+++ b/src/devices/video/zeus2.cpp
@@ -1859,7 +1859,7 @@ void zeus2_renderer::render_poly_8bit(int32_t scanline, const extent_t& extent,
int v1 = (v0 + 1);
uint8_t texel0 = object.get_texel(texbase, v0, u0, texwidth);
//if (texel0 == transcolor)
- // continue;
+ // continue;
uint8_t texel1 = object.get_texel(texbase, v0, u1, texwidth);
uint8_t texel2 = object.get_texel(texbase, v1, u0, texwidth);
uint8_t texel3 = object.get_texel(texbase, v1, u1, texwidth);
@@ -1951,20 +1951,20 @@ std::string zeus2_device::tex_info(void)
std::string retVal;
switch (zeus_texbase) {
// crusnexo
- case 0x01fc00: retVal = "credits / insert coin"; break;
- case 0x1dc000: retVal = "copywrite text"; break;
- case 0x0e7400: retVal = "tire"; break;
- case 0x0e8800: retVal = "star behind tire"; break;
- case 0x0e6800: retVal = "crusn exotica text"; break;
- case 0x02a400: retVal = "Yellow Letters / Numbers"; break;
- case 0x1fd000: retVal = "Star burst in license plate screen"; break;
- case 0x1e9800: retVal = "Red Letter in license plate screen"; break;
- case 0x0c1c00: retVal = "Car parts"; break;
- case 0x0006f000: retVal = "license plate background"; break;
- case 0x0006f400: retVal = "blue on white license plate names"; break;
- case 0x00047800: retVal = "baby body"; break;
- case 0x000e7000: retVal = "crusn exotica yellow glow"; break;
- case 0x0002b000: retVal = "blue crusn stencil behind leader list"; break;
+ case 0x01fc00: retVal = "credits / insert coin"; break;
+ case 0x1dc000: retVal = "copywrite text"; break;
+ case 0x0e7400: retVal = "tire"; break;
+ case 0x0e8800: retVal = "star behind tire"; break;
+ case 0x0e6800: retVal = "crusn exotica text"; break;
+ case 0x02a400: retVal = "Yellow Letters / Numbers"; break;
+ case 0x1fd000: retVal = "Star burst in license plate screen"; break;
+ case 0x1e9800: retVal = "Red Letter in license plate screen"; break;
+ case 0x0c1c00: retVal = "Car parts"; break;
+ case 0x0006f000: retVal = "license plate background"; break;
+ case 0x0006f400: retVal = "blue on white license plate names"; break;
+ case 0x00047800: retVal = "baby body"; break;
+ case 0x000e7000: retVal = "crusn exotica yellow glow"; break;
+ case 0x0002b000: retVal = "blue crusn stencil behind leader list"; break;
case 0x001f4800: retVal = "number keypad"; break;
case 0x001e7800: retVal = "register now logo"; break;
case 0x001e5000: retVal = "blue start game / enter code / earn miles"; break;
@@ -1995,43 +1995,43 @@ std::string zeus2_device::tex_info(void)
// mwskinsa
case 0x1fdf00: retVal = "Skins Tip Box, s=256"; break;
- case 0x07f540: retVal = "Left main intro"; break;
- case 0x081580: retVal = "Right main intro"; break;
- case 0x14db00: retVal = "silver letter b, s=64"; break;
- case 0x14d880: retVal = "letter a"; break;
- case 0x14e000: retVal = "letter d"; break;
- case 0x0014dd80: retVal = "silver letter c, s=64"; break;
- case 0x0014fb80: retVal = "silver letter o, s=64"; break;
- case 0x0014ec80: retVal = "silver letter i, s=64"; break;
- case 0x0014f900: retVal = "silver letter n, s=64"; break;
- case 0x00150580: retVal = "silver letter s, s=64"; break;
- case 0x00150800: retVal = "silver letter t, s=64"; break;
- case 0x00150300: retVal = "silver letter r, s=64"; break;
- case 0x0014e780: retVal = "silver letter g, s=64"; break;
- case 0x00153280: retVal = "silver letter C, s=64"; break;
- case 0x0014e280: retVal = "silver letter e, s=64"; break;
- case 0x0014b800: retVal = "silver letter O, s=64"; break;
- case 0x00152d80: retVal = "silver letter A, s=64"; break;
- case 0x0014f680: retVal = "silver letter m, s=64"; break;
- case 0x00142b40: retVal = "black screen?"; break;
- case 0x00004740: retVal = "picture bridge over water, s=256"; break;
- case 0x00005c80: retVal = "picture water shore, s=256"; break;
- case 0x000030c0: retVal = "left leaderboard background graphics, s=256"; break;
- case 0x00003c00: retVal = "right leaderboard background graphics, s=256"; break;
- case 0x00040bc0: retVal = "extreme mode, s=256"; break;
- case 0x00091630: retVal = "photo wild eye guy, s=64"; break;
- case 0x00159d80: retVal = "white M s=32, t=4"; break;
- case 0x0015a080: retVal = "white 9 s=32, t=4"; break;
- case 0x00159f00: retVal = "white P s=32, t=4"; break;
- case 0x00145a40: retVal = "white crossbar? s=32, t=4"; break;
- case 0x00145c40: retVal = "white crossbar2? s=32, t=4"; break;
- case 0x00159300: retVal = "white _ s=32, t=4"; break;
- case 0x00158d00: retVal = "white 1 s=32, t=4"; break;
- case 0x00158e80: retVal = "white 4 s=32, t=4"; break;
- case 0x0001c080: retVal = "maybe checkboard"; break;
+ case 0x07f540: retVal = "Left main intro"; break;
+ case 0x081580: retVal = "Right main intro"; break;
+ case 0x14db00: retVal = "silver letter b, s=64"; break;
+ case 0x14d880: retVal = "letter a"; break;
+ case 0x14e000: retVal = "letter d"; break;
+ case 0x0014dd80: retVal = "silver letter c, s=64"; break;
+ case 0x0014fb80: retVal = "silver letter o, s=64"; break;
+ case 0x0014ec80: retVal = "silver letter i, s=64"; break;
+ case 0x0014f900: retVal = "silver letter n, s=64"; break;
+ case 0x00150580: retVal = "silver letter s, s=64"; break;
+ case 0x00150800: retVal = "silver letter t, s=64"; break;
+ case 0x00150300: retVal = "silver letter r, s=64"; break;
+ case 0x0014e780: retVal = "silver letter g, s=64"; break;
+ case 0x00153280: retVal = "silver letter C, s=64"; break;
+ case 0x0014e280: retVal = "silver letter e, s=64"; break;
+ case 0x0014b800: retVal = "silver letter O, s=64"; break;
+ case 0x00152d80: retVal = "silver letter A, s=64"; break;
+ case 0x0014f680: retVal = "silver letter m, s=64"; break;
+ case 0x00142b40: retVal = "black screen?"; break;
+ case 0x00004740: retVal = "picture bridge over water, s=256"; break;
+ case 0x00005c80: retVal = "picture water shore, s=256"; break;
+ case 0x000030c0: retVal = "left leaderboard background graphics, s=256"; break;
+ case 0x00003c00: retVal = "right leaderboard background graphics, s=256"; break;
+ case 0x00040bc0: retVal = "extreme mode, s=256"; break;
+ case 0x00091630: retVal = "photo wild eye guy, s=64"; break;
+ case 0x00159d80: retVal = "white M s=32, t=4"; break;
+ case 0x0015a080: retVal = "white 9 s=32, t=4"; break;
+ case 0x00159f00: retVal = "white P s=32, t=4"; break;
+ case 0x00145a40: retVal = "white crossbar? s=32, t=4"; break;
+ case 0x00145c40: retVal = "white crossbar2? s=32, t=4"; break;
+ case 0x00159300: retVal = "white _ s=32, t=4"; break;
+ case 0x00158d00: retVal = "white 1 s=32, t=4"; break;
+ case 0x00158e80: retVal = "white 4 s=32, t=4"; break;
+ case 0x0001c080: retVal = "maybe checkboard"; break;
// thegrid
- //case 0x0001c080: retVal = "maybe checkboard"; break;
+ //case 0x0001c080: retVal = "maybe checkboard"; break;
default: retVal = "Unknown"; break;
}
return retVal;
diff --git a/src/devices/video/zeus2.h b/src/devices/video/zeus2.h
index fc18b602e9d..35bb4f02f21 100644
--- a/src/devices/video/zeus2.h
+++ b/src/devices/video/zeus2.h
@@ -22,7 +22,7 @@
#define DUMP_WAVE_RAM 0
#define TRACK_REG_USAGE 0
-#define PRINT_TEX_INFO 0
+#define PRINT_TEX_INFO 0
#define WAVERAM0_WIDTH 1024
#define WAVERAM0_HEIGHT 2048
diff --git a/src/emu/debug/debugcmd.cpp b/src/emu/debug/debugcmd.cpp
index 5469670caa6..611912d4bae 100644
--- a/src/emu/debug/debugcmd.cpp
+++ b/src/emu/debug/debugcmd.cpp
@@ -136,6 +136,7 @@ debugger_commands::debugger_commands(running_machine& machine, debugger_cpu& cpu
m_console.register_command("printf", CMDFLAG_NONE, 0, 1, MAX_COMMAND_PARAMS, std::bind(&debugger_commands::execute_printf, this, _1, _2, _3));
m_console.register_command("logerror", CMDFLAG_NONE, 0, 1, MAX_COMMAND_PARAMS, std::bind(&debugger_commands::execute_logerror, this, _1, _2, _3));
m_console.register_command("tracelog", CMDFLAG_NONE, 0, 1, MAX_COMMAND_PARAMS, std::bind(&debugger_commands::execute_tracelog, this, _1, _2, _3));
+ m_console.register_command("tracesym", CMDFLAG_NONE, 0, 1, MAX_COMMAND_PARAMS, std::bind(&debugger_commands::execute_tracesym, this, _1, _2, _3));
m_console.register_command("quit", CMDFLAG_NONE, 0, 0, 0, std::bind(&debugger_commands::execute_quit, this, _1, _2, _3));
m_console.register_command("exit", CMDFLAG_NONE, 0, 0, 0, std::bind(&debugger_commands::execute_quit, this, _1, _2, _3));
m_console.register_command("do", CMDFLAG_NONE, 0, 1, 1, std::bind(&debugger_commands::execute_do, this, _1, _2, _3));
@@ -725,6 +726,42 @@ void debugger_commands::execute_tracelog(int ref, int params, const char *param[
/*-------------------------------------------------
+ execute_tracesym - execute the tracesym command
+-------------------------------------------------*/
+
+void debugger_commands::execute_tracesym(int ref, int params, const char *param[])
+{
+ // build a format string appropriate for the parameters and validate them
+ std::stringstream format;
+ u64 values[MAX_COMMAND_PARAMS];
+ for (int i = 0; i < params; i++)
+ {
+ // find this symbol
+ symbol_entry *sym = m_cpu.get_visible_symtable()->find(param[i]);
+ if (!sym)
+ {
+ m_console.printf("Unknown symbol: %s\n", param[i]);
+ return;
+ }
+
+ // build the format string
+ util::stream_format(format, "%s=%s ",
+ param[i],
+ sym->format().empty() ? "%16X" : sym->format());
+
+ // validate the parameter
+ if (!validate_number_parameter(param[i], &values[i]))
+ return;
+ }
+
+ // then do a printf
+ char buffer[1024];
+ if (mini_printf(buffer, format.str().c_str(), params, values))
+ m_cpu.get_visible_cpu()->debug()->trace_printf("%s", buffer);
+}
+
+
+/*-------------------------------------------------
execute_quit - execute the quit command
-------------------------------------------------*/
@@ -2496,6 +2533,7 @@ void debugger_commands::execute_trace_internal(int ref, int params, const char *
{
const char *action = nullptr;
bool detect_loops = true;
+ bool logerror = false;
device_t *cpu;
FILE *f = nullptr;
const char *mode;
@@ -2507,8 +2545,25 @@ void debugger_commands::execute_trace_internal(int ref, int params, const char *
/* validate parameters */
if (!validate_cpu_parameter((params > 1) ? param[1] : nullptr, &cpu))
return;
- if (!validate_boolean_parameter((params > 2) ? param[2] : nullptr, &detect_loops))
- return;
+ if (params > 2)
+ {
+ std::stringstream stream;
+ stream.str(param[2]);
+
+ std::string flag;
+ while (std::getline(stream, flag, '|'))
+ {
+ if (!core_stricmp(flag.c_str(), "noloop"))
+ detect_loops = false;
+ else if (!core_stricmp(flag.c_str(), "logerror"))
+ logerror = true;
+ else
+ {
+ m_console.printf("Invalid flag '%s'\n", flag.c_str());
+ return;
+ }
+ }
+ }
if (!debug_command_parameter_command(action = (params > 3) ? param[3] : nullptr))
return;
@@ -2533,7 +2588,7 @@ void debugger_commands::execute_trace_internal(int ref, int params, const char *
}
/* do it */
- cpu->debug()->trace(f, trace_over, detect_loops, action);
+ cpu->debug()->trace(f, trace_over, detect_loops, logerror, action);
if (f)
m_console.printf("Tracing CPU '%s' to file %s\n", cpu->tag(), filename.c_str());
else
diff --git a/src/emu/debug/debugcmd.h b/src/emu/debug/debugcmd.h
index ac57622abd5..02e8ceb5299 100644
--- a/src/emu/debug/debugcmd.h
+++ b/src/emu/debug/debugcmd.h
@@ -98,6 +98,7 @@ private:
void execute_printf(int ref, int params, const char **param);
void execute_logerror(int ref, int params, const char **param);
void execute_tracelog(int ref, int params, const char **param);
+ void execute_tracesym(int ref, int params, const char **param);
void execute_quit(int ref, int params, const char **param);
void execute_do(int ref, int params, const char **param);
void execute_step(int ref, int params, const char **param);
diff --git a/src/emu/debug/debugcpu.cpp b/src/emu/debug/debugcpu.cpp
index 98fa6c9f038..5a36ecadfee 100644
--- a/src/emu/debug/debugcpu.cpp
+++ b/src/emu/debug/debugcpu.cpp
@@ -1668,10 +1668,10 @@ device_debug::device_debug(device_t &device)
// add all registers into it
std::string tempstr;
- for (auto &entry : m_state->state_entries())
+ for (const auto &entry : m_state->state_entries())
{
strmakelower(tempstr.assign(entry->symbol()));
- m_symtable.add(tempstr.c_str(), (void *)(uintptr_t)entry->index(), get_state, set_state);
+ m_symtable.add(tempstr.c_str(), (void *)(uintptr_t)entry->index(), get_state, set_state, entry->format_string());
}
}
@@ -1684,6 +1684,10 @@ device_debug::device_debug(device_t &device)
if (m_state != nullptr && m_symtable.find("curpc") == nullptr)
m_symtable.add("curpc", nullptr, get_current_pc);
}
+
+ // set up trace
+ using namespace std::placeholders;
+ m_device.machine().add_logerror_callback(std::bind(&device_debug::errorlog_write_line, this, _1));
}
@@ -2623,14 +2627,14 @@ u32 device_debug::compute_opcode_crc32(offs_t pc) const
// trace - trace execution of a given device
//-------------------------------------------------
-void device_debug::trace(FILE *file, bool trace_over, bool detect_loops, const char *action)
+void device_debug::trace(FILE *file, bool trace_over, bool detect_loops, bool logerror, const char *action)
{
// delete any existing tracers
m_trace = nullptr;
// if we have a new file, make a new tracer
if (file != nullptr)
- m_trace = std::make_unique<tracer>(*this, *file, trace_over, detect_loops, action);
+ m_trace = std::make_unique<tracer>(*this, *file, trace_over, detect_loops, logerror, action);
}
@@ -3291,11 +3295,12 @@ bool device_debug::registerpoint::hit()
// tracer - constructor
//-------------------------------------------------
-device_debug::tracer::tracer(device_debug &debug, FILE &file, bool trace_over, bool detect_loops, const char *action)
+device_debug::tracer::tracer(device_debug &debug, FILE &file, bool trace_over, bool detect_loops, bool logerror, const char *action)
: m_debug(debug)
, m_file(file)
, m_action((action != nullptr) ? action : "")
, m_detect_loops(detect_loops)
+ , m_logerror(logerror)
, m_loops(0)
, m_nextdex(0)
, m_trace_over(trace_over)
@@ -3447,3 +3452,14 @@ device_debug::dasm_comment::dasm_comment(offs_t address, u32 crc, const char *te
m_color(std::move(color))
{
}
+
+
+//-------------------------------------------------
+// dasm_comment - constructor
+//-------------------------------------------------
+
+void device_debug::errorlog_write_line(const char *line)
+{
+ if (m_trace && m_trace->logerror())
+ trace_printf("%s", line);
+}
diff --git a/src/emu/debug/debugcpu.h b/src/emu/debug/debugcpu.h
index c01cc0e0646..04cb6ac27e9 100644
--- a/src/emu/debug/debugcpu.h
+++ b/src/emu/debug/debugcpu.h
@@ -263,7 +263,7 @@ public:
void track_mem_data_clear() { m_track_mem_set.clear(); }
// tracing
- void trace(FILE *file, bool trace_over, bool detect_loops, const char *action);
+ void trace(FILE *file, bool trace_over, bool detect_loops, bool logerror, const char *action);
void trace_printf(const char *fmt, ...) ATTR_PRINTF(2,3);
void trace_flush() { if (m_trace != nullptr) m_trace->flush(); }
@@ -280,6 +280,7 @@ private:
// internal helpers
void prepare_for_step_overout(offs_t pc);
u32 dasm_wrapped(std::string &buffer, offs_t pc);
+ void errorlog_write_line(const char *line);
// breakpoint and watchpoint helpers
void breakpoint_update_flags();
@@ -336,12 +337,13 @@ private:
class tracer
{
public:
- tracer(device_debug &debug, FILE &file, bool trace_over, bool detect_loops, const char *action);
+ tracer(device_debug &debug, FILE &file, bool trace_over, bool detect_loops, bool logerror, const char *action);
~tracer();
void update(offs_t pc);
void vprintf(const char *format, va_list va);
void flush();
+ bool logerror() const { return m_logerror; }
private:
static const int TRACE_LOOPS = 64;
@@ -351,6 +353,7 @@ private:
std::string m_action; // action to perform during a trace
offs_t m_history[TRACE_LOOPS]; // history of recent PCs
bool m_detect_loops; // whether or not we should detect loops
+ bool m_logerror; // whether or not we should collect logerror output
int m_loops; // number of instructions in a loop
int m_nextdex; // next index
bool m_trace_over; // true if we're tracing over
diff --git a/src/emu/debug/debughlp.cpp b/src/emu/debug/debughlp.cpp
index ded8cafb993..dd46472abb2 100644
--- a/src/emu/debug/debughlp.cpp
+++ b/src/emu/debug/debughlp.cpp
@@ -86,6 +86,7 @@ static const help_item static_help_list[] =
" printf <format>[,<item>[,...]] -- prints one or more <item>s to the console using <format>\n"
" logerror <format>[,<item>[,...]] -- outputs one or more <item>s to the error.log\n"
" tracelog <format>[,<item>[,...]] -- outputs one or more <item>s to the trace file using <format>\n"
+ " tracesym <item>[,...]] -- outputs one or more <item>s to the trace file\n"
" history [<cpu>,<length>] -- outputs a brief history of visited opcodes\n"
" trackpc [<bool>,<cpu>,<bool>] -- visually track visited opcodes [boolean to turn on and off, for the given cpu, clear]\n"
" trackmem [<bool>,<bool>] -- record which PC writes to each memory address [boolean to turn on and off, clear]\n"
@@ -385,6 +386,22 @@ static const help_item static_help_list[] =
" Outputs A=<aval>, B=<bval> on one line, and C=<a+bval> on a second line.\n"
},
{
+ "tracesym",
+ "\n"
+ " tracesym <item>[,...]\n"
+ "\n"
+ "The tracesym command prints the specified symbols and routes the output to the currently open trace "
+ "file (see the 'trace' command for details). If no file is currently open, tracesym does nothing. "
+ "\n"
+ "Examples:\n"
+ "\n"
+ "tracelog pc\n"
+ " Outputs PC=<pcval> where <pcval> is displayed in the default format.\n"
+ "\n"
+ "printf a,b\n"
+ " Outputs A=<aval>, B=<bval> on one line.\n"
+ },
+ {
"trackpc",
"\n"
" trackpc [<bool>,<cpu>,<bool>]\n"
@@ -818,14 +835,15 @@ static const help_item static_help_list[] =
{
"trace",
"\n"
- " trace {<filename>|OFF}[,<cpu>[,<detectloops>[,<action>]]]\n"
+ " trace {<filename>|OFF}[,<cpu>[,[noloop|logerror][,<action>]]]\n"
"\n"
"Starts or stops tracing of the execution of the specified <cpu>. If <cpu> is omitted, "
"the currently active CPU is specified. When enabling tracing, specify the filename in the "
"<filename> parameter. To disable tracing, substitute the keyword 'off' for <filename>. "
- "<detectloops> should be either true or false. If <detectloops> is true or omitted, the trace "
- "will have loops detected and condensed to a single line. If it is false, the trace will contain "
- "every opcode as it is executed. If you "
+ "<detectloops> should be either true or false. If 'noloop' is omitted, the trace "
+ "will have loops detected and condensed to a single line. If 'noloop' is specified, the trace "
+ "will contain every opcode as it is executed. If 'logerror' is specified, logerror output "
+ "will augment the trace. If you "
"wish to log additional information on each trace, you can append an <action> parameter which "
"is a command that is executed before each trace is logged. Generally, this is used to include "
"a 'tracelog' command. Note that you may need to embed the action within braces { } in order "
@@ -840,16 +858,22 @@ static const help_item static_help_list[] =
"trace dribling.tr,0\n"
" Begin tracing the execution of CPU #0, logging output to dribling.tr.\n"
"\n"
- "trace starswep.tr,0,false\n"
+ "trace starswep.tr,0,noloop\n"
" Begin tracing the execution of CPU #0, logging output to starswep.tr, with loop detection disabled.\n"
"\n"
+ "trace starswep.tr,0,logerror\n"
+ " Begin tracing the execution of CPU #0, logging output (along with logerror output) to starswep.tr.\n"
+ "\n"
+ "trace starswep.tr,0,logerror|noloop\n"
+ " Begin tracing the execution of CPU #0, logging output (along with logerror output) to starswep.tr, with loop detection disabled.\n"
+ "\n"
"trace >>pigskin.tr\n"
" Begin tracing the currently active CPU, appending log output to pigskin.tr.\n"
"\n"
"trace off,0\n"
" Turn off tracing on CPU #0.\n"
"\n"
- "trace asteroid.tr,0,true,{tracelog \"A=%02X \",a}\n"
+ "trace asteroid.tr,0,,{tracelog \"A=%02X \",a}\n"
" Begin tracing the execution of CPU #0, logging output to asteroid.tr. Before each line, "
"output A=<aval> to the tracelog.\n"
},
diff --git a/src/emu/debug/express.cpp b/src/emu/debug/express.cpp
index a9f9e38816f..6e3a6a65354 100644
--- a/src/emu/debug/express.cpp
+++ b/src/emu/debug/express.cpp
@@ -114,7 +114,7 @@ public:
// construction/destruction
integer_symbol_entry(symbol_table &table, const char *name, symbol_table::read_write rw, u64 *ptr = nullptr);
integer_symbol_entry(symbol_table &table, const char *name, u64 constval);
- integer_symbol_entry(symbol_table &table, const char *name, void *ref, symbol_table::getter_func getter, symbol_table::setter_func setter);
+ integer_symbol_entry(symbol_table &table, const char *name, void *ref, symbol_table::getter_func getter, symbol_table::setter_func setter, const std::string &format);
// symbol access
virtual bool is_lval() const override;
@@ -203,11 +203,12 @@ const char *expression_error::code_string() const
// symbol_entry - constructor
//-------------------------------------------------
-symbol_entry::symbol_entry(symbol_table &table, symbol_type type, const char *name, void *ref)
+symbol_entry::symbol_entry(symbol_table &table, symbol_type type, const char *name, const std::string &format, void *ref)
: m_next(nullptr),
m_table(table),
m_type(type),
m_name(name),
+ m_format(format),
m_ref(ref)
{
}
@@ -232,7 +233,7 @@ symbol_entry::~symbol_entry()
//-------------------------------------------------
integer_symbol_entry::integer_symbol_entry(symbol_table &table, const char *name, symbol_table::read_write rw, u64 *ptr)
- : symbol_entry(table, SMT_INTEGER, name, (ptr == nullptr) ? &m_value : ptr),
+ : symbol_entry(table, SMT_INTEGER, name, "", (ptr == nullptr) ? &m_value : ptr),
m_getter(internal_getter),
m_setter((rw == symbol_table::READ_ONLY) ? nullptr : internal_setter),
m_value(0)
@@ -241,7 +242,7 @@ integer_symbol_entry::integer_symbol_entry(symbol_table &table, const char *name
integer_symbol_entry::integer_symbol_entry(symbol_table &table, const char *name, u64 constval)
- : symbol_entry(table, SMT_INTEGER, name, &m_value),
+ : symbol_entry(table, SMT_INTEGER, name, "", &m_value),
m_getter(internal_getter),
m_setter(nullptr),
m_value(constval)
@@ -249,8 +250,8 @@ integer_symbol_entry::integer_symbol_entry(symbol_table &table, const char *name
}
-integer_symbol_entry::integer_symbol_entry(symbol_table &table, const char *name, void *ref, symbol_table::getter_func getter, symbol_table::setter_func setter)
- : symbol_entry(table, SMT_INTEGER, name, ref),
+integer_symbol_entry::integer_symbol_entry(symbol_table &table, const char *name, void *ref, symbol_table::getter_func getter, symbol_table::setter_func setter, const std::string &format)
+ : symbol_entry(table, SMT_INTEGER, name, format, ref),
m_getter(getter),
m_setter(setter),
m_value(0)
@@ -323,7 +324,7 @@ void integer_symbol_entry::internal_setter(symbol_table &table, void *symref, u6
//-------------------------------------------------
function_symbol_entry::function_symbol_entry(symbol_table &table, const char *name, void *ref, int minparams, int maxparams, symbol_table::execute_func execute)
- : symbol_entry(table, SMT_FUNCTION, name, ref),
+ : symbol_entry(table, SMT_FUNCTION, name, "", ref),
m_minparams(minparams),
m_maxparams(maxparams),
m_execute(execute)
@@ -434,10 +435,10 @@ void symbol_table::add(const char *name, u64 value)
// add - add a new register symbol
//-------------------------------------------------
-void symbol_table::add(const char *name, void *ref, getter_func getter, setter_func setter)
+void symbol_table::add(const char *name, void *ref, getter_func getter, setter_func setter, const std::string &format_string)
{
m_symlist.erase(name);
- m_symlist.emplace(name, std::make_unique<integer_symbol_entry>(*this, name, ref, getter, setter));
+ m_symlist.emplace(name, std::make_unique<integer_symbol_entry>(*this, name, ref, getter, setter, format_string));
}
@@ -951,7 +952,18 @@ void parsed_expression::parse_symbol_or_number(parse_token &token, const char *&
// if we have an 0b prefix, we must be a binary value
case 'b':
case 'B':
- return parse_number(token, buffer.c_str() + 2, 2, expression_error::INVALID_NUMBER);
+ try
+ {
+ return parse_number(token, buffer.c_str() + 2, 2, expression_error::INVALID_NUMBER);
+ }
+ catch (expression_error const &err)
+ {
+ // this is really a hack, but 0B1234 could also hex depending on default base
+ if (expression_error::INVALID_NUMBER == err)
+ return parse_number(token, buffer.c_str(), DEFAULT_BASE, expression_error::INVALID_NUMBER);
+ else
+ throw;
+ }
// TODO: for octal address spaces, treat 0123 as octal
default:
diff --git a/src/emu/debug/express.h b/src/emu/debug/express.h
index b9ddde14501..e255ae7b0e2 100644
--- a/src/emu/debug/express.h
+++ b/src/emu/debug/express.h
@@ -116,13 +116,14 @@ protected:
};
// construction/destruction
- symbol_entry(symbol_table &table, symbol_type type, const char *name, void *ref);
+ symbol_entry(symbol_table &table, symbol_type type, const char *name, const std::string &format, void *ref);
public:
virtual ~symbol_entry();
// getters
symbol_entry *next() const { return m_next; }
const char *name() const { return m_name.c_str(); }
+ const std::string &format() const { return m_format; }
// type checking
bool is_function() const { return (m_type == SMT_FUNCTION); }
@@ -138,6 +139,7 @@ protected:
symbol_table & m_table; // pointer back to the owning table
symbol_type m_type; // type of symbol
std::string m_name; // name of the symbol
+ std::string m_format; // format of symbol (or empty if unspecified)
void * m_ref; // internal reference
};
@@ -181,7 +183,7 @@ public:
// symbol access
void add(const char *name, read_write rw, u64 *ptr = nullptr);
void add(const char *name, u64 constvalue);
- void add(const char *name, void *ref, getter_func getter, setter_func setter = nullptr);
+ void add(const char *name, void *ref, getter_func getter, setter_func setter = nullptr, const std::string &format_string = "");
void add(const char *name, void *ref, int minparams, int maxparams, execute_func execute);
symbol_entry *find(const char *name) const { if (name) { auto search = m_symlist.find(name); if (search != m_symlist.end()) return search->second.get(); else return nullptr; } else return nullptr; }
symbol_entry *find_deep(const char *name);
diff --git a/src/emu/distate.h b/src/emu/distate.h
index e10cdd1c16a..22db6cc22af 100644
--- a/src/emu/distate.h
+++ b/src/emu/distate.h
@@ -65,6 +65,7 @@ public:
bool visible() const { return ((m_flags & DSF_NOSHOW) == 0); }
bool divider() const { return m_flags & DSF_DIVIDER; }
device_state_interface *parent_state() const {return m_device_state;}
+ const std::string &format_string() const { return m_format; }
protected:
// device state flags
diff --git a/src/emu/emuopts.cpp b/src/emu/emuopts.cpp
index b6463a99f9d..d74d6278eb4 100644
--- a/src/emu/emuopts.cpp
+++ b/src/emu/emuopts.cpp
@@ -205,9 +205,9 @@ const options_entry emu_options::s_option_entries[] =
{ OPTION_LANGUAGE ";lang", "English", OPTION_STRING, "display language" },
{ nullptr, nullptr, OPTION_HEADER, "HTTP SERVER OPTIONS" },
- { OPTION_HTTP, "0", OPTION_BOOLEAN, "HTTP server enable" },
- { OPTION_HTTP_PORT, "8080", OPTION_INTEGER, "HTTP server port" },
- { OPTION_HTTP_ROOT, "web", OPTION_STRING, "HTTP server document root" },
+ { OPTION_HTTP, "0", OPTION_BOOLEAN, "HTTP server enable" },
+ { OPTION_HTTP_PORT, "8080", OPTION_INTEGER, "HTTP server port" },
+ { OPTION_HTTP_ROOT, "web", OPTION_STRING, "HTTP server document root" },
{ nullptr }
};
diff --git a/src/emu/emuopts.h b/src/emu/emuopts.h
index 99b5463f540..c1114748900 100644
--- a/src/emu/emuopts.h
+++ b/src/emu/emuopts.h
@@ -190,7 +190,7 @@
#define OPTION_LANGUAGE "language"
-#define OPTION_HTTP "http"
+#define OPTION_HTTP "http"
#define OPTION_HTTP_PORT "http_port"
#define OPTION_HTTP_ROOT "http_root"
diff --git a/src/emu/ioport.cpp b/src/emu/ioport.cpp
index 4d106912d7b..6ffff130915 100644
--- a/src/emu/ioport.cpp
+++ b/src/emu/ioport.cpp
@@ -1388,9 +1388,9 @@ ioport_field_live::ioport_field_live(ioport_field &field, analog_field *analog)
if (field.type_class() == INPUT_CLASS_KEYBOARD && field.specific_name() == nullptr)
{
// loop through each character on the field
- for (int which = 0; ; which++)
+ for (int which = 0; which < 4; which++)
{
- char32_t ch = field.keyboard_code(which);
+ char32_t const ch = field.keyboard_code(which);
if (ch == 0)
break;
name.append(string_format("%-*s ", std::max(SPACE_COUNT - 1, 0), field.key_name(which)));
diff --git a/src/emu/logmacro.h b/src/emu/logmacro.h
new file mode 100644
index 00000000000..0f7860aec57
--- /dev/null
+++ b/src/emu/logmacro.h
@@ -0,0 +1,22 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+#if defined(MAME_EMU_LOGMACRO_H) || !defined(__EMU_H__)
+#error This file should only be included once per compilation unit after all other headers
+#endif
+#define MAME_EMU_LOGMACRO_H
+
+#ifndef VERBOSE
+#define VERBOSE 0
+#endif
+
+#ifndef LOG_OUTPUT_FUNC
+#define LOG_OUTPUT_FUNC logerror
+#endif
+
+#ifndef LOG_GENERAL
+#define LOG_GENERAL (1U << 0)
+#endif
+
+#define LOGMASKED(mask, ...) do { if (VERBOSE & (mask)) (LOG_OUTPUT_FUNC)(__VA_ARGS__); } while (false)
+
+#define LOG(...) LOGMASKED(LOG_GENERAL, __VA_ARGS__)
diff --git a/src/emu/machine.cpp b/src/emu/machine.cpp
index d528d9afd40..b32d94582b8 100644
--- a/src/emu/machine.cpp
+++ b/src/emu/machine.cpp
@@ -1184,7 +1184,7 @@ running_machine::logerror_callback_item::logerror_callback_item(logerror_callbac
void running_machine::export_http_api()
{
if (!options().http()) return;
-
+
m_manager.http_server()->on_get("/api/machine", [this](auto response, auto request)
{
rapidjson::StringBuffer s;
@@ -1195,7 +1195,7 @@ void running_machine::export_http_api()
writer.Key("devices");
writer.StartArray();
-
+
device_iterator iter(this->root_device());
for (device_t &device : iter)
writer.String(device.tag());
diff --git a/src/emu/main.cpp b/src/emu/main.cpp
index ea77d976b00..54890c5dff0 100644
--- a/src/emu/main.cpp
+++ b/src/emu/main.cpp
@@ -109,10 +109,10 @@ static std::string extension_to_type(const std::string& extension)
return "text/plain";
}
-machine_manager::machine_manager(emu_options& options, osd_interface& osd)
- : m_osd(osd),
- m_options(options),
- m_machine(nullptr),
+machine_manager::machine_manager(emu_options& options, osd_interface& osd)
+ : m_osd(osd),
+ m_options(options),
+ m_machine(nullptr),
m_io_context(std::make_shared<asio::io_context>())
{
}
@@ -184,7 +184,7 @@ void machine_manager::start_http_server()
*send_stream << "update_machine";
m_wsserver->send(connection, send_stream);
};
-
+
m_server->on_upgrade = [this](auto socket, auto request) {
auto connection = std::make_shared<webpp::ws_server::Connection>(socket);
connection->method = std::move(request->method);
diff --git a/src/emu/main.h b/src/emu/main.h
index 3a5f5a5c689..9d6f0e01459 100644
--- a/src/emu/main.h
+++ b/src/emu/main.h
@@ -108,7 +108,7 @@ protected:
std::shared_ptr<asio::io_context> m_io_context;
std::unique_ptr<webpp::http_server> m_server;
std::unique_ptr<webpp::ws_server> m_wsserver;
- std::thread m_server_thread;
+ std::thread m_server_thread;
};
diff --git a/src/emu/natkeyboard.cpp b/src/emu/natkeyboard.cpp
index a5d856a20e9..e1921b7a21d 100644
--- a/src/emu/natkeyboard.cpp
+++ b/src/emu/natkeyboard.cpp
@@ -314,17 +314,18 @@ const char_info charinfo[] =
//-------------------------------------------------
natural_keyboard::natural_keyboard(running_machine &machine)
- : m_machine(machine),
- m_in_use(false),
- m_bufbegin(0),
- m_bufend(0),
- m_status_keydown(false),
- m_last_cr(false),
- m_timer(nullptr),
- m_current_rate(attotime::zero),
- m_queue_chars(),
- m_accept_char(),
- m_charqueue_empty()
+ : m_machine(machine)
+ , m_in_use(false)
+ , m_bufbegin(0)
+ , m_bufend(0)
+ , m_fieldnum(0)
+ , m_status_keydown(false)
+ , m_last_cr(false)
+ , m_timer(nullptr)
+ , m_current_rate(attotime::zero)
+ , m_queue_chars()
+ , m_accept_char()
+ , m_charqueue_empty()
{
// try building a list of keycodes; if none are available, don't bother
build_codes(machine.ioport());
@@ -571,48 +572,68 @@ void natural_keyboard::post_coded(const char *text, size_t length, const attotim
void natural_keyboard::build_codes(ioport_manager &manager)
{
- // iterate over shift keys
- ioport_field *shift[UCHAR_SHIFT_END + 1 - UCHAR_SHIFT_BEGIN] = { nullptr };
- for (int curshift = 0; curshift <= ARRAY_LENGTH(shift); curshift++)
- if (curshift == 0 || shift[curshift - 1] != nullptr)
-
- // iterate over ports and fields
- for (auto &port : manager.ports())
- for (ioport_field &field : port.second->fields())
- if (field.type() == IPT_KEYBOARD)
- {
- // fetch the code, ignoring 0
- char32_t code = field.keyboard_code(curshift);
- if (code == 0)
- continue;
-
- // is this a shifter key?
- if (code >= UCHAR_SHIFT_BEGIN && code <= UCHAR_SHIFT_END)
- shift[code - UCHAR_SHIFT_BEGIN] = &field;
+ // find all shfit keys
+ unsigned mask = 0;
+ ioport_field *shift[SHIFT_COUNT];
+ std::fill(std::begin(shift), std::end(shift), nullptr);
+ for (auto const &port : manager.ports())
+ {
+ for (ioport_field &field : port.second->fields())
+ {
+ if (field.type() == IPT_KEYBOARD)
+ {
+ char32_t const code = field.keyboard_code(0);
+ if ((code >= UCHAR_SHIFT_BEGIN) && (code <= UCHAR_SHIFT_END))
+ {
+ mask |= 1U << (code - UCHAR_SHIFT_BEGIN);
+ shift[code - UCHAR_SHIFT_BEGIN] = &field;
+ }
+ }
+ }
+ }
- // not a shifter key; record normally
- else
+ // iterate over ports and fields
+ for (auto const &port : manager.ports())
+ {
+ for (ioport_field &field : port.second->fields())
+ {
+ if (field.type() == IPT_KEYBOARD)
+ {
+ // iterate over all shift states
+ for (unsigned curshift = 0; curshift < SHIFT_STATES; ++curshift)
+ {
+ if (!(curshift & ~mask))
+ {
+ // fetch the code, ignoring 0 and shiters
+ char32_t const code = field.keyboard_code(curshift);
+ if (((code < UCHAR_SHIFT_BEGIN) || (code > UCHAR_SHIFT_END)) && (code != 0))
{
keycode_map_entry newcode;
- if (curshift == 0)
- {
- newcode.field[0] = &field;
- newcode.field[1] = nullptr;
- }
- else
+ newcode.ch = code;
+ std::fill(std::begin(newcode.field), std::end(newcode.field), nullptr);
+
+ unsigned fieldnum = 0;
+ for (unsigned i = 0, bits = curshift; (i < SHIFT_COUNT) && bits; ++i, bits >>= 1)
{
- newcode.field[0] = shift[curshift - 1];
- newcode.field[1] = &field;
+ if (BIT(bits, 0))
+ newcode.field[fieldnum++] = shift[i];
}
- newcode.ch = code;
- m_keycode_map.push_back(newcode);
+
+ assert(fieldnum < ARRAY_LENGTH(newcode.field));
+ newcode.field[fieldnum] = &field;
+ m_keycode_map.push_back(std::move(newcode));
if (LOG_NATURAL_KEYBOARD)
{
- machine().logerror("natural_keyboard: code=%i (%s) port=%p field.name='%s'\n", int(code), unicode_to_string(code).c_str(), (void *)&port, field.name());
+ machine().logerror("natural_keyboard: code=%u (%s) port=%p field.name='%s'\n",
+ code, unicode_to_string(code), (void *)&port, field.name());
}
}
}
+ }
+ }
+ }
+ }
}
@@ -692,7 +713,8 @@ void natural_keyboard::internal_post(char32_t ch)
if (empty())
{
m_timer->adjust(choose_delay(ch));
- m_status_keydown = 0;
+ m_fieldnum = 0;
+ m_status_keydown = false;
}
// add to the buffer, resizing if necessary
@@ -710,9 +732,9 @@ void natural_keyboard::internal_post(char32_t ch)
void natural_keyboard::timer(void *ptr, int param)
{
- // the driver has a queue_chars handler
if (!m_queue_chars.isnull())
{
+ // the driver has a queue_chars handler
while (!empty() && m_queue_chars(&m_buffer[m_bufbegin], 1))
{
m_bufbegin = (m_bufbegin + 1) % m_buffer.size();
@@ -720,36 +742,46 @@ void natural_keyboard::timer(void *ptr, int param)
break;
}
}
-
- // the driver does not have a queue_chars handler
else
{
+ // the driver does not have a queue_chars handler
+
// loop through this character's component codes
- const bool new_keydown = !m_status_keydown;
const keycode_map_entry *const code = find_code(m_buffer[m_bufbegin]);
- if (code != nullptr)
+ bool advance;
+ if (code)
{
- for (int fieldnum = 0; fieldnum < ARRAY_LENGTH(code->field); fieldnum++)
+ do
{
- ioport_field *const field = code->field[fieldnum];
- if (field == nullptr)
- break;
+ assert(m_fieldnum < ARRAY_LENGTH(code->field));
- // special handling for toggle fields
- if (field->live().toggle)
+ ioport_field *const field = code->field[m_fieldnum];
+ if (field)
{
- if (new_keydown)
+ // special handling for toggle fields
+ if (!field->live().toggle)
+ field->set_value(!m_status_keydown);
+ else if (!m_status_keydown)
field->set_value(!field->digital_value());
}
- else
- field->set_value(new_keydown);
}
+ while (code->field[m_fieldnum] && (++m_fieldnum < ARRAY_LENGTH(code->field)) && m_status_keydown);
+ advance = (m_fieldnum >= ARRAY_LENGTH(code->field)) || !code->field[m_fieldnum];
+ }
+ else
+ {
+ advance = true;
}
- // proceed to next character when keydown expires
- if (!new_keydown)
- m_bufbegin = (m_bufbegin + 1) % m_buffer.size();
- m_status_keydown = new_keydown;
+ if (advance)
+ {
+ m_fieldnum = 0;
+ m_status_keydown = !m_status_keydown;
+
+ // proceed to next character when keydown expires
+ if (!m_status_keydown)
+ m_bufbegin = (m_bufbegin + 1) % m_buffer.size();
+ }
}
// need to make sure timerproc is called again if buffer not empty
diff --git a/src/emu/natkeyboard.h b/src/emu/natkeyboard.h
index 74bc9ac72d5..e89d9b3f2ca 100644
--- a/src/emu/natkeyboard.h
+++ b/src/emu/natkeyboard.h
@@ -7,12 +7,11 @@
Natural keyboard input support.
***************************************************************************/
-
-#pragma once
-
#ifndef EMU_NATKEYBOARD_H
#define EMU_NATKEYBOARD_H
+#pragma once
+
//**************************************************************************
// TYPE DEFINITIONS
@@ -57,11 +56,17 @@ public:
std::string dump();
private:
+ enum
+ {
+ SHIFT_COUNT = UCHAR_SHIFT_END - UCHAR_SHIFT_BEGIN + 1,
+ SHIFT_STATES = 1 << SHIFT_COUNT
+ };
+
// internal keyboard code information
struct keycode_map_entry
{
- char32_t ch;
- ioport_field * field[UCHAR_SHIFT_END + 1 - UCHAR_SHIFT_BEGIN];
+ char32_t ch;
+ ioport_field * field[SHIFT_COUNT + 1];
};
// internal helpers
@@ -80,6 +85,7 @@ private:
u32 m_bufbegin; // index of starting character
u32 m_bufend; // index of ending character
std::vector<char32_t> m_buffer; // actual buffer
+ unsigned m_fieldnum; // current step in multi-key sequence
bool m_status_keydown; // current keydown status
bool m_last_cr; // was the last char a CR?
emu_timer * m_timer; // timer for posting characters
diff --git a/src/frontend/mame/cheat.cpp b/src/frontend/mame/cheat.cpp
index 2c758ed1020..606d1ec74f0 100644
--- a/src/frontend/mame/cheat.cpp
+++ b/src/frontend/mame/cheat.cpp
@@ -73,13 +73,19 @@
***************************************************************************/
#include "emu.h"
-#include "emuopts.h"
+#include "cheat.h"
+
#include "mame.h"
#include "ui/ui.h"
#include "ui/menu.h"
-#include "cheat.h"
-#include "debug/debugcpu.h"
+
#include "debugger.h"
+#include "emuopts.h"
+#include "debug/debugcpu.h"
+
+#include <cstring>
+#include <iterator>
+#include <utility>
#include <ctype.h>
@@ -133,18 +139,18 @@ inline std::string number_and_format::format() const
//-------------------------------------------------
cheat_parameter::cheat_parameter(cheat_manager &manager, symbol_table &symbols, const char *filename, util::xml::data_node const &paramnode)
- : m_value(0)
+ : m_minval(number_and_format(paramnode.get_attribute_int("min", 0), paramnode.get_attribute_int_format("min")))
+ , m_maxval(number_and_format(paramnode.get_attribute_int("max", 0), paramnode.get_attribute_int_format("max")))
+ , m_stepval(number_and_format(paramnode.get_attribute_int("step", 1), paramnode.get_attribute_int_format("step")))
+ , m_value(0)
+ , m_curtext()
+ , m_itemlist()
{
- // read the core attributes
- m_minval = number_and_format(paramnode.get_attribute_int("min", 0), paramnode.get_attribute_int_format("min"));
- m_maxval = number_and_format(paramnode.get_attribute_int("max", 0), paramnode.get_attribute_int_format("max"));
- m_stepval = number_and_format(paramnode.get_attribute_int("step", 1), paramnode.get_attribute_int_format("step"));
-
// iterate over items
for (util::xml::data_node const *itemnode = paramnode.get_child("item"); itemnode != nullptr; itemnode = itemnode->get_next_sibling("item"))
{
// check for nullptr text
- if (itemnode->get_value() == nullptr || itemnode->get_value()[0] == 0)
+ if (!itemnode->get_value() || !itemnode->get_value()[0])
throw emu_fatalerror("%s.xml(%d): item is missing text\n", filename, itemnode->line);
// check for non-existant value
@@ -152,16 +158,14 @@ cheat_parameter::cheat_parameter(cheat_manager &manager, symbol_table &symbols,
throw emu_fatalerror("%s.xml(%d): item is value\n", filename, itemnode->line);
// extract the parameters
- uint64_t const value = itemnode->get_attribute_int("value", 0);
- util::xml::data_node::int_format const format = itemnode->get_attribute_int_format("value");
+ uint64_t const value(itemnode->get_attribute_int("value", 0));
+ util::xml::data_node::int_format const format(itemnode->get_attribute_int_format("value"));
// allocate and append a new item
- auto curitem = std::make_unique<item>(itemnode->get_value(), value, format);
+ item &curitem(*m_itemlist.emplace(m_itemlist.end(), itemnode->get_value(), value, format));
// ensure the maximum expands to suit
- m_maxval = std::max(m_maxval, curitem->value());
-
- m_itemlist.push_back(std::move(curitem));
+ m_maxval = std::max(m_maxval, curitem.value());
}
// add a variable to the symbol table for our value
@@ -178,18 +182,20 @@ const char *cheat_parameter::text()
// are we a value cheat?
if (!has_itemlist())
{
- m_curtext = string_format("%d (0x%X)", uint32_t(m_value), uint32_t(m_value));
+ m_curtext = string_format("%u (0x%X)", uint64_t(m_value), uint64_t(m_value));
}
else
{
// if not, we're an item cheat
- m_curtext = string_format("??? (%d)", uint32_t(m_value));
- for (auto &curitem : m_itemlist)
- if (curitem->value() == m_value)
+ m_curtext = string_format("??? (%u)", uint64_t(m_value));
+ for (item const &curitem : m_itemlist)
+ {
+ if (curitem.value() == m_value)
{
- m_curtext.assign(curitem->text());
+ m_curtext = curitem.text();
break;
}
+ }
}
return m_curtext.c_str();
}
@@ -204,9 +210,9 @@ void cheat_parameter::save(emu_file &cheatfile) const
// output the parameter tag
cheatfile.printf("\t\t<parameter");
- // if no items, just output min/max/step
if (!has_itemlist())
{
+ // if no items, just output min/max/step
if (m_minval != 0)
cheatfile.printf(" min=\"%s\"", m_minval.format().c_str());
if (m_maxval != 0)
@@ -215,13 +221,12 @@ void cheat_parameter::save(emu_file &cheatfile) const
cheatfile.printf(" step=\"%s\"", m_stepval.format().c_str());
cheatfile.printf("/>\n");
}
-
- // iterate over items
else
{
+ // iterate over items
cheatfile.printf(">\n");
- for (auto &curitem : m_itemlist)
- cheatfile.printf("\t\t\t<item value=\"%s\">%s</item>\n", curitem->value().format().c_str(), curitem->text());
+ for (item const &curitem : m_itemlist)
+ cheatfile.printf("\t\t\t<item value=\"%s\">%s</item>\n", curitem.value().format().c_str(), curitem.text());
cheatfile.printf("\t\t</parameter>\n");
}
}
@@ -233,12 +238,12 @@ void cheat_parameter::save(emu_file &cheatfile) const
bool cheat_parameter::set_minimum_state()
{
- uint64_t origvalue = m_value;
+ uint64_t const origvalue(m_value);
// set based on whether we have an item list
- m_value = (!has_itemlist()) ? m_minval : m_itemlist.front()->value();
+ m_value = !has_itemlist() ? m_minval : m_itemlist.front().value();
- return (m_value != origvalue);
+ return m_value != origvalue;
}
@@ -248,31 +253,26 @@ bool cheat_parameter::set_minimum_state()
bool cheat_parameter::set_prev_state()
{
- uint64_t origvalue = m_value;
+ uint64_t const origvalue(m_value);
- // are we a value cheat?
if (!has_itemlist())
{
- if (m_value < m_minval + m_stepval)
+ // are we a value cheat?
+ if (m_value < (m_minval + m_stepval))
m_value = m_minval;
else
m_value -= m_stepval;
}
-
- // if not, we're an item cheat
else
{
- item *previtem = nullptr;
- for (auto &curitem : m_itemlist) {
- if (curitem->value() == m_value)
- break;
- previtem = curitem.get();
- }
- if (previtem != nullptr)
- m_value = previtem->value();
+ // if not, we're an item cheat
+ std::vector<item>::const_iterator it;
+ for (it = m_itemlist.begin(); (m_itemlist.end() != it) && (it->value() != m_value); ++it) { }
+ if (m_itemlist.begin() != it)
+ m_value = std::prev(it)->value();
}
- return (m_value != origvalue);
+ return m_value != origvalue;
}
@@ -282,29 +282,26 @@ bool cheat_parameter::set_prev_state()
bool cheat_parameter::set_next_state()
{
- uint64_t origvalue = m_value;
+ uint64_t const origvalue(m_value);
- // are we a value cheat?
if (!has_itemlist())
{
+ // are we a value cheat?
if (m_value > m_maxval - m_stepval)
m_value = m_maxval;
else
m_value += m_stepval;
}
-
- // if not, we're an item cheat
else
{
- std::vector<std::unique_ptr<item>>::iterator it;
- for (it = m_itemlist.begin(); it != m_itemlist.end(); ++it)
- if (it->get()->value() == m_value)
- break;
- if (it != m_itemlist.end() && (++it != m_itemlist.end()))
- m_value = it->get()->value();
+ // if not, we're an item cheat
+ std::vector<item>::const_iterator it;
+ for (it = m_itemlist.begin(); (m_itemlist.end() != it) && (it->value() != m_value); ++it) { }
+ if ((m_itemlist.end() != it) && (m_itemlist.end() != ++it))
+ m_value = it->value();
}
- return (m_value != origvalue);
+ return m_value != origvalue;
}
@@ -317,37 +314,33 @@ bool cheat_parameter::set_next_state()
// cheat_script - constructor
//-------------------------------------------------
-cheat_script::cheat_script(cheat_manager &manager, symbol_table &symbols, const char *filename, util::xml::data_node const &scriptnode)
+cheat_script::cheat_script(
+ cheat_manager &manager,
+ symbol_table &symbols,
+ char const *filename,
+ util::xml::data_node const &scriptnode)
: m_state(SCRIPT_STATE_RUN)
{
// read the core attributes
- const char *state = scriptnode.get_attribute_string("state", "run");
- if (strcmp(state, "on") == 0)
+ char const *const state(scriptnode.get_attribute_string("state", "run"));
+ if (!std::strcmp(state, "on"))
m_state = SCRIPT_STATE_ON;
- else if (strcmp(state, "off") == 0)
+ else if (!std::strcmp(state, "off"))
m_state = SCRIPT_STATE_OFF;
- else if (strcmp(state, "change") == 0)
+ else if (!std::strcmp(state, "change"))
m_state = SCRIPT_STATE_CHANGE;
- else if (strcmp(state, "run") != 0)
+ else if (std::strcmp(state, "run"))
throw emu_fatalerror("%s.xml(%d): invalid script state '%s'\n", filename, scriptnode.line, state);
// iterate over nodes within the script
for (util::xml::data_node const *entrynode = scriptnode.get_first_child(); entrynode != nullptr; entrynode = entrynode->get_next_sibling())
{
- // handle action nodes
- if (strcmp(entrynode->get_name(), "action") == 0)
+ if (!std::strcmp(entrynode->get_name(), "action")) // handle action nodes
m_entrylist.push_back(std::make_unique<script_entry>(manager, symbols, filename, *entrynode, true));
-
- // handle output nodes
- else if (strcmp(entrynode->get_name(), "output") == 0)
+ else if (!std::strcmp(entrynode->get_name(), "output")) // handle output nodes
m_entrylist.push_back(std::make_unique<script_entry>(manager, symbols, filename, *entrynode, false));
-
- // anything else is ignored
- else
- {
+ else // anything else is ignored
osd_printf_warning("%s.xml(%d): unknown script item '%s' will be lost if saved\n", filename, entrynode->line, entrynode->get_name());
- continue;
- }
}
}
@@ -378,11 +371,11 @@ void cheat_script::save(emu_file &cheatfile) const
cheatfile.printf("\t\t<script");
switch (m_state)
{
- case SCRIPT_STATE_OFF: cheatfile.printf(" state=\"off\""); break;
- case SCRIPT_STATE_ON: cheatfile.printf(" state=\"on\""); break;
- default:
- case SCRIPT_STATE_RUN: cheatfile.printf(" state=\"run\""); break;
- case SCRIPT_STATE_CHANGE: cheatfile.printf(" state=\"change\""); break;
+ case SCRIPT_STATE_OFF: cheatfile.printf(" state=\"off\""); break;
+ case SCRIPT_STATE_ON: cheatfile.printf(" state=\"on\""); break;
+ default:
+ case SCRIPT_STATE_RUN: cheatfile.printf(" state=\"run\""); break;
+ case SCRIPT_STATE_CHANGE: cheatfile.printf(" state=\"change\""); break;
}
cheatfile.printf(">\n");
@@ -399,49 +392,54 @@ void cheat_script::save(emu_file &cheatfile) const
// script_entry - constructor
//-------------------------------------------------
-cheat_script::script_entry::script_entry(cheat_manager &manager, symbol_table &symbols, const char *filename, util::xml::data_node const &entrynode, bool isaction)
- : m_condition(&symbols),
- m_expression(&symbols)
+cheat_script::script_entry::script_entry(
+ cheat_manager &manager,
+ symbol_table &symbols,
+ char const *filename,
+ util::xml::data_node const &entrynode,
+ bool isaction)
+ : m_condition(&symbols)
+ , m_expression(&symbols)
{
- const char *expression = nullptr;
+ char const *expression(nullptr);
try
{
// read the condition if present
expression = entrynode.get_attribute_string("condition", nullptr);
- if (expression != nullptr)
+ if (expression)
m_condition.parse(expression);
- // if this is an action, parse the expression
if (isaction)
{
+ // if this is an action, parse the expression
expression = entrynode.get_value();
- if (expression == nullptr || expression[0] == 0)
+ if (!expression || !expression[0])
throw emu_fatalerror("%s.xml(%d): missing expression in action tag\n", filename, entrynode.line);
m_expression.parse(expression);
}
-
- // otherwise, parse the attributes and arguments
else
{
+ // otherwise, parse the attributes and arguments
+
// extract format
- const char *format = entrynode.get_attribute_string("format", nullptr);
- if (format == nullptr || format[0] == 0)
+ char const *const format(entrynode.get_attribute_string("format", nullptr));
+ if (!format || !format[0])
throw emu_fatalerror("%s.xml(%d): missing format in output tag\n", filename, entrynode.line);
- m_format.assign(format);
+ m_format = format;
// extract other attributes
m_line = entrynode.get_attribute_int("line", 0);
m_justify = ui::text_layout::LEFT;
- const char *align = entrynode.get_attribute_string("align", "left");
- if (strcmp(align, "center") == 0)
+ char const *const align(entrynode.get_attribute_string("align", "left"));
+ if (!std::strcmp(align, "center"))
m_justify = ui::text_layout::CENTER;
- else if (strcmp(align, "right") == 0)
+ else if (!std::strcmp(align, "right"))
m_justify = ui::text_layout::RIGHT;
- else if (strcmp(align, "left") != 0)
+ else if (std::strcmp(align, "left"))
throw emu_fatalerror("%s.xml(%d): invalid alignment '%s' specified\n", filename, entrynode.line, align);
// then parse arguments
- int totalargs = 0;
+ int totalargs(0);
for (util::xml::data_node const *argnode = entrynode.get_child("argument"); argnode != nullptr; argnode = argnode->get_next_sibling("argument"))
{
auto curarg = std::make_unique<output_argument>(manager, symbols, filename, *argnode);
@@ -458,7 +456,7 @@ cheat_script::script_entry::script_entry(cheat_manager &manager, symbol_table &s
validate_format(filename, entrynode.line);
}
}
- catch (expression_error &err)
+ catch (expression_error const &err)
{
throw emu_fatalerror("%s.xml(%d): error parsing cheat expression \"%s\" (%s)\n", filename, entrynode.line, expression, err.code_string());
}
@@ -476,11 +474,11 @@ void cheat_script::script_entry::execute(cheat_manager &manager, uint64_t &argin
{
try
{
- uint64_t result = m_condition.execute();
- if (result == 0)
+ uint64_t const result(m_condition.execute());
+ if (!result)
return;
}
- catch (expression_error &err)
+ catch (expression_error const &err)
{
osd_printf_warning("Error executing conditional expression \"%s\": %s\n", m_condition.original_string(), err.code_string());
return;
@@ -511,14 +509,14 @@ void cheat_script::script_entry::execute(cheat_manager &manager, uint64_t &argin
// generate the astring
manager.get_output_string(m_line, m_justify) = string_format(m_format,
- (uint32_t)params[0], (uint32_t)params[1], (uint32_t)params[2], (uint32_t)params[3],
- (uint32_t)params[4], (uint32_t)params[5], (uint32_t)params[6], (uint32_t)params[7],
- (uint32_t)params[8], (uint32_t)params[9], (uint32_t)params[10], (uint32_t)params[11],
- (uint32_t)params[12], (uint32_t)params[13], (uint32_t)params[14], (uint32_t)params[15],
- (uint32_t)params[16], (uint32_t)params[17], (uint32_t)params[18], (uint32_t)params[19],
- (uint32_t)params[20], (uint32_t)params[21], (uint32_t)params[22], (uint32_t)params[23],
- (uint32_t)params[24], (uint32_t)params[25], (uint32_t)params[26], (uint32_t)params[27],
- (uint32_t)params[28], (uint32_t)params[29], (uint32_t)params[30], (uint32_t)params[31]);
+ params[0], params[1], params[2], params[3],
+ params[4], params[5], params[6], params[7],
+ params[8], params[9], params[10], params[11],
+ params[12], params[13], params[14], params[15],
+ params[16], params[17], params[18], params[19],
+ params[20], params[21], params[22], params[23],
+ params[24], params[25], params[26], params[27],
+ params[28], params[29], params[30], params[31]);
}
}
@@ -529,33 +527,36 @@ void cheat_script::script_entry::execute(cheat_manager &manager, uint64_t &argin
void cheat_script::script_entry::save(emu_file &cheatfile) const
{
- // output an action
if (m_format.empty())
{
+ // output an action
cheatfile.printf("\t\t\t<action");
if (!m_condition.is_empty())
cheatfile.printf(" condition=\"%s\"", cheat_manager::quote_expression(m_condition).c_str());
cheatfile.printf(">%s</action>\n", cheat_manager::quote_expression(m_expression).c_str());
}
-
- // output an output
else
{
+ // output an output
cheatfile.printf("\t\t\t<output format=\"%s\"", m_format.c_str());
if (!m_condition.is_empty())
cheatfile.printf(" condition=\"%s\"", cheat_manager::quote_expression(m_condition).c_str());
+
if (m_line != 0)
cheatfile.printf(" line=\"%d\"", m_line);
+
if (m_justify == ui::text_layout::CENTER)
cheatfile.printf(" align=\"center\"");
else if (m_justify == ui::text_layout::RIGHT)
cheatfile.printf(" align=\"right\"");
+
if (m_arglist.size() == 0)
+ {
cheatfile.printf(" />\n");
-
- // output arguments
+ }
else
{
+ // output arguments
cheatfile.printf(">\n");
for (auto &curarg : m_arglist)
curarg->save(cheatfile);
@@ -573,27 +574,20 @@ void cheat_script::script_entry::save(emu_file &cheatfile) const
void cheat_script::script_entry::validate_format(const char *filename, int line)
{
// first count arguments
- int argsprovided = 0;
+ int argsprovided(0);
for (auto &curarg : m_arglist)
argsprovided += curarg->count();
// now scan the string for valid argument usage
- const char *p = strchr(m_format.c_str(), '%');
int argscounted = 0;
- while (p != nullptr)
+ for (char const *p = strchr(m_format.c_str(), '%'); p; ++argscounted, p = strchr(p, '%'))
{
// skip past any valid attributes
- p++;
- while (strchr("lh0123456789.-+ #", *p) != nullptr)
- p++;
+ for (++p; strchr("lh0123456789.-+ #", *p); ++p) { }
// look for a valid type
- if (strchr("cdiouxX", *p) == nullptr)
+ if (!strchr("cdiouxX", *p))
throw emu_fatalerror("%s.xml(%d): invalid format specification \"%s\"\n", filename, line, m_format.c_str());
- argscounted++;
-
- // look for the next one
- p = strchr(p, '%');
}
// did we match?
@@ -608,16 +602,20 @@ void cheat_script::script_entry::validate_format(const char *filename, int line)
// output_argument - constructor
//-------------------------------------------------
-cheat_script::script_entry::output_argument::output_argument(cheat_manager &manager, symbol_table &symbols, const char *filename, util::xml::data_node const &argnode)
- : m_expression(&symbols),
- m_count(0)
+cheat_script::script_entry::output_argument::output_argument(
+ cheat_manager &manager,
+ symbol_table &symbols,
+ char const *filename,
+ util::xml::data_node const &argnode)
+ : m_expression(&symbols)
+ , m_count(0)
{
// first extract attributes
m_count = argnode.get_attribute_int("count", 1);
// read the expression
- const char *expression = argnode.get_value();
- if (expression == nullptr || expression[0] == 0)
+ char const *const expression(argnode.get_value());
+ if (!expression || !expression[0])
throw emu_fatalerror("%s.xml(%d): missing expression in argument tag\n", filename, argnode.line);
// parse it
@@ -625,7 +623,7 @@ cheat_script::script_entry::output_argument::output_argument(cheat_manager &mana
{
m_expression.parse(expression);
}
- catch (expression_error &err)
+ catch (expression_error const &err)
{
throw emu_fatalerror("%s.xml(%d): error parsing cheat expression \"%s\" (%s)\n", filename, argnode.line, expression, err.code_string());
}
@@ -645,7 +643,7 @@ int cheat_script::script_entry::output_argument::values(uint64_t &argindex, uint
{
result[argindex] = m_expression.execute();
}
- catch (expression_error &err)
+ catch (expression_error const &err)
{
osd_printf_warning("Error executing argument expression \"%s\": %s\n", m_expression.original_string(), err.code_string());
}
@@ -662,7 +660,7 @@ void cheat_script::script_entry::output_argument::save(emu_file &cheatfile) cons
{
cheatfile.printf("\t\t\t\t<argument");
if (m_count != 1)
- cheatfile.printf(" count=\"%d\"", (int)m_count);
+ cheatfile.printf(" count=\"%d\"", int(m_count));
cheatfile.printf(">%s</argument>\n", cheat_manager::quote_expression(m_expression).c_str());
}
@@ -683,75 +681,64 @@ cheat_entry::cheat_entry(cheat_manager &manager, symbol_table &globaltable, cons
, m_numtemp(DEFAULT_TEMP_VARIABLES)
, m_argindex(0)
{
- // reset scripts
- try
+ // pull the variable count out ahead of things
+ int const tempcount(cheatnode.get_attribute_int("tempvariables", DEFAULT_TEMP_VARIABLES));
+ if (tempcount < 1)
+ throw emu_fatalerror("%s.xml(%d): invalid tempvariables attribute (%d)\n", filename, cheatnode.line, tempcount);
+
+ // allocate memory for the cheat
+ m_numtemp = tempcount;
+
+ // get the description
+ char const *const description(cheatnode.get_attribute_string("desc", nullptr));
+ if (!description || !description[0])
+ throw emu_fatalerror("%s.xml(%d): empty or missing desc attribute on cheat\n", filename, cheatnode.line);
+ m_description = description;
+
+ // create the symbol table
+ m_symbols.add("argindex", symbol_table::READ_ONLY, &m_argindex);
+ for (int curtemp = 0; curtemp < tempcount; curtemp++)
+ m_symbols.add(string_format("temp%d", curtemp).c_str(), symbol_table::READ_WRITE);
+
+ // read the first comment node
+ util::xml::data_node const *const commentnode(cheatnode.get_child("comment"));
+ if (commentnode != nullptr)
{
- // pull the variable count out ahead of things
- int tempcount = cheatnode.get_attribute_int("tempvariables", DEFAULT_TEMP_VARIABLES);
- if (tempcount < 1)
- throw emu_fatalerror("%s.xml(%d): invalid tempvariables attribute (%d)\n", filename, cheatnode.line, tempcount);
-
- // allocate memory for the cheat
- m_numtemp = tempcount;
-
- // get the description
- const char *description = cheatnode.get_attribute_string("desc", nullptr);
- if (description == nullptr || description[0] == 0)
- throw emu_fatalerror("%s.xml(%d): empty or missing desc attribute on cheat\n", filename, cheatnode.line);
- m_description = description;
-
- // create the symbol table
- m_symbols.add("argindex", symbol_table::READ_ONLY, &m_argindex);
- for (int curtemp = 0; curtemp < tempcount; curtemp++) {
- m_symbols.add(string_format("temp%d", curtemp).c_str(), symbol_table::READ_WRITE);
- }
-
- // read the first comment node
- util::xml::data_node const *commentnode = cheatnode.get_child("comment");
- if (commentnode != nullptr)
- {
- // set the value if not nullptr
- if (commentnode->get_value() != nullptr && commentnode->get_value()[0] != 0)
- m_comment.assign(commentnode->get_value());
-
- // only one comment is kept
- commentnode = commentnode->get_next_sibling("comment");
- if (commentnode != nullptr)
- osd_printf_warning("%s.xml(%d): only one comment node is retained; ignoring additional nodes\n", filename, commentnode->line);
- }
-
- // read the first parameter node
- util::xml::data_node const *paramnode = cheatnode.get_child("parameter");
- if (paramnode != nullptr)
- {
- // load this parameter
- m_parameter.reset(global_alloc(cheat_parameter(manager, m_symbols, filename, *paramnode)));
-
- // only one parameter allowed
- paramnode = paramnode->get_next_sibling("parameter");
- if (paramnode != nullptr)
- osd_printf_warning("%s.xml(%d): only one parameter node allowed; ignoring additional nodes\n", filename, paramnode->line);
- }
+ // set the value if not nullptr
+ if (commentnode->get_value() && commentnode->get_value()[0])
+ m_comment.assign(commentnode->get_value());
+
+ // only one comment is kept
+ util::xml::data_node const *const nextcomment(commentnode->get_next_sibling("comment"));
+ if (nextcomment)
+ osd_printf_warning("%s.xml(%d): only one comment node is retained; ignoring additional nodes\n", filename, nextcomment->line);
+ }
- // read the script nodes
- for (util::xml::data_node const *scriptnode = cheatnode.get_child("script"); scriptnode != nullptr; scriptnode = scriptnode->get_next_sibling("script"))
- {
- // load this entry
- auto curscript = global_alloc(cheat_script(manager, m_symbols, filename, *scriptnode));
+ // read the first parameter node
+ util::xml::data_node const *const paramnode(cheatnode.get_child("parameter"));
+ if (paramnode != nullptr)
+ {
+ // load this parameter
+ m_parameter.reset(new cheat_parameter(manager, m_symbols, filename, *paramnode));
- // if we have a script already for this slot, it is an error
- std::unique_ptr<cheat_script> &slot = script_for_state(curscript->state());
- if (slot != nullptr)
- osd_printf_warning("%s.xml(%d): only one on script allowed; ignoring additional scripts\n", filename, scriptnode->line);
- else
- slot.reset(curscript);
- }
+ // only one parameter allowed
+ util::xml::data_node const *const nextparam(paramnode->get_next_sibling("parameter"));
+ if (nextparam)
+ osd_printf_warning("%s.xml(%d): only one parameter node allowed; ignoring additional nodes\n", filename, nextparam->line);
}
- catch (emu_fatalerror &)
+
+ // read the script nodes
+ for (util::xml::data_node const *scriptnode = cheatnode.get_child("script"); scriptnode != nullptr; scriptnode = scriptnode->get_next_sibling("script"))
{
- // call our destructor to clean up and re-throw
- this->~cheat_entry();
- throw;
+ // load this entry
+ std::unique_ptr<cheat_script> curscript(new cheat_script(manager, m_symbols, filename, *scriptnode));
+
+ // if we have a script already for this slot, it is an error
+ std::unique_ptr<cheat_script> &slot = script_for_state(curscript->state());
+ if (slot)
+ osd_printf_warning("%s.xml(%d): only one on script allowed; ignoring additional scripts\n", filename, scriptnode->line);
+ else
+ slot = std::move(curscript);
}
}
@@ -772,14 +759,17 @@ cheat_entry::~cheat_entry()
void cheat_entry::save(emu_file &cheatfile) const
{
// determine if we have scripts
- bool has_scripts = (m_off_script != nullptr || m_on_script != nullptr || m_run_script != nullptr || m_change_script != nullptr);
+ bool const has_scripts(m_off_script || m_on_script || m_run_script || m_change_script);
// output the cheat tag
cheatfile.printf("\t<cheat desc=\"%s\"", m_description.c_str());
if (m_numtemp != DEFAULT_TEMP_VARIABLES)
cheatfile.printf(" tempvariables=\"%d\"", m_numtemp);
- if (m_comment.empty() && m_parameter == nullptr && !has_scripts)
+
+ if (m_comment.empty() && !m_parameter && !has_scripts)
+ {
cheatfile.printf(" />\n");
+ }
else
{
cheatfile.printf(">\n");
@@ -789,18 +779,13 @@ void cheat_entry::save(emu_file &cheatfile) const
cheatfile.printf("\t\t<comment><![CDATA[\n%s\n\t\t]]></comment>\n", m_comment.c_str());
// output the parameter, if present
- if (m_parameter != nullptr)
- m_parameter->save(cheatfile);
+ if (m_parameter) m_parameter->save(cheatfile);
// output the script nodes
- if (m_on_script != nullptr)
- m_on_script->save(cheatfile);
- if (m_off_script != nullptr)
- m_off_script->save(cheatfile);
- if (m_change_script != nullptr)
- m_change_script->save(cheatfile);
- if (m_run_script != nullptr)
- m_run_script->save(cheatfile);
+ if (m_on_script) m_on_script->save(cheatfile);
+ if (m_off_script) m_off_script->save(cheatfile);
+ if (m_change_script) m_change_script->save(cheatfile);
+ if (m_run_script) m_run_script->save(cheatfile);
// close the cheat tag
cheatfile.printf("\t</cheat>\n");
@@ -814,23 +799,22 @@ void cheat_entry::save(emu_file &cheatfile) const
bool cheat_entry::activate()
{
- bool changed = false;
+ bool changed(false);
// if cheats have been toggled off no point in even trying to do anything
if (!m_manager.enabled())
return changed;
- // if we're a oneshot cheat, execute the "on" script and indicate change
if (is_oneshot())
{
+ // if we're a oneshot cheat, execute the "on" script and indicate change
execute_on_script();
changed = true;
m_manager.machine().popmessage("Activated %s", m_description.c_str());
}
-
- // if we're a oneshot parameter cheat and we're active, execute the "state change" script and indicate change
- else if (is_oneshot_parameter() && m_state != SCRIPT_STATE_OFF)
+ else if (is_oneshot_parameter() && (m_state != SCRIPT_STATE_OFF))
{
+ // if we're a oneshot parameter cheat and we're active, execute the "state change" script and indicate change
execute_change_script();
changed = true;
m_manager.machine().popmessage("Activated\n %s = %s", m_description.c_str(), m_parameter->text());
@@ -847,15 +831,17 @@ bool cheat_entry::activate()
bool cheat_entry::select_default_state()
{
- bool changed = false;
+ bool changed(false);
- // if we're a oneshot cheat, there is no default state
if (is_oneshot())
- ;
-
- // all other types switch to the "off" state
+ {
+ // if we're a oneshot cheat, there is no default state
+ }
else
+ {
+ // all other types switch to the "off" state
changed = set_state(SCRIPT_STATE_OFF);
+ }
return changed;
}
@@ -868,22 +854,26 @@ bool cheat_entry::select_default_state()
bool cheat_entry::select_previous_state()
{
- bool changed = false;
+ bool changed(false);
- // if we're a oneshot, there is no previous state
if (is_oneshot())
- ;
-
- // if we're on/off, toggle to off
+ {
+ // if we're a oneshot, there is no previous state
+ }
else if (is_onoff())
+ {
+ // if we're on/off, toggle to off
changed = set_state(SCRIPT_STATE_OFF);
-
- // if we have a parameter, set the previous state
+ }
else if (m_parameter != nullptr)
{
+ // if we have a parameter, set the previous state
+
// if we're at our minimum, turn off
if (m_parameter->is_minimum())
+ {
changed = set_state(SCRIPT_STATE_OFF);
+ }
else
{
// if we changed, ensure we are in the running state and signal state change
@@ -896,6 +886,7 @@ bool cheat_entry::select_previous_state()
}
}
}
+
return changed;
}
@@ -907,34 +898,37 @@ bool cheat_entry::select_previous_state()
bool cheat_entry::select_next_state()
{
- bool changed = false;
+ bool changed(false);
- // if we're a oneshot, there is no next state
if (is_oneshot())
- ;
-
- // if we're on/off, toggle to running state
+ {
+ // if we're a oneshot, there is no next state
+ }
else if (is_onoff())
+ {
+ // if we're on/off, toggle to running state
changed = set_state(SCRIPT_STATE_RUN);
-
- // if we have a parameter, set the next state
+ }
else if (m_parameter != nullptr)
{
- // if we're off, switch on to the minimum state
+ // if we have a parameter, set the next state
if (m_state == SCRIPT_STATE_OFF)
{
+ // if we're off, switch on to the minimum state
changed = set_state(SCRIPT_STATE_RUN);
m_parameter->set_minimum_state();
}
-
- // otherwise, switch to the next state
else
+ {
+ // otherwise, switch to the next state
changed = m_parameter->set_next_state();
+ }
// if we changed, signal a state change
if (changed && !is_oneshot_parameter())
execute_change_script();
}
+
return changed;
}
@@ -947,44 +941,43 @@ bool cheat_entry::select_next_state()
void cheat_entry::menu_text(std::string &description, std::string &state, uint32_t &flags)
{
// description is standard
- description.assign(m_description);
+ description = m_description;
state.clear();
flags = 0;
- // some cheat entries are just text for display
if (is_text_only())
{
+ // some cheat entries are just text for display
if (!description.empty())
{
strtrimspace(description);
if (description.empty())
- description.assign(MENU_SEPARATOR_ITEM);
+ description = MENU_SEPARATOR_ITEM;
}
flags = ui::menu::FLAG_DISABLE;
}
-
- // if we have no parameter and no run or off script, it's a oneshot cheat
else if (is_oneshot())
- state.assign("Set");
-
- // if we have no parameter, it's just on/off
+ {
+ // if we have no parameter and no run or off script, it's a oneshot cheat
+ state = "Set";
+ }
else if (is_onoff())
{
- state.assign((m_state == SCRIPT_STATE_RUN) ? "On" : "Off");
+ // if we have no parameter, it's just on/off
+ state = (m_state == SCRIPT_STATE_RUN) ? "On" : "Off";
flags = (m_state != 0) ? ui::menu::FLAG_LEFT_ARROW : ui::menu::FLAG_RIGHT_ARROW;
}
-
- // if we have a value parameter, compute it
else if (m_parameter != nullptr)
{
+ // if we have a value parameter, compute it
if (m_state == SCRIPT_STATE_OFF)
{
- state.assign(is_oneshot_parameter() ? "Set" : "Off");
+ state = is_oneshot_parameter() ? "Set" : "Off";
flags = ui::menu::FLAG_RIGHT_ARROW;
}
else
{
- state.assign(m_parameter->text());
+ state = m_parameter->text();
flags = ui::menu::FLAG_LEFT_ARROW;
if (!m_parameter->is_maximum())
flags |= ui::menu::FLAG_RIGHT_ARROW;
@@ -1007,8 +1000,9 @@ bool cheat_entry::set_state(script_state newstate)
m_state = newstate;
if (newstate == SCRIPT_STATE_OFF)
execute_off_script();
- else if (newstate == SCRIPT_STATE_ON || newstate == SCRIPT_STATE_RUN)
+ else if ((newstate == SCRIPT_STATE_ON) || (newstate == SCRIPT_STATE_RUN))
execute_on_script();
+
return true;
}
@@ -1022,11 +1016,11 @@ std::unique_ptr<cheat_script> &cheat_entry::script_for_state(script_state state)
{
switch (state)
{
- case SCRIPT_STATE_ON: return m_on_script;
- case SCRIPT_STATE_OFF: return m_off_script;
- case SCRIPT_STATE_CHANGE: return m_change_script;
- default:
- case SCRIPT_STATE_RUN: return m_run_script;
+ case SCRIPT_STATE_ON: return m_on_script;
+ case SCRIPT_STATE_OFF: return m_off_script;
+ case SCRIPT_STATE_CHANGE: return m_change_script;
+ default:
+ case SCRIPT_STATE_RUN: return m_run_script;
}
}
@@ -1039,8 +1033,10 @@ std::unique_ptr<cheat_script> &cheat_entry::script_for_state(script_state state)
bool cheat_entry::is_duplicate() const
{
for (auto &scannode : manager().entries())
- if (strcmp(scannode->description(), description()) == 0)
+ {
+ if (!std::strcmp(scannode->description(), description()))
return true;
+ }
return false;
}
@@ -1049,7 +1045,7 @@ bool cheat_entry::is_duplicate() const
// CHEAT MANAGER
//**************************************************************************
-const int cheat_manager::CHEAT_VERSION;
+constexpr int cheat_manager::CHEAT_VERSION;
//-------------------------------------------------
@@ -1057,16 +1053,16 @@ const int cheat_manager::CHEAT_VERSION;
//-------------------------------------------------
cheat_manager::cheat_manager(running_machine &machine)
- : m_machine(machine),
- m_disabled(true),
- m_symtable(&machine)
+ : m_machine(machine)
+ , m_disabled(true)
+ , m_symtable(&machine)
{
// if the cheat engine is disabled, we're done
if (!machine.options().cheat())
return;
- m_output.resize(UI_TARGET_FONT_ROWS*2);
- m_justify.resize(UI_TARGET_FONT_ROWS*2);
+ m_output.resize(UI_TARGET_FONT_ROWS * 2);
+ m_justify.resize(UI_TARGET_FONT_ROWS * 2);
// request a callback
machine.add_notifier(MACHINE_NOTIFY_FRAME, machine_notify_delegate(&cheat_manager::frame_update, this));
@@ -1105,25 +1101,30 @@ void cheat_manager::set_enable(bool enable)
if (!machine().options().cheat())
return;
- // if we're enabled currently and we don't want to be, turn things off
if (!m_disabled && !enable)
{
+ // if we're enabled currently and we don't want to be, turn things off
+
// iterate over running cheats and execute any OFF Scripts
for (auto &cheat : m_cheatlist)
+ {
if (cheat->state() == SCRIPT_STATE_RUN)
cheat->execute_off_script();
+ }
machine().popmessage("Cheats Disabled");
m_disabled = true;
}
-
- // if we're disabled currently and we want to be enabled, turn things on
else if (m_disabled && enable)
{
+ // if we're disabled currently and we want to be enabled, turn things on
+
// iterate over running cheats and execute any ON Scripts
m_disabled = false;
for (auto &cheat : m_cheatlist)
+ {
if (cheat->state() == SCRIPT_STATE_RUN)
cheat->execute_on_script();
+ }
machine().popmessage("Cheats Enabled");
}
}
@@ -1152,6 +1153,7 @@ void cheat_manager::reload()
// load the cheat file, if it's a system that has a software list then try softlist_name/shortname.xml first,
// if it fails to load then try to load via crc32 - basename/crc32.xml ( eg. 01234567.xml )
for (device_image_interface &image : image_interface_iterator(machine().root_device()))
+ {
if (image.exists())
{
// if we are loading through a software list, try to load softlist_name/shortname.xml
@@ -1173,9 +1175,10 @@ void cheat_manager::reload()
}
}
}
+ }
// if we haven't found the cheats yet, load by basename
- if (m_cheatlist.size() == 0)
+ if (m_cheatlist.empty())
load_cheats(machine().basename());
// temporary: save the file back out as output.xml for comparison
@@ -1193,7 +1196,7 @@ bool cheat_manager::save_all(const char *filename)
{
// open the file with the proper name
emu_file cheatfile(machine().options().cheat_path(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- osd_file::error filerr = cheatfile.open(filename, ".xml");
+ osd_file::error const filerr(cheatfile.open(filename, ".xml"));
// if that failed, return nothing
if (filerr != osd_file::error::NONE)
@@ -1215,10 +1218,9 @@ bool cheat_manager::save_all(const char *filename)
cheatfile.printf("</mamecheat>\n");
return true;
}
-
- // catch errors and cleanup
- catch (emu_fatalerror &err)
+ catch (emu_fatalerror const &err)
{
+ // catch errors and cleanup
osd_printf_error("%s\n", err.string());
cheatfile.remove_on_close();
}
@@ -1235,14 +1237,16 @@ void cheat_manager::render_text(mame_ui_manager &mui, render_container &containe
{
// render any text and free it along the way
for (int linenum = 0; linenum < m_output.size(); linenum++)
+ {
if (!m_output[linenum].empty())
{
// output the text
mui.draw_text_full(container, m_output[linenum].c_str(),
- 0.0f, (float)linenum * mui.get_line_height(), 1.0f,
+ 0.0f, float(linenum) * mui.get_line_height(), 1.0f,
m_justify[linenum], ui::text_layout::NEVER, mame_ui_manager::OPAQUE_,
rgb_t::white(), rgb_t::black(), nullptr, nullptr);
}
+ }
}
@@ -1256,17 +1260,16 @@ std::string &cheat_manager::get_output_string(int row, ui::text_layout::text_jus
{
// if the row is not specified, grab the next one
if (row == 0)
- row = (m_lastline >= 0) ? m_lastline + 1 : m_lastline - 1;
+ row = (m_lastline >= 0) ? (m_lastline + 1) : (m_lastline - 1);
// remember the last request
m_lastline = row;
// invert if negative
- row = (row < 0) ? m_numlines + row : row - 1;
+ row = (row < 0) ? (m_numlines + row) : (row - 1);
// clamp within range
- row = std::max(row, 0);
- row = std::min(row, m_numlines - 1);
+ row = std::min(std::max(row, 0), m_numlines - 1);
// return the appropriate string
m_justify[row] = justify;
@@ -1319,9 +1322,9 @@ std::string cheat_manager::quote_expression(const parsed_expression &expression)
uint64_t cheat_manager::execute_frombcd(symbol_table &table, void *ref, int params, const uint64_t *param)
{
- uint64_t value = param[0];
- uint64_t multiplier = 1;
- uint64_t result = 0;
+ uint64_t value(param[0]);
+ uint64_t multiplier(1);
+ uint64_t result(0);
while (value != 0)
{
@@ -1339,9 +1342,9 @@ uint64_t cheat_manager::execute_frombcd(symbol_table &table, void *ref, int para
uint64_t cheat_manager::execute_tobcd(symbol_table &table, void *ref, int params, const uint64_t *param)
{
- uint64_t value = param[0];
- uint64_t result = 0;
- uint8_t shift = 0;
+ uint64_t value(param[0]);
+ uint64_t result(0);
+ uint8_t shift(0);
while (value != 0)
{
@@ -1407,35 +1410,45 @@ void cheat_manager::load_cheats(const char *filename)
throw emu_fatalerror("%s.xml(%d): error parsing XML (%s)\n", filename, error.error_line, error.error_message);
// find the layout node
- util::xml::data_node const *const mamecheatnode = rootnode->get_child("mamecheat");
+ util::xml::data_node const *const mamecheatnode(rootnode->get_child("mamecheat"));
if (mamecheatnode == nullptr)
throw emu_fatalerror("%s.xml: missing mamecheatnode node", filename);
// validate the config data version
- int version = mamecheatnode->get_attribute_int("version", 0);
+ int const version(mamecheatnode->get_attribute_int("version", 0));
if (version != CHEAT_VERSION)
throw emu_fatalerror("%s.xml(%d): Invalid cheat XML file: unsupported version", filename, mamecheatnode->line);
// parse all the elements
for (util::xml::data_node const *cheatnode = mamecheatnode->get_child("cheat"); cheatnode != nullptr; cheatnode = cheatnode->get_next_sibling("cheat"))
{
- // load this entry
- auto curcheat = std::make_unique<cheat_entry>(*this, m_symtable, filename, *cheatnode);
-
- // make sure we're not a duplicate
- if (REMOVE_DUPLICATE_CHEATS && curcheat->is_duplicate())
+ try
{
- osd_printf_verbose("Ignoring duplicate cheat '%s' from file %s\n", curcheat->description(), cheatfile.fullpath());
+ // load this entry
+ auto curcheat = std::make_unique<cheat_entry>(*this, m_symtable, filename, *cheatnode);
+
+ // make sure we're not a duplicate
+ if (REMOVE_DUPLICATE_CHEATS && curcheat->is_duplicate())
+ {
+ osd_printf_verbose("Ignoring duplicate cheat '%s' from file %s\n", curcheat->description(), cheatfile.fullpath());
+ }
+ else
+ {
+ // add to the end of the list
+ m_cheatlist.push_back(std::move(curcheat));
+ }
+ }
+ catch (emu_fatalerror const &err)
+ {
+ // just move on to the next cheat
+ osd_printf_error("%s\n", err.string());
}
- else // add to the end of the list
- m_cheatlist.push_back(std::move(curcheat));
}
}
}
-
- // handle errors cleanly
- catch (emu_fatalerror &err)
+ catch (emu_fatalerror const &err)
{
+ // handle errors cleanly
osd_printf_error("%s\n", err.string());
m_cheatlist.clear();
}
diff --git a/src/frontend/mame/cheat.h b/src/frontend/mame/cheat.h
index eaba3650e7e..93b7d1ebfb8 100644
--- a/src/frontend/mame/cheat.h
+++ b/src/frontend/mame/cheat.h
@@ -8,10 +8,10 @@
***************************************************************************/
-#pragma once
+#ifndef MAME_FRONTEND_CHEAT_H
+#define MAME_FRONTEND_CHEAT_H
-#ifndef __CHEAT_H__
-#define __CHEAT_H__
+#pragma once
#include "debug/express.h"
#include "debug/debugcpu.h"
@@ -50,12 +50,20 @@ class number_and_format
{
public:
// construction/destruction
- number_and_format(uint64_t value = 0, util::xml::data_node::int_format format = util::xml::data_node::int_format::DECIMAL)
+ constexpr number_and_format(
+ uint64_t value = 0,
+ util::xml::data_node::int_format format = util::xml::data_node::int_format::DECIMAL)
: m_value(value)
, m_format(format)
{
}
+ // copyable/movable
+ constexpr number_and_format(number_and_format const &) = default;
+ number_and_format(number_and_format &&) = default;
+ number_and_format &operator=(number_and_format const &) = default;
+ number_and_format &operator=(number_and_format &&) = default;
+
// pass-through to look like a regular number
operator uint64_t &() { return m_value; }
operator const uint64_t &() const { return m_value; }
@@ -77,13 +85,17 @@ class cheat_parameter
{
public:
// construction/destruction
- cheat_parameter(cheat_manager &manager, symbol_table &symbols, const char *filename, util::xml::data_node const &paramnode);
+ cheat_parameter(
+ cheat_manager &manager,
+ symbol_table &symbols,
+ char const *filename,
+ util::xml::data_node const &paramnode);
// queries
- const char *text();
- bool has_itemlist() const { return (m_itemlist.size() != 0); }
- bool is_minimum() const { return (m_value == ((m_itemlist.size() == 0) ? m_minval : m_itemlist.front()->value())); }
- bool is_maximum() const { return (m_value == ((m_itemlist.size() == 0) ? m_maxval : m_itemlist.back()->value())); }
+ char const *text();
+ bool has_itemlist() const { return !m_itemlist.empty(); }
+ bool is_minimum() const { return (m_itemlist.empty() ? m_minval : m_itemlist.front().value()) == m_value; }
+ bool is_maximum() const { return (m_itemlist.empty() ? m_maxval : m_itemlist.back().value()) == m_value; }
// state setters
bool set_minimum_state();
@@ -102,25 +114,32 @@ private:
item(const char *text, uint64_t value, util::xml::data_node::int_format valformat)
: m_text(text)
, m_value(value, valformat)
- { }
+ {
+ }
+
+ // copyable/movable
+ item(item const &) = default;
+ item(item &&) = default;
+ item &operator=(item const &) = default;
+ item &operator=(item &&) = default;
// getters
- const number_and_format &value() const { return m_value; }
- const char *text() const { return m_text.c_str(); }
+ number_and_format const &value() const { return m_value; }
+ char const *text() const { return m_text.c_str(); }
private:
// internal state
- std::string m_text; // name of the item
- number_and_format m_value; // value of the item
+ std::string m_text; // name of the item
+ number_and_format m_value; // value of the item
};
// internal state
- number_and_format m_minval; // minimum value
- number_and_format m_maxval; // maximum value
- number_and_format m_stepval; // step value
- uint64_t m_value; // live value of the parameter
- std::string m_curtext; // holding for a value string
- std::vector<std::unique_ptr<item>> m_itemlist; // list of items
+ number_and_format m_minval; // minimum value
+ number_and_format m_maxval; // maximum value
+ number_and_format m_stepval; // step value
+ uint64_t m_value; // live value of the parameter
+ std::string m_curtext; // holding for a value string
+ std::vector<item> m_itemlist; // list of items
};
@@ -131,7 +150,11 @@ class cheat_script
{
public:
// construction/destruction
- cheat_script(cheat_manager &manager, symbol_table &symbols, const char *filename, util::xml::data_node const &scriptnode);
+ cheat_script(
+ cheat_manager &manager,
+ symbol_table &symbols,
+ char const *filename,
+ util::xml::data_node const &scriptnode);
// getters
script_state state() const { return m_state; }
@@ -146,7 +169,12 @@ private:
{
public:
// construction/destruction
- script_entry(cheat_manager &manager, symbol_table &symbols, const char *filename, util::xml::data_node const &entrynode, bool isaction);
+ script_entry(
+ cheat_manager &manager,
+ symbol_table &symbols,
+ char const *filename,
+ util::xml::data_node const &entrynode,
+ bool isaction);
// actions
void execute(cheat_manager &manager, uint64_t &argindex);
@@ -158,7 +186,11 @@ private:
{
public:
// construction/destruction
- output_argument(cheat_manager &manager, symbol_table &symbols, const char *filename, util::xml::data_node const &argnode);
+ output_argument(
+ cheat_manager &manager,
+ symbol_table &symbols,
+ char const *filename,
+ util::xml::data_node const &argnode);
// getters
int count() const { return m_count; }
@@ -169,28 +201,28 @@ private:
private:
// internal state
- parsed_expression m_expression; // expression for argument
- uint64_t m_count; // number of repetitions
+ parsed_expression m_expression; // expression for argument
+ uint64_t m_count; // number of repetitions
};
// internal helpers
- void validate_format(const char *filename, int line);
+ void validate_format(char const *filename, int line);
// internal state
- parsed_expression m_condition; // condition under which this is executed
- parsed_expression m_expression; // expression to execute
- std::string m_format; // string format to print
- std::vector<std::unique_ptr<output_argument>> m_arglist; // list of arguments
- int8_t m_line; // which line to print on
- ui::text_layout::text_justify m_justify; // justification when printing
+ parsed_expression m_condition; // condition under which this is executed
+ parsed_expression m_expression; // expression to execute
+ std::string m_format; // string format to print
+ std::vector<std::unique_ptr<output_argument>> m_arglist; // list of arguments
+ int8_t m_line; // which line to print on
+ ui::text_layout::text_justify m_justify; // justification when printing
// constants
- static const int MAX_ARGUMENTS = 32;
+ static constexpr int MAX_ARGUMENTS = 32;
};
// internal state
- std::vector<std::unique_ptr<script_entry>> m_entrylist; // list of actions to perform
- script_state m_state; // which state this script is for
+ std::vector<std::unique_ptr<script_entry>> m_entrylist; // list of actions to perform
+ script_state m_state; // which state this script is for
};
@@ -250,21 +282,21 @@ private:
std::unique_ptr<cheat_script> &script_for_state(script_state state);
// internal state
- cheat_manager & m_manager; // reference to our manager
- std::string m_description; // string description/menu title
- std::string m_comment; // comment data
- std::unique_ptr<cheat_parameter> m_parameter; // parameter
- std::unique_ptr<cheat_script> m_on_script; // script to run when turning on
- std::unique_ptr<cheat_script> m_off_script; // script to run when turning off
- std::unique_ptr<cheat_script> m_change_script; // script to run when value changes
- std::unique_ptr<cheat_script> m_run_script; // script to run each frame when on
- symbol_table m_symbols; // symbol table for this cheat
- script_state m_state; // current cheat state
- uint32_t m_numtemp; // number of temporary variables
- uint64_t m_argindex; // argument index variable
+ cheat_manager & m_manager; // reference to our manager
+ std::string m_description; // string description/menu title
+ std::string m_comment; // comment data
+ std::unique_ptr<cheat_parameter> m_parameter; // parameter
+ std::unique_ptr<cheat_script> m_on_script; // script to run when turning on
+ std::unique_ptr<cheat_script> m_off_script; // script to run when turning off
+ std::unique_ptr<cheat_script> m_change_script; // script to run when value changes
+ std::unique_ptr<cheat_script> m_run_script; // script to run each frame when on
+ symbol_table m_symbols; // symbol table for this cheat
+ script_state m_state; // current cheat state
+ uint32_t m_numtemp; // number of temporary variables
+ uint64_t m_argindex; // argument index variable
// constants
- static const int DEFAULT_TEMP_VARIABLES = 10;
+ static constexpr int DEFAULT_TEMP_VARIABLES = 10;
};
@@ -280,10 +312,10 @@ public:
// getters
running_machine &machine() const { return m_machine; }
bool enabled() const { return !m_disabled; }
- const std::vector<std::unique_ptr<cheat_entry>> &entries() const { return m_cheatlist; }
+ std::vector<std::unique_ptr<cheat_entry>> const &entries() const { return m_cheatlist; }
// setters
- void set_enable(bool enable = true);
+ void set_enable(bool enable);
// actions
void reload();
@@ -294,30 +326,30 @@ public:
std::string &get_output_string(int row, ui::text_layout::text_justify justify);
// global helpers
- static std::string quote_expression(const parsed_expression &expression);
- static uint64_t execute_frombcd(symbol_table &table, void *ref, int params, const uint64_t *param);
- static uint64_t execute_tobcd(symbol_table &table, void *ref, int params, const uint64_t *param);
+ static std::string quote_expression(parsed_expression const &expression);
+ static uint64_t execute_frombcd(symbol_table &table, void *ref, int params, uint64_t const *param);
+ static uint64_t execute_tobcd(symbol_table &table, void *ref, int params, uint64_t const *param);
private:
// internal helpers
void frame_update();
- void load_cheats(const char *filename);
+ void load_cheats(char const *filename);
// internal state
- running_machine & m_machine; // reference to our machine
- std::vector<std::unique_ptr<cheat_entry>> m_cheatlist; // cheat list
- uint64_t m_framecount; // frame count
- std::vector<std::string> m_output; // array of output strings
- std::vector<ui::text_layout::text_justify> m_justify; // justification for each string
- uint8_t m_numlines; // number of lines available for output
- int8_t m_lastline; // last line used for output
- bool m_disabled; // true if the cheat engine is disabled
- symbol_table m_symtable; // global symbol table
- std::unique_ptr<debugger_cpu> m_cpu; // debugger interface for cpus/memory
+ running_machine & m_machine; // reference to our machine
+ std::vector<std::unique_ptr<cheat_entry>> m_cheatlist; // cheat list
+ uint64_t m_framecount; // frame count
+ std::vector<std::string> m_output; // array of output strings
+ std::vector<ui::text_layout::text_justify> m_justify; // justification for each string
+ uint8_t m_numlines; // number of lines available for output
+ int8_t m_lastline; // last line used for output
+ bool m_disabled; // true if the cheat engine is disabled
+ symbol_table m_symtable; // global symbol table
+ std::unique_ptr<debugger_cpu> m_cpu; // debugger interface for cpus/memory
// constants
static constexpr int CHEAT_VERSION = 1;
};
-#endif /* __CHEAT_H__ */
+#endif /* MAME_FRONTEND_CHEAT_H */
diff --git a/src/frontend/mame/clifront.cpp b/src/frontend/mame/clifront.cpp
index fd785ef8139..049b8fe10e8 100644
--- a/src/frontend/mame/clifront.cpp
+++ b/src/frontend/mame/clifront.cpp
@@ -30,6 +30,7 @@
#include "language.h"
#include "pluginopts.h"
+#include <algorithm>
#include <new>
#include <ctype.h>
@@ -650,13 +651,6 @@ void cli_frontend::listsamples(const char *gamename)
// referenced by a given game or set of games
//-------------------------------------------------
-int cli_frontend::compare_devices(const void *i1, const void *i2)
-{
- device_t *dev1 = *(device_t **)i1;
- device_t *dev2 = *(device_t **)i2;
- return strcmp(dev1->tag(), dev2->tag());
-}
-
void cli_frontend::listdevices(const char *gamename)
{
// determine which drivers to output; return an error if none found
@@ -680,7 +674,9 @@ void cli_frontend::listdevices(const char *gamename)
device_list.push_back(&device);
// sort them by tag
- qsort(&device_list[0], device_list.size(), sizeof(device_list[0]), compare_devices);
+ std::sort(device_list.begin(), device_list.end(), [](device_t *dev1, device_t *dev2) {
+ return strcmp(dev1->tag(), dev2->tag()) < 0;
+ });
// dump the results
for (auto device : device_list)
diff --git a/src/frontend/mame/clifront.h b/src/frontend/mame/clifront.h
index 4e3958cd5c3..544c2bbe15b 100644
--- a/src/frontend/mame/clifront.h
+++ b/src/frontend/mame/clifront.h
@@ -43,7 +43,6 @@ public:
void listcrc(const char *gamename = "*");
void listroms(const char *gamename = "*");
void listsamples(const char *gamename = "*");
- static int compare_devices(const void *i1, const void *i2);
void listdevices(const char *gamename = "*");
void listslots(const char *gamename = "*");
void listmedia(const char *gamename = "*");
diff --git a/src/frontend/mame/luaengine.cpp b/src/frontend/mame/luaengine.cpp
index 34d9c769338..a1ecf792d8e 100644
--- a/src/frontend/mame/luaengine.cpp
+++ b/src/frontend/mame/luaengine.cpp
@@ -769,6 +769,12 @@ void lua_engine::initialize()
return sol::make_object(sol(), sol::nil);
return sol::make_object(sol(), driver_list::driver(i));
};
+ emu["wait"] = lua_CFunction([](lua_State *L) {
+ lua_engine *engine = mame_machine_manager::instance()->lua();
+ luaL_argcheck(L, lua_isnumber(L, 1), 1, "waiting duration expected");
+ engine->machine().scheduler().timer_set(attotime::from_double(lua_tonumber(L, 1)), timer_expired_delegate(FUNC(lua_engine::resume), engine), 0, L);
+ return lua_yield(L, 0);
+ });
emu.new_usertype<emu_file>("file", sol::call_constructor, sol::constructors<sol::types<const char *, uint32_t>>(),
"read", [](emu_file &file, sol::buffer *buff) { buff->set_len(file.read(buff->get_ptr(), buff->get_len())); return buff; },
@@ -1709,6 +1715,17 @@ void lua_engine::close()
lua_close(m_lua_state);
}
+void lua_engine::resume(void *ptr, int nparam)
+{
+ lua_State *L = static_cast<lua_State *>(ptr);
+ int stat = lua_resume(L, nullptr, 0);
+ if((stat != LUA_OK) && (stat != LUA_YIELD))
+ {
+ osd_printf_error("[LUA ERROR] in resume: %s\n", lua_tostring(L, -1));
+ lua_pop(L, 1);
+ }
+}
+
void lua_engine::run(sol::load_result res)
{
if(res.valid())
diff --git a/src/frontend/mame/luaengine.h b/src/frontend/mame/luaengine.h
index b03fabb1f8b..dfc860f21e5 100644
--- a/src/frontend/mame/luaengine.h
+++ b/src/frontend/mame/luaengine.h
@@ -120,6 +120,7 @@ private:
void on_machine_resume();
void on_machine_frame();
+ void resume(void *ptr, int nparam);
void register_function(sol::function func, const char *id);
bool execute_function(const char *id);
sol::object call_plugin(const std::string &name, sol::object in);
diff --git a/src/lib/formats/apd_dsk.cpp b/src/lib/formats/apd_dsk.cpp
new file mode 100644
index 00000000000..3c972c25e49
--- /dev/null
+++ b/src/lib/formats/apd_dsk.cpp
@@ -0,0 +1,145 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/*********************************************************************
+
+ formats/apd_dsk.c
+
+ Archimedes Protected Disk Image format
+
+*********************************************************************/
+
+#include <zlib.h>
+#include "formats/apd_dsk.h"
+
+static const uint8_t APD_HEADER[8] = { 'A', 'P', 'D', 'X', '0', '0', '0', '1' };
+static const uint8_t GZ_HEADER[2] = { 0x1f, 0x8b };
+
+apd_format::apd_format()
+{
+}
+
+const char *apd_format::name() const
+{
+ return "apd";
+}
+
+const char *apd_format::description() const
+{
+ return "Archimedes Protected Disk Image";
+}
+
+const char *apd_format::extensions() const
+{
+ return "apd";
+}
+
+int apd_format::identify(io_generic *io, uint32_t form_factor)
+{
+ uint64_t size = io_generic_size(io);
+ std::vector<uint8_t> img(size);
+ io_generic_read(io, &img[0], 0, size);
+
+ int err;
+ std::vector<uint8_t> gz_ptr(8);
+ z_stream d_stream;
+
+ if (!memcmp(&img[0], GZ_HEADER, sizeof(GZ_HEADER))) {
+ d_stream.zalloc = nullptr;
+ d_stream.zfree = nullptr;
+ d_stream.opaque = nullptr;
+ d_stream.next_in = &img[0];
+ d_stream.avail_in = size;
+ d_stream.next_out = &gz_ptr[0];
+ d_stream.avail_out = 8;
+
+ err = inflateInit2(&d_stream, MAX_WBITS | 16);
+ if (err != Z_OK) return 0;
+
+ err = inflate(&d_stream, Z_SYNC_FLUSH);
+ if (err != Z_OK) return 0;
+
+ err = inflateEnd(&d_stream);
+ if (err != Z_OK) return 0;
+
+ img = gz_ptr;
+ }
+
+ if (!memcmp(&img[0], APD_HEADER, sizeof(APD_HEADER))) {
+ return 100;
+ }
+
+ return 0;
+}
+
+bool apd_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
+{
+ uint64_t size = io_generic_size(io);
+ std::vector<uint8_t> img(size);
+ io_generic_read(io, &img[0], 0, size);
+
+ int err;
+ std::vector<uint8_t> gz_ptr;
+ z_stream d_stream;
+ int inflate_size = (img[size - 1] << 24) | (img[size - 2] << 16) | (img[size - 3] << 8) | img[size - 4];
+ uint8_t *in_ptr = &img[0];
+
+ if (!memcmp(&img[0], GZ_HEADER, sizeof(GZ_HEADER))) {
+ gz_ptr.resize(inflate_size);
+
+ d_stream.zalloc = nullptr;
+ d_stream.zfree = nullptr;
+ d_stream.opaque = nullptr;
+ d_stream.next_in = in_ptr;
+ d_stream.avail_in = size;
+ d_stream.next_out = &gz_ptr[0];
+ d_stream.avail_out = inflate_size;
+
+ err = inflateInit2(&d_stream, MAX_WBITS | 16);
+ if (err != Z_OK) {
+ LOG_FORMATS("inflateInit2 error: %d\n", err);
+ return false;
+ }
+ err = inflate(&d_stream, Z_FINISH);
+ if (err != Z_STREAM_END && err != Z_OK) {
+ LOG_FORMATS("inflate error: %d\n", err);
+ return false;
+ }
+ err = inflateEnd(&d_stream);
+ if (err != Z_OK) {
+ LOG_FORMATS("inflateEnd error: %d\n", err);
+ return false;
+ }
+ size = inflate_size;
+ img = gz_ptr;
+ }
+
+ int data = 0x7d0;
+ for (int track = 0; track < 166; track++) {
+ uint32_t sdlen = little_endianize_int32(*(uint32_t *)(&img[(track * 12) + 8 + 0x0]));
+ uint32_t ddlen = little_endianize_int32(*(uint32_t *)(&img[(track * 12) + 8 + 0x4]));
+ uint32_t qdlen = little_endianize_int32(*(uint32_t *)(&img[(track * 12) + 8 + 0x8]));
+
+ if (sdlen > 0) {
+ generate_track_from_bitstream(track / 2, track % 2, &img[data], sdlen, image);
+ data += (sdlen + 7) >> 3;
+ }
+ if (ddlen > 0) {
+ generate_track_from_bitstream(track / 2, track % 2, &img[data], ddlen, image);
+ data += (ddlen + 7) >> 3;
+ }
+ if (qdlen > 0) {
+ generate_track_from_bitstream(track / 2, track % 2, &img[data], qdlen, image);
+ data += (qdlen + 7) >> 3;
+ }
+ }
+ image->set_variant(floppy_image::DSDD);
+
+ return true;
+}
+
+bool apd_format::supports_save() const
+{
+ return false;
+}
+
+const floppy_format_type FLOPPY_APD_FORMAT = &floppy_image_format_creator<apd_format>;
diff --git a/src/lib/formats/apd_dsk.h b/src/lib/formats/apd_dsk.h
new file mode 100644
index 00000000000..3bf40055a7b
--- /dev/null
+++ b/src/lib/formats/apd_dsk.h
@@ -0,0 +1,31 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/*********************************************************************
+
+ formats/apd_dsk.h
+
+ Archimedes Protected Disk Image format
+
+*********************************************************************/
+
+#ifndef APD_DSK_H_
+#define APD_DSK_H_
+
+#include "flopimg.h"
+
+class apd_format : public floppy_image_format_t {
+public:
+ apd_format();
+
+ virtual const char *name() const override;
+ virtual const char *description() const override;
+ virtual const char *extensions() const override;
+
+ virtual int identify(io_generic *io, uint32_t form_factor) override;
+ virtual bool load(io_generic *io, uint32_t form_factor, floppy_image *image) override;
+ virtual bool supports_save() const override;
+};
+
+extern const floppy_format_type FLOPPY_APD_FORMAT;
+
+#endif
diff --git a/src/lib/formats/tzx_cas.cpp b/src/lib/formats/tzx_cas.cpp
index 748f0227c65..7f03be7977a 100644
--- a/src/lib/formats/tzx_cas.cpp
+++ b/src/lib/formats/tzx_cas.cpp
@@ -8,7 +8,6 @@ TODO:
Add support for the remaining block types:
case 0x15: Direct Recording
case 0x18: CSW Recording
- case 0x19: Generalized Data Block
case 0x21: Group Start
case 0x22: Group End
case 0x23: Jump To Block
@@ -31,7 +30,7 @@ Notes:
TZX format specification lists
8064 pulses for a header block and 3220 for a data block
-but the documentaiton on worldofspectrum lists
+but the documentation on worldofspectrum lists
8063 pulses for a header block and 3223 for a data block
see http://www.worldofspectrum.org/faq/reference/48kreference.htm#TapeDataStructure
@@ -315,7 +314,6 @@ static int tzx_handle_direct(int16_t **buffer, const uint8_t *bytes, int pause,
tzx_output_wave(buffer, samples);
size += samples;
-
}
}
@@ -342,8 +340,6 @@ static inline int tzx_handle_symbol(int16_t **buffer, const uint8_t *symtable, u
uint8_t starttype = cursymb[0];
-// printf("start polarity %01x (max number of symbols is %d)\n", starttype, maxp);
-
switch (starttype)
{
case 0x00:
@@ -371,7 +367,6 @@ static inline int tzx_handle_symbol(int16_t **buffer, const uint8_t *symtable, u
for (int i = 0; i < maxp; i++)
{
uint16_t pulse_length = cursymb[1 + (i*2)] | (cursymb[2 + (i*2)] << 8);
- // printf("pulse_length %04x\n", pulse_length);
// shorter lists can be terminated with a pulse_length of 0
if (pulse_length != 0)
@@ -380,7 +375,6 @@ static inline int tzx_handle_symbol(int16_t **buffer, const uint8_t *symtable, u
tzx_output_wave(buffer, samples);
size += samples;
toggle_wave_data();
-
}
else
{
@@ -390,8 +384,6 @@ static inline int tzx_handle_symbol(int16_t **buffer, const uint8_t *symtable, u
}
}
- //toggle_wave_data();
-
return size;
}
@@ -405,7 +397,6 @@ static inline int stream_get_bit(const uint8_t *bytes, uint8_t &stream_bit, uint
if (byte & 0x80) retbit = 1;
-
stream_bit++;
if (stream_bit == 8)
@@ -433,34 +424,26 @@ static int tzx_handle_generalized(int16_t **buffer, const uint8_t *bytes, int pa
{
uint8_t symbol = table2[i + 0];
uint16_t repetitions = table2[i + 1] + (table2[i + 2] << 8);
- //printf("symbol %02x repititions %04x\n", symbol, repetitions); // does 1 mean repeat once, or that it only occurs once?
+ //printf("symbol %02x repetitions %04x\n", symbol, repetitions); // does 1 mean repeat once, or that it only occurs once?
for (int j = 0; j < repetitions; j++)
{
size += tzx_handle_symbol(buffer, symtable, symbol, npp);
- // toggle_wave_data();
}
-
-
}
// advance to after this data
bytes += ((2 * npp + 1)*asp) + totp * 3;
}
- else
- {
- printf("no pilot block\n");
- }
if (totd > 0)
{
- printf("data block table %04x (has %0d symbols, max symbol length is %d)\n", totd, asd, npd);
+ // printf("data block table %04x (has %0d symbols, max symbol length is %d)\n", totd, asd, npd);
const uint8_t *symtable = bytes;
const uint8_t *table2 = bytes + (2 * npd + 1)*asd;
int NB = ceil(compute_log2(asd)); // number of bits needed to represent each symbol
- printf("NB is %d\n", NB);
uint8_t stream_bit = 0;
uint32_t stream_byte = 0;
@@ -475,16 +458,8 @@ static int tzx_handle_generalized(int16_t **buffer, const uint8_t *bytes, int pa
}
size += tzx_handle_symbol(buffer, symtable, symbol, npd);
-
- //toggle_wave_data();
}
}
- else
- {
- printf("no data block\n");
- }
-
-
/* pause */
if (pause > 0)
@@ -505,9 +480,7 @@ static int tzx_handle_generalized(int16_t **buffer, const uint8_t *bytes, int pa
static void ascii_block_common_log( const char *block_type_string, uint8_t block_type )
{
- LOG_FORMATS("%s (type %02x) encountered.\n", block_type_string, block_type);
- LOG_FORMATS("This block contains info on the .tzx file you are loading.\n");
- LOG_FORMATS("Please include the following info in your bug reports, if the image has issue in M.E.S.S.\n");
+ LOG_FORMATS("%s (type %02x) encountered:\n", block_type_string, block_type);
}
static const char *const archive_ident[] =
@@ -744,20 +717,18 @@ static int tzx_cas_do_work( int16_t **buffer )
{
// having this missing is fatal
// used crudely by batmanc in spectrum_cass list (which is just a redundant encoding of batmane ?)
- printf("Unsupported block type (0x19 - Generalized Data Block) encountered.\n");
-
data_size = cur_block[1] + (cur_block[2] << 8) + (cur_block[3] << 16) + (cur_block[4] << 24);
pause_time= cur_block[5] + (cur_block[6] << 8);
uint32_t totp = cur_block[7] + (cur_block[8] << 8) + (cur_block[9] << 16) + (cur_block[10] << 24);
int npp = cur_block[11];
int asp = cur_block[12];
- if (asp == 0) asp = 256;
+ if (asp == 0 && totp > 0) asp = 256;
uint32_t totd = cur_block[13] + (cur_block[14] << 8) + (cur_block[15] << 16) + (cur_block[16] << 24);
int npd = cur_block[17];
int asd = cur_block[18];
- if (asd == 0) asd = 256;
+ if (asd == 0 && totd > 0) asd = 256;
size += tzx_handle_generalized(buffer, &cur_block[19], pause_time, data_size, totp, npp, asp, totd, npd, asd);
@@ -840,7 +811,7 @@ static int tap_cas_to_wav_size( const uint8_t *casdata, int caslen )
{
int data_size = p[0] + (p[1] << 8);
int pilot_length = (p[2] == 0x00) ? 8064 : 3220; /* TZX specification */
-// int pilot_length = (p[2] == 0x00) ? 8063 : 3223; /* worldofspectrum */
+// int pilot_length = (p[2] == 0x00) ? 8063 : 3223; /* worldofspectrum */
LOG_FORMATS("tap_cas_to_wav_size: Handling TAP block containing 0x%X bytes", data_size);
p += 2;
size += tzx_cas_handle_block(nullptr, p, 1000, data_size, 2168, pilot_length, 667, 735, 855, 1710, 8);
@@ -859,7 +830,7 @@ static int tap_cas_fill_wave( int16_t *buffer, int length, uint8_t *bytes )
{
int data_size = bytes[0] + (bytes[1] << 8);
int pilot_length = (bytes[2] == 0x00) ? 8064 : 3220; /* TZX specification */
-// int pilot_length = (bytes[2] == 0x00) ? 8063 : 3223; /* worldofspectrum */
+// int pilot_length = (bytes[2] == 0x00) ? 8063 : 3223; /* worldofspectrum */
LOG_FORMATS("tap_cas_fill_wave: Handling TAP block containing 0x%X bytes\n", data_size);
bytes += 2;
size += tzx_cas_handle_block(&p, bytes, 1000, data_size, 2168, pilot_length, 667, 735, 855, 1710, 8);
@@ -871,34 +842,34 @@ static int tap_cas_fill_wave( int16_t *buffer, int length, uint8_t *bytes )
static const struct CassetteLegacyWaveFiller tzx_legacy_fill_wave =
{
tzx_cas_fill_wave, /* fill_wave */
- -1, /* chunk_size */
- 0, /* chunk_samples */
- tzx_cas_to_wav_size, /* chunk_sample_calc */
+ -1, /* chunk_size */
+ 0, /* chunk_samples */
+ tzx_cas_to_wav_size, /* chunk_sample_calc */
TZX_WAV_FREQUENCY, /* sample_frequency */
- 0, /* header_samples */
- 0 /* trailer_samples */
+ 0, /* header_samples */
+ 0 /* trailer_samples */
};
static const struct CassetteLegacyWaveFiller tap_legacy_fill_wave =
{
tap_cas_fill_wave, /* fill_wave */
- -1, /* chunk_size */
- 0, /* chunk_samples */
- tap_cas_to_wav_size, /* chunk_sample_calc */
+ -1, /* chunk_size */
+ 0, /* chunk_samples */
+ tap_cas_to_wav_size, /* chunk_sample_calc */
TZX_WAV_FREQUENCY, /* sample_frequency */
- 0, /* header_samples */
- 0 /* trailer_samples */
+ 0, /* header_samples */
+ 0 /* trailer_samples */
};
static const struct CassetteLegacyWaveFiller cdt_legacy_fill_wave =
{
cdt_cas_fill_wave, /* fill_wave */
- -1, /* chunk_size */
- 0, /* chunk_samples */
- tzx_cas_to_wav_size, /* chunk_sample_calc */
+ -1, /* chunk_size */
+ 0, /* chunk_samples */
+ tzx_cas_to_wav_size, /* chunk_sample_calc */
TZX_WAV_FREQUENCY, /* sample_frequency */
- 0, /* header_samples */
- 0 /* trailer_samples */
+ 0, /* header_samples */
+ 0 /* trailer_samples */
};
static cassette_image::error tzx_cassette_identify( cassette_image *cassette, struct CassetteOptions *opts )
@@ -931,7 +902,7 @@ static cassette_image::error cdt_cassette_load( cassette_image *cassette )
return cassette_legacy_construct(cassette, &cdt_legacy_fill_wave);
}
-static const struct CassetteFormat tzx_cassette_format =
+const struct CassetteFormat tzx_cassette_format =
{
"tzx",
tzx_cassette_identify,
diff --git a/src/lib/formats/tzx_cas.h b/src/lib/formats/tzx_cas.h
index 8610fb0cdd4..2db31245310 100644
--- a/src/lib/formats/tzx_cas.h
+++ b/src/lib/formats/tzx_cas.h
@@ -12,6 +12,8 @@
#include "cassimg.h"
+extern const struct CassetteFormat tzx_cassette_format;
+
CASSETTE_FORMATLIST_EXTERN(tzx_cassette_formats);
CASSETTE_FORMATLIST_EXTERN(cdt_cassette_formats);
diff --git a/src/lib/formats/zx81_p.cpp b/src/lib/formats/zx81_p.cpp
index 7f359ccaca3..9fa5814385f 100644
--- a/src/lib/formats/zx81_p.cpp
+++ b/src/lib/formats/zx81_p.cpp
@@ -34,6 +34,7 @@ medium transfer rate is approx. 307 bps (38 bytes/sec) for files that contain
#include <assert.h>
#include "zx81_p.h"
+#include "tzx_cas.h"
#define WAVEENTRY_LOW -32768
@@ -197,13 +198,13 @@ static int zx81_cassette_fill_wave(int16_t *buffer, int length, uint8_t *bytes)
static const struct CassetteLegacyWaveFiller zx81_legacy_fill_wave =
{
- zx81_cassette_fill_wave, /* fill_wave */
- -1, /* chunk_size */
- 0, /* chunk_samples */
+ zx81_cassette_fill_wave, /* fill_wave */
+ -1, /* chunk_size */
+ 0, /* chunk_samples */
zx81_cassette_calculate_size_in_samples, /* chunk_sample_calc */
- ZX81_WAV_FREQUENCY, /* sample_frequency */
- 0, /* header_samples */
- 0 /* trailer_samples */
+ ZX81_WAV_FREQUENCY, /* sample_frequency */
+ 0, /* header_samples */
+ 0 /* trailer_samples */
};
static cassette_image::error zx81_p_identify(cassette_image *cassette, struct CassetteOptions *opts)
@@ -233,6 +234,11 @@ CASSETTE_FORMATLIST_START(zx81_p_format)
CASSETTE_FORMAT(zx81_p_image_format)
CASSETTE_FORMATLIST_END
+CASSETTE_FORMATLIST_START(zx81_cassette_formats)
+ CASSETTE_FORMAT(zx81_p_image_format)
+ CASSETTE_FORMAT(tzx_cassette_format)
+CASSETTE_FORMATLIST_END
+
/* ZX-80 functions */
static int zx80_cassette_calculate_size_in_samples(const uint8_t *bytes, int length)
@@ -265,11 +271,11 @@ static int zx80_cassette_fill_wave(int16_t *buffer, int length, uint8_t *bytes)
static const struct CassetteLegacyWaveFiller zx80_legacy_fill_wave =
{
- zx80_cassette_fill_wave, /* fill_wave */
+ zx80_cassette_fill_wave, /* fill_wave */
-1, /* chunk_size */
0, /* chunk_samples */
zx80_cassette_calculate_size_in_samples, /* chunk_sample_calc */
- ZX81_WAV_FREQUENCY, /* sample_frequency */
+ ZX81_WAV_FREQUENCY, /* sample_frequency */
0, /* header_samples */
0 /* trailer_samples */
};
diff --git a/src/lib/formats/zx81_p.h b/src/lib/formats/zx81_p.h
index 16a1b22724d..36da808c989 100644
--- a/src/lib/formats/zx81_p.h
+++ b/src/lib/formats/zx81_p.h
@@ -14,6 +14,7 @@
#include "cassimg.h"
CASSETTE_FORMATLIST_EXTERN(zx81_p_format);
+CASSETTE_FORMATLIST_EXTERN(zx81_cassette_formats);
CASSETTE_FORMATLIST_EXTERN(zx80_o_format);
#endif /* ZX81_P_H */
diff --git a/src/lib/netlist/analog/nld_bjt.cpp b/src/lib/netlist/analog/nld_bjt.cpp
index 0acd0887e74..e40fbfa366d 100644
--- a/src/lib/netlist/analog/nld_bjt.cpp
+++ b/src/lib/netlist/analog/nld_bjt.cpp
@@ -6,13 +6,16 @@
*/
#include "solver/nld_solver.h"
-#include "analog/nld_bjt.h"
+#include "analog/nlid_twoterm.h"
#include "nl_setup.h"
+#include <cmath>
+
namespace netlist
{
namespace analog
{
+
class diode
{
public:
@@ -40,6 +43,240 @@ private:
nl_double m_VT_inv;
};
+// -----------------------------------------------------------------------------
+// nld_Q - Base classes
+// -----------------------------------------------------------------------------
+
+ /*! Class representing the bjt model paramers.
+ *
+ * This is the model representation of the bjt model. Typically, SPICE uses
+ * the following parameters. A "Y" in the first column indicates that the
+ * parameter is actually used in netlist.
+ *
+ * | NL? | name | parameter | units | default | example | area |
+ * |:---:|------|-----------------------------------------------------------------------|-------|---------:|----------------:|:----:|
+ * | Y | IS | transport saturation current | A | 1E-016 | 1E-015 | * |
+ * | Y | BF | ideal maximum forward beta | - | 100 | 100 | |
+ * | Y | NF | forward current emission coefficient | - | 1 | 1 | |
+ * | | VAF | forward Early voltage | V | infinite | 200 | |
+ * | | IKF | corner for forward beta high current roll-off | A | infinite | 0.01 | * |
+ * | | ISE | B-E leakage saturation current | A | 0 | 0.0000000000001 | * |
+ * | | NE | B-E leakage emission coefficient | - | 1.5 | 2 | |
+ * | Y | BR | ideal maximum reverse beta | - | 1 | 0.1 | |
+ * | Y | NR | reverse current emission coefficient | - | 1 | 1 | |
+ * | | VAR | reverse Early voltage | V | infinite | 200 | |
+ * | | IKR | corner for reverse beta high current roll-off | A | infinite | 0.01 | * |
+ * | | ISC | leakage saturation current | A | 0 | 8 | |
+ * | | NC | leakage emission coefficient | - | 2 | 1.5 | |
+ * | | RB | zero bias base resistance | | 0 | 100 | * |
+ * | | IRB | current where base resistance falls halfway to its min value | A | infinte | 0.1 | * |
+ * | | RBM | minimum base resistance at high currents | | RB | 10 | * |
+ * | | RE | emitter resistance | | 0 | 1 | * |
+ * | | RC | collector resistance | | 0 | 10 | * |
+ * | | CJE | B-E zero-bias depletion capacitance | F | 0 | 2pF | * |
+ * | | VJE | B-E built-in potential | V | 0.75 | 0.6 | |
+ * | | MJE | B-E junction exponential factor | - | 0.33 | 0.33 | |
+ * | | TF | ideal forward transit time | sec | 0 | 0.1ns | |
+ * | | XTF | coefficient for bias dependence of TF | - | 0 | | |
+ * | | VTF | voltage describing VBC dependence of TF | V | infinite | | |
+ * | | ITF | high-current parameter for effect on TF | A | 0 | | * |
+ * | | PTF | excess phase at freq=1.0/(TF*2PI) Hz | deg | 0 | | |
+ * | | CJC | B-C zero-bias depletion capacitance | F | 0 | 2pF | * |
+ * | | VJC | B-C built-in potential | V | 0.75 | 0.5 | |
+ * | | MJC | B-C junction exponential factor | - | 0.33 | 0.5 | |
+ * | | XCJC | fraction of B-C depletion capacitance connected to internal base node | - | 1 | | |
+ * | | TR | ideal reverse transit time | sec | 0 | 10ns | |
+ * | | CJS | zero-bias collector-substrate capacitance | F | 0 | 2pF | * |
+ * | | VJS | substrate junction built-in potential | V | 0.75 | | |
+ * | | MJS | substrate junction exponential factor | - | 0 | 0.5 | |
+ * | | XTB | forward and reverse beta temperature exponent | - | 0 | | |
+ * | | EG | energy gap for temperature effect on IS | eV | 1.11 | | |
+ * | | XTI | temperature exponent for effect on IS | - | 3 | | |
+ * | | KF | flicker-noise coefficient | - | 0 | | |
+ * | | AF | flicker-noise exponent | - | 1 | | |
+ * | | FC | coefficient for forward-bias depletion capacitance formula | - | 0.5 | | |
+ * | | TNOM | Parameter measurement temperature | C | 27 | 50 | | */
+
+ class bjt_model_t : public param_model_t
+ {
+ public:
+ bjt_model_t(device_t &device, const pstring name, const pstring val)
+ : param_model_t(device, name, val)
+ , m_IS(*this, "IS")
+ , m_BF(*this, "BF")
+ , m_NF(*this, "NF")
+ , m_BR(*this, "BR")
+ , m_NR(*this, "NR")
+ {}
+
+ value_t m_IS; //!< transport saturation current
+ value_t m_BF; //!< ideal maximum forward beta
+ value_t m_NF; //!< forward current emission coefficient
+ value_t m_BR; //!< ideal maximum reverse beta
+ value_t m_NR; //!< reverse current emission coefficient
+ };
+
+ // Have a common start for transistors
+
+NETLIB_OBJECT(Q)
+{
+public:
+ enum q_type {
+ BJT_NPN,
+ BJT_PNP
+ };
+
+ NETLIB_CONSTRUCTOR(Q)
+ , m_model(*this, "MODEL", "")
+ , m_qtype(BJT_NPN)
+ {
+ }
+
+ NETLIB_IS_DYNAMIC(true)
+
+ //NETLIB_RESETI();
+ NETLIB_UPDATEI();
+
+ inline q_type qtype() const { return m_qtype; }
+ inline bool is_qtype(q_type atype) const { return m_qtype == atype; }
+ inline void set_qtype(q_type atype) { m_qtype = atype; }
+protected:
+
+ bjt_model_t m_model;
+private:
+ q_type m_qtype;
+};
+
+NETLIB_OBJECT_DERIVED(QBJT, Q)
+{
+public:
+ NETLIB_CONSTRUCTOR_DERIVED(QBJT, Q)
+ { }
+
+protected:
+
+private:
+};
+
+
+
+
+// -----------------------------------------------------------------------------
+// nld_QBJT_switch
+// -----------------------------------------------------------------------------
+
+
+/*
+ * + - C
+ * B ----VVV----+ |
+ * | |
+ * Rb Rc
+ * Rb Rc
+ * Rb Rc
+ * | |
+ * +----+----+
+ * |
+ * E
+ */
+
+NETLIB_OBJECT_DERIVED(QBJT_switch, QBJT)
+{
+ NETLIB_CONSTRUCTOR_DERIVED(QBJT_switch, QBJT)
+ , m_RB(*this, "m_RB", true)
+ , m_RC(*this, "m_RC", true)
+ , m_BC_dummy(*this, "m_BC", true)
+ , m_gB(NETLIST_GMIN_DEFAULT)
+ , m_gC(NETLIST_GMIN_DEFAULT)
+ , m_V(0.0)
+ , m_state_on(*this, "m_state_on", 0)
+ {
+ register_subalias("B", m_RB.m_P);
+ register_subalias("E", m_RB.m_N);
+ register_subalias("C", m_RC.m_P);
+ //register_term("_E1", m_RC.m_N);
+
+ //register_term("_B1", m_BC_dummy.m_P);
+ //register_term("_C1", m_BC_dummy.m_N);
+
+ connect(m_RB.m_N, m_RC.m_N);
+
+ connect(m_RB.m_P, m_BC_dummy.m_P);
+ connect(m_RC.m_P, m_BC_dummy.m_N);
+ }
+
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+ NETLIB_UPDATE_PARAMI();
+ NETLIB_UPDATE_TERMINALSI();
+
+ nld_twoterm m_RB;
+ nld_twoterm m_RC;
+
+ // FIXME: this is needed so we have all terminals belong to one net list
+
+ nld_twoterm m_BC_dummy;
+
+protected:
+
+
+ nl_double m_gB; // base conductance / switch on
+ nl_double m_gC; // collector conductance / switch on
+ nl_double m_V; // internal voltage source
+ state_var<unsigned> m_state_on;
+
+private:
+};
+
+// -----------------------------------------------------------------------------
+// nld_QBJT_EB
+// -----------------------------------------------------------------------------
+
+
+NETLIB_OBJECT_DERIVED(QBJT_EB, QBJT)
+{
+public:
+ NETLIB_CONSTRUCTOR_DERIVED(QBJT_EB, QBJT)
+ , m_gD_BC(*this, "m_D_BC")
+ , m_gD_BE(*this, "m_D_BE")
+ , m_D_CB(*this, "m_D_CB", true)
+ , m_D_EB(*this, "m_D_EB", true)
+ , m_D_EC(*this, "m_D_EC", true)
+ , m_alpha_f(0)
+ , m_alpha_r(0)
+ {
+ register_subalias("E", m_D_EB.m_P); // Cathode
+ register_subalias("B", m_D_EB.m_N); // Anode
+
+ register_subalias("C", m_D_CB.m_P); // Cathode
+ //register_term("_B1", m_D_CB.m_N); // Anode
+
+ //register_term("_E1", m_D_EC.m_P);
+ //register_term("_C1", m_D_EC.m_N);
+
+ connect(m_D_EB.m_P, m_D_EC.m_P);
+ connect(m_D_EB.m_N, m_D_CB.m_N);
+ connect(m_D_CB.m_P, m_D_EC.m_N);
+ }
+
+protected:
+
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+ NETLIB_UPDATE_PARAMI();
+ NETLIB_UPDATE_TERMINALSI();
+
+ generic_diode m_gD_BC;
+ generic_diode m_gD_BE;
+
+private:
+ nld_twoterm m_D_CB; // gcc, gce - gcc, gec - gcc, gcc - gce | Ic
+ nld_twoterm m_D_EB; // gee, gec - gee, gce - gee, gee - gec | Ie
+ nld_twoterm m_D_EC; // 0, -gec, -gcc, 0 | 0
+
+ nl_double m_alpha_f;
+ nl_double m_alpha_r;
+
+};
// ----------------------------------------------------------------------------------------
@@ -122,8 +359,6 @@ NETLIB_UPDATE_TERMINALS(QBJT_switch)
m_RB.set(gb, v, 0.0);
m_RC.set(gc, 0.0, 0.0);
- //m_RB.update_dev();
- //m_RC.update_dev();
m_state_on = new_state;
}
}
@@ -166,11 +401,11 @@ NETLIB_UPDATE_TERMINALS(QBJT_EB)
const nl_double Ic = (sIc - gce * m_gD_BE.Vd() + gcc * m_gD_BC.Vd()) * polarity;
m_D_EB.set_mat( gee, gec - gee, -Ie,
- gce - gee, gee - gec, Ie);
+ gce - gee, gee - gec, Ie);
m_D_CB.set_mat( gcc, gce - gcc, -Ic,
- gec - gcc, gcc - gce, Ic);
+ gec - gcc, gcc - gce, Ic);
m_D_EC.set_mat( 0, -gec, 0,
- -gce, 0, 0);
+ -gce, 0, 0);
}
@@ -192,5 +427,11 @@ NETLIB_UPDATE_PARAM(QBJT_EB)
m_gD_BC.set_param(IS / m_alpha_r, NR, netlist().gmin());
}
- } //namespace devices
+ } //namespace analog
+
+ namespace devices {
+ NETLIB_DEVICE_IMPL_NS(analog, QBJT_EB)
+ NETLIB_DEVICE_IMPL_NS(analog, QBJT_switch)
+ }
+
} // namespace netlist
diff --git a/src/lib/netlist/analog/nld_bjt.h b/src/lib/netlist/analog/nld_bjt.h
index a4e163b13bc..5e40bd1ef36 100644
--- a/src/lib/netlist/analog/nld_bjt.h
+++ b/src/lib/netlist/analog/nld_bjt.h
@@ -8,8 +8,7 @@
#ifndef NLD_BJT_H_
#define NLD_BJT_H_
-#include "nl_base.h"
-#include "nld_twoterm.h"
+#include "nl_setup.h"
// -----------------------------------------------------------------------------
// Macros
@@ -23,249 +22,4 @@
NET_REGISTER_DEV(QBJT_EB, name) \
NETDEV_PARAMI(name, MODEL, model)
-
-namespace netlist
-{
- namespace analog
- {
-// -----------------------------------------------------------------------------
-// nld_Q - Base classes
-// -----------------------------------------------------------------------------
-
- /* FIXME: Make table pretty */
-
- /*! Class representing the bjt model paramers.
- * This is the model representation of the bjt model. Typically, SPICE uses
- * the following parameters. A "Y" in the first column indicates that the
- * parameter is actually used in netlist.
- *
- * |NL? |name |parameter |units|default| example|area  |
- * |:--:|:-----|:--------------------------------|:----|------:|-------:|:----:|
- * | Y |IS |transport saturation current|A |1E-016|1E-015|* |
- * | Y |BF |ideal maximum forward beta|- |100|100| |
- * | Y |NF |forward current emission coefficient|- |1|1| |
- * | |VAF |forward Early voltage|V |infinite |200| |
- * | |IKF |corner for forward beta high current roll-off|A |infinite |0.01|* |
- * | |ISE |B-E leakage saturation current|A |0|0.0000000000001|* |
- * | |NE |B-E leakage emission coefficient|- |1.5|2| |
- * | Y |BR |ideal maximum reverse beta |- |1|0.1| |
- * | Y |NR |reverse current emission coefficient|- |1|1| |
- * | |VAR |reverse Early voltage|V |infinite |200| |
- * | |IKR |corner for reverse beta high current roll-off|A |infinite |0.01|* |
- * | |ISC |leakage saturation current|A |0|8| |
- * | |NC |leakage emission coefficient|- |2|1.5| |
- * | |RB |zero bias base resistance| |0|100|* |
- * | |IRB |current where base resistance falls halfway to its min value|A |infinte |0.1|* |
- * | |RBM |minimum base resistance at high currents| |RB |10|* |
- * | |RE |emitter resistance| |0|1|* |
- * | |RC |collector resistance | |0|10|* |
- * | |CJE |B-E zero-bias depletion capacitance|F |0|2pF |* |
- * | |VJE |B-E built-in potential|V |0.75|0.6| |
- * | |MJE |B-E junction exponential factor |- |0.33|0.33| |
- * | |TF |ideal forward transit time |sec |0|0.1ns | |
- * | |XTF|coefficient for bias dependence of TF |- |0| | |
- * | |VTF |voltage describing VBC  dependence of TF |V |infinite | | |
- * | |ITF |high-current parameter  for effect on TF |A |0| |* |
- * | |PTF |excess phase at freq=1.0/(TF*2PI) Hz |deg |0| | |
- * | |CJC |B-C zero-bias depletion capacitance |F |0|2pF |* |
- * | |VJC |B-C built-in potential |V |0.75|0.5| |
- * | |MJC |B-C junction exponential factor |- |0.33|0.5| |
- * | |XCJC |fraction of B-C depletion capacitance connected to internal base node |- |1| | |
- * | |TR |ideal reverse transit time |sec |0|10ns | |
- * | |CJS |zero-bias collector-substrate capacitance |F |0|2pF |* |
- * | |VJS |substrate junction built-in potential |V |0.75| | |
- * | |MJS |substrate junction exponential factor |- |0|0.5| |
- * | |XTB |forward and reverse beta temperature exponent |- |0| | |
- * | |EG|energy gap for temperature effect on IS |eV |1.11| | |
- * | |XTI|temperature exponent for effect on IS |- |3| | |
- * | |KF |flicker-noise coefficient |- |0| | |
- * | |AF |flicker-noise exponent |- |1| | |
- * | |FC |coefficient for forward-bias depletion capacitance formula |- |0.5| | |
- * | |TNOM |Parameter measurement temperature |C |27|50| |
- */
-
- class bjt_model_t : public param_model_t
- {
- public:
- bjt_model_t(device_t &device, const pstring name, const pstring val)
- : param_model_t(device, name, val)
- , m_IS(*this, "IS")
- , m_BF(*this, "BF")
- , m_NF(*this, "NF")
- , m_BR(*this, "BR")
- , m_NR(*this, "NR")
- {}
-
- value_t m_IS; //!< transport saturation current
- value_t m_BF; //!< ideal maximum forward beta
- value_t m_NF; //!< forward current emission coefficient
- value_t m_BR; //!< ideal maximum reverse beta 
- value_t m_NR; //!< reverse current emission coefficient
- };
-
- // Have a common start for transistors
-
-NETLIB_OBJECT(Q)
-{
-public:
- enum q_type {
- BJT_NPN,
- BJT_PNP
- };
-
- NETLIB_CONSTRUCTOR(Q)
- , m_model(*this, "MODEL", "")
- , m_qtype(BJT_NPN)
- {
- }
-
- NETLIB_IS_DYNAMIC()
-
- //NETLIB_RESETI();
- NETLIB_UPDATEI();
-
- inline q_type qtype() const { return m_qtype; }
- inline bool is_qtype(q_type atype) const { return m_qtype == atype; }
- inline void set_qtype(q_type atype) { m_qtype = atype; }
-protected:
-
- bjt_model_t m_model;
-private:
- q_type m_qtype;
-};
-
-NETLIB_OBJECT_DERIVED(QBJT, Q)
-{
-public:
- NETLIB_CONSTRUCTOR_DERIVED(QBJT, Q)
- { }
-
-protected:
-
-private:
-};
-
-
-
-
-// -----------------------------------------------------------------------------
-// nld_QBJT_switch
-// -----------------------------------------------------------------------------
-
-
-/*
- * + - C
- * B ----VVV----+ |
- * | |
- * Rb Rc
- * Rb Rc
- * Rb Rc
- * | |
- * +----+----+
- * |
- * E
- */
-
-NETLIB_OBJECT_DERIVED(QBJT_switch, QBJT)
-{
- NETLIB_CONSTRUCTOR_DERIVED(QBJT_switch, QBJT)
- , m_RB(*this, "m_RB", true)
- , m_RC(*this, "m_RC", true)
- , m_BC_dummy(*this, "m_BC", true)
- , m_gB(NETLIST_GMIN_DEFAULT)
- , m_gC(NETLIST_GMIN_DEFAULT)
- , m_V(0.0)
- , m_state_on(*this, "m_state_on", 0)
- {
- register_subalias("B", m_RB.m_P);
- register_subalias("E", m_RB.m_N);
- register_subalias("C", m_RC.m_P);
- //register_term("_E1", m_RC.m_N);
-
- //register_term("_B1", m_BC_dummy.m_P);
- //register_term("_C1", m_BC_dummy.m_N);
-
- connect(m_RB.m_N, m_RC.m_N);
-
- connect(m_RB.m_P, m_BC_dummy.m_P);
- connect(m_RC.m_P, m_BC_dummy.m_N);
- }
-
- NETLIB_RESETI();
- NETLIB_UPDATEI();
- NETLIB_UPDATE_PARAMI();
- NETLIB_UPDATE_TERMINALSI();
-
- nld_twoterm m_RB;
- nld_twoterm m_RC;
-
- // FIXME: this is needed so we have all terminals belong to one net list
-
- nld_twoterm m_BC_dummy;
-
-protected:
-
-
- nl_double m_gB; // base conductance / switch on
- nl_double m_gC; // collector conductance / switch on
- nl_double m_V; // internal voltage source
- state_var<unsigned> m_state_on;
-
-private:
-};
-
-// -----------------------------------------------------------------------------
-// nld_QBJT_EB
-// -----------------------------------------------------------------------------
-
-
-NETLIB_OBJECT_DERIVED(QBJT_EB, QBJT)
-{
-public:
- NETLIB_CONSTRUCTOR_DERIVED(QBJT_EB, QBJT)
- , m_gD_BC(*this, "m_D_BC")
- , m_gD_BE(*this, "m_D_BE")
- , m_D_CB(*this, "m_D_CB", true)
- , m_D_EB(*this, "m_D_EB", true)
- , m_D_EC(*this, "m_D_EC", true)
- , m_alpha_f(0)
- , m_alpha_r(0)
- {
- register_subalias("E", m_D_EB.m_P); // Cathode
- register_subalias("B", m_D_EB.m_N); // Anode
-
- register_subalias("C", m_D_CB.m_P); // Cathode
- //register_term("_B1", m_D_CB.m_N); // Anode
-
- //register_term("_E1", m_D_EC.m_P);
- //register_term("_C1", m_D_EC.m_N);
-
- connect(m_D_EB.m_P, m_D_EC.m_P);
- connect(m_D_EB.m_N, m_D_CB.m_N);
- connect(m_D_CB.m_P, m_D_EC.m_N);
- }
-
-protected:
-
- NETLIB_RESETI();
- NETLIB_UPDATEI();
- NETLIB_UPDATE_PARAMI();
- NETLIB_UPDATE_TERMINALSI();
-
- generic_diode m_gD_BC;
- generic_diode m_gD_BE;
-
-private:
- nld_twoterm m_D_CB; // gcc, gce - gcc, gec - gcc, gcc - gce | Ic
- nld_twoterm m_D_EB; // gee, gec - gee, gce - gee, gee - gec | Ie
- nld_twoterm m_D_EC; // 0, -gec, -gcc, 0 | 0
-
- nl_double m_alpha_f;
- nl_double m_alpha_r;
-
-};
-
- } //namespace devices
-} // namespace netlist
-
#endif /* NLD_BJT_H_ */
diff --git a/src/lib/netlist/analog/nld_fourterm.h b/src/lib/netlist/analog/nld_fourterm.h
index 0e4bcc03429..bd420b8cfa9 100644
--- a/src/lib/netlist/analog/nld_fourterm.h
+++ b/src/lib/netlist/analog/nld_fourterm.h
@@ -9,8 +9,7 @@
#define NLD_FOURTERM_H_
-#include "nl_base.h"
-#include "nld_twoterm.h"
+#include "nl_setup.h"
// ----------------------------------------------------------------------------------------
// Macros
@@ -28,204 +27,4 @@
#define LVCCS(name) \
NET_REGISTER_DEV(LVCCS, name)
-namespace netlist
-{
- namespace analog
- {
-// ----------------------------------------------------------------------------------------
-// nld_VCCS
-// ----------------------------------------------------------------------------------------
-
-/*
- * Voltage controlled current source
- *
- * IP ---+ +------> OP
- * | |
- * RI I
- * RI => G => I IOut = (V(IP)-V(IN)) * G
- * RI I
- * | |
- * IN ---+ +------< ON
- *
- * G=1 ==> 1V ==> 1A
- *
- * RI = 1 / NETLIST_GMIN
- *
- */
-
-NETLIB_OBJECT(VCCS)
-{
-public:
- NETLIB_CONSTRUCTOR(VCCS)
- , m_G(*this, "G", 1.0)
- , m_RI(*this, "RI", 1e9)
- , m_OP(*this, "OP")
- , m_ON(*this, "ON")
- , m_IP(*this, "IP")
- , m_IN(*this, "IN")
- , m_OP1(*this, "_OP1")
- , m_ON1(*this, "_ON1")
- , m_gfac(1.0)
- {
- m_IP.m_otherterm = &m_IN; // <= this should be NULL and terminal be filtered out prior to solving...
- m_IN.m_otherterm = &m_IP; // <= this should be NULL and terminal be filtered out prior to solving...
-
- m_OP.m_otherterm = &m_IP;
- m_OP1.m_otherterm = &m_IN;
-
- m_ON.m_otherterm = &m_IP;
- m_ON1.m_otherterm = &m_IN;
-
- connect(m_OP, m_OP1);
- connect(m_ON, m_ON1);
- m_gfac = NL_FCONST(1.0);
- }
-
- param_double_t m_G;
- param_double_t m_RI;
-
-protected:
- NETLIB_RESETI();
- NETLIB_UPDATEI();
- NETLIB_UPDATE_PARAMI()
- {
- NETLIB_NAME(VCCS)::reset();
- }
-
- terminal_t m_OP;
- terminal_t m_ON;
-
- terminal_t m_IP;
- terminal_t m_IN;
-
- terminal_t m_OP1;
- terminal_t m_ON1;
-
- nl_double m_gfac;
-};
-
-/* Limited Current source*/
-
-NETLIB_OBJECT_DERIVED(LVCCS, VCCS)
-{
-public:
- NETLIB_CONSTRUCTOR_DERIVED(LVCCS, VCCS)
- , m_cur_limit(*this, "CURLIM", 1000.0)
- , m_vi(0.0)
- {
- }
-
- NETLIB_IS_DYNAMIC()
-
- param_double_t m_cur_limit; /* current limit */
-
-protected:
- NETLIB_UPDATEI();
- NETLIB_RESETI();
- NETLIB_UPDATE_PARAMI();
- NETLIB_UPDATE_TERMINALSI();
-
- nl_double m_vi;
-};
-
-// ----------------------------------------------------------------------------------------
-// nld_CCCS
-// ----------------------------------------------------------------------------------------
-
-/*
- * Current controlled current source
- *
- * IP ---+ +------> OP
- * | |
- * RI I
- * RI => G => I IOut = (V(IP)-V(IN)) / RI * G
- * RI I
- * | |
- * IN ---+ +------< ON
- *
- * G=1 ==> 1A ==> 1A
- *
- * RI = 1
- *
- * This needs high levels of accuracy to work with 1 Ohm RI.
- *
- */
-
-NETLIB_OBJECT_DERIVED(CCCS, VCCS)
-{
-public:
- NETLIB_CONSTRUCTOR_DERIVED(CCCS, VCCS)
- , m_gfac(1.0)
- {
- m_gfac = NL_FCONST(1.0) / m_RI();
- }
-
-protected:
- NETLIB_UPDATEI();
- NETLIB_RESETI();
- NETLIB_UPDATE_PARAMI();
-
- nl_double m_gfac;
-};
-
-
-// ----------------------------------------------------------------------------------------
-// nld_VCVS
-// ----------------------------------------------------------------------------------------
-
-/*
- * Voltage controlled voltage source
- *
- * Parameters:
- * G Default: 1
- * RO Default: 1 (would be typically 50 for an op-amp
- *
- * IP ---+ +--+---- OP
- * | | |
- * RI I RO
- * RI => G => I RO V(OP) - V(ON) = (V(IP)-V(IN)) * G
- * RI I RO
- * | | |
- * IN ---+ +--+---- ON
- *
- * G=1 ==> 1V ==> 1V
- *
- * RI = 1 / NETLIST_GMIN
- *
- * Internal GI = G / RO
- *
- */
-
-
-NETLIB_OBJECT_DERIVED(VCVS, VCCS)
-{
-public:
- NETLIB_CONSTRUCTOR_DERIVED(VCVS, VCCS)
- , m_RO(*this, "RO", 1.0)
- , m_OP2(*this, "_OP2")
- , m_ON2(*this, "_ON2")
- {
- m_OP2.m_otherterm = &m_ON2;
- m_ON2.m_otherterm = &m_OP2;
-
- connect(m_OP2, m_OP1);
- connect(m_ON2, m_ON1);
- }
-
- param_double_t m_RO;
-
-protected:
- //NETLIB_UPDATEI();
- NETLIB_RESETI();
- //NETLIB_UPDATE_PARAMI();
-
- terminal_t m_OP2;
- terminal_t m_ON2;
-
-};
-
- } //namespace devices
-} // namespace netlist
-
-
#endif /* NLD_FOURTERM_H_ */
diff --git a/src/lib/netlist/analog/nld_opamps.cpp b/src/lib/netlist/analog/nld_opamps.cpp
index e777ffb791c..64f6b1b6df9 100644
--- a/src/lib/netlist/analog/nld_opamps.cpp
+++ b/src/lib/netlist/analog/nld_opamps.cpp
@@ -6,9 +6,14 @@
*/
#include "nld_opamps.h"
-#include "devices/net_lib.h"
+#include "nl_base.h"
+#include "nl_errstr.h"
+#include "nlid_twoterm.h"
+#include "nlid_fourterm.h"
+#include <cmath>
+
namespace netlist
{
namespace analog
@@ -42,6 +47,61 @@ namespace netlist
*
* */
+ /*! Class representing the opamp model parameters.
+ * The opamp model was designed based on designs from
+ * http://www.ecircuitcenter.com/Circuits/opmodel1/opmodel1.htm.
+ * Currently 2 different types are supported: Type 1 and Type 3. Type 1
+ * is less complex and should run faster than Type 3.
+ *
+ * This is an extension to the traditional SPICE approach which
+ * assumes that you will be using an manufacturer model. These models may
+ * have copyrights incompatible with the netlist license. Thus they may not
+ * be suitable for certain implementations of netlist.
+ *
+ * For the typical use cases in low frequency (< 100 KHz) applications at
+ * which netlist is targeted, this model is certainly suitable. All parameters
+ * can be determined from a typical opamp datasheet.
+ *
+ * |Type|name |parameter |units|default| example|
+ * |:--:|:-----|:----------------------------------------------|:----|------:|-------:|
+ * | 3 |TYPE |Model Type, 1 and 3 are supported | | | |
+ * |1,3 |FPF |frequency of first pole |Hz | |100 |
+ * | 3 |SLEW |unity gain slew rate |V/s | | 1|
+ * |1,3 |RI |input resistance |Ohm | |1M |
+ * |1,3 |RO |output resistance |Ohm | |50 |
+ * |1,3 |UGF |unity gain frequency (transition frequency) |Hz | |1000 |
+ * | 3 |VLL |low output swing minus low supply rail |V | |1.5 |
+ * | 3 |VLH |high supply rail minus high output swing |V | |1.5 |
+ * | 3 |DAB |Differential Amp Bias - total quiescent current|A | |0.001 |
+ */
+
+ class opamp_model_t : public param_model_t
+ {
+ public:
+ opamp_model_t(device_t &device, const pstring name, const pstring val)
+ : param_model_t(device, name, val)
+ , m_TYPE(*this, "TYPE")
+ , m_FPF(*this, "FPF")
+ , m_SLEW(*this, "SLEW")
+ , m_RI(*this, "RI")
+ , m_RO(*this, "RO")
+ , m_UGF(*this, "UGF")
+ , m_VLL(*this, "VLL")
+ , m_VLH(*this, "VLH")
+ , m_DAB(*this, "DAB")
+ {}
+
+ value_t m_TYPE; //!< Model Type, 1 and 3 are supported
+ value_t m_FPF; //!< frequency of first pole
+ value_t m_SLEW; //!< unity gain slew rate
+ value_t m_RI; //!< input resistance
+ value_t m_RO; //!< output resistance
+ value_t m_UGF; //!< unity gain frequency (transition frequency)
+ value_t m_VLL; //!< low output swing minus low supply rail
+ value_t m_VLH; //!< high supply rail minus high output swing
+ value_t m_DAB; //!< Differential Amp Bias - total quiescent current
+ };
+
NETLIB_OBJECT(opamp)
{
@@ -99,7 +159,7 @@ namespace netlist
connect("EBUF.IP", "RP1.1");
}
else
- netlist().log().fatal("Unknown opamp type: {1}", m_type);
+ log().fatal(MF_1_UNKNOWN_OPAMP_TYPE, m_type);
}
diff --git a/src/lib/netlist/analog/nld_opamps.h b/src/lib/netlist/analog/nld_opamps.h
index b407bb2215e..31b883be688 100644
--- a/src/lib/netlist/analog/nld_opamps.h
+++ b/src/lib/netlist/analog/nld_opamps.h
@@ -10,10 +10,7 @@
#ifndef NLD_OPAMPS_H_
#define NLD_OPAMPS_H_
-#include "nl_base.h"
#include "nl_setup.h"
-#include "nld_twoterm.h"
-#include "nld_fourterm.h"
// ----------------------------------------------------------------------------------------
// Macros
@@ -23,72 +20,5 @@
NET_REGISTER_DEV(OPAMP, name) \
NETDEV_PARAMI(name, MODEL, model)
-// ----------------------------------------------------------------------------------------
-// Devices ...
-// ----------------------------------------------------------------------------------------
-
-namespace netlist
-{
- namespace analog
- {
-
- /*! Class representing the opamp model parameters.
- * The opamp model was designed based on designs from
- * http://www.ecircuitcenter.com/Circuits/opmodel1/opmodel1.htm.
- * Currently 2 different types are supported: Type 1 and Type 3. Type 1
- * is less complex and should run faster than Type 3.
- *
- * This is an extension to the traditional SPICE approach which
- * assumes that you will be using an manufacturer model. These models may
- * have copyrights incompatible with the netlist license. Thus they may not
- * be suitable for certain implementations of netlist.
- *
- * For the typical use cases in low frequency (< 100 KHz) applications at
- * which netlist is targeted, this model is certainly suitable. All parameters
- * can be determined from a typical opamp datasheet.
- *
- * |Type|name |parameter |units|default| example|
- * |:--:|:-----|:----------------------------------------------|:----|------:|-------:|
- * | 3 |TYPE  |Model Type, 1 and 3 are supported |  | | |
- * |1,3 |FPF  |frequency of first pole |Hz  | |100 |
- * | 3 |SLEW  |unity gain slew rate |V/s  | | 1|
- * |1,3 |RI  |input resistance |Ohm  | |1M |
- * |1,3 |RO  |output resistance |Ohm  | |50 |
- * |1,3 |UGF  |unity gain frequency (transition frequency) |Hz  | |1000 |
- * | 3 |VLL  |low output swing minus low supply rail |V  | |1.5 |
- * | 3 |VLH  |high supply rail minus high output swing |V  | |1.5 |
- * | 3 |DAB  |Differential Amp Bias - total quiescent current|A  | |0.001 |
- */
-
- class opamp_model_t : public param_model_t
- {
- public:
- opamp_model_t(device_t &device, const pstring name, const pstring val)
- : param_model_t(device, name, val)
- , m_TYPE(*this, "TYPE")
- , m_FPF(*this, "FPF")
- , m_SLEW(*this, "SLEW")
- , m_RI(*this, "RI")
- , m_RO(*this, "RO")
- , m_UGF(*this, "UGF")
- , m_VLL(*this, "VLL")
- , m_VLH(*this, "VLH")
- , m_DAB(*this, "DAB")
- {}
-
- value_t m_TYPE; //!< Model Type, 1 and 3 are supported
- value_t m_FPF; //!< frequency of first pole
- value_t m_SLEW; //!< unity gain slew rate
- value_t m_RI; //!< input resistance
- value_t m_RO; //!< output resistance
- value_t m_UGF; //!< unity gain frequency (transition frequency)
- value_t m_VLL; //!< low output swing minus low supply rail
- value_t m_VLH; //!< high supply rail minus high output swing
- value_t m_DAB; //!< Differential Amp Bias - total quiescent current
- };
-
-
- } //namespace analog
-} // namespace netlist
#endif /* NLD_OPAMPS_H_ */
diff --git a/src/lib/netlist/analog/nld_switches.cpp b/src/lib/netlist/analog/nld_switches.cpp
index 92afa752e86..bf92a8cf4f8 100644
--- a/src/lib/netlist/analog/nld_switches.cpp
+++ b/src/lib/netlist/analog/nld_switches.cpp
@@ -5,8 +5,9 @@
*
*/
-#include "nld_switches.h"
-#include "nl_setup.h"
+#include "nlid_twoterm.h"
+#include "nl_base.h"
+#include "nl_factory.h"
#define R_OFF (1.0 / netlist().gmin())
#define R_ON 0.01
diff --git a/src/lib/netlist/analog/nld_switches.h b/src/lib/netlist/analog/nld_switches.h
index d91cf775377..06af3fad0ca 100644
--- a/src/lib/netlist/analog/nld_switches.h
+++ b/src/lib/netlist/analog/nld_switches.h
@@ -10,8 +10,7 @@
#ifndef NLD_SWITCHES_H_
#define NLD_SWITCHES_H_
-#include "nl_base.h"
-#include "nld_twoterm.h"
+#include "nl_setup.h"
// ----------------------------------------------------------------------------------------
// Macros
@@ -23,5 +22,4 @@
#define SWITCH2(name) \
NET_REGISTER_DEV(SWITCH2, name)
-
#endif /* NLD_SWITCHES_H_ */
diff --git a/src/lib/netlist/analog/nld_twoterm.h b/src/lib/netlist/analog/nld_twoterm.h
index 06325679dff..3ffbafd3b51 100644
--- a/src/lib/netlist/analog/nld_twoterm.h
+++ b/src/lib/netlist/analog/nld_twoterm.h
@@ -1,39 +1,10 @@
// license:GPL-2.0+
// copyright-holders:Couriersud
-/*
- * nld_twoterm.h
- *
- * Devices with two terminals ...
- *
- *
- * (k)
- * +-----T-----+
- * | | |
- * | +--+--+ |
- * | | | |
- * | R | |
- * | R | |
- * | R I |
- * | | I | Device n
- * | V+ I |
- * | V | |
- * | V- | |
- * | | | |
- * | +--+--+ |
- * | | |
- * +-----T-----+
- * (l)
- *
- * This is a resistance in series to a voltage source and paralleled by a
- * current source. This is suitable to model voltage sources, current sources,
- * resistors, capacitors, inductances and diodes.
- *
- */
#ifndef NLD_TWOTERM_H_
#define NLD_TWOTERM_H_
-#include "nl_base.h"
+#include "nl_setup.h"
// -----------------------------------------------------------------------------
// Macros
@@ -95,397 +66,4 @@
#define IND_P(ind) (static_cast<double>(ind) * 1e-12)
#endif
-// -----------------------------------------------------------------------------
-// Implementation
-// -----------------------------------------------------------------------------
-
-namespace netlist
-{
- namespace analog
- {
-// -----------------------------------------------------------------------------
-// nld_twoterm
-// -----------------------------------------------------------------------------
-
-NETLIB_OBJECT(twoterm)
-{
- NETLIB_CONSTRUCTOR_EX(twoterm, bool terminals_owned = false)
- , m_P(bselect(terminals_owned, owner, *this), (terminals_owned ? name + "." : "") + "1")
- , m_N(bselect(terminals_owned, owner, *this), (terminals_owned ? name + "." : "") + "2")
- {
- m_P.m_otherterm = &m_N;
- m_N.m_otherterm = &m_P;
- }
-
- terminal_t m_P;
- terminal_t m_N;
-
- //NETLIB_UPDATE_TERMINALSI() { }
- //NETLIB_RESETI() { }
- NETLIB_UPDATEI();
-
-public:
- /* inline */ void set(const nl_double G, const nl_double V, const nl_double I)
- {
- /* GO, GT, I */
- m_P.set( G, G, ( V) * G - I);
- m_N.set( G, G, ( -V) * G + I);
- }
-
- /* inline */ nl_double deltaV() const
- {
- return m_P.net().Q_Analog() - m_N.net().Q_Analog();
- }
-
- void set_mat(const nl_double a11, const nl_double a12, const nl_double r1,
- const nl_double a21, const nl_double a22, const nl_double r2)
- {
- /* GO, GT, I */
- m_P.set(-a12, a11, r1);
- m_N.set(-a21, a22, r2);
- }
-
-private:
- template <class C>
- static core_device_t &bselect(bool b, C &d1, core_device_t &d2)
- {
- core_device_t *h = dynamic_cast<core_device_t *>(&d1);
- return b ? *h : d2;
- }
-};
-
-
-// -----------------------------------------------------------------------------
-// nld_R
-// -----------------------------------------------------------------------------
-
-NETLIB_OBJECT_DERIVED(R_base, twoterm)
-{
- NETLIB_CONSTRUCTOR_DERIVED(R_base, twoterm)
- {
- }
-
-public:
- inline void set_R(const nl_double R)
- {
- const nl_double G = NL_FCONST(1.0) / R;
- set_mat( G, -G, 0.0,
- -G, G, 0.0);
- }
-
-protected:
- NETLIB_RESETI();
- NETLIB_UPDATEI();
-
-};
-
-NETLIB_OBJECT_DERIVED(R, R_base)
-{
- NETLIB_CONSTRUCTOR_DERIVED(R, R_base)
- , m_R(*this, "R", 1e9)
- {
- }
-
- param_double_t m_R;
-
-protected:
-
- NETLIB_RESETI();
- //NETLIB_UPDATEI() { }
- NETLIB_UPDATE_PARAMI();
-
-private:
- /* protect set_R ... it's a recipe to desaster when used to bypass the parameter */
- using NETLIB_NAME(R_base)::set_R;
-};
-
-// -----------------------------------------------------------------------------
-// nld_POT
-// -----------------------------------------------------------------------------
-
-NETLIB_OBJECT(POT)
-{
- NETLIB_CONSTRUCTOR(POT)
- , m_R1(*this, "_R1")
- , m_R2(*this, "_R2")
- , m_R(*this, "R", 10000)
- , m_Dial(*this, "DIAL", 0.5)
- , m_DialIsLog(*this, "DIALLOG", 0)
- {
- register_subalias("1", m_R1.m_P);
- register_subalias("2", m_R1.m_N);
- register_subalias("3", m_R2.m_N);
-
- connect(m_R2.m_P, m_R1.m_N);
-
- }
-
- //NETLIB_UPDATEI();
- NETLIB_RESETI();
- NETLIB_UPDATE_PARAMI();
-
-private:
- NETLIB_SUB(R_base) m_R1;
- NETLIB_SUB(R_base) m_R2;
-
- param_double_t m_R;
- param_double_t m_Dial;
- param_logic_t m_DialIsLog;
-};
-
-NETLIB_OBJECT(POT2)
-{
- NETLIB_CONSTRUCTOR(POT2)
- , m_R1(*this, "_R1")
- , m_R(*this, "R", 10000)
- , m_Dial(*this, "DIAL", 0.5)
- , m_DialIsLog(*this, "DIALLOG", 0)
- , m_Reverse(*this, "REVERSE", 0)
- {
- register_subalias("1", m_R1.m_P);
- register_subalias("2", m_R1.m_N);
-
- }
-
- //NETLIB_UPDATEI();
- NETLIB_RESETI();
- NETLIB_UPDATE_PARAMI();
-
-private:
- NETLIB_SUB(R_base) m_R1;
-
- param_double_t m_R;
- param_double_t m_Dial;
- param_logic_t m_DialIsLog;
- param_logic_t m_Reverse;
-};
-
-
-// -----------------------------------------------------------------------------
-// nld_C
-// -----------------------------------------------------------------------------
-
-NETLIB_OBJECT_DERIVED(C, twoterm)
-{
-public:
- NETLIB_CONSTRUCTOR_DERIVED(C, twoterm)
- , m_C(*this, "C", 1e-6)
- , m_GParallel(0.0)
- {
- //register_term("1", m_P);
- //register_term("2", m_N);
- }
-
- NETLIB_IS_TIMESTEP()
- NETLIB_TIMESTEPI();
-
- param_double_t m_C;
-
-protected:
- NETLIB_RESETI();
- NETLIB_UPDATEI();
- NETLIB_UPDATE_PARAMI();
-
-private:
- nl_double m_GParallel;
-
-};
-
-// -----------------------------------------------------------------------------
-// nld_L
-// -----------------------------------------------------------------------------
-
-NETLIB_OBJECT_DERIVED(L, twoterm)
-{
-public:
- NETLIB_CONSTRUCTOR_DERIVED(L, twoterm)
- , m_L(*this, "L", 1e-6)
- , m_GParallel(0.0)
- , m_G(0.0)
- , m_I(0.0)
- {
- //register_term("1", m_P);
- //register_term("2", m_N);
- }
-
- NETLIB_IS_TIMESTEP()
- NETLIB_TIMESTEPI();
-
- param_double_t m_L;
-
-protected:
- NETLIB_RESETI();
- NETLIB_UPDATEI();
- NETLIB_UPDATE_PARAMI();
-
-private:
- nl_double m_GParallel;
- nl_double m_G;
- nl_double m_I;
-};
-
-// -----------------------------------------------------------------------------
-// A generic diode model to be used in other devices (Diode, BJT ...)
-// -----------------------------------------------------------------------------
-
-class generic_diode
-{
-public:
- generic_diode(device_t &dev, pstring name);
-
- void update_diode(const nl_double nVd);
-
- void set_param(const nl_double Is, const nl_double n, nl_double gmin);
-
- inline nl_double I() const { return m_Id; }
- inline nl_double G() const { return m_G; }
- inline nl_double Ieq() const { return (m_Id - m_Vd * m_G); }
- inline nl_double Vd() const { return m_Vd; }
-
- /* owning object must save those ... */
-
-private:
- state_var<nl_double> m_Vd;
- state_var<nl_double> m_Id;
- state_var<nl_double> m_G;
-
- nl_double m_Vt;
- nl_double m_Is;
- nl_double m_n;
- nl_double m_gmin;
-
- nl_double m_VtInv;
- nl_double m_Vcrit;
-};
-
-/*! Class representing the diode model paramers.
- * This is the model representation of the diode model. Typically, SPICE uses
- * the following parameters. A "Y" in the first column indicates that the
- * parameter is actually used in netlist.
- *
- * |NL? |name |parameter |units|default| example|area  |
- * |:--:|:-----|:--------------------------------|:----|------:|-------:|:----:|
- * | Y |IS |saturation current |A |1.0e-14| 1.0e-14| *  |
- * | |RS |ohmic resistanc |Ohm | 0| 10| *  |
- * | Y |N |emission coefficient |- | 1| 1| |
- * | |TT |transit-time |sec | 0| 0.1ns| |
- * | |CJO |zero-bias junction capacitance |F | 0| 2pF| *  |
- * | |VJ |junction potential |V | 1| 0.6| |
- * | |M |grading coefficient |- | 0.5| 0.5| |
- * | |EG |band-gap energy |eV | 1.11| 1.11 Si| |
- * | |XTI |saturation-current temp.exp |- | 3|3.0 pn. 2.0 Schottky| |
- * | |KF |flicker noise coefficient |- | 0| | |
- * | |AF |flicker noise exponent |- | 1| | |
- * | |FC |coefficient for forward-bias depletion capacitance formula|-|0.5|| |
- * | |BV |reverse breakdown voltage |V |infinite| 40| |
- * | |IBV |current at breakdown voltage |V | 0.001| | |
- * | |TNOM |parameter measurement temperature|deg C| 27| 50| |
- *
- */
-
-class diode_model_t : public param_model_t
-{
-public:
- diode_model_t(device_t &device, const pstring name, const pstring val)
- : param_model_t(device, name, val)
- , m_IS(*this, "IS")
- , m_N(*this, "N")
- {}
-
- value_t m_IS; //!< saturation current.
- value_t m_N; //!< emission coefficient.
-};
-
-
-// -----------------------------------------------------------------------------
-// nld_D
-// -----------------------------------------------------------------------------
-
-NETLIB_OBJECT_DERIVED(D, twoterm)
-{
-public:
- NETLIB_CONSTRUCTOR_DERIVED(D, twoterm)
- , m_model(*this, "MODEL", "")
- , m_D(*this, "m_D")
- {
- register_subalias("A", m_P);
- register_subalias("K", m_N);
- }
-
- template <class CLASS>
- NETLIB_NAME(D)(CLASS &owner, const pstring name, const pstring model)
- : NETLIB_NAME(twoterm)(owner, name)
- , m_model(*this, "MODEL", model)
- , m_D(*this, "m_D")
- {
- register_subalias("A", m_P);
- register_subalias("K", m_N);
- }
-
-
- NETLIB_IS_DYNAMIC()
-
- NETLIB_UPDATE_TERMINALSI();
-
- diode_model_t m_model;
-
-protected:
- NETLIB_RESETI();
- NETLIB_UPDATEI();
- NETLIB_UPDATE_PARAMI();
-
- generic_diode m_D;
-};
-
-
-// -----------------------------------------------------------------------------
-// nld_VS - Voltage source
-//
-// netlist voltage source must have inner resistance
-// -----------------------------------------------------------------------------
-
-NETLIB_OBJECT_DERIVED(VS, twoterm)
-{
-public:
- NETLIB_CONSTRUCTOR_DERIVED(VS, twoterm)
- , m_R(*this, "R", 0.1)
- , m_V(*this, "V", 0.0)
- {
- register_subalias("P", m_P);
- register_subalias("N", m_N);
- }
-
-protected:
- NETLIB_UPDATEI();
- NETLIB_RESETI();
-
- param_double_t m_R;
- param_double_t m_V;
-};
-
-// -----------------------------------------------------------------------------
-// nld_CS - Current source
-// -----------------------------------------------------------------------------
-
-NETLIB_OBJECT_DERIVED(CS, twoterm)
-{
-public:
- NETLIB_CONSTRUCTOR_DERIVED(CS, twoterm)
- , m_I(*this, "I", 1.0)
- {
- register_subalias("P", m_P);
- register_subalias("N", m_N);
- }
-
- NETLIB_UPDATEI();
- NETLIB_RESETI();
-protected:
-
- param_double_t m_I;
-};
-
-
- } //namespace devices
-} // namespace netlist
-
#endif /* NLD_TWOTERM_H_ */
diff --git a/src/lib/netlist/analog/nld_fourterm.cpp b/src/lib/netlist/analog/nlid_fourterm.cpp
index 3707b2a74c4..493b22fe231 100644
--- a/src/lib/netlist/analog/nld_fourterm.cpp
+++ b/src/lib/netlist/analog/nlid_fourterm.cpp
@@ -6,13 +6,17 @@
*/
#include "solver/nld_solver.h"
-#include "nld_fourterm.h"
+#include "nlid_fourterm.h"
#include "nl_setup.h"
+#include <cmath>
+
namespace netlist
{
namespace analog
{
+
+
// ----------------------------------------------------------------------------------------
// nld_VCCS
// ----------------------------------------------------------------------------------------
@@ -119,5 +123,12 @@ NETLIB_RESET(VCVS)
m_ON2.set(NL_FCONST(1.0) / m_RO());
}
- } //namespace devices
+ } //namespace analog
+
+ namespace devices {
+ NETLIB_DEVICE_IMPL_NS(analog, VCVS)
+ NETLIB_DEVICE_IMPL_NS(analog, VCCS)
+ NETLIB_DEVICE_IMPL_NS(analog, CCCS)
+ NETLIB_DEVICE_IMPL_NS(analog, LVCCS)
+ }
} // namespace netlist
diff --git a/src/lib/netlist/analog/nlid_fourterm.h b/src/lib/netlist/analog/nlid_fourterm.h
new file mode 100644
index 00000000000..cfc8f30d751
--- /dev/null
+++ b/src/lib/netlist/analog/nlid_fourterm.h
@@ -0,0 +1,211 @@
+// license:GPL-2.0+
+// copyright-holders:Couriersud
+/*
+ * nlid_fourterm.h
+ *
+ */
+
+#ifndef NLID_FOURTERM_H_
+#define NLID_FOURTERM_H_
+
+#include "nl_base.h"
+
+namespace netlist {
+ namespace analog {
+
+ // ----------------------------------------------------------------------------------------
+ // nld_VCCS
+ // ----------------------------------------------------------------------------------------
+
+ /*
+ * Voltage controlled current source
+ *
+ * IP ---+ +------> OP
+ * | |
+ * RI I
+ * RI => G => I IOut = (V(IP)-V(IN)) * G
+ * RI I
+ * | |
+ * IN ---+ +------< ON
+ *
+ * G=1 ==> 1V ==> 1A
+ *
+ * RI = 1 / NETLIST_GMIN
+ *
+ */
+
+ NETLIB_OBJECT(VCCS)
+ {
+ public:
+ NETLIB_CONSTRUCTOR(VCCS)
+ , m_G(*this, "G", 1.0)
+ , m_RI(*this, "RI", 1e9)
+ , m_OP(*this, "OP")
+ , m_ON(*this, "ON")
+ , m_IP(*this, "IP")
+ , m_IN(*this, "IN")
+ , m_OP1(*this, "_OP1")
+ , m_ON1(*this, "_ON1")
+ , m_gfac(1.0)
+ {
+ m_IP.m_otherterm = &m_IN; // <= this should be NULL and terminal be filtered out prior to solving...
+ m_IN.m_otherterm = &m_IP; // <= this should be NULL and terminal be filtered out prior to solving...
+
+ m_OP.m_otherterm = &m_IP;
+ m_OP1.m_otherterm = &m_IN;
+
+ m_ON.m_otherterm = &m_IP;
+ m_ON1.m_otherterm = &m_IN;
+
+ connect(m_OP, m_OP1);
+ connect(m_ON, m_ON1);
+ m_gfac = NL_FCONST(1.0);
+ }
+
+ param_double_t m_G;
+ param_double_t m_RI;
+
+ protected:
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+ NETLIB_UPDATE_PARAMI()
+ {
+ NETLIB_NAME(VCCS)::reset();
+ }
+
+ terminal_t m_OP;
+ terminal_t m_ON;
+
+ terminal_t m_IP;
+ terminal_t m_IN;
+
+ terminal_t m_OP1;
+ terminal_t m_ON1;
+
+ nl_double m_gfac;
+ };
+
+ /* Limited Current source*/
+
+ NETLIB_OBJECT_DERIVED(LVCCS, VCCS)
+ {
+ public:
+ NETLIB_CONSTRUCTOR_DERIVED(LVCCS, VCCS)
+ , m_cur_limit(*this, "CURLIM", 1000.0)
+ , m_vi(0.0)
+ {
+ }
+
+ NETLIB_IS_DYNAMIC(true)
+
+ param_double_t m_cur_limit; /* current limit */
+
+ protected:
+ NETLIB_UPDATEI();
+ NETLIB_RESETI();
+ NETLIB_UPDATE_PARAMI();
+ NETLIB_UPDATE_TERMINALSI();
+
+ nl_double m_vi;
+ };
+
+ // ----------------------------------------------------------------------------------------
+ // nld_CCCS
+ // ----------------------------------------------------------------------------------------
+
+ /*
+ * Current controlled current source
+ *
+ * IP ---+ +------> OP
+ * | |
+ * RI I
+ * RI => G => I IOut = (V(IP)-V(IN)) / RI * G
+ * RI I
+ * | |
+ * IN ---+ +------< ON
+ *
+ * G=1 ==> 1A ==> 1A
+ *
+ * RI = 1
+ *
+ * This needs high levels of accuracy to work with 1 Ohm RI.
+ *
+ */
+
+ NETLIB_OBJECT_DERIVED(CCCS, VCCS)
+ {
+ public:
+ NETLIB_CONSTRUCTOR_DERIVED(CCCS, VCCS)
+ , m_gfac(1.0)
+ {
+ m_gfac = NL_FCONST(1.0) / m_RI();
+ }
+
+ protected:
+ NETLIB_UPDATEI();
+ NETLIB_RESETI();
+ NETLIB_UPDATE_PARAMI();
+
+ nl_double m_gfac;
+ };
+
+
+ // ----------------------------------------------------------------------------------------
+ // nld_VCVS
+ // ----------------------------------------------------------------------------------------
+
+ /*
+ * Voltage controlled voltage source
+ *
+ * Parameters:
+ * G Default: 1
+ * RO Default: 1 (would be typically 50 for an op-amp
+ *
+ * IP ---+ +--+---- OP
+ * | | |
+ * RI I RO
+ * RI => G => I RO V(OP) - V(ON) = (V(IP)-V(IN)) * G
+ * RI I RO
+ * | | |
+ * IN ---+ +--+---- ON
+ *
+ * G=1 ==> 1V ==> 1V
+ *
+ * RI = 1 / NETLIST_GMIN
+ *
+ * Internal GI = G / RO
+ *
+ */
+
+
+ NETLIB_OBJECT_DERIVED(VCVS, VCCS)
+ {
+ public:
+ NETLIB_CONSTRUCTOR_DERIVED(VCVS, VCCS)
+ , m_RO(*this, "RO", 1.0)
+ , m_OP2(*this, "_OP2")
+ , m_ON2(*this, "_ON2")
+ {
+ m_OP2.m_otherterm = &m_ON2;
+ m_ON2.m_otherterm = &m_OP2;
+
+ connect(m_OP2, m_OP1);
+ connect(m_ON2, m_ON1);
+ }
+
+ param_double_t m_RO;
+
+ protected:
+ //NETLIB_UPDATEI();
+ NETLIB_RESETI();
+ //NETLIB_UPDATE_PARAMI();
+
+ terminal_t m_OP2;
+ terminal_t m_ON2;
+
+ };
+
+ }
+}
+
+#endif /* NLD_FOURTERM_H_ */
diff --git a/src/lib/netlist/analog/nld_twoterm.cpp b/src/lib/netlist/analog/nlid_twoterm.cpp
index a87e0c03f88..a9a4edb604a 100644
--- a/src/lib/netlist/analog/nld_twoterm.cpp
+++ b/src/lib/netlist/analog/nlid_twoterm.cpp
@@ -5,10 +5,12 @@
*
*/
-#include <solver/nld_solver.h>
-#include <algorithm>
+#include "solver/nld_solver.h"
-#include "nld_twoterm.h"
+#include "nlid_twoterm.h"
+#include "nl_factory.h"
+
+#include <cmath>
namespace netlist
{
@@ -23,7 +25,9 @@ generic_diode::generic_diode(device_t &dev, pstring name)
, m_Id(dev, name + ".m_Id", 0.0)
, m_G(dev, name + ".m_G", 1e-15)
, m_Vt(0.0)
+ , m_Vmin(0.0)
, m_Is(0.0)
+ , m_logIs(0.0)
, m_n(0.0)
, m_gmin(1e-15)
, m_VtInv(0.0)
@@ -36,10 +40,12 @@ void generic_diode::set_param(const nl_double Is, const nl_double n, nl_double g
{
static const double csqrt2 = std::sqrt(2.0);
m_Is = Is;
+ m_logIs = std::log(Is);
m_n = n;
m_gmin = gmin;
m_Vt = 0.0258 * m_n;
+ m_Vmin = -5.0 * m_Vt;
m_Vcrit = m_Vt * std::log(m_Vt / m_Is / csqrt2);
m_VtInv = 1.0 / m_Vt;
@@ -47,8 +53,7 @@ void generic_diode::set_param(const nl_double Is, const nl_double n, nl_double g
void generic_diode::update_diode(const nl_double nVd)
{
-#if 1
- if (nVd < NL_FCONST(-5.0) * m_Vt)
+ if (nVd < m_Vmin)
{
m_Vd = nVd;
m_G = m_gmin;
@@ -58,29 +63,20 @@ void generic_diode::update_diode(const nl_double nVd)
{
m_Vd = nVd;
//m_Vd = m_Vd + 10.0 * m_Vt * std::tanh((nVd - m_Vd) / 10.0 / m_Vt);
- const nl_double eVDVt = std::exp(m_Vd * m_VtInv);
- m_Id = m_Is * (eVDVt - NL_FCONST(1.0));
- m_G = m_Is * m_VtInv * eVDVt + m_gmin;
+ //const double IseVDVt = m_Is * std::exp(m_Vd * m_VtInv);
+ const double IseVDVt = std::exp(m_logIs + m_Vd * m_VtInv);
+ m_Id = IseVDVt - m_Is;
+ m_G = IseVDVt * m_VtInv + m_gmin;
}
else
{
-#if 1
- const nl_double a = std::max((nVd - m_Vd) * m_VtInv, NL_FCONST(-0.99));
+ const double a = std::max((nVd - m_Vd) * m_VtInv, NL_FCONST(-0.99));
m_Vd = m_Vd + std::log1p(a) * m_Vt;
-#else
- m_Vd = m_Vd + 10.0 * m_Vt * std::tanh((nVd - m_Vd) / 10.0 / m_Vt);
-#endif
- const nl_double eVDVt = std::exp(m_Vd * m_VtInv);
- m_Id = m_Is * (eVDVt - NL_FCONST(1.0));
-
- m_G = m_Is * m_VtInv * eVDVt + m_gmin;
+ //const double IseVDVt = m_Is * std::exp(m_Vd * m_VtInv);
+ const double IseVDVt = std::exp(m_logIs + m_Vd * m_VtInv);
+ m_Id = IseVDVt - m_Is;
+ m_G = IseVDVt * m_VtInv + m_gmin;
}
-#else
- m_Vd = m_Vd + 20.0 * m_Vt * std::tanh((nVd - m_Vd) / 20.0 / m_Vt);
- const nl_double eVDVt = std::exp(m_Vd * m_VtInv);
- m_Id = m_Is * (eVDVt - NL_FCONST(1.0));
- m_G = m_Is * m_VtInv * eVDVt + m_gmin;
-#endif
}
// ----------------------------------------------------------------------------------------
@@ -300,6 +296,13 @@ NETLIB_UPDATE(VS)
NETLIB_NAME(twoterm)::update();
}
+NETLIB_TIMESTEP(VS)
+{
+ this->set(1.0 / m_R(),
+ m_compiled.evaluate(std::vector<double>({netlist().time().as_double()})),
+ 0.0);
+}
+
// ----------------------------------------------------------------------------------------
// nld_CS
// ----------------------------------------------------------------------------------------
@@ -319,5 +322,24 @@ NETLIB_UPDATE(CS)
NETLIB_NAME(twoterm)::update();
}
- } //namespace devices
+NETLIB_TIMESTEP(CS)
+{
+ const double I = m_compiled.evaluate(std::vector<double>({netlist().time().as_double()}));
+ set_mat(0.0, 0.0, -I,
+ 0.0, 0.0, I);
+}
+
+ } //namespace analog
+
+ namespace devices {
+ NETLIB_DEVICE_IMPL_NS(analog, R)
+ NETLIB_DEVICE_IMPL_NS(analog, POT)
+ NETLIB_DEVICE_IMPL_NS(analog, POT2)
+ NETLIB_DEVICE_IMPL_NS(analog, C)
+ NETLIB_DEVICE_IMPL_NS(analog, L)
+ NETLIB_DEVICE_IMPL_NS(analog, D)
+ NETLIB_DEVICE_IMPL_NS(analog, VS)
+ NETLIB_DEVICE_IMPL_NS(analog, CS)
+ }
+
} // namespace netlist
diff --git a/src/lib/netlist/analog/nlid_twoterm.h b/src/lib/netlist/analog/nlid_twoterm.h
new file mode 100644
index 00000000000..6166c707d2d
--- /dev/null
+++ b/src/lib/netlist/analog/nlid_twoterm.h
@@ -0,0 +1,448 @@
+// license:GPL-2.0+
+// copyright-holders:Couriersud
+/*
+ * nld_twoterm.h
+ *
+ * Devices with two terminals ...
+ *
+ *
+ * (k)
+ * +-----T-----+
+ * | | |
+ * | +--+--+ |
+ * | | | |
+ * | R | |
+ * | R | |
+ * | R I |
+ * | | I | Device n
+ * | V+ I |
+ * | V | |
+ * | V- | |
+ * | | | |
+ * | +--+--+ |
+ * | | |
+ * +-----T-----+
+ * (l)
+ *
+ * This is a resistance in series to a voltage source and paralleled by a
+ * current source. This is suitable to model voltage sources, current sources,
+ * resistors, capacitors, inductances and diodes.
+ *
+ */
+
+#ifndef NLID_TWOTERM_H_
+#define NLID_TWOTERM_H_
+
+#include "nl_base.h"
+#include "plib/pfunction.h"
+
+// -----------------------------------------------------------------------------
+// Implementation
+// -----------------------------------------------------------------------------
+
+namespace netlist
+{
+ namespace analog
+ {
+// -----------------------------------------------------------------------------
+// nld_twoterm
+// -----------------------------------------------------------------------------
+
+NETLIB_OBJECT(twoterm)
+{
+ NETLIB_CONSTRUCTOR_EX(twoterm, bool terminals_owned = false)
+ , m_P(bselect(terminals_owned, owner, *this), (terminals_owned ? name + "." : "") + "1")
+ , m_N(bselect(terminals_owned, owner, *this), (terminals_owned ? name + "." : "") + "2")
+ {
+ m_P.m_otherterm = &m_N;
+ m_N.m_otherterm = &m_P;
+ }
+
+ terminal_t m_P;
+ terminal_t m_N;
+
+ //NETLIB_UPDATE_TERMINALSI() { }
+ //NETLIB_RESETI() { }
+ NETLIB_UPDATEI();
+
+public:
+ /* inline */ void set(const nl_double G, const nl_double V, const nl_double I)
+ {
+ /* GO, GT, I */
+ m_P.set( G, G, ( V) * G - I);
+ m_N.set( G, G, ( -V) * G + I);
+ }
+
+ /* inline */ nl_double deltaV() const
+ {
+ return m_P.net().Q_Analog() - m_N.net().Q_Analog();
+ }
+
+ void set_mat(const nl_double a11, const nl_double a12, const nl_double r1,
+ const nl_double a21, const nl_double a22, const nl_double r2)
+ {
+ /* GO, GT, I */
+ m_P.set(-a12, a11, r1);
+ m_N.set(-a21, a22, r2);
+ }
+
+private:
+ template <class C>
+ static core_device_t &bselect(bool b, C &d1, core_device_t &d2)
+ {
+ core_device_t *h = dynamic_cast<core_device_t *>(&d1);
+ return b ? *h : d2;
+ }
+};
+
+
+// -----------------------------------------------------------------------------
+// nld_R
+// -----------------------------------------------------------------------------
+
+NETLIB_OBJECT_DERIVED(R_base, twoterm)
+{
+ NETLIB_CONSTRUCTOR_DERIVED(R_base, twoterm)
+ {
+ }
+
+public:
+ inline void set_R(const nl_double R)
+ {
+ const nl_double G = NL_FCONST(1.0) / R;
+ set_mat( G, -G, 0.0,
+ -G, G, 0.0);
+ }
+
+protected:
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+
+};
+
+NETLIB_OBJECT_DERIVED(R, R_base)
+{
+ NETLIB_CONSTRUCTOR_DERIVED(R, R_base)
+ , m_R(*this, "R", 1e9)
+ {
+ }
+
+ param_double_t m_R;
+
+protected:
+
+ NETLIB_RESETI();
+ //NETLIB_UPDATEI() { }
+ NETLIB_UPDATE_PARAMI();
+
+private:
+ /* protect set_R ... it's a recipe to desaster when used to bypass the parameter */
+ using NETLIB_NAME(R_base)::set_R;
+};
+
+// -----------------------------------------------------------------------------
+// nld_POT
+// -----------------------------------------------------------------------------
+
+NETLIB_OBJECT(POT)
+{
+ NETLIB_CONSTRUCTOR(POT)
+ , m_R1(*this, "_R1")
+ , m_R2(*this, "_R2")
+ , m_R(*this, "R", 10000)
+ , m_Dial(*this, "DIAL", 0.5)
+ , m_DialIsLog(*this, "DIALLOG", 0)
+ {
+ register_subalias("1", m_R1.m_P);
+ register_subalias("2", m_R1.m_N);
+ register_subalias("3", m_R2.m_N);
+
+ connect(m_R2.m_P, m_R1.m_N);
+
+ }
+
+ //NETLIB_UPDATEI();
+ NETLIB_RESETI();
+ NETLIB_UPDATE_PARAMI();
+
+private:
+ NETLIB_SUB(R_base) m_R1;
+ NETLIB_SUB(R_base) m_R2;
+
+ param_double_t m_R;
+ param_double_t m_Dial;
+ param_logic_t m_DialIsLog;
+};
+
+NETLIB_OBJECT(POT2)
+{
+ NETLIB_CONSTRUCTOR(POT2)
+ , m_R1(*this, "_R1")
+ , m_R(*this, "R", 10000)
+ , m_Dial(*this, "DIAL", 0.5)
+ , m_DialIsLog(*this, "DIALLOG", 0)
+ , m_Reverse(*this, "REVERSE", 0)
+ {
+ register_subalias("1", m_R1.m_P);
+ register_subalias("2", m_R1.m_N);
+
+ }
+
+ //NETLIB_UPDATEI();
+ NETLIB_RESETI();
+ NETLIB_UPDATE_PARAMI();
+
+private:
+ NETLIB_SUB(R_base) m_R1;
+
+ param_double_t m_R;
+ param_double_t m_Dial;
+ param_logic_t m_DialIsLog;
+ param_logic_t m_Reverse;
+};
+
+
+// -----------------------------------------------------------------------------
+// nld_C
+// -----------------------------------------------------------------------------
+
+NETLIB_OBJECT_DERIVED(C, twoterm)
+{
+public:
+ NETLIB_CONSTRUCTOR_DERIVED(C, twoterm)
+ , m_C(*this, "C", 1e-6)
+ , m_GParallel(0.0)
+ {
+ //register_term("1", m_P);
+ //register_term("2", m_N);
+ }
+
+ NETLIB_IS_TIMESTEP(true)
+ NETLIB_TIMESTEPI();
+
+ param_double_t m_C;
+
+protected:
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+ NETLIB_UPDATE_PARAMI();
+
+private:
+ nl_double m_GParallel;
+
+};
+
+// -----------------------------------------------------------------------------
+// nld_L
+// -----------------------------------------------------------------------------
+
+NETLIB_OBJECT_DERIVED(L, twoterm)
+{
+public:
+ NETLIB_CONSTRUCTOR_DERIVED(L, twoterm)
+ , m_L(*this, "L", 1e-6)
+ , m_GParallel(0.0)
+ , m_G(0.0)
+ , m_I(0.0)
+ {
+ //register_term("1", m_P);
+ //register_term("2", m_N);
+ }
+
+ NETLIB_IS_TIMESTEP(true)
+ NETLIB_TIMESTEPI();
+
+ param_double_t m_L;
+
+protected:
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+ NETLIB_UPDATE_PARAMI();
+
+private:
+ nl_double m_GParallel;
+ nl_double m_G;
+ nl_double m_I;
+};
+
+// -----------------------------------------------------------------------------
+// A generic diode model to be used in other devices (Diode, BJT ...)
+// -----------------------------------------------------------------------------
+
+class generic_diode
+{
+public:
+ generic_diode(device_t &dev, pstring name);
+
+ void update_diode(const double nVd);
+
+ void set_param(const double Is, const double n, double gmin);
+
+ double I() const { return m_Id; }
+ double G() const { return m_G; }
+ double Ieq() const { return (m_Id - m_Vd * m_G); }
+ double Vd() const { return m_Vd; }
+
+ /* owning object must save those ... */
+
+private:
+ state_var<double> m_Vd;
+ state_var<double> m_Id;
+ state_var<double> m_G;
+
+ double m_Vt;
+ double m_Vmin;
+ double m_Is;
+ double m_logIs;
+ double m_n;
+ double m_gmin;
+
+ double m_VtInv;
+ double m_Vcrit;
+};
+
+/*! Class representing the diode model paramers.
+ * This is the model representation of the diode model. Typically, SPICE uses
+ * the following parameters. A "Y" in the first column indicates that the
+ * parameter is actually used in netlist.
+ *
+ * |NL? |name |parameter |units|default| example|area |
+ * |:--:|:-----|:--------------------------------|:----|------:|-------:|:----:|
+ * | Y |IS |saturation current |A |1.0e-14| 1.0e-14| * |
+ * | |RS |ohmic resistanc |Ohm | 0| 10| * |
+ * | Y |N |emission coefficient |- | 1| 1| |
+ * | |TT |transit-time |sec | 0| 0.1ns| |
+ * | |CJO |zero-bias junction capacitance |F | 0| 2pF| * |
+ * | |VJ |junction potential |V | 1| 0.6| |
+ * | |M |grading coefficient |- | 0.5| 0.5| |
+ * | |EG |band-gap energy |eV | 1.11| 1.11 Si| |
+ * | |XTI |saturation-current temp.exp |- | 3|3.0 pn. 2.0 Schottky| |
+ * | |KF |flicker noise coefficient |- | 0| | |
+ * | |AF |flicker noise exponent |- | 1| | |
+ * | |FC |coefficient for forward-bias depletion capacitance formula|-|0.5|| |
+ * | |BV |reverse breakdown voltage |V |infinite| 40| |
+ * | |IBV |current at breakdown voltage |V | 0.001| | |
+ * | |TNOM |parameter measurement temperature|deg C| 27| 50| |
+ *
+ */
+
+class diode_model_t : public param_model_t
+{
+public:
+ diode_model_t(device_t &device, const pstring name, const pstring val)
+ : param_model_t(device, name, val)
+ , m_IS(*this, "IS")
+ , m_N(*this, "N")
+ {}
+
+ value_t m_IS; //!< saturation current.
+ value_t m_N; //!< emission coefficient.
+};
+
+
+// -----------------------------------------------------------------------------
+// nld_D
+// -----------------------------------------------------------------------------
+
+NETLIB_OBJECT_DERIVED(D, twoterm)
+{
+public:
+ NETLIB_CONSTRUCTOR_DERIVED(D, twoterm)
+ , m_model(*this, "MODEL", "")
+ , m_D(*this, "m_D")
+ {
+ register_subalias("A", m_P);
+ register_subalias("K", m_N);
+ }
+
+ template <class CLASS>
+ NETLIB_NAME(D)(CLASS &owner, const pstring name, const pstring model)
+ : NETLIB_NAME(twoterm)(owner, name)
+ , m_model(*this, "MODEL", model)
+ , m_D(*this, "m_D")
+ {
+ register_subalias("A", m_P);
+ register_subalias("K", m_N);
+ }
+
+ NETLIB_IS_DYNAMIC(true)
+ NETLIB_UPDATE_TERMINALSI();
+
+ diode_model_t m_model;
+
+protected:
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+ NETLIB_UPDATE_PARAMI();
+
+ generic_diode m_D;
+};
+
+
+// -----------------------------------------------------------------------------
+// nld_VS - Voltage source
+//
+// netlist voltage source must have inner resistance
+// -----------------------------------------------------------------------------
+
+NETLIB_OBJECT_DERIVED(VS, twoterm)
+{
+public:
+ NETLIB_CONSTRUCTOR_DERIVED(VS, twoterm)
+ , m_R(*this, "R", 0.1)
+ , m_V(*this, "V", 0.0)
+ , m_func(*this,"FUNC", "")
+ {
+ register_subalias("P", m_P);
+ register_subalias("N", m_N);
+ if (m_func() != "")
+ m_compiled.compile_postfix(std::vector<pstring>({{"T"}}), m_func());
+ }
+
+ NETLIB_IS_TIMESTEP(m_func() != "")
+ NETLIB_TIMESTEPI();
+
+protected:
+ NETLIB_UPDATEI();
+ NETLIB_RESETI();
+
+ param_double_t m_R;
+ param_double_t m_V;
+ param_str_t m_func;
+ plib::pfunction m_compiled;
+};
+
+// -----------------------------------------------------------------------------
+// nld_CS - Current source
+// -----------------------------------------------------------------------------
+
+NETLIB_OBJECT_DERIVED(CS, twoterm)
+{
+public:
+ NETLIB_CONSTRUCTOR_DERIVED(CS, twoterm)
+ , m_I(*this, "I", 1.0)
+ , m_func(*this,"FUNC", "")
+ {
+ register_subalias("P", m_P);
+ register_subalias("N", m_N);
+ if (m_func() != "")
+ m_compiled.compile_postfix(std::vector<pstring>({{"T"}}), m_func());
+ }
+
+ NETLIB_IS_TIMESTEP(m_func() != "")
+ NETLIB_TIMESTEPI();
+protected:
+
+ NETLIB_UPDATEI();
+ NETLIB_RESETI();
+
+ param_double_t m_I;
+ param_str_t m_func;
+ plib::pfunction m_compiled;
+};
+
+
+ } //namespace devices
+} // namespace netlist
+
+#endif /* NLD_TWOTERM_H_ */
diff --git a/src/lib/netlist/build/doxygen.conf b/src/lib/netlist/build/doxygen.conf
index adf69b30e54..9de9b691114 100644
--- a/src/lib/netlist/build/doxygen.conf
+++ b/src/lib/netlist/build/doxygen.conf
@@ -24,7 +24,7 @@
# for the list of possible encodings.
# The default value is: UTF-8.
-DOXYFILE_ENCODING = UTF-8
+DOXYFILE_ENCODING = UTF-8
# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
# double-quotes, unless you are using Doxywizard) that should identify the
@@ -32,33 +32,33 @@ DOXYFILE_ENCODING = UTF-8
# title of most generated pages and in a few other places.
# The default value is: My Project.
-PROJECT_NAME = "My Project"
+PROJECT_NAME = Netlist documentaton
# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
# could be handy for archiving the generated documentation or if some version
# control system is used.
-PROJECT_NUMBER =
+PROJECT_NUMBER =
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
# quick idea about the purpose of the project. Keep the description short.
-PROJECT_BRIEF =
+PROJECT_BRIEF =
# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
# in the documentation. The maximum height of the logo should not exceed 55
# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
# the logo to the output directory.
-PROJECT_LOGO =
+PROJECT_LOGO =
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
# into which the generated documentation will be written. If a relative path is
# entered, it will be relative to the location where doxygen was started. If
# left blank the current directory will be used.
-OUTPUT_DIRECTORY = doxy
+OUTPUT_DIRECTORY = doxy
# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
# directories (in 2 levels) under the output directory of each output format and
@@ -68,7 +68,7 @@ OUTPUT_DIRECTORY = doxy
# performance problems for the file system.
# The default value is: NO.
-CREATE_SUBDIRS = NO
+CREATE_SUBDIRS = NO
# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
# characters to appear in the names of generated files. If set to NO, non-ASCII
@@ -76,7 +76,7 @@ CREATE_SUBDIRS = NO
# U+3044.
# The default value is: NO.
-ALLOW_UNICODE_NAMES = NO
+ALLOW_UNICODE_NAMES = NO
# The OUTPUT_LANGUAGE tag is used to specify the language in which all
# documentation generated by doxygen is written. Doxygen will use this
@@ -91,14 +91,14 @@ ALLOW_UNICODE_NAMES = NO
# Ukrainian and Vietnamese.
# The default value is: English.
-OUTPUT_LANGUAGE = English
+OUTPUT_LANGUAGE = English
# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
# descriptions after the members that are listed in the file and class
# documentation (similar to Javadoc). Set to NO to disable this.
# The default value is: YES.
-BRIEF_MEMBER_DESC = YES
+BRIEF_MEMBER_DESC = YES
# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
# description of a member or function before the detailed description
@@ -107,7 +107,7 @@ BRIEF_MEMBER_DESC = YES
# brief descriptions will be completely suppressed.
# The default value is: YES.
-REPEAT_BRIEF = YES
+REPEAT_BRIEF = YES
# This tag implements a quasi-intelligent brief description abbreviator that is
# used to form the text in various listings. Each string in this list, if found
@@ -118,14 +118,14 @@ REPEAT_BRIEF = YES
# the entity):The $name class, The $name widget, The $name file, is, provides,
# specifies, contains, represents, a, an and the.
-ABBREVIATE_BRIEF =
+ABBREVIATE_BRIEF =
# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
# doxygen will generate a detailed section even if there is only a brief
# description.
# The default value is: NO.
-ALWAYS_DETAILED_SEC = NO
+ALWAYS_DETAILED_SEC = NO
# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
# inherited members of a class in the documentation of that class as if those
@@ -133,14 +133,14 @@ ALWAYS_DETAILED_SEC = NO
# operators of the base classes will not be shown.
# The default value is: NO.
-INLINE_INHERITED_MEMB = NO
+INLINE_INHERITED_MEMB = NO
# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
# before files name in the file list and in the header files. If set to NO the
# shortest path that makes the file name unique will be used
# The default value is: YES.
-FULL_PATH_NAMES = YES
+FULL_PATH_NAMES = YES
# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
# Stripping is only done if one of the specified strings matches the left-hand
@@ -152,7 +152,7 @@ FULL_PATH_NAMES = YES
# will be relative from the directory where doxygen is started.
# This tag requires that the tag FULL_PATH_NAMES is set to YES.
-STRIP_FROM_PATH = ../..
+STRIP_FROM_PATH = ../..
# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
# path mentioned in the documentation of a class, which tells the reader which
@@ -161,14 +161,14 @@ STRIP_FROM_PATH = ../..
# specify the list of include paths that are normally passed to the compiler
# using the -I flag.
-STRIP_FROM_INC_PATH =
+STRIP_FROM_INC_PATH =
# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
# less readable) file names. This can be useful is your file systems doesn't
# support long names like on DOS, Mac, or CD-ROM.
# The default value is: NO.
-SHORT_NAMES = NO
+SHORT_NAMES = NO
# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
# first line (until the first dot) of a Javadoc-style comment as the brief
@@ -177,7 +177,7 @@ SHORT_NAMES = NO
# description.)
# The default value is: NO.
-JAVADOC_AUTOBRIEF = YES
+JAVADOC_AUTOBRIEF = YES
# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
# line (until the first dot) of a Qt-style comment as the brief description. If
@@ -185,7 +185,7 @@ JAVADOC_AUTOBRIEF = YES
# requiring an explicit \brief command for a brief description.)
# The default value is: NO.
-QT_AUTOBRIEF = YES
+QT_AUTOBRIEF = YES
# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
@@ -203,20 +203,20 @@ MULTILINE_CPP_IS_BRIEF = NO
# documentation from any documented member that it re-implements.
# The default value is: YES.
-INHERIT_DOCS = YES
+INHERIT_DOCS = YES
# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
# page for each member. If set to NO, the documentation of a member will be part
# of the file/class/namespace that contains it.
# The default value is: NO.
-SEPARATE_MEMBER_PAGES = NO
+SEPARATE_MEMBER_PAGES = NO
# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
# uses this value to replace tabs by spaces in code fragments.
# Minimum value: 1, maximum value: 16, default value: 4.
-TAB_SIZE = 4
+TAB_SIZE = 4
# This tag can be used to specify a number of aliases that act as commands in
# the documentation. An alias has the form:
@@ -228,13 +228,13 @@ TAB_SIZE = 4
# "Side Effects:". You can put \n's in the value part of an alias to insert
# newlines.
-ALIASES =
+ALIASES =
# This tag can be used to specify a number of word-keyword mappings (TCL only).
# A mapping has the form "name=value". For example adding "class=itcl::class"
# will allow you to use the command class in the itcl::class meaning.
-TCL_SUBST =
+TCL_SUBST =
# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
# only. Doxygen will then generate output that is more tailored for C. For
@@ -242,7 +242,7 @@ TCL_SUBST =
# members will be omitted, etc.
# The default value is: NO.
-OPTIMIZE_OUTPUT_FOR_C = NO
+OPTIMIZE_OUTPUT_FOR_C = NO
# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
# Python sources only. Doxygen will then generate output that is more tailored
@@ -250,19 +250,19 @@ OPTIMIZE_OUTPUT_FOR_C = NO
# qualified scopes will look different, etc.
# The default value is: NO.
-OPTIMIZE_OUTPUT_JAVA = NO
+OPTIMIZE_OUTPUT_JAVA = NO
# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
# sources. Doxygen will then generate output that is tailored for Fortran.
# The default value is: NO.
-OPTIMIZE_FOR_FORTRAN = NO
+OPTIMIZE_FOR_FORTRAN = NO
# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
# sources. Doxygen will then generate output that is tailored for VHDL.
# The default value is: NO.
-OPTIMIZE_OUTPUT_VHDL = NO
+OPTIMIZE_OUTPUT_VHDL = NO
# Doxygen selects the parser to use depending on the extension of the files it
# parses. With this tag you can assign which parser to use for a given
@@ -281,7 +281,7 @@ OPTIMIZE_OUTPUT_VHDL = NO
# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
# the files are not read by doxygen.
-EXTENSION_MAPPING =
+EXTENSION_MAPPING =
# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
# according to the Markdown format, which allows for more readable
@@ -291,7 +291,7 @@ EXTENSION_MAPPING =
# case of backward compatibilities issues.
# The default value is: YES.
-MARKDOWN_SUPPORT = YES
+MARKDOWN_SUPPORT = YES
# When enabled doxygen tries to link words that correspond to documented
# classes, or namespaces to their corresponding documentation. Such a link can
@@ -299,7 +299,7 @@ MARKDOWN_SUPPORT = YES
# globally by setting AUTOLINK_SUPPORT to NO.
# The default value is: YES.
-AUTOLINK_SUPPORT = YES
+AUTOLINK_SUPPORT = YES
# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
# to include (a tag file for) the STL sources as input, then you should set this
@@ -309,13 +309,13 @@ AUTOLINK_SUPPORT = YES
# diagrams that involve STL classes more complete and accurate.
# The default value is: NO.
-BUILTIN_STL_SUPPORT = NO
+BUILTIN_STL_SUPPORT = NO
# If you use Microsoft's C++/CLI language, you should set this option to YES to
# enable parsing support.
# The default value is: NO.
-CPP_CLI_SUPPORT = NO
+CPP_CLI_SUPPORT = NO
# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
@@ -323,7 +323,7 @@ CPP_CLI_SUPPORT = NO
# of private inheritance when no explicit protection keyword is present.
# The default value is: NO.
-SIP_SUPPORT = NO
+SIP_SUPPORT = NO
# For Microsoft's IDL there are propget and propput attributes to indicate
# getter and setter methods for a property. Setting this option to YES will make
@@ -333,7 +333,7 @@ SIP_SUPPORT = NO
# should set this option to NO.
# The default value is: YES.
-IDL_PROPERTY_SUPPORT = YES
+IDL_PROPERTY_SUPPORT = YES
# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
# tag is set to YES then doxygen will reuse the documentation of the first
@@ -341,7 +341,7 @@ IDL_PROPERTY_SUPPORT = YES
# all members of a group must be documented explicitly.
# The default value is: NO.
-DISTRIBUTE_GROUP_DOC = NO
+DISTRIBUTE_GROUP_DOC = NO
# If one adds a struct or class to a group and this option is enabled, then also
# any nested class or struct is added to the same group. By default this option
@@ -357,7 +357,7 @@ GROUP_NESTED_COMPOUNDS = NO
# \nosubgrouping command.
# The default value is: YES.
-SUBGROUPING = YES
+SUBGROUPING = YES
# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
# are shown inside the group in which they are included (e.g. using \ingroup)
@@ -378,7 +378,7 @@ INLINE_GROUPED_CLASSES = NO
# Man pages) or section (for LaTeX and RTF).
# The default value is: NO.
-INLINE_SIMPLE_STRUCTS = NO
+INLINE_SIMPLE_STRUCTS = NO
# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
# enum is documented as struct, union, or enum with the name of the typedef. So
@@ -389,7 +389,7 @@ INLINE_SIMPLE_STRUCTS = NO
# types are typedef'ed and only the typedef is referenced, never the tag name.
# The default value is: NO.
-TYPEDEF_HIDES_STRUCT = NO
+TYPEDEF_HIDES_STRUCT = NO
# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
# cache is used to resolve symbols given their name and scope. Since this can be
@@ -402,7 +402,7 @@ TYPEDEF_HIDES_STRUCT = NO
# the optimal cache size from a speed point of view.
# Minimum value: 0, maximum value: 9, default value: 0.
-LOOKUP_CACHE_SIZE = 0
+LOOKUP_CACHE_SIZE = 0
#---------------------------------------------------------------------------
# Build related configuration options
@@ -416,25 +416,25 @@ LOOKUP_CACHE_SIZE = 0
# normally produced when WARNINGS is set to YES.
# The default value is: NO.
-EXTRACT_ALL = NO
+EXTRACT_ALL = NO
# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
# be included in the documentation.
# The default value is: NO.
-EXTRACT_PRIVATE = NO
+EXTRACT_PRIVATE = NO
# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
# scope will be included in the documentation.
# The default value is: NO.
-EXTRACT_PACKAGE = NO
+EXTRACT_PACKAGE = NO
# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
# included in the documentation.
# The default value is: NO.
-EXTRACT_STATIC = NO
+EXTRACT_STATIC = NO
# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
# locally in source files will be included in the documentation. If set to NO,
@@ -442,7 +442,7 @@ EXTRACT_STATIC = NO
# for Java sources.
# The default value is: YES.
-EXTRACT_LOCAL_CLASSES = YES
+EXTRACT_LOCAL_CLASSES = YES
# This flag is only useful for Objective-C code. If set to YES, local methods,
# which are defined in the implementation section but not in the interface are
@@ -450,7 +450,7 @@ EXTRACT_LOCAL_CLASSES = YES
# included.
# The default value is: NO.
-EXTRACT_LOCAL_METHODS = NO
+EXTRACT_LOCAL_METHODS = NO
# If this flag is set to YES, the members of anonymous namespaces will be
# extracted and appear in the documentation as a namespace called
@@ -459,7 +459,7 @@ EXTRACT_LOCAL_METHODS = NO
# are hidden.
# The default value is: NO.
-EXTRACT_ANON_NSPACES = NO
+EXTRACT_ANON_NSPACES = NO
# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
# undocumented members inside documented classes or files. If set to NO these
@@ -467,7 +467,7 @@ EXTRACT_ANON_NSPACES = NO
# section is generated. This option has no effect if EXTRACT_ALL is enabled.
# The default value is: NO.
-HIDE_UNDOC_MEMBERS = NO
+HIDE_UNDOC_MEMBERS = YES
# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
# undocumented classes that are normally visible in the class hierarchy. If set
@@ -475,28 +475,28 @@ HIDE_UNDOC_MEMBERS = NO
# has no effect if EXTRACT_ALL is enabled.
# The default value is: NO.
-HIDE_UNDOC_CLASSES = NO
+HIDE_UNDOC_CLASSES = YES
# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
# (class|struct|union) declarations. If set to NO, these declarations will be
# included in the documentation.
# The default value is: NO.
-HIDE_FRIEND_COMPOUNDS = NO
+HIDE_FRIEND_COMPOUNDS = NO
# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
# documentation blocks found inside the body of a function. If set to NO, these
# blocks will be appended to the function's detailed documentation block.
# The default value is: NO.
-HIDE_IN_BODY_DOCS = NO
+HIDE_IN_BODY_DOCS = NO
# The INTERNAL_DOCS tag determines if documentation that is typed after a
# \internal command is included. If the tag is set to NO then the documentation
# will be excluded. Set it to YES to include the internal documentation.
# The default value is: NO.
-INTERNAL_DOCS = NO
+INTERNAL_DOCS = NO
# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
# names in lower-case letters. If set to YES, upper-case letters are also
@@ -505,53 +505,53 @@ INTERNAL_DOCS = NO
# and Mac users are advised to set this option to NO.
# The default value is: system dependent.
-CASE_SENSE_NAMES = YES
+CASE_SENSE_NAMES = YES
# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
# their full class and namespace scopes in the documentation. If set to YES, the
# scope will be hidden.
# The default value is: NO.
-HIDE_SCOPE_NAMES = NO
+HIDE_SCOPE_NAMES = NO
# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
# append additional text to a page's title, such as Class Reference. If set to
# YES the compound reference will be hidden.
# The default value is: NO.
-HIDE_COMPOUND_REFERENCE= NO
+HIDE_COMPOUND_REFERENCE = NO
# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
# the files that are included by a file in the documentation of that file.
# The default value is: YES.
-SHOW_INCLUDE_FILES = YES
+SHOW_INCLUDE_FILES = YES
# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
# grouped member an include statement to the documentation, telling the reader
# which file to include in order to use the member.
# The default value is: NO.
-SHOW_GROUPED_MEMB_INC = NO
+SHOW_GROUPED_MEMB_INC = NO
# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
# files with double quotes in the documentation rather than with sharp brackets.
# The default value is: NO.
-FORCE_LOCAL_INCLUDES = NO
+FORCE_LOCAL_INCLUDES = NO
# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
# documentation for inline members.
# The default value is: YES.
-INLINE_INFO = YES
+INLINE_INFO = YES
# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
# (detailed) documentation of file and class members alphabetically by member
# name. If set to NO, the members will appear in declaration order.
# The default value is: YES.
-SORT_MEMBER_DOCS = YES
+SORT_MEMBER_DOCS = YES
# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
# descriptions of file, namespace and class members alphabetically by member
@@ -559,7 +559,7 @@ SORT_MEMBER_DOCS = YES
# this will also influence the order of the classes in the class list.
# The default value is: NO.
-SORT_BRIEF_DOCS = NO
+SORT_BRIEF_DOCS = NO
# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
# (brief and detailed) documentation of class members so that constructors and
@@ -578,7 +578,7 @@ SORT_MEMBERS_CTORS_1ST = NO
# appear in their defined order.
# The default value is: NO.
-SORT_GROUP_NAMES = NO
+SORT_GROUP_NAMES = NO
# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
# fully-qualified names, including namespaces. If set to NO, the class list will
@@ -588,7 +588,7 @@ SORT_GROUP_NAMES = NO
# list.
# The default value is: NO.
-SORT_BY_SCOPE_NAME = NO
+SORT_BY_SCOPE_NAME = NO
# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
# type resolution of all parameters of a function it will reject a match between
@@ -598,38 +598,38 @@ SORT_BY_SCOPE_NAME = NO
# accept a match between prototype and implementation in such cases.
# The default value is: NO.
-STRICT_PROTO_MATCHING = NO
+STRICT_PROTO_MATCHING = NO
# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
# list. This list is created by putting \todo commands in the documentation.
# The default value is: YES.
-GENERATE_TODOLIST = YES
+GENERATE_TODOLIST = YES
# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
# list. This list is created by putting \test commands in the documentation.
# The default value is: YES.
-GENERATE_TESTLIST = YES
+GENERATE_TESTLIST = YES
# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
# list. This list is created by putting \bug commands in the documentation.
# The default value is: YES.
-GENERATE_BUGLIST = YES
+GENERATE_BUGLIST = YES
# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
# the deprecated list. This list is created by putting \deprecated commands in
# the documentation.
# The default value is: YES.
-GENERATE_DEPRECATEDLIST= YES
+GENERATE_DEPRECATEDLIST = YES
# The ENABLED_SECTIONS tag can be used to enable conditional documentation
# sections, marked by \if <section_label> ... \endif and \cond <section_label>
# ... \endcond blocks.
-ENABLED_SECTIONS =
+ENABLED_SECTIONS =
# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
# initial value of a variable or macro / define can have for it to appear in the
@@ -640,28 +640,28 @@ ENABLED_SECTIONS =
# documentation regardless of this setting.
# Minimum value: 0, maximum value: 10000, default value: 30.
-MAX_INITIALIZER_LINES = 30
+MAX_INITIALIZER_LINES = 30
# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
# the bottom of the documentation of classes and structs. If set to YES, the
# list will mention the files that were used to generate the documentation.
# The default value is: YES.
-SHOW_USED_FILES = YES
+SHOW_USED_FILES = YES
# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
# will remove the Files entry from the Quick Index and from the Folder Tree View
# (if specified).
# The default value is: YES.
-SHOW_FILES = YES
+SHOW_FILES = YES
# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
# page. This will remove the Namespaces entry from the Quick Index and from the
# Folder Tree View (if specified).
# The default value is: YES.
-SHOW_NAMESPACES = YES
+SHOW_NAMESPACES = YES
# The FILE_VERSION_FILTER tag can be used to specify a program or script that
# doxygen should invoke to get the current version for each file (typically from
@@ -671,7 +671,7 @@ SHOW_NAMESPACES = YES
# by doxygen. Whatever the program writes to standard output is used as the file
# version. For an example see the documentation.
-FILE_VERSION_FILTER =
+FILE_VERSION_FILTER =
# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
# by doxygen. The layout file controls the global structure of the generated
@@ -684,7 +684,7 @@ FILE_VERSION_FILTER =
# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
# tag is left empty.
-LAYOUT_FILE =
+LAYOUT_FILE =
# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
# the reference definitions. This must be a list of .bib files. The .bib
@@ -694,7 +694,7 @@ LAYOUT_FILE =
# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
# search path. See also \cite for info how to create references.
-CITE_BIB_FILES =
+CITE_BIB_FILES =
#---------------------------------------------------------------------------
# Configuration options related to warning and progress messages
@@ -705,7 +705,7 @@ CITE_BIB_FILES =
# messages are off.
# The default value is: NO.
-QUIET = NO
+QUIET = NO
# The WARNINGS tag can be used to turn on/off the warning messages that are
# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
@@ -714,14 +714,14 @@ QUIET = NO
# Tip: Turn warnings on while writing the documentation.
# The default value is: YES.
-WARNINGS = YES
+WARNINGS = YES
# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
# will automatically be disabled.
# The default value is: YES.
-WARN_IF_UNDOCUMENTED = YES
+WARN_IF_UNDOCUMENTED = YES
# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
# potential errors in the documentation, such as not documenting some parameters
@@ -729,7 +729,7 @@ WARN_IF_UNDOCUMENTED = YES
# markup commands wrongly.
# The default value is: YES.
-WARN_IF_DOC_ERROR = YES
+WARN_IF_DOC_ERROR = YES
# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
# are documented, but have no documentation for their parameters or return
@@ -737,13 +737,13 @@ WARN_IF_DOC_ERROR = YES
# parameter documentation, but not about the absence of documentation.
# The default value is: NO.
-WARN_NO_PARAMDOC = NO
+WARN_NO_PARAMDOC = NO
# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
# a warning is encountered.
# The default value is: NO.
-WARN_AS_ERROR = NO
+WARN_AS_ERROR = NO
# The WARN_FORMAT tag determines the format of the warning messages that doxygen
# can produce. The string should contain the $file, $line, and $text tags, which
@@ -753,13 +753,13 @@ WARN_AS_ERROR = NO
# FILE_VERSION_FILTER)
# The default value is: $file:$line: $text.
-WARN_FORMAT = "$file:$line: $text"
+WARN_FORMAT = "$file:$line: $text"
# The WARN_LOGFILE tag can be used to specify a file to which warning and error
# messages should be written. If left blank the output is written to standard
# error (stderr).
-WARN_LOGFILE =
+WARN_LOGFILE =
#---------------------------------------------------------------------------
# Configuration options related to the input files
@@ -771,7 +771,7 @@ WARN_LOGFILE =
# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
# Note: If this tag is empty the current directory is searched.
-INPUT = ".." "../analog" "../documentation"
+INPUT = ".." "../analog" "../documentation"
# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
@@ -780,7 +780,7 @@ INPUT = ".." "../analog" "../documentation"
# possible encodings.
# The default value is: UTF-8.
-INPUT_ENCODING = UTF-8
+INPUT_ENCODING = UTF-8
# If the value of the INPUT tag contains directories, you can use the
# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
@@ -796,13 +796,13 @@ INPUT_ENCODING = UTF-8
# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f, *.for, *.tcl,
# *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js.
-FILE_PATTERNS = *.h *.cpp
+FILE_PATTERNS = *.h *.cpp
# The RECURSIVE tag can be used to specify whether or not subdirectories should
# be searched for input files as well.
# The default value is: NO.
-RECURSIVE = NO
+RECURSIVE = NO
# The EXCLUDE tag can be used to specify files and/or directories that should be
# excluded from the INPUT source files. This way you can easily exclude a
@@ -811,14 +811,14 @@ RECURSIVE = NO
# Note that relative paths are relative to the directory from which doxygen is
# run.
-EXCLUDE =
+EXCLUDE =
# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
# directories that are symbolic links (a Unix file system feature) are excluded
# from the input.
# The default value is: NO.
-EXCLUDE_SYMLINKS = NO
+EXCLUDE_SYMLINKS = NO
# If the value of the INPUT tag contains directories, you can use the
# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
@@ -827,7 +827,7 @@ EXCLUDE_SYMLINKS = NO
# Note that the wildcards are matched against the file with absolute path, so to
# exclude all test directories for example use the pattern */test/*
-EXCLUDE_PATTERNS =
+EXCLUDE_PATTERNS =
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
# (namespaces, classes, functions, etc.) that should be excluded from the
@@ -838,33 +838,33 @@ EXCLUDE_PATTERNS =
# Note that the wildcards are matched against the file with absolute path, so to
# exclude all test directories use the pattern */test/*
-EXCLUDE_SYMBOLS =
+EXCLUDE_SYMBOLS =
# The EXAMPLE_PATH tag can be used to specify one or more files or directories
# that contain example code fragments that are included (see the \include
# command).
-EXAMPLE_PATH =
+EXAMPLE_PATH =
# If the value of the EXAMPLE_PATH tag contains directories, you can use the
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
# *.h) to filter out the source-files in the directories. If left blank all
# files are included.
-EXAMPLE_PATTERNS =
+EXAMPLE_PATTERNS =
# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
# searched for input files to be used with the \include or \dontinclude commands
# irrespective of the value of the RECURSIVE tag.
# The default value is: NO.
-EXAMPLE_RECURSIVE = NO
+EXAMPLE_RECURSIVE = NO
# The IMAGE_PATH tag can be used to specify one or more files or directories
# that contain images that are to be included in the documentation (see the
# \image command).
-IMAGE_PATH = "../documentation"
+IMAGE_PATH = "../documentation"
# The INPUT_FILTER tag can be used to specify a program that doxygen should
# invoke to filter for each input file. Doxygen will invoke the filter program
@@ -885,7 +885,7 @@ IMAGE_PATH = "../documentation"
# need to set EXTENSION_MAPPING for the extension otherwise the files are not
# properly processed by doxygen.
-INPUT_FILTER =
+INPUT_FILTER =
# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
# basis. Doxygen will compare the file name with each pattern and apply the
@@ -898,14 +898,14 @@ INPUT_FILTER =
# need to set EXTENSION_MAPPING for the extension otherwise the files are not
# properly processed by doxygen.
-FILTER_PATTERNS =
+FILTER_PATTERNS =
# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
# INPUT_FILTER) will also be used to filter the input files that are used for
# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
# The default value is: NO.
-FILTER_SOURCE_FILES = NO
+FILTER_SOURCE_FILES = NO
# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
@@ -913,14 +913,14 @@ FILTER_SOURCE_FILES = NO
# *.ext= (so without naming a filter).
# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
-FILTER_SOURCE_PATTERNS =
+FILTER_SOURCE_PATTERNS =
# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
# is part of the input, its contents will be placed on the main page
# (index.html). This can be useful if you have a project on for instance GitHub
# and want to reuse the introduction page also for the doxygen output.
-USE_MDFILE_AS_MAINPAGE =
+USE_MDFILE_AS_MAINPAGE =
#---------------------------------------------------------------------------
# Configuration options related to source browsing
@@ -933,20 +933,20 @@ USE_MDFILE_AS_MAINPAGE =
# also VERBATIM_HEADERS is set to NO.
# The default value is: NO.
-SOURCE_BROWSER = NO
+SOURCE_BROWSER = NO
# Setting the INLINE_SOURCES tag to YES will include the body of functions,
# classes and enums directly into the documentation.
# The default value is: NO.
-INLINE_SOURCES = NO
+INLINE_SOURCES = NO
# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
# special comment blocks from generated source code fragments. Normal C, C++ and
# Fortran comments will always remain visible.
# The default value is: YES.
-STRIP_CODE_COMMENTS = YES
+STRIP_CODE_COMMENTS = YES
# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
# function all documented functions referencing it will be listed.
@@ -958,7 +958,7 @@ REFERENCED_BY_RELATION = NO
# all documented entities called/used by that function will be listed.
# The default value is: NO.
-REFERENCES_RELATION = NO
+REFERENCES_RELATION = NO
# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
# to YES then the hyperlinks from functions in REFERENCES_RELATION and
@@ -976,7 +976,7 @@ REFERENCES_LINK_SOURCE = YES
# The default value is: YES.
# This tag requires that the tag SOURCE_BROWSER is set to YES.
-SOURCE_TOOLTIPS = YES
+SOURCE_TOOLTIPS = YES
# If the USE_HTAGS tag is set to YES then the references to source code will
# point to the HTML generated by the htags(1) tool instead of doxygen built-in
@@ -998,7 +998,7 @@ SOURCE_TOOLTIPS = YES
# The default value is: NO.
# This tag requires that the tag SOURCE_BROWSER is set to YES.
-USE_HTAGS = NO
+USE_HTAGS = NO
# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
# verbatim copy of the header file for each class for which an include is
@@ -1006,7 +1006,7 @@ USE_HTAGS = NO
# See also: Section \class.
# The default value is: YES.
-VERBATIM_HEADERS = YES
+VERBATIM_HEADERS = YES
# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
@@ -1025,7 +1025,7 @@ CLANG_ASSISTED_PARSING = NO
# specified with INPUT and INCLUDE_PATH.
# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
-CLANG_OPTIONS =
+CLANG_OPTIONS =
#---------------------------------------------------------------------------
# Configuration options related to the alphabetical class index
@@ -1036,14 +1036,14 @@ CLANG_OPTIONS =
# classes, structs, unions or interfaces.
# The default value is: YES.
-ALPHABETICAL_INDEX = YES
+ALPHABETICAL_INDEX = YES
# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
# which the alphabetical index list will be split.
# Minimum value: 1, maximum value: 20, default value: 5.
# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-COLS_IN_ALPHA_INDEX = 5
+COLS_IN_ALPHA_INDEX = 5
# In case all classes in a project start with a common prefix, all classes will
# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
@@ -1051,7 +1051,7 @@ COLS_IN_ALPHA_INDEX = 5
# while generating the index headers.
# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-IGNORE_PREFIX =
+IGNORE_PREFIX =
#---------------------------------------------------------------------------
# Configuration options related to the HTML output
@@ -1060,7 +1060,7 @@ IGNORE_PREFIX =
# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
# The default value is: YES.
-GENERATE_HTML = YES
+GENERATE_HTML = YES
# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
@@ -1068,14 +1068,14 @@ GENERATE_HTML = YES
# The default directory is: html.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_OUTPUT = html
+HTML_OUTPUT = html
# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
# generated HTML page (for example: .htm, .php, .asp).
# The default value is: .html.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_FILE_EXTENSION = .html
+HTML_FILE_EXTENSION = .html
# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
# each generated HTML page. If the tag is left blank doxygen will generate a
@@ -1095,7 +1095,7 @@ HTML_FILE_EXTENSION = .html
# of the possible markers and block names see the documentation.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_HEADER =
+HTML_HEADER =
# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
# generated HTML page. If the tag is left blank doxygen will generate a standard
@@ -1105,7 +1105,7 @@ HTML_HEADER =
# that doxygen normally uses.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_FOOTER =
+HTML_FOOTER =
# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
# sheet that is used by each HTML page. It can be used to fine-tune the look of
@@ -1117,7 +1117,7 @@ HTML_FOOTER =
# obsolete.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_STYLESHEET =
+HTML_STYLESHEET =
# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
# cascading style sheets that are included after the standard style sheets
@@ -1130,7 +1130,7 @@ HTML_STYLESHEET =
# list). For an example see the documentation.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_EXTRA_STYLESHEET = "../documentation/doc.css"
+HTML_EXTRA_STYLESHEET = "../documentation/doc.css"
# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
# other source files which should be copied to the HTML output directory. Note
@@ -1140,7 +1140,7 @@ HTML_EXTRA_STYLESHEET = "../documentation/doc.css"
# files will be copied as-is; there are no commands or markers available.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_EXTRA_FILES =
+HTML_EXTRA_FILES =
# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
# will adjust the colors in the style sheet and background images according to
@@ -1151,7 +1151,7 @@ HTML_EXTRA_FILES =
# Minimum value: 0, maximum value: 359, default value: 220.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_COLORSTYLE_HUE = 220
+HTML_COLORSTYLE_HUE = 220
# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
# in the HTML output. For a value of 0 the output will use grayscales only. A
@@ -1159,7 +1159,7 @@ HTML_COLORSTYLE_HUE = 220
# Minimum value: 0, maximum value: 255, default value: 100.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_COLORSTYLE_SAT = 100
+HTML_COLORSTYLE_SAT = 100
# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
# luminance component of the colors in the HTML output. Values below 100
@@ -1170,7 +1170,7 @@ HTML_COLORSTYLE_SAT = 100
# Minimum value: 40, maximum value: 240, default value: 80.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_COLORSTYLE_GAMMA = 80
+HTML_COLORSTYLE_GAMMA = 80
# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
# page will contain the date and time when the page was generated. Setting this
@@ -1179,7 +1179,7 @@ HTML_COLORSTYLE_GAMMA = 80
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_TIMESTAMP = NO
+HTML_TIMESTAMP = NO
# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
# documentation will contain sections that can be hidden and shown after the
@@ -1187,7 +1187,7 @@ HTML_TIMESTAMP = NO
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_DYNAMIC_SECTIONS = NO
+HTML_DYNAMIC_SECTIONS = YES
# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
# shown in the various tree structured indices initially; the user can expand
@@ -1214,7 +1214,7 @@ HTML_INDEX_NUM_ENTRIES = 100
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
-GENERATE_DOCSET = NO
+GENERATE_DOCSET = NO
# This tag determines the name of the docset feed. A documentation feed provides
# an umbrella under which multiple documentation sets from a single provider
@@ -1222,7 +1222,7 @@ GENERATE_DOCSET = NO
# The default value is: Doxygen generated docs.
# This tag requires that the tag GENERATE_DOCSET is set to YES.
-DOCSET_FEEDNAME = "Doxygen generated docs"
+DOCSET_FEEDNAME = "Doxygen generated docs"
# This tag specifies a string that should uniquely identify the documentation
# set bundle. This should be a reverse domain-name style string, e.g.
@@ -1230,7 +1230,7 @@ DOCSET_FEEDNAME = "Doxygen generated docs"
# The default value is: org.doxygen.Project.
# This tag requires that the tag GENERATE_DOCSET is set to YES.
-DOCSET_BUNDLE_ID = org.doxygen.Project
+DOCSET_BUNDLE_ID = org.doxygen.Project
# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
# the documentation publisher. This should be a reverse domain-name style
@@ -1238,13 +1238,13 @@ DOCSET_BUNDLE_ID = org.doxygen.Project
# The default value is: org.doxygen.Publisher.
# This tag requires that the tag GENERATE_DOCSET is set to YES.
-DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
# The default value is: Publisher.
# This tag requires that the tag GENERATE_DOCSET is set to YES.
-DOCSET_PUBLISHER_NAME = Publisher
+DOCSET_PUBLISHER_NAME = Publisher
# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
@@ -1262,14 +1262,14 @@ DOCSET_PUBLISHER_NAME = Publisher
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
-GENERATE_HTMLHELP = NO
+GENERATE_HTMLHELP = NO
# The CHM_FILE tag can be used to specify the file name of the resulting .chm
# file. You can add a path in front of the file if the result should not be
# written to the html output directory.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-CHM_FILE =
+CHM_FILE =
# The HHC_LOCATION tag can be used to specify the location (absolute path
# including file name) of the HTML help compiler (hhc.exe). If non-empty,
@@ -1277,20 +1277,20 @@ CHM_FILE =
# The file has to be specified with full path.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-HHC_LOCATION =
+HHC_LOCATION =
# The GENERATE_CHI flag controls if a separate .chi index file is generated
# (YES) or that it should be included in the master .chm file (NO).
# The default value is: NO.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-GENERATE_CHI = NO
+GENERATE_CHI = NO
# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
# and project file content.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-CHM_INDEX_ENCODING =
+CHM_INDEX_ENCODING =
# The BINARY_TOC flag controls whether a binary table of contents is generated
# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
@@ -1298,14 +1298,14 @@ CHM_INDEX_ENCODING =
# The default value is: NO.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-BINARY_TOC = NO
+BINARY_TOC = NO
# The TOC_EXPAND flag can be set to YES to add extra items for group members to
# the table of contents of the HTML help documentation and to the tree view.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-TOC_EXPAND = NO
+TOC_EXPAND = NO
# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
@@ -1314,14 +1314,14 @@ TOC_EXPAND = NO
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
-GENERATE_QHP = NO
+GENERATE_QHP = NO
# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
# the file name of the resulting .qch file. The path specified is relative to
# the HTML output folder.
# This tag requires that the tag GENERATE_QHP is set to YES.
-QCH_FILE =
+QCH_FILE =
# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
# Project output. For more information please see Qt Help Project / Namespace
@@ -1329,7 +1329,7 @@ QCH_FILE =
# The default value is: org.doxygen.Project.
# This tag requires that the tag GENERATE_QHP is set to YES.
-QHP_NAMESPACE = org.doxygen.Project
+QHP_NAMESPACE = org.doxygen.Project
# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
# Help Project output. For more information please see Qt Help Project / Virtual
@@ -1338,7 +1338,7 @@ QHP_NAMESPACE = org.doxygen.Project
# The default value is: doc.
# This tag requires that the tag GENERATE_QHP is set to YES.
-QHP_VIRTUAL_FOLDER = doc
+QHP_VIRTUAL_FOLDER = doc
# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
# filter to add. For more information please see Qt Help Project / Custom
@@ -1346,7 +1346,7 @@ QHP_VIRTUAL_FOLDER = doc
# filters).
# This tag requires that the tag GENERATE_QHP is set to YES.
-QHP_CUST_FILTER_NAME =
+QHP_CUST_FILTER_NAME =
# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
# custom filter to add. For more information please see Qt Help Project / Custom
@@ -1354,21 +1354,21 @@ QHP_CUST_FILTER_NAME =
# filters).
# This tag requires that the tag GENERATE_QHP is set to YES.
-QHP_CUST_FILTER_ATTRS =
+QHP_CUST_FILTER_ATTRS =
# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
# project's filter section matches. Qt Help Project / Filter Attributes (see:
# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
# This tag requires that the tag GENERATE_QHP is set to YES.
-QHP_SECT_FILTER_ATTRS =
+QHP_SECT_FILTER_ATTRS =
# The QHG_LOCATION tag can be used to specify the location of Qt's
# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
# generated .qhp file.
# This tag requires that the tag GENERATE_QHP is set to YES.
-QHG_LOCATION =
+QHG_LOCATION =
# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
# generated, together with the HTML files, they form an Eclipse help plugin. To
@@ -1380,7 +1380,7 @@ QHG_LOCATION =
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
-GENERATE_ECLIPSEHELP = NO
+GENERATE_ECLIPSEHELP = NO
# A unique identifier for the Eclipse help plugin. When installing the plugin
# the directory name containing the HTML and XML files should also have this
@@ -1388,7 +1388,7 @@ GENERATE_ECLIPSEHELP = NO
# The default value is: org.doxygen.Project.
# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
-ECLIPSE_DOC_ID = org.doxygen.Project
+ECLIPSE_DOC_ID = org.doxygen.Project
# If you want full control over the layout of the generated HTML pages it might
# be necessary to disable the index and replace it with your own. The
@@ -1399,7 +1399,7 @@ ECLIPSE_DOC_ID = org.doxygen.Project
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
-DISABLE_INDEX = NO
+DISABLE_INDEX = NO
# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
# structure should be generated to display hierarchical information. If the tag
@@ -1416,7 +1416,7 @@ DISABLE_INDEX = NO
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
-GENERATE_TREEVIEW = NO
+GENERATE_TREEVIEW = NO
# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
# doxygen will group on one line in the generated HTML documentation.
@@ -1426,21 +1426,21 @@ GENERATE_TREEVIEW = NO
# Minimum value: 0, maximum value: 20, default value: 4.
# This tag requires that the tag GENERATE_HTML is set to YES.
-ENUM_VALUES_PER_LINE = 4
+ENUM_VALUES_PER_LINE = 4
# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
# to set the initial width (in pixels) of the frame in which the tree is shown.
# Minimum value: 0, maximum value: 1500, default value: 250.
# This tag requires that the tag GENERATE_HTML is set to YES.
-TREEVIEW_WIDTH = 250
+TREEVIEW_WIDTH = 250
# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
# external symbols imported via tag files in a separate window.
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
-EXT_LINKS_IN_WINDOW = NO
+EXT_LINKS_IN_WINDOW = NO
# Use this tag to change the font size of LaTeX formulas included as images in
# the HTML documentation. When you change the font size after a successful
@@ -1449,7 +1449,7 @@ EXT_LINKS_IN_WINDOW = NO
# Minimum value: 8, maximum value: 50, default value: 10.
# This tag requires that the tag GENERATE_HTML is set to YES.
-FORMULA_FONTSIZE = 10
+FORMULA_FONTSIZE = 10
# Use the FORMULA_TRANPARENT tag to determine whether or not the images
# generated for formulas are transparent PNGs. Transparent PNGs are not
@@ -1460,7 +1460,7 @@ FORMULA_FONTSIZE = 10
# The default value is: YES.
# This tag requires that the tag GENERATE_HTML is set to YES.
-FORMULA_TRANSPARENT = YES
+FORMULA_TRANSPARENT = YES
# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
# http://www.mathjax.org) which uses client side Javascript for the rendering
@@ -1471,7 +1471,7 @@ FORMULA_TRANSPARENT = YES
# The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES.
-USE_MATHJAX = YES
+USE_MATHJAX = YES
# When MathJax is enabled you can set the default output format to be used for
# the MathJax output. See the MathJax site (see:
@@ -1481,7 +1481,7 @@ USE_MATHJAX = YES
# The default value is: HTML-CSS.
# This tag requires that the tag USE_MATHJAX is set to YES.
-MATHJAX_FORMAT = HTML-CSS
+MATHJAX_FORMAT = HTML-CSS
# When MathJax is enabled you need to specify the location relative to the HTML
# output directory using the MATHJAX_RELPATH option. The destination directory
@@ -1494,14 +1494,14 @@ MATHJAX_FORMAT = HTML-CSS
# The default value is: http://cdn.mathjax.org/mathjax/latest.
# This tag requires that the tag USE_MATHJAX is set to YES.
-MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
+MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
# extension names that should be enabled during MathJax rendering. For example
# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
# This tag requires that the tag USE_MATHJAX is set to YES.
-MATHJAX_EXTENSIONS =
+MATHJAX_EXTENSIONS =
# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
# of code that will be used on startup of the MathJax code. See the MathJax site
@@ -1509,7 +1509,7 @@ MATHJAX_EXTENSIONS =
# example see the documentation.
# This tag requires that the tag USE_MATHJAX is set to YES.
-MATHJAX_CODEFILE =
+MATHJAX_CODEFILE =
# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
# the HTML output. The underlying search engine uses javascript and DHTML and
@@ -1530,7 +1530,7 @@ MATHJAX_CODEFILE =
# The default value is: YES.
# This tag requires that the tag GENERATE_HTML is set to YES.
-SEARCHENGINE = YES
+SEARCHENGINE = YES
# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
# implemented using a web server instead of a web client using Javascript. There
@@ -1542,7 +1542,7 @@ SEARCHENGINE = YES
# The default value is: NO.
# This tag requires that the tag SEARCHENGINE is set to YES.
-SERVER_BASED_SEARCH = NO
+SERVER_BASED_SEARCH = NO
# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
# script for searching. Instead the search results are written to an XML file
@@ -1558,7 +1558,7 @@ SERVER_BASED_SEARCH = NO
# The default value is: NO.
# This tag requires that the tag SEARCHENGINE is set to YES.
-EXTERNAL_SEARCH = NO
+EXTERNAL_SEARCH = NO
# The SEARCHENGINE_URL should point to a search engine hosted by a web server
# which will return the search results when EXTERNAL_SEARCH is enabled.
@@ -1569,7 +1569,7 @@ EXTERNAL_SEARCH = NO
# Searching" for details.
# This tag requires that the tag SEARCHENGINE is set to YES.
-SEARCHENGINE_URL =
+SEARCHENGINE_URL =
# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
# search data is written to a file for indexing by an external tool. With the
@@ -1577,7 +1577,7 @@ SEARCHENGINE_URL =
# The default file is: searchdata.xml.
# This tag requires that the tag SEARCHENGINE is set to YES.
-SEARCHDATA_FILE = searchdata.xml
+SEARCHDATA_FILE = searchdata.xml
# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
@@ -1585,7 +1585,7 @@ SEARCHDATA_FILE = searchdata.xml
# projects and redirect the results back to the right project.
# This tag requires that the tag SEARCHENGINE is set to YES.
-EXTERNAL_SEARCH_ID =
+EXTERNAL_SEARCH_ID =
# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
# projects other than the one defined by this configuration file, but that are
@@ -1595,7 +1595,7 @@ EXTERNAL_SEARCH_ID =
# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
# This tag requires that the tag SEARCHENGINE is set to YES.
-EXTRA_SEARCH_MAPPINGS =
+EXTRA_SEARCH_MAPPINGS =
#---------------------------------------------------------------------------
# Configuration options related to the LaTeX output
@@ -1604,7 +1604,7 @@ EXTRA_SEARCH_MAPPINGS =
# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
# The default value is: YES.
-GENERATE_LATEX = YES
+GENERATE_LATEX = YES
# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
@@ -1612,7 +1612,7 @@ GENERATE_LATEX = YES
# The default directory is: latex.
# This tag requires that the tag GENERATE_LATEX is set to YES.
-LATEX_OUTPUT = latex
+LATEX_OUTPUT = latex
# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
# invoked.
@@ -1623,14 +1623,14 @@ LATEX_OUTPUT = latex
# The default file is: latex.
# This tag requires that the tag GENERATE_LATEX is set to YES.
-LATEX_CMD_NAME = latex
+LATEX_CMD_NAME = latex
# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
# index for LaTeX.
# The default file is: makeindex.
# This tag requires that the tag GENERATE_LATEX is set to YES.
-MAKEINDEX_CMD_NAME = makeindex
+MAKEINDEX_CMD_NAME = makeindex
# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
# documents. This may be useful for small projects and may help to save some
@@ -1638,7 +1638,7 @@ MAKEINDEX_CMD_NAME = makeindex
# The default value is: NO.
# This tag requires that the tag GENERATE_LATEX is set to YES.
-COMPACT_LATEX = NO
+COMPACT_LATEX = NO
# The PAPER_TYPE tag can be used to set the paper type that is used by the
# printer.
@@ -1647,7 +1647,7 @@ COMPACT_LATEX = NO
# The default value is: a4.
# This tag requires that the tag GENERATE_LATEX is set to YES.
-PAPER_TYPE = a4
+PAPER_TYPE = a4
# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
# that should be included in the LaTeX output. The package can be specified just
@@ -1659,7 +1659,7 @@ PAPER_TYPE = a4
# If left blank no extra packages will be included.
# This tag requires that the tag GENERATE_LATEX is set to YES.
-EXTRA_PACKAGES =
+EXTRA_PACKAGES =
# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
# generated LaTeX document. The header should contain everything until the first
@@ -1675,7 +1675,7 @@ EXTRA_PACKAGES =
# to HTML_HEADER.
# This tag requires that the tag GENERATE_LATEX is set to YES.
-LATEX_HEADER =
+LATEX_HEADER =
# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
# generated LaTeX document. The footer should contain everything after the last
@@ -1686,7 +1686,7 @@ LATEX_HEADER =
# Note: Only use a user-defined footer if you know what you are doing!
# This tag requires that the tag GENERATE_LATEX is set to YES.
-LATEX_FOOTER =
+LATEX_FOOTER =
# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
# LaTeX style sheets that are included after the standard style sheets created
@@ -1697,7 +1697,7 @@ LATEX_FOOTER =
# list).
# This tag requires that the tag GENERATE_LATEX is set to YES.
-LATEX_EXTRA_STYLESHEET =
+LATEX_EXTRA_STYLESHEET =
# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
# other source files which should be copied to the LATEX_OUTPUT output
@@ -1705,7 +1705,7 @@ LATEX_EXTRA_STYLESHEET =
# markers available.
# This tag requires that the tag GENERATE_LATEX is set to YES.
-LATEX_EXTRA_FILES =
+LATEX_EXTRA_FILES =
# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
@@ -1714,7 +1714,7 @@ LATEX_EXTRA_FILES =
# The default value is: YES.
# This tag requires that the tag GENERATE_LATEX is set to YES.
-PDF_HYPERLINKS = YES
+PDF_HYPERLINKS = YES
# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
# the PDF file directly from the LaTeX files. Set this option to YES, to get a
@@ -1722,7 +1722,7 @@ PDF_HYPERLINKS = YES
# The default value is: YES.
# This tag requires that the tag GENERATE_LATEX is set to YES.
-USE_PDFLATEX = YES
+USE_PDFLATEX = YES
# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
# command to the generated LaTeX files. This will instruct LaTeX to keep running
@@ -1731,14 +1731,14 @@ USE_PDFLATEX = YES
# The default value is: NO.
# This tag requires that the tag GENERATE_LATEX is set to YES.
-LATEX_BATCHMODE = NO
+LATEX_BATCHMODE = NO
# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
# index chapters (such as File Index, Compound Index, etc.) in the output.
# The default value is: NO.
# This tag requires that the tag GENERATE_LATEX is set to YES.
-LATEX_HIDE_INDICES = NO
+LATEX_HIDE_INDICES = NO
# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
# code with syntax highlighting in the LaTeX output.
@@ -1748,7 +1748,7 @@ LATEX_HIDE_INDICES = NO
# The default value is: NO.
# This tag requires that the tag GENERATE_LATEX is set to YES.
-LATEX_SOURCE_CODE = NO
+LATEX_SOURCE_CODE = NO
# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
# bibliography, e.g. plainnat, or ieeetr. See
@@ -1756,7 +1756,7 @@ LATEX_SOURCE_CODE = NO
# The default value is: plain.
# This tag requires that the tag GENERATE_LATEX is set to YES.
-LATEX_BIB_STYLE = plain
+LATEX_BIB_STYLE = plain
# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
# page will contain the date and time when the page was generated. Setting this
@@ -1764,7 +1764,7 @@ LATEX_BIB_STYLE = plain
# The default value is: NO.
# This tag requires that the tag GENERATE_LATEX is set to YES.
-LATEX_TIMESTAMP = NO
+LATEX_TIMESTAMP = NO
#---------------------------------------------------------------------------
# Configuration options related to the RTF output
@@ -1775,7 +1775,7 @@ LATEX_TIMESTAMP = NO
# readers/editors.
# The default value is: NO.
-GENERATE_RTF = NO
+GENERATE_RTF = NO
# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
@@ -1783,7 +1783,7 @@ GENERATE_RTF = NO
# The default directory is: rtf.
# This tag requires that the tag GENERATE_RTF is set to YES.
-RTF_OUTPUT = rtf
+RTF_OUTPUT = rtf
# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
# documents. This may be useful for small projects and may help to save some
@@ -1791,7 +1791,7 @@ RTF_OUTPUT = rtf
# The default value is: NO.
# This tag requires that the tag GENERATE_RTF is set to YES.
-COMPACT_RTF = NO
+COMPACT_RTF = NO
# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
# contain hyperlink fields. The RTF file will contain links (just like the HTML
@@ -1803,7 +1803,7 @@ COMPACT_RTF = NO
# The default value is: NO.
# This tag requires that the tag GENERATE_RTF is set to YES.
-RTF_HYPERLINKS = NO
+RTF_HYPERLINKS = NO
# Load stylesheet definitions from file. Syntax is similar to doxygen's config
# file, i.e. a series of assignments. You only have to provide replacements,
@@ -1813,14 +1813,14 @@ RTF_HYPERLINKS = NO
# default style sheet that doxygen normally uses.
# This tag requires that the tag GENERATE_RTF is set to YES.
-RTF_STYLESHEET_FILE =
+RTF_STYLESHEET_FILE =
# Set optional variables used in the generation of an RTF document. Syntax is
# similar to doxygen's config file. A template extensions file can be generated
# using doxygen -e rtf extensionFile.
# This tag requires that the tag GENERATE_RTF is set to YES.
-RTF_EXTENSIONS_FILE =
+RTF_EXTENSIONS_FILE =
# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
# with syntax highlighting in the RTF output.
@@ -1830,7 +1830,7 @@ RTF_EXTENSIONS_FILE =
# The default value is: NO.
# This tag requires that the tag GENERATE_RTF is set to YES.
-RTF_SOURCE_CODE = NO
+RTF_SOURCE_CODE = NO
#---------------------------------------------------------------------------
# Configuration options related to the man page output
@@ -1840,7 +1840,7 @@ RTF_SOURCE_CODE = NO
# classes and files.
# The default value is: NO.
-GENERATE_MAN = NO
+GENERATE_MAN = NO
# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
@@ -1849,7 +1849,7 @@ GENERATE_MAN = NO
# The default directory is: man.
# This tag requires that the tag GENERATE_MAN is set to YES.
-MAN_OUTPUT = man
+MAN_OUTPUT = man
# The MAN_EXTENSION tag determines the extension that is added to the generated
# man pages. In case the manual section does not start with a number, the number
@@ -1858,14 +1858,14 @@ MAN_OUTPUT = man
# The default value is: .3.
# This tag requires that the tag GENERATE_MAN is set to YES.
-MAN_EXTENSION = .3
+MAN_EXTENSION = .3
# The MAN_SUBDIR tag determines the name of the directory created within
# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
# MAN_EXTENSION with the initial . removed.
# This tag requires that the tag GENERATE_MAN is set to YES.
-MAN_SUBDIR =
+MAN_SUBDIR =
# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
# will generate one additional man file for each entity documented in the real
@@ -1874,7 +1874,7 @@ MAN_SUBDIR =
# The default value is: NO.
# This tag requires that the tag GENERATE_MAN is set to YES.
-MAN_LINKS = NO
+MAN_LINKS = NO
#---------------------------------------------------------------------------
# Configuration options related to the XML output
@@ -1884,7 +1884,7 @@ MAN_LINKS = NO
# captures the structure of the code including all documentation.
# The default value is: NO.
-GENERATE_XML = NO
+GENERATE_XML = NO
# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
@@ -1892,7 +1892,7 @@ GENERATE_XML = NO
# The default directory is: xml.
# This tag requires that the tag GENERATE_XML is set to YES.
-XML_OUTPUT = xml
+XML_OUTPUT = xml
# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
# listings (including syntax highlighting and cross-referencing information) to
@@ -1901,7 +1901,7 @@ XML_OUTPUT = xml
# The default value is: YES.
# This tag requires that the tag GENERATE_XML is set to YES.
-XML_PROGRAMLISTING = YES
+XML_PROGRAMLISTING = YES
#---------------------------------------------------------------------------
# Configuration options related to the DOCBOOK output
@@ -1911,7 +1911,7 @@ XML_PROGRAMLISTING = YES
# that can be used to generate PDF.
# The default value is: NO.
-GENERATE_DOCBOOK = NO
+GENERATE_DOCBOOK = NO
# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
@@ -1919,7 +1919,7 @@ GENERATE_DOCBOOK = NO
# The default directory is: docbook.
# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
-DOCBOOK_OUTPUT = docbook
+DOCBOOK_OUTPUT = docbook
# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
# program listings (including syntax highlighting and cross-referencing
@@ -1940,7 +1940,7 @@ DOCBOOK_PROGRAMLISTING = NO
# still experimental and incomplete at the moment.
# The default value is: NO.
-GENERATE_AUTOGEN_DEF = NO
+GENERATE_AUTOGEN_DEF = NO
#---------------------------------------------------------------------------
# Configuration options related to the Perl module output
@@ -1952,7 +1952,7 @@ GENERATE_AUTOGEN_DEF = NO
# Note that this feature is still experimental and incomplete at the moment.
# The default value is: NO.
-GENERATE_PERLMOD = NO
+GENERATE_PERLMOD = NO
# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
@@ -1960,7 +1960,7 @@ GENERATE_PERLMOD = NO
# The default value is: NO.
# This tag requires that the tag GENERATE_PERLMOD is set to YES.
-PERLMOD_LATEX = NO
+PERLMOD_LATEX = NO
# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
# formatted so it can be parsed by a human reader. This is useful if you want to
@@ -1970,7 +1970,7 @@ PERLMOD_LATEX = NO
# The default value is: YES.
# This tag requires that the tag GENERATE_PERLMOD is set to YES.
-PERLMOD_PRETTY = YES
+PERLMOD_PRETTY = YES
# The names of the make variables in the generated doxyrules.make file are
# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
@@ -1978,7 +1978,7 @@ PERLMOD_PRETTY = YES
# overwrite each other's variables.
# This tag requires that the tag GENERATE_PERLMOD is set to YES.
-PERLMOD_MAKEVAR_PREFIX =
+PERLMOD_MAKEVAR_PREFIX =
#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
@@ -1988,7 +1988,7 @@ PERLMOD_MAKEVAR_PREFIX =
# C-preprocessor directives found in the sources and include files.
# The default value is: YES.
-ENABLE_PREPROCESSING = YES
+ENABLE_PREPROCESSING = YES
# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
# in the source code. If set to NO, only conditional compilation will be
@@ -1997,7 +1997,7 @@ ENABLE_PREPROCESSING = YES
# The default value is: NO.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-MACRO_EXPANSION = NO
+MACRO_EXPANSION = NO
# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
# the macro expansion is limited to the macros specified with the PREDEFINED and
@@ -2005,21 +2005,21 @@ MACRO_EXPANSION = NO
# The default value is: NO.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-EXPAND_ONLY_PREDEF = NO
+EXPAND_ONLY_PREDEF = NO
# If the SEARCH_INCLUDES tag is set to YES, the include files in the
# INCLUDE_PATH will be searched if a #include is found.
# The default value is: YES.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-SEARCH_INCLUDES = YES
+SEARCH_INCLUDES = YES
# The INCLUDE_PATH tag can be used to specify one or more directories that
# contain include files that are not input files but should be processed by the
# preprocessor.
# This tag requires that the tag SEARCH_INCLUDES is set to YES.
-INCLUDE_PATH =
+INCLUDE_PATH =
# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
# patterns (like *.h and *.hpp) to filter out the header-files in the
@@ -2027,7 +2027,7 @@ INCLUDE_PATH =
# used.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-INCLUDE_FILE_PATTERNS =
+INCLUDE_FILE_PATTERNS =
# The PREDEFINED tag can be used to specify one or more macro names that are
# defined before the preprocessor is started (similar to the -D option of e.g.
@@ -2037,7 +2037,7 @@ INCLUDE_FILE_PATTERNS =
# recursively expanded use the := operator instead of the = operator.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-PREDEFINED =
+PREDEFINED =
# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
# tag can be used to specify a list of macro names that should be expanded. The
@@ -2046,7 +2046,7 @@ PREDEFINED =
# definition found in the source code.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-EXPAND_AS_DEFINED =
+EXPAND_AS_DEFINED =
# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
# remove all references to function-like macros that are alone on a line, have
@@ -2056,7 +2056,7 @@ EXPAND_AS_DEFINED =
# The default value is: YES.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-SKIP_FUNCTION_MACROS = YES
+SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
# Configuration options related to external references
@@ -2075,40 +2075,40 @@ SKIP_FUNCTION_MACROS = YES
# the path). If a tag file is not located in the directory in which doxygen is
# run, you must also specify the path to the tagfile here.
-TAGFILES =
+TAGFILES =
# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
# tag file that is based on the input files it reads. See section "Linking to
# external documentation" for more information about the usage of tag files.
-GENERATE_TAGFILE =
+GENERATE_TAGFILE =
# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
# the class index. If set to NO, only the inherited external classes will be
# listed.
# The default value is: NO.
-ALLEXTERNALS = NO
+ALLEXTERNALS = NO
# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
# in the modules index. If set to NO, only the current project's groups will be
# listed.
# The default value is: YES.
-EXTERNAL_GROUPS = YES
+EXTERNAL_GROUPS = YES
# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
# the related pages index. If set to NO, only the current project's pages will
# be listed.
# The default value is: YES.
-EXTERNAL_PAGES = YES
+EXTERNAL_PAGES = YES
# The PERL_PATH should be the absolute path and name of the perl script
# interpreter (i.e. the result of 'which perl').
# The default file (with absolute path) is: /usr/bin/perl.
-PERL_PATH = /usr/bin/perl
+PERL_PATH = /usr/bin/perl
#---------------------------------------------------------------------------
# Configuration options related to the dot tool
@@ -2121,7 +2121,7 @@ PERL_PATH = /usr/bin/perl
# powerful graphs.
# The default value is: YES.
-CLASS_DIAGRAMS = YES
+CLASS_DIAGRAMS = NO
# You can define message sequence charts within doxygen comments using the \msc
# command. Doxygen will then run the mscgen tool (see:
@@ -2130,20 +2130,20 @@ CLASS_DIAGRAMS = YES
# the mscgen tool resides. If left empty the tool is assumed to be found in the
# default search path.
-MSCGEN_PATH =
+MSCGEN_PATH =
# You can include diagrams made with dia in doxygen documentation. Doxygen will
# then run dia to produce the diagram and insert it in the documentation. The
# DIA_PATH tag allows you to specify the directory where the dia binary resides.
# If left empty dia is assumed to be found in the default search path.
-DIA_PATH =
+DIA_PATH =
# If set to YES the inheritance and collaboration graphs will hide inheritance
# and usage relations if the target is undocumented or is not a class.
# The default value is: YES.
-HIDE_UNDOC_RELATIONS = YES
+HIDE_UNDOC_RELATIONS = YES
# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
# available from the path. This tool is part of Graphviz (see:
@@ -2152,7 +2152,7 @@ HIDE_UNDOC_RELATIONS = YES
# set to NO
# The default value is: YES.
-HAVE_DOT = YES
+HAVE_DOT = YES
# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
# to run in parallel. When set to 0 doxygen will base this on the number of
@@ -2162,7 +2162,7 @@ HAVE_DOT = YES
# Minimum value: 0, maximum value: 32, default value: 0.
# This tag requires that the tag HAVE_DOT is set to YES.
-DOT_NUM_THREADS = 0
+DOT_NUM_THREADS = 0
# When you want a differently looking font in the dot files that doxygen
# generates you can specify the font name using DOT_FONTNAME. You need to make
@@ -2172,21 +2172,21 @@ DOT_NUM_THREADS = 0
# The default value is: Helvetica.
# This tag requires that the tag HAVE_DOT is set to YES.
-DOT_FONTNAME = Helvetica
+DOT_FONTNAME = Helvetica
# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
# dot graphs.
# Minimum value: 4, maximum value: 24, default value: 10.
# This tag requires that the tag HAVE_DOT is set to YES.
-DOT_FONTSIZE = 10
+DOT_FONTSIZE = 10
# By default doxygen will tell dot to use the default font as specified with
# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
# the path where dot can find it using this tag.
# This tag requires that the tag HAVE_DOT is set to YES.
-DOT_FONTPATH =
+DOT_FONTPATH =
# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
# each documented class showing the direct and indirect inheritance relations.
@@ -2194,7 +2194,7 @@ DOT_FONTPATH =
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
-CLASS_GRAPH = YES
+CLASS_GRAPH = YES
# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
# graph for each documented class showing the direct and indirect implementation
@@ -2203,14 +2203,14 @@ CLASS_GRAPH = YES
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
-COLLABORATION_GRAPH = YES
+COLLABORATION_GRAPH = YES
# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
# groups, showing the direct groups dependencies.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
-GROUP_GRAPHS = YES
+GROUP_GRAPHS = YES
# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
# collaboration diagrams in a style similar to the OMG's Unified Modeling
@@ -2218,7 +2218,7 @@ GROUP_GRAPHS = YES
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.
-UML_LOOK = NO
+UML_LOOK = NO
# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
# class node. If there are many fields or methods and many nodes the graph may
@@ -2231,7 +2231,7 @@ UML_LOOK = NO
# Minimum value: 0, maximum value: 100, default value: 10.
# This tag requires that the tag HAVE_DOT is set to YES.
-UML_LIMIT_NUM_FIELDS = 10
+UML_LIMIT_NUM_FIELDS = 10
# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
# collaboration graphs will show the relations between templates and their
@@ -2239,7 +2239,7 @@ UML_LIMIT_NUM_FIELDS = 10
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.
-TEMPLATE_RELATIONS = NO
+TEMPLATE_RELATIONS = NO
# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
# YES then doxygen will generate a graph for each documented file showing the
@@ -2248,7 +2248,7 @@ TEMPLATE_RELATIONS = NO
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
-INCLUDE_GRAPH = YES
+INCLUDE_GRAPH = YES
# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
# set to YES then doxygen will generate a graph for each documented file showing
@@ -2257,7 +2257,7 @@ INCLUDE_GRAPH = YES
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
-INCLUDED_BY_GRAPH = YES
+INCLUDED_BY_GRAPH = YES
# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
# dependency graph for every global function or class method.
@@ -2269,7 +2269,7 @@ INCLUDED_BY_GRAPH = YES
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.
-CALL_GRAPH = NO
+CALL_GRAPH = NO
# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
# dependency graph for every global function or class method.
@@ -2281,14 +2281,14 @@ CALL_GRAPH = NO
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.
-CALLER_GRAPH = NO
+CALLER_GRAPH = NO
# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
# hierarchy of all classes instead of a textual one.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
-GRAPHICAL_HIERARCHY = YES
+GRAPHICAL_HIERARCHY = YES
# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
# dependencies a directory has on other directories in a graphical way. The
@@ -2297,7 +2297,7 @@ GRAPHICAL_HIERARCHY = YES
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
-DIRECTORY_GRAPH = YES
+DIRECTORY_GRAPH = YES
# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
# generated by dot. For an explanation of the image formats see the section
@@ -2314,7 +2314,7 @@ DIRECTORY_GRAPH = YES
# The default value is: png.
# This tag requires that the tag HAVE_DOT is set to YES.
-DOT_IMAGE_FORMAT = png
+DOT_IMAGE_FORMAT = png
# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
# enable generation of interactive SVG images that allow zooming and panning.
@@ -2326,32 +2326,32 @@ DOT_IMAGE_FORMAT = png
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.
-INTERACTIVE_SVG = NO
+INTERACTIVE_SVG = NO
# The DOT_PATH tag can be used to specify the path where the dot tool can be
# found. If left blank, it is assumed the dot tool can be found in the path.
# This tag requires that the tag HAVE_DOT is set to YES.
-DOT_PATH =
+DOT_PATH =
# The DOTFILE_DIRS tag can be used to specify one or more directories that
# contain dot files that are included in the documentation (see the \dotfile
# command).
# This tag requires that the tag HAVE_DOT is set to YES.
-DOTFILE_DIRS =
+DOTFILE_DIRS =
# The MSCFILE_DIRS tag can be used to specify one or more directories that
# contain msc files that are included in the documentation (see the \mscfile
# command).
-MSCFILE_DIRS =
+MSCFILE_DIRS =
# The DIAFILE_DIRS tag can be used to specify one or more directories that
# contain dia files that are included in the documentation (see the \diafile
# command).
-DIAFILE_DIRS =
+DIAFILE_DIRS =
# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
# path where java can find the plantuml.jar file. If left blank, it is assumed
@@ -2359,12 +2359,12 @@ DIAFILE_DIRS =
# generate a warning when it encounters a \startuml command in this case and
# will not generate output for the diagram.
-PLANTUML_JAR_PATH =
+PLANTUML_JAR_PATH =
# When using plantuml, the specified paths are searched for files specified by
# the !include statement in a plantuml block.
-PLANTUML_INCLUDE_PATH =
+PLANTUML_INCLUDE_PATH =
# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
# that will be shown in the graph. If the number of nodes in a graph becomes
@@ -2376,7 +2376,7 @@ PLANTUML_INCLUDE_PATH =
# Minimum value: 0, maximum value: 10000, default value: 50.
# This tag requires that the tag HAVE_DOT is set to YES.
-DOT_GRAPH_MAX_NODES = 50
+DOT_GRAPH_MAX_NODES = 50
# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
# generated by dot. A depth value of 3 means that only nodes reachable from the
@@ -2388,7 +2388,7 @@ DOT_GRAPH_MAX_NODES = 50
# Minimum value: 0, maximum value: 1000, default value: 0.
# This tag requires that the tag HAVE_DOT is set to YES.
-MAX_DOT_GRAPH_DEPTH = 0
+MAX_DOT_GRAPH_DEPTH = 0
# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
# background. This is disabled by default, because dot on Windows does not seem
@@ -2400,7 +2400,7 @@ MAX_DOT_GRAPH_DEPTH = 0
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.
-DOT_TRANSPARENT = NO
+DOT_TRANSPARENT = NO
# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
# files in one run (i.e. multiple -o and -T options on the command line). This
@@ -2409,7 +2409,7 @@ DOT_TRANSPARENT = NO
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.
-DOT_MULTI_TARGETS = NO
+DOT_MULTI_TARGETS = NO
# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
# explaining the meaning of the various boxes and arrows in the dot generated
@@ -2417,11 +2417,11 @@ DOT_MULTI_TARGETS = NO
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
-GENERATE_LEGEND = YES
+GENERATE_LEGEND = YES
# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
# files that are used to generate the various graphs.
# The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
-DOT_CLEANUP = YES
+DOT_CLEANUP = YES
diff --git a/src/lib/netlist/build/makefile b/src/lib/netlist/build/makefile
index 7ee5a204629..fa983cb1d6c 100644
--- a/src/lib/netlist/build/makefile
+++ b/src/lib/netlist/build/makefile
@@ -50,6 +50,7 @@ POBJS := \
$(POBJ)/pchrono.o \
$(POBJ)/pdynlib.o \
$(POBJ)/pexception.o \
+ $(POBJ)/pfunction.o \
$(POBJ)/pfmtlog.o \
$(POBJ)/poptions.o \
$(POBJ)/pparser.o \
@@ -63,9 +64,9 @@ NLOBJS := \
$(NLOBJ)/nl_setup.o \
$(NLOBJ)/nl_factory.o \
$(NLOBJ)/analog/nld_bjt.o \
- $(NLOBJ)/analog/nld_fourterm.o \
+ $(NLOBJ)/analog/nlid_fourterm.o \
$(NLOBJ)/analog/nld_switches.o \
- $(NLOBJ)/analog/nld_twoterm.o \
+ $(NLOBJ)/analog/nlid_twoterm.o \
$(NLOBJ)/analog/nld_opamps.o \
$(NLOBJ)/devices/nld_2102A.o \
$(NLOBJ)/devices/nld_2716.o \
@@ -114,7 +115,7 @@ NLOBJS := \
$(NLOBJ)/devices/nld_log.o \
$(NLOBJ)/devices/nlid_proxy.o \
$(NLOBJ)/devices/nld_system.o \
- $(NLOBJ)/devices/nld_truthtable.o \
+ $(NLOBJ)/devices/nlid_truthtable.o \
$(NLOBJ)/macro/nlm_base.o \
$(NLOBJ)/macro/nlm_cd4xxx.o \
$(NLOBJ)/macro/nlm_opamp.o \
@@ -169,7 +170,7 @@ maketree: $(sort $(OBJDIRS))
.PHONY: clang mingw doc
clang:
- $(MAKE) CC=clang++ LD=clang++ CEXTRAFLAGS="-march=native -Weverything -Werror -Wno-padded -Wno-weak-vtables -Wno-missing-variable-declarations -Wconversion -Wno-c++98-compat -Wno-float-equal -Wno-global-constructors -Wno-c++98-compat-pedantic -Wno-format-nonliteral -Wno-weak-template-vtables -Wno-exit-time-destructors"
+ $(MAKE) CC=clang++-5.0 LD=clang++-5.0 CEXTRAFLAGS="-march=native -Weverything -Werror -Wno-padded -Wno-weak-vtables -Wno-missing-variable-declarations -Wconversion -Wno-c++98-compat -Wno-float-equal -Wno-global-constructors -Wno-c++98-compat-pedantic -Wno-format-nonliteral -Wno-weak-template-vtables -Wno-exit-time-destructors"
#
# Mostly done: -Wno-weak-vtables -Wno-cast-align
diff --git a/src/lib/netlist/devices/net_lib.cpp b/src/lib/netlist/devices/net_lib.cpp
index 502f044ec76..bc1d7051b39 100644
--- a/src/lib/netlist/devices/net_lib.cpp
+++ b/src/lib/netlist/devices/net_lib.cpp
@@ -9,60 +9,62 @@
****************************************************************************/
#include "net_lib.h"
-#include "nld_system.h"
#include "nl_factory.h"
#include "solver/nld_solver.h"
+
#define xstr(s) # s
+
+#if 0
#define ENTRY1(nic, name, defparam) factory.register_device<nic>( # name, xstr(nic), defparam );
#define ENTRY(nic, name, defparam) ENTRY1(NETLIB_NAME(nic), name, defparam)
+#endif
#define NETLIB_DEVICE_DECL(chip) extern factory::constructor_ptr_t decl_ ## chip;
-#define ENTRYX1(nic, name, defparam, decl) factory.register_device( decl (# name, xstr(nic), defparam) );
+//#define ENTRYX1(nic, name, defparam, decl) factory.register_device( decl (# name, xstr(nic), defparam) );
+#define ENTRYX1(nic, name, defparam, decl) factory.register_device( decl (pstring(# name), pstring(xstr(nic)), pstring(defparam)) );
#define ENTRYX(nic, name, defparam) { NETLIB_DEVICE_DECL(nic) ENTRYX1(NETLIB_NAME(nic), name, defparam, decl_ ## nic) }
namespace netlist
{
- using namespace netlist::analog;
-
namespace devices
{
-static void initialize_factory(factory::list_t &factory)
+ void initialize_factory(factory::list_t &factory)
{
- ENTRY(R, RES, "R")
- ENTRY(POT, POT, "R")
- ENTRY(POT2, POT2, "R")
- ENTRY(C, CAP, "C")
- ENTRY(L, IND, "L")
- ENTRY(D, DIODE, "MODEL")
- ENTRY(VCVS, VCVS, "")
- ENTRY(VCCS, VCCS, "")
- ENTRY(CCCS, CCCS, "")
- ENTRY(LVCCS, LVCCS, "")
- ENTRY(VS, VS, "V")
- ENTRY(CS, CS, "I")
- ENTRYX(opamp, OPAMP, "MODEL")
+ ENTRYX(R, RES, "R")
+ ENTRYX(POT, POT, "R")
+ ENTRYX(POT2, POT2, "R")
+ ENTRYX(C, CAP, "C")
+ ENTRYX(L, IND, "L")
+ ENTRYX(D, DIODE, "MODEL")
+ ENTRYX(VS, VS, "V")
+ ENTRYX(CS, CS, "I")
+ ENTRYX(VCVS, VCVS, "")
+ ENTRYX(VCCS, VCCS, "")
+ ENTRYX(CCCS, CCCS, "")
+ ENTRYX(LVCCS, LVCCS, "")
+ ENTRYX(opamp, OPAMP, "MODEL")
ENTRYX(dummy_input, DUMMY_INPUT, "")
ENTRYX(frontier, FRONTIER_DEV, "+I,+G,+Q") // not intended to be used directly
ENTRYX(function, AFUNC, "N,FUNC") // only for macro devices - NO FEEDBACK loops
- ENTRY(QBJT_EB, QBJT_EB, "MODEL")
- ENTRY(QBJT_switch, QBJT_SW, "MODEL")
+ ENTRYX(QBJT_EB, QBJT_EB, "MODEL")
+ ENTRYX(QBJT_switch, QBJT_SW, "MODEL")
ENTRYX(logic_input, TTL_INPUT, "IN")
ENTRYX(logic_input, LOGIC_INPUT, "IN,FAMILY")
ENTRYX(analog_input, ANALOG_INPUT, "IN")
ENTRYX(log, LOG, "+I")
ENTRYX(logD, LOGD, "+I,+I2")
ENTRYX(clock, CLOCK, "FREQ")
- ENTRYX(extclock, EXTCLOCK, "FREQ")
+ ENTRYX(extclock, EXTCLOCK, "FREQ,PATTERN")
ENTRYX(mainclock, MAINCLOCK, "FREQ")
ENTRYX(gnd, GND, "")
ENTRYX(netlistparams, PARAMETER, "")
- ENTRY(solver, SOLVER, "FREQ")
+ ENTRYX(solver, SOLVER, "FREQ")
ENTRYX(res_sw, RES_SWITCH, "+IN,+P1,+P2")
ENTRYX(switch1, SWITCH, "")
ENTRYX(switch2, SWITCH2, "")
- ENTRYX(nicRSFF, NETDEV_RSFF, "+S,+R")
+ ENTRYX(nicRSFF, NETDEV_RSFF, "")
ENTRYX(nicDelay, NETDEV_DELAY, "")
ENTRYX(2716, EPROM_2716, "+GQ,+EPQ,+A0,+A1,+A2,+A3,+A4,+A5,+A6,+A7,+A8,+A9,+A10")
ENTRYX(2102A, RAM_2102A, "+CEQ,+A0,+A1,+A2,+A3,+A4,+A5,+A6,+A7,+A8,+A9,+RWQ,+DI")
@@ -158,10 +160,3 @@ static void initialize_factory(factory::list_t &factory)
} //namespace devices
} // namespace netlist
-namespace netlist
-{
- void initialize_factory(factory::list_t &factory)
- {
- devices::initialize_factory(factory);
- }
-}
diff --git a/src/lib/netlist/devices/net_lib.h b/src/lib/netlist/devices/net_lib.h
index 9bbd9db744a..9ac05f9bccb 100644
--- a/src/lib/netlist/devices/net_lib.h
+++ b/src/lib/netlist/devices/net_lib.h
@@ -11,7 +11,28 @@
#ifndef NET_LIB_H
#define NET_LIB_H
-#include "nl_base.h"
+#include "nl_setup.h"
+
+//#define NL_AUTO_DEVICES 1
+
+#ifdef NL_AUTO_DEVICES
+#include "nld_devinc.h"
+
+#include "solver/nld_solver.h"
+
+#include "macro/nlm_cd4xxx.h"
+#include "macro/nlm_ttl74xx.h"
+#include "macro/nlm_opamp.h"
+#include "macro/nlm_other.h"
+
+#include "nld_7448.h"
+
+#else
+
+#define SOLVER(name, freq) \
+ NET_REGISTER_DEV(SOLVER, name) \
+ PARAM(name.FREQ, freq)
+
#include "nld_system.h"
#include "nld_2102A.h"
@@ -72,12 +93,8 @@
#include "analog/nld_switches.h"
#include "analog/nld_twoterm.h"
#include "analog/nld_opamps.h"
-#include "solver/nld_solver.h"
#include "nld_legacy.h"
-
-namespace netlist {
- void initialize_factory(factory::list_t &factory);
-}
+#endif
#endif
diff --git a/src/lib/netlist/devices/nld_2102A.cpp b/src/lib/netlist/devices/nld_2102A.cpp
index 8dbd5be8fec..803f5b523c9 100644
--- a/src/lib/netlist/devices/nld_2102A.cpp
+++ b/src/lib/netlist/devices/nld_2102A.cpp
@@ -6,6 +6,7 @@
*/
#include "nld_2102A.h"
+#include "nl_base.h"
#define ADDR2BYTE(a) ((a) >> 3)
#define ADDR2BIT(a) ((a) & 0x7)
diff --git a/src/lib/netlist/devices/nld_2716.cpp b/src/lib/netlist/devices/nld_2716.cpp
index 7ba974b92da..aa491c47d3c 100644
--- a/src/lib/netlist/devices/nld_2716.cpp
+++ b/src/lib/netlist/devices/nld_2716.cpp
@@ -6,6 +6,7 @@
*/
#include "nld_2716.h"
+#include "nl_base.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_4020.cpp b/src/lib/netlist/devices/nld_4020.cpp
index a147cf3f58f..14459fb3b62 100644
--- a/src/lib/netlist/devices/nld_4020.cpp
+++ b/src/lib/netlist/devices/nld_4020.cpp
@@ -5,7 +5,7 @@
*
*/
-#include <devices/nlid_cmos.h>
+#include "devices/nlid_cmos.h"
#include "nld_4020.h"
namespace netlist
diff --git a/src/lib/netlist/devices/nld_4066.cpp b/src/lib/netlist/devices/nld_4066.cpp
index f33688b73b7..11dca7b11dd 100644
--- a/src/lib/netlist/devices/nld_4066.cpp
+++ b/src/lib/netlist/devices/nld_4066.cpp
@@ -5,8 +5,8 @@
*
*/
-#include <devices/nlid_cmos.h>
-#include "analog/nld_twoterm.h"
+#include "devices/nlid_cmos.h"
+#include "analog/nlid_twoterm.h"
#include "nld_4066.h"
namespace netlist
diff --git a/src/lib/netlist/devices/nld_4316.cpp b/src/lib/netlist/devices/nld_4316.cpp
index 8b9cb0d46ad..5c86f885545 100644
--- a/src/lib/netlist/devices/nld_4316.cpp
+++ b/src/lib/netlist/devices/nld_4316.cpp
@@ -5,8 +5,8 @@
*
*/
-#include <devices/nlid_cmos.h>
-#include "analog/nld_twoterm.h"
+#include "devices/nlid_cmos.h"
+#include "analog/nlid_twoterm.h"
#include "nld_4316.h"
namespace netlist { namespace devices {
diff --git a/src/lib/netlist/devices/nld_74107.cpp b/src/lib/netlist/devices/nld_74107.cpp
index a9006d55a75..3a3c43ac0fa 100644
--- a/src/lib/netlist/devices/nld_74107.cpp
+++ b/src/lib/netlist/devices/nld_74107.cpp
@@ -6,6 +6,7 @@
*/
#include "nld_74107.h"
+#include "nl_base.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_74123.cpp b/src/lib/netlist/devices/nld_74123.cpp
index bcbfdcb106a..514ea4e9390 100644
--- a/src/lib/netlist/devices/nld_74123.cpp
+++ b/src/lib/netlist/devices/nld_74123.cpp
@@ -5,10 +5,10 @@
*
*/
-#include "nld_74123.h"
-
#include "nlid_system.h"
-#include "analog/nld_twoterm.h"
+#include "analog/nlid_twoterm.h"
+
+#include <cmath>
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_74153.cpp b/src/lib/netlist/devices/nld_74153.cpp
index fb97411e350..efa6322e514 100644
--- a/src/lib/netlist/devices/nld_74153.cpp
+++ b/src/lib/netlist/devices/nld_74153.cpp
@@ -6,6 +6,7 @@
*/
#include "nld_74153.h"
+#include "nl_base.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_74161.cpp b/src/lib/netlist/devices/nld_74161.cpp
index d6e31f36417..4579fa41b7a 100644
--- a/src/lib/netlist/devices/nld_74161.cpp
+++ b/src/lib/netlist/devices/nld_74161.cpp
@@ -8,6 +8,7 @@
#define MAXCNT 15
#include "nld_74161.h"
+#include "nl_base.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_74165.cpp b/src/lib/netlist/devices/nld_74165.cpp
index bb263409bf9..c967f95d44c 100644
--- a/src/lib/netlist/devices/nld_74165.cpp
+++ b/src/lib/netlist/devices/nld_74165.cpp
@@ -6,6 +6,7 @@
*/
#include "nld_74165.h"
+#include "nl_base.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_74166.cpp b/src/lib/netlist/devices/nld_74166.cpp
index 5cb7114ee0f..d56159183b0 100644
--- a/src/lib/netlist/devices/nld_74166.cpp
+++ b/src/lib/netlist/devices/nld_74166.cpp
@@ -6,6 +6,7 @@
*/
#include "nld_74166.h"
+#include "nl_base.h"
namespace netlist
{
@@ -82,7 +83,7 @@ namespace netlist
netlist_time delay = NLTIME_FROM_NS(26);
if (m_CLRQ())
{
- bool clear_unset = !m_last_CLRQ();
+ bool clear_unset = !m_last_CLRQ;
if (clear_unset)
{
delay = NLTIME_FROM_NS(35);
diff --git a/src/lib/netlist/devices/nld_74174.cpp b/src/lib/netlist/devices/nld_74174.cpp
index 64698423435..d131b18af23 100644
--- a/src/lib/netlist/devices/nld_74174.cpp
+++ b/src/lib/netlist/devices/nld_74174.cpp
@@ -6,6 +6,7 @@
*/
#include "nld_74174.h"
+#include "nl_base.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_74175.cpp b/src/lib/netlist/devices/nld_74175.cpp
index 4d8e3608ee8..3055a73f2c9 100644
--- a/src/lib/netlist/devices/nld_74175.cpp
+++ b/src/lib/netlist/devices/nld_74175.cpp
@@ -6,6 +6,7 @@
*/
#include "nld_74175.h"
+#include "nl_base.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_74192.cpp b/src/lib/netlist/devices/nld_74192.cpp
index 80e1853b7f7..77029cfdf50 100644
--- a/src/lib/netlist/devices/nld_74192.cpp
+++ b/src/lib/netlist/devices/nld_74192.cpp
@@ -8,6 +8,7 @@
#define MAXCNT 9
#include "nld_74192.h"
+#include "nl_base.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_74193.cpp b/src/lib/netlist/devices/nld_74193.cpp
index 3d32596dbee..f5370719778 100644
--- a/src/lib/netlist/devices/nld_74193.cpp
+++ b/src/lib/netlist/devices/nld_74193.cpp
@@ -8,6 +8,7 @@
#define MAXCNT 15
#include "nld_74193.h"
+#include "nl_base.h"
namespace netlist
{
@@ -136,8 +137,8 @@ namespace netlist
for (std::size_t i=0; i<4; i++)
m_Q[i].push((m_cnt >> i) & 1, delay[i]);
- m_BORROWQ.push(tBorrow, NLTIME_FROM_NS(20)); //FIXME
- m_CARRYQ.push(tCarry, NLTIME_FROM_NS(20)); //FIXME
+ m_BORROWQ.push(tBorrow, NLTIME_FROM_NS(20)); //FIXME timing
+ m_CARRYQ.push(tCarry, NLTIME_FROM_NS(20)); //FIXME timing
}
NETLIB_DEVICE_IMPL(74193)
diff --git a/src/lib/netlist/devices/nld_74194.cpp b/src/lib/netlist/devices/nld_74194.cpp
index e951e351e93..4fe5092f4d5 100644
--- a/src/lib/netlist/devices/nld_74194.cpp
+++ b/src/lib/netlist/devices/nld_74194.cpp
@@ -6,6 +6,7 @@
*/
#include "nld_74194.h"
+#include "nl_base.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_74194.h b/src/lib/netlist/devices/nld_74194.h
index 944d9537754..8d07b685e55 100644
--- a/src/lib/netlist/devices/nld_74194.h
+++ b/src/lib/netlist/devices/nld_74194.h
@@ -28,17 +28,17 @@
#include "nl_setup.h"
-#define TTL_74194(name, cCLK, cS0, cS1, cSRIN, cA, cB, cC, cD, cSLIN, cCLRQ) \
- NET_REGISTER_DEV(TTL_74194, name) \
- NET_CONNECT(name, CLK, cCLK) \
- NET_CONNECT(name, S0, cS0) \
- NET_CONNECT(name, S1, cS1) \
- NET_CONNECT(name, SRIN, cSRIN) \
- NET_CONNECT(name, A, cA) \
- NET_CONNECT(name, B, cB) \
- NET_CONNECT(name, C, cC) \
- NET_CONNECT(name, D, cD) \
- NET_CONNECT(name, SLIN, cSLIN) \
+#define TTL_74194(name, cCLK, cS0, cS1, cSRIN, cA, cB, cC, cD, cSLIN, cCLRQ) \
+ NET_REGISTER_DEV(TTL_74194, name) \
+ NET_CONNECT(name, CLK, cCLK) \
+ NET_CONNECT(name, S0, cS0) \
+ NET_CONNECT(name, S1, cS1) \
+ NET_CONNECT(name, SRIN, cSRIN) \
+ NET_CONNECT(name, A, cA) \
+ NET_CONNECT(name, B, cB) \
+ NET_CONNECT(name, C, cC) \
+ NET_CONNECT(name, D, cD) \
+ NET_CONNECT(name, SLIN, cSLIN) \
NET_CONNECT(name, CLRQ, cCLRQ)
#define TTL_74194_DIP(name) \
diff --git a/src/lib/netlist/devices/nld_74279.cpp b/src/lib/netlist/devices/nld_74279.cpp
index 48c2e7e095b..ff8f12e07ea 100644
--- a/src/lib/netlist/devices/nld_74279.cpp
+++ b/src/lib/netlist/devices/nld_74279.cpp
@@ -5,8 +5,9 @@
*
*/
+#include "nlid_truthtable.h"
#include "nld_74279.h"
-#include "nld_truthtable.h"
+#include "nl_base.h"
namespace netlist
{
@@ -56,7 +57,7 @@ namespace netlist
nld_74279A::truthtable_t nld_74279A::m_ttbl;
nld_74279B::truthtable_t nld_74279B::m_ttbl;
- const char *nld_74279A::m_desc[] = {
+ const pstring nld_74279A::m_desc[] = {
"S,R,_Q|Q",
"0,X,X|1|22",
"1,0,X|0|27",
@@ -66,7 +67,7 @@ namespace netlist
};
- const char *nld_74279B::m_desc[] = {
+ const pstring nld_74279B::m_desc[] = {
"S1,S2,R,_Q|Q",
"0,X,X,X|1|22",
"X,0,X,X|1|22",
diff --git a/src/lib/netlist/devices/nld_74365.cpp b/src/lib/netlist/devices/nld_74365.cpp
index 34eafb0856e..f008b721344 100644
--- a/src/lib/netlist/devices/nld_74365.cpp
+++ b/src/lib/netlist/devices/nld_74365.cpp
@@ -6,6 +6,7 @@
*/
#include "nld_74365.h"
+#include "nl_base.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_7448.cpp b/src/lib/netlist/devices/nld_7448.cpp
index 8b4d11c374b..a4b358c3da5 100644
--- a/src/lib/netlist/devices/nld_7448.cpp
+++ b/src/lib/netlist/devices/nld_7448.cpp
@@ -5,8 +5,8 @@
*
*/
+#include "nlid_truthtable.h"
#include "nld_7448.h"
-#include "nld_truthtable.h"
namespace netlist
{
@@ -14,7 +14,7 @@ namespace netlist
{
#if (USE_TRUTHTABLE_7448 && USE_TRUTHTABLE)
- NETLIB_TRUTHTABLE(7448, 7, 7, 0);
+ NETLIB_TRUTHTABLE(7448, 7, 7);
#else
@@ -80,7 +80,7 @@ namespace netlist
#if (USE_TRUTHTABLE_7448 && USE_TRUTHTABLE)
nld_7448::truthtable_t nld_7448::m_ttbl;
- const char *nld_7448::m_desc[] = {
+ const pstring nld_7448::m_desc[] = {
" LTQ,BIQ,RBIQ, A , B , C , D | a, b, c, d, e, f, g",
" 1, 1, 1, 0, 0, 0, 0 | 1, 1, 1, 1, 1, 1, 0|100,100,100,100,100,100,100",
diff --git a/src/lib/netlist/devices/nld_7448.h b/src/lib/netlist/devices/nld_7448.h
index 199b46343a8..24cdcb8f6f1 100644
--- a/src/lib/netlist/devices/nld_7448.h
+++ b/src/lib/netlist/devices/nld_7448.h
@@ -24,7 +24,7 @@
#ifndef NLD_7448_H_
#define NLD_7448_H_
-#include "nl_base.h"
+#include "nl_setup.h"
/*
* FIXME: Using truthtable is a lot slower than the explicit device
@@ -34,6 +34,8 @@
#define USE_TRUTHTABLE_7448 (0)
+#ifndef NL_AUTO_DEVICES
+
#define TTL_7448(name, cA0, cA1, cA2, cA3, cLTQ, cBIQ, cRBIQ) \
NET_REGISTER_DEV(TTL_7448, name) \
NET_CONNECT(name, A, cA0) \
@@ -47,4 +49,6 @@
#define TTL_7448_DIP(name) \
NET_REGISTER_DEV(TTL_7448_DIP, name)
+#endif
+
#endif /* NLD_7448_H_ */
diff --git a/src/lib/netlist/devices/nld_7450.cpp b/src/lib/netlist/devices/nld_7450.cpp
index 007f899a5f9..2ad560b1d07 100644
--- a/src/lib/netlist/devices/nld_7450.cpp
+++ b/src/lib/netlist/devices/nld_7450.cpp
@@ -6,6 +6,7 @@
*/
#include "nld_7450.h"
+#include "nl_base.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_7473.cpp b/src/lib/netlist/devices/nld_7473.cpp
index fc73b97c201..3c88b0f8167 100644
--- a/src/lib/netlist/devices/nld_7473.cpp
+++ b/src/lib/netlist/devices/nld_7473.cpp
@@ -6,6 +6,7 @@
*/
#include "nld_7473.h"
+#include "nl_base.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_7474.cpp b/src/lib/netlist/devices/nld_7474.cpp
index f11ccbd2164..627d3a9b48a 100644
--- a/src/lib/netlist/devices/nld_7474.cpp
+++ b/src/lib/netlist/devices/nld_7474.cpp
@@ -6,6 +6,7 @@
*/
#include "nld_7474.h"
+#include "nl_base.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_7475.cpp b/src/lib/netlist/devices/nld_7475.cpp
index 3c26c1ce439..7bf3f14d7f2 100644
--- a/src/lib/netlist/devices/nld_7475.cpp
+++ b/src/lib/netlist/devices/nld_7475.cpp
@@ -7,6 +7,7 @@
*/
#include "nld_7475.h"
+#include "nl_base.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_7483.cpp b/src/lib/netlist/devices/nld_7483.cpp
index a11f36c1540..518026e7fe5 100644
--- a/src/lib/netlist/devices/nld_7483.cpp
+++ b/src/lib/netlist/devices/nld_7483.cpp
@@ -6,6 +6,7 @@
*/
#include "nld_7483.h"
+#include "nl_base.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_7485.cpp b/src/lib/netlist/devices/nld_7485.cpp
index b4237a6426d..4526b9001ea 100644
--- a/src/lib/netlist/devices/nld_7485.cpp
+++ b/src/lib/netlist/devices/nld_7485.cpp
@@ -6,6 +6,7 @@
*/
#include "nld_7485.h"
+#include "nl_base.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_7490.cpp b/src/lib/netlist/devices/nld_7490.cpp
index e395c64120e..a85ccbcfbcb 100644
--- a/src/lib/netlist/devices/nld_7490.cpp
+++ b/src/lib/netlist/devices/nld_7490.cpp
@@ -6,6 +6,7 @@
*/
#include "nld_7490.h"
+#include "nl_base.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_7493.cpp b/src/lib/netlist/devices/nld_7493.cpp
index 557d7fa42b6..df6ab4ad668 100644
--- a/src/lib/netlist/devices/nld_7493.cpp
+++ b/src/lib/netlist/devices/nld_7493.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_7493.h"
-#include "nl_setup.h"
+#include "nl_base.h"
namespace netlist
{
@@ -29,8 +29,8 @@ namespace netlist
logic_input_t m_I;
logic_output_t m_Q;
- state_var_u8 m_reset;
- state_var_u8 m_state;
+ state_var<netlist_sig_t> m_reset;
+ state_var<netlist_sig_t> m_state;
};
NETLIB_OBJECT(7493)
@@ -99,7 +99,7 @@ namespace netlist
NETLIB_UPDATE(7493ff)
{
- constexpr netlist_time out_delay = NLTIME_FROM_NS(18);
+ static constexpr netlist_time out_delay = NLTIME_FROM_NS(18);
if (m_reset)
{
m_state ^= 1;
diff --git a/src/lib/netlist/devices/nld_74ls629.cpp b/src/lib/netlist/devices/nld_74ls629.cpp
index 07eee6f5a57..26a5aaf2220 100644
--- a/src/lib/netlist/devices/nld_74ls629.cpp
+++ b/src/lib/netlist/devices/nld_74ls629.cpp
@@ -40,7 +40,7 @@
#include "nld_74ls629.h"
-#include "analog/nld_twoterm.h"
+#include "analog/nlid_twoterm.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_82S115.cpp b/src/lib/netlist/devices/nld_82S115.cpp
index c01d013aec5..855e22c0f87 100644
--- a/src/lib/netlist/devices/nld_82S115.cpp
+++ b/src/lib/netlist/devices/nld_82S115.cpp
@@ -6,6 +6,7 @@
*/
#include "nld_82S115.h"
+#include "nl_base.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_82S115.h b/src/lib/netlist/devices/nld_82S115.h
index 0c900e4dad7..1ceb22dc1b1 100644
--- a/src/lib/netlist/devices/nld_82S115.h
+++ b/src/lib/netlist/devices/nld_82S115.h
@@ -30,19 +30,19 @@
#include "nl_setup.h"
-#define PROM_82S115(name, cCE1Q, cCE2, cA0, cA1, cA2, cA3, cA4, cA5, cA6, cA7, cA8, cSTROBE) \
- NET_REGISTER_DEV(PROM_82S115, name) \
- NET_CONNECT(name, CE1Q, cCE1Q) \
- NET_CONNECT(name, CE2, cCE2) \
- NET_CONNECT(name, A0, cA0) \
- NET_CONNECT(name, A1, cA1) \
- NET_CONNECT(name, A2, cA2) \
- NET_CONNECT(name, A3, cA3) \
- NET_CONNECT(name, A4, cA4) \
- NET_CONNECT(name, A5, cA5) \
- NET_CONNECT(name, A6, cA6) \
- NET_CONNECT(name, A7, cA7) \
- NET_CONNECT(name, A8, cA8) \
+#define PROM_82S115(name, cCE1Q, cCE2, cA0, cA1, cA2, cA3, cA4, cA5, cA6, cA7, cA8, cSTROBE) \
+ NET_REGISTER_DEV(PROM_82S115, name) \
+ NET_CONNECT(name, CE1Q, cCE1Q) \
+ NET_CONNECT(name, CE2, cCE2) \
+ NET_CONNECT(name, A0, cA0) \
+ NET_CONNECT(name, A1, cA1) \
+ NET_CONNECT(name, A2, cA2) \
+ NET_CONNECT(name, A3, cA3) \
+ NET_CONNECT(name, A4, cA4) \
+ NET_CONNECT(name, A5, cA5) \
+ NET_CONNECT(name, A6, cA6) \
+ NET_CONNECT(name, A7, cA7) \
+ NET_CONNECT(name, A8, cA8) \
NET_CONNECT(name, STROBE, cSTROBE)
#define PROM_82S115_DIP(name) \
diff --git a/src/lib/netlist/devices/nld_82S123.cpp b/src/lib/netlist/devices/nld_82S123.cpp
index f9e97174d4a..2152bd738eb 100644
--- a/src/lib/netlist/devices/nld_82S123.cpp
+++ b/src/lib/netlist/devices/nld_82S123.cpp
@@ -6,6 +6,7 @@
*/
#include "nld_82S123.h"
+#include "nl_base.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_82S126.cpp b/src/lib/netlist/devices/nld_82S126.cpp
index d3a86ce84ee..221b7425c8d 100644
--- a/src/lib/netlist/devices/nld_82S126.cpp
+++ b/src/lib/netlist/devices/nld_82S126.cpp
@@ -6,6 +6,7 @@
*/
#include "nld_82S126.h"
+#include "nl_base.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_82S16.cpp b/src/lib/netlist/devices/nld_82S16.cpp
index fccdc8b1044..a2a199a61d5 100644
--- a/src/lib/netlist/devices/nld_82S16.cpp
+++ b/src/lib/netlist/devices/nld_82S16.cpp
@@ -6,6 +6,7 @@
*/
#include "nld_82S16.h"
+#include "nl_base.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_9310.cpp b/src/lib/netlist/devices/nld_9310.cpp
index 4ddb62af519..dd448c4282b 100644
--- a/src/lib/netlist/devices/nld_9310.cpp
+++ b/src/lib/netlist/devices/nld_9310.cpp
@@ -6,6 +6,7 @@
*/
#include "nld_9310.h"
+#include "nl_base.h"
#define MAXCNT 9
@@ -158,21 +159,22 @@ namespace netlist
{
if (m_loadq)
{
- switch (m_cnt())
+ if (m_cnt < MAXCNT - 1)
{
- case MAXCNT - 1:
- m_cnt = MAXCNT;
- m_RC.push(m_ent, NLTIME_FROM_NS(20));
- m_QA.push(1, NLTIME_FROM_NS(20));
- break;
- case MAXCNT:
- m_RC.push(0, NLTIME_FROM_NS(20));
- m_cnt = 0;
- update_outputs_all(m_cnt, NLTIME_FROM_NS(20));
- break;
- default:
- m_cnt++;
- update_outputs(m_cnt);
+ m_cnt++;
+ update_outputs(m_cnt);
+ }
+ else if (m_cnt == MAXCNT - 1)
+ {
+ m_cnt = MAXCNT;
+ m_RC.push(m_ent, NLTIME_FROM_NS(20));
+ m_QA.push(1, NLTIME_FROM_NS(20));
+ }
+ else // MAXCNT
+ {
+ m_RC.push(0, NLTIME_FROM_NS(20));
+ m_cnt = 0;
+ update_outputs_all(m_cnt, NLTIME_FROM_NS(20));
}
}
else
diff --git a/src/lib/netlist/devices/nld_9312.cpp b/src/lib/netlist/devices/nld_9312.cpp
index 2ad298f368a..b3fe0545f81 100644
--- a/src/lib/netlist/devices/nld_9312.cpp
+++ b/src/lib/netlist/devices/nld_9312.cpp
@@ -20,8 +20,8 @@
* | 1 | 1 | 1 | 0 || D7|D7Q|
* +---+---+---+---++---+---+
*/
+#include "nlid_truthtable.h"
#include "nld_9312.h"
-#include "nld_truthtable.h"
namespace netlist
{
@@ -130,7 +130,7 @@ namespace netlist
* do this right now.
*/
- const char *nld_9312::m_desc[] = {
+ const pstring nld_9312::m_desc[] = {
" C, B, A, G,D0,D1,D2,D3,D4,D5,D6,D7| Y,YQ",
" X, X, X, 1, X, X, X, X, X, X, X, X| 0, 1|33,19",
" 0, 0, 0, 0, 0, X, X, X, X, X, X, X| 0, 1|33,28",
diff --git a/src/lib/netlist/devices/nld_9312.h b/src/lib/netlist/devices/nld_9312.h
index 98cc0d115c8..c85d86d2773 100644
--- a/src/lib/netlist/devices/nld_9312.h
+++ b/src/lib/netlist/devices/nld_9312.h
@@ -39,19 +39,19 @@
#include "nl_setup.h"
-#define TTL_9312(name, cA, cB, cC, cD0, cD1, cD2, cD3, cD4, cD5, cD6, cD7, cSTROBE) \
- NET_REGISTER_DEV(TTL_9312, name) \
- NET_CONNECT(name, A, cA) \
- NET_CONNECT(name, B, cB) \
- NET_CONNECT(name, C, cC) \
- NET_CONNECT(name, D0, cD0) \
- NET_CONNECT(name, D1, cD1) \
- NET_CONNECT(name, D2, cD2) \
- NET_CONNECT(name, D3, cD3) \
- NET_CONNECT(name, D4, cD4) \
- NET_CONNECT(name, D5, cD5) \
- NET_CONNECT(name, D6, cD6) \
- NET_CONNECT(name, D7, cD7) \
+#define TTL_9312(name, cA, cB, cC, cD0, cD1, cD2, cD3, cD4, cD5, cD6, cD7, cSTROBE) \
+ NET_REGISTER_DEV(TTL_9312, name) \
+ NET_CONNECT(name, A, cA) \
+ NET_CONNECT(name, B, cB) \
+ NET_CONNECT(name, C, cC) \
+ NET_CONNECT(name, D0, cD0) \
+ NET_CONNECT(name, D1, cD1) \
+ NET_CONNECT(name, D2, cD2) \
+ NET_CONNECT(name, D3, cD3) \
+ NET_CONNECT(name, D4, cD4) \
+ NET_CONNECT(name, D5, cD5) \
+ NET_CONNECT(name, D6, cD6) \
+ NET_CONNECT(name, D7, cD7) \
NET_CONNECT(name, G, cSTROBE)
#define TTL_9312_DIP(name) \
diff --git a/src/lib/netlist/devices/nld_9316.cpp b/src/lib/netlist/devices/nld_9316.cpp
index ea7ca9fc45c..e9004417b6d 100644
--- a/src/lib/netlist/devices/nld_9316.cpp
+++ b/src/lib/netlist/devices/nld_9316.cpp
@@ -6,6 +6,7 @@
*/
#include "nld_9316.h"
+#include "nl_base.h"
#define MAXCNT 15
@@ -161,22 +162,22 @@ namespace netlist
{
if (m_loadq)
{
- switch (m_cnt())
+ if (m_cnt < MAXCNT - 1)
{
- case MAXCNT - 1:
- m_cnt = MAXCNT;
- m_RC.push(m_ent, NLTIME_FROM_NS(27));
- m_QA.push(1, NLTIME_FROM_NS(20));
- break;
- case MAXCNT:
- m_RC.push(0, NLTIME_FROM_NS(27));
- m_cnt = 0;
- update_outputs_all(m_cnt, NLTIME_FROM_NS(20));
- break;
- default:
- m_cnt++;
- update_outputs_all(m_cnt, NLTIME_FROM_NS(20));
- break;
+ m_cnt++;
+ update_outputs_all(m_cnt, NLTIME_FROM_NS(20));
+ }
+ else if (m_cnt == MAXCNT - 1)
+ {
+ m_cnt = MAXCNT;
+ m_RC.push(m_ent, NLTIME_FROM_NS(27));
+ m_QA.push(1, NLTIME_FROM_NS(20));
+ }
+ else // MAXCNT
+ {
+ m_RC.push(0, NLTIME_FROM_NS(27));
+ m_cnt = 0;
+ update_outputs_all(m_cnt, NLTIME_FROM_NS(20));
}
}
else
diff --git a/src/lib/netlist/devices/nld_9322.cpp b/src/lib/netlist/devices/nld_9322.cpp
index 881ec9e5355..1f402d4111b 100644
--- a/src/lib/netlist/devices/nld_9322.cpp
+++ b/src/lib/netlist/devices/nld_9322.cpp
@@ -6,6 +6,7 @@
*/
#include "nld_9322.h"
+#include "nl_base.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_am2847.cpp b/src/lib/netlist/devices/nld_am2847.cpp
index b4891db5398..be5f75c3774 100644
--- a/src/lib/netlist/devices/nld_am2847.cpp
+++ b/src/lib/netlist/devices/nld_am2847.cpp
@@ -6,6 +6,7 @@
*/
#include "nld_am2847.h"
+#include "nl_base.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_dm9334.cpp b/src/lib/netlist/devices/nld_dm9334.cpp
index 091f08f00a8..b8607374620 100644
--- a/src/lib/netlist/devices/nld_dm9334.cpp
+++ b/src/lib/netlist/devices/nld_dm9334.cpp
@@ -6,6 +6,7 @@
*/
#include "nld_dm9334.h"
+#include "nl_base.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_legacy.cpp b/src/lib/netlist/devices/nld_legacy.cpp
index 3a063094b72..29cff9576ab 100644
--- a/src/lib/netlist/devices/nld_legacy.cpp
+++ b/src/lib/netlist/devices/nld_legacy.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_legacy.h"
-#include "nl_setup.h"
+#include "nl_base.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_log.cpp b/src/lib/netlist/devices/nld_log.cpp
index 17661de803d..d69bc6aa81e 100644
--- a/src/lib/netlist/devices/nld_log.cpp
+++ b/src/lib/netlist/devices/nld_log.cpp
@@ -5,7 +5,6 @@
*
*/
-#include <memory>
#include "nl_base.h"
#include "plib/pstream.h"
#include "plib/pfmtlog.h"
@@ -20,21 +19,22 @@ namespace netlist
{
NETLIB_CONSTRUCTOR(log)
, m_I(*this, "I")
+ , m_strm(plib::pfmt("{1}.log")(this->name()))
+ , m_writer(m_strm)
{
- pstring filename = plib::pfmt("{1}.log")(this->name());
- m_strm = plib::make_unique<plib::pofilestream>(filename);
}
NETLIB_UPDATEI()
{
/* use pstring::sprintf, it is a LOT faster */
- m_strm->writeline(plib::pfmt("{1} {2}").e(netlist().time().as_double(),".9").e(static_cast<double>(m_I())));
+ m_writer.writeline(plib::pfmt("{1} {2}").e(netlist().time().as_double(),".9").e(static_cast<double>(m_I())));
}
NETLIB_RESETI() { }
protected:
analog_input_t m_I;
- std::unique_ptr<plib::pofilestream> m_strm;
+ plib::pofilestream m_strm;
+ plib::putf8_writer m_writer;
};
NETLIB_OBJECT_DERIVED(logD, log)
@@ -46,7 +46,7 @@ namespace netlist
NETLIB_UPDATEI()
{
- m_strm->writeline(plib::pfmt("{1} {2}").e(netlist().time().as_double(),".9").e(static_cast<double>(m_I() - m_I2())));
+ m_writer.writeline(plib::pfmt("{1} {2}").e(netlist().time().as_double(),".9").e(static_cast<double>(m_I() - m_I2())));
}
NETLIB_RESETI() { }
diff --git a/src/lib/netlist/devices/nld_mm5837.cpp b/src/lib/netlist/devices/nld_mm5837.cpp
index 7650538997b..d9297166d94 100644
--- a/src/lib/netlist/devices/nld_mm5837.cpp
+++ b/src/lib/netlist/devices/nld_mm5837.cpp
@@ -6,8 +6,8 @@
*/
#include "nld_mm5837.h"
-#include <solver/nld_matrix_solver.h>
-#include "analog/nld_twoterm.h"
+#include "solver/nld_matrix_solver.h"
+#include "analog/nlid_twoterm.h"
#define R_LOW (1000.0)
#define R_HIGH (1000.0)
@@ -72,7 +72,7 @@ namespace netlist
m_RV.set(NL_FCONST(1.0) / R_LOW, 0.0, 0.0);
m_inc = netlist_time::from_double(1.0 / m_FREQ());
if (m_FREQ() < 24000 || m_FREQ() > 56000)
- netlist().log().warning("MM5837: Frequency outside of specs.", m_FREQ());
+ log().warning(MW_1_FREQUENCY_OUTSIDE_OF_SPECS_1, m_FREQ());
m_shift = 0x1ffff;
m_is_timestep = m_RV.m_P.net().solver()->is_timestep();
@@ -82,7 +82,7 @@ namespace netlist
{
m_inc = netlist_time::from_double(1.0 / m_FREQ());
if (m_FREQ() < 24000 || m_FREQ() > 56000)
- netlist().log().warning("MM5837: Frequency outside of specs.", m_FREQ());
+ log().warning(MW_1_FREQUENCY_OUTSIDE_OF_SPECS_1, m_FREQ());
}
NETLIB_UPDATE(MM5837_dip)
diff --git a/src/lib/netlist/devices/nld_ne555.cpp b/src/lib/netlist/devices/nld_ne555.cpp
index 3cfd120be30..f9bb5e261c2 100644
--- a/src/lib/netlist/devices/nld_ne555.cpp
+++ b/src/lib/netlist/devices/nld_ne555.cpp
@@ -6,8 +6,8 @@
*/
#include "nld_ne555.h"
-#include "analog/nld_twoterm.h"
-#include <solver/nld_solver.h>
+#include "analog/nlid_twoterm.h"
+#include "solver/nld_solver.h"
#define R_OFF (1E20)
#define R_ON (25) // Datasheet states a maximum discharge of 200mA, R = 5V / 0.2
diff --git a/src/lib/netlist/devices/nld_r2r_dac.cpp b/src/lib/netlist/devices/nld_r2r_dac.cpp
index 8a6d811f2d4..f4006eef31d 100644
--- a/src/lib/netlist/devices/nld_r2r_dac.cpp
+++ b/src/lib/netlist/devices/nld_r2r_dac.cpp
@@ -5,8 +5,9 @@
*
*/
-#include "nld_r2r_dac.h"
-#include "analog/nld_twoterm.h"
+#include "nl_base.h"
+#include "nl_factory.h"
+#include "analog/nlid_twoterm.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_system.cpp b/src/lib/netlist/devices/nld_system.cpp
index f555e41720a..e3585271696 100644
--- a/src/lib/netlist/devices/nld_system.cpp
+++ b/src/lib/netlist/devices/nld_system.cpp
@@ -5,8 +5,8 @@
*
*/
-#include <solver/nld_solver.h>
-#include <solver/nld_matrix_solver.h>
+#include "solver/nld_solver.h"
+#include "solver/nld_matrix_solver.h"
#include "nlid_system.h"
namespace netlist
@@ -132,82 +132,13 @@ namespace netlist
NETLIB_UPDATE(function)
{
- //nl_double val = INPANALOG(m_I[0]) * INPANALOG(m_I[1]) * 0.2;
- //OUTANALOG(m_Q, val);
- nl_double stack[20];
- unsigned ptr = 0;
- std::size_t e = m_precompiled.size();
- for (std::size_t i = 0; i<e; i++)
+ for (std::size_t i=0; i < static_cast<unsigned>(m_N()); i++)
{
- rpn_inst &rc = m_precompiled[i];
- switch (rc.m_cmd)
- {
- case ADD:
- ptr--;
- stack[ptr-1] = stack[ptr] + stack[ptr-1];
- break;
- case MULT:
- ptr--;
- stack[ptr-1] = stack[ptr] * stack[ptr-1];
- break;
- case SUB:
- ptr--;
- stack[ptr-1] = stack[ptr-1] - stack[ptr];
- break;
- case DIV:
- ptr--;
- stack[ptr-1] = stack[ptr-1] / stack[ptr];
- break;
- case POW:
- ptr--;
- stack[ptr-1] = std::pow(stack[ptr-1], stack[ptr]);
- break;
- case PUSH_INPUT:
- stack[ptr++] = (*m_I[static_cast<unsigned>(rc.m_param)])();
- break;
- case PUSH_CONST:
- stack[ptr++] = rc.m_param;
- break;
- }
+ m_vals[i] = (*m_I[i])();
}
- m_Q.push(stack[ptr-1]);
+ m_Q.push(m_precompiled.evaluate(m_vals));
}
- void NETLIB_NAME(function)::compile()
- {
- plib::pstring_vector_t cmds(m_func(), " ");
- m_precompiled.clear();
-
- for (std::size_t i=0; i < cmds.size(); i++)
- {
- pstring cmd = cmds[i];
- rpn_inst rc;
- if (cmd == "+")
- rc.m_cmd = ADD;
- else if (cmd == "-")
- rc.m_cmd = SUB;
- else if (cmd == "*")
- rc.m_cmd = MULT;
- else if (cmd == "/")
- rc.m_cmd = DIV;
- else if (cmd == "pow")
- rc.m_cmd = POW;
- else if (cmd.startsWith("A"))
- {
- rc.m_cmd = PUSH_INPUT;
- rc.m_param = cmd.substr(1).as_long();
- }
- else
- {
- bool err = false;
- rc.m_cmd = PUSH_CONST;
- rc.m_param = cmd.as_double(&err);
- if (err)
- netlist().log().fatal("nld_function: unknown/misformatted token <{1}> in <{2}>", cmd, m_func());
- }
- m_precompiled.push_back(rc);
- }
- }
NETLIB_DEVICE_IMPL(dummy_input)
NETLIB_DEVICE_IMPL(frontier)
diff --git a/src/lib/netlist/devices/nld_system.h b/src/lib/netlist/devices/nld_system.h
index 738ceb2a171..46781fe2884 100644
--- a/src/lib/netlist/devices/nld_system.h
+++ b/src/lib/netlist/devices/nld_system.h
@@ -54,9 +54,6 @@
NET_C(cG, name.G) \
NET_C(cOUT, name.Q)
-#define OPTIMIZE_FRONTIER(attach, r_in, r_out) \
- setup.register_frontier(# attach, r_in, r_out);
-
#define RES_SWITCH(name, cIN, cP1, cP2) \
NET_REGISTER_DEV(RES_SWITCH, name) \
NET_C(cIN, name.I) \
@@ -72,4 +69,5 @@
PARAM(name.N, p_N) \
PARAM(name.FUNC, p_F)
+
#endif /* NLD_SYSTEM_H_ */
diff --git a/src/lib/netlist/devices/nld_tristate.cpp b/src/lib/netlist/devices/nld_tristate.cpp
index db21468685e..b724a09bf9c 100644
--- a/src/lib/netlist/devices/nld_tristate.cpp
+++ b/src/lib/netlist/devices/nld_tristate.cpp
@@ -6,6 +6,7 @@
*/
#include "nld_tristate.h"
+#include "nl_base.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nlid_cmos.h b/src/lib/netlist/devices/nlid_cmos.h
index 4770eac2164..2d836ef656d 100644
--- a/src/lib/netlist/devices/nlid_cmos.h
+++ b/src/lib/netlist/devices/nlid_cmos.h
@@ -8,6 +8,7 @@
#ifndef NLID_CMOS_H_
#define NLID_CMOS_H_
+#include "nl_setup.h"
#include "nl_base.h"
namespace netlist
diff --git a/src/lib/netlist/devices/nlid_proxy.cpp b/src/lib/netlist/devices/nlid_proxy.cpp
index 0b08327070c..4b18ca0bbb2 100644
--- a/src/lib/netlist/devices/nlid_proxy.cpp
+++ b/src/lib/netlist/devices/nlid_proxy.cpp
@@ -5,7 +5,6 @@
*
*/
-//#include <memory>
#include "nlid_proxy.h"
#include "solver/nld_solver.h"
//#include "plib/pstream.h"
@@ -100,7 +99,7 @@ namespace netlist
, m_last_state(*this, "m_last_var", -1)
, m_is_timestep(false)
{
- const char *power_syms[3][2] ={ {"VCC", "VEE"}, {"VCC", "GND"}, {"VDD", "VSS"}};
+ const pstring power_syms[3][2] ={ {"VCC", "VEE"}, {"VCC", "GND"}, {"VDD", "VSS"}};
//register_sub(m_RV);
//register_term("1", m_RV.m_P);
//register_term("2", m_RV.m_N);
@@ -112,8 +111,10 @@ namespace netlist
for (int i = 0; i < 3; i++)
{
pstring devname = out_proxied->device().name();
- auto tp = netlist().setup().find_terminal(devname + "." + power_syms[i][0], detail::device_object_t::type_t::INPUT, false);
- auto tn = netlist().setup().find_terminal(devname + "." + power_syms[i][1], detail::device_object_t::type_t::INPUT, false);
+ auto tp = netlist().setup().find_terminal(devname + "." + power_syms[i][0],
+ detail::terminal_type::INPUT, false);
+ auto tn = netlist().setup().find_terminal(devname + "." + power_syms[i][1],
+ detail::terminal_type::INPUT, false);
if (tp != nullptr && tn != nullptr)
{
/* alternative logic */
@@ -121,12 +122,12 @@ namespace netlist
}
}
if (!f)
- netlist().log().warning("D/A Proxy: Found no valid combination of power terminals on device {1}", out_proxied->device().name());
+ log().warning(MW_1_NO_POWER_TERMINALS_ON_DEVICE_1, out_proxied->device().name());
else
- netlist().log().warning("D/A Proxy: Found power terminals on device {1}", out_proxied->device().name());
+ log().verbose("D/A Proxy: Found power terminals on device {1}", out_proxied->device().name());
#if (0)
printf("%s %s\n", out_proxied->name().c_str(), out_proxied->device().name().c_str());
- auto x = netlist().setup().find_terminal(out_proxied->name(), detail::device_object_t::type_t::OUTPUT, false);
+ auto x = netlist().setup().find_terminal(out_proxied->name(), detail::device_object_t::terminal_type::OUTPUT, false);
if (x) printf("==> %s\n", x->name().c_str());
#endif
}
diff --git a/src/lib/netlist/devices/nlid_proxy.h b/src/lib/netlist/devices/nlid_proxy.h
index 77a8d52026c..178faae20fd 100644
--- a/src/lib/netlist/devices/nlid_proxy.h
+++ b/src/lib/netlist/devices/nlid_proxy.h
@@ -11,12 +11,8 @@
#ifndef NLID_PROXY_H_
#define NLID_PROXY_H_
-#include <vector>
-
#include "nl_setup.h"
-#include "nl_base.h"
-#include "nl_factory.h"
-#include "analog/nld_twoterm.h"
+#include "analog/nlid_twoterm.h"
namespace netlist
{
@@ -127,7 +123,7 @@ namespace netlist
analog::NETLIB_SUB(twoterm) m_RV;
state_var<int> m_last_state;
bool m_is_timestep;
- };
+};
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h
index 8d2cd8162f8..e9baa4c159d 100644
--- a/src/lib/netlist/devices/nlid_system.h
+++ b/src/lib/netlist/devices/nlid_system.h
@@ -11,12 +11,10 @@
#ifndef NLID_SYSTEM_H_
#define NLID_SYSTEM_H_
-#include <vector>
-
-#include "nl_setup.h"
#include "nl_base.h"
-#include "nl_factory.h"
-#include "analog/nld_twoterm.h"
+#include "nl_setup.h"
+#include "analog/nlid_twoterm.h"
+#include "plib/putil.h"
namespace netlist
{
@@ -126,7 +124,7 @@ namespace netlist
connect(m_feedback, m_Q);
{
netlist_time base = netlist_time::from_double(1.0 / (m_freq()*2.0));
- plib::pstring_vector_t pat(m_pattern(),",");
+ std::vector<pstring> pat(plib::psplit(m_pattern(),","));
m_off = netlist_time::from_double(m_offset());
unsigned long pati[256];
@@ -175,7 +173,7 @@ namespace netlist
/* make sure we get the family first */
, m_FAMILY(*this, "FAMILY", "FAMILY(TYPE=TTL)")
{
- set_logic_family(netlist().family_from_model(m_FAMILY()));
+ set_logic_family(setup().family_from_model(m_FAMILY()));
}
NETLIB_UPDATE_AFTER_PARAM_CHANGE()
@@ -309,9 +307,15 @@ namespace netlist
, m_func(*this, "FUNC", "")
, m_Q(*this, "Q")
{
+ std::vector<pstring> inps;
for (int i=0; i < m_N(); i++)
- m_I.push_back(plib::make_unique<analog_input_t>(*this, plib::pfmt("A{1}")(i)));
- compile();
+ {
+ pstring n = plib::pfmt("A{1}")(i);
+ m_I.push_back(plib::make_unique<analog_input_t>(*this, n));
+ inps.push_back(n);
+ m_vals.push_back(0.0);
+ }
+ m_precompiled.compile(inps, m_func());
}
protected:
@@ -321,32 +325,13 @@ namespace netlist
private:
- enum rpn_cmd
- {
- ADD,
- MULT,
- SUB,
- DIV,
- POW,
- PUSH_CONST,
- PUSH_INPUT
- };
-
- struct rpn_inst
- {
- rpn_inst() : m_cmd(ADD), m_param(0.0) { }
- rpn_cmd m_cmd;
- nl_double m_param;
- };
-
- void compile();
-
param_int_t m_N;
param_str_t m_func;
analog_output_t m_Q;
std::vector<std::unique_ptr<analog_input_t>> m_I;
- std::vector<rpn_inst> m_precompiled;
+ std::vector<double> m_vals;
+ plib::pfunction m_precompiled;
};
// -----------------------------------------------------------------------------
diff --git a/src/lib/netlist/devices/nld_truthtable.cpp b/src/lib/netlist/devices/nlid_truthtable.cpp
index 9030f6b8801..824061fdc30 100644
--- a/src/lib/netlist/devices/nld_truthtable.cpp
+++ b/src/lib/netlist/devices/nlid_truthtable.cpp
@@ -5,9 +5,10 @@
*
*/
-#include "nld_truthtable.h"
+#include "nlid_truthtable.h"
#include "plib/plists.h"
#include "nl_setup.h"
+#include "plib/palloc.h"
namespace netlist
{
@@ -16,11 +17,10 @@ namespace netlist
template<unsigned m_NI, unsigned m_NO>
class netlist_factory_truthtable_t : public netlist_base_factory_truthtable_t
{
- P_PREVENT_COPYING(netlist_factory_truthtable_t)
public:
netlist_factory_truthtable_t(const pstring &name, const pstring &classname,
- const pstring &def_param)
- : netlist_base_factory_truthtable_t(name, classname, def_param)
+ const pstring &def_param, const pstring &sourcefile)
+ : netlist_base_factory_truthtable_t(name, classname, def_param, sourcefile)
{ }
plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) override
@@ -120,7 +120,7 @@ uint_least64_t truthtable_desc_t::get_ignored_extended(uint_least64_t state)
// desc
// ----------------------------------------------------------------------------------------
-void truthtable_desc_t::help(unsigned cur, plib::pstring_vector_t list,
+void truthtable_desc_t::help(unsigned cur, std::vector<pstring> list,
uint_least64_t state, uint_least64_t val, std::vector<uint_least8_t> &timing_index)
{
pstring elem = list[cur].trim();
@@ -165,7 +165,7 @@ void truthtable_desc_t::help(unsigned cur, plib::pstring_vector_t list,
}
}
-void truthtable_desc_t::setup(const plib::pstring_vector_t &truthtable, uint_least64_t disabled_ignore)
+void truthtable_desc_t::setup(const std::vector<pstring> &truthtable, uint_least64_t disabled_ignore)
{
unsigned line = 0;
@@ -185,14 +185,14 @@ void truthtable_desc_t::setup(const plib::pstring_vector_t &truthtable, uint_lea
while (!ttline.equals(""))
{
- plib::pstring_vector_t io(ttline,"|");
+ std::vector<pstring> io(plib::psplit(ttline,"|"));
// checks
nl_assert_always(io.size() == 3, "io.count mismatch");
- plib::pstring_vector_t inout(io[0], ",");
+ std::vector<pstring> inout(plib::psplit(io[0], ","));
nl_assert_always(inout.size() == m_num_bits, "number of bits not matching");
- plib::pstring_vector_t out(io[1], ",");
+ std::vector<pstring> out(plib::psplit(io[1], ","));
nl_assert_always(out.size() == m_NO, "output count not matching");
- plib::pstring_vector_t times(io[2], ",");
+ std::vector<pstring> times(plib::psplit(io[2], ","));
nl_assert_always(times.size() == m_NO, "timing count not matching");
uint_least64_t val = 0;
@@ -260,8 +260,8 @@ void truthtable_desc_t::setup(const plib::pstring_vector_t &truthtable, uint_lea
}
netlist_base_factory_truthtable_t::netlist_base_factory_truthtable_t(const pstring &name, const pstring &classname,
- const pstring &def_param)
-: factory::element_t(name, classname, def_param), m_family(family_TTL())
+ const pstring &def_param, const pstring &sourcefile)
+: factory::element_t(name, classname, def_param, sourcefile), m_family(family_TTL())
{
}
@@ -270,35 +270,36 @@ netlist_base_factory_truthtable_t::~netlist_base_factory_truthtable_t()
}
-#define ENTRYY(n, m) case (n * 100 + m): \
+#define ENTRYY(n, m, s) case (n * 100 + m): \
{ using xtype = netlist_factory_truthtable_t<n, m>; \
- ret = new xtype(desc.name, desc.classname, desc.def_param); } break
+ ret = plib::palloc<xtype>(desc.name, desc.classname, desc.def_param, s); } break
-#define ENTRY(n) ENTRYY(n, 1); ENTRYY(n, 2); ENTRYY(n, 3); ENTRYY(n, 4); ENTRYY(n, 5); ENTRYY(n, 6)
+#define ENTRY(n, s) ENTRYY(n, 1, s); ENTRYY(n, 2, s); ENTRYY(n, 3, s); \
+ ENTRYY(n, 4, s); ENTRYY(n, 5, s); ENTRYY(n, 6, s)
-void tt_factory_create(setup_t &setup, tt_desc &desc)
+void tt_factory_create(setup_t &setup, tt_desc &desc, const pstring &sourcefile)
{
netlist_base_factory_truthtable_t *ret;
switch (desc.ni * 100 + desc.no)
{
- ENTRY(1);
- ENTRY(2);
- ENTRY(3);
- ENTRY(4);
- ENTRY(5);
- ENTRY(6);
- ENTRY(7);
- ENTRY(8);
- ENTRY(9);
- ENTRY(10);
+ ENTRY(1, sourcefile);
+ ENTRY(2, sourcefile);
+ ENTRY(3, sourcefile);
+ ENTRY(4, sourcefile);
+ ENTRY(5, sourcefile);
+ ENTRY(6, sourcefile);
+ ENTRY(7, sourcefile);
+ ENTRY(8, sourcefile);
+ ENTRY(9, sourcefile);
+ ENTRY(10, sourcefile);
default:
pstring msg = plib::pfmt("unable to create truthtable<{1},{2}>")(desc.ni)(desc.no);
nl_assert_always(false, msg);
}
ret->m_desc = desc.desc;
if (desc.family != "")
- ret->m_family = setup.netlist().family_from_model(desc.family);
+ ret->m_family = setup.family_from_model(desc.family);
setup.factory().register_device(std::unique_ptr<netlist_base_factory_truthtable_t>(ret));
}
diff --git a/src/lib/netlist/devices/nld_truthtable.h b/src/lib/netlist/devices/nlid_truthtable.h
index 990afc45dd7..68c3d680e40 100644
--- a/src/lib/netlist/devices/nld_truthtable.h
+++ b/src/lib/netlist/devices/nlid_truthtable.h
@@ -7,15 +7,12 @@
* Author: andre
*/
-#ifndef NLD_TRUTHTABLE_H_
-#define NLD_TRUTHTABLE_H_
-
-#include <new>
-#include <cstdint>
+#ifndef NLID_TRUTHTABLE_H_
+#define NLID_TRUTHTABLE_H_
#include "nl_setup.h"
-#include "nl_factory.h"
-#include "plib/plists.h"
+#include "nl_base.h"
+#include "plib/putil.h"
#define NETLIB_TRUTHTABLE(cname, nIN, nOUT) \
class NETLIB_NAME(cname) : public nld_truthtable_t<nIN, nOUT> \
@@ -26,7 +23,7 @@
: nld_truthtable_t<nIN, nOUT>(owner, name, family_TTL(), &m_ttbl, m_desc) { } \
private: \
static truthtable_t m_ttbl; \
- static const char *m_desc[]; \
+ static const pstring m_desc[]; \
}
@@ -112,10 +109,10 @@ namespace netlist
{
}
- void setup(const plib::pstring_vector_t &desc, uint_least64_t disabled_ignore);
+ void setup(const std::vector<pstring> &desc, uint_least64_t disabled_ignore);
private:
- void help(unsigned cur, plib::pstring_vector_t list,
+ void help(unsigned cur, std::vector<pstring> list,
uint_least64_t state, uint_least64_t val, std::vector<uint_least8_t> &timing_index);
static unsigned count_bits(uint_least64_t v);
static uint_least64_t set_bits(uint_least64_t v, uint_least64_t b);
@@ -159,14 +156,14 @@ namespace netlist
template <class C>
nld_truthtable_t(C &owner, const pstring &name, const logic_family_desc_t *fam,
- truthtable_t *ttp, const char *desc[])
+ truthtable_t *ttp, const pstring *desc)
: device_t(owner, name)
, m_fam(*this, fam)
, m_ign(*this, "m_ign", 0)
, m_active(*this, "m_active", 1)
, m_ttp(ttp)
{
- while (*desc != nullptr && **desc != 0 )
+ while (*desc != "" )
{
m_desc.push_back(*desc);
desc++;
@@ -176,7 +173,7 @@ namespace netlist
template <class C>
nld_truthtable_t(C &owner, const pstring &name, const logic_family_desc_t *fam,
- truthtable_t *ttp, const plib::pstring_vector_t &desc)
+ truthtable_t *ttp, const std::vector<pstring> &desc)
: device_t(owner, name)
, m_fam(*this, fam)
, m_ign(*this, "m_ign", 0)
@@ -193,12 +190,12 @@ namespace netlist
pstring header = m_desc[0];
- plib::pstring_vector_t io(header,"|");
+ std::vector<pstring> io(plib::psplit(header,"|"));
// checks
nl_assert_always(io.size() == 2, "too many '|'");
- plib::pstring_vector_t inout(io[0], ",");
+ std::vector<pstring> inout(plib::psplit(io[0], ","));
nl_assert_always(inout.size() == m_num_bits, "bitcount wrong");
- plib::pstring_vector_t out(io[1], ",");
+ std::vector<pstring> out(plib::psplit(io[1], ","));
nl_assert_always(out.size() == m_NO, "output count wrong");
for (std::size_t i=0; i < m_NI; i++)
@@ -363,27 +360,26 @@ namespace netlist
state_var_u32 m_ign;
state_var_s32 m_active;
truthtable_t * m_ttp;
- plib::pstring_vector_t m_desc;
+ std::vector<pstring> m_desc;
};
class netlist_base_factory_truthtable_t : public factory::element_t
{
- P_PREVENT_COPYING(netlist_base_factory_truthtable_t)
public:
netlist_base_factory_truthtable_t(const pstring &name, const pstring &classname,
- const pstring &def_param);
+ const pstring &def_param, const pstring &sourcefile);
virtual ~netlist_base_factory_truthtable_t();
- plib::pstring_vector_t m_desc;
+ std::vector<pstring> m_desc;
const logic_family_desc_t *m_family;
};
- void tt_factory_create(setup_t &setup, tt_desc &desc);
+ void tt_factory_create(setup_t &setup, tt_desc &desc, const pstring &sourcefile);
} //namespace devices
} // namespace netlist
-#endif /* NLD_TRUTHTABLE_H_ */
+#endif /* NLID_TRUTHTABLE_H_ */
diff --git a/src/lib/netlist/documentation/mainpage.dox.h b/src/lib/netlist/documentation/mainpage.dox.h
index 75df1a18065..744abe642e6 100644
--- a/src/lib/netlist/documentation/mainpage.dox.h
+++ b/src/lib/netlist/documentation/mainpage.dox.h
@@ -161,5 +161,4 @@ equation solver.
The formal representation of the circuit will stay the same, thus scales.
-
*/
diff --git a/src/lib/netlist/macro/nlm_cd4xxx.cpp b/src/lib/netlist/macro/nlm_cd4xxx.cpp
index 469ff13b954..ed805cb52dc 100644
--- a/src/lib/netlist/macro/nlm_cd4xxx.cpp
+++ b/src/lib/netlist/macro/nlm_cd4xxx.cpp
@@ -2,7 +2,6 @@
// copyright-holders:Couriersud
#include "nlm_cd4xxx.h"
-#include "devices/nld_truthtable.h"
#include "devices/nld_system.h"
#include "devices/nld_4020.h"
#include "devices/nld_4066.h"
diff --git a/src/lib/netlist/macro/nlm_cd4xxx.h b/src/lib/netlist/macro/nlm_cd4xxx.h
index de10ff7a64d..446c2d6e435 100644
--- a/src/lib/netlist/macro/nlm_cd4xxx.h
+++ b/src/lib/netlist/macro/nlm_cd4xxx.h
@@ -22,6 +22,8 @@
* Netlist Macros
* ---------------------------------------------------------------------------*/
+#ifndef NL_AUTO_DEVICES
+
#define CD4001_NOR(name) \
NET_REGISTER_DEV(CD4001_NOR, name)
@@ -44,6 +46,7 @@
#define CD4316_DIP(name) \
NET_REGISTER_DEV(CD4016_DIP, name)
+#endif
/* ----------------------------------------------------------------------------
* External declarations
* ---------------------------------------------------------------------------*/
diff --git a/src/lib/netlist/macro/nlm_opamp.cpp b/src/lib/netlist/macro/nlm_opamp.cpp
index 146f95b72b4..f363c88a100 100644
--- a/src/lib/netlist/macro/nlm_opamp.cpp
+++ b/src/lib/netlist/macro/nlm_opamp.cpp
@@ -1,9 +1,7 @@
// license:GPL-2.0+
// copyright-holders:Couriersud
#include "nlm_opamp.h"
-
-#include "analog/nld_opamps.h"
-#include "devices/nld_system.h"
+#include "devices/net_lib.h"
/*
* Generic layout with 4 opamps, VCC on pin 4 and GND on pin 11
diff --git a/src/lib/netlist/macro/nlm_opamp.h b/src/lib/netlist/macro/nlm_opamp.h
index 6e3c1f615e7..ec717fdb2dc 100644
--- a/src/lib/netlist/macro/nlm_opamp.h
+++ b/src/lib/netlist/macro/nlm_opamp.h
@@ -11,6 +11,8 @@
* Netlist Macros
* ---------------------------------------------------------------------------*/
+#ifndef NL_AUTO_DEVICES
+
#define MB3614_DIP(name) \
NET_REGISTER_DEV(MB3614_DIP, name)
@@ -23,6 +25,8 @@
#define LM3900(name) \
NET_REGISTER_DEV(LM3900, name)
+#endif
+
/* ----------------------------------------------------------------------------
* External declarations
* ---------------------------------------------------------------------------*/
diff --git a/src/lib/netlist/macro/nlm_other.cpp b/src/lib/netlist/macro/nlm_other.cpp
index 84a3af4dc04..49f4404427a 100644
--- a/src/lib/netlist/macro/nlm_other.cpp
+++ b/src/lib/netlist/macro/nlm_other.cpp
@@ -2,7 +2,6 @@
// copyright-holders:Couriersud
#include "nlm_other.h"
-#include "devices/nld_truthtable.h"
#include "devices/nld_system.h"
/*
diff --git a/src/lib/netlist/macro/nlm_other.h b/src/lib/netlist/macro/nlm_other.h
index bb73d0105d2..f0e8ca05af0 100644
--- a/src/lib/netlist/macro/nlm_other.h
+++ b/src/lib/netlist/macro/nlm_other.h
@@ -11,12 +11,15 @@
* Netlist Macros
* ---------------------------------------------------------------------------*/
+#ifndef NL_AUTO_DEVICES
+
#define MC14584B_GATE(name) \
NET_REGISTER_DEV(MC14584B_GATE, name)
#define MC14584B_DIP(name) \
NET_REGISTER_DEV(MC14584B_DIP, name)
+#endif
/* ----------------------------------------------------------------------------
* External declarations
diff --git a/src/lib/netlist/macro/nlm_ttl74xx.cpp b/src/lib/netlist/macro/nlm_ttl74xx.cpp
index c66314366d2..c8fe9912911 100644
--- a/src/lib/netlist/macro/nlm_ttl74xx.cpp
+++ b/src/lib/netlist/macro/nlm_ttl74xx.cpp
@@ -2,7 +2,6 @@
// copyright-holders:Couriersud
#include "nlm_ttl74xx.h"
-#include "devices/nld_truthtable.h"
#include "devices/nld_system.h"
@@ -377,7 +376,7 @@ static NETLIST_START(TTL_7427_DIP)
s2.C, /* C2 |5 10| B3 */ s3.B,
s2.Q, /* Y2 |6 9| A3 */ s3.A,
GND.I, /* GND |7 8| Y3 */ s3.Q
- /* +--------------+ */
+ /* +--------------+ */
)
NETLIST_END()
@@ -413,11 +412,11 @@ static NETLIST_START(TTL_7430_DIP)
s1.A, /* A |1 ++ 14| VCC */ VCC.I,
s1.B, /* B |2 13| NC */ NC.I,
s1.C, /* C |3 12| H */ s1.H,
- s1.D, /* D |4 7420 11| G */ s1.G,
+ s1.D, /* D |4 7430 11| G */ s1.G,
s1.E, /* E |5 10| NC */ NC.I,
s1.F, /* F |6 9| NC */ NC.I,
GND.I, /* GND |7 8| Y */ s1.Q
- /* +--------------+ */
+ /* +--------------+ */
)
NETLIST_END()
diff --git a/src/lib/netlist/macro/nlm_ttl74xx.h b/src/lib/netlist/macro/nlm_ttl74xx.h
index 44b3db63bd3..526fbf395da 100644
--- a/src/lib/netlist/macro/nlm_ttl74xx.h
+++ b/src/lib/netlist/macro/nlm_ttl74xx.h
@@ -11,6 +11,8 @@
* Netlist Macros
* ---------------------------------------------------------------------------*/
+#ifndef NL_AUTO_DEVICES
+
#define TTL_7400_GATE(name) \
NET_REGISTER_DEV(TTL_7400_GATE, name)
@@ -200,6 +202,8 @@
#define TTL_74260_DIP(name) \
NET_REGISTER_DEV(TTL_74260_DIP, name)
+#endif
+
/* ----------------------------------------------------------------------------
* External declarations
* ---------------------------------------------------------------------------*/
diff --git a/src/lib/netlist/netlist_types.h b/src/lib/netlist/netlist_types.h
new file mode 100644
index 00000000000..c7c4aef4750
--- /dev/null
+++ b/src/lib/netlist/netlist_types.h
@@ -0,0 +1,54 @@
+// license:GPL-2.0+
+// copyright-holders:Couriersud
+/*!
+ *
+ * \file netlist_types.h
+ *
+ */
+
+#ifndef NETLIST_TYPES_H_
+#define NETLIST_TYPES_H_
+
+#include <cstdint>
+#include <unordered_map>
+
+#include "nl_config.h"
+#include "plib/pchrono.h"
+#include "plib/pstring.h"
+
+namespace netlist
+{
+ //============================================================
+ // Performance tracking
+ //============================================================
+
+#if NL_KEEP_STATISTICS
+ using nperftime_t = plib::chrono::timer<plib::chrono::exact_ticks, true>;
+ using nperfcount_t = plib::chrono::counter<true>;
+#else
+ using nperftime_t = plib::chrono::timer<plib::chrono::exact_ticks, false>;
+ using nperfcount_t = plib::chrono::counter<false>;
+#endif
+
+ //============================================================
+ // Types needed by various includes
+ //============================================================
+
+ namespace detail {
+
+ /*! Enum specifying the type of object */
+ enum terminal_type {
+ TERMINAL = 0, /*!< object is an analog terminal */
+ INPUT = 1, /*!< object is an input */
+ OUTPUT = 2, /*!< object is an output */
+ };
+
+ /*! Type of the model map used.
+ * This is used to hold all #Models in an unordered map
+ */
+ using model_map_t = std::unordered_map<pstring, pstring>;
+
+ }
+}
+
+#endif /* NETLIST_TYPES_H_ */
diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp
index 80acf9847a3..4374ef2212d 100644
--- a/src/lib/netlist/nl_base.cpp
+++ b/src/lib/netlist/nl_base.cpp
@@ -6,6 +6,7 @@
*/
#include <cstring>
+#include <cmath>
#include "solver/nld_matrix_solver.h"
#include "solver/nld_solver.h"
@@ -25,7 +26,7 @@ namespace netlist
namespace detail
{
#if (USE_MEMPOOL)
-static plib::mempool pool(65536, 8);
+static plib::mempool pool(6553600, 64);
void * object_t::operator new (size_t size)
{
@@ -135,24 +136,6 @@ const logic_family_desc_t *family_CD4XXX()
return &obj;
}
-class logic_family_std_proxy_t : public logic_family_desc_t
-{
-public:
- logic_family_std_proxy_t() { }
- virtual plib::owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_t &anetlist,
- const pstring &name, logic_output_t *proxied) const override;
- virtual plib::owned_ptr<devices::nld_base_a_to_d_proxy> create_a_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *proxied) const override;
-};
-
-plib::owned_ptr<devices::nld_base_d_to_a_proxy> logic_family_std_proxy_t::create_d_a_proxy(netlist_t &anetlist,
- const pstring &name, logic_output_t *proxied) const
-{
- return plib::owned_ptr<devices::nld_base_d_to_a_proxy>::Create<devices::nld_d_to_a_proxy>(anetlist, name, proxied);
-}
-plib::owned_ptr<devices::nld_base_a_to_d_proxy> logic_family_std_proxy_t::create_a_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *proxied) const
-{
- return plib::owned_ptr<devices::nld_base_a_to_d_proxy>::Create<devices::nld_a_to_d_proxy>(anetlist, name, proxied);
-}
// ----------------------------------------------------------------------------------------
// queue_t
@@ -199,10 +182,10 @@ void detail::queue_t::on_post_load()
netlist().log().debug("current time {1} qsize {2}\n", netlist().time().as_double(), m_qsize);
for (std::size_t i = 0; i < m_qsize; i++ )
{
- detail::net_t *n = netlist().find_net(m_names[i].m_buf);
+ detail::net_t *n = netlist().find_net(pstring(m_names[i].m_buf, pstring::UTF8));
//log().debug("Got {1} ==> {2}\n", qtemp[i].m_name, n));
//log().debug("schedule time {1} ({2})\n", n->time().as_double(), netlist_time::from_raw(m_times[i]).as_double()));
- this->push(n, netlist_time::from_raw(m_times[i]));
+ this->push(queue_t::entry_t(netlist_time::from_raw(m_times[i]),n));
}
}
@@ -234,24 +217,22 @@ detail::device_object_t::device_object_t(core_device_t &dev, const pstring &anam
{
}
-detail::device_object_t::type_t detail::device_object_t::type() const
+detail::terminal_type detail::core_terminal_t::type() const
{
if (dynamic_cast<const terminal_t *>(this) != nullptr)
- return type_t::TERMINAL;
- else if (dynamic_cast<const param_t *>(this) != nullptr)
- return param_t::PARAM;
+ return terminal_type::TERMINAL;
else if (dynamic_cast<const logic_input_t *>(this) != nullptr)
- return param_t::INPUT;
+ return terminal_type::INPUT;
else if (dynamic_cast<const logic_output_t *>(this) != nullptr)
- return param_t::OUTPUT;
+ return terminal_type::OUTPUT;
else if (dynamic_cast<const analog_input_t *>(this) != nullptr)
- return param_t::INPUT;
+ return terminal_type::INPUT;
else if (dynamic_cast<const analog_output_t *>(this) != nullptr)
- return param_t::OUTPUT;
+ return terminal_type::OUTPUT;
else
{
netlist().log().fatal(MF_1_UNKNOWN_TYPE_FOR_OBJECT, name());
- return type_t::TERMINAL; // please compiler
+ return terminal_type::TERMINAL; // please compiler
}
}
@@ -272,19 +253,16 @@ netlist_t::netlist_t(const pstring &aname)
{
state().save_item(this, static_cast<plib::state_manager_t::callback_t &>(m_queue), "m_queue");
state().save_item(this, m_time, "m_time");
- m_setup = new setup_t(*this);
+ m_setup = plib::make_unique<setup_t>(*this);
/* FIXME: doesn't really belong here */
NETLIST_NAME(base)(*m_setup);
}
netlist_t::~netlist_t()
{
- if (m_setup != nullptr)
- delete m_setup;
m_nets.clear();
m_devices.clear();
- pfree(m_lib);
pstring::resetmem();
}
@@ -303,48 +281,18 @@ void netlist_t::register_dev(plib::owned_ptr<core_device_t> dev)
void netlist_t::remove_dev(core_device_t *dev)
{
- m_devices.erase(
- std::remove_if(
- m_devices.begin(),
+ m_devices.erase(
+ std::remove_if(
+ m_devices.begin(),
m_devices.end(),
- [&] (plib::owned_ptr<core_device_t> const& p)
- {
- return p.get() == dev;
- }),
+ [&] (plib::owned_ptr<core_device_t> const& p)
+ {
+ return p.get() == dev;
+ }),
m_devices.end()
- );
+ );
}
-const logic_family_desc_t *netlist_t::family_from_model(const pstring &model)
-{
- model_map_t map;
- setup().model_parse(model, map);
-
- if (setup().model_value_str(map, "TYPE") == "TTL")
- return family_TTL();
- if (setup().model_value_str(map, "TYPE") == "CD4XXX")
- return family_CD4XXX();
-
- for (auto & e : m_family_cache)
- if (e.first == model)
- return e.second.get();
-
- auto ret = plib::make_unique_base<logic_family_desc_t, logic_family_std_proxy_t>();
-
- ret->m_fixed_V = setup().model_value(map, "FV");
- ret->m_low_thresh_PCNT = setup().model_value(map, "IVL");
- ret->m_high_thresh_PCNT = setup().model_value(map, "IVH");
- ret->m_low_VO = setup().model_value(map, "OVL");
- ret->m_high_VO = setup().model_value(map, "OVH");
- ret->m_R_low = setup().model_value(map, "ORL");
- ret->m_R_high = setup().model_value(map, "ORH");
-
- auto retp = ret.get();
-
- m_family_cache.emplace_back(model, std::move(ret));
-
- return retp;
-}
void netlist_t::start()
@@ -372,6 +320,7 @@ void netlist_t::start()
/* create devices */
+ log().debug("Creating devices ...\n");
for (auto & e : setup().m_device_factory)
{
if ( !setup().factory().is_class<devices::NETLIB_NAME(solver)>(e.second)
@@ -394,9 +343,12 @@ void netlist_t::start()
auto p = setup().m_param_values.find(d->name() + ".HINT_NO_DEACTIVATE");
if (p != setup().m_param_values.end())
{
- //FIXME: Error checking
- auto v = p->second.as_long();
- d->set_hint_deactivate(!v);
+ //FIXME: turn this into a proper function
+ bool error;
+ auto v = p->second.as_double(&error);
+ if (error || std::abs(v - std::floor(v)) > 1e-6 )
+ log().fatal(MF_1_HND_VAL_NOT_SUPPORTED, p->second);
+ d->set_hint_deactivate(v == 0.0);
}
}
else
@@ -404,11 +356,30 @@ void netlist_t::start()
}
pstring libpath = plib::util::environment("NL_BOOSTLIB", plib::util::buildpath({".", "nlboost.so"}));
- m_lib = plib::palloc<plib::dynlib>(libpath);
+ m_lib = plib::make_unique<plib::dynlib>(libpath);
/* resolve inputs */
setup().resolve_inputs();
+ /* Make sure devices are fully created - now done in register_dev */
+
+ log().debug("Setting delegate pointers ...\n");
+ for (auto &dev : m_devices)
+ dev->set_delegate_pointer();
+
+ log().verbose("looking for two terms connected to rail nets ...");
+ for (auto & t : get_device_list<analog::NETLIB_NAME(twoterm)>())
+ {
+ if (t->m_N.net().isRailNet() && t->m_P.net().isRailNet())
+ {
+ log().warning(MW_3_REMOVE_DEVICE_1_CONNECTED_ONLY_TO_RAILS_2_3,
+ t->name(), t->m_N.net().name(), t->m_P.net().name());
+ t->m_N.net().remove_terminal(t->m_N);
+ t->m_P.net().remove_terminal(t->m_P);
+ remove_dev(t);
+ }
+ }
+
log().verbose("initialize solver ...\n");
if (m_solver == nullptr)
@@ -420,12 +391,6 @@ void netlist_t::start()
else
m_solver->post_start();
- /* finally, set the pointers */
-
- log().debug("Setting delegate pointers ...\n");
- for (auto &dev : m_devices)
- dev->set_delegate_pointer();
-
}
void netlist_t::stop()
@@ -433,7 +398,8 @@ void netlist_t::stop()
log().debug("Printing statistics ...\n");
print_stats();
log().debug("Stopping solver device ...\n");
- m_solver->stop();
+ if (m_solver != nullptr)
+ m_solver->stop();
}
detail::net_t *netlist_t::find_net(const pstring &name)
@@ -474,16 +440,16 @@ void netlist_t::reset()
dev->update_param();
// Step all devices once !
+ /*
+ * INFO: The order here affects power up of e.g. breakout. However, such
+ * variations are explicitly stated in the breakout manual.
+ */
#if 0
for (std::size_t i = 0; i < m_devices.size(); i++)
{
m_devices[i]->update_dev();
}
#else
- /* FIXME: this makes breakout attract mode working again.
- * It is however not acceptable that this depends on the startup order.
- * Best would be, if reset would call update_dev for devices which need it.
- */
std::size_t i = m_devices.size();
while (i>0)
m_devices[--i]->update_dev();
@@ -495,7 +461,7 @@ void netlist_t::process_queue(const netlist_time &delta)
{
netlist_time stop(m_time + delta);
- m_queue.push(nullptr, stop);
+ m_queue.push(detail::queue_t::entry_t(stop, nullptr));
m_stat_mainloop.start();
@@ -522,17 +488,20 @@ void netlist_t::process_queue(const netlist_time &delta)
while (m_queue.top().m_exec_time > mc_time)
{
m_time = mc_time;
- mc_time += inc;
mc_net.toggle_new_Q();
mc_net.update_devs();
+ mc_time += inc;
}
const detail::queue_t::entry_t e(m_queue.pop());
m_time = e.m_exec_time;
- if (e.m_object == nullptr)
+ if (e.m_object != nullptr)
+ {
+ e.m_object->update_devs();
+ m_perf_out_processed.inc();
+ }
+ else
break;
- e.m_object->update_devs();
- m_perf_out_processed.inc();
}
mc_net.set_time(mc_time);
}
@@ -599,6 +568,21 @@ void netlist_t::print_stats() const
}
}
+core_device_t *netlist_t::pget_single_device(const pstring classname, bool (*cc)(core_device_t *))
+{
+ core_device_t *ret = nullptr;
+ for (auto &d : m_devices)
+ {
+ if (cc(d.get()))
+ {
+ if (ret != nullptr)
+ this->log().fatal(MF_1_MORE_THAN_ONE_1_DEVICE_FOUND, classname);
+ else
+ ret = d.get();
+ }
+ }
+ return ret;
+}
// ----------------------------------------------------------------------------------------
@@ -610,7 +594,7 @@ core_device_t::core_device_t(netlist_t &owner, const pstring &name)
, logic_family_t()
, netlist_ref(owner)
, m_hint_deactivate(false)
-#if (NL_PMF_TYPE > NL_PMF_TYPE_VIRTUAL)
+#if (!NL_USE_PMF_VIRTUAL)
, m_static_update()
#endif
{
@@ -623,7 +607,7 @@ core_device_t::core_device_t(core_device_t &owner, const pstring &name)
, logic_family_t()
, netlist_ref(owner.netlist())
, m_hint_deactivate(false)
-#if (NL_PMF_TYPE > NL_PMF_TYPE_VIRTUAL)
+#if (!NL_USE_PMF_VIRTUAL)
, m_static_update()
#endif
{
@@ -639,17 +623,16 @@ core_device_t::~core_device_t()
void core_device_t::set_delegate_pointer()
{
-#if (NL_PMF_TYPE == NL_PMF_TYPE_GNUC_PMF)
- void (core_device_t::* pFunc)() = &core_device_t::update;
- m_static_update = pFunc;
-#elif (NL_PMF_TYPE == NL_PMF_TYPE_GNUC_PMF_CONV)
- void (core_device_t::* pFunc)() = &core_device_t::update;
- m_static_update = reinterpret_cast<net_update_delegate>((this->*pFunc));
-#elif (NL_PMF_TYPE == NL_PMF_TYPE_INTERNAL)
- m_static_update = plib::mfp::get_mfp<net_update_delegate>(&core_device_t::update, this);
+#if (!NL_USE_PMF_VIRTUAL)
+ m_static_update.set_base(&core_device_t::update, this);
#endif
}
+plib::plog_base<NL_DEBUG> &core_device_t::log()
+{
+ return netlist().log();
+}
+
// ----------------------------------------------------------------------------------------
// device_t
// ----------------------------------------------------------------------------------------
@@ -697,7 +680,7 @@ void device_t::connect(const pstring &t1, const pstring &t2)
void device_t::connect_post_start(detail::core_terminal_t &t1, detail::core_terminal_t &t2)
{
if (!setup().connect(t1, t2))
- netlist().log().fatal(MF_2_ERROR_CONNECTING_1_TO_2, t1.name(), t2.name());
+ log().fatal(MF_2_ERROR_CONNECTING_1_TO_2, t1.name(), t2.name());
}
@@ -705,9 +688,9 @@ void device_t::connect_post_start(detail::core_terminal_t &t1, detail::core_term
// family_setter_t
// -----------------------------------------------------------------------------
-detail::family_setter_t::family_setter_t(core_device_t &dev, const char *desc)
+detail::family_setter_t::family_setter_t(core_device_t &dev, const pstring desc)
{
- dev.set_logic_family(dev.netlist().family_from_model(desc));
+ dev.set_logic_family(dev.netlist().setup().family_from_model(desc));
}
detail::family_setter_t::family_setter_t(core_device_t &dev, const logic_family_desc_t *desc)
@@ -719,13 +702,6 @@ detail::family_setter_t::family_setter_t(core_device_t &dev, const logic_family_
// net_t
// ----------------------------------------------------------------------------------------
-// FIXME: move somewhere central
-
-struct do_nothing_deleter{
- template<typename T> void operator()(T*){}
-};
-
-
detail::net_t::net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr)
: object_t(aname)
, netlist_ref(nl)
@@ -734,10 +710,9 @@ detail::net_t::net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr)
, m_time(*this, "m_time", netlist_time::zero())
, m_active(*this, "m_active", 0)
, m_in_queue(*this, "m_in_queue", 2)
- , m_railterminal(nullptr)
, m_cur_Analog(*this, "m_cur_Analog", 0.0)
+ , m_railterminal(mr)
{
- m_railterminal = mr;
}
detail::net_t::~net_t()
@@ -758,7 +733,7 @@ void detail::net_t::inc_active(core_terminal_t &term) NL_NOEXCEPT
if (m_time > netlist().time())
{
m_in_queue = 1; /* pending */
- netlist().queue().push(this, m_time);
+ netlist().queue().push(queue_t::entry_t(m_time, this));
}
else
{
@@ -968,16 +943,20 @@ terminal_t::~terminal_t()
void terminal_t::schedule_solve()
{
- // FIXME: Remove this after we found a way to remove *ALL* twoterms connected to railnets only.
- if (net().solver() != nullptr)
- net().solver()->update_forced();
+ // Nets may belong to railnets which do not have a solver attached
+ // FIXME: Enforce that all terminals get connected?
+ if (this->has_net())
+ if (net().solver() != nullptr)
+ net().solver()->update_forced();
}
void terminal_t::schedule_after(const netlist_time &after)
{
- // FIXME: Remove this after we found a way to remove *ALL* twoterms connected to railnets only.
- if (net().solver() != nullptr)
- net().solver()->update_after(after);
+ // Nets may belong to railnets which do not have a solver attached
+ // FIXME: Enforce that all terminals get connected?
+ if (this->has_net())
+ if (net().solver() != nullptr)
+ net().solver()->update_after(after);
}
// ----------------------------------------------------------------------------------------
@@ -1037,7 +1016,7 @@ analog_output_t::analog_output_t(core_device_t &dev, const pstring &aname)
netlist().m_nets.push_back(plib::owned_ptr<analog_net_t>(&m_my_net, false));
this->set_net(&m_my_net);
- net().m_cur_Analog = NL_FCONST(0.0);
+ //net().m_cur_Analog = NL_FCONST(0.0);
netlist().setup().register_term(*this);
}
@@ -1047,7 +1026,7 @@ analog_output_t::~analog_output_t()
void analog_output_t::initial(const nl_double val)
{
- net().m_cur_Analog = val;
+ net().set_Q_Analog(val);
}
// -----------------------------------------------------------------------------
@@ -1133,11 +1112,11 @@ param_double_t::param_double_t(device_t &device, const pstring name, const doubl
m_param = device.setup().get_initial_param_val(this->name(),val);
netlist().save(*this, m_param, "m_param");
}
-
+#if 0
param_double_t::~param_double_t()
{
}
-
+#endif
param_int_t::param_int_t(device_t &device, const pstring name, const int val)
: param_t(device, name)
{
@@ -1145,9 +1124,11 @@ param_int_t::param_int_t(device_t &device, const pstring name, const int val)
netlist().save(*this, m_param, "m_param");
}
+#if 0
param_int_t::~param_int_t()
{
}
+#endif
param_logic_t::param_logic_t(device_t &device, const pstring name, const bool val)
: param_t(device, name)
@@ -1156,9 +1137,11 @@ param_logic_t::param_logic_t(device_t &device, const pstring name, const bool va
netlist().save(*this, m_param, "m_param");
}
+#if 0
param_logic_t::~param_logic_t()
{
}
+#endif
param_ptr_t::param_ptr_t(device_t &device, const pstring name, uint8_t * val)
: param_t(device, name)
@@ -1167,13 +1150,15 @@ param_ptr_t::param_ptr_t(device_t &device, const pstring name, uint8_t * val)
//netlist().save(*this, m_param, "m_param");
}
+#if 0
param_ptr_t::~param_ptr_t()
{
}
+#endif
void param_model_t::changed()
{
- netlist().log().fatal("Models can not be changed at runtime");
+ netlist().log().fatal(MF_1_MODEL_1_CAN_NOT_BE_CHANGED_AT_RUNTIME, name());
m_map.clear();
}
@@ -1200,8 +1185,6 @@ std::unique_ptr<plib::pistream> param_data_t::stream()
return device().netlist().setup().get_data_stream(Value());
}
-
-
namespace devices
{
// ----------------------------------------------------------------------------------------
diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h
index 171a81292ae..e56a10b9e20 100644
--- a/src/lib/netlist/nl_base.h
+++ b/src/lib/netlist/nl_base.h
@@ -9,27 +9,27 @@
#ifndef NLBASE_H_
#define NLBASE_H_
-#include <vector>
-#include <unordered_map>
-#include <memory>
-//#include <cmath>
-#include <cstdint>
-
#include "nl_lists.h"
#include "nl_time.h"
-#include "plib/palloc.h"
+#include "plib/palloc.h" // owned_ptr
#include "plib/pdynlib.h"
#include "plib/pstate.h"
#include "plib/pfmtlog.h"
#include "plib/pstream.h"
-#include "plib/pexception.h"
+#include "plib/ppmf.h"
+
+#include <unordered_map>
+
+#ifdef NL_PROHIBIT_BASEH_INCLUDE
+#error "nl_base.h included. Please correct."
+#endif
// ----------------------------------------------------------------------------------------
// Type definitions
// ----------------------------------------------------------------------------------------
/*! netlist_sig_t is the type used for logic signals. */
-using netlist_sig_t = std::uint_least32_t;
+using netlist_sig_t = std::uint32_t;
//============================================================
// MACROS / New Syntax
@@ -85,18 +85,26 @@ class NETLIB_NAME(name) : public device_t
: device_t(owner, name)
/*! Add this to a device definition to mark the device as dynamic.
- * If this is added to device definition the device is treated as an analog
- * dynamic device, i.e. #NETLIB_UPDATE_TERMINALSI is called on a each step
- * of the Newton-Raphson step of solving the linear equations.
+ * If NETLIB_IS_DYNAMIC(true) is added to the device definition the device
+ * is treated as an analog dynamic device, i.e. #NETLIB_UPDATE_TERMINALSI
+ * is called on a each step of the Newton-Raphson step
+ * of solving the linear equations.
+ *
+ * You may also use e.g. NETLIB_IS_DYNAMIC(m_func() != "") to only make the
+ * device a dynamic device if parameter m_func is set.
*/
-#define NETLIB_IS_DYNAMIC() \
- public: virtual bool is_dynamic() const override { return true; }
+#define NETLIB_IS_DYNAMIC(expr) \
+ public: virtual bool is_dynamic() const override { return expr; }
/*! Add this to a device definition to mark the device as a time-stepping device.
- *
+ *
* You have to implement NETLIB_TIMESTEP in this case as well. Currently, only
* the capacitor and inductor devices uses this.
*
+ * You may also use e.g. NETLIB_IS_TIMESTEP(m_func() != "") to only make the
+ * device a dynamic device if parameter m_func is set. This is used by the
+ * Voltage Source element.
+ *
* Example:
*
* NETLIB_TIMESTEP_IS_TIMESTEP()
@@ -109,8 +117,8 @@ class NETLIB_NAME(name) : public device_t
* }
*
*/
-#define NETLIB_IS_TIMESTEP() \
- public: virtual bool is_timestep() const override { return true; }
+#define NETLIB_IS_TIMESTEP(expr) \
+ public: virtual bool is_timestep() const override { return expr; }
/*! Used to implement the time stepping code.
*
@@ -220,11 +228,6 @@ namespace netlist
class core_device_t;
class device_t;
- /*! Type of the model map used.
- * This is used to hold all #Models in an unordered map
- */
- using model_map_t = std::unordered_map<pstring, pstring>;
-
/*! Logic families descriptors are used to create proxy devices.
* The logic family describes the analog capabilities of logic devices,
* inputs and outputs.
@@ -248,7 +251,7 @@ namespace netlist
double R_low() const { return m_R_low; }
double R_high() const { return m_R_high; }
- double m_fixed_V; //!< For variable voltage families, specify 0. For TTL this would be 5. */
+ double m_fixed_V; //!< For variable voltage families, specify 0. For TTL this would be 5. */
double m_low_thresh_PCNT; //!< low input threshhold offset. If the input voltage is below this value times supply voltage, a "0" input is signalled
double m_high_thresh_PCNT; //!< high input threshhold offset. If the input voltage is above the value times supply voltage, a "0" input is signalled
double m_low_VO; //!< low output voltage offset. This voltage is output if the ouput is "0"
@@ -273,12 +276,12 @@ namespace netlist
public:
logic_family_t() : m_logic_family(nullptr) {}
- ~logic_family_t() { }
const logic_family_desc_t *logic_family() const { return m_logic_family; }
void set_logic_family(const logic_family_desc_t *fam) { m_logic_family = fam; }
protected:
+ ~logic_family_t() { } // prohibit polymorphic destruction
const logic_family_desc_t *m_logic_family;
};
@@ -313,19 +316,15 @@ namespace netlist
//! Move Constructor.
state_var(state_var &&rhs) NL_NOEXCEPT = default;
//! Assignment operator to assign value of a state var.
- state_var &operator=(state_var rhs) { std::swap(rhs.m_value, this->m_value); return *this; }
+ state_var &operator=(const state_var &rhs) { m_value = rhs; return *this; }
//! Assignment operator to assign value of type T.
- state_var &operator=(const T rhs) { m_value = rhs; return *this; }
+ state_var &operator=(const T &rhs) { m_value = rhs; return *this; }
//! Return value of state variable.
operator T & () { return m_value; }
- //! Return value of state variable.
- T & operator()() { return m_value; }
//! Return const value of state variable.
- operator const T & () const { return m_value; }
- //! Return const value of state variable.
- const T & operator()() const { return m_value; }
+ constexpr operator const T & () const { return m_value; }
T * ptr() { return &m_value; }
- const T * ptr() const { return &m_value; }
+ constexpr T * ptr() const { return &m_value; }
private:
T m_value;
};
@@ -338,13 +337,20 @@ namespace netlist
struct state_var<T[N]>
{
public:
- state_var(device_t &dev, const pstring name, const T & value);
+ //! Constructor.
+ template <typename O>
+ state_var(O &owner, //!< owner must have a netlist() method.
+ const pstring name, //!< identifier/name for this state variable
+ const T &value //!< Initial value after construction
+ );
+ //! Copy Constructor.
state_var(const state_var &rhs) NL_NOEXCEPT = default;
+ //! Move Constructor.
state_var(state_var &&rhs) NL_NOEXCEPT = default;
- state_var &operator=(const state_var rhs) { m_value = rhs.m_value; return *this; }
- state_var &operator=(const T rhs) { m_value = rhs; return *this; }
+ state_var &operator=(const state_var &rhs) { m_value = rhs.m_value; return *this; }
+ state_var &operator=(const T &rhs) { m_value = rhs; return *this; }
T & operator[](const std::size_t i) { return m_value[i]; }
- const T & operator[](const std::size_t i) const { return m_value[i]; }
+ constexpr T & operator[](const std::size_t i) const { return m_value[i]; }
private:
T m_value[N];
};
@@ -376,7 +382,6 @@ namespace netlist
*/
class detail::object_t
{
- P_PREVENT_COPYING(object_t)
public:
/*! Constructor.
@@ -384,7 +389,6 @@ namespace netlist
* Every class derived from the object_t class must have a name.
*/
object_t(const pstring &aname /*!< string containing name of the object */);
- virtual ~object_t();
/*! return name of the object
*
@@ -396,6 +400,8 @@ namespace netlist
void operator delete (void *ptr, void *) { }
void * operator new (size_t size);
void operator delete (void * mem);
+ protected:
+ ~object_t(); // only childs should be destructible
private:
pstring m_name;
@@ -404,11 +410,13 @@ namespace netlist
struct detail::netlist_ref
{
netlist_ref(netlist_t &nl) : m_netlist(nl) { }
- ~netlist_ref() {}
netlist_t & netlist() { return m_netlist; }
const netlist_t & netlist() const { return m_netlist; }
+ protected:
+ ~netlist_ref() {} // prohibit polymorphic destruction
+
private:
netlist_t & m_netlist;
@@ -425,16 +433,7 @@ namespace netlist
*/
class detail::device_object_t : public detail::object_t
{
- P_PREVENT_COPYING(device_object_t)
public:
- /*! Enum specifying the type of object */
- enum type_t {
- TERMINAL = 0, /*!< object is an analog terminal */
- INPUT = 1, /*!< object is an input */
- OUTPUT = 2, /*!< object is an output */
- PARAM = 3, /*!< object is a parameter */
- };
-
/*! Constructor.
*
* \param dev device owning the object.
@@ -446,16 +445,6 @@ namespace netlist
*/
core_device_t &device() const { return m_device; }
- /*! The object type.
- * \returns type of the object
- */
- type_t type() const;
- /*! Checks if object is of specified type.
- * \param atype type to check object against.
- * \returns true if object is of specified type else false.
- */
- bool is_type(const type_t atype) const { return (type() == atype); }
-
/*! The netlist owning the owner of this object.
* \returns reference to netlist object.
*/
@@ -478,7 +467,6 @@ namespace netlist
*/
class detail::core_terminal_t : public device_object_t, public plib::linkedlist_t<core_terminal_t>::element_t
{
- P_PREVENT_COPYING(core_terminal_t)
public:
using list_t = std::vector<core_terminal_t *>;
@@ -495,6 +483,16 @@ namespace netlist
core_terminal_t(core_device_t &dev, const pstring &aname, const state_e state);
virtual ~core_terminal_t();
+ /*! The object type.
+ * \returns type of the object
+ */
+ terminal_type type() const;
+ /*! Checks if object is of specified type.
+ * \param atype type to check object against.
+ * \returns true if object is of specified type else false.
+ */
+ bool is_type(const terminal_type atype) const { return (type() == atype); }
+
void set_net(net_t *anet);
void clear_net();
bool has_net() const { return (m_net != nullptr); }
@@ -540,7 +538,6 @@ namespace netlist
class terminal_t : public analog_t
{
- P_PREVENT_COPYING(terminal_t)
public:
terminal_t(core_device_t &dev, const pstring &aname);
@@ -550,16 +547,12 @@ namespace netlist
void set(const nl_double G)
{
- set_ptr(m_Idr1, 0);
- set_ptr(m_go1, G);
- set_ptr(m_gt1, G);
+ set(G,G, 0.0);
}
void set(const nl_double GO, const nl_double GT)
{
- set_ptr(m_Idr1, 0);
- set_ptr(m_go1, GO);
- set_ptr(m_gt1, GT);
+ set(GO, GT, 0.0);
}
void set(const nl_double GO, const nl_double GT, const nl_double I)
@@ -690,7 +683,6 @@ namespace netlist
public detail::object_t,
public detail::netlist_ref
{
- P_PREVENT_COPYING(net_t)
public:
net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr = nullptr);
@@ -698,12 +690,6 @@ namespace netlist
void reset();
- void add_terminal(core_terminal_t &terminal);
- void remove_terminal(core_terminal_t &terminal);
-
- bool is_logic() const NL_NOEXCEPT;
- bool is_analog() const NL_NOEXCEPT;
-
void toggle_new_Q() { m_new_Q ^= 1; }
void force_queue_execution() { m_new_Q = (m_cur_Q ^ 1); }
@@ -724,6 +710,14 @@ namespace netlist
void inc_active(core_terminal_t &term) NL_NOEXCEPT;
void dec_active(core_terminal_t &term) NL_NOEXCEPT;
+ /* setup stuff */
+
+ void add_terminal(core_terminal_t &terminal);
+ void remove_terminal(core_terminal_t &terminal);
+
+ bool is_logic() const NL_NOEXCEPT;
+ bool is_analog() const NL_NOEXCEPT;
+
void rebuild_list(); /* rebuild m_list after a load */
void move_connections(net_t &dest_net);
@@ -737,26 +731,25 @@ namespace netlist
state_var_s32 m_active;
state_var_u8 m_in_queue; /* 0: not in queue, 1: in queue, 2: last was taken */
+ state_var<nl_double> m_cur_Analog;
+
private:
plib::linkedlist_t<core_terminal_t> m_list_active;
core_terminal_t * m_railterminal;
public:
- // FIXME: Have to fix the public at some time
- state_var<nl_double> m_cur_Analog;
};
class logic_net_t : public detail::net_t
{
- P_PREVENT_COPYING(logic_net_t)
public:
logic_net_t(netlist_t &nl, const pstring &aname, detail::core_terminal_t *mr = nullptr);
virtual ~logic_net_t();
netlist_sig_t Q() const { return m_cur_Q; }
- netlist_sig_t new_Q() const { return m_new_Q; }
+ netlist_sig_t new_Q() const { return m_new_Q; }
void initial(const netlist_sig_t val) { m_cur_Q = m_new_Q = val; }
void set_Q(const netlist_sig_t newQ, const netlist_time delay) NL_NOEXCEPT
@@ -781,7 +774,7 @@ namespace netlist
/* internal state support
* FIXME: get rid of this and implement export/import in MAME
*/
- netlist_sig_t &Q_state_ptr() { return m_cur_Q; }
+ netlist_sig_t *Q_state_ptr() { return m_cur_Q.ptr(); }
protected:
private:
@@ -790,7 +783,6 @@ namespace netlist
class analog_net_t : public detail::net_t
{
- P_PREVENT_COPYING(analog_net_t)
public:
using list_t = std::vector<analog_net_t *>;
@@ -800,7 +792,8 @@ namespace netlist
virtual ~analog_net_t();
nl_double Q_Analog() const { return m_cur_Analog; }
- nl_double &Q_Analog_state_ptr() { return m_cur_Analog; }
+ void set_Q_Analog(const nl_double &v) { m_cur_Analog = v; }
+ nl_double *Q_Analog_state_ptr() { return m_cur_Analog.ptr(); }
//FIXME: needed by current solver code
devices::matrix_solver_t *solver() const { return m_solver; }
@@ -816,7 +809,6 @@ namespace netlist
class logic_output_t : public logic_t
{
- P_PREVENT_COPYING(logic_output_t)
public:
logic_output_t(core_device_t &dev, const pstring &aname);
@@ -835,7 +827,6 @@ namespace netlist
class analog_output_t : public analog_t
{
- P_PREVENT_COPYING(analog_output_t)
public:
analog_output_t(core_device_t &dev, const pstring &aname);
virtual ~analog_output_t();
@@ -854,7 +845,6 @@ namespace netlist
class param_t : public detail::device_object_t
{
- P_PREVENT_COPYING(param_t)
public:
enum param_type_t {
@@ -866,11 +856,12 @@ namespace netlist
};
param_t(device_t &device, const pstring &name);
- virtual ~param_t();
param_type_t param_type() const;
protected:
+ virtual ~param_t(); /* not intended to be destroyed */
+
void update_param();
template<typename C>
@@ -889,7 +880,6 @@ namespace netlist
{
public:
param_ptr_t(device_t &device, const pstring name, std::uint8_t* val);
- virtual ~param_ptr_t();
std::uint8_t * operator()() const { return m_param; }
void setTo(std::uint8_t *param) { set(m_param, param); }
private:
@@ -900,7 +890,6 @@ namespace netlist
{
public:
param_logic_t(device_t &device, const pstring name, const bool val);
- virtual ~param_logic_t();
bool operator()() const { return m_param; }
void setTo(const bool &param) { set(m_param, param); }
private:
@@ -911,7 +900,6 @@ namespace netlist
{
public:
param_int_t(device_t &device, const pstring name, const int val);
- virtual ~param_int_t();
int operator()() const { return m_param; }
void setTo(const int &param) { set(m_param, param); }
private:
@@ -922,7 +910,6 @@ namespace netlist
{
public:
param_double_t(device_t &device, const pstring name, const double val);
- virtual ~param_double_t();
double operator()() const { return m_param; }
void setTo(const double &param) { set(m_param, param); }
private:
@@ -934,6 +921,7 @@ namespace netlist
public:
param_str_t(device_t &device, const pstring name, const pstring val);
virtual ~param_str_t();
+
const pstring operator()() const { return Value(); }
void setTo(const pstring &param)
{
@@ -981,8 +969,8 @@ namespace netlist
private:
/* hide this */
void setTo(const pstring &param) = delete;
- model_map_t m_map;
- };
+ detail::model_map_t m_map;
+};
class param_data_t : public param_str_t
@@ -996,6 +984,28 @@ namespace netlist
};
// -----------------------------------------------------------------------------
+ // rom parameter
+ // -----------------------------------------------------------------------------
+
+ template <typename ST, std::size_t AW, std::size_t DW>
+ class param_rom_t final: public param_data_t
+ {
+ public:
+
+ param_rom_t(device_t &device, const pstring name);
+
+ const ST & operator[] (std::size_t n) { return m_data[n]; }
+ protected:
+ virtual void changed() override
+ {
+ stream()->read(&m_data[0],1<<AW);
+ }
+
+ private:
+ ST m_data[1 << AW];
+ };
+
+ // -----------------------------------------------------------------------------
// core_device_t
// -----------------------------------------------------------------------------
@@ -1004,7 +1014,6 @@ namespace netlist
public logic_family_t,
public detail::netlist_ref
{
- P_PREVENT_COPYING(core_device_t)
public:
core_device_t(netlist_t &owner, const pstring &name);
core_device_t(core_device_t &owner, const pstring &name);
@@ -1052,15 +1061,15 @@ namespace netlist
void do_update() NL_NOEXCEPT
{
- #if (NL_PMF_TYPE == NL_PMF_TYPE_GNUC_PMF)
- (this->*m_static_update)();
- #elif ((NL_PMF_TYPE == NL_PMF_TYPE_GNUC_PMF_CONV) || (NL_PMF_TYPE == NL_PMF_TYPE_INTERNAL))
- m_static_update(this);
+ #if (NL_USE_PMF_VIRTUAL)
+ update();
#else
- update();
+ m_static_update.call(this);
#endif
}
+ plib::plog_base<NL_DEBUG> &log();
+
public:
virtual void timestep(ATTR_UNUSED const nl_double st) { }
virtual void update_terminals() { }
@@ -1072,14 +1081,9 @@ namespace netlist
private:
bool m_hint_deactivate;
- #if (NL_PMF_TYPE == NL_PMF_TYPE_GNUC_PMF)
- typedef void (core_device_t::*net_update_delegate)();
- #elif ((NL_PMF_TYPE == NL_PMF_TYPE_GNUC_PMF_CONV) || (NL_PMF_TYPE == NL_PMF_TYPE_INTERNAL))
- using net_update_delegate = MEMBER_ABI void (*)(core_device_t *);
- #endif
- #if (NL_PMF_TYPE > NL_PMF_TYPE_VIRTUAL)
- net_update_delegate m_static_update;
+ #if (!NL_USE_PMF_VIRTUAL)
+ plib::pmfp_base<void> m_static_update;
#endif
};
@@ -1089,7 +1093,6 @@ namespace netlist
class device_t : public core_device_t
{
- P_PREVENT_COPYING(device_t)
public:
template <class C>
@@ -1103,7 +1106,7 @@ namespace netlist
template<class C, typename... Args>
void register_sub(const pstring &name, std::unique_ptr<C> &dev, const Args&... args)
{
- dev.reset(new C(*this, name, args...));
+ dev.reset(plib::palloc<C>(*this, name, args...));
}
void register_subalias(const pstring &name, detail::core_terminal_t &term);
@@ -1127,7 +1130,7 @@ namespace netlist
struct detail::family_setter_t
{
family_setter_t() { }
- family_setter_t(core_device_t &dev, const char *desc);
+ family_setter_t(core_device_t &dev, const pstring desc);
family_setter_t(core_device_t &dev, const logic_family_desc_t *desc);
};
@@ -1171,9 +1174,8 @@ namespace netlist
// -----------------------------------------------------------------------------
- class netlist_t : public plib::plog_dispatch_intf
+ class netlist_t : public plib::plog_dispatch_intf, private plib::nocopyassignmove
{
- P_PREVENT_COPYING(netlist_t)
public:
explicit netlist_t(const pstring &aname);
@@ -1207,7 +1209,6 @@ namespace netlist
void remove_dev(core_device_t *dev);
detail::net_t *find_net(const pstring &name);
- const logic_family_desc_t *family_from_model(const pstring &model);
template<class device_class>
std::vector<device_class *> get_device_list()
@@ -1222,22 +1223,16 @@ namespace netlist
return tmp;
}
- template<class device_class>
- device_class *get_single_device(const char *classname)
+ template<class C>
+ static bool check_class(core_device_t *p)
{
- device_class *ret = nullptr;
- for (auto &d : m_devices)
- {
- device_class *dev = dynamic_cast<device_class *>(d.get());
- if (dev != nullptr)
- {
- if (ret != nullptr)
- this->log().fatal("more than one {1} device found", classname);
- else
- ret = dev;
- }
- }
- return ret;
+ return dynamic_cast<C *>(p) != nullptr;
+ }
+
+ template<class C>
+ C *get_single_device(const pstring classname)
+ {
+ return dynamic_cast<C *>(pget_single_device(classname, check_class<C>));
}
/* logging and name */
@@ -1252,24 +1247,34 @@ namespace netlist
template<typename O, typename C> void save(O &owner, C &state, const pstring &stname)
{
- this->state().save_item(static_cast<void *>(&owner), state, owner.name() + pstring(".") + stname);
+ this->state().save_item(static_cast<void *>(&owner), state, from_utf8(owner.name()) + pstring(".") + stname);
}
template<typename O, typename C> void save(O &owner, C *state, const pstring &stname, const std::size_t count)
{
- this->state().save_state_ptr(static_cast<void *>(&owner), owner.name() + pstring(".") + stname, plib::state_manager_t::datatype_f<C>::f(), count, state);
+ this->state().save_state_ptr(static_cast<void *>(&owner), from_utf8(owner.name()) + pstring(".") + stname, plib::state_manager_t::datatype_f<C>::f(), count, state);
}
void rebuild_lists(); /* must be called after post_load ! */
plib::dynlib &lib() { return *m_lib; }
+ // FIXME: find something better
/* sole use is to manage lifetime of net objects */
std::vector<plib::owned_ptr<detail::net_t>> m_nets;
+ /* sole use is to manage lifetime of family objects */
+ std::vector<std::pair<pstring, std::unique_ptr<logic_family_desc_t>>> m_family_cache;
protected:
void print_stats() const;
private:
+
+ /* helper for save above */
+ static pstring from_utf8(const char *c) { return pstring(c, pstring::UTF8); }
+ static pstring from_utf8(const pstring &c) { return c; }
+
+ core_device_t *pget_single_device(const pstring classname, bool (*cc)(core_device_t *));
+
/* mostly rw */
netlist_time m_time;
detail::queue_t m_queue;
@@ -1281,21 +1286,17 @@ namespace netlist
devices::NETLIB_NAME(netlistparams) *m_params;
pstring m_name;
- setup_t * m_setup;
+ std::unique_ptr<setup_t> m_setup;
plib::plog_base<NL_DEBUG> m_log;
- plib::dynlib * m_lib; // external lib needs to be loaded as long as netlist exists
+ std::unique_ptr<plib::dynlib> m_lib; // external lib needs to be loaded as long as netlist exists
plib::state_manager_t m_state;
// performance
nperftime_t m_stat_mainloop;
nperfcount_t m_perf_out_processed;
- nperfcount_t m_perf_inp_processed;
- nperfcount_t m_perf_inp_active;
std::vector<plib::owned_ptr<core_device_t>> m_devices;
- /* sole use is to manage lifetime of family objects */
- std::vector<std::pair<pstring, std::unique_ptr<logic_family_desc_t>>> m_family_cache;
};
// -----------------------------------------------------------------------------
@@ -1313,43 +1314,24 @@ namespace netlist
object_array_t(core_device_t &dev, init names)
{
for (std::size_t i = 0; i<N; i++)
- this->emplace(i, dev, names.p[i]);
+ this->emplace(i, dev, pstring(names.p[i], pstring::UTF8));
}
};
// -----------------------------------------------------------------------------
- // rom parameter
+ // inline implementations
// -----------------------------------------------------------------------------
template <typename ST, std::size_t AW, std::size_t DW>
- class param_rom_t final: public param_data_t
+ inline param_rom_t<ST, AW, DW>::param_rom_t(device_t &device, const pstring name)
+ : param_data_t(device, name)
{
- public:
-
- param_rom_t(device_t &device, const pstring name)
- : param_data_t(device, name)
- {
- auto f = stream();
- if (f != nullptr)
- f->read(&m_data[0],1<<AW);
- else
- device.netlist().log().warning("Rom {1} not found", Value());
- }
-
- const ST & operator[] (std::size_t n) { return m_data[n]; }
-
- protected:
- virtual void changed() override
- {
- stream()->read(&m_data[0],1<<AW);
- }
- private:
- ST m_data[1 << AW];
- };
-
- // -----------------------------------------------------------------------------
- // inline implementations
- // -----------------------------------------------------------------------------
+ auto f = stream();
+ if (f != nullptr)
+ f->read(&m_data[0],1<<AW);
+ else
+ device.netlist().log().warning("Rom {1} not found", Value());
+ }
inline bool detail::core_terminal_t::is_logic() const NL_NOEXCEPT
{
@@ -1414,7 +1396,7 @@ namespace netlist
m_time = netlist().time() + delay;
m_in_queue = (m_active > 0); /* queued ? */
if (m_in_queue)
- netlist().queue().push(this, m_time);
+ netlist().queue().push(queue_t::entry_t(m_time, this));
}
}
@@ -1426,7 +1408,7 @@ namespace netlist
m_time = netlist().time() + delay;
m_in_queue = (m_active > 0); /* queued ? */
if (m_in_queue)
- netlist().queue().push(this, m_time);
+ netlist().queue().push(queue_t::entry_t(m_time, this));
}
inline const analog_net_t & analog_t::net() const NL_NOEXCEPT
@@ -1443,7 +1425,7 @@ namespace netlist
inline logic_net_t & logic_t::net() NL_NOEXCEPT
{
- return *static_cast<logic_net_t *>(&core_terminal_t::net());
+ return static_cast<logic_net_t &>(core_terminal_t::net());
}
inline const logic_net_t & logic_t::net() const NL_NOEXCEPT
@@ -1465,7 +1447,7 @@ namespace netlist
{
if (newQ != m_my_net.Q_Analog())
{
- m_my_net.m_cur_Analog = newQ;
+ m_my_net.set_Q_Analog(newQ);
m_my_net.toggle_new_Q();
m_my_net.push_to_queue(NLTIME_FROM_NS(1));
}
@@ -1480,9 +1462,10 @@ namespace netlist
}
template <typename T, std::size_t N>
- state_var<T[N]>::state_var(device_t &dev, const pstring name, const T & value)
+ template <typename O>
+ state_var<T[N]>::state_var(O &owner, const pstring name, const T & value)
{
- dev.netlist().save(dev, m_value, name);
+ owner.netlist().save(owner, m_value, name);
for (std::size_t i=0; i<N; i++)
m_value[i] = value;
}
@@ -1499,5 +1482,14 @@ namespace netlist
}
+namespace plib
+{
+ template<typename X>
+ struct ptype_traits<netlist::state_var<X>> : ptype_traits<X>
+ {
+ };
+}
+
+
#endif /* NLBASE_H_ */
diff --git a/src/lib/netlist/nl_config.h b/src/lib/netlist/nl_config.h
index 88f240394be..ded567717f9 100644
--- a/src/lib/netlist/nl_config.h
+++ b/src/lib/netlist/nl_config.h
@@ -9,68 +9,12 @@
#ifndef NLCONFIG_H_
#define NLCONFIG_H_
-#include <cstdint>
-
#include "plib/pconfig.h"
-#include "plib/pchrono.h"
//============================================================
// SETUP
//============================================================
-/*
- * The following options determine how object::update is called.
- * NL_PMF_TYPE_VIRTUAL
- * Use stock virtual call
- *
- * NL_PMF_TYPE_GNUC_PMF
- * Use standard pointer to member function syntax
- *
- * NL_PMF_TYPE_GNUC_PMF_CONV
- * Use gnu extension and convert the pmf to a function pointer.
- * This is not standard compliant and needs
- * -Wno-pmf-conversions to compile.
- *
- * NL_PMF_TYPE_INTERNAL
- * Use the same approach as MAME for deriving the function pointer.
- * This is compiler-dependant as well
- *
- * Benchmarks for ./nltool -c run -f src/mame/drivers/nl_pong.c -t 10 -n pong_fast
- *
- * NL_PMF_TYPE_INTERNAL: 215%
- * NL_PMF_TYPE_GNUC_PMF: 163%
- * NL_PMF_TYPE_GNUC_PMF_CONV: 215%
- * NL_PMF_TYPE_VIRTUAL: 213%
- *
- * The whole exercise was done to avoid virtual calls. In prior versions of
- * netlist, the INTERNAL and GNUC_PMF_CONV approach provided significant improvement.
- * Since than, was removed from functions declared as virtual.
- * This may explain that the recent benchmarks show no difference at all.
- *
- * Disappointing is the GNUC_PMF performance.
- */
-
-// This will be autodetected
-// #define NL_PMF_TYPE 0
-
-#define NL_PMF_TYPE_VIRTUAL 0
-#define NL_PMF_TYPE_GNUC_PMF 1
-#define NL_PMF_TYPE_GNUC_PMF_CONV 2
-#define NL_PMF_TYPE_INTERNAL 3
-
-#ifndef NL_PMF_TYPE
- #if PHAS_PMF_INTERNAL
- #define NL_PMF_TYPE NL_PMF_TYPE_INTERNAL
- #else
- #define NL_PMF_TYPE NL_PMF_TYPE_VIRTUAL
- #endif
-#endif
-
-#if (NL_PMF_TYPE == NL_PMF_TYPE_GNUC_PMF_CONV)
-#pragma GCC diagnostic ignored "-Wpmf-conversions"
-#endif
-
-
//============================================================
// GENERAL
@@ -86,8 +30,12 @@
*
*/
#define USE_MEMPOOL (0)
+
#define USE_TRUTHTABLE (1)
+// How many times do we try to resolve links (connections)
+#define NL_MAX_LINK_RESOLVE_LOOPS (100)
+
//============================================================
// Solver defines
//============================================================
@@ -120,20 +68,6 @@
#endif
//============================================================
-// Performance tracking
-//============================================================
-
-namespace netlist
-{
-#if NL_KEEP_STATISTICS
-using nperftime_t = plib::chrono::timer<plib::chrono::exact_ticks, true>;
-using nperfcount_t = plib::chrono::counter<true>;
-#else
-using nperftime_t = plib::chrono::timer<plib::chrono::exact_ticks, false>;
-using nperfcount_t = plib::chrono::counter<false>;
-#endif
-}
-//============================================================
// General
//============================================================
@@ -156,6 +90,20 @@ using nperfcount_t = plib::chrono::counter<false>;
#define NL_FCONST(x) x
using nl_double = double;
+/* The following option determines how object::update is called.
+ * If set to 1, a virtual call is used. If it is left undefined, the best
+ * approach will be automatically selected.
+ */
+
+//#define NL_USE_PMF_VIRTUAL 1
+
+#ifndef NL_USE_PMF_VIRTUAL
+ #if PPMF_TYPE == PPMF_TYPE_PMF
+ #define NL_USE_PMF_VIRTUAL 1
+ #else
+ #define NL_USE_PMF_VIRTUAL 0
+ #endif
+#endif
//============================================================
// WARNINGS
diff --git a/src/lib/netlist/nl_dice_compat.h b/src/lib/netlist/nl_dice_compat.h
index 209f18d82af..b0ebdb2e371 100644
--- a/src/lib/netlist/nl_dice_compat.h
+++ b/src/lib/netlist/nl_dice_compat.h
@@ -27,8 +27,11 @@ sed -e 's/#define \(.*\)"\(.*\)"[ \t]*,[ \t]*\(.*\)/NET_ALIAS(\1,\2.\3)/' src/ma
#ifndef NL_CONVERT_CPP
#include "devices/net_lib.h"
#include "analog/nld_twoterm.h"
+
+#include <cmath>
#endif
+
/* --------------------------------------------------------------------
* Compatibility macros for DICE netlists ...
* -------------------------------------------------------------------- */
diff --git a/src/lib/netlist/nl_errstr.h b/src/lib/netlist/nl_errstr.h
index 563e33dd93f..ec52187558f 100644
--- a/src/lib/netlist/nl_errstr.h
+++ b/src/lib/netlist/nl_errstr.h
@@ -11,18 +11,92 @@
// nl_base.cpp
-#define MF_1_DUPLICATE_NAME_DEVICE_LIST "Error adding {1} to device list. Duplicate name."
-#define MF_1_UNKNOWN_TYPE_FOR_OBJECT "Unknown type for object {1} "
-#define MF_2_NET_1_DUPLICATE_TERMINAL_2 "net {1}: duplicate terminal {2}"
-#define MF_2_REMOVE_TERMINAL_1_FROM_NET_2 "Can not remove terminal {1} from net {2}."
-#define MF_1_UNKNOWN_PARAM_TYPE "Can not determine param_type for {1}"
-#define MF_2_ERROR_CONNECTING_1_TO_2 "Error connecting {1} to {2}"
-#define MF_0_NO_SOLVER "No solver found for this netlist although analog elements are present\n"
+#define MF_1_DUPLICATE_NAME_DEVICE_LIST "Error adding {1} to device list. Duplicate name."
+#define MF_1_UNKNOWN_TYPE_FOR_OBJECT "Unknown type for object {1} "
+#define MF_2_NET_1_DUPLICATE_TERMINAL_2 "net {1}: duplicate terminal {2}"
+#define MF_2_REMOVE_TERMINAL_1_FROM_NET_2 "Can not remove terminal {1} from net {2}."
+#define MF_1_UNKNOWN_PARAM_TYPE "Can not determine param_type for {1}"
+#define MF_2_ERROR_CONNECTING_1_TO_2 "Error connecting {1} to {2}"
+#define MF_0_NO_SOLVER "No solver found for this netlist although analog elements are present"
+#define MF_1_HND_VAL_NOT_SUPPORTED "HINT_NO_DEACTIVATE value not supported: <{1}>"
// nl_factory.cpp
-#define MF_1_FACTORY_ALREADY_CONTAINS_1 "factory already contains {1}"
+#define MF_1_FACTORY_ALREADY_CONTAINS_1 "factory already contains {1}"
#define MF_1_CLASS_1_NOT_FOUND "Class <{1}> not found!"
+// nld_opamps.cpp
-#endif /* NLBASE_H_ */
+#define MF_1_UNKNOWN_OPAMP_TYPE "Unknown opamp type: {1}"
+
+// nld_matrix_solver.cpp
+
+#define MF_1_UNHANDLED_ELEMENT_1_FOUND "setup_base:unhandled element <{1}> found"
+#define MF_1_FOUND_TERM_WITH_MISSING_OTHERNET "found term with missing othernet {1}"
+
+#define MW_1_NEWTON_LOOPS_EXCEEDED_ON_NET_1 "NEWTON_LOOPS exceeded on net {1}... reschedule"
+
+// nld_solver.cpp
+
+#define MF_1_UNKNOWN_SOLVER_TYPE "Unknown solver type: {1}"
+#define MF_1_NETGROUP_SIZE_EXCEEDED_1 "Encountered netgroup with > {1} nets"
+
+#define MW_1_NO_SPECIFIC_SOLVER "No specific solver found for netlist of size {1}"
+
+// nl_base.cpp
+
+#define MF_1_MODEL_1_CAN_NOT_BE_CHANGED_AT_RUNTIME "Model {1} can not be changed at runtime"
+#define MF_1_MORE_THAN_ONE_1_DEVICE_FOUND "more than one {1} device found"
+
+// nl_parser.cpp
+
+#define MF_0_UNEXPECTED_NETLIST_END "Unexpected NETLIST_END"
+#define MF_0_UNEXPECTED_NETLIST_START "Unexpected NETLIST_START"
+
+// nl_setup.cpp
+
+//#define MF_1_CLASS_1_NOT_FOUND "Class {1} not found!"
+#define MF_1_UNABLE_TO_PARSE_MODEL_1 "Unable to parse model: {1}"
+#define MF_1_MODEL_ALREADY_EXISTS_1 "Model already exists: {1}"
+#define MF_1_ADDING_ALIAS_1_TO_ALIAS_LIST "Error adding alias {1} to alias list"
+#define MF_1_DIP_PINS_MUST_BE_AN_EQUAL_NUMBER_OF_PINS_1 "You must pass an equal number of pins to DIPPINS {1}"
+#define MF_1_UNKNOWN_OBJECT_TYPE_1 "Unknown object type {1}"
+#define MF_2_INVALID_NUMBER_CONVERSION_1_2 "Invalid number conversion {1} : {2}"
+#define MF_1_ADDING_PARAMETER_1_TO_PARAMETER_LIST "Error adding parameter {1} to parameter list"
+#define MF_2_ADDING_1_2_TO_TERMINAL_LIST "Error adding {1} {2} to terminal list"
+#define MF_2_NET_C_NEEDS_AT_LEAST_2_TERMINAL "You must pass at least 2 terminals to NET_C"
+#define MF_1_FOUND_NO_OCCURRENCE_OF_1 "Found no occurrence of {1}"
+#define MF_2_TERMINAL_1_2_NOT_FOUND "Alias {1} was resolved to be terminal {2}. Terminal {2} was not found."
+#define MF_2_OBJECT_1_2_WRONG_TYPE "object {1}({2}) found but wrong type"
+#define MF_2_PARAMETER_1_2_NOT_FOUND "parameter {1}({2}) not found!"
+#define MF_2_CONNECTING_1_TO_2 "Error connecting {1} to {2}"
+#define MF_2_MERGE_RAIL_NETS_1_AND_2 "Trying to merge two rail nets: {1} and {2}"
+#define MF_1_OBJECT_INPUT_TYPE_1 "Unable to determine input type of {1}"
+#define MF_1_OBJECT_OUTPUT_TYPE_1 "Unable to determine output type of {1}"
+#define MF_1_INPUT_1_ALREADY_CONNECTED "Input {1} already connected"
+#define MF_0_LINK_TRIES_EXCEEDED "Error connecting -- bailing out"
+#define MF_1_MODEL_NOT_FOUND "Model {1} not found"
+#define MF_1_MODEL_ERROR_1 "Model error {1}"
+#define MF_1_MODEL_ERROR_ON_PAIR_1 "Model error on pair {1}"
+#define MF_2_MODEL_PARAMETERS_NOT_UPPERCASE_1_2 "model parameters should be uppercase:{1} {2}"
+#define MF_2_ENTITY_1_NOT_FOUND_IN_MODEL_2 "Entity {1} not found in model {2}"
+#define MF_1_UNKNOWN_NUMBER_FACTOR_IN_1 "Unknown number factor in: {1}"
+#define MF_1_NOT_FOUND_IN_SOURCE_COLLECTION "unable to find {1} in source collection"
+
+#define MW_3_OVERWRITING_PARAM_1_OLD_2_NEW_3 "Overwriting {1} old <{2}> new <{3}>"
+#define MW_1_CONNECTING_1_TO_ITSELF "Connecting {1} to itself. This may be right, though"
+#define MW_1_DUMMY_1_WITHOUT_CONNECTIONS "Found dummy terminal {1} without connections"
+#define MW_1_TERMINAL_1_WITHOUT_CONNECTIONS "Found terminal {1} without connections"
+#define MW_3_REMOVE_DEVICE_1_CONNECTED_ONLY_TO_RAILS_2_3 "Found device {1} connected only to railterminals {2}/{3}. Will be removed"
+#define MW_1_DATA_1_NOT_FOUND "unable to find data named {1} in source collection"
+
+// nld_mm5837.cpp
+
+#define MW_1_FREQUENCY_OUTSIDE_OF_SPECS_1 "MM5837: Frequency outside of specs: {1}"
+
+// nlid_proxy.cpp
+
+#define MW_1_NO_POWER_TERMINALS_ON_DEVICE_1 "D/A Proxy: Found no valid combination of power terminals on device {1}"
+
+
+#endif /* NL_ERRSTR_H_ */
diff --git a/src/lib/netlist/nl_factory.cpp b/src/lib/netlist/nl_factory.cpp
index 50dc2ef9c8d..2ab15375d62 100644
--- a/src/lib/netlist/nl_factory.cpp
+++ b/src/lib/netlist/nl_factory.cpp
@@ -9,6 +9,7 @@
****************************************************************************/
#include "nl_factory.h"
+#include "nl_base.h"
#include "nl_setup.h"
#include "plib/putil.h"
#include "nl_errstr.h"
@@ -16,9 +17,31 @@
namespace netlist { namespace factory
{
+class NETLIB_NAME(wrapper) : public device_t
+{
+public:
+ NETLIB_NAME(wrapper)(netlist_t &anetlist, const pstring &name)
+ : device_t(anetlist, name)
+ {
+ }
+protected:
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+};
+
+
+
+element_t::element_t(const pstring &name, const pstring &classname,
+ const pstring &def_param, const pstring &sourcefile)
+ : m_name(name), m_classname(classname), m_def_param(def_param),
+ m_sourcefile(sourcefile)
+{
+}
+
element_t::element_t(const pstring &name, const pstring &classname,
const pstring &def_param)
- : m_name(name), m_classname(classname), m_def_param(def_param)
+ : m_name(name), m_classname(classname), m_def_param(def_param),
+ m_sourcefile("<unknown>")
{
}
diff --git a/src/lib/netlist/nl_factory.h b/src/lib/netlist/nl_factory.h
index 9e2185e0729..92f126ea4d5 100644
--- a/src/lib/netlist/nl_factory.h
+++ b/src/lib/netlist/nl_factory.h
@@ -9,29 +9,42 @@
#ifndef NLFACTORY_H_
#define NLFACTORY_H_
-#include <type_traits>
-
-#include "nl_config.h"
#include "plib/palloc.h"
-#include "plib/plists.h"
-#include "plib/putil.h"
-#include "nl_base.h"
-
-#define NETLIB_DEVICE_IMPL(chip) factory::constructor_ptr_t decl_ ## chip = factory::constructor_t< NETLIB_NAME(chip) >;
-#define NETLIB_DEVICE_IMPL_NS(ns, chip) factory::constructor_ptr_t decl_ ## chip = factory::constructor_t< ns :: NETLIB_NAME(chip) >;
-
-namespace netlist { namespace factory
-{
+#include "plib/ptypes.h"
+
+#define NETLIB_DEVICE_IMPL(chip) \
+ static std::unique_ptr<factory::element_t> NETLIB_NAME(chip ## _c)( \
+ const pstring &name, const pstring &classname, const pstring &def_param) \
+ { \
+ return std::unique_ptr<factory::element_t>(plib::palloc<factory::device_element_t<NETLIB_NAME(chip)>>(name, classname, def_param, pstring(__FILE__))); \
+ } \
+ factory::constructor_ptr_t decl_ ## chip = NETLIB_NAME(chip ## _c);
+
+#define NETLIB_DEVICE_IMPL_NS(ns, chip) \
+ static std::unique_ptr<factory::element_t> NETLIB_NAME(chip ## _c)( \
+ const pstring &name, const pstring &classname, const pstring &def_param) \
+ { \
+ return std::unique_ptr<factory::element_t>(plib::palloc<factory::device_element_t<ns :: NETLIB_NAME(chip)>>(name, classname, def_param, pstring(__FILE__))); \
+ } \
+ factory::constructor_ptr_t decl_ ## chip = NETLIB_NAME(chip ## _c);
+
+namespace netlist {
+ class netlist_t;
+ class device_t;
+ class setup_t;
+
+namespace factory {
// -----------------------------------------------------------------------------
// net_dev class factory
// -----------------------------------------------------------------------------
- class element_t
+ class element_t : plib::nocopyassignmove
{
- P_PREVENT_COPYING(element_t)
public:
element_t(const pstring &name, const pstring &classname,
const pstring &def_param);
+ element_t(const pstring &name, const pstring &classname,
+ const pstring &def_param, const pstring &sourcefile);
virtual ~element_t();
virtual plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) = 0;
@@ -40,21 +53,25 @@ namespace netlist { namespace factory
const pstring &name() const { return m_name; }
const pstring &classname() const { return m_classname; }
const pstring &param_desc() const { return m_def_param; }
+ const pstring &sourcefile() const { return m_sourcefile; }
protected:
pstring m_name; /* device name */
pstring m_classname; /* device class name */
pstring m_def_param; /* default parameter */
+ pstring m_sourcefile; /* source file */
};
template <class C>
class device_element_t : public element_t
{
- P_PREVENT_COPYING(device_element_t)
public:
device_element_t(const pstring &name, const pstring &classname,
const pstring &def_param)
: element_t(name, classname, def_param) { }
+ device_element_t(const pstring &name, const pstring &classname,
+ const pstring &def_param, const pstring &sourcefile)
+ : element_t(name, classname, def_param, sourcefile) { }
plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) override
{
@@ -72,7 +89,7 @@ namespace netlist { namespace factory
void register_device(const pstring &name, const pstring &classname,
const pstring &def_param)
{
- register_device(std::unique_ptr<element_t>(new device_element_t<device_class>(name, classname, def_param)));
+ register_device(std::unique_ptr<element_t>(plib::palloc<device_element_t<device_class>>(name, classname, def_param)));
}
void register_device(std::unique_ptr<element_t> factory);
@@ -87,7 +104,7 @@ namespace netlist { namespace factory
private:
setup_t &m_setup;
-};
+ };
// -----------------------------------------------------------------------------
// factory_creator_ptr_t
@@ -100,42 +117,33 @@ namespace netlist { namespace factory
std::unique_ptr<element_t> constructor_t(const pstring &name, const pstring &classname,
const pstring &def_param)
{
- return std::unique_ptr<element_t>(new device_element_t<T>(name, classname, def_param));
+ return std::unique_ptr<element_t>(plib::palloc<device_element_t<T>>(name, classname, def_param));
}
// -----------------------------------------------------------------------------
// factory_lib_entry_t: factory class to wrap macro based chips/elements
// -----------------------------------------------------------------------------
- class NETLIB_NAME(wrapper) : public device_t
- {
- public:
- NETLIB_NAME(wrapper)(netlist_t &anetlist, const pstring &name)
- : device_t(anetlist, name)
- {
- }
- protected:
- NETLIB_RESETI();
- NETLIB_UPDATEI();
- };
-
class library_element_t : public element_t
{
- P_PREVENT_COPYING(library_element_t)
public:
library_element_t(setup_t &setup, const pstring &name, const pstring &classname,
- const pstring &def_param)
- : element_t(name, classname, def_param), m_setup(setup) { }
+ const pstring &def_param, const pstring &source)
+ : element_t(name, classname, def_param, source) { }
plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) override;
void macro_actions(netlist_t &anetlist, const pstring &name) override;
private:
- setup_t &m_setup;
};
-} }
+ }
+
+ namespace devices {
+ void initialize_factory(factory::list_t &factory);
+ }
+}
#endif /* NLFACTORY_H_ */
diff --git a/src/lib/netlist/nl_lists.h b/src/lib/netlist/nl_lists.h
index 2b378dadf71..4c6935bd7d4 100644
--- a/src/lib/netlist/nl_lists.h
+++ b/src/lib/netlist/nl_lists.h
@@ -11,10 +11,14 @@
#define NLLISTS_H_
#include <atomic>
+#include <thread>
+#include <mutex>
#include "nl_config.h"
+#include "netlist_types.h"
#include "plib/plists.h"
#include "plib/pchrono.h"
+#include "plib/ptypes.h"
// ----------------------------------------------------------------------------------------
// timed queue
@@ -23,41 +27,45 @@
namespace netlist
{
-
//FIXME: move to an appropriate place
template<bool enabled_ = true>
- class pspin_lock
+ class pspin_mutex
{
public:
- pspin_lock() { }
- void acquire() noexcept{ while (m_lock.test_and_set(std::memory_order_acquire)) { } }
- void release() noexcept { m_lock.clear(std::memory_order_release); }
+ pspin_mutex() noexcept { }
+ void lock() noexcept{ while (m_lock.test_and_set(std::memory_order_acquire)) { } }
+ void unlock() noexcept { m_lock.clear(std::memory_order_release); }
private:
std::atomic_flag m_lock = ATOMIC_FLAG_INIT;
};
template<>
- class pspin_lock<false>
+ class pspin_mutex<false>
{
public:
- void acquire() const noexcept { }
- void release() const noexcept { }
+ void lock() const noexcept { }
+ void unlock() const noexcept { }
};
- #if HAS_OPENMP && USE_OPENMP
- using tqlock = pspin_lock<true>;
- #else
- using tqlock = pspin_lock<false>;
- #endif
-
template <class Element, class Time>
- class timed_queue
+ class timed_queue : plib::nocopyassignmove
{
- P_PREVENT_COPYING(timed_queue)
public:
struct entry_t
{
+ entry_t() { }
+ entry_t(const Time &t, const Element &o) : m_exec_time(t), m_object(o) { }
+ entry_t(const entry_t &e) : m_exec_time(e.m_exec_time), m_object(e.m_object) { }
+ entry_t(entry_t &&e) : m_exec_time(e.m_exec_time), m_object(e.m_object) { }
+
+ entry_t& operator=(entry_t && other)
+ {
+ m_exec_time = other.m_exec_time;
+ m_object = other.m_object;
+ return *this;
+ }
+
Time m_exec_time;
Element m_object;
};
@@ -65,37 +73,35 @@ namespace netlist
timed_queue(unsigned list_size)
: m_list(list_size)
{
- m_lock.acquire();
clear();
- m_lock.release();
}
std::size_t capacity() const { return m_list.size(); }
bool empty() const { return (m_end == &m_list[1]); }
- void push(Element o, const Time t) noexcept
+ void push(entry_t &&e) noexcept
{
/* Lock */
- m_lock.acquire();
+ tqlock lck(m_lock);
entry_t * i = m_end;
- for (; t > (i - 1)->m_exec_time; --i)
+ while (e.m_exec_time > (i - 1)->m_exec_time)
{
- *(i) = *(i-1);
+ *(i) = std::move(*(i-1));
+ --i;
m_prof_sortmove.inc();
}
- *i = { t, o };
+ *i = std::move(e);
++m_end;
m_prof_call.inc();
- m_lock.release();
}
- entry_t pop() noexcept { return *(--m_end); }
- const entry_t &top() const noexcept { return *(m_end-1); }
+ entry_t pop() noexcept { return std::move(*(--m_end)); }
+ const entry_t &top() const noexcept { return std::move(*(m_end-1)); }
void remove(const Element &elem) noexcept
{
/* Lock */
- m_lock.acquire();
+ tqlock lck(m_lock);
for (entry_t * i = m_end - 1; i > &m_list[0]; i--)
{
if (i->m_object == elem)
@@ -103,24 +109,23 @@ namespace netlist
m_end--;
while (i < m_end)
{
- *i = *(i+1);
+ *i = std::move(*(i+1));
++i;
}
- m_lock.release();
return;
}
}
- m_lock.release();
}
void retime(const Element &elem, const Time t) noexcept
{
remove(elem);
- push(elem, t);
+ push(entry_t(t, elem));
}
void clear()
{
+ tqlock lck(m_lock);
m_end = &m_list[0];
/* put an empty element with maximum time into the queue.
* the insert algo above will run into this element and doesn't
@@ -137,8 +142,14 @@ namespace netlist
const entry_t & operator[](const std::size_t index) const { return m_list[ 1 + index]; }
private:
+ #if HAS_OPENMP && USE_OPENMP
+ using tqmutex = pspin_mutex<true>;
+ #else
+ using tqmutex = pspin_mutex<false>;
+ #endif
+ using tqlock = std::lock_guard<tqmutex>;
- tqlock m_lock;
+ tqmutex m_lock;
entry_t * m_end;
std::vector<entry_t> m_list;
diff --git a/src/lib/netlist/nl_parser.cpp b/src/lib/netlist/nl_parser.cpp
index 6dee211ce56..db7ced8fae0 100644
--- a/src/lib/netlist/nl_parser.cpp
+++ b/src/lib/netlist/nl_parser.cpp
@@ -7,7 +7,7 @@
#include "nl_parser.h"
#include "nl_factory.h"
-#include "devices/nld_truthtable.h"
+#include "nl_errstr.h"
namespace netlist
{
@@ -28,13 +28,7 @@ bool parser_t::parse(const pstring nlname)
{
set_identifier_chars("abcdefghijklmnopqrstuvwvxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890_.-");
set_number_chars(".0123456789", "0123456789eE-."); //FIXME: processing of numbers
- char ws[5];
- ws[0] = ' ';
- ws[1] = 9;
- ws[2] = 10;
- ws[3] = 13;
- ws[4] = 0;
- set_whitespace(ws);
+ set_whitespace(pstring("").cat(' ').cat(9).cat(10).cat(13));
set_comment("/*", "*/", "//");
m_tok_param_left = register_token("(");
m_tok_param_right = register_token(")");
@@ -64,18 +58,16 @@ bool parser_t::parse(const pstring nlname)
while (true)
{
token_t token = get_token();
-
if (token.is_type(ENDOFFILE))
{
return false;
- //error("EOF while searching for <{1}>", nlname);
}
if (token.is(m_tok_NETLIST_END))
{
require_token(m_tok_param_left);
if (!in_nl)
- error("Unexpected NETLIST_END");
+ error (MF_0_UNEXPECTED_NETLIST_END);
else
{
in_nl = false;
@@ -85,7 +77,7 @@ bool parser_t::parse(const pstring nlname)
else if (token.is(m_tok_NETLIST_START))
{
if (in_nl)
- error("Unexpected NETLIST_START");
+ error (MF_0_UNEXPECTED_NETLIST_START);
require_token(m_tok_param_left);
token_t name = get_token();
require_token(m_tok_param_right);
@@ -99,7 +91,7 @@ bool parser_t::parse(const pstring nlname)
}
}
-void parser_t::parse_netlist(ATTR_UNUSED const pstring &nlname)
+void parser_t::parse_netlist(const pstring &nlname)
{
while (true)
{
@@ -132,10 +124,10 @@ void parser_t::parse_netlist(ATTR_UNUSED const pstring &nlname)
else if (token.is(m_tok_LOCAL_SOURCE))
net_local_source();
else if (token.is(m_tok_TRUTHTABLE_START))
- net_truthtable_start();
+ net_truthtable_start(nlname);
else if (token.is(m_tok_LOCAL_LIB_ENTRY))
{
- m_setup.register_lib_entry(get_identifier());
+ m_setup.register_lib_entry(get_identifier(), "parser: " + nlname);
require_token(m_tok_param_right);
}
else if (token.is(m_tok_NETLIST_END))
@@ -148,7 +140,7 @@ void parser_t::parse_netlist(ATTR_UNUSED const pstring &nlname)
}
}
-void parser_t::net_truthtable_start()
+void parser_t::net_truthtable_start(const pstring &nlname)
{
pstring name = get_identifier();
require_token(m_tok_comma);
@@ -194,7 +186,7 @@ void parser_t::net_truthtable_start()
require_token(token, m_tok_TRUTHTABLE_END);
require_token(m_tok_param_left);
require_token(m_tok_param_right);
- netlist::devices::tt_factory_create(m_setup, desc);
+ m_setup.tt_factory_create(desc, nlname);
return;
}
}
@@ -300,7 +292,7 @@ void parser_t::net_c()
void parser_t::dippins()
{
- plib::pstring_vector_t pins;
+ std::vector<pstring> pins;
pins.push_back(get_identifier());
require_token(m_tok_comma);
@@ -357,7 +349,7 @@ void parser_t::netdev_hint()
void parser_t::device(const pstring &dev_type)
{
factory::element_t *f = m_setup.factory().factory_by_name(dev_type);
- auto paramlist = plib::pstring_vector_t(f->param_desc(), ",");
+ auto paramlist = plib::psplit(f->param_desc(), ",");
pstring devname = get_identifier();
@@ -404,7 +396,7 @@ void parser_t::device(const pstring &dev_type)
nl_double parser_t::eval_param(const token_t tok)
{
- static const char *macs[6] = {"", "RES_K", "RES_M", "CAP_U", "CAP_N", "CAP_P"};
+ static pstring macs[6] = {"", "RES_K", "RES_M", "CAP_U", "CAP_N", "CAP_P"};
static nl_double facs[6] = {1, 1e3, 1e6, 1e-6, 1e-9, 1e-12};
int i;
int f=0;
@@ -415,7 +407,6 @@ nl_double parser_t::eval_param(const token_t tok)
for (i=1; i<6;i++)
if (tok.str().equals(macs[i]))
f = i;
-#if 1
if (f>0)
{
require_token(m_tok_param_left);
@@ -431,22 +422,6 @@ nl_double parser_t::eval_param(const token_t tok)
}
return ret * facs[f];
-#else
- if (f>0)
- {
- require_token(m_tok_param_left);
- val = get_identifier();
- }
- else
- val = tok.str();
-
- ret = val.as_double(&e);
-
- if (e)
- fatal("Error with parameter ...\n");
- if (f>0)
- require_token(m_tok_param_right);
- return ret * facs[f];
-#endif
}
+
}
diff --git a/src/lib/netlist/nl_parser.h b/src/lib/netlist/nl_parser.h
index 5c915e69997..4654bcb3f87 100644
--- a/src/lib/netlist/nl_parser.h
+++ b/src/lib/netlist/nl_parser.h
@@ -15,10 +15,9 @@ namespace netlist
{
class parser_t : public plib::ptokenizer
{
- P_PREVENT_COPYING(parser_t)
public:
- parser_t(plib::pistream &strm, setup_t &setup)
- : plib::ptokenizer(strm), m_setup(setup), m_buf(nullptr) {}
+ parser_t(plib::putf8_reader &strm, setup_t &setup)
+ : plib::ptokenizer(strm), m_setup(setup) {}
bool parse(const pstring nlname = "");
@@ -37,7 +36,7 @@ namespace netlist
void net_submodel();
void net_include();
void net_local_source();
- void net_truthtable_start();
+ void net_truthtable_start(const pstring &nlname);
/* for debugging messages */
netlist_t &netlist() { return m_setup.netlist(); }
@@ -70,9 +69,7 @@ namespace netlist
token_id_t m_tok_TT_FAMILY;
setup_t &m_setup;
-
- const char *m_buf;
- };
+};
}
diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp
index 84aa7c8d384..0572ec1e693 100644
--- a/src/lib/netlist/nl_setup.cpp
+++ b/src/lib/netlist/nl_setup.cpp
@@ -5,22 +5,17 @@
*
*/
-#include <cstdio>
-
-#include "solver/nld_solver.h"
-
#include "plib/palloc.h"
#include "plib/putil.h"
#include "nl_base.h"
#include "nl_setup.h"
#include "nl_parser.h"
#include "nl_factory.h"
-#include "devices/net_lib.h"
-#include "devices/nld_truthtable.h"
#include "devices/nlid_system.h"
#include "devices/nlid_proxy.h"
#include "analog/nld_twoterm.h"
#include "solver/nld_solver.h"
+#include "devices/nlid_truthtable.h"
// ----------------------------------------------------------------------------------------
// setup_t
@@ -34,7 +29,7 @@ setup_t::setup_t(netlist_t &netlist)
, m_proxy_cnt(0)
, m_frontier_cnt(0)
{
- initialize_factory(m_factory);
+ devices::initialize_factory(m_factory);
}
setup_t::~setup_t()
@@ -73,16 +68,16 @@ void setup_t::namespace_pop()
m_namespace_stack.pop();
}
-void setup_t::register_lib_entry(const pstring &name)
+void setup_t::register_lib_entry(const pstring &name, const pstring &sourcefile)
{
- factory().register_device(plib::make_unique_base<factory::element_t, factory::library_element_t>(*this, name, name, ""));
+ factory().register_device(plib::make_unique_base<factory::element_t, factory::library_element_t>(*this, name, name, "", sourcefile));
}
void setup_t::register_dev(const pstring &classname, const pstring &name)
{
auto f = factory().factory_by_name(classname);
if (f == nullptr)
- log().fatal("Class {1} not found!\n", classname);
+ log().fatal(MF_1_CLASS_1_NOT_FOUND, classname);
/* make sure we parse macro library entries */
f->macro_actions(netlist(), name);
m_device_factory.push_back(std::pair<pstring, factory::element_t *>(build_fqn(name), f));
@@ -103,17 +98,17 @@ void setup_t::register_model(const pstring &model_in)
{
auto pos = model_in.find(" ");
if (pos == model_in.end())
- log().fatal("Unable to parse model: {1}", model_in);
+ log().fatal(MF_1_UNABLE_TO_PARSE_MODEL_1, model_in);
pstring model = model_in.left(pos).trim().ucase();
pstring def = model_in.substr(pos + 1).trim();
if (!m_models.insert({model, def}).second)
- log().fatal("Model already exists: {1}", model_in);
+ log().fatal(MF_1_MODEL_ALREADY_EXISTS_1, model_in);
}
void setup_t::register_alias_nofqn(const pstring &alias, const pstring &out)
{
if (!m_alias.insert({alias, out}).second)
- log().fatal("Error adding alias {1} to alias list\n", alias);
+ log().fatal(MF_1_ADDING_ALIAS_1_TO_ALIAS_LIST, alias);
}
void setup_t::register_alias(const pstring &alias, const pstring &out)
@@ -125,9 +120,10 @@ void setup_t::register_alias(const pstring &alias, const pstring &out)
void setup_t::register_dippins_arr(const pstring &terms)
{
- plib::pstring_vector_t list(terms,", ");
+ std::vector<pstring> list(plib::psplit(terms,", "));
if (list.size() == 0 || (list.size() % 2) == 1)
- log().fatal("You must pass an equal number of pins to DIPPINS {1}" , build_fqn(""));
+ log().fatal(MF_1_DIP_PINS_MUST_BE_AN_EQUAL_NUMBER_OF_PINS_1,
+ build_fqn(""));
std::size_t n = list.size();
for (std::size_t i = 0; i < n / 2; i++)
{
@@ -136,22 +132,19 @@ void setup_t::register_dippins_arr(const pstring &terms)
}
}
-pstring setup_t::objtype_as_str(detail::device_object_t &in) const
+pstring setup_t::termtype_as_str(detail::core_terminal_t &in) const
{
switch (in.type())
{
- case terminal_t::TERMINAL:
- return "TERMINAL";
- case terminal_t::INPUT:
- return "INPUT";
- case terminal_t::OUTPUT:
- return "OUTPUT";
- case terminal_t::PARAM:
- return "PARAM";
+ case detail::terminal_type::TERMINAL:
+ return pstring("TERMINAL");
+ case detail::terminal_type::INPUT:
+ return pstring("INPUT");
+ case detail::terminal_type::OUTPUT:
+ return pstring("OUTPUT");
}
- // FIXME: noreturn
- log().fatal("Unknown object type {1}\n", static_cast<unsigned>(in.type()));
- return "Error";
+ log().fatal(MF_1_UNKNOWN_OBJECT_TYPE_1, static_cast<unsigned>(in.type()));
+ return pstring("Error");
}
pstring setup_t::get_initial_param_val(const pstring name, const pstring def)
@@ -170,7 +163,7 @@ double setup_t::get_initial_param_val(const pstring name, const double def)
{
double vald = 0;
if (sscanf(i->second.c_str(), "%lf", &vald) != 1)
- log().fatal("Invalid number conversion {1} : {2}\n", name, i->second);
+ log().fatal(MF_2_INVALID_NUMBER_CONVERSION_1_2, name, i->second);
return vald;
}
else
@@ -184,7 +177,7 @@ int setup_t::get_initial_param_val(const pstring name, const int def)
{
double vald = 0;
if (sscanf(i->second.c_str(), "%lf", &vald) != 1)
- log().fatal("Invalid number conversion {1} : {2}\n", name, i->second);
+ log().fatal(MF_2_INVALID_NUMBER_CONVERSION_1_2, name, i->second);
return static_cast<int>(vald);
}
else
@@ -194,21 +187,22 @@ int setup_t::get_initial_param_val(const pstring name, const int def)
void setup_t::register_param(pstring name, param_t &param)
{
if (!m_params.insert({param.name(), param_ref_t(param.name(), param.device(), param)}).second)
- log().fatal("Error adding parameter {1} to parameter list\n", name);
+ log().fatal(MF_1_ADDING_PARAMETER_1_TO_PARAMETER_LIST, name);
}
void setup_t::register_term(detail::core_terminal_t &term)
{
if (!m_terminals.insert({term.name(), &term}).second)
- log().fatal("Error adding {1} {2} to terminal list\n", objtype_as_str(term), term.name());
- log().debug("{1} {2}\n", objtype_as_str(term), term.name());
+ log().fatal(MF_2_ADDING_1_2_TO_TERMINAL_LIST, termtype_as_str(term),
+ term.name());
+ log().debug("{1} {2}\n", termtype_as_str(term), term.name());
}
void setup_t::register_link_arr(const pstring &terms)
{
- plib::pstring_vector_t list(terms,", ");
+ std::vector<pstring> list(plib::psplit(terms,", "));
if (list.size() < 2)
- log().fatal("You must pass at least 2 terminals to NET_C");
+ log().fatal(MF_2_NET_C_NEEDS_AT_LEAST_2_TERMINAL);
for (std::size_t i = 1; i < list.size(); i++)
{
register_link(list[0], list[i]);
@@ -245,7 +239,7 @@ void setup_t::remove_connections(const pstring pin)
link++;
}
if (!found)
- log().fatal("remove_connections: found no occurrence of {1}\n", pin);
+ log().fatal(MF_1_FOUND_NO_OCCURRENCE_OF_1, pin);
}
@@ -274,7 +268,7 @@ void setup_t::register_frontier(const pstring attach, const double r_IN, const d
}
}
if (!found)
- log().fatal("Frontier setup: found no occurrence of {1}\n", attach);
+ log().fatal(MF_1_FOUND_NO_OCCURRENCE_OF_1, attach);
register_link(attach, frontier_name + ".Q");
}
@@ -292,11 +286,13 @@ void setup_t::register_param(const pstring &param, const pstring &value)
if (idx == m_param_values.end())
{
if (!m_param_values.insert({fqn, value}).second)
- log().fatal("Unexpected error adding parameter {1} to parameter list\n", param);
+ log().fatal(MF_1_ADDING_PARAMETER_1_TO_PARAMETER_LIST,
+ param);
}
else
{
- log().warning("Overwriting {1} old <{2}> new <{3}>\n", fqn, idx->second, value);
+ log().warning(MW_3_OVERWRITING_PARAM_1_OLD_2_NEW_3, fqn, idx->second,
+ value);
m_param_values[fqn] = value;
}
}
@@ -331,32 +327,32 @@ detail::core_terminal_t *setup_t::find_terminal(const pstring &terminal_in, bool
detail::core_terminal_t *term = (ret == m_terminals.end() ? nullptr : ret->second);
if (term == nullptr && required)
- log().fatal("terminal {1}({2}) not found!\n", terminal_in, tname);
+ log().fatal(MF_2_TERMINAL_1_2_NOT_FOUND, terminal_in, tname);
if (term != nullptr)
log().debug("Found input {1}\n", tname);
return term;
}
detail::core_terminal_t *setup_t::find_terminal(const pstring &terminal_in,
- detail::device_object_t::type_t atype, bool required)
+ detail::terminal_type atype, bool required)
{
const pstring &tname = resolve_alias(terminal_in);
auto ret = m_terminals.find(tname);
/* look for default */
- if (ret == m_terminals.end() && atype == detail::device_object_t::OUTPUT)
+ if (ret == m_terminals.end() && atype == detail::terminal_type::OUTPUT)
{
/* look for ".Q" std output */
ret = m_terminals.find(tname + ".Q");
}
if (ret == m_terminals.end() && required)
- log().fatal("terminal {1}({2}) not found!\n", terminal_in, tname);
+ log().fatal(MF_2_TERMINAL_1_2_NOT_FOUND, terminal_in, tname);
detail::core_terminal_t *term = (ret == m_terminals.end() ? nullptr : ret->second);
if (term != nullptr && term->type() != atype)
{
if (required)
- log().fatal("object {1}({2}) found but wrong type\n", terminal_in, tname);
+ log().fatal(MF_2_OBJECT_1_2_WRONG_TYPE, terminal_in, tname);
else
term = nullptr;
}
@@ -373,18 +369,17 @@ param_t *setup_t::find_param(const pstring &param_in, bool required) const
const pstring &outname = resolve_alias(param_in_fqn);
auto ret = m_params.find(outname);
if (ret == m_params.end() && required)
- log().fatal("parameter {1}({2}) not found!\n", param_in_fqn, outname);
+ log().fatal(MF_2_PARAMETER_1_2_NOT_FOUND, param_in_fqn, outname);
if (ret != m_params.end())
log().debug("Found parameter {1}\n", outname);
return (ret == m_params.end() ? nullptr : &ret->second.m_param);
}
-// FIXME avoid dynamic cast here
devices::nld_base_proxy *setup_t::get_d_a_proxy(detail::core_terminal_t &out)
{
nl_assert(out.is_logic());
- logic_output_t &out_cast = dynamic_cast<logic_output_t &>(out);
+ logic_output_t &out_cast = static_cast<logic_output_t &>(out);
devices::nld_base_proxy *proxy = out_cast.get_proxy();
if (proxy == nullptr)
@@ -403,7 +398,8 @@ devices::nld_base_proxy *setup_t::get_d_a_proxy(detail::core_terminal_t &out)
{
p->clear_net(); // de-link from all nets ...
if (!connect(new_proxy->proxy_term(), *p))
- log().fatal("Error connecting {1} to {2}\n", new_proxy->proxy_term().name(), (*p).name());
+ log().fatal(MF_2_CONNECTING_1_TO_2,
+ new_proxy->proxy_term().name(), (*p).name());
}
out.net().m_core_terms.clear(); // clear the list
@@ -437,7 +433,6 @@ devices::nld_base_proxy *setup_t::get_a_d_proxy(detail::core_terminal_t &inp)
auto ret = new_proxy.get();
-#if 1
/* connect all existing terminals to new net */
if (inp.has_net())
@@ -446,18 +441,12 @@ devices::nld_base_proxy *setup_t::get_a_d_proxy(detail::core_terminal_t &inp)
{
p->clear_net(); // de-link from all nets ...
if (!connect(ret->proxy_term(), *p))
- log().fatal("Error connecting {1} to {2}\n", ret->proxy_term().name(), (*p).name());
+ log().fatal(MF_2_CONNECTING_1_TO_2,
+ ret->proxy_term().name(), (*p).name());
}
inp.net().m_core_terms.clear(); // clear the list
}
ret->out().net().add_terminal(inp);
-#else
- if (inp.has_net())
- //fatalerror("logic inputs can only belong to one net!\n");
- merge_nets(ret->out().net(), inp.net());
- else
- ret->out().net().add_terminal(inp);
-#endif
netlist().register_dev(std::move(new_proxy));
return ret;
}
@@ -465,19 +454,20 @@ devices::nld_base_proxy *setup_t::get_a_d_proxy(detail::core_terminal_t &inp)
void setup_t::merge_nets(detail::net_t &thisnet, detail::net_t &othernet)
{
- netlist().log().debug("merging nets ...\n");
+ log().debug("merging nets ...\n");
if (&othernet == &thisnet)
{
- netlist().log().warning("Connecting {1} to itself. This may be right, though\n", thisnet.name());
+ log().warning(MW_1_CONNECTING_1_TO_ITSELF, thisnet.name());
return; // Nothing to do
}
if (thisnet.isRailNet() && othernet.isRailNet())
- netlist().log().fatal("Trying to merge two rail nets: {1} and {2}\n", thisnet.name(), othernet.name());
+ log().fatal(MF_2_MERGE_RAIL_NETS_1_AND_2,
+ thisnet.name(), othernet.name());
if (othernet.isRailNet())
{
- netlist().log().debug("othernet is railnet\n");
+ log().debug("othernet is railnet\n");
merge_nets(othernet, thisnet);
}
else
@@ -521,7 +511,8 @@ void setup_t::connect_terminal_input(terminal_t &term, detail::core_terminal_t &
}
else if (inp.is_logic())
{
- netlist().log().verbose("connect terminal {1} (in, {2}) to {3}\n", inp.name(), pstring(inp.is_analog() ? "analog" : inp.is_logic() ? "logic" : "?"), term.name());
+ log().verbose("connect terminal {1} (in, {2}) to {3}\n", inp.name(),
+ inp.is_analog() ? pstring("analog") : inp.is_logic() ? pstring("logic") : pstring("?"), term.name());
auto proxy = get_a_d_proxy(inp);
//out.net().register_con(proxy->proxy_term());
@@ -530,7 +521,7 @@ void setup_t::connect_terminal_input(terminal_t &term, detail::core_terminal_t &
}
else
{
- log().fatal("Netlist: Severe Error");
+ log().fatal(MF_1_OBJECT_INPUT_TYPE_1, inp.name());
}
}
@@ -554,7 +545,7 @@ void setup_t::connect_terminal_output(terminal_t &in, detail::core_terminal_t &o
}
else
{
- log().fatal("Netlist: Severe Error");
+ log().fatal(MF_1_OBJECT_OUTPUT_TYPE_1, out.name());
}
}
@@ -609,7 +600,7 @@ bool setup_t::connect_input_input(detail::core_terminal_t &t1, detail::core_term
{
for (auto & t : t1.net().m_core_terms)
{
- if (t->is_type(detail::core_terminal_t::TERMINAL))
+ if (t->is_type(detail::terminal_type::TERMINAL))
ret = connect(t2, *t);
if (ret)
break;
@@ -624,7 +615,7 @@ bool setup_t::connect_input_input(detail::core_terminal_t &t1, detail::core_term
{
for (auto & t : t2.net().m_core_terms)
{
- if (t->is_type(detail::core_terminal_t::TERMINAL))
+ if (t->is_type(detail::terminal_type::TERMINAL))
ret = connect(t1, *t);
if (ret)
break;
@@ -643,39 +634,39 @@ bool setup_t::connect(detail::core_terminal_t &t1_in, detail::core_terminal_t &t
detail::core_terminal_t &t2 = resolve_proxy(t2_in);
bool ret = true;
- if (t1.is_type(detail::core_terminal_t::OUTPUT) && t2.is_type(detail::core_terminal_t::INPUT))
+ if (t1.is_type(detail::terminal_type::OUTPUT) && t2.is_type(detail::terminal_type::INPUT))
{
if (t2.has_net() && t2.net().isRailNet())
- log().fatal("Input {1} already connected\n", t2.name());
+ log().fatal(MF_1_INPUT_1_ALREADY_CONNECTED, t2.name());
connect_input_output(t2, t1);
}
- else if (t1.is_type(detail::core_terminal_t::INPUT) && t2.is_type(detail::core_terminal_t::OUTPUT))
+ else if (t1.is_type(detail::terminal_type::INPUT) && t2.is_type(detail::terminal_type::OUTPUT))
{
if (t1.has_net() && t1.net().isRailNet())
- log().fatal("Input {1} already connected\n", t1.name());
+ log().fatal(MF_1_INPUT_1_ALREADY_CONNECTED, t1.name());
connect_input_output(t1, t2);
}
- else if (t1.is_type(detail::core_terminal_t::OUTPUT) && t2.is_type(detail::core_terminal_t::TERMINAL))
+ else if (t1.is_type(detail::terminal_type::OUTPUT) && t2.is_type(detail::terminal_type::TERMINAL))
{
connect_terminal_output(dynamic_cast<terminal_t &>(t2), t1);
}
- else if (t1.is_type(detail::core_terminal_t::TERMINAL) && t2.is_type(detail::core_terminal_t::OUTPUT))
+ else if (t1.is_type(detail::terminal_type::TERMINAL) && t2.is_type(detail::terminal_type::OUTPUT))
{
connect_terminal_output(dynamic_cast<terminal_t &>(t1), t2);
}
- else if (t1.is_type(detail::core_terminal_t::INPUT) && t2.is_type(detail::core_terminal_t::TERMINAL))
+ else if (t1.is_type(detail::terminal_type::INPUT) && t2.is_type(detail::terminal_type::TERMINAL))
{
connect_terminal_input(dynamic_cast<terminal_t &>(t2), t1);
}
- else if (t1.is_type(detail::core_terminal_t::TERMINAL) && t2.is_type(detail::core_terminal_t::INPUT))
+ else if (t1.is_type(detail::terminal_type::TERMINAL) && t2.is_type(detail::terminal_type::INPUT))
{
connect_terminal_input(dynamic_cast<terminal_t &>(t1), t2);
}
- else if (t1.is_type(detail::core_terminal_t::TERMINAL) && t2.is_type(detail::core_terminal_t::TERMINAL))
+ else if (t1.is_type(detail::terminal_type::TERMINAL) && t2.is_type(detail::terminal_type::TERMINAL))
{
connect_terminals(dynamic_cast<terminal_t &>(t1), dynamic_cast<terminal_t &>(t2));
}
- else if (t1.is_type(detail::core_terminal_t::INPUT) && t2.is_type(detail::core_terminal_t::INPUT))
+ else if (t1.is_type(detail::terminal_type::INPUT) && t2.is_type(detail::terminal_type::INPUT))
{
ret = connect_input_input(t1, t2);
}
@@ -693,8 +684,8 @@ void setup_t::resolve_inputs()
* We therefore first park connecting inputs and retry
* after all other terminals were connected.
*/
- int tries = 100;
- while (m_links.size() > 0 && tries > 0) // FIXME: convert into constant
+ int tries = NL_MAX_LINK_RESOLVE_LOOPS;
+ while (m_links.size() > 0 && tries > 0)
{
for (auto li = m_links.begin(); li != m_links.end(); )
@@ -714,9 +705,9 @@ void setup_t::resolve_inputs()
if (tries == 0)
{
for (auto & link : m_links)
- log().warning("Error connecting {1} to {2}\n", link.first, link.second);
+ log().warning(MF_2_CONNECTING_1_TO_2, link.first, link.second);
- log().fatal("Error connecting -- bailing out\n");
+ log().fatal(MF_0_LINK_TRIES_EXCEEDED);
}
log().verbose("deleting empty nets ...");
@@ -743,38 +734,26 @@ void setup_t::resolve_inputs()
{
detail::core_terminal_t *term = i.second;
if (!term->has_net() && dynamic_cast< devices::NETLIB_NAME(dummy_input) *>(&term->device()) != nullptr)
- log().warning("Found dummy terminal {1} without connections", term->name());
+ log().warning(MW_1_DUMMY_1_WITHOUT_CONNECTIONS, term->name());
else if (!term->has_net())
errstr += plib::pfmt("Found terminal {1} without a net\n")(term->name());
else if (term->net().num_cons() == 0)
- log().warning("Found terminal {1} without connections", term->name());
+ log().warning(MW_1_TERMINAL_1_WITHOUT_CONNECTIONS, term->name());
}
+ //FIXME: error string handling
if (errstr != "")
log().fatal("{1}", errstr);
-
- log().verbose("looking for two terms connected to rail nets ...");
- for (auto & t : netlist().get_device_list<analog::NETLIB_NAME(twoterm)>())
- {
- if (t->m_N.net().isRailNet() && t->m_P.net().isRailNet())
- {
- log().warning("Found device {1} connected only to railterminals {2}/{3}. Will be removed",
- t->name(), t->m_N.net().name(), t->m_P.net().name());
- t->m_N.net().remove_terminal(t->m_N);
- t->m_P.net().remove_terminal(t->m_P);
- netlist().remove_dev(t);
- }
- }
}
void setup_t::start_devices()
{
- pstring env = plib::util::environment("NL_LOGS");
+ pstring env = plib::util::environment("NL_LOGS", "");
if (env != "")
{
log().debug("Creating dynamic logs ...");
- plib::pstring_vector_t loglist(env, ":");
+ std::vector<pstring> loglist(plib::psplit(env, ":"));
for (pstring ll : loglist)
{
pstring name = "log_" + ll;
@@ -800,7 +779,7 @@ const plib::plog_base<NL_DEBUG> &setup_t::log() const
// Model
// ----------------------------------------------------------------------------------------
-static pstring model_string(model_map_t &map)
+static pstring model_string(detail::model_map_t &map)
{
pstring ret = map["COREMODEL"] + "(";
for (auto & i : map)
@@ -809,7 +788,7 @@ static pstring model_string(model_map_t &map)
return ret + ")";
}
-void setup_t::model_parse(const pstring &model_in, model_map_t &map)
+void setup_t::model_parse(const pstring &model_in, detail::model_map_t &map)
{
pstring model = model_in;
pstring::iterator pos(nullptr);
@@ -823,7 +802,7 @@ void setup_t::model_parse(const pstring &model_in, model_map_t &map)
key = model.ucase();
auto i = m_models.find(key);
if (i == m_models.end())
- log().fatal("Model {1} not found\n", model);
+ log().fatal(MF_1_MODEL_NOT_FOUND, model);
model = i->second;
}
pstring xmodel = model.left(pos);
@@ -836,40 +815,41 @@ void setup_t::model_parse(const pstring &model_in, model_map_t &map)
if (i != m_models.end())
model_parse(xmodel, map);
else
- log().fatal("Model doesn't exist: <{1}>\n", model_in);
+ log().fatal(MF_1_MODEL_NOT_FOUND, model_in);
}
pstring remainder=model.substr(pos+1).trim();
if (!remainder.endsWith(")"))
- log().fatal("Model error {1}\n", model);
+ log().fatal(MF_1_MODEL_ERROR_1, model);
// FIMXE: Not optimal
remainder = remainder.left(remainder.begin() + (remainder.len() - 1));
- plib::pstring_vector_t pairs(remainder," ", true);
+ std::vector<pstring> pairs(plib::psplit(remainder," ", true));
for (pstring &pe : pairs)
{
auto pose = pe.find("=");
if (pose == pe.end())
- log().fatal("Model error on pair {1}\n", model);
+ log().fatal(MF_1_MODEL_ERROR_ON_PAIR_1, model);
map[pe.left(pose).ucase()] = pe.substr(pose+1);
}
}
-const pstring setup_t::model_value_str(model_map_t &map, const pstring &entity)
+const pstring setup_t::model_value_str(detail::model_map_t &map, const pstring &entity)
{
pstring ret;
if (entity != entity.ucase())
- log().fatal("model parameters should be uppercase:{1} {2}\n", entity, model_string(map));
+ log().fatal(MF_2_MODEL_PARAMETERS_NOT_UPPERCASE_1_2, entity,
+ model_string(map));
if (map.find(entity) == map.end())
- log().fatal("Entity {1} not found in model {2}\n", entity, model_string(map));
+ log().fatal(MF_2_ENTITY_1_NOT_FOUND_IN_MODEL_2, entity, model_string(map));
else
ret = map[entity];
return ret;
}
-nl_double setup_t::model_value(model_map_t &map, const pstring &entity)
+nl_double setup_t::model_value(detail::model_map_t &map, const pstring &entity)
{
pstring tmp = model_value_str(map, entity);
@@ -887,16 +867,67 @@ nl_double setup_t::model_value(model_map_t &map, const pstring &entity)
case 'a': factor = 1e-18; break;
default:
if (*p < '0' || *p > '9')
- nl_exception(plib::pfmt("Unknown number factor in: {1}")(entity));
+ log().fatal(MF_1_UNKNOWN_NUMBER_FACTOR_IN_1, entity);
}
if (factor != NL_FCONST(1.0))
tmp = tmp.left(tmp.begin() + (tmp.len() - 1));
return tmp.as_double() * factor;
}
-void setup_t::tt_factory_create(tt_desc &desc)
+class logic_family_std_proxy_t : public logic_family_desc_t
+{
+public:
+ logic_family_std_proxy_t() { }
+ virtual plib::owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_t &anetlist,
+ const pstring &name, logic_output_t *proxied) const override;
+ virtual plib::owned_ptr<devices::nld_base_a_to_d_proxy> create_a_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *proxied) const override;
+};
+
+plib::owned_ptr<devices::nld_base_d_to_a_proxy> logic_family_std_proxy_t::create_d_a_proxy(netlist_t &anetlist,
+ const pstring &name, logic_output_t *proxied) const
+{
+ return plib::owned_ptr<devices::nld_base_d_to_a_proxy>::Create<devices::nld_d_to_a_proxy>(anetlist, name, proxied);
+}
+plib::owned_ptr<devices::nld_base_a_to_d_proxy> logic_family_std_proxy_t::create_a_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *proxied) const
+{
+ return plib::owned_ptr<devices::nld_base_a_to_d_proxy>::Create<devices::nld_a_to_d_proxy>(anetlist, name, proxied);
+}
+
+
+const logic_family_desc_t *setup_t::family_from_model(const pstring &model)
{
- devices::tt_factory_create(*this, desc);
+ detail::model_map_t map;
+ model_parse(model, map);
+
+ if (model_value_str(map, "TYPE") == "TTL")
+ return family_TTL();
+ if (model_value_str(map, "TYPE") == "CD4XXX")
+ return family_CD4XXX();
+
+ for (auto & e : netlist().m_family_cache)
+ if (e.first == model)
+ return e.second.get();
+
+ auto ret = plib::make_unique_base<logic_family_desc_t, logic_family_std_proxy_t>();
+
+ ret->m_fixed_V = model_value(map, "FV");
+ ret->m_low_thresh_PCNT = model_value(map, "IVL");
+ ret->m_high_thresh_PCNT = model_value(map, "IVH");
+ ret->m_low_VO = model_value(map, "OVL");
+ ret->m_high_VO = model_value(map, "OVH");
+ ret->m_R_low = model_value(map, "ORL");
+ ret->m_R_high = model_value(map, "ORH");
+
+ auto retp = ret.get();
+
+ netlist().m_family_cache.emplace_back(model, std::move(ret));
+
+ return retp;
+}
+
+void setup_t::tt_factory_create(tt_desc &desc, const pstring &sourcefile)
+{
+ devices::tt_factory_create(*this, desc, sourcefile);
}
@@ -911,7 +942,7 @@ void setup_t::include(const pstring &netlist_name)
if (source->parse(netlist_name))
return;
}
- log().fatal("unable to find {1} in source collection", netlist_name);
+ log().fatal(MF_1_NOT_FOUND_IN_SOURCE_COLLECTION, netlist_name);
}
std::unique_ptr<plib::pistream> setup_t::get_data_stream(const pstring name)
@@ -925,18 +956,21 @@ std::unique_ptr<plib::pistream> setup_t::get_data_stream(const pstring name)
return strm;
}
}
- //log().fatal("unable to find data named {1} in source collection", name);
- log().warning("unable to find data named {1} in source collection", name);
+ log().warning(MW_1_DATA_1_NOT_FOUND, name);
return std::unique_ptr<plib::pistream>(nullptr);
}
-bool setup_t::parse_stream(plib::pistream &istrm, const pstring &name)
+bool setup_t::parse_stream(plib::putf8_reader &istrm, const pstring &name)
{
plib::pomemstream ostrm;
+ plib::putf8_writer owrt(ostrm);
- plib::pimemstream istrm2(plib::ppreprocessor(&m_defines).process(istrm, ostrm));
- return parser_t(istrm2, *this).parse(name);
+ plib::ppreprocessor(&m_defines).process(istrm, owrt);
+
+ plib::pimemstream istrm2(ostrm);
+ plib::putf8_reader reader2(istrm2);
+ return parser_t(reader2, *this).parse(name);
}
void setup_t::register_define(pstring defstr)
@@ -957,7 +991,11 @@ bool source_t::parse(const pstring &name)
if (m_type != SOURCE)
return false;
else
- return m_setup.parse_stream(*stream(name), name);
+ {
+ auto rstream = stream(name);
+ plib::putf8_reader reader(*rstream);
+ return m_setup.parse_stream(reader, name);
+ }
}
std::unique_ptr<plib::pistream> source_string_t::stream(const pstring &name)
diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h
index 798ba8f4140..e9fc0861328 100644
--- a/src/lib/netlist/nl_setup.h
+++ b/src/lib/netlist/nl_setup.h
@@ -8,19 +8,18 @@
#ifndef NLSETUP_H_
#define NLSETUP_H_
-#include <memory>
-#include <stack>
-#include <unordered_map>
-#include <vector>
-
#include "plib/pstring.h"
-#include "plib/pfmtlog.h"
-#include "plib/pstream.h"
#include "plib/putil.h"
+#include "plib/pstream.h"
#include "plib/pparser.h"
-#include "nl_config.h"
-#include "nl_base.h"
+
#include "nl_factory.h"
+#include "nl_config.h"
+#include "netlist_types.h"
+
+#include <stack>
+#include <vector>
+#include <memory>
//============================================================
// MACROS / inline netlist definitions
@@ -71,7 +70,7 @@ void NETLIST_NAME(name)(netlist::setup_t &setup) \
#define LOCAL_LIB_ENTRY(name) \
LOCAL_SOURCE(name) \
- setup.register_lib_entry(# name);
+ setup.register_lib_entry(# name, __FILE__);
#define INCLUDE(name) \
setup.include(# name);
@@ -81,6 +80,9 @@ void NETLIST_NAME(name)(netlist::setup_t &setup) \
NETLIST_NAME(model)(setup); \
setup.namespace_pop();
+#define OPTIMIZE_FRONTIER(attach, r_in, r_out) \
+ setup.register_frontier(# attach, r_in, r_out);
+
// -----------------------------------------------------------------------------
// truthtable defines
// -----------------------------------------------------------------------------
@@ -105,12 +107,29 @@ void NETLIST_NAME(name)(netlist::setup_t &setup) \
desc.family = x;
#define TRUTHTABLE_END() \
- netlist::devices::tt_factory_create(setup, desc); \
+ setup.tt_factory_create(desc, __FILE__); \
}
namespace netlist
{
+
+ namespace detail {
+ class core_terminal_t;
+ class net_t;
+ }
+
+ namespace devices {
+ class nld_base_proxy;
+ }
+
+ class core_device_t;
+ class param_t;
+ class setup_t;
+ class netlist_t;
+ class logic_family_desc_t;
+ class terminal_t;
+
// -----------------------------------------------------------------------------
// truthtable desc
// -----------------------------------------------------------------------------
@@ -122,7 +141,7 @@ namespace netlist
unsigned long ni;
unsigned long no;
pstring def_param;
- plib::pstring_vector_t desc;
+ std::vector<pstring> desc;
pstring family;
};
@@ -178,9 +197,8 @@ namespace netlist
// ----------------------------------------------------------------------------------------
- class setup_t
+ class setup_t : plib::nocopyassignmove
{
- P_PREVENT_COPYING(setup_t)
public:
using link_t = std::pair<pstring, pstring>;
@@ -202,7 +220,7 @@ namespace netlist
void register_dev(const pstring &classname, const pstring &name);
- void register_lib_entry(const pstring &name);
+ void register_lib_entry(const pstring &name, const pstring &sourcefile);
void register_model(const pstring &model_in);
void register_alias(const pstring &alias, const pstring &out);
@@ -241,7 +259,7 @@ namespace netlist
std::unique_ptr<plib::pistream> get_data_stream(const pstring name);
- bool parse_stream(plib::pistream &istrm, const pstring &name);
+ bool parse_stream(plib::putf8_reader &istrm, const pstring &name);
/* register a source */
@@ -258,14 +276,14 @@ namespace netlist
/* model / family related */
- const pstring model_value_str(model_map_t &map, const pstring &entity);
- nl_double model_value(model_map_t &map, const pstring &entity);
+ const pstring model_value_str(detail::model_map_t &map, const pstring &entity);
+ double model_value(detail::model_map_t &map, const pstring &entity);
- void model_parse(const pstring &model, model_map_t &map);
+ void model_parse(const pstring &model, detail::model_map_t &map);
- /* FIXME: truth table trampoline */
+ const logic_family_desc_t *family_from_model(const pstring &model);
- void tt_factory_create(tt_desc &desc);
+ void tt_factory_create(tt_desc &desc, const pstring &sourcefile);
/* helper - also used by nltool */
const pstring resolve_alias(const pstring &name) const;
@@ -280,7 +298,7 @@ namespace netlist
std::unordered_map<pstring, detail::core_terminal_t *> m_terminals;
/* needed by proxy */
- detail::core_terminal_t *find_terminal(const pstring &outname_in, detail::device_object_t::type_t atype, bool required = true);
+ detail::core_terminal_t *find_terminal(const pstring &outname_in, const detail::terminal_type atype, bool required = true);
private:
@@ -295,7 +313,7 @@ namespace netlist
bool connect_input_input(detail::core_terminal_t &t1, detail::core_terminal_t &t2);
// helpers
- pstring objtype_as_str(detail::device_object_t &in) const;
+ pstring termtype_as_str(detail::core_terminal_t &in) const;
devices::nld_base_proxy *get_d_a_proxy(detail::core_terminal_t &out);
devices::nld_base_proxy *get_a_d_proxy(detail::core_terminal_t &inp);
@@ -312,7 +330,7 @@ namespace netlist
unsigned m_proxy_cnt;
unsigned m_frontier_cnt;
- };
+};
// ----------------------------------------------------------------------------------------
// base sources
@@ -353,7 +371,7 @@ namespace netlist
{
public:
source_mem_t(setup_t &setup, const char *mem)
- : source_t(setup), m_str(mem)
+ : source_t(setup), m_str(mem, pstring::UTF8)
{
}
diff --git a/src/lib/netlist/nl_time.h b/src/lib/netlist/nl_time.h
index 4edc9524a43..7706555f995 100644
--- a/src/lib/netlist/nl_time.h
+++ b/src/lib/netlist/nl_time.h
@@ -10,6 +10,7 @@
#include <cstdint>
#include "nl_config.h"
+#include "plib/ptypes.h"
#include "plib/pstate.h"
//============================================================
@@ -45,82 +46,83 @@ namespace netlist
constexpr explicit ptime(const internal_type nom, const internal_type den) noexcept
: m_time(nom * (resolution / den)) { }
- ptime &operator=(const ptime rhs) { m_time = rhs.m_time; return *this; }
+ ptime &operator=(const ptime rhs) noexcept { m_time = rhs.m_time; return *this; }
- ptime &operator+=(const ptime &rhs) { m_time += rhs.m_time; return *this; }
- ptime &operator-=(const ptime &rhs) { m_time -= rhs.m_time; return *this; }
+ ptime &operator+=(const ptime &rhs) noexcept { m_time += rhs.m_time; return *this; }
+ ptime &operator-=(const ptime &rhs) noexcept { m_time -= rhs.m_time; return *this; }
- friend ptime operator-(ptime lhs, const ptime &rhs)
+ friend constexpr ptime operator-(const ptime &lhs, const ptime &rhs) noexcept
{
- lhs -= rhs;
- return lhs;
+ return ptime(lhs.m_time - rhs.m_time);
}
- friend ptime operator+(ptime lhs, const ptime &rhs)
+ friend constexpr ptime operator+(const ptime &lhs, const ptime &rhs) noexcept
{
- lhs += rhs;
- return lhs;
+ return ptime(lhs.m_time + rhs.m_time);
}
- friend ptime operator*(ptime lhs, const mult_type factor)
+ friend constexpr ptime operator*(const ptime &lhs, const mult_type factor) noexcept
{
- lhs.m_time *= static_cast<internal_type>(factor);
- return lhs;
+ return ptime(lhs.m_time * static_cast<internal_type>(factor));
}
- friend mult_type operator/(const ptime &lhs, const ptime &rhs)
+ friend constexpr mult_type operator/(const ptime &lhs, const ptime &rhs) noexcept
{
return static_cast<mult_type>(lhs.m_time / rhs.m_time);
}
- friend bool operator<(const ptime &lhs, const ptime &rhs)
+ friend constexpr bool operator<(const ptime &lhs, const ptime &rhs) noexcept
{
return (lhs.m_time < rhs.m_time);
}
- friend bool operator>(const ptime &lhs, const ptime &rhs)
+ friend constexpr bool operator>(const ptime &lhs, const ptime &rhs) noexcept
{
return (rhs < lhs);
}
- friend bool operator<=(const ptime &lhs, const ptime &rhs)
+ friend constexpr bool operator<=(const ptime &lhs, const ptime &rhs) noexcept
{
return !(lhs > rhs);
}
- friend bool operator>=(const ptime &lhs, const ptime &rhs)
+ friend constexpr bool operator>=(const ptime &lhs, const ptime &rhs) noexcept
{
return !(lhs < rhs);
}
- friend bool operator==(const ptime &lhs, const ptime &rhs)
+ friend constexpr bool operator==(const ptime &lhs, const ptime &rhs) noexcept
{
return lhs.m_time == rhs.m_time;
}
- friend bool operator!=(const ptime &lhs, const ptime &rhs)
+ friend constexpr bool operator!=(const ptime &lhs, const ptime &rhs) noexcept
{
return !(lhs == rhs);
}
- constexpr internal_type as_raw() const { return m_time; }
- constexpr double as_double() const { return static_cast<double>(m_time)
- / static_cast<double>(resolution); }
+ constexpr internal_type as_raw() const noexcept { return m_time; }
+ constexpr double as_double() const noexcept
+ {
+ return static_cast<double>(m_time)
+ / static_cast<double>(resolution);
+ }
// for save states ....
- internal_type *get_internaltype_ptr() { return &m_time; }
-
- static constexpr ptime from_nsec(const internal_type ns) { return ptime(ns, UINT64_C(1000000000)); }
- static constexpr ptime from_usec(const internal_type us) { return ptime(us, UINT64_C(1000000)); }
- static constexpr ptime from_msec(const internal_type ms) { return ptime(ms, UINT64_C(1000)); }
- static constexpr ptime from_hz(const internal_type hz) { return ptime(1 , hz); }
- static constexpr ptime from_raw(const internal_type raw) { return ptime(raw, resolution); }
- static constexpr ptime from_double(const double t) { return ptime(static_cast<internal_type>( t * static_cast<double>(resolution)), resolution); }
-
- static constexpr ptime zero() { return ptime(0, resolution); }
- static constexpr ptime quantum() { return ptime(1, resolution); }
- static constexpr ptime never() { return ptime(plib::numeric_limits<internal_type>::max(), resolution); }
+ internal_type *get_internaltype_ptr() noexcept { return &m_time; }
+
+ static constexpr ptime from_nsec(const internal_type ns) noexcept { return ptime(ns, UINT64_C(1000000000)); }
+ static constexpr ptime from_usec(const internal_type us) noexcept { return ptime(us, UINT64_C(1000000)); }
+ static constexpr ptime from_msec(const internal_type ms) noexcept { return ptime(ms, UINT64_C(1000)); }
+ static constexpr ptime from_hz(const internal_type hz) noexcept { return ptime(1 , hz); }
+ static constexpr ptime from_raw(const internal_type raw) noexcept { return ptime(raw); }
+ static constexpr ptime from_double(const double t) noexcept { return ptime(static_cast<internal_type>( t * static_cast<double>(resolution)), resolution); }
+
+ static constexpr ptime zero() noexcept { return ptime(0, resolution); }
+ static constexpr ptime quantum() noexcept { return ptime(1, resolution); }
+ static constexpr ptime never() noexcept { return ptime(plib::numeric_limits<internal_type>::max(), resolution); }
private:
+ constexpr explicit ptime(const internal_type time) : m_time(time) {}
internal_type m_time;
};
diff --git a/src/lib/netlist/plib/palloc.cpp b/src/lib/netlist/plib/palloc.cpp
index 2f1131601da..ceee5a75904 100644
--- a/src/lib/netlist/plib/palloc.cpp
+++ b/src/lib/netlist/plib/palloc.cpp
@@ -5,8 +5,6 @@
*
*/
-#include <cstdio>
-
#include "pconfig.h"
#include "palloc.h"
#include "pfmtlog.h"
diff --git a/src/lib/netlist/plib/palloc.h b/src/lib/netlist/plib/palloc.h
index 2d223180b3d..2e4c2809048 100644
--- a/src/lib/netlist/plib/palloc.h
+++ b/src/lib/netlist/plib/palloc.h
@@ -10,9 +10,6 @@
#include <vector>
#include <memory>
-#include <utility>
-
-#include "pconfig.h"
#include "pstring.h"
namespace plib {
@@ -31,7 +28,7 @@ template<typename T>
void pfree(T *ptr) { delete ptr; }
template<typename T>
-inline T* palloc_array(std::size_t num)
+inline T* palloc_array(const std::size_t num)
{
return new T[num]();
}
diff --git a/src/lib/netlist/plib/pchrono.h b/src/lib/netlist/plib/pchrono.h
index e37cd995ab5..5d64f9c4add 100644
--- a/src/lib/netlist/plib/pchrono.h
+++ b/src/lib/netlist/plib/pchrono.h
@@ -9,7 +9,6 @@
#define PCHRONO_H_
#include <cstdint>
-#include <thread>
#include <chrono>
#include "pconfig.h"
diff --git a/src/lib/netlist/plib/pconfig.h b/src/lib/netlist/plib/pconfig.h
index f2164bbde7f..e3870206cbd 100644
--- a/src/lib/netlist/plib/pconfig.h
+++ b/src/lib/netlist/plib/pconfig.h
@@ -8,10 +8,6 @@
#ifndef PCONFIG_H_
#define PCONFIG_H_
-#include <cstdint>
-#include <thread>
-#include <chrono>
-
/*
* Define this for more accurate measurements if you processor supports
* RDTSCP.
@@ -41,6 +37,9 @@ typedef __int128_t INT128;
#endif
#if defined(__GNUC__)
+#ifdef RESTRICT
+#undef RESTRICT
+#endif
#define RESTRICT __restrict__
#define ATTR_UNUSED __attribute__((__unused__))
#else
@@ -52,16 +51,17 @@ typedef __int128_t INT128;
// Standard defines
//============================================================
-// prevent implicit copying
-#define P_PREVENT_COPYING(name) \
- private: \
- name(const name &); \
- name &operator=(const name &);
-
//============================================================
-// cut down delegate implementation
+// Pointer to Member Function
//============================================================
+// This will be autodetected
+// #define PPMF_TYPE 0
+
+#define PPMF_TYPE_PMF 0
+#define PPMF_TYPE_GNUC_PMF_CONV 1
+#define PPMF_TYPE_INTERNAL 2
+
#if defined(__GNUC__)
/* does not work in versions over 4.7.x of 32bit MINGW */
#if defined(__MINGW32__) && !defined(__x86_64) && defined(__i386__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)))
@@ -86,66 +86,12 @@ typedef __int128_t INT128;
#define MEMBER_ABI
#endif
-namespace plib {
-/*
- * The following class was derived from the MAME delegate.h code.
- * It derives a pointer to a member function.
- */
-
-#if (PHAS_PMF_INTERNAL)
- class mfp
- {
- public:
- // construct from any member function pointer
- class generic_class;
- using generic_function = void (*)();
-
- template<typename MemberFunctionType>
- mfp(MemberFunctionType mftp)
- : m_function(0), m_this_delta(0)
- {
- *reinterpret_cast<MemberFunctionType *>(this) = mftp;
- }
-
- // binding helper
- template<typename FunctionType, typename ObjectType>
- FunctionType update_after_bind(ObjectType *object)
- {
- return reinterpret_cast<FunctionType>(
- convert_to_generic(reinterpret_cast<generic_class *>(object)));
- }
- template<typename FunctionType, typename MemberFunctionType, typename ObjectType>
- static FunctionType get_mfp(MemberFunctionType mftp, ObjectType *object)
- {
- mfp mfpo(mftp);
- return mfpo.update_after_bind<FunctionType>(object);
- }
-
- private:
- // extract the generic function and adjust the object pointer
- generic_function convert_to_generic(generic_class * object) const
- {
- // apply the "this" delta to the object first
- generic_class * o_p_delta = reinterpret_cast<generic_class *>(reinterpret_cast<std::uint8_t *>(object) + m_this_delta);
-
- // if the low bit of the vtable index is clear, then it is just a raw function pointer
- if (!(m_function & 1))
- return reinterpret_cast<generic_function>(m_function);
-
- // otherwise, it is the byte index into the vtable where the actual function lives
- std::uint8_t *vtable_base = *reinterpret_cast<std::uint8_t **>(o_p_delta);
- return *reinterpret_cast<generic_function *>(vtable_base + m_function - 1);
- }
-
- // actual state
- uintptr_t m_function; // first item can be one of two things:
- // if even, it's a pointer to the function
- // if odd, it's the byte offset into the vtable
- int m_this_delta; // delta to apply to the 'this' pointer
- };
-
+#ifndef PPMF_TYPE
+ #if PHAS_PMF_INTERNAL
+ #define PPMF_TYPE PPMF_TYPE_INTERNAL
+ #else
+ #define PPMF_TYPE PPMF_TYPE_PMF
+ #endif
#endif
-}
-
#endif /* PCONFIG_H_ */
diff --git a/src/lib/netlist/plib/pdynlib.h b/src/lib/netlist/plib/pdynlib.h
index e91b86e3a82..3a0c12a5f2d 100644
--- a/src/lib/netlist/plib/pdynlib.h
+++ b/src/lib/netlist/plib/pdynlib.h
@@ -7,10 +7,6 @@
#ifndef PDYNLIB_H_
#define PDYNLIB_H_
-#include <cstdarg>
-#include <cstddef>
-
-#include "pconfig.h"
#include "pstring.h"
namespace plib {
diff --git a/src/lib/netlist/plib/pexception.cpp b/src/lib/netlist/plib/pexception.cpp
index 2eedd6f9d16..282acfe30d5 100644
--- a/src/lib/netlist/plib/pexception.cpp
+++ b/src/lib/netlist/plib/pexception.cpp
@@ -11,9 +11,9 @@
#include "pfmtlog.h"
#if (defined(__x86_64__) || defined(__i386__)) && defined(__linux__)
-#define HAS_FEENABLE_EXCEPT (1)
+#define HAS_FEENABLE_EXCEPT (1)
#else
-#define HAS_FEENABLE_EXCEPT (0)
+#define HAS_FEENABLE_EXCEPT (0)
#endif
namespace plib {
diff --git a/src/lib/netlist/plib/pexception.h b/src/lib/netlist/plib/pexception.h
index a4d3b3c498f..9ef3077a75d 100644
--- a/src/lib/netlist/plib/pexception.h
+++ b/src/lib/netlist/plib/pexception.h
@@ -10,7 +10,6 @@
#include <exception>
-#include "pconfig.h"
#include "pstring.h"
namespace plib {
diff --git a/src/lib/netlist/plib/pfmtlog.cpp b/src/lib/netlist/plib/pfmtlog.cpp
index 48b0f1544c1..9451e11866d 100644
--- a/src/lib/netlist/plib/pfmtlog.cpp
+++ b/src/lib/netlist/plib/pfmtlog.cpp
@@ -6,11 +6,8 @@
*/
#include <cstring>
-//FIXME:: pstring should be locale free
-#include <cctype>
#include <cstdlib>
-#include <cstdio>
-
+#include <cstdarg>
#include <algorithm>
#include "pfmtlog.h"
@@ -22,7 +19,7 @@ plog_dispatch_intf::~plog_dispatch_intf()
{
}
-pfmt::pfmt(const pstring &fmt)
+pfmt::pfmt(const pstring fmt)
: m_str(m_str_buf), m_allocated(0), m_arg(0)
{
std::size_t l = fmt.blen() + 1;
@@ -34,18 +31,6 @@ pfmt::pfmt(const pstring &fmt)
memcpy(m_str, fmt.c_str(), l);
}
-pfmt::pfmt(const char *fmt)
-: m_str(m_str_buf), m_allocated(0), m_arg(0)
-{
- std::size_t l = strlen(fmt) + 1;
- if (l>sizeof(m_str_buf))
- {
- m_allocated = 2 * l;
- m_str = palloc_array<char>(2 * l);
- }
- memcpy(m_str, fmt, l);
-}
-
pfmt::~pfmt()
{
if (m_allocated > 0)
diff --git a/src/lib/netlist/plib/pfmtlog.h b/src/lib/netlist/plib/pfmtlog.h
index c5369109b81..681607bddc0 100644
--- a/src/lib/netlist/plib/pfmtlog.h
+++ b/src/lib/netlist/plib/pfmtlog.h
@@ -9,12 +9,19 @@
#include <limits>
-#include "pconfig.h"
#include "pstring.h"
#include "ptypes.h"
namespace plib {
+P_ENUM(plog_level,
+ DEBUG,
+ INFO,
+ VERBOSE,
+ WARNING,
+ ERROR,
+ FATAL)
+
template <typename T>
struct ptype_traits_base
{
@@ -157,13 +164,12 @@ protected:
class pfmt : public pformat_base<pfmt>
{
public:
- explicit pfmt(const pstring &fmt);
- explicit pfmt(const char *fmt);
+ explicit pfmt(const pstring fmt);
virtual ~pfmt();
- operator pstring() const { return m_str; }
+ operator pstring() const { return pstring(m_str, pstring::UTF8); }
- const char *cstr() { return m_str; }
+ const char *c_str() { return m_str; }
protected:
@@ -177,54 +183,53 @@ private:
unsigned m_arg;
};
-P_ENUM(plog_level,
- DEBUG,
- INFO,
- VERBOSE,
- WARNING,
- ERROR,
- FATAL)
-
class plog_dispatch_intf;
template <bool build_enabled = true>
-class pfmt_writer_t
+class pfmt_writer_t : plib::nocopyassignmove
{
public:
- pfmt_writer_t() : m_enabled(true) { }
+ explicit pfmt_writer_t() : m_enabled(true) { }
virtual ~pfmt_writer_t() { }
- void operator ()(const char *fmt) const
+ /* runtime enable */
+ template<bool enabled, typename... Args>
+ void log(const pstring fmt, Args&&... args) const
+ {
+ if (build_enabled && enabled && m_enabled) (*this)(fmt, std::forward<Args>(args)...);
+ }
+
+ void operator ()(const pstring fmt) const
{
if (build_enabled && m_enabled) vdowrite(fmt);
}
template<typename T1>
- void operator ()(const char *fmt, const T1 &v1) const
+ void operator ()(const pstring fmt, const T1 &v1) const
{
if (build_enabled && m_enabled) vdowrite(pfmt(fmt)(v1));
}
template<typename T1, typename T2>
- void operator ()(const char *fmt, const T1 &v1, const T2 &v2) const
+ void operator ()(const pstring fmt, const T1 &v1, const T2 &v2) const
{
if (build_enabled && m_enabled) vdowrite(pfmt(fmt)(v1)(v2));
}
template<typename T1, typename T2, typename T3>
- void operator ()(const char *fmt, const T1 &v1, const T2 &v2, const T3 &v3) const
+ void operator ()(const pstring fmt, const T1 &v1, const T2 &v2, const T3 &v3) const
{
if (build_enabled && m_enabled) vdowrite(pfmt(fmt)(v1)(v2)(v3));
}
template<typename T1, typename T2, typename T3, typename T4>
- void operator ()(const char *fmt, const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4) const
+ void operator ()(const pstring fmt, const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4) const
{
if (build_enabled && m_enabled) vdowrite(pfmt(fmt)(v1)(v2)(v3)(v4));
}
template<typename T1, typename T2, typename T3, typename T4, typename T5>
- void operator ()(const char *fmt, const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4, const T5 &v5) const
+ void operator ()(const pstring fmt, const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4, const T5 &v5) const
{
if (build_enabled && m_enabled) vdowrite(pfmt(fmt)(v1)(v2)(v3)(v4)(v5));
}
@@ -237,18 +242,18 @@ public:
bool is_enabled() const { return m_enabled; }
protected:
- virtual void vdowrite(const pstring &ls) const {}
+ virtual void vdowrite(const pstring &ls) const = 0;
private:
bool m_enabled;
};
-template <plog_level::e L, bool build_enabled = true>
+template <plog_level::E L, bool build_enabled = true>
class plog_channel : public pfmt_writer_t<build_enabled>
{
public:
- explicit plog_channel(plog_dispatch_intf *b) : pfmt_writer_t<build_enabled>(), m_base(b) { }
+ explicit plog_channel(plog_dispatch_intf *b) : pfmt_writer_t<build_enabled>(), m_base(b) { }
virtual ~plog_channel() { }
protected:
@@ -260,7 +265,7 @@ private:
class plog_dispatch_intf
{
- template<plog_level::e, bool> friend class plog_channel;
+ template<plog_level::E, bool> friend class plog_channel;
public:
virtual ~plog_dispatch_intf();
@@ -292,7 +297,7 @@ public:
};
-template <plog_level::e L, bool build_enabled>
+template <plog_level::E L, bool build_enabled>
void plog_channel<L, build_enabled>::vdowrite(const pstring &ls) const
{
m_base->vlog(L, ls);
diff --git a/src/lib/netlist/plib/pfunction.cpp b/src/lib/netlist/plib/pfunction.cpp
new file mode 100644
index 00000000000..b457c940021
--- /dev/null
+++ b/src/lib/netlist/plib/pfunction.cpp
@@ -0,0 +1,212 @@
+// license:GPL-2.0+
+// copyright-holders:Couriersud
+/*
+ * palloc.c
+ *
+ */
+
+#include <cmath>
+#include <stack>
+#include "pfunction.h"
+#include "pfmtlog.h"
+#include "putil.h"
+#include "pexception.h"
+
+namespace plib {
+
+void pfunction::compile(const std::vector<pstring> &inputs, const pstring expr)
+{
+ if (expr.startsWith("rpn:"))
+ compile_postfix(inputs, expr.substr(4));
+ else
+ compile_infix(inputs, expr);
+}
+
+void pfunction::compile_postfix(const std::vector<pstring> &inputs, const pstring expr)
+{
+ std::vector<pstring> cmds(plib::psplit(expr, " "));
+ compile_postfix(inputs, cmds, expr);
+}
+
+void pfunction::compile_postfix(const std::vector<pstring> &inputs,
+ const std::vector<pstring> &cmds, const pstring expr)
+{
+ m_precompiled.clear();
+ int stk = 0;
+
+ for (const pstring &cmd : cmds)
+ {
+ rpn_inst rc;
+ if (cmd == "+")
+ { rc.m_cmd = ADD; stk -= 1; }
+ else if (cmd == "-")
+ { rc.m_cmd = SUB; stk -= 1; }
+ else if (cmd == "*")
+ { rc.m_cmd = MULT; stk -= 1; }
+ else if (cmd == "/")
+ { rc.m_cmd = DIV; stk -= 1; }
+ else if (cmd == "pow")
+ { rc.m_cmd = POW; stk -= 1; }
+ else if (cmd == "sin")
+ { rc.m_cmd = SIN; stk -= 0; }
+ else if (cmd == "cos")
+ { rc.m_cmd = COS; stk -= 0; }
+ else
+ {
+ for (unsigned i = 0; i < inputs.size(); i++)
+ {
+ if (inputs[i] == cmd)
+ {
+ rc.m_cmd = PUSH_INPUT;
+ rc.m_param = i;
+ stk += 1;
+ break;
+ }
+ }
+ if (rc.m_cmd != PUSH_INPUT)
+ {
+ bool err = false;
+ rc.m_cmd = PUSH_CONST;
+ rc.m_param = cmd.as_double(&err);
+ if (err)
+ throw plib::pexception(plib::pfmt("nld_function: unknown/misformatted token <{1}> in <{2}>")(cmd)(expr));
+ stk += 1;
+ }
+ }
+ if (stk < 1)
+ throw plib::pexception(plib::pfmt("nld_function: stack underflow on token <{1}> in <{2}>")(cmd)(expr));
+ m_precompiled.push_back(rc);
+ }
+ if (stk != 1)
+ throw plib::pexception(plib::pfmt("nld_function: stack count different to one on <{2}>")(expr));
+}
+
+static int get_prio(pstring v)
+{
+ if (v == "(" || v == ")")
+ return 1;
+ else if (v.left(v.begin()+1) >= "a" && v.left(v.begin()+1) <= "z")
+ return 0;
+ else if (v == "*" || v == "/")
+ return 20;
+ else if (v == "+" || v == "-")
+ return 10;
+ else if (v == "^")
+ return 30;
+ else
+ return -1;
+}
+
+static pstring pop_check(std::stack<pstring> &stk, const pstring &expr)
+{
+ if (stk.size() == 0)
+ throw plib::pexception(plib::pfmt("nld_function: stack underflow during infix parsing of: <{1}>")(expr));
+ pstring res = stk.top();
+ stk.pop();
+ return res;
+}
+
+void pfunction::compile_infix(const std::vector<pstring> &inputs, const pstring expr)
+{
+ // Shunting-yard infix parsing
+ std::vector<pstring> sep = {"(", ")", ",", "*", "/", "+", "-", "^"};
+ std::vector<pstring> sexpr(plib::psplit(expr.replace(" ",""), sep));
+ std::stack<pstring> opstk;
+ std::vector<pstring> postfix;
+
+ //printf("dbg: %s\n", expr.c_str());
+ for (unsigned i = 0; i < sexpr.size(); i++)
+ {
+ pstring &s = sexpr[i];
+ if (s=="(")
+ opstk.push(s);
+ else if (s==")")
+ {
+ pstring x = pop_check(opstk, expr);
+ while (x != "(")
+ {
+ postfix.push_back(x);
+ x = pop_check(opstk, expr);
+ }
+ if (opstk.size() > 0 && get_prio(opstk.top()) == 0)
+ postfix.push_back(pop_check(opstk, expr));
+ }
+ else if (s==",")
+ {
+ pstring x = pop_check(opstk, expr);
+ while (x != "(")
+ {
+ postfix.push_back(x);
+ x = pop_check(opstk, expr);
+ }
+ opstk.push(x);
+ }
+ else {
+ int p = get_prio(s);
+ if (p>0)
+ {
+ if (opstk.size() == 0)
+ opstk.push(s);
+ else
+ {
+ if (get_prio(opstk.top()) >= get_prio(s))
+ postfix.push_back(pop_check(opstk, expr));
+ opstk.push(s);
+ }
+ }
+ else if (p == 0) // Function or variable
+ {
+ if (sexpr[i+1] == "(")
+ opstk.push(s);
+ else
+ postfix.push_back(s);
+ }
+ else
+ postfix.push_back(s);
+ }
+ }
+ while (opstk.size() > 0)
+ {
+ postfix.push_back(opstk.top());
+ opstk.pop();
+ }
+ compile_postfix(inputs, postfix, expr);
+}
+
+
+#define ST1 stack[ptr]
+#define ST2 stack[ptr-1]
+
+#define OP(OP, ADJ, EXPR) \
+case OP: \
+ ptr-=ADJ; \
+ stack[ptr-1] = EXPR; \
+ break;
+
+double pfunction::evaluate(const std::vector<double> &values)
+{
+ double stack[20];
+ unsigned ptr = 0;
+ for (auto &rc : m_precompiled)
+ {
+ switch (rc.m_cmd)
+ {
+ OP(ADD, 1, ST2 + ST1)
+ OP(MULT, 1, ST2 * ST1)
+ OP(SUB, 1, ST2 - ST1)
+ OP(DIV, 1, ST2 / ST1)
+ OP(POW, 1, std::pow(ST2, ST1))
+ OP(SIN, 0, std::sin(ST2));
+ OP(COS, 0, std::cos(ST2));
+ case PUSH_INPUT:
+ stack[ptr++] = values[static_cast<unsigned>(rc.m_param)];
+ break;
+ case PUSH_CONST:
+ stack[ptr++] = rc.m_param;
+ break;
+ }
+ }
+ return stack[ptr-1];
+}
+
+}
diff --git a/src/lib/netlist/plib/pfunction.h b/src/lib/netlist/plib/pfunction.h
new file mode 100644
index 00000000000..da61fe84e17
--- /dev/null
+++ b/src/lib/netlist/plib/pfunction.h
@@ -0,0 +1,87 @@
+// license:GPL-2.0+
+// copyright-holders:Couriersud
+/*
+ * pfunction.h
+ *
+ */
+
+#ifndef PFUNCTION_H_
+#define PFUNCTION_H_
+
+#include <vector>
+
+#include "pstring.h"
+
+namespace plib {
+
+ //============================================================
+ // function evaluation
+ //============================================================
+
+ /*! Class providing support for evaluating expressions
+ *
+ */
+ class pfunction
+ {
+ enum rpn_cmd
+ {
+ ADD,
+ MULT,
+ SUB,
+ DIV,
+ POW,
+ SIN,
+ COS,
+ PUSH_CONST,
+ PUSH_INPUT
+ };
+ struct rpn_inst
+ {
+ rpn_inst() : m_cmd(ADD), m_param(0.0) { }
+ rpn_cmd m_cmd;
+ double m_param;
+ };
+ public:
+ pfunction()
+ {
+ }
+
+ /*! Compile an expression
+ *
+ * @param inputs Vector of input variables, e.g. {"A","B"}
+ * @param expr infix or postfix expression. default is infix, postrix
+ * to be prefixed with rpn, e.g. "rpn:A B + 1.3 /"
+ */
+ void compile(const std::vector<pstring> &inputs, const pstring expr);
+
+ /*! Compile a rpn expression
+ *
+ * @param inputs Vector of input variables, e.g. {"A","B"}
+ * @param expr Reverse polish notation expression, e.g. "A B + 1.3 /"
+ */
+ void compile_postfix(const std::vector<pstring> &inputs, const pstring expr);
+ /*! Compile an infix expression
+ *
+ * @param inputs Vector of input variables, e.g. {"A","B"}
+ * @param expr Infix expression, e.g. "(A+B)/1.3"
+ */
+ void compile_infix(const std::vector<pstring> &inputs, const pstring expr);
+ /*! Evaluate the expression
+ *
+ * @param values for input variables, e.g. {1.1, 2.2}
+ * @return value of expression
+ */
+ double evaluate(const std::vector<double> &values);
+
+ private:
+
+ void compile_postfix(const std::vector<pstring> &inputs,
+ const std::vector<pstring> &cmds, const pstring expr);
+
+ std::vector<rpn_inst> m_precompiled; //!< precompiled expression
+ };
+
+
+}
+
+#endif /* PEXCEPTION_H_ */
diff --git a/src/lib/netlist/plib/plists.h b/src/lib/netlist/plib/plists.h
index 37f4e2a1391..c6ba2821790 100644
--- a/src/lib/netlist/plib/plists.h
+++ b/src/lib/netlist/plib/plists.h
@@ -10,10 +10,7 @@
#ifndef PLISTS_H_
#define PLISTS_H_
-#include <algorithm>
#include <vector>
-#include <type_traits>
-#include <cmath>
#include "pstring.h"
@@ -56,6 +53,7 @@ public:
template<typename... Args>
void emplace(const std::size_t index, Args&&... args)
{
+ // allocate on buffer
new (&m_buf[index]) C(std::forward<Args>(args)...);
}
diff --git a/src/lib/netlist/plib/poptions.cpp b/src/lib/netlist/plib/poptions.cpp
index a14d4ae93e7..775ee6d8810 100644
--- a/src/lib/netlist/plib/poptions.cpp
+++ b/src/lib/netlist/plib/poptions.cpp
@@ -39,13 +39,13 @@ namespace plib {
{
}
- int option_str::parse(pstring argument)
+ int option_str::parse(const pstring &argument)
{
m_val = argument;
return 0;
}
- int option_str_limit::parse(pstring argument)
+ int option_str_limit::parse(const pstring &argument)
{
if (plib::container::contains(m_limit, argument))
{
@@ -56,20 +56,27 @@ namespace plib {
return 1;
}
- int option_bool::parse(ATTR_UNUSED pstring argument)
+ int option_bool::parse(const pstring &argument)
{
m_val = true;
return 0;
}
- int option_double::parse(pstring argument)
+ int option_double::parse(const pstring &argument)
{
bool err = false;
m_val = argument.as_double(&err);
return (err ? 1 : 0);
}
- int option_vec::parse(pstring argument)
+ int option_long::parse(const pstring &argument)
+ {
+ bool err = false;
+ m_val = argument.as_long(&err);
+ return (err ? 1 : 0);
+ }
+
+ int option_vec::parse(const pstring &argument)
{
bool err = false;
m_val.push_back(argument);
@@ -102,18 +109,18 @@ namespace plib {
int options::parse(int argc, char *argv[])
{
- m_app = argv[0];
+ m_app = pstring(argv[0], pstring::UTF8);
for (int i=1; i<argc; )
{
- pstring arg(argv[i]);
+ pstring arg(argv[i], pstring::UTF8);
option *opt = nullptr;
pstring opt_arg;
bool has_equal_arg = false;
if (arg.startsWith("--"))
{
- auto v = pstring_vector_t(arg.substr(2),"=");
+ auto v = psplit(arg.substr(2),"=");
opt = getopt_long(v[0]);
has_equal_arg = (v.size() > 1);
if (has_equal_arg)
@@ -148,7 +155,7 @@ namespace plib {
else
{
i++; // FIXME: are there more arguments?
- if (opt->parse(argv[i]) != 0)
+ if (opt->parse(pstring(argv[i], pstring::UTF8)) != 0)
return i - 1;
}
}
@@ -166,13 +173,13 @@ namespace plib {
pstring options::split_paragraphs(pstring text, unsigned width, unsigned indent,
unsigned firstline_indent)
{
- auto paragraphs = pstring_vector_t(text,"\n");
+ auto paragraphs = psplit(text,"\n");
pstring ret("");
for (auto &p : paragraphs)
{
pstring line = pstring("").rpad(" ", firstline_indent);
- for (auto &s : pstring_vector_t(p, " "))
+ for (auto &s : psplit(p, " "))
{
if (line.len() + s.len() > width)
{
diff --git a/src/lib/netlist/plib/poptions.h b/src/lib/netlist/plib/poptions.h
index aa5ce07cbc8..f859b2f5b3d 100644
--- a/src/lib/netlist/plib/poptions.h
+++ b/src/lib/netlist/plib/poptions.h
@@ -10,8 +10,6 @@
#ifndef POPTIONS_H_
#define POPTIONS_H_
-#include <cstddef>
-
#include "pstring.h"
#include "plists.h"
#include "putil.h"
@@ -67,7 +65,7 @@ public:
/* no_argument options will be called with "" argument */
- virtual int parse(ATTR_UNUSED pstring argument) = 0;
+ virtual int parse(const pstring &argument) = 0;
pstring short_opt() { return m_short; }
pstring long_opt() { return m_long; }
@@ -85,7 +83,7 @@ public:
: option(parent, ashort, along, help, true), m_val(defval)
{}
- virtual int parse(pstring argument) override;
+ virtual int parse(const pstring &argument) override;
pstring operator ()() { return m_val; }
private:
@@ -96,17 +94,19 @@ class option_str_limit : public option
{
public:
option_str_limit(options &parent, pstring ashort, pstring along, pstring defval, pstring limit, pstring help)
- : option(parent, ashort, along, help, true), m_val(defval), m_limit(limit, ":")
- {}
+ : option(parent, ashort, along, help, true), m_val(defval)
+ {
+ m_limit = plib::psplit(limit, ":");
+ }
- virtual int parse(pstring argument) override;
+ virtual int parse(const pstring &argument) override;
pstring operator ()() { return m_val; }
- const plib::pstring_vector_t &limit() { return m_limit; }
+ const std::vector<pstring> &limit() { return m_limit; }
private:
pstring m_val;
- plib::pstring_vector_t m_limit;
+ std::vector<pstring> m_limit;
};
class option_bool : public option
@@ -116,7 +116,7 @@ public:
: option(parent, ashort, along, help, false), m_val(false)
{}
- virtual int parse(ATTR_UNUSED pstring argument) override;
+ virtual int parse(const pstring &argument) override;
bool operator ()() { return m_val; }
private:
@@ -130,13 +130,27 @@ public:
: option(parent, ashort, along, help, true), m_val(defval)
{}
- virtual int parse(pstring argument) override;
+ virtual int parse(const pstring &argument) override;
double operator ()() { return m_val; }
private:
double m_val;
};
+class option_long : public option
+{
+public:
+ option_long(options &parent, pstring ashort, pstring along, long defval, pstring help)
+ : option(parent, ashort, along, help, true), m_val(defval)
+ {}
+
+ virtual int parse(const pstring &argument) override;
+
+ long operator ()() { return m_val; }
+private:
+ long m_val;
+};
+
class option_vec : public option
{
public:
@@ -144,7 +158,7 @@ public:
: option(parent, ashort, along, help, true)
{}
- virtual int parse(pstring argument) override;
+ virtual int parse(const pstring &argument) override;
std::vector<pstring> operator ()() { return m_val; }
private:
diff --git a/src/lib/netlist/plib/pparser.cpp b/src/lib/netlist/plib/pparser.cpp
index 35629aacdee..6604c07dcb7 100644
--- a/src/lib/netlist/plib/pparser.cpp
+++ b/src/lib/netlist/plib/pparser.cpp
@@ -8,14 +8,15 @@
#include <cstdarg>
#include "pparser.h"
-#include "plib/palloc.h"
+#include "palloc.h"
+#include "putil.h"
namespace plib {
// ----------------------------------------------------------------------------------------
// A simple tokenizer
// ----------------------------------------------------------------------------------------
-ptokenizer::ptokenizer(pistream &strm)
+ptokenizer::ptokenizer(plib::putf8_reader &strm)
: m_strm(strm), m_lineno(0), m_cur_line(""), m_px(m_cur_line.begin()), m_unget(0), m_string('"')
{
}
@@ -302,7 +303,7 @@ void ppreprocessor::error(const pstring &err)
-double ppreprocessor::expr(const pstring_vector_t &sexpr, std::size_t &start, int prio)
+double ppreprocessor::expr(const std::vector<pstring> &sexpr, std::size_t &start, int prio)
{
double val;
pstring tok=sexpr[start];
@@ -383,7 +384,7 @@ ppreprocessor::define_t *ppreprocessor::get_define(const pstring &name)
pstring ppreprocessor::replace_macros(const pstring &line)
{
- pstring_vector_t elems(line, m_expr_sep);
+ std::vector<pstring> elems(psplit(line, m_expr_sep));
pstringbuffer ret = "";
for (auto & elem : elems)
{
@@ -396,7 +397,7 @@ pstring ppreprocessor::replace_macros(const pstring &line)
return ret;
}
-static pstring catremainder(const pstring_vector_t &elems, std::size_t start, pstring sep)
+static pstring catremainder(const std::vector<pstring> &elems, std::size_t start, pstring sep)
{
pstringbuffer ret = "";
for (auto & elem : elems)
@@ -415,13 +416,13 @@ pstring ppreprocessor::process_line(const pstring &line)
// FIXME ... revise and extend macro handling
if (lt.startsWith("#"))
{
- pstring_vector_t lti(lt, " ", true);
+ std::vector<pstring> lti(psplit(lt, " ", true));
if (lti[0].equals("#if"))
{
m_level++;
std::size_t start = 0;
lt = replace_macros(lt);
- pstring_vector_t t(lt.substr(3).replace(" ",""), m_expr_sep);
+ std::vector<pstring> t(psplit(lt.substr(3).replace(" ",""), m_expr_sep));
int val = static_cast<int>(expr(t, start, 0));
if (val == 0)
m_ifflag |= (1 << m_level);
@@ -483,7 +484,7 @@ pstring ppreprocessor::process_line(const pstring &line)
}
-postream & ppreprocessor::process_i(pistream &istrm, postream &ostrm)
+void ppreprocessor::process(putf8_reader &istrm, putf8_writer &ostrm)
{
pstring line;
while (istrm.readline(line))
@@ -491,7 +492,6 @@ postream & ppreprocessor::process_i(pistream &istrm, postream &ostrm)
line = process_line(line);
ostrm.writeline(line);
}
- return ostrm;
}
}
diff --git a/src/lib/netlist/plib/pparser.h b/src/lib/netlist/plib/pparser.h
index db88299d85c..321dad2f608 100644
--- a/src/lib/netlist/plib/pparser.h
+++ b/src/lib/netlist/plib/pparser.h
@@ -11,18 +11,16 @@
#include <unordered_map>
#include <cstdint>
-#include "pconfig.h"
#include "pstring.h"
#include "plists.h"
-#include "putil.h"
+//#include "putil.h"
#include "pstream.h"
namespace plib {
-class ptokenizer
+class ptokenizer : nocopyassignmove
{
- P_PREVENT_COPYING(ptokenizer)
public:
- explicit ptokenizer(pistream &strm);
+ explicit ptokenizer(plib::putf8_reader &strm);
virtual ~ptokenizer();
@@ -126,7 +124,7 @@ private:
bool eof() { return m_strm.eof(); }
- pistream &m_strm;
+ putf8_reader &m_strm;
int m_lineno;
pstring m_cur_line;
@@ -148,9 +146,8 @@ private:
};
-class ppreprocessor
+class ppreprocessor : plib::nocopyassignmove
{
- P_PREVENT_COPYING(ppreprocessor)
public:
struct define_t
@@ -165,22 +162,12 @@ public:
ppreprocessor(std::vector<define_t> *defines = nullptr);
virtual ~ppreprocessor() {}
- template<class ISTR, class OSTR>
- OSTR &process(ISTR &istrm, OSTR &ostrm)
- {
- return dynamic_cast<OSTR &>(process_i(istrm, ostrm));
- }
+ void process(putf8_reader &istrm, putf8_writer &ostrm);
protected:
-
- postream &process_i(pistream &istrm, postream &ostrm);
-
- double expr(const plib::pstring_vector_t &sexpr, std::size_t &start, int prio);
-
+ double expr(const std::vector<pstring> &sexpr, std::size_t &start, int prio);
define_t *get_define(const pstring &name);
-
pstring replace_macros(const pstring &line);
-
virtual void error(const pstring &err);
private:
@@ -188,9 +175,9 @@ private:
pstring process_line(const pstring &line);
std::unordered_map<pstring, define_t> m_defines;
- plib::pstring_vector_t m_expr_sep;
+ std::vector<pstring> m_expr_sep;
- std::uint_least32_t m_ifflag; // 31 if levels
+ std::uint_least64_t m_ifflag; // 31 if levels
int m_level;
int m_lineno;
};
diff --git a/src/lib/netlist/plib/ppmf.h b/src/lib/netlist/plib/ppmf.h
new file mode 100644
index 00000000000..03a2a65baa4
--- /dev/null
+++ b/src/lib/netlist/plib/ppmf.h
@@ -0,0 +1,198 @@
+// license:GPL-2.0+
+// copyright-holders:Couriersud
+/*
+ * ppmf.h
+ *
+ */
+
+#ifndef PPMF_H_
+#define PPMF_H_
+
+#include "pconfig.h"
+#include <utility>
+#include <cstdint>
+
+
+/*
+ *
+ * NL_PMF_TYPE_GNUC_PMF
+ * Use standard pointer to member function syntax C++11
+ *
+ * NL_PMF_TYPE_GNUC_PMF_CONV
+ * Use gnu extension and convert the pmf to a function pointer.
+ * This is not standard compliant and needs
+ * -Wno-pmf-conversions to compile.
+ *
+ * NL_PMF_TYPE_INTERNAL
+ * Use the same approach as MAME for deriving the function pointer.
+ * This is compiler-dependent as well
+ *
+ * Benchmarks for ./nltool -c run -f src/mame/machine/nl_pong.cpp -t 10 -n pong_fast
+ *
+ * NL_PMF_TYPE_INTERNAL: 215% 215%
+ * NL_PMF_TYPE_GNUC_PMF: 163% 196%
+ * NL_PMF_TYPE_GNUC_PMF_CONV: 215% 215%
+ * NL_PMF_TYPE_VIRTUAL: 213% 209%
+ *
+ * The whole exercise was done to avoid virtual calls. In prior versions of
+ * netlist, the INTERNAL and GNUC_PMF_CONV approach provided significant improvement.
+ * Since than, "hot" was removed from functions declared as virtual.
+ * This may explain that the recent benchmarks show no difference at all.
+ *
+ */
+
+#if (PPMF_TYPE == PPMF_TYPE_GNUC_PMF_CONV)
+#pragma GCC diagnostic ignored "-Wpmf-conversions"
+#endif
+
+namespace plib {
+/*
+ * The following class was derived from the MAME delegate.h code.
+ * It derives a pointer to a member function.
+ */
+
+#if (PHAS_PMF_INTERNAL)
+ class mfp
+ {
+ public:
+ // construct from any member function pointer
+ class generic_class;
+ using generic_function = void (*)();
+
+ template<typename MemberFunctionType>
+ mfp(MemberFunctionType mftp)
+ : m_function(0), m_this_delta(0)
+ {
+ *reinterpret_cast<MemberFunctionType *>(this) = mftp;
+ }
+
+ template<typename FunctionType, typename MemberFunctionType, typename ObjectType>
+ static FunctionType get_mfp(MemberFunctionType mftp, ObjectType *object)
+ {
+ mfp mfpo(mftp);
+ //return mfpo.update_after_bind<FunctionType>(object);
+ return reinterpret_cast<FunctionType>(
+ mfpo.convert_to_generic(reinterpret_cast<generic_class *>(object)));
+ }
+
+ private:
+ // extract the generic function and adjust the object pointer
+ generic_function convert_to_generic(generic_class * object) const
+ {
+ // apply the "this" delta to the object first
+ generic_class * o_p_delta = reinterpret_cast<generic_class *>(reinterpret_cast<std::uint8_t *>(object) + m_this_delta);
+
+ // if the low bit of the vtable index is clear, then it is just a raw function pointer
+ if (!(m_function & 1))
+ return reinterpret_cast<generic_function>(m_function);
+
+ // otherwise, it is the byte index into the vtable where the actual function lives
+ std::uint8_t *vtable_base = *reinterpret_cast<std::uint8_t **>(o_p_delta);
+ return *reinterpret_cast<generic_function *>(vtable_base + m_function - 1);
+ }
+
+ // actual state
+ uintptr_t m_function; // first item can be one of two things:
+ // if even, it's a pointer to the function
+ // if odd, it's the byte offset into the vtable
+ int m_this_delta; // delta to apply to the 'this' pointer
+ };
+#endif
+
+#if (PPMF_TYPE == PPMF_TYPE_PMF)
+ template<typename R, typename... Targs>
+ class pmfp_base
+ {
+ public:
+ class generic_class;
+#if defined (__INTEL_COMPILER) && defined (_M_X64) // needed for "Intel(R) C++ Intel(R) 64 Compiler XE for applications running on Intel(R) 64, Version 14.0.2.176 Build 20140130" at least
+ using generic_function = int [((sizeof(void *) + 4 * sizeof(int)) + (sizeof(int) - 1)) / sizeof(int)];
+#elif defined(_MSC_VER)// all other cases - for MSVC maximum size is one pointer, plus 3 ints; all other implementations seem to be smaller
+ using generic_function = int [((sizeof(void *) + 3 * sizeof(int)) + (sizeof(int) - 1)) / sizeof(int)];
+#else
+ using generic_function = R (generic_class::*)(Targs...);
+#endif
+ pmfp_base() {}
+
+ template<typename MemberFunctionType, typename O>
+ void set_base(MemberFunctionType mftp, O *object)
+ {
+ using function_ptr = R (O::*)(Targs...);
+ function_ptr t = mftp;
+ *reinterpret_cast<function_ptr *>(&m_func) = t;
+ }
+ template<typename O>
+ inline R call(O *obj, Targs... args)
+ {
+ using function_ptr = R (O::*)(Targs...);
+ function_ptr t = *reinterpret_cast<function_ptr *>(&m_func);
+ return (obj->*t)(std::forward<Targs>(args)...);
+ }
+ private:
+ generic_function m_func;
+ };
+
+#elif ((PPMF_TYPE == PPMF_TYPE_GNUC_PMF_CONV) || (PPMF_TYPE == PPMF_TYPE_INTERNAL))
+ template<typename R, typename... Targs>
+ class pmfp_base
+ {
+ public:
+ using generic_function = void (*)();
+
+ pmfp_base() : m_func(nullptr) {}
+
+ template<typename MemberFunctionType, typename O>
+ void set_base(MemberFunctionType mftp, O *object)
+ {
+ #if (PPMF_TYPE == PPMF_TYPE_INTERNAL)
+ using function_ptr = MEMBER_ABI R (*)(O *obj, Targs... args);
+ m_func = reinterpret_cast<generic_function>(plib::mfp::get_mfp<function_ptr>(mftp, object));
+ #elif (PPMF_TYPE == PPMF_TYPE_GNUC_PMF_CONV)
+ R (O::* pFunc)(Targs...) = mftp;
+ m_func = reinterpret_cast<generic_function>((object->*pFunc));
+ #endif
+ }
+ template<typename O>
+ inline R call(O *obj, Targs... args) const
+ {
+ using function_ptr = MEMBER_ABI R (*)(O *obj, Targs... args);
+ return (reinterpret_cast<function_ptr>(m_func))(obj, std::forward<Targs>(args)...);
+ }
+ bool is_set() { return m_func != nullptr; }
+ private:
+ generic_function m_func;
+ };
+#endif
+
+ template<typename R, typename... Targs>
+ class pmfp : public pmfp_base<R, Targs...>
+ {
+ public:
+ class generic_class;
+ pmfp() : pmfp_base<R, Targs...>(), m_obj(nullptr) {}
+
+ template<typename MemberFunctionType, typename O>
+ pmfp(MemberFunctionType mftp, O *object)
+ {
+ this->set(mftp, object);
+ }
+
+ template<typename MemberFunctionType, typename O>
+ void set(MemberFunctionType mftp, O *object)
+ {
+ this->set_base(mftp, object);
+ m_obj = reinterpret_cast<generic_class *>(object);
+ }
+
+ inline R operator()(Targs... args)
+ {
+ return this->call(m_obj, std::forward<Targs>(args)...);
+ }
+ private:
+ generic_class *m_obj;
+ };
+
+
+}
+
+#endif /* PPMF_H_ */
diff --git a/src/lib/netlist/plib/pstate.h b/src/lib/netlist/plib/pstate.h
index 7c25bf4d722..4256fa45152 100644
--- a/src/lib/netlist/plib/pstate.h
+++ b/src/lib/netlist/plib/pstate.h
@@ -8,13 +8,12 @@
#ifndef PSTATE_H_
#define PSTATE_H_
-#include <memory>
-#include <type_traits>
-
-#include "plists.h"
#include "pstring.h"
#include "ptypes.h"
+#include <vector>
+#include <memory>
+
// ----------------------------------------------------------------------------------------
// state saving ...
// ----------------------------------------------------------------------------------------
diff --git a/src/lib/netlist/plib/pstream.cpp b/src/lib/netlist/plib/pstream.cpp
index b05d86d7bc5..efbf2aa2374 100644
--- a/src/lib/netlist/plib/pstream.cpp
+++ b/src/lib/netlist/plib/pstream.cpp
@@ -27,28 +27,6 @@ pistream::~pistream()
{
}
-bool pistream::readline(pstring &line)
-{
- char c = 0;
- m_linebuf.clear();
- if (!this->readbyte(c))
- {
- line = "";
- return false;
- }
- while (true)
- {
- if (c == 10)
- break;
- else if (c != 13) /* ignore CR */
- m_linebuf += c;
- if (!this->readbyte(c))
- break;
- }
- line = m_linebuf;
- return true;
-}
-
// -----------------------------------------------------------------------------
// postream: output stream
// -----------------------------------------------------------------------------
@@ -367,9 +345,43 @@ pstream::pos_type pomemstream::vtell()
return m_pos;
}
-pstream_fmt_writer_t::~pstream_fmt_writer_t()
+bool putf8_reader::readline(pstring &line)
{
+ pstring::code_t c = 0;
+ m_linebuf.clear();
+ if (!this->readcode(c))
+ {
+ line = "";
+ return false;
+ }
+ while (true)
+ {
+ if (c == 10)
+ break;
+ else if (c != 13) /* ignore CR */
+ m_linebuf += pstring(c);
+ if (!this->readcode(c))
+ break;
+ }
+ line = m_linebuf;
+ return true;
}
+putf8_fmt_writer::putf8_fmt_writer(postream &strm)
+: pfmt_writer_t()
+, putf8_writer(strm)
+{
+}
+
+putf8_fmt_writer::~putf8_fmt_writer()
+{
+}
+
+void putf8_fmt_writer::vdowrite(const pstring &ls) const
+{
+ write(ls);
+}
+
+
}
diff --git a/src/lib/netlist/plib/pstream.h b/src/lib/netlist/plib/pstream.h
index 6d02c4d1551..83c514da2e1 100644
--- a/src/lib/netlist/plib/pstream.h
+++ b/src/lib/netlist/plib/pstream.h
@@ -7,9 +7,6 @@
#ifndef PSTREAM_H_
#define PSTREAM_H_
-#include <cstdarg>
-#include <cstddef>
-
#include "pconfig.h"
#include "pstring.h"
#include "pfmtlog.h"
@@ -20,9 +17,8 @@ namespace plib {
// pstream: things common to all streams
// -----------------------------------------------------------------------------
-class pstream
+class pstream : nocopyassignmove
{
- P_PREVENT_COPYING(pstream)
public:
using pos_type = std::size_t;
@@ -73,7 +69,6 @@ private:
class pistream : public pstream
{
- P_PREVENT_COPYING(pistream)
public:
explicit pistream(const unsigned flags) : pstream(flags) {}
@@ -81,15 +76,6 @@ public:
bool eof() const { return ((flags() & FLAG_EOF) != 0); }
- /* this digests linux & dos/windows text files */
-
- bool readline(pstring &line);
-
- bool readbyte(char &b)
- {
- return (read(&b, 1) == 1);
- }
-
pos_type read(void *buf, const unsigned n)
{
return vread(buf, n);
@@ -99,8 +85,6 @@ protected:
/* read up to n bytes from stream */
virtual pos_type vread(void *buf, const pos_type n) = 0;
-private:
- pstringbuffer m_linebuf;
};
// -----------------------------------------------------------------------------
@@ -109,30 +93,11 @@ private:
class postream : public pstream
{
- P_PREVENT_COPYING(postream)
public:
explicit postream(unsigned flags) : pstream(flags) {}
virtual ~postream();
- /* this digests linux & dos/windows text files */
-
- void writeline(const pstring &line)
- {
- write(line);
- write(10);
- }
-
- void write(const pstring &text)
- {
- write(text.c_str(), text.blen());
- }
-
- void write(const char c)
- {
- write(&c, 1);
- }
-
void write(const void *buf, const pos_type n)
{
vwrite(buf, n);
@@ -153,7 +118,6 @@ private:
class pomemstream : public postream
{
- P_PREVENT_COPYING(pomemstream)
public:
pomemstream();
@@ -177,8 +141,6 @@ private:
class postringstream : public postream
{
- P_PREVENT_COPYING(postringstream )
-
public:
postringstream() : postream(0) { }
@@ -205,7 +167,6 @@ private:
class pofilestream : public postream
{
- P_PREVENT_COPYING(pofilestream)
public:
explicit pofilestream(const pstring &fname);
@@ -233,7 +194,6 @@ private:
class pstderr : public pofilestream
{
- P_PREVENT_COPYING(pstderr)
public:
pstderr();
virtual ~pstderr();
@@ -245,7 +205,6 @@ public:
class pstdout : public pofilestream
{
- P_PREVENT_COPYING(pstdout)
public:
pstdout();
virtual ~pstdout();
@@ -257,7 +216,6 @@ public:
class pifilestream : public pistream
{
- P_PREVENT_COPYING(pifilestream)
public:
explicit pifilestream(const pstring &fname);
@@ -286,7 +244,6 @@ private:
class pstdin : public pifilestream
{
- P_PREVENT_COPYING(pstdin)
public:
pstdin();
@@ -299,13 +256,13 @@ public:
class pimemstream : public pistream
{
- P_PREVENT_COPYING(pimemstream)
public:
pimemstream(const void *mem, const pos_type len);
explicit pimemstream(const pomemstream &ostrm);
virtual ~pimemstream();
+ pos_type size() const { return m_len; }
protected:
/* read up to n bytes from stream */
virtual pos_type vread(void *buf, const pos_type n) override;
@@ -324,7 +281,6 @@ private:
class pistringstream : public pimemstream
{
- P_PREVENT_COPYING(pistringstream)
public:
pistringstream(const pstring &str) : pimemstream(str.c_str(), str.len()), m_str(str) { }
virtual ~pistringstream();
@@ -335,27 +291,86 @@ private:
};
// -----------------------------------------------------------------------------
-// pstream_fmt_writer_t: writer on top of ostream
+// putf8reader_t: reader on top of istream
// -----------------------------------------------------------------------------
-class pstream_fmt_writer_t : public plib::pfmt_writer_t<>
+/* this digests linux & dos/windows text files */
+
+class putf8_reader : plib::nocopyassignmove
{
- P_PREVENT_COPYING(pstream_fmt_writer_t)
public:
+ explicit putf8_reader(pistream &strm) : m_strm(strm) {}
+ virtual ~putf8_reader() {}
- explicit pstream_fmt_writer_t(postream &strm) : m_strm(strm) {}
- virtual ~pstream_fmt_writer_t();
+ bool eof() const { return m_strm.eof(); }
+ bool readline(pstring &line);
-protected:
- virtual void vdowrite(const pstring &ls) const override
+ bool readbyte1(char &b)
+ {
+ return (m_strm.read(&b, 1) == 1);
+ }
+
+ bool readcode(pstring::code_t &c)
+ {
+ char b[4];
+ if (m_strm.read(&b[0], 1) != 1)
+ return false;
+ const unsigned l = pstring::traits::codelen(b);
+ for (unsigned i = 1; i < l; i++)
+ if (m_strm.read(&b[i], 1) != 1)
+ return false;
+ c = pstring::traits::code(b);
+ return true;
+ }
+
+private:
+ pistream &m_strm;
+ pstringbuffer m_linebuf;
+};
+
+// -----------------------------------------------------------------------------
+// putf8writer_t: writer on top of ostream
+// -----------------------------------------------------------------------------
+
+class putf8_writer : plib::nocopyassignmove
+{
+public:
+ explicit putf8_writer(postream &strm) : m_strm(strm) {}
+ virtual ~putf8_writer() {}
+
+ void writeline(const pstring &line) const
{
- m_strm.write(ls);
+ write(line);
+ write(10);
+ }
+
+ void write(const pstring &text) const
+ {
+ m_strm.write(text.c_str(), text.blen());
+ }
+
+ void write(const pstring::code_t c) const
+ {
+ write(pstring(c));
}
private:
postream &m_strm;
};
+class putf8_fmt_writer : public pfmt_writer_t<>, public putf8_writer
+{
+public:
+
+ explicit putf8_fmt_writer(postream &strm);
+ virtual ~putf8_fmt_writer();
+
+protected:
+ virtual void vdowrite(const pstring &ls) const override;
+
+private:
+};
+
}
#endif /* PSTREAM_H_ */
diff --git a/src/lib/netlist/plib/pstring.cpp b/src/lib/netlist/plib/pstring.cpp
index 2506357c9a5..baeace1edb9 100644
--- a/src/lib/netlist/plib/pstring.cpp
+++ b/src/lib/netlist/plib/pstring.cpp
@@ -6,17 +6,16 @@
*/
#include <cstring>
-//FIXME:: pstring should be locale free
-#include <cctype>
-#include <cstdlib>
-#include <cstdio>
#include <algorithm>
#include <stack>
+#include <cstdlib>
#include "pstring.h"
#include "palloc.h"
#include "plists.h"
+template <typename F> pstr_t pstring_t<F>::m_zero(0);
+
template<typename F>
pstring_t<F>::~pstring_t()
{
@@ -97,14 +96,15 @@ const pstring_t<F> pstring_t<F>::substr(const iterator start, const iterator end
return ret;
}
-
template<typename F>
const pstring_t<F> pstring_t<F>::ucase() const
{
- pstring_t ret = *this;
- ret.pcopy(c_str(), blen());
- for (std::size_t i=0; i<ret.len(); i++)
- ret.m_ptr->str()[i] = static_cast<char>(toupper(static_cast<int>(ret.m_ptr->str()[i])));
+ pstring_t ret = "";
+ for (auto c : *this)
+ if (c >= 'a' && c <= 'z')
+ ret += (c - 'a' + 'A');
+ else
+ ret += c;
return ret;
}
@@ -151,7 +151,7 @@ typename pstring_t<F>::iterator pstring_t<F>::find_last_not_of(const pstring_t &
}
template<typename F>
-typename pstring_t<F>::iterator pstring_t<F>::find(const pstring_t &search, iterator start) const
+typename pstring_t<F>::iterator pstring_t<F>::find(const pstring_t search, iterator start) const
{
for (; start != end(); ++start)
{
@@ -169,6 +169,15 @@ typename pstring_t<F>::iterator pstring_t<F>::find(const pstring_t &search, iter
}
template<typename F>
+typename pstring_t<F>::iterator pstring_t<F>::find(const code_t search, iterator start) const
+{
+ mem_t buf[traits::MAXCODELEN+1] = { 0 };
+ traits::encode(search, buf);
+ return find(pstring_t(&buf[0], UTF8), start);
+}
+
+
+template<typename F>
pstring_t<F> pstring_t<F>::replace(const pstring_t &search, const pstring_t &replace) const
{
pstring_t ret("");
@@ -188,13 +197,13 @@ pstring_t<F> pstring_t<F>::replace(const pstring_t &search, const pstring_t &rep
}
template<typename F>
-const pstring_t<F> pstring_t<F>::ltrim(const pstring_t &ws) const
+const pstring_t<F> pstring_t<F>::ltrim(const pstring_t ws) const
{
return substr(find_first_not_of(ws), end());
}
template<typename F>
-const pstring_t<F> pstring_t<F>::rtrim(const pstring_t &ws) const
+const pstring_t<F> pstring_t<F>::rtrim(const pstring_t ws) const
{
auto f = find_last_not_of(ws);
if (f==end())
@@ -230,7 +239,7 @@ double pstring_t<F>::as_double(bool *error) const
if (error != nullptr)
*error = false;
- ret = strtod(c_str(), &e);
+ ret = std::strtod(c_str(), &e);
if (*e != 0)
if (error != nullptr)
*error = true;
@@ -246,9 +255,9 @@ long pstring_t<F>::as_long(bool *error) const
if (error != nullptr)
*error = false;
if (startsWith("0x"))
- ret = strtol(substr(2).c_str(), &e, 16);
+ ret = std::strtol(substr(2).c_str(), &e, 16);
else
- ret = strtol(c_str(), &e, 10);
+ ret = std::strtol(c_str(), &e, 10);
if (*e != 0)
if (error != nullptr)
*error = true;
@@ -256,24 +265,6 @@ long pstring_t<F>::as_long(bool *error) const
}
template<typename F>
-typename pstring_t<F>::iterator pstring_t<F>::find(const mem_t *search, iterator start) const
-{
- for (; start != end(); ++start)
- {
- iterator itc(start);
- iterator cmp(search);
- while (itc != end() && *cmp != 0 && *itc == *cmp)
- {
- ++itc;
- ++cmp;
- }
- if (*cmp == 0)
- return start;
- }
- return end();
-}
-
-template<typename F>
bool pstring_t<F>::startsWith(const pstring_t &arg) const
{
if (arg.blen() > blen())
@@ -291,17 +282,6 @@ bool pstring_t<F>::endsWith(const pstring_t &arg) const
return (memcmp(c_str()+this->blen()-arg.blen(), arg.c_str(), arg.blen()) == 0);
}
-
-template<typename F>
-bool pstring_t<F>::startsWith(const mem_t *arg) const
-{
- std::size_t alen = strlen(arg);
- if (alen > blen())
- return false;
- else
- return (memcmp(arg, c_str(), alen) == 0);
-}
-
template<typename F>
int pstring_t<F>::pcmp(const mem_t *right) const
{
@@ -435,8 +415,8 @@ static inline std::size_t countleadbits(std::size_t x)
template<typename F>
void pstring_t<F>::sfree(pstr_t *s)
{
- s->m_ref_count--;
- if (s->m_ref_count == 0 && s != &m_zero)
+ bool b = s->dec_and_check();
+ if ( b && s != &m_zero)
{
if (stk != nullptr)
{
@@ -445,7 +425,6 @@ void pstring_t<F>::sfree(pstr_t *s)
}
else
plib::pfree_array(reinterpret_cast<char *>(s));
- //_mm_free(((char *)s));
}
}
@@ -492,16 +471,15 @@ void pstring_t<F>::resetmem()
template<typename F>
void pstring_t<F>::sfree(pstr_t *s)
{
- s->m_ref_count--;
- if (s->m_ref_count == 0 && s != &m_zero)
+ bool b = s->dec_and_check();
+ if ( b && s != &m_zero)
{
plib::pfree_array(((char *)s));
- //_mm_free(((char *)s));
}
}
template<typename F>
-pstr_t *pstring_t<F>::salloc(int n)
+pstr_t *pstring_t<F>::salloc(std::size_t n)
{
int size = sizeof(pstr_t) + n + 1;
pstr_t *p = (pstr_t *) plib::palloc_array<char>(size);
diff --git a/src/lib/netlist/plib/pstring.h b/src/lib/netlist/plib/pstring.h
index 16bf61b08ee..80a8fc4e78e 100644
--- a/src/lib/netlist/plib/pstring.h
+++ b/src/lib/netlist/plib/pstring.h
@@ -7,11 +7,8 @@
#ifndef PSTRING_H_
#define PSTRING_H_
-#include <cstdarg>
-#include <cstddef>
#include <iterator>
-
-#include "pconfig.h"
+#include <exception>
// ----------------------------------------------------------------------------------------
// pstring: immutable strings ...
@@ -22,27 +19,24 @@
struct pstr_t
{
- //str_t() : m_ref_count(1), m_len(0) { m_str[0] = 0; }
- pstr_t(const std::size_t alen)
- {
- init(alen);
- }
+ pstr_t(const std::size_t alen) { init(alen); }
void init(const std::size_t alen)
{
- m_ref_count = 1;
- m_len = alen;
- m_str[0] = 0;
+ m_ref_count = 1;
+ m_len = alen;
+ m_str[0] = 0;
}
char *str() { return &m_str[0]; }
unsigned char *ustr() { return reinterpret_cast<unsigned char *>(&m_str[0]); }
std::size_t len() const { return m_len; }
- int m_ref_count;
+ void inc() { m_ref_count++; }
+ bool dec_and_check() { --m_ref_count; return m_ref_count == 0; }
private:
+ int m_ref_count;
std::size_t m_len;
char m_str[1];
};
-
template <typename F>
struct pstring_t
{
@@ -53,20 +47,38 @@ public:
typedef typename F::code_t code_t;
typedef std::size_t size_type;
+ enum enc_t
+ {
+ UTF8
+ };
+
// simple construction/destruction
- pstring_t()
+ pstring_t() : m_ptr(&m_zero)
{
- init();
+ init(nullptr);
}
~pstring_t();
- // construction with copy
- pstring_t(const mem_t *string) { init(); if (string != nullptr && *string != 0) pcopy(string); }
- pstring_t(const pstring_t &string) { init(); pcopy(string); }
+ // FIXME: Do something with encoding
+ pstring_t(const mem_t *string, const enc_t enc) : m_ptr(&m_zero)
+ {
+ init(string);
+ }
+
+ template<typename C, std::size_t N>
+ pstring_t(C (&string)[N]) : m_ptr(&m_zero) {
+ static_assert(std::is_same<C, const mem_t>::value, "pstring constructor only accepts const mem_t");
+ static_assert(N>0,"pstring from array of length 0");
+ if (string[N-1] != 0)
+ throw std::exception();
+ init(string);
+ }
+
+ pstring_t(const pstring_t &string) : m_ptr(&m_zero) { init(string); }
pstring_t(pstring_t &&string) : m_ptr(string.m_ptr) { string.m_ptr = nullptr; }
+ explicit pstring_t(code_t code) : m_ptr(&m_zero) { pstring_t t; t+= code; init(t); }
// assignment operators
- pstring_t &operator=(const mem_t *string) { pcopy(string); return *this; }
pstring_t &operator=(const pstring_t &string) { pcopy(string); return *this; }
struct iterator final : public std::iterator<std::forward_iterator_tag, mem_t>
@@ -94,41 +106,24 @@ public:
// concatenation operators
pstring_t& operator+=(const pstring_t &string) { pcat(string); return *this; }
- pstring_t& operator+=(const mem_t *string) { pcat(string); return *this; }
friend pstring_t operator+(const pstring_t &lhs, const pstring_t &rhs) { return pstring_t(lhs) += rhs; }
- friend pstring_t operator+(const pstring_t &lhs, const mem_t *rhs) { return pstring_t(lhs) += rhs; }
- friend pstring_t operator+(const mem_t *lhs, const pstring_t &rhs) { return pstring_t(lhs) += rhs; }
// comparison operators
- bool operator==(const mem_t *string) const { return (pcmp(string) == 0); }
bool operator==(const pstring_t &string) const { return (pcmp(string) == 0); }
- bool operator!=(const mem_t *string) const { return (pcmp(string) != 0); }
bool operator!=(const pstring_t &string) const { return (pcmp(string) != 0); }
- bool operator<(const mem_t *string) const { return (pcmp(string) < 0); }
bool operator<(const pstring_t &string) const { return (pcmp(string) < 0); }
- bool operator<=(const mem_t *string) const { return (pcmp(string) <= 0); }
bool operator<=(const pstring_t &string) const { return (pcmp(string) <= 0); }
- bool operator>(const mem_t *string) const { return (pcmp(string) > 0); }
bool operator>(const pstring_t &string) const { return (pcmp(string) > 0); }
- bool operator>=(const mem_t *string) const { return (pcmp(string) >= 0); }
bool operator>=(const pstring_t &string) const { return (pcmp(string) >= 0); }
bool equals(const pstring_t &string) const { return (pcmp(string) == 0); }
-
- //int cmp(const pstring_t &string) const { return pcmp(string); }
- //int cmp(const mem_t *string) const { return pcmp(string); }
-
bool startsWith(const pstring_t &arg) const;
- bool startsWith(const mem_t *arg) const;
-
bool endsWith(const pstring_t &arg) const;
- bool endsWith(const mem_t *arg) const { return endsWith(pstring_t(arg)); }
pstring_t replace(const pstring_t &search, const pstring_t &replace) const;
-
const pstring_t cat(const pstring_t &s) const { return *this + s; }
- const pstring_t cat(const mem_t *s) const { return *this + s; }
+ const pstring_t cat(const code_t c) const { return *this + c; }
size_type blen() const { return m_ptr->len(); }
@@ -145,11 +140,9 @@ public:
pstring_t& operator+=(const code_t c) { mem_t buf[traits::MAXCODELEN+1] = { 0 }; traits::encode(c, buf); pcat(buf); return *this; }
friend pstring_t operator+(const pstring_t &lhs, const code_t rhs) { return pstring_t(lhs) += rhs; }
- iterator find(const pstring_t &search, iterator start) const;
- iterator find(const pstring_t &search) const { return find(search, begin()); }
- iterator find(const mem_t *search, iterator start) const;
- iterator find(const mem_t *search) const { return find(search, begin()); }
- iterator find(const code_t search, iterator start) const { mem_t buf[traits::MAXCODELEN+1] = { 0 }; traits::encode(search, buf); return find(buf, start); }
+ iterator find(const pstring_t search, iterator start) const;
+ iterator find(const pstring_t search) const { return find(search, begin()); }
+ iterator find(const code_t search, iterator start) const;
iterator find(const code_t search) const { return find(search, begin()); }
const pstring_t substr(const iterator start, const iterator end) const ;
@@ -162,9 +155,9 @@ public:
iterator find_first_not_of(const pstring_t &no) const;
iterator find_last_not_of(const pstring_t &no) const;
- const pstring_t ltrim(const pstring_t &ws = " \t\n\r") const;
- const pstring_t rtrim(const pstring_t &ws = " \t\n\r") const;
- const pstring_t trim(const pstring_t &ws = " \t\n\r") const { return this->ltrim(ws).rtrim(ws); }
+ const pstring_t ltrim(const pstring_t ws = pstring_t(" \t\n\r")) const;
+ const pstring_t rtrim(const pstring_t ws = pstring_t(" \t\n\r")) const;
+ const pstring_t trim(const pstring_t ws = pstring_t(" \t\n\r")) const { return this->ltrim(ws).rtrim(ws); }
const pstring_t rpad(const pstring_t &ws, const size_type cnt) const;
@@ -178,10 +171,16 @@ protected:
pstr_t *m_ptr;
private:
- void init()
+ void init(const mem_t *string)
+ {
+ m_ptr->inc();
+ if (string != nullptr && *string != 0)
+ pcopy(string);
+ }
+ void init(const pstring_t &string)
{
- m_ptr = &m_zero;
- m_ptr->m_ref_count++;
+ m_ptr->inc();
+ pcopy(string);
}
int pcmp(const pstring_t &right) const;
@@ -191,14 +190,12 @@ private:
void pcopy(const mem_t *from, std::size_t size);
void pcopy(const mem_t *from);
-
void pcopy(const pstring_t &from)
{
sfree(m_ptr);
m_ptr = from.m_ptr;
- m_ptr->m_ref_count++;
+ m_ptr->inc();
}
-
void pcat(const mem_t *s);
void pcat(const pstring_t &s);
@@ -208,8 +205,6 @@ private:
static pstr_t m_zero;
};
-template <typename F> pstr_t pstring_t<F>::m_zero(0);
-
struct pu8_traits
{
static const unsigned MAXCODELEN = 1; /* in memory units */
@@ -358,7 +353,8 @@ public:
// C string conversion helpers
const char *c_str() const { return m_ptr; }
- operator pstring() const { return pstring(m_ptr); }
+ // FIXME: encoding should be parameter
+ operator pstring() const { return pstring(m_ptr, pstring::UTF8); }
// concatenation operators
pstringbuffer& operator+=(const char c) { char buf[2] = { c, 0 }; pcat(buf); return *this; }
diff --git a/src/lib/netlist/plib/ptypes.h b/src/lib/netlist/plib/ptypes.h
index 9c477f71944..182333875d0 100644
--- a/src/lib/netlist/plib/ptypes.h
+++ b/src/lib/netlist/plib/ptypes.h
@@ -9,6 +9,7 @@
#define PTYPES_H_
#include <type_traits>
+#include <limits>
#include "pconfig.h"
#include "pstring.h"
@@ -39,10 +40,25 @@ namespace plib
#endif
//============================================================
+ // prevent implicit copying
+ //============================================================
+
+ struct nocopyassignmove
+ {
+ protected:
+ nocopyassignmove() = default;
+ ~nocopyassignmove() = default;
+ private:
+ nocopyassignmove(const nocopyassignmove &) = delete;
+ nocopyassignmove(nocopyassignmove &&) = delete;
+ nocopyassignmove &operator=(const nocopyassignmove &) = delete;
+ };
+
+ //============================================================
// penum - strongly typed enumeration
//============================================================
- struct enum_base
+ struct penum_base
{
protected:
static int from_string_int(const char *str, const char *x);
@@ -52,22 +68,22 @@ namespace plib
}
#define P_ENUM(ename, ...) \
- struct ename : public plib::enum_base { \
- enum e { __VA_ARGS__ }; \
- ename (e v) : m_v(v) { } \
+ struct ename : public plib::penum_base { \
+ enum E { __VA_ARGS__ }; \
+ ename (E v) : m_v(v) { } \
bool set_from_string (const pstring &s) { \
static const char *strings = # __VA_ARGS__; \
int f = from_string_int(strings, s.c_str()); \
- if (f>=0) { m_v = static_cast<e>(f); return true; } else { return false; } \
+ if (f>=0) { m_v = static_cast<E>(f); return true; } else { return false; } \
} \
- operator e() const {return m_v;} \
+ operator E() const {return m_v;} \
bool operator==(const ename &rhs) const {return m_v == rhs.m_v;} \
- bool operator==(const e &rhs) const {return m_v == rhs;} \
+ bool operator==(const E &rhs) const {return m_v == rhs;} \
const pstring name() const { \
static const char *strings = # __VA_ARGS__; \
return nthstr(static_cast<int>(m_v), strings); \
} \
- private: e m_v; };
+ private: E m_v; };
#endif /* PTYPES_H_ */
diff --git a/src/lib/netlist/plib/putil.cpp b/src/lib/netlist/plib/putil.cpp
index 39e1b444f33..6a24e8c4012 100644
--- a/src/lib/netlist/plib/putil.cpp
+++ b/src/lib/netlist/plib/putil.cpp
@@ -36,13 +36,14 @@ namespace plib
if (getenv(var.c_str()) == nullptr)
return default_val;
else
- return pstring(getenv(var.c_str()));
+ return pstring(getenv(var.c_str()), pstring::UTF8);
}
}
- pstring_vector_t::pstring_vector_t(const pstring &str, const pstring &onstr, bool ignore_empty)
- : std::vector<pstring>()
+ std::vector<pstring> psplit(const pstring &str, const pstring &onstr, bool ignore_empty)
{
+ std::vector<pstring> ret;
+
pstring::iterator p = str.begin();
pstring::iterator pn = str.find(onstr, p);
@@ -50,7 +51,7 @@ namespace plib
{
pstring t = str.substr(p, pn);
if (!ignore_empty || t.len() != 0)
- this->push_back(t);
+ ret.push_back(t);
p = pn + onstr.len();
pn = str.find(onstr, p);
}
@@ -58,14 +59,15 @@ namespace plib
{
pstring t = str.substr(p, str.end());
if (!ignore_empty || t.len() != 0)
- this->push_back(t);
+ ret.push_back(t);
}
+ return ret;
}
- pstring_vector_t::pstring_vector_t(const pstring &str, const pstring_vector_t &onstrl)
- : std::vector<pstring>()
+ std::vector<pstring> psplit(const pstring &str, const std::vector<pstring> &onstrl)
{
pstring col = "";
+ std::vector<pstring> ret;
unsigned i = 0;
while (i<str.blen())
@@ -82,10 +84,10 @@ namespace plib
if (p != static_cast<std::size_t>(-1))
{
if (col != "")
- this->push_back(col);
+ ret.push_back(col);
col = "";
- this->push_back(onstrl[p]);
+ ret.push_back(onstrl[p]);
i += onstrl[p].blen();
}
else
@@ -96,11 +98,13 @@ namespace plib
}
}
if (col != "")
- this->push_back(col);
+ ret.push_back(col);
+
+ return ret;
}
- int enum_base::from_string_int(const char *str, const char *x)
+ int penum_base::from_string_int(const char *str, const char *x)
{
int cnt = 0;
const char *cur = str;
@@ -127,7 +131,7 @@ namespace plib
return cnt;
return -1;
}
- pstring enum_base::nthstr(int n, const char *str)
+ pstring penum_base::nthstr(int n, const char *str)
{
char buf[64];
char *bufp = buf;
@@ -139,7 +143,7 @@ namespace plib
if (*str == ',')
{
*bufp = 0;
- return pstring(buf);
+ return pstring(buf, pstring::UTF8);
}
else if (*str != ' ')
*bufp++ = *str;
@@ -152,6 +156,6 @@ namespace plib
str++;
}
*bufp = 0;
- return pstring(buf);
+ return pstring(buf, pstring::UTF8);
}
} // namespace plib
diff --git a/src/lib/netlist/plib/putil.h b/src/lib/netlist/plib/putil.h
index 9e79e958927..4bc8dcd695f 100644..100755
--- a/src/lib/netlist/plib/putil.h
+++ b/src/lib/netlist/plib/putil.h
@@ -8,17 +8,18 @@
#ifndef P_UTIL_H_
#define P_UTIL_H_
-#include <initializer_list>
+#include "pstring.h"
-#include "plib/pstring.h"
-#include "plib/plists.h"
+#include <initializer_list>
+#include <algorithm>
+#include <vector> // <<= needed by windows build
namespace plib
{
namespace util
{
const pstring buildpath(std::initializer_list<pstring> list );
- const pstring environment(const pstring &var, const pstring &default_val = "");
+ const pstring environment(const pstring &var, const pstring &default_val);
}
namespace container
@@ -66,13 +67,8 @@ namespace plib
// string list
// ----------------------------------------------------------------------------------------
- class pstring_vector_t : public std::vector<pstring>
- {
- public:
- pstring_vector_t() : std::vector<pstring>() { }
- pstring_vector_t(const pstring &str, const pstring &onstr, bool ignore_empty = false);
- pstring_vector_t(const pstring &str, const pstring_vector_t &onstrl);
- };
+ std::vector<pstring> psplit(const pstring &str, const pstring &onstr, bool ignore_empty = false);
+ std::vector<pstring> psplit(const pstring &str, const std::vector<pstring> &onstrl);
}
diff --git a/src/lib/netlist/prg/nltool.cpp b/src/lib/netlist/prg/nltool.cpp
index 91f9fc7c1ae..6eec3d0e6dc 100644
--- a/src/lib/netlist/prg/nltool.cpp
+++ b/src/lib/netlist/prg/nltool.cpp
@@ -8,21 +8,12 @@
****************************************************************************/
-#include <cstdio>
-#include <cstdlib>
-
#include "plib/poptions.h"
-#include "plib/pstring.h"
-#include "plib/plists.h"
-#include "plib/ptypes.h"
-#include "plib/pexception.h"
#include "nl_setup.h"
-#include "nl_factory.h"
#include "nl_parser.h"
#include "devices/net_lib.h"
#include "tools/nl_convert.h"
-
-#include <cfenv>
+#include "solver/nld_solver.h"
class tool_options_t : public plib::options
{
@@ -30,7 +21,7 @@ public:
tool_options_t() :
plib::options(),
opt_grp1(*this, "General options", "The following options apply to all commands."),
- opt_cmd (*this, "c", "cmd", "run", "run:convert:listdevices:static", "run|convert|listdevices|static"),
+ opt_cmd (*this, "c", "cmd", "run", "run:convert:listdevices:static:header", "run|convert|listdevices|static|header"),
opt_file(*this, "f", "file", "-", "file to process (default is stdin)"),
opt_defines(*this, "D", "define", "predefine value as macro, e.g. -Dname=value. If '=value' is omitted predefine it as 1. This option may be specified repeatedly."),
opt_rfolders(*this, "r", "rom", "where to look for files"),
@@ -77,8 +68,8 @@ public:
static plib::pstdout pout_strm;
static plib::pstderr perr_strm;
-static plib::pstream_fmt_writer_t pout(pout_strm);
-static plib::pstream_fmt_writer_t perr(perr_strm);
+static plib::putf8_fmt_writer pout(pout_strm);
+static plib::putf8_fmt_writer perr(perr_strm);
static NETLIST_START(dummy)
/* Standard stuff */
@@ -211,7 +202,7 @@ struct input_t
if (e != 3)
throw netlist::nl_exception(plib::pfmt("error {1} scanning line {2}\n")(e)(line));
m_time = netlist::netlist_time::from_double(t);
- m_param = setup.find_param(buf, true);
+ m_param = setup.find_param(pstring(buf, pstring::UTF8), true);
}
void setparam()
@@ -244,8 +235,9 @@ static std::vector<input_t> read_input(const netlist::setup_t &setup, pstring fn
if (fname != "")
{
plib::pifilestream f(fname);
+ plib::putf8_reader r(f);
pstring l;
- while (f.readline(l))
+ while (r.readline(l))
{
if (l != "")
{
@@ -319,12 +311,95 @@ static void static_compile(tool_options_t &opts)
opts.opt_logs(),
opts.opt_defines(), opts.opt_rfolders());
- nt.solver()->create_solver_code(pout_strm);
+ plib::putf8_writer w(pout_strm);
+ std::map<pstring, pstring> mp;
+
+ nt.solver()->create_solver_code(mp);
+
+ for (auto &e : mp)
+ {
+ w.write(e.second);
+ }
nt.stop();
}
+static void mac_out(const pstring s, const bool cont = true)
+{
+ static const unsigned RIGHT = 72;
+ if (cont)
+ {
+ unsigned adj = 0;
+ for (auto x : s)
+ adj += (x == '\t' ? 3 : 0);
+ pout("{1}\\\n", s.rpad(" ", RIGHT-1-adj));
+ }
+ else
+ pout("{1}\n", s);
+}
+
+static void create_header(tool_options_t &opts)
+{
+ netlist_tool_t nt("netlist");
+
+ nt.init();
+
+ nt.log().verbose.set_enabled(false);
+ nt.log().warning.set_enabled(false);
+
+ nt.setup().register_source(plib::make_unique_base<netlist::source_t,
+ netlist::source_proc_t>(nt.setup(), "dummy", &netlist_dummy));
+ nt.setup().include("dummy");
+
+ pout("// license:GPL-2.0+\n");
+ pout("// copyright-holders:Couriersud\n");
+ pout("#ifndef NLD_DEVINC_H\n");
+ pout("#define NLD_DEVINC_H\n");
+ pout("\n");
+ pout("#include \"nl_setup.h\"\n");
+ pout("#ifndef __PLIB_PREPROCESSOR__\n");
+ pout("\n");
+ pout("/* ----------------------------------------------------------------------------\n");
+ pout(" * Netlist Macros\n");
+ pout(" * ---------------------------------------------------------------------------*/\n");
+ pout("\n");
+
+ pstring last_source("");
+
+ for (auto &e : nt.setup().factory())
+ {
+ if (last_source != e->sourcefile())
+ {
+ last_source = e->sourcefile();
+ pout("{1}\n", pstring("// ").rpad("-", 72));
+ pout("{1}\n", pstring("// Source: ").cat(e->sourcefile().replace("../","")));
+ pout("{1}\n", pstring("// ").rpad("-", 72));
+ }
+ auto v = plib::psplit(e->param_desc(), ",");
+ pstring vs;
+ for (auto s : v)
+ vs += ", p" + s.replace("+","").replace(".","_");
+ mac_out("#define " + e->name() + "(name" + vs + ")");
+ mac_out("\tNET_REGISTER_DEV(" + e->name() +", name)"); \
+
+ for (auto s : v)
+ {
+ pstring r(s.replace("+","").replace(".","_"));
+ if (s.startsWith("+"))
+ mac_out("\tNET_CONNECT(name, " + r + ", p" + r + ")");
+ else
+ mac_out("\tNETDEV_PARAMI(name, " + r + ", p" + r + ")");
+ }
+ mac_out("", false);
+ }
+ pout("#endif // __PLIB_PREPROCESSOR__\n");
+ pout("#endif\n");
+ nt.stop();
+
+}
+
+
/*-------------------------------------------------
listdevices - list all known devices
-------------------------------------------------*/
@@ -390,7 +465,7 @@ static void listdevices(tool_options_t &opts)
}
out += "," + f->param_desc();
- for (auto p : plib::pstring_vector_t(f->param_desc(),",") )
+ for (auto p : plib::psplit(f->param_desc(),",") )
{
if (p.startsWith("+"))
{
@@ -417,7 +492,7 @@ static void listdevices(tool_options_t &opts)
-------------------------------------------------*/
#if 0
-static const char *pmf_verbose[] =
+static const pstring pmf_verbose[] =
{
"NL_PMF_TYPE_VIRTUAL",
"NL_PMF_TYPE_GNUC_PMF",
@@ -455,7 +530,7 @@ int main(int argc, char *argv[])
{
pout(
"nltool (netlist) 0.1\n"
- "Copyright (C) 2016 Couriersud\n"
+ "Copyright (C) 2017 Couriersud\n"
"License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl.html>.\n"
"This is free software: you are free to change and redistribute it.\n"
"There is NO WARRANTY, to the extent permitted by law.\n\n"
@@ -472,6 +547,8 @@ int main(int argc, char *argv[])
run(opts);
else if (cmd == "static")
static_compile(opts);
+ else if (cmd == "header")
+ create_header(opts);
else if (cmd == "convert")
{
pstring contents;
@@ -508,7 +585,7 @@ int main(int argc, char *argv[])
result = c.result();
}
/* present result */
- pout_strm.write(result.c_str());
+ pout.write(result);
}
else
{
diff --git a/src/lib/netlist/prg/nlwav.cpp b/src/lib/netlist/prg/nlwav.cpp
index 44adf2b3508..52f59f366f6 100644
--- a/src/lib/netlist/prg/nlwav.cpp
+++ b/src/lib/netlist/prg/nlwav.cpp
@@ -1,13 +1,12 @@
// license:GPL-2.0+
// copyright-holders:Couriersud
-#include <plib/poptions.h>
-#include <cstdio>
#include <cstring>
#include "plib/pstring.h"
#include "plib/plists.h"
#include "plib/pstream.h"
+#include "plib/poptions.h"
+#include "plib/ppmf.h"
#include "nl_setup.h"
-#include <memory>
class nlwav_options_t : public plib::options
{
@@ -17,6 +16,7 @@ public:
opt_inp(*this, "i", "input", "-", "input file"),
opt_out(*this, "o", "output", "-", "output file"),
opt_amp(*this, "a", "amp", 10000.0, "amplification after mean correction"),
+ opt_rate(*this, "r", "rate", 48000, "sample rate of output file"),
opt_verb(*this, "v", "verbose", "be verbose - this produces lots of output"),
opt_quiet(*this,"q", "quiet", "be quiet - no warnings"),
opt_version(*this, "", "version", "display version and exit"),
@@ -25,6 +25,7 @@ public:
plib::option_str opt_inp;
plib::option_str opt_out;
plib::option_double opt_amp;
+ plib::option_long opt_rate;
plib::option_bool opt_verb;
plib::option_bool opt_quiet;
plib::option_bool opt_version;
@@ -35,8 +36,8 @@ plib::pstdin pin_strm;
plib::pstdout pout_strm;
plib::pstderr perr_strm;
-plib::pstream_fmt_writer_t pout(pout_strm);
-plib::pstream_fmt_writer_t perr(perr_strm);
+plib::putf8_fmt_writer pout(pout_strm);
+plib::putf8_fmt_writer perr(perr_strm);
nlwav_options_t opts;
@@ -141,11 +142,114 @@ private:
};
-static void convert()
+class log_processor
{
- plib::postream *fo = (opts.opt_out() == "-" ? &pout_strm : new plib::pofilestream(opts.opt_out()));
- plib::pistream *fin = (opts.opt_inp() == "-" ? &pin_strm : new plib::pifilestream(opts.opt_inp()));
- wav_t *wo = new wav_t(*fo, 48000);
+public:
+ typedef plib::pmfp<void, double, double> callback_type;
+ log_processor(plib::pistream &is, callback_type cb) : m_is(is), m_cb(cb) { }
+
+ void process()
+ {
+ plib::putf8_reader reader(m_is);
+ pstring line;
+
+ while(reader.readline(line))
+ {
+ double t = 0.0; double v = 0.0;
+ sscanf(line.c_str(), "%lf %lf", &t, &v);
+ m_cb(t, v);
+ }
+ }
+
+private:
+ plib::pistream &m_is;
+ callback_type m_cb;
+};
+
+struct aggregator
+{
+ typedef plib::pmfp<void, double, double> callback_type;
+
+ aggregator(double quantum, callback_type cb)
+ : m_quantum(quantum)
+ , m_cb(cb)
+ , ct(0.0)
+ , lt(0.0)
+ , outsam(0.0)
+ , cursam(0.0)
+ { }
+ void process(double time, double val)
+ {
+ while (time >= ct)
+ {
+ outsam += (ct - lt) * cursam;
+ outsam = outsam / m_quantum;
+ m_cb(ct, outsam);
+ outsam = 0.0;
+ lt = ct;
+ ct += m_quantum;
+ }
+ outsam += (time-lt)*cursam;
+ lt = time;
+ cursam = val;
+ }
+
+private:
+ double m_quantum;
+ callback_type m_cb;
+ double ct;
+ double lt;
+ double outsam;
+ double cursam;
+};
+
+class wavwriter
+{
+public:
+ wavwriter(plib::postream &fo, unsigned sample_rate, double ampa)
+ : mean(0.0)
+ , means(0.0)
+ , maxsam(-1e9)
+ , minsam(1e9)
+ , n(0)
+ , m_fo(fo)
+ , amp(ampa)
+ , m_wo(m_fo, sample_rate)
+ { }
+
+ void process(double time, double outsam)
+ {
+ means += outsam;
+ maxsam = std::max(maxsam, outsam);
+ minsam = std::min(minsam, outsam);
+ n++;
+ //mean = means / (double) n;
+ mean += 5.0 / static_cast<double>(m_wo.sample_rate()) * (outsam - mean);
+
+ outsam = (outsam - mean) * amp;
+ outsam = std::max(-32000.0, outsam);
+ outsam = std::min(32000.0, outsam);
+ m_wo.write_sample(static_cast<int>(outsam));
+ }
+
+ double mean;
+ double means;
+ double maxsam;
+ double minsam;
+ std::size_t n;
+
+private:
+ plib::postream &m_fo;
+ double amp;
+ wav_t m_wo;
+};
+
+static void convert(long sample_rate)
+{
+ plib::postream *fo = (opts.opt_out() == "-" ? &pout_strm : plib::palloc<plib::pofilestream>(opts.opt_out()));
+ plib::pistream *fin = (opts.opt_inp() == "-" ? &pin_strm : plib::palloc<plib::pifilestream>(opts.opt_inp()));
+ plib::putf8_reader reader(*fin);
+ wav_t *wo = plib::palloc<wav_t>(*fo, static_cast<unsigned>(sample_rate));
double dt = 1.0 / static_cast<double>(wo->sample_rate());
double ct = dt;
@@ -162,7 +266,7 @@ static void convert()
//short sample = 0;
pstring line;
- while(fin->readline(line))
+ while(reader.readline(line))
{
#if 1
double t = 0.0; double v = 0.0;
@@ -212,11 +316,11 @@ static void convert()
//printf("%f %f\n", t, v);
#endif
}
- delete wo;
+ plib::pfree(wo);
if (opts.opt_inp() != "-")
- delete fin;
+ plib::pfree(fin);
if (opts.opt_out() != "-")
- delete fo;
+ plib::pfree(fo);
if (!opts.opt_quiet())
{
@@ -227,10 +331,39 @@ static void convert()
}
}
-static void usage(plib::pstream_fmt_writer_t &fw)
+static void convert1(long sample_rate)
+{
+ plib::postream *fo = (opts.opt_out() == "-" ? &pout_strm : plib::palloc<plib::pofilestream>(opts.opt_out()));
+ plib::pistream *fin = (opts.opt_inp() == "-" ? &pin_strm : plib::palloc<plib::pifilestream>(opts.opt_inp()));
+
+ double dt = 1.0 / static_cast<double>(sample_rate);
+
+ wavwriter *wo = plib::palloc<wavwriter>(*fo, static_cast<unsigned>(sample_rate), opts.opt_amp());
+ aggregator ag(dt, aggregator::callback_type(&wavwriter::process, wo));
+ log_processor lp(*fin, log_processor::callback_type(&aggregator::process, &ag));
+
+ lp.process();
+
+ if (!opts.opt_quiet())
+ {
+ perr("Mean (low freq filter): {}\n", wo->mean);
+ perr("Mean (static): {}\n", wo->means / static_cast<double>(wo->n));
+ perr("Amp + {}\n", 32000.0 / (wo->maxsam - wo->mean));
+ perr("Amp - {}\n", -32000.0 / (wo->minsam - wo->mean));
+ }
+
+ plib::pfree(wo);
+ if (opts.opt_inp() != "-")
+ plib::pfree(fin);
+ if (opts.opt_out() != "-")
+ plib::pfree(fo);
+
+}
+
+static void usage(plib::putf8_fmt_writer &fw)
{
fw("{}\n", opts.help("Convert netlist log files into wav files.\n",
- "nltool [options]").c_str());
+ "nltool [options]"));
}
@@ -255,7 +388,7 @@ int main(int argc, char *argv[])
{
pout(
"nlwav (netlist) 0.1\n"
- "Copyright (C) 2016 Couriersud\n"
+ "Copyright (C) 2017 Couriersud\n"
"License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl.html>.\n"
"This is free software: you are free to change and redistribute it.\n"
"There is NO WARRANTY, to the extent permitted by law.\n\n"
@@ -263,7 +396,10 @@ int main(int argc, char *argv[])
return 0;
}
- convert();
+ if ((1))
+ convert1(opts.opt_rate());
+ else
+ convert(opts.opt_rate());
return 0;
}
diff --git a/src/lib/netlist/solver/mat_cr.h b/src/lib/netlist/solver/mat_cr.h
index 340c662752f..c39af1b2f5f 100644
--- a/src/lib/netlist/solver/mat_cr.h
+++ b/src/lib/netlist/solver/mat_cr.h
@@ -12,38 +12,79 @@
#include <algorithm>
#include "plib/pconfig.h"
+#include "plib/palloc.h"
-template<int storage_N>
+template<std::size_t N, typename C = uint16_t, typename T = double>
struct mat_cr_t
{
- unsigned nz_num;
- unsigned ia[storage_N + 1];
- unsigned ja[storage_N * storage_N];
- unsigned diag[storage_N]; /* n */
+ typedef C index_type;
+ typedef T value_type;
- template<typename T>
- void mult_vec(const T * RESTRICT A, const T * RESTRICT x, T * RESTRICT res)
+ C diag[N]; // diagonal index pointer n
+ C ia[N+1]; // row index pointer n + 1
+ C ja[N*N]; // column index array nz_num, initially (n * n)
+ T A[N*N]; // Matrix elements nz_num, initially (n * n)
+
+ std::size_t size;
+ std::size_t nz_num;
+
+ mat_cr_t(const std::size_t n)
+ : size(n)
+ , nz_num(0)
+ {
+#if 0
+#if 0
+ ia = plib::palloc_array<C>(n + 1);
+ ja = plib::palloc_array<C>(n * n);
+ diag = plib::palloc_array<C>(n);
+#else
+ diag = plib::palloc_array<C>(n + (n + 1) + n * n);
+ ia = diag + n;
+ ja = ia + (n+1);
+ A = plib::palloc_array<T>(n * n);
+#endif
+#endif
+ }
+
+ ~mat_cr_t()
+ {
+#if 0
+ plib::pfree_array(diag);
+#if 0
+ plib::pfree_array(ia);
+ plib::pfree_array(ja);
+#endif
+ plib::pfree_array(A);
+#endif
+ }
+
+ void set_scalar(const T scalar)
+ {
+ for (std::size_t i=0, e=nz_num; i<e; i++)
+ A[i] = scalar;
+ }
+
+ void mult_vec(const T * RESTRICT x, T * RESTRICT res)
{
/*
* res = A * x
*/
- unsigned i = 0;
- unsigned k = 0;
- const unsigned oe = nz_num;
+ std::size_t i = 0;
+ std::size_t k = 0;
+ const std::size_t oe = nz_num;
while (k < oe)
{
T tmp = 0.0;
- const unsigned e = ia[i+1];
+ const std::size_t e = ia[i+1];
for (; k < e; k++)
tmp += A[k] * x[ja[k]];
res[i++] = tmp;
}
}
- template<typename T>
- void incomplete_LU_factorization(const T * RESTRICT A, T * RESTRICT LU)
+ void incomplete_LU_factorization(T * RESTRICT LU)
{
/*
* incomplete LU Factorization according to http://de.wikipedia.org/wiki/ILU-Zerlegung
@@ -52,28 +93,28 @@ struct mat_cr_t
*
*/
- const unsigned lnz = nz_num;
+ const std::size_t lnz = nz_num;
- for (unsigned k = 0; k < lnz; k++)
+ for (std::size_t k = 0; k < lnz; k++)
LU[k] = A[k];
- for (unsigned i = 1; ia[i] < lnz; i++) // row i
+ for (std::size_t i = 1; ia[i] < lnz; i++) // row i
{
- const unsigned iai1 = ia[i + 1];
- const unsigned pke = diag[i];
- for (unsigned pk = ia[i]; pk < pke; pk++) // all columns left of diag in row i
+ const std::size_t iai1 = ia[i + 1];
+ const std::size_t pke = diag[i];
+ for (std::size_t pk = ia[i]; pk < pke; pk++) // all columns left of diag in row i
{
// pk == (i, k)
- const unsigned k = ja[pk];
- const unsigned iak1 = ia[k + 1];
+ const std::size_t k = ja[pk];
+ const std::size_t iak1 = ia[k + 1];
const T LUpk = LU[pk] = LU[pk] / LU[diag[k]];
- unsigned pt = ia[k];
+ std::size_t pt = ia[k];
- for (unsigned pj = pk + 1; pj < iai1; pj++) // pj = (i, j)
+ for (std::size_t pj = pk + 1; pj < iai1; pj++) // pj = (i, j)
{
// we can assume that within a row ja increases continuously */
- const unsigned ej = ja[pj];
+ const std::size_t ej = ja[pj];
while (ja[pt] < ej && pt < iak1)
pt++;
if (pt < iak1 && ja[pt] == ej)
@@ -83,7 +124,6 @@ struct mat_cr_t
}
}
- template<typename T>
void solveLUx (const T * RESTRICT LU, T * RESTRICT r)
{
/*
@@ -96,7 +136,7 @@ struct mat_cr_t
*
* ==> LUx = r
*
- * ==> Ux = L?????r = w
+ * ==> Ux = Lâ»Â¹ r = w
*
* ==> r = Lw
*
@@ -108,32 +148,28 @@ struct mat_cr_t
*
*/
- unsigned i;
-
- for (i = 1; ia[i] < nz_num; i++ )
+ for (std::size_t i = 1; ia[i] < nz_num; ++i )
{
T tmp = 0.0;
- const unsigned j1 = ia[i];
- const unsigned j2 = diag[i];
+ const std::size_t j1 = ia[i];
+ const std::size_t j2 = diag[i];
- for (unsigned j = j1; j < j2; j++ )
+ for (std::size_t j = j1; j < j2; ++j )
tmp += LU[j] * r[ja[j]];
r[i] -= tmp;
}
// i now is equal to n;
- for (; 0 < i; i-- )
+ for (std::size_t i = size; i-- > 0; )
{
- const unsigned im1 = i - 1;
T tmp = 0.0;
- const unsigned j1 = diag[im1] + 1;
- const unsigned j2 = ia[im1+1];
- for (unsigned j = j1; j < j2; j++ )
+ const std::size_t di = diag[i];
+ const std::size_t j2 = ia[i+1];
+ for (std::size_t j = di + 1; j < j2; j++ )
tmp += LU[j] * r[ja[j]];
- r[im1] = (r[im1] - tmp) / LU[diag[im1]];
+ r[i] = (r[i] - tmp) / LU[di];
}
}
-
};
#endif /* MAT_CR_H_ */
diff --git a/src/lib/netlist/solver/nld_matrix_solver.cpp b/src/lib/netlist/solver/nld_matrix_solver.cpp
index a27301a754d..f314aea2314 100644
--- a/src/lib/netlist/solver/nld_matrix_solver.cpp
+++ b/src/lib/netlist/solver/nld_matrix_solver.cpp
@@ -8,6 +8,8 @@
#include "nld_matrix_solver.h"
#include "plib/putil.h"
+#include <cmath> // <<= needed by windows build
+
namespace netlist
{
namespace devices
@@ -64,7 +66,7 @@ void terms_for_net_t::set_pointers()
for (unsigned i = 0; i < count(); i++)
{
m_terms[i]->set_ptrs(&m_gt[i], &m_go[i], &m_Idr[i]);
- m_connected_net_V[i] = m_terms[i]->m_otherterm->net().m_cur_Analog.ptr();
+ m_connected_net_V[i] = m_terms[i]->m_otherterm->net().Q_Analog_state_ptr();
}
}
@@ -91,15 +93,11 @@ matrix_solver_t::matrix_solver_t(netlist_t &anetlist, const pstring &name,
matrix_solver_t::~matrix_solver_t()
{
- for (unsigned k = 0; k < m_terms.size(); k++)
- {
- plib::pfree(m_terms[k]);
- }
-
}
void matrix_solver_t::setup_base(analog_net_t::list_t &nets)
{
+
log().debug("New solver setup\n");
m_nets.clear();
@@ -108,7 +106,7 @@ void matrix_solver_t::setup_base(analog_net_t::list_t &nets)
for (auto & net : nets)
{
m_nets.push_back(net);
- m_terms.push_back(plib::palloc<terms_for_net_t>());
+ m_terms.push_back(plib::make_unique<terms_for_net_t>());
m_rails_temp.push_back(plib::palloc<terms_for_net_t>());
}
@@ -125,7 +123,7 @@ void matrix_solver_t::setup_base(analog_net_t::list_t &nets)
log().debug("{1} {2} {3}\n", p->name(), net->name(), net->isRailNet());
switch (p->type())
{
- case terminal_t::TERMINAL:
+ case detail::terminal_type::TERMINAL:
if (p->device().is_timestep())
if (!plib::container::contains(m_step_devices, &p->device()))
m_step_devices.push_back(&p->device());
@@ -138,7 +136,7 @@ void matrix_solver_t::setup_base(analog_net_t::list_t &nets)
}
log().debug("Added terminal {1}\n", p->name());
break;
- case terminal_t::INPUT:
+ case detail::terminal_type::INPUT:
{
proxied_analog_output_t *net_proxy_output = nullptr;
for (auto & input : m_inps)
@@ -157,14 +155,14 @@ void matrix_solver_t::setup_base(analog_net_t::list_t &nets)
net_proxy_output->m_proxied_net = static_cast<analog_net_t *>(&p->net());
}
net_proxy_output->net().add_terminal(*p);
- // FIXME: repeated
+ // FIXME: repeated calling - kind of brute force
net_proxy_output->net().rebuild_list();
log().debug("Added input\n");
}
break;
- case terminal_t::OUTPUT:
- case terminal_t::PARAM:
- log().fatal("unhandled element found\n");
+ case detail::terminal_type::OUTPUT:
+ log().fatal(MF_1_UNHANDLED_ELEMENT_1_FOUND,
+ p->name());
break;
}
}
@@ -210,7 +208,7 @@ void matrix_solver_t::setup_matrix()
* literature but I have found no articles about Gauss Seidel.
*
* For Gaussian Elimination however increasing order is better suited.
- * FIXME: Even better would be to sort on elements right of the matrix diagonal.
+ * NOTE: Even better would be to sort on elements right of the matrix diagonal.
*
*/
@@ -240,7 +238,7 @@ void matrix_solver_t::setup_matrix()
/* create a list of non zero elements. */
for (unsigned k = 0; k < iN; k++)
{
- terms_for_net_t * t = m_terms[k];
+ terms_for_net_t * t = m_terms[k].get();
/* pretty brutal */
int *other = t->connected_net_idx();
@@ -262,7 +260,7 @@ void matrix_solver_t::setup_matrix()
*/
for (unsigned k = 0; k < iN; k++)
{
- terms_for_net_t * t = m_terms[k];
+ terms_for_net_t * t = m_terms[k].get();
/* pretty brutal */
int *other = t->connected_net_idx();
@@ -292,9 +290,9 @@ void matrix_solver_t::setup_matrix()
* This should reduce cache misses ...
*/
- bool **touched = new bool*[iN];
+ bool **touched = plib::palloc_array<bool *>(iN);
for (unsigned k=0; k<iN; k++)
- touched[k] = new bool[iN];
+ touched[k] = plib::palloc_array<bool>(iN);
for (unsigned k = 0; k < iN; k++)
{
@@ -352,8 +350,8 @@ void matrix_solver_t::setup_matrix()
}
for (unsigned k=0; k<iN; k++)
- delete [] touched[k];
- delete [] touched;
+ plib::pfree_array(touched[k]);
+ plib::pfree_array(touched);
}
void matrix_solver_t::update_inputs()
@@ -378,6 +376,7 @@ void matrix_solver_t::reset()
void matrix_solver_t::update() NL_NOEXCEPT
{
const netlist_time new_timestep = solve();
+ update_inputs();
if (m_params.m_dynamic_ts && has_timestep_devices() && new_timestep > netlist_time::zero())
{
@@ -389,6 +388,7 @@ void matrix_solver_t::update() NL_NOEXCEPT
void matrix_solver_t::update_forced()
{
ATTR_UNUSED const netlist_time new_timestep = solve();
+ update_inputs();
if (m_params.m_dynamic_ts && has_timestep_devices())
{
@@ -423,7 +423,7 @@ void matrix_solver_t::solve_base()
// reschedule ....
if (this_resched > 1 && !m_Q_sync.net().is_queued())
{
- log().warning("NEWTON_LOOPS exceeded on net {1}... reschedule", this->name());
+ log().warning(MW_1_NEWTON_LOOPS_EXCEEDED_ON_NET_1, this->name());
m_Q_sync.net().toggle_new_Q();
m_Q_sync.net().reschedule_in_queue(m_params.m_nr_recalc_delay);
}
@@ -449,7 +449,6 @@ const netlist_time matrix_solver_t::solve()
step(delta);
solve_base();
const netlist_time next_time_step = compute_next_timestep(delta.as_double());
- update_inputs();
return next_time_step;
}
@@ -479,7 +478,7 @@ void matrix_solver_t::add_term(std::size_t k, terminal_t *term)
else // if (ot<0)
{
m_rails_temp[k]->add(term, ot, true);
- log().fatal("found term with missing othernet {1}\n", term->name());
+ log().fatal(MF_1_FOUND_TERM_WITH_MISSING_OTHERNET, term->name());
}
}
}
@@ -490,14 +489,10 @@ netlist_time matrix_solver_t::compute_next_timestep(const double cur_ts)
if (m_params.m_dynamic_ts)
{
- /*
- * FIXME: We should extend the logic to use either all nets or
- * only output nets.
- */
for (std::size_t k = 0, iN=m_terms.size(); k < iN; k++)
{
analog_net_t *n = m_nets[k];
- terms_for_net_t *t = m_terms[k];
+ terms_for_net_t *t = m_terms[k].get();
const nl_double DD_n = (n->Q_Analog() - t->m_last_V);
const nl_double hn = cur_ts;
@@ -546,12 +541,12 @@ void matrix_solver_t::log_stats()
log().verbose(" {1:6.3} average newton raphson loops",
static_cast<double>(this->m_stat_newton_raphson) / static_cast<double>(this->m_stat_vsolver_calls));
log().verbose(" {1:10} invocations ({2:6.0} Hz) {3:10} gs fails ({4:6.2} %) {5:6.3} average",
- this->m_stat_calculations(),
- static_cast<double>(this->m_stat_calculations()) / this->netlist().time().as_double(),
- this->m_iterative_fail(),
- 100.0 * static_cast<double>(this->m_iterative_fail())
- / static_cast<double>(this->m_stat_calculations()),
- static_cast<double>(this->m_iterative_total()) / static_cast<double>(this->m_stat_calculations()));
+ this->m_stat_calculations,
+ static_cast<double>(this->m_stat_calculations) / this->netlist().time().as_double(),
+ this->m_iterative_fail,
+ 100.0 * static_cast<double>(this->m_iterative_fail)
+ / static_cast<double>(this->m_stat_calculations),
+ static_cast<double>(this->m_iterative_total) / static_cast<double>(this->m_stat_calculations));
}
}
diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h
index 522b157eafb..82910e9c4d1 100644
--- a/src/lib/netlist/solver/nld_matrix_solver.h
+++ b/src/lib/netlist/solver/nld_matrix_solver.h
@@ -8,11 +8,9 @@
#ifndef NLD_MATRIX_SOLVER_H_
#define NLD_MATRIX_SOLVER_H_
-#include <type_traits>
-
-//#include "solver/nld_solver.h"
#include "nl_base.h"
-#include "plib/pstream.h"
+#include "nl_errstr.h"
+#include "plib/putil.h"
namespace netlist
{
@@ -36,10 +34,8 @@ namespace netlist
};
-class terms_for_net_t
+class terms_for_net_t : plib::nocopyassignmove
{
- P_PREVENT_COPYING(terms_for_net_t)
-
public:
terms_for_net_t();
@@ -47,14 +43,14 @@ public:
void add(terminal_t *term, int net_other, bool sorted);
- inline std::size_t count() { return m_terms.size(); }
+ inline std::size_t count() const { return m_terms.size(); }
inline terminal_t **terms() { return m_terms.data(); }
inline int *connected_net_idx() { return m_connected_net_idx.data(); }
inline nl_double *gt() { return m_gt.data(); }
inline nl_double *go() { return m_go.data(); }
inline nl_double *Idr() { return m_Idr.data(); }
- inline nl_double **connected_net_V() { return m_connected_net_V.data(); }
+ inline nl_double * const *connected_net_V() const { return m_connected_net_V.data(); }
void set_pointers();
@@ -110,11 +106,18 @@ public:
virtual ~matrix_solver_t();
- void setup(analog_net_t::list_t &nets) { vsetup(nets); }
+ void setup(analog_net_t::list_t &nets)
+ {
+ vsetup(nets);
+ }
void solve_base();
+ /* after every call to solve, update inputs must be called.
+ * this can be done as well as a batch to ease parallel processing.
+ */
const netlist_time solve();
+ void update_inputs();
inline bool has_dynamic_devices() const { return m_dynamic_devices.size() > 0; }
inline bool has_timestep_devices() const { return m_step_devices.size() > 0; }
@@ -133,13 +136,11 @@ public:
public:
int get_net_idx(detail::net_t *net);
- plib::plog_base<NL_DEBUG> &log() { return netlist().log(); }
-
virtual void log_stats();
- virtual void create_solver_code(plib::postream &strm)
+ virtual std::pair<pstring, pstring> create_solver_code()
{
- strm.writeline(plib::pfmt("/* {1} doesn't support static compile */"));
+ return std::pair<pstring, pstring>("", plib::pfmt("/* {1} doesn't support static compile */"));
}
protected:
@@ -163,7 +164,7 @@ protected:
template <typename T>
void build_LE_RHS();
- std::vector<terms_for_net_t *> m_terms;
+ std::vector<std::unique_ptr<terms_for_net_t>> m_terms;
std::vector<analog_net_t *> m_nets;
std::vector<std::unique_ptr<proxied_analog_output_t>> m_inps;
@@ -191,31 +192,30 @@ private:
void step(const netlist_time &delta);
- void update_inputs();
-
const eSortType m_sort;
};
template <typename T>
T matrix_solver_t::delta(const T * RESTRICT V)
{
- /* FIXME: Ideally we should also include currents (RHS) here. This would
+ /* NOTE: Ideally we should also include currents (RHS) here. This would
* need a reevaluation of the right hand side after voltages have been updated
* and thus belong into a different calculation. This applies to all solvers.
*/
- std::size_t iN = this->m_terms.size();
+ const std::size_t iN = this->m_terms.size();
T cerr = 0;
- for (unsigned i = 0; i < iN; i++)
- cerr = std::max(cerr, std::abs(V[i] - static_cast<T>(this->m_nets[i]->m_cur_Analog)));
+ for (std::size_t i = 0; i < iN; i++)
+ cerr = std::max(cerr, std::abs(V[i] - static_cast<T>(this->m_nets[i]->Q_Analog())));
return cerr;
}
template <typename T>
void matrix_solver_t::store(const T * RESTRICT V)
{
- for (std::size_t i = 0, iN=m_terms.size(); i < iN; i++)
- this->m_nets[i]->m_cur_Analog = V[i];
+ const std::size_t iN = this->m_terms.size();
+ for (std::size_t i = 0; i < iN; i++)
+ this->m_nets[i]->set_Q_Analog(V[i]);
}
template <typename T>
@@ -225,26 +225,28 @@ void matrix_solver_t::build_LE_A()
T &child = static_cast<T &>(*this);
- const unsigned iN = child.N();
- for (unsigned k = 0; k < iN; k++)
+ const std::size_t iN = child.N();
+ for (std::size_t k = 0; k < iN; k++)
{
- for (unsigned i=0; i < iN; i++)
+ terms_for_net_t *terms = m_terms[k].get();
+
+ for (std::size_t i=0; i < iN; i++)
child.A(k,i) = 0.0;
- const std::size_t terms_count = m_terms[k]->count();
- const std::size_t railstart = m_terms[k]->m_railstart;
- const nl_double * RESTRICT gt = m_terms[k]->gt();
+ const std::size_t terms_count = terms->count();
+ const std::size_t railstart = terms->m_railstart;
+ const nl_double * const RESTRICT gt = terms->gt();
{
nl_double akk = 0.0;
- for (unsigned i = 0; i < terms_count; i++)
+ for (std::size_t i = 0; i < terms_count; i++)
akk += gt[i];
child.A(k,k) = akk;
}
- const nl_double * RESTRICT go = m_terms[k]->go();
- const int * RESTRICT net_other = m_terms[k]->connected_net_idx();
+ const nl_double * const RESTRICT go = terms->go();
+ int * RESTRICT net_other = terms->connected_net_idx();
for (std::size_t i = 0; i < railstart; i++)
child.A(k,net_other[i]) -= go[i];
@@ -257,15 +259,15 @@ void matrix_solver_t::build_LE_RHS()
static_assert(std::is_base_of<matrix_solver_t, T>::value, "T must derive from matrix_solver_t");
T &child = static_cast<T &>(*this);
- const unsigned iN = child.N();
- for (unsigned k = 0; k < iN; k++)
+ const std::size_t iN = child.N();
+ for (std::size_t k = 0; k < iN; k++)
{
nl_double rhsk_a = 0.0;
nl_double rhsk_b = 0.0;
const std::size_t terms_count = m_terms[k]->count();
- const nl_double * RESTRICT go = m_terms[k]->go();
- const nl_double * RESTRICT Idr = m_terms[k]->Idr();
+ const nl_double * const RESTRICT go = m_terms[k]->go();
+ const nl_double * const RESTRICT Idr = m_terms[k]->Idr();
const nl_double * const * RESTRICT other_cur_analog = m_terms[k]->connected_net_V();
for (std::size_t i = 0; i < terms_count; i++)
diff --git a/src/lib/netlist/solver/nld_ms_direct.h b/src/lib/netlist/solver/nld_ms_direct.h
index 5b4a33ce66e..b929fb6ed22 100644
--- a/src/lib/netlist/solver/nld_ms_direct.h
+++ b/src/lib/netlist/solver/nld_ms_direct.h
@@ -19,7 +19,7 @@
* going forward in case we implement cuda solvers in the future.
*/
#define NL_USE_DYNAMIC_ALLOCATION (0)
-#define TEST_PARALLEL (0)
+#define TEST_PARALLEL (0 )
#if TEST_PARALLEL
#include <thread>
@@ -36,16 +36,17 @@ namespace netlist
#if TEST_PARALLEL
#define MAXTHR 10
-static const int num_thr = 1;
+static const int num_thr = 3;
struct thr_intf
{
+ virtual ~thr_intf() = default;
virtual void do_work(const int id, void *param) = 0;
};
struct ti_t
{
- volatile std::atomic<int> lo;
+ /*volatile */std::atomic<int> lo;
thr_intf *intf;
void *params;
// int block[29]; /* make it 256 bytes */
@@ -113,7 +114,7 @@ static void thr_dispose()
}
#endif
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
#if TEST_PARALLEL
class matrix_solver_direct_t: public matrix_solver_t, public thr_intf
#else
@@ -123,8 +124,8 @@ class matrix_solver_direct_t: public matrix_solver_t
friend class matrix_solver_t;
public:
- matrix_solver_direct_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, const unsigned size);
- matrix_solver_direct_t(netlist_t &anetlist, const pstring &name, const eSortType sort, const solver_parameters_t *params, const unsigned size);
+ matrix_solver_direct_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, const std::size_t size);
+ matrix_solver_direct_t(netlist_t &anetlist, const pstring &name, const eSortType sort, const solver_parameters_t *params, const std::size_t size);
virtual ~matrix_solver_direct_t();
@@ -135,7 +136,7 @@ protected:
virtual unsigned vsolve_non_dynamic(const bool newton_raphson) override;
unsigned solve_non_dynamic(const bool newton_raphson);
- inline unsigned N() const { if (m_N == 0) return m_dim; else return m_N; }
+ constexpr std::size_t N() const { return (m_N == 0) ? m_dim : m_N; }
void LE_solve();
@@ -156,13 +157,14 @@ protected:
inline nl_ext_double &RHS(const T1 &r) { return m_A[r * m_pitch + N()]; }
#else
template <typename T1, typename T2>
- inline nl_ext_double &A(const T1 &r, const T2 &c) { return m_A[r][c]; }
+ nl_ext_double &A(const T1 &r, const T2 &c) { return m_A[r][c]; }
template <typename T1>
- inline nl_ext_double &RHS(const T1 &r) { return m_A[r][N()]; }
+ nl_ext_double &RHS(const T1 &r) { return m_A[r][N()]; }
#endif
nl_double m_last_RHS[storage_N]; // right hand side - contains currents
private:
+ //static const std::size_t m_pitch = (((storage_N + 1) + 0) / 1) * 1;
static const std::size_t m_pitch = (((storage_N + 1) + 7) / 8) * 8;
//static const std::size_t m_pitch = (((storage_N + 1) + 15) / 16) * 16;
//static const std::size_t m_pitch = (((storage_N + 1) + 31) / 32) * 32;
@@ -173,7 +175,7 @@ private:
#endif
//nl_ext_double m_RHSx[storage_N];
- const unsigned m_dim;
+ const std::size_t m_dim;
};
@@ -181,44 +183,41 @@ private:
// matrix_solver_direct
// ----------------------------------------------------------------------------------------
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
matrix_solver_direct_t<m_N, storage_N>::~matrix_solver_direct_t()
{
#if (NL_USE_DYNAMIC_ALLOCATION)
- pfree_array(m_A);
+ plib::pfree_array(m_A);
#endif
#if TEST_PARALLEL
thr_dispose();
#endif
}
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
void matrix_solver_direct_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets)
{
- if (m_dim < nets.size())
- log().fatal("Dimension {1} less than {2}", m_dim, nets.size());
-
matrix_solver_t::setup_base(nets);
/* add RHS element */
- for (unsigned k = 0; k < N(); k++)
+ for (std::size_t k = 0; k < N(); k++)
{
- terms_for_net_t * t = m_terms[k];
+ terms_for_net_t * t = m_terms[k].get();
- if (!plib::container::contains(t->m_nzrd, N()))
- t->m_nzrd.push_back(N());
+ if (!plib::container::contains(t->m_nzrd, static_cast<unsigned>(N())))
+ t->m_nzrd.push_back(static_cast<unsigned>(N()));
}
netlist().save(*this, m_last_RHS, "m_last_RHS");
- for (unsigned k = 0; k < N(); k++)
+ for (std::size_t k = 0; k < N(); k++)
netlist().save(*this, RHS(k), plib::pfmt("RHS.{1}")(k));
}
#if TEST_PARALLEL
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
void matrix_solver_direct_t<m_N, storage_N>::do_work(const int id, void *param)
{
const int i = x_i[id];
@@ -242,58 +241,13 @@ void matrix_solver_direct_t<m_N, storage_N>::do_work(const int id, void *param)
}
#endif
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
void matrix_solver_direct_t<m_N, storage_N>::LE_solve()
{
- const unsigned kN = N();
-
- for (unsigned i = 0; i < kN; i++) {
- // FIXME: use a parameter to enable pivoting? m_pivot
- if (!TEST_PARALLEL && m_params.m_pivot)
- {
- /* Find the row with the largest first value */
- unsigned maxrow = i;
- for (unsigned j = i + 1; j < kN; j++)
- {
- //if (std::abs(m_A[j][i]) > std::abs(m_A[maxrow][i]))
- if (A(j,i) * A(j,i) > A(maxrow,i) * A(maxrow,i))
- maxrow = j;
- }
-
- if (maxrow != i)
- {
- /* Swap the maxrow and ith row */
- for (unsigned k = 0; k < kN + 1; k++) {
- std::swap(A(i,k), A(maxrow,k));
- }
- //std::swap(RHS(i), RHS(maxrow));
- }
- /* FIXME: Singular matrix? */
- const nl_double f = 1.0 / A(i,i);
-
- /* Eliminate column i from row j */
-
- for (unsigned j = i + 1; j < kN; j++)
- {
- const nl_double f1 = - A(j,i) * f;
- if (f1 != NL_FCONST(0.0))
- {
- const nl_double * RESTRICT pi = &A(i,i+1);
- nl_double * RESTRICT pj = &A(j,i+1);
-#if 1
- vec_add_mult_scalar(kN-i,pi,f1,pj);
-#else
- vec_add_mult_scalar(kN-i-1,pj,f1,pi);
- //for (unsigned k = i+1; k < kN; k++)
- // pj[k] = pj[k] + pi[k] * f1;
- //for (unsigned k = i+1; k < kN; k++)
- //A(j,k) += A(i,k) * f1;
- RHS(j) += RHS(i) * f1;
-#endif
- }
- }
- }
- else
+ const std::size_t kN = N();
+ if (!(!TEST_PARALLEL && m_params.m_pivot))
+ {
+ for (std::size_t i = 0; i < kN; i++)
{
#if TEST_PARALLEL
const unsigned eb = m_terms[i]->m_nzbd.size();
@@ -326,29 +280,76 @@ void matrix_solver_direct_t<m_N, storage_N>::LE_solve()
const auto &nzrd = m_terms[i]->m_nzrd;
const auto &nzbd = m_terms[i]->m_nzbd;
- for (auto & j : nzbd)
+ for (std::size_t j : nzbd)
{
const nl_double f1 = -f * A(j,i);
- for (auto & k : nzrd)
+ for (std::size_t k : nzrd)
A(j,k) += A(i,k) * f1;
//RHS(j) += RHS(i) * f1;
+ }
#endif
+ }
+ }
+ else
+ {
+ for (std::size_t i = 0; i < kN; i++)
+ {
+ /* Find the row with the largest first value */
+ std::size_t maxrow = i;
+ for (std::size_t j = i + 1; j < kN; j++)
+ {
+ //if (std::abs(m_A[j][i]) > std::abs(m_A[maxrow][i]))
+ if (A(j,i) * A(j,i) > A(maxrow,i) * A(maxrow,i))
+ maxrow = j;
+ }
+
+ if (maxrow != i)
+ {
+ /* Swap the maxrow and ith row */
+ for (std::size_t k = 0; k < kN + 1; k++) {
+ std::swap(A(i,k), A(maxrow,k));
+ }
+ //std::swap(RHS(i), RHS(maxrow));
+ }
+ /* FIXME: Singular matrix? */
+ const nl_double f = 1.0 / A(i,i);
+
+ /* Eliminate column i from row j */
+
+ for (std::size_t j = i + 1; j < kN; j++)
+ {
+ const nl_double f1 = - A(j,i) * f;
+ if (f1 != NL_FCONST(0.0))
+ {
+ const nl_double * RESTRICT pi = &A(i,i+1);
+ nl_double * RESTRICT pj = &A(j,i+1);
+#if 1
+ vec_add_mult_scalar_p(kN-i,pi,f1,pj);
+#else
+ vec_add_mult_scalar_p(kN-i-1,pj,f1,pi);
+ //for (unsigned k = i+1; k < kN; k++)
+ // pj[k] = pj[k] + pi[k] * f1;
+ //for (unsigned k = i+1; k < kN; k++)
+ //A(j,k) += A(i,k) * f1;
+ RHS(j) += RHS(i) * f1;
+#endif
+ }
}
}
}
}
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
template <typename T>
void matrix_solver_direct_t<m_N, storage_N>::LE_back_subst(
T * RESTRICT x)
{
- const unsigned kN = N();
+ const std::size_t kN = N();
/* back substitution */
if (m_params.m_pivot)
{
- for (unsigned j = kN; j-- > 0; )
+ for (std::size_t j = kN; j-- > 0; )
{
T tmp = 0;
for (std::size_t k = j+1; k < kN; k++)
@@ -358,14 +359,14 @@ void matrix_solver_direct_t<m_N, storage_N>::LE_back_subst(
}
else
{
- for (unsigned j = kN; j-- > 0; )
+ for (std::size_t j = kN; j-- > 0; )
{
T tmp = 0;
const auto *p = m_terms[j]->m_nzrd.data();
const auto e = m_terms[j]->m_nzrd.size() - 1; /* exclude RHS element */
- for (unsigned k = 0; k < e; k++)
+ for (std::size_t k = 0; k < e; k++)
{
const auto pk = p[k];
tmp += A(j,pk) * x[pk];
@@ -376,7 +377,7 @@ void matrix_solver_direct_t<m_N, storage_N>::LE_back_subst(
}
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
unsigned matrix_solver_direct_t<m_N, storage_N>::solve_non_dynamic(const bool newton_raphson)
{
nl_double new_V[storage_N]; // = { 0.0 };
@@ -399,27 +400,27 @@ unsigned matrix_solver_direct_t<m_N, storage_N>::solve_non_dynamic(const bool ne
}
}
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
inline unsigned matrix_solver_direct_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
{
build_LE_A<matrix_solver_direct_t>();
build_LE_RHS<matrix_solver_direct_t>();
- for (unsigned i=0, iN=N(); i < iN; i++)
+ for (std::size_t i=0, iN=N(); i < iN; i++)
m_last_RHS[i] = RHS(i);
this->m_stat_calculations++;
return this->solve_non_dynamic(newton_raphson);
}
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
matrix_solver_direct_t<m_N, storage_N>::matrix_solver_direct_t(netlist_t &anetlist, const pstring &name,
- const solver_parameters_t *params, const unsigned size)
+ const solver_parameters_t *params, const std::size_t size)
: matrix_solver_t(anetlist, name, ASCENDING, params)
, m_dim(size)
{
#if (NL_USE_DYNAMIC_ALLOCATION)
- m_A = palloc_array(nl_ext_double, N() * m_pitch);
+ m_A = plib::palloc_array<nl_ext_double>(N() * m_pitch);
#endif
for (unsigned k = 0; k < N(); k++)
{
@@ -430,14 +431,14 @@ matrix_solver_direct_t<m_N, storage_N>::matrix_solver_direct_t(netlist_t &anetli
#endif
}
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
matrix_solver_direct_t<m_N, storage_N>::matrix_solver_direct_t(netlist_t &anetlist, const pstring &name,
- const eSortType sort, const solver_parameters_t *params, const unsigned size)
+ const eSortType sort, const solver_parameters_t *params, const std::size_t size)
: matrix_solver_t(anetlist, name, sort, params)
, m_dim(size)
{
#if (NL_USE_DYNAMIC_ALLOCATION)
- m_A = palloc_array(nl_ext_double, N() * m_pitch);
+ m_A = plib::palloc_array<nl_ext_double>(N() * m_pitch);
#endif
for (unsigned k = 0; k < N(); k++)
{
diff --git a/src/lib/netlist/solver/nld_ms_direct_lu.h b/src/lib/netlist/solver/nld_ms_direct_lu.h
index f71982f8eb4..c379cf8d055 100644
--- a/src/lib/netlist/solver/nld_ms_direct_lu.h
+++ b/src/lib/netlist/solver/nld_ms_direct_lu.h
@@ -4,7 +4,7 @@
* nld_ms_direct.h
*
*/
-
+#if 0
#ifndef NLD_MS_DIRECT_H_
#define NLD_MS_DIRECT_H_
@@ -345,10 +345,10 @@ void matrix_solver_direct_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets)
if(0)
for (unsigned k = 0; k < N(); k++)
{
- netlist().log("{1:3}: ", k);
+ log("{1:3}: ", k);
for (unsigned j = 0; j < m_terms[k]->m_nzrd.size(); j++)
- netlist().log(" {1:3}", m_terms[k]->m_nzrd[j]);
- netlist().log("\n");
+ log(" {1:3}", m_terms[k]->m_nzrd[j]);
+ log("\n");
}
/*
@@ -634,3 +634,4 @@ matrix_solver_direct_t<m_N, storage_N>::matrix_solver_direct_t(const eSolverType
} // namespace netlist
#endif /* NLD_MS_DIRECT_H_ */
+#endif
diff --git a/src/lib/netlist/solver/nld_ms_gcr.h b/src/lib/netlist/solver/nld_ms_gcr.h
index 80a68604a56..eda9b14aa74 100644
--- a/src/lib/netlist/solver/nld_ms_gcr.h
+++ b/src/lib/netlist/solver/nld_ms_gcr.h
@@ -5,8 +5,6 @@
*
* Gaussian elimination using compressed row format.
*
- * Fow w==1 we will do the classic Gauss-Seidel approach
- *
*/
#ifndef NLD_MS_GCR_H_
@@ -21,24 +19,20 @@
#include "solver/vector_base.h"
#include "plib/pstream.h"
-#define NL_USE_SSE 0
-#if NL_USE_SSE
-#include <mmintrin.h>
-#endif
-
namespace netlist
{
namespace devices
{
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
class matrix_solver_GCR_t: public matrix_solver_t
{
public:
matrix_solver_GCR_t(netlist_t &anetlist, const pstring &name,
- const solver_parameters_t *params, const unsigned size)
+ const solver_parameters_t *params, const std::size_t size)
: matrix_solver_t(anetlist, name, matrix_solver_t::ASCENDING, params)
, m_dim(size)
+ , mat(size)
, m_proc(nullptr)
{
}
@@ -47,55 +41,50 @@ public:
{
}
- inline unsigned N() const { if (m_N == 0) return m_dim; else return m_N; }
+ constexpr std::size_t N() const { return (m_N == 0) ? m_dim : m_N; }
virtual void vsetup(analog_net_t::list_t &nets) override;
virtual unsigned vsolve_non_dynamic(const bool newton_raphson) override;
- virtual void create_solver_code(plib::postream &strm) override;
+ virtual std::pair<pstring, pstring> create_solver_code() override;
private:
- void csc_private(plib::postream &strm);
+ //typedef typename mat_cr_t<storage_N>::type mattype;
+ typedef typename mat_cr_t<storage_N>::index_type mattype;
- using extsolver = void (*)(double * RESTRICT m_A, double * RESTRICT RHS);
+ void csc_private(plib::putf8_fmt_writer &strm);
- pstring static_compile_name()
- {
- plib::postringstream t;
- csc_private(t);
- std::hash<pstring> h;
+ using extsolver = void (*)(double * RESTRICT m_A, double * RESTRICT RHS, double * RESTRICT V);
- return plib::pfmt("nl_gcr_{1:x}_{2}")(h( t.str() ))(mat.nz_num);
- }
+ pstring static_compile_name();
- unsigned m_dim;
+ const std::size_t m_dim;
std::vector<unsigned> m_term_cr[storage_N];
mat_cr_t<storage_N> mat;
- nl_double m_A[storage_N * storage_N];
extsolver m_proc;
};
// ----------------------------------------------------------------------------------------
-// matrix_solver - GMRES
+// matrix_solver - GCR
// ----------------------------------------------------------------------------------------
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
void matrix_solver_GCR_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets)
{
setup_base(nets);
- unsigned nz = 0;
- const unsigned iN = this->N();
+ mattype nz = 0;
+ const std::size_t iN = this->N();
/* build the final matrix */
bool touched[storage_N][storage_N] = { { false } };
- for (unsigned k = 0; k < iN; k++)
+ for (std::size_t k = 0; k < iN; k++)
{
- for (auto & j : this->m_terms[k]->m_nz)
+ for (auto &j : this->m_terms[k]->m_nz)
touched[k][j] = true;
}
@@ -103,42 +92,31 @@ void matrix_solver_GCR_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets)
unsigned ops = 0;
- const bool static_compile = false;
- for (unsigned k = 0; k < iN; k++)
+ for (std::size_t k = 0; k < iN; k++)
{
ops++; // 1/A(k,k)
- if (static_compile) printf("const double fd%d = 1.0 / A(%d,%d); \n", k, k, k);
- for (unsigned row = k + 1; row < iN; row++)
+ for (std::size_t row = k + 1; row < iN; row++)
{
if (touched[row][k])
{
ops++;
fc++;
- if (static_compile) printf(" const double f%d = -fd%d * A(%d,%d); \n", fc, k, row, k);
- for (unsigned col = k + 1; col < iN; col++)
+ for (std::size_t col = k + 1; col < iN; col++)
if (touched[k][col])
{
- if (touched[row][col])
- {
- if (static_compile) printf(" A(%d,%d) += f%d * A(%d,%d); \n", row, col, fc, k, col);
- } else
- {
- if (static_compile) printf(" A(%d,%d) = f%d * A(%d,%d); \n", row, col, fc, k, col);
- }
touched[row][col] = true;
ops += 2;
}
- if (static_compile) printf(" RHS(%d) += f%d * RHS(%d); \n", row, fc, k);
}
}
}
- for (unsigned k=0; k<iN; k++)
+ for (mattype k=0; k<iN; k++)
{
mat.ia[k] = nz;
- for (unsigned j=0; j<iN; j++)
+ for (mattype j=0; j<iN; j++)
{
if (touched[k][j])
{
@@ -151,10 +129,10 @@ void matrix_solver_GCR_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets)
m_term_cr[k].clear();
/* build pointers into the compressed row format matrix for each terminal */
- for (unsigned j=0; j< this->m_terms[k]->m_railstart;j++)
+ for (std::size_t j=0; j< this->m_terms[k]->m_railstart;j++)
{
int other = this->m_terms[k]->connected_net_idx()[j];
- for (unsigned i = mat.ia[k]; i < nz; i++)
+ for (auto i = mat.ia[k]; i < nz; i++)
if (other == static_cast<int>(mat.ja[i]))
{
m_term_cr[k].push_back(i);
@@ -179,82 +157,173 @@ void matrix_solver_GCR_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets)
if (m_proc != nullptr)
this->log().verbose("External static solver {1} found ...", symname);
else
- this->log().verbose("External static solver {1} not found ...", symname);
+ this->log().warning("External static solver {1} not found ...", symname);
}
}
+#if 0
+template <std::size_t m_N, std::size_t storage_N>
+void matrix_solver_GCR_t<m_N, storage_N>::csc_private(plib::putf8_fmt_writer &strm)
+{
+ const std::size_t iN = N();
+ for (std::size_t i = 0; i < iN - 1; i++)
+ {
+ const auto &nzbd = this->m_terms[i]->m_nzbd;
+
+ if (nzbd.size() > 0)
+ {
+ std::size_t pi = mat.diag[i];
+
+ //const nl_double f = 1.0 / m_A[pi++];
+ strm("const double f{1} = 1.0 / m_A[{2}];\n", i, pi);
+ pi++;
+ const std::size_t piie = mat.ia[i+1];
+
+ //for (auto & j : nzbd)
+ for (std::size_t j : nzbd)
+ {
+ // proceed to column i
+ std::size_t pj = mat.ia[j];
+
+ while (mat.ja[pj] < i)
+ pj++;
+
+ //const nl_double f1 = - m_A[pj++] * f;
+ strm("\tconst double f{1}_{2} = -f{3} * m_A[{4}];\n", i, j, i, pj);
+ pj++;
-template <unsigned m_N, unsigned storage_N>
-void matrix_solver_GCR_t<m_N, storage_N>::csc_private(plib::postream &strm)
+ // subtract row i from j */
+ for (std::size_t pii = pi; pii<piie; )
+ {
+ while (mat.ja[pj] < mat.ja[pii])
+ pj++;
+ //m_A[pj++] += m_A[pii++] * f1;
+ strm("\tm_A[{1}] += m_A[{2}] * f{3}_{4};\n", pj, pii, i, j);
+ pj++; pii++;
+ }
+ //RHS[j] += f1 * RHS[i];
+ strm("\tRHS[{1}] += f{2}_{3} * RHS[{4}];\n", j, i, j, i);
+ }
+ }
+ }
+
+ //new_V[iN - 1] = RHS[iN - 1] / mat.A[mat.diag[iN - 1]];
+ strm("\tV[{1}] = RHS[{2}] / m_A[{3}];\n", iN - 1, iN - 1, mat.diag[iN - 1]);
+ for (std::size_t j = iN - 1; j-- > 0;)
+ {
+ strm("\tdouble tmp{1} = 0.0;\n", j);
+ const std::size_t e = mat.ia[j+1];
+ for (std::size_t pk = mat.diag[j] + 1; pk < e; pk++)
+ {
+ strm("\ttmp{1} += m_A[{2}] * V[{3}];\n", j, pk, mat.ja[pk]);
+ }
+ strm("\tV[{1}] = (RHS[{1}] - tmp{1}) / m_A[{4}];\n", j, j, j, mat.diag[j]);
+ }
+}
+#else
+template <std::size_t m_N, std::size_t storage_N>
+void matrix_solver_GCR_t<m_N, storage_N>::csc_private(plib::putf8_fmt_writer &strm)
{
- const unsigned iN = N();
- for (unsigned i = 0; i < iN - 1; i++)
+ const std::size_t iN = N();
+
+ for (std::size_t i = 0; i < mat.nz_num; i++)
+ strm("double m_A{1} = m_A[{2}];\n", i, i);
+
+ for (std::size_t i = 0; i < iN - 1; i++)
{
const auto &nzbd = this->m_terms[i]->m_nzbd;
if (nzbd.size() > 0)
{
- unsigned pi = mat.diag[i];
+ std::size_t pi = mat.diag[i];
//const nl_double f = 1.0 / m_A[pi++];
- strm.writeline(plib::pfmt("const double f{1} = 1.0 / m_A[{2}];")(i)(pi));
+ strm("const double f{1} = 1.0 / m_A{2};\n", i, pi);
pi++;
- const unsigned piie = mat.ia[i+1];
+ const std::size_t piie = mat.ia[i+1];
- for (auto & j : nzbd)
+ //for (auto & j : nzbd)
+ for (std::size_t j : nzbd)
{
// proceed to column i
- unsigned pj = mat.ia[j];
+ std::size_t pj = mat.ia[j];
while (mat.ja[pj] < i)
pj++;
//const nl_double f1 = - m_A[pj++] * f;
- strm.writeline(plib::pfmt("\tconst double f{1}_{2} = -f{3} * m_A[{4}];")(i)(j)(i)(pj));
+ strm("\tconst double f{1}_{2} = -f{3} * m_A{4};\n", i, j, i, pj);
pj++;
// subtract row i from j */
- for (unsigned pii = pi; pii<piie; )
+ for (std::size_t pii = pi; pii<piie; )
{
while (mat.ja[pj] < mat.ja[pii])
pj++;
//m_A[pj++] += m_A[pii++] * f1;
- strm.writeline(plib::pfmt("\tm_A[{1}] += m_A[{2}] * f{3}_{4};")(pj)(pii)(i)(j));
+ strm("\tm_A{1} += m_A{2} * f{3}_{4};\n", pj, pii, i, j);
pj++; pii++;
}
//RHS[j] += f1 * RHS[i];
- strm.writeline(plib::pfmt("\tRHS[{1}] += f{2}_{3} * RHS[{4}];")(j)(i)(j)(i));
+ strm("\tRHS[{1}] += f{2}_{3} * RHS[{4}];\n", j, i, j, i);
}
}
}
+
+ //new_V[iN - 1] = RHS[iN - 1] / mat.A[mat.diag[iN - 1]];
+ strm("\tV[{1}] = RHS[{2}] / m_A{3};\n", iN - 1, iN - 1, mat.diag[iN - 1]);
+ for (std::size_t j = iN - 1; j-- > 0;)
+ {
+ strm("\tdouble tmp{1} = 0.0;\n", j);
+ const std::size_t e = mat.ia[j+1];
+ for (std::size_t pk = mat.diag[j] + 1; pk < e; pk++)
+ {
+ strm("\ttmp{1} += m_A{2} * V[{3}];\n", j, pk, mat.ja[pk]);
+ }
+ strm("\tV[{1}] = (RHS[{1}] - tmp{1}) / m_A{4};\n", j, j, j, mat.diag[j]);
+ }
+}
+#endif
+
+template <std::size_t m_N, std::size_t storage_N>
+pstring matrix_solver_GCR_t<m_N, storage_N>::static_compile_name()
+{
+ plib::postringstream t;
+ plib::putf8_fmt_writer w(t);
+ csc_private(w);
+ std::hash<pstring> h;
+
+ return plib::pfmt("nl_gcr_{1:x}_{2}")(h( t.str() ))(mat.nz_num);
}
-template <unsigned m_N, unsigned storage_N>
-void matrix_solver_GCR_t<m_N, storage_N>::create_solver_code(plib::postream &strm)
+template <std::size_t m_N, std::size_t storage_N>
+std::pair<pstring, pstring> matrix_solver_GCR_t<m_N, storage_N>::create_solver_code()
{
- //const unsigned iN = N();
+ plib::postringstream t;
+ plib::putf8_fmt_writer strm(t);
+ pstring name = static_compile_name();
- strm.writeline(plib::pfmt("extern \"C\" void {1}(double * _restrict m_A, double * _restrict RHS)")(static_compile_name()));
- strm.writeline("{");
+ strm.writeline(plib::pfmt("extern \"C\" void {1}(double * __restrict m_A, double * __restrict RHS, double * __restrict V)\n")(name));
+ strm.writeline("{\n");
csc_private(strm);
- strm.writeline("}");
+ strm.writeline("}\n");
+ return std::pair<pstring, pstring>(name, t.str());
}
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
unsigned matrix_solver_GCR_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
{
- const unsigned iN = this->N();
+ const std::size_t iN = this->N();
nl_double RHS[storage_N];
nl_double new_V[storage_N];
- for (unsigned i=0, e=mat.nz_num; i<e; i++)
- m_A[i] = 0.0;
+ mat.set_scalar(0.0);
- for (unsigned k = 0; k < iN; k++)
+ for (std::size_t k = 0; k < iN; k++)
{
- terms_for_net_t *t = this->m_terms[k];
+ terms_for_net_t *t = this->m_terms[k].get();
nl_double gtot_t = 0.0;
nl_double RHS_t = 0.0;
@@ -264,126 +333,109 @@ unsigned matrix_solver_GCR_t<m_N, storage_N>::vsolve_non_dynamic(const bool newt
const nl_double * const RESTRICT go = t->go();
const nl_double * const RESTRICT Idr = t->Idr();
const nl_double * const * RESTRICT other_cur_analog = t->connected_net_V();
+ const unsigned * const RESTRICT tcr = m_term_cr[k].data();
-#if (0 ||NL_USE_SSE)
- __m128d mg = _mm_set_pd(0.0, 0.0);
- __m128d mr = _mm_set_pd(0.0, 0.0);
- unsigned i = 0;
- for (; i < term_count - 1; i+=2)
- {
- mg = _mm_add_pd(mg, _mm_loadu_pd(&gt[i]));
- mr = _mm_add_pd(mr, _mm_loadu_pd(&Idr[i]));
- }
- gtot_t = _mm_cvtsd_f64(mg) + _mm_cvtsd_f64(_mm_unpackhi_pd(mg,mg));
- RHS_t = _mm_cvtsd_f64(mr) + _mm_cvtsd_f64(_mm_unpackhi_pd(mr,mr));
- for (; i < term_count; i++)
- {
- gtot_t += gt[i];
- RHS_t += Idr[i];
- }
-#else
- for (unsigned i = 0; i < term_count; i++)
+#if 0
+ for (std::size_t i = 0; i < term_count; i++)
{
gtot_t += gt[i];
RHS_t += Idr[i];
}
-#endif
+
for (std::size_t i = railstart; i < term_count; i++)
RHS_t += go[i] * *other_cur_analog[i];
RHS[k] = RHS_t;
// add diagonal element
- m_A[mat.diag[k]] = gtot_t;
+ mat.A[mat.diag[k]] = gtot_t;
- for (unsigned i = 0; i < railstart; i++)
+ for (std::size_t i = 0; i < railstart; i++)
+ mat.A[tcr[i]] -= go[i];
+ }
+#else
+ for (std::size_t i = 0; i < railstart; i++)
{
- const unsigned pi = m_term_cr[k][i];
- m_A[pi] -= go[i];
+ mat.A[tcr[i]] -= go[i];
+ gtot_t = gtot_t + gt[i];
+ RHS_t = RHS_t + Idr[i];
}
+
+ for (std::size_t i = railstart; i < term_count; i++)
+ {
+ RHS_t += (Idr[i] + go[i] * *other_cur_analog[i]);
+ gtot_t += gt[i];
+ }
+
+ RHS[k] = RHS_t;
+ mat.A[mat.diag[k]] += gtot_t;
}
- mat.ia[iN] = mat.nz_num;
+#endif
+ mat.ia[iN] = static_cast<mattype>(mat.nz_num);
/* now solve it */
if (m_proc != nullptr)
{
//static_solver(m_A, RHS);
- m_proc(m_A, RHS);
+ m_proc(mat.A, RHS, new_V);
}
else
{
- for (unsigned i = 0; i < iN - 1; i++)
+ for (std::size_t i = 0; i < iN - 1; i++)
{
const auto &nzbd = this->m_terms[i]->m_nzbd;
if (nzbd.size() > 0)
{
- unsigned pi = mat.diag[i];
- const nl_double f = 1.0 / m_A[pi++];
- const unsigned piie = mat.ia[i+1];
+ std::size_t pi = mat.diag[i];
+ const nl_double f = 1.0 / mat.A[pi++];
+ const std::size_t piie = mat.ia[i+1];
- for (auto & j : nzbd)
+ for (std::size_t j : nzbd) // for (std::size_t j = i + 1; j < iN; j++)
{
// proceed to column i
//__builtin_prefetch(&m_A[mat.diag[j+1]], 1);
- unsigned pj = mat.ia[j];
+ std::size_t pj = mat.ia[j];
while (mat.ja[pj] < i)
pj++;
- const nl_double f1 = - m_A[pj++] * f;
+ const nl_double f1 = - mat.A[pj++] * f;
// subtract row i from j */
- for (unsigned pii = pi; pii<piie; )
+ for (std::size_t pii = pi; pii<piie; )
{
while (mat.ja[pj] < mat.ja[pii])
pj++;
- m_A[pj++] += m_A[pii++] * f1;
+ mat.A[pj++] += mat.A[pii++] * f1;
}
RHS[j] += f1 * RHS[i];
}
}
}
- }
-
- /* backward substitution
- *
- */
+ /* backward substitution
+ *
+ */
- /* row n-1 */
- new_V[iN - 1] = RHS[iN - 1] / m_A[mat.diag[iN - 1]];
+ /* row n-1 */
+ new_V[iN - 1] = RHS[iN - 1] / mat.A[mat.diag[iN - 1]];
- for (unsigned j = iN - 1; j-- > 0;)
- {
- //__builtin_prefetch(&new_V[j-1], 1);
- //if (j>0)__builtin_prefetch(&m_A[mat.diag[j-1]], 0);
-#if (NL_USE_SSE)
- __m128d tmp = _mm_set_pd1(0.0);
- const unsigned e = mat.ia[j+1];
- unsigned pk = mat.diag[j] + 1;
- for (; pk < e - 1; pk+=2)
- {
- //tmp += m_A[pk] * new_V[mat.ja[pk]];
- tmp = _mm_add_pd(tmp, _mm_mul_pd(_mm_set_pd(m_A[pk], m_A[pk+1]),
- _mm_set_pd(new_V[mat.ja[pk]], new_V[mat.ja[pk+1]])));
- }
- double tmpx = _mm_cvtsd_f64(tmp) + _mm_cvtsd_f64(_mm_unpackhi_pd(tmp,tmp));
- for (; pk < e; pk++)
- {
- tmpx += m_A[pk] * new_V[mat.ja[pk]];
- }
- new_V[j] = (RHS[j] - tmpx) / m_A[mat.diag[j]];
-#else
- double tmp = 0;
- const unsigned e = mat.ia[j+1];
- for (unsigned pk = mat.diag[j] + 1; pk < e; pk++)
+ for (std::size_t j = iN - 1; j-- > 0;)
{
- tmp += m_A[pk] * new_V[mat.ja[pk]];
+ //__builtin_prefetch(&new_V[j-1], 1);
+ //if (j>0)__builtin_prefetch(&m_A[mat.diag[j-1]], 0);
+ double tmp = 0;
+ auto jdiag = mat.diag[j];
+ const std::size_t e = mat.ia[j+1];
+ for (std::size_t pk = jdiag + 1; pk < e; pk++)
+ {
+ tmp += mat.A[pk] * new_V[mat.ja[pk]];
+ }
+ new_V[j] = (RHS[j] - tmp) / mat.A[jdiag];
}
- new_V[j] = (RHS[j] - tmp) / m_A[mat.diag[j]];
-#endif
}
+
this->m_stat_calculations++;
if (newton_raphson)
diff --git a/src/lib/netlist/solver/nld_ms_gmres.h b/src/lib/netlist/solver/nld_ms_gmres.h
index 0c5a5e6228f..a97de6a2446 100644
--- a/src/lib/netlist/solver/nld_ms_gmres.h
+++ b/src/lib/netlist/solver/nld_ms_gmres.h
@@ -23,16 +23,17 @@ namespace netlist
{
namespace devices
{
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
class matrix_solver_GMRES_t: public matrix_solver_direct_t<m_N, storage_N>
{
public:
- matrix_solver_GMRES_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, const unsigned size)
+ matrix_solver_GMRES_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, const std::size_t size)
: matrix_solver_direct_t<m_N, storage_N>(anetlist, name, matrix_solver_t::ASCENDING, params, size)
, m_use_iLU_preconditioning(true)
, m_use_more_precise_stop_condition(false)
, m_accuracy_mult(1.0)
+ , mat(size)
{
}
@@ -45,7 +46,10 @@ public:
private:
- unsigned solve_ilu_gmres(nl_double * RESTRICT x, const nl_double * RESTRICT rhs, const unsigned restart_max, const unsigned mr, nl_double accuracy);
+ //typedef typename mat_cr_t<storage_N>::type mattype;
+ typedef typename mat_cr_t<storage_N>::index_type mattype;
+
+ unsigned solve_ilu_gmres(nl_double (& RESTRICT x)[storage_N], const nl_double * RESTRICT rhs, const unsigned restart_max, const std::size_t mr, nl_double accuracy);
std::vector<unsigned> m_term_cr[storage_N];
@@ -55,7 +59,6 @@ private:
mat_cr_t<storage_N> mat;
- nl_double m_A[storage_N * storage_N];
nl_double m_LU[storage_N * storage_N];
nl_double m_c[storage_N + 1]; /* mr + 1 */
@@ -71,22 +74,22 @@ private:
// matrix_solver - GMRES
// ----------------------------------------------------------------------------------------
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
void matrix_solver_GMRES_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets)
{
matrix_solver_direct_t<m_N, storage_N>::vsetup(nets);
- unsigned nz = 0;
- const unsigned iN = this->N();
+ mattype nz = 0;
+ const std::size_t iN = this->N();
- for (unsigned k=0; k<iN; k++)
+ for (std::size_t k=0; k<iN; k++)
{
- terms_for_net_t * RESTRICT row = this->m_terms[k];
+ terms_for_net_t * RESTRICT row = this->m_terms[k].get();
mat.ia[k] = nz;
- for (unsigned j=0; j<row->m_nz.size(); j++)
+ for (std::size_t j=0; j<row->m_nz.size(); j++)
{
- mat.ja[nz] = row->m_nz[j];
+ mat.ja[nz] = static_cast<mattype>(row->m_nz[j]);
if (row->m_nz[j] == k)
mat.diag[k] = nz;
nz++;
@@ -110,10 +113,10 @@ void matrix_solver_GMRES_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets)
mat.nz_num = nz;
}
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
unsigned matrix_solver_GMRES_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
{
- const unsigned iN = this->N();
+ const std::size_t iN = this->N();
/* ideally, we could get an estimate for the spectral radius of
* Inv(D - L) * U
@@ -127,10 +130,9 @@ unsigned matrix_solver_GMRES_t<m_N, storage_N>::vsolve_non_dynamic(const bool ne
nl_double RHS[storage_N];
nl_double new_V[storage_N];
- for (unsigned i=0, e=mat.nz_num; i<e; i++)
- m_A[i] = 0.0;
+ mat.set_scalar(0.0);
- for (unsigned k = 0; k < iN; k++)
+ for (std::size_t k = 0; k < iN; k++)
{
nl_double gtot_t = 0.0;
nl_double RHS_t = 0.0;
@@ -142,7 +144,7 @@ unsigned matrix_solver_GMRES_t<m_N, storage_N>::vsolve_non_dynamic(const bool ne
const nl_double * const RESTRICT Idr = this->m_terms[k]->Idr();
const nl_double * const * RESTRICT other_cur_analog = this->m_terms[k]->connected_net_V();
- new_V[k] = this->m_nets[k]->m_cur_Analog;
+ new_V[k] = this->m_nets[k]->Q_Analog();
for (std::size_t i = 0; i < term_count; i++)
{
@@ -156,24 +158,24 @@ unsigned matrix_solver_GMRES_t<m_N, storage_N>::vsolve_non_dynamic(const bool ne
RHS[k] = RHS_t;
// add diagonal element
- m_A[mat.diag[k]] = gtot_t;
+ mat.A[mat.diag[k]] = gtot_t;
for (std::size_t i = 0; i < railstart; i++)
{
- const unsigned pi = m_term_cr[k][i];
- m_A[pi] -= go[i];
+ const std::size_t pi = m_term_cr[k][i];
+ mat.A[pi] -= go[i];
}
}
- mat.ia[iN] = mat.nz_num;
+ mat.ia[iN] = static_cast<mattype>(mat.nz_num);
const nl_double accuracy = this->m_params.m_accuracy;
- unsigned mr = iN;
+ std::size_t mr = iN;
if (iN > 3 )
mr = static_cast<unsigned>(std::sqrt(iN) * 2.0);
unsigned iter = std::max(1u, this->m_params.m_gs_loops);
- unsigned gsl = solve_ilu_gmres(new_V, RHS, iter, mr, accuracy);
- unsigned failed = mr * iter;
+ unsigned gsl = solve_ilu_gmres(new_V, RHS, iter, static_cast<unsigned>(mr), accuracy);
+ unsigned failed = static_cast<unsigned>(mr) * iter;
this->m_iterative_total += gsl;
this->m_stat_calculations++;
@@ -200,7 +202,7 @@ unsigned matrix_solver_GMRES_t<m_N, storage_N>::vsolve_non_dynamic(const bool ne
}
template <typename T>
-inline void givens_mult( const T & c, const T & s, T & g0, T & g1 )
+inline static void givens_mult( const T c, const T s, T & g0, T & g1 )
{
const T tg0 = c * g0 - s * g1;
const T tg1 = s * g0 + c * g1;
@@ -209,8 +211,8 @@ inline void givens_mult( const T & c, const T & s, T & g0, T & g1 )
g1 = tg1;
}
-template <unsigned m_N, unsigned storage_N>
-unsigned matrix_solver_GMRES_t<m_N, storage_N>::solve_ilu_gmres (nl_double * RESTRICT x, const nl_double * RESTRICT rhs, const unsigned restart_max, const unsigned mr, nl_double accuracy)
+template <std::size_t m_N, std::size_t storage_N>
+unsigned matrix_solver_GMRES_t<m_N, storage_N>::solve_ilu_gmres (nl_double (& RESTRICT x)[storage_N], const nl_double * RESTRICT rhs, const unsigned restart_max, const std::size_t mr, nl_double accuracy)
{
/*-------------------------------------------------------------------------
* The code below was inspired by code published by John Burkardt under
@@ -237,10 +239,10 @@ unsigned matrix_solver_GMRES_t<m_N, storage_N>::solve_ilu_gmres (nl_double * RES
unsigned itr_used = 0;
double rho_delta = 0.0;
- const unsigned n = this->N();
+ const std::size_t n = this->N();
if (m_use_iLU_preconditioning)
- mat.incomplete_LU_factorization(m_A, m_LU);
+ mat.incomplete_LU_factorization(m_LU);
if (m_use_more_precise_stop_condition)
{
@@ -258,7 +260,8 @@ unsigned matrix_solver_GMRES_t<m_N, storage_N>::solve_ilu_gmres (nl_double * RES
nl_double t[storage_N];
nl_double Ax[storage_N];
vec_set(n, accuracy, t);
- mat.mult_vec(m_A, t, Ax);
+ mat.mult_vec(t, Ax);
+
mat.solveLUx(m_LU, Ax);
const nl_double rho_to_accuracy = std::sqrt(vecmult2(n, Ax)) / accuracy;
@@ -270,14 +273,13 @@ unsigned matrix_solver_GMRES_t<m_N, storage_N>::solve_ilu_gmres (nl_double * RES
for (unsigned itr = 0; itr < restart_max; itr++)
{
- unsigned last_k = mr;
- nl_double mu;
+ std::size_t last_k = mr;
nl_double rho;
nl_double Ax[storage_N];
nl_double residual[storage_N];
- mat.mult_vec(m_A, x, Ax);
+ mat.mult_vec(x, Ax);
vec_sub(n, rhs, Ax, residual);
@@ -288,24 +290,27 @@ unsigned matrix_solver_GMRES_t<m_N, storage_N>::solve_ilu_gmres (nl_double * RES
rho = std::sqrt(vecmult2(n, residual));
- vec_mult_scalar(n, residual, NL_FCONST(1.0) / rho, m_v[0]);
+ if (rho < rho_delta)
+ return itr_used + 1;
vec_set(mr+1, NL_FCONST(0.0), m_g);
m_g[0] = rho;
- for (unsigned i = 0; i < mr; i++)
+ for (std::size_t i = 0; i < mr; i++)
vec_set(mr + 1, NL_FCONST(0.0), m_ht[i]);
- for (unsigned k = 0; k < mr; k++)
+ vec_mult_scalar(n, residual, NL_FCONST(1.0) / rho, m_v[0]);
+
+ for (std::size_t k = 0; k < mr; k++)
{
- const unsigned k1 = k + 1;
+ const std::size_t k1 = k + 1;
- mat.mult_vec(m_A, m_v[k], m_v[k1]);
+ mat.mult_vec(m_v[k], m_v[k1]);
if (m_use_iLU_preconditioning)
mat.solveLUx(m_LU, m_v[k1]);
- for (unsigned j = 0; j <= k; j++)
+ for (std::size_t j = 0; j <= k; j++)
{
m_ht[j][k] = vecmult(n, m_v[k1], m_v[j]);
vec_add_mult_scalar(n, m_v[j], -m_ht[j][k], m_v[k1]);
@@ -315,13 +320,13 @@ unsigned matrix_solver_GMRES_t<m_N, storage_N>::solve_ilu_gmres (nl_double * RES
if (m_ht[k1][k] != 0.0)
vec_scale(n, m_v[k1], NL_FCONST(1.0) / m_ht[k1][k]);
- for (unsigned j = 0; j < k; j++)
+ for (std::size_t j = 0; j < k; j++)
givens_mult(m_c[j], m_s[j], m_ht[j][k], m_ht[j+1][k]);
- mu = std::hypot(m_ht[k][k], m_ht[k1][k]);
+ const nl_double mu = 1.0 / std::hypot(m_ht[k][k], m_ht[k1][k]);
- m_c[k] = m_ht[k][k] / mu;
- m_s[k] = -m_ht[k1][k] / mu;
+ m_c[k] = m_ht[k][k] * mu;
+ m_s[k] = -m_ht[k1][k] * mu;
m_ht[k][k] = m_c[k] * m_ht[k][k] - m_s[k] * m_ht[k1][k];
m_ht[k1][k] = 0.0;
@@ -344,17 +349,17 @@ unsigned matrix_solver_GMRES_t<m_N, storage_N>::solve_ilu_gmres (nl_double * RES
/* Solve the system H * y = g */
/* x += m_v[j] * m_y[j] */
- for (unsigned i = last_k + 1; i-- > 0;)
+ for (std::size_t i = last_k + 1; i-- > 0;)
{
double tmp = m_g[i];
- for (unsigned j = i + 1; j <= last_k; j++)
+ for (std::size_t j = i + 1; j <= last_k; j++)
{
tmp -= m_ht[i][j] * m_y[j];
}
m_y[i] = tmp / m_ht[i][i];
}
- for (unsigned i = 0; i <= last_k; i++)
+ for (std::size_t i = 0; i <= last_k; i++)
vec_add_mult_scalar(n, m_v[i], m_y[i], x);
#if 1
diff --git a/src/lib/netlist/solver/nld_ms_sm.h b/src/lib/netlist/solver/nld_ms_sm.h
index 2f3597f3a89..b87f5bcc835 100644
--- a/src/lib/netlist/solver/nld_ms_sm.h
+++ b/src/lib/netlist/solver/nld_ms_sm.h
@@ -47,7 +47,7 @@ namespace netlist
//#define nl_ext_double long double // slightly slower
#define nl_ext_double nl_double
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
class matrix_solver_sm_t: public matrix_solver_t
{
friend class matrix_solver_t;
@@ -55,7 +55,7 @@ class matrix_solver_sm_t: public matrix_solver_t
public:
matrix_solver_sm_t(netlist_t &anetlist, const pstring &name,
- const solver_parameters_t *params, const unsigned size);
+ const solver_parameters_t *params, const std::size_t size);
virtual ~matrix_solver_sm_t();
@@ -66,7 +66,7 @@ protected:
virtual unsigned vsolve_non_dynamic(const bool newton_raphson) override;
unsigned solve_non_dynamic(const bool newton_raphson);
- inline unsigned N() const { if (m_N == 0) return m_dim; else return m_N; }
+ constexpr std::size_t N() const { return (m_N == 0) ? m_dim : m_N; }
void LE_invert();
@@ -103,7 +103,7 @@ private:
//nl_ext_double m_RHSx[storage_N];
- const unsigned m_dim;
+ const std::size_t m_dim;
};
@@ -111,20 +111,17 @@ private:
// matrix_solver_direct
// ----------------------------------------------------------------------------------------
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
matrix_solver_sm_t<m_N, storage_N>::~matrix_solver_sm_t()
{
#if (NL_USE_DYNAMIC_ALLOCATION)
- pfree_array(m_A);
+ plib::pfree_array(m_A);
#endif
}
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
void matrix_solver_sm_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets)
{
- if (m_dim < nets.size())
- log().fatal("Dimension {1} less than {2}", m_dim, nets.size());
-
matrix_solver_t::setup_base(nets);
netlist().save(*this, m_last_RHS, "m_last_RHS");
@@ -135,14 +132,14 @@ void matrix_solver_sm_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets)
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
void matrix_solver_sm_t<m_N, storage_N>::LE_invert()
{
- const unsigned kN = N();
+ const std::size_t kN = N();
- for (unsigned i = 0; i < kN; i++)
+ for (std::size_t i = 0; i < kN; i++)
{
- for (unsigned j = 0; j < kN; j++)
+ for (std::size_t j = 0; j < kN; j++)
{
W(i,j) = lA(i,j) = A(i,j);
Ainv(i,j) = 0.0;
@@ -150,7 +147,7 @@ void matrix_solver_sm_t<m_N, storage_N>::LE_invert()
Ainv(i,i) = 1.0;
}
/* down */
- for (unsigned i = 0; i < kN; i++)
+ for (std::size_t i = 0; i < kN; i++)
{
/* FIXME: Singular matrix? */
const nl_double f = 1.0 / W(i,i);
@@ -169,28 +166,28 @@ void matrix_solver_sm_t<m_N, storage_N>::LE_invert()
{
for (std::size_t k = 0; k < e; k++)
W(j,p[k]) += W(i,p[k]) * f1;
- for (unsigned k = 0; k <= i; k ++)
+ for (std::size_t k = 0; k <= i; k ++)
Ainv(j,k) += Ainv(i,k) * f1;
}
}
}
/* up */
- for (unsigned i = kN; i-- > 0; )
+ for (std::size_t i = kN; i-- > 0; )
{
/* FIXME: Singular matrix? */
const nl_double f = 1.0 / W(i,i);
- for (unsigned j = i; j-- > 0; )
+ for (std::size_t j = i; j-- > 0; )
{
const nl_double f1 = - W(j,i) * f;
if (f1 != 0.0)
{
- for (unsigned k = i; k < kN; k++)
+ for (std::size_t k = i; k < kN; k++)
W(j,k) += W(i,k) * f1;
- for (unsigned k = 0; k < kN; k++)
+ for (std::size_t k = 0; k < kN; k++)
Ainv(j,k) += Ainv(i,k) * f1;
}
}
- for (unsigned k = 0; k < kN; k++)
+ for (std::size_t k = 0; k < kN; k++)
{
Ainv(i,k) *= f;
lAinv(i,k) = Ainv(i,k);
@@ -198,27 +195,27 @@ void matrix_solver_sm_t<m_N, storage_N>::LE_invert()
}
}
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
template <typename T>
void matrix_solver_sm_t<m_N, storage_N>::LE_compute_x(
T * RESTRICT x)
{
- const unsigned kN = N();
+ const std::size_t kN = N();
- for (unsigned i=0; i<kN; i++)
+ for (std::size_t i=0; i<kN; i++)
x[i] = 0.0;
- for (unsigned k=0; k<kN; k++)
+ for (std::size_t k=0; k<kN; k++)
{
const nl_double f = RHS(k);
- for (unsigned i=0; i<kN; i++)
+ for (std::size_t i=0; i<kN; i++)
x[i] += Ainv(i,k) * f;
}
}
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
unsigned matrix_solver_sm_t<m_N, storage_N>::solve_non_dynamic(const bool newton_raphson)
{
static const bool incremental = true;
@@ -308,29 +305,26 @@ unsigned matrix_solver_sm_t<m_N, storage_N>::solve_non_dynamic(const bool newton
}
}
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
inline unsigned matrix_solver_sm_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
{
build_LE_A<matrix_solver_sm_t>();
build_LE_RHS<matrix_solver_sm_t>();
- for (unsigned i=0, iN=N(); i < iN; i++)
+ for (std::size_t i=0, iN=N(); i < iN; i++)
m_last_RHS[i] = RHS(i);
this->m_stat_calculations++;
return this->solve_non_dynamic(newton_raphson);
}
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
matrix_solver_sm_t<m_N, storage_N>::matrix_solver_sm_t(netlist_t &anetlist, const pstring &name,
- const solver_parameters_t *params, const unsigned size)
+ const solver_parameters_t *params, const std::size_t size)
: matrix_solver_t(anetlist, name, NOSORT, params)
, m_dim(size)
{
-#if (NL_USE_DYNAMIC_ALLOCATION)
- m_A = palloc_array(nl_ext_double, N() * m_pitch);
-#endif
- for (unsigned k = 0; k < N(); k++)
+ for (std::size_t k = 0; k < N(); k++)
{
m_last_RHS[k] = 0.0;
}
diff --git a/src/lib/netlist/solver/nld_ms_sor.h b/src/lib/netlist/solver/nld_ms_sor.h
index 15f56ee264b..dc3a5d1821c 100644
--- a/src/lib/netlist/solver/nld_ms_sor.h
+++ b/src/lib/netlist/solver/nld_ms_sor.h
@@ -21,12 +21,12 @@ namespace netlist
{
namespace devices
{
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
class matrix_solver_SOR_t: public matrix_solver_direct_t<m_N, storage_N>
{
public:
- matrix_solver_SOR_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, const unsigned size)
+ matrix_solver_SOR_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, const std::size_t size)
: matrix_solver_direct_t<m_N, storage_N>(anetlist, name, matrix_solver_t::ASCENDING, params, size)
, m_lp_fact(*this, "m_lp_fact", 0)
{
@@ -46,16 +46,16 @@ private:
// ----------------------------------------------------------------------------------------
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
void matrix_solver_SOR_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets)
{
matrix_solver_direct_t<m_N, storage_N>::vsetup(nets);
}
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
unsigned matrix_solver_SOR_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
{
- const unsigned iN = this->N();
+ const std::size_t iN = this->N();
bool resched = false;
unsigned resched_cnt = 0;
@@ -74,7 +74,7 @@ unsigned matrix_solver_SOR_t<m_N, storage_N>::vsolve_non_dynamic(const bool newt
nl_double RHS[storage_N];
nl_double new_V[storage_N];
- for (unsigned k = 0; k < iN; k++)
+ for (std::size_t k = 0; k < iN; k++)
{
nl_double gtot_t = 0.0;
nl_double gabs_t = 0.0;
@@ -86,7 +86,7 @@ unsigned matrix_solver_SOR_t<m_N, storage_N>::vsolve_non_dynamic(const bool newt
const nl_double * const RESTRICT Idr = this->m_terms[k]->Idr();
const nl_double * const *other_cur_analog = this->m_terms[k]->connected_net_V();
- new_V[k] = this->m_nets[k]->m_cur_Analog;
+ new_V[k] = this->m_nets[k]->Q_Analog();
for (std::size_t i = 0; i < term_count; i++)
{
@@ -125,17 +125,10 @@ unsigned matrix_solver_SOR_t<m_N, storage_N>::vsolve_non_dynamic(const bool newt
const nl_double accuracy = this->m_params.m_accuracy;
- /* uncommenting the line below will force dynamic updates every X iterations
- * althought the system has not converged yet. This is a proof of concept,
- *
- */
- const bool interleaved_dynamic_updates = false;
- //const bool interleaved_dynamic_updates = newton_raphson;
-
do {
resched = false;
nl_double err = 0;
- for (unsigned k = 0; k < iN; k++)
+ for (std::size_t k = 0; k < iN; k++)
{
const int * RESTRICT net_other = this->m_terms[k]->connected_net_idx();
const std::size_t railstart = this->m_terms[k]->m_railstart;
@@ -156,29 +149,20 @@ unsigned matrix_solver_SOR_t<m_N, storage_N>::vsolve_non_dynamic(const bool newt
resched_cnt++;
//} while (resched && (resched_cnt < this->m_params.m_gs_loops));
- } while (resched && ((!interleaved_dynamic_updates && resched_cnt < this->m_params.m_gs_loops) || (interleaved_dynamic_updates && resched_cnt < 5 )));
+ } while (resched && ((resched_cnt < this->m_params.m_gs_loops)));
this->m_iterative_total += resched_cnt;
+ this->m_stat_calculations++;
- if (resched && !interleaved_dynamic_updates)
+ if (resched)
{
// Fallback to direct solver ...
this->m_iterative_fail++;
return matrix_solver_direct_t<m_N, storage_N>::vsolve_non_dynamic(newton_raphson);
}
- this->m_stat_calculations++;
-
- if (interleaved_dynamic_updates)
- {
- for (unsigned k = 0; k < iN; k++)
- this->m_nets[k]->m_cur_Analog += 1.0 * (new_V[k] - this->m_nets[k]->m_cur_Analog);
- }
- else
- {
- for (unsigned k = 0; k < iN; k++)
- this->m_nets[k]->m_cur_Analog = new_V[k];
- }
+ for (std::size_t k = 0; k < iN; k++)
+ this->m_nets[k]->set_Q_Analog(new_V[k]);
return resched_cnt;
}
diff --git a/src/lib/netlist/solver/nld_ms_sor_mat.h b/src/lib/netlist/solver/nld_ms_sor_mat.h
index 43b6eeeafb5..265ef821957 100644
--- a/src/lib/netlist/solver/nld_ms_sor_mat.h
+++ b/src/lib/netlist/solver/nld_ms_sor_mat.h
@@ -22,14 +22,14 @@ namespace netlist
{
namespace devices
{
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
class matrix_solver_SOR_mat_t: public matrix_solver_direct_t<m_N, storage_N>
{
friend class matrix_solver_t;
public:
- matrix_solver_SOR_mat_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, const unsigned size)
+ matrix_solver_SOR_mat_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, std::size_t size)
: matrix_solver_direct_t<m_N, storage_N>(anetlist, name, matrix_solver_t::DESCENDING, params, size)
, m_Vdelta(*this, "m_Vdelta", 0.0)
, m_omega(*this, "m_omega", params->m_gs_sor)
@@ -58,7 +58,7 @@ private:
// matrix_solver - Gauss - Seidel
// ----------------------------------------------------------------------------------------
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
void matrix_solver_SOR_mat_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets)
{
matrix_solver_direct_t<m_N, storage_N>::vsetup(nets);
@@ -113,7 +113,7 @@ nl_double matrix_solver_SOR_mat_t<m_N, storage_N>::vsolve()
}
#endif
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
unsigned matrix_solver_SOR_mat_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
{
/* The matrix based code looks a lot nicer but actually is 30% slower than
@@ -123,7 +123,7 @@ unsigned matrix_solver_SOR_mat_t<m_N, storage_N>::vsolve_non_dynamic(const bool
nl_double new_v[storage_N] = { 0.0 };
- const unsigned iN = this->N();
+ const std::size_t iN = this->N();
matrix_solver_t::build_LE_A<matrix_solver_SOR_mat_t>();
matrix_solver_t::build_LE_RHS<matrix_solver_SOR_mat_t>();
@@ -169,14 +169,14 @@ unsigned matrix_solver_SOR_mat_t<m_N, storage_N>::vsolve_non_dynamic(const bool
}
#endif
- for (unsigned k = 0; k < iN; k++)
- new_v[k] = this->m_nets[k]->m_cur_Analog;
+ for (std::size_t k = 0; k < iN; k++)
+ new_v[k] = this->m_nets[k]->Q_Analog();
do {
resched = false;
nl_double cerr = 0.0;
- for (unsigned k = 0; k < iN; k++)
+ for (std::size_t k = 0; k < iN; k++)
{
nl_double Idrive = 0;
@@ -199,10 +199,12 @@ unsigned matrix_solver_SOR_mat_t<m_N, storage_N>::vsolve_non_dynamic(const bool
} while (resched && (resched_cnt < this->m_params.m_gs_loops));
this->m_stat_calculations++;
+ this->m_iterative_total += resched_cnt;
this->m_gs_total += resched_cnt;
if (resched)
{
+ this->m_iterative_fail++;
//this->netlist().warning("Falling back to direct solver .. Consider increasing RESCHED_LOOPS");
this->m_gs_fail++;
diff --git a/src/lib/netlist/solver/nld_ms_w.h b/src/lib/netlist/solver/nld_ms_w.h
index e644ce40085..c2e016e4dec 100644
--- a/src/lib/netlist/solver/nld_ms_w.h
+++ b/src/lib/netlist/solver/nld_ms_w.h
@@ -54,13 +54,13 @@ namespace netlist
//#define nl_ext_double long double // slightly slower
#define nl_ext_double nl_double
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
class matrix_solver_w_t: public matrix_solver_t
{
friend class matrix_solver_t;
public:
- matrix_solver_w_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, const unsigned size);
+ matrix_solver_w_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, const std::size_t size);
virtual ~matrix_solver_w_t();
@@ -71,7 +71,7 @@ protected:
virtual unsigned vsolve_non_dynamic(const bool newton_raphson) override;
unsigned solve_non_dynamic(const bool newton_raphson);
- inline unsigned N() const { if (m_N == 0) return m_dim; else return m_N; }
+ constexpr std::size_t N() const { return (m_N == 0) ? m_dim : m_N; }
void LE_invert();
@@ -115,7 +115,7 @@ private:
//nl_ext_double m_RHSx[storage_N];
- const unsigned m_dim;
+ const std::size_t m_dim;
};
@@ -123,17 +123,14 @@ private:
// matrix_solver_direct
// ----------------------------------------------------------------------------------------
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
matrix_solver_w_t<m_N, storage_N>::~matrix_solver_w_t()
{
}
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
void matrix_solver_w_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets)
{
- if (m_dim < nets.size())
- log().fatal("Dimension {1} less than {2}", m_dim, nets.size());
-
matrix_solver_t::setup_base(nets);
netlist().save(*this, m_last_RHS, "m_last_RHS");
@@ -144,14 +141,14 @@ void matrix_solver_w_t<m_N, storage_N>::vsetup(analog_net_t::list_t &nets)
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
void matrix_solver_w_t<m_N, storage_N>::LE_invert()
{
- const unsigned kN = N();
+ const std::size_t kN = N();
- for (unsigned i = 0; i < kN; i++)
+ for (std::size_t i = 0; i < kN; i++)
{
- for (unsigned j = 0; j < kN; j++)
+ for (std::size_t j = 0; j < kN; j++)
{
W(i,j) = lA(i,j) = A(i,j);
Ainv(i,j) = 0.0;
@@ -159,7 +156,7 @@ void matrix_solver_w_t<m_N, storage_N>::LE_invert()
Ainv(i,i) = 1.0;
}
/* down */
- for (unsigned i = 0; i < kN; i++)
+ for (std::size_t i = 0; i < kN; i++)
{
/* FIXME: Singular matrix? */
const nl_double f = 1.0 / W(i,i);
@@ -170,63 +167,63 @@ void matrix_solver_w_t<m_N, storage_N>::LE_invert()
const auto * RESTRICT const pb = m_terms[i]->m_nzbd.data();
const size_t eb = m_terms[i]->m_nzbd.size();
- for (unsigned jb = 0; jb < eb; jb++)
+ for (std::size_t jb = 0; jb < eb; jb++)
{
const auto j = pb[jb];
const nl_double f1 = - W(j,i) * f;
if (f1 != 0.0)
{
- for (unsigned k = 0; k < e; k++)
+ for (std::size_t k = 0; k < e; k++)
W(j,p[k]) += W(i,p[k]) * f1;
- for (unsigned k = 0; k <= i; k ++)
+ for (std::size_t k = 0; k <= i; k ++)
Ainv(j,k) += Ainv(i,k) * f1;
}
}
}
/* up */
- for (unsigned i = kN; i-- > 0; )
+ for (std::size_t i = kN; i-- > 0; )
{
/* FIXME: Singular matrix? */
const nl_double f = 1.0 / W(i,i);
- for (unsigned j = i; j-- > 0; )
+ for (std::size_t j = i; j-- > 0; )
{
const nl_double f1 = - W(j,i) * f;
if (f1 != 0.0)
{
- for (unsigned k = i; k < kN; k++)
+ for (std::size_t k = i; k < kN; k++)
W(j,k) += W(i,k) * f1;
- for (unsigned k = 0; k < kN; k++)
+ for (std::size_t k = 0; k < kN; k++)
Ainv(j,k) += Ainv(i,k) * f1;
}
}
- for (unsigned k = 0; k < kN; k++)
+ for (std::size_t k = 0; k < kN; k++)
{
Ainv(i,k) *= f;
}
}
}
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
template <typename T>
void matrix_solver_w_t<m_N, storage_N>::LE_compute_x(
T * RESTRICT x)
{
- const unsigned kN = N();
+ const std::size_t kN = N();
- for (unsigned i=0; i<kN; i++)
+ for (std::size_t i=0; i<kN; i++)
x[i] = 0.0;
- for (unsigned k=0; k<kN; k++)
+ for (std::size_t k=0; k<kN; k++)
{
const nl_double f = RHS(k);
- for (unsigned i=0; i<kN; i++)
+ for (std::size_t i=0; i<kN; i++)
x[i] += Ainv(i,k) * f;
}
}
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
unsigned matrix_solver_w_t<m_N, storage_N>::solve_non_dynamic(const bool newton_raphson)
{
const auto iN = N();
@@ -372,27 +369,27 @@ unsigned matrix_solver_w_t<m_N, storage_N>::solve_non_dynamic(const bool newton_
}
}
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
inline unsigned matrix_solver_w_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_raphson)
{
build_LE_A<matrix_solver_w_t>();
build_LE_RHS<matrix_solver_w_t>();
- for (unsigned i=0, iN=N(); i < iN; i++)
+ for (std::size_t i=0, iN=N(); i < iN; i++)
m_last_RHS[i] = RHS(i);
this->m_stat_calculations++;
return this->solve_non_dynamic(newton_raphson);
}
-template <unsigned m_N, unsigned storage_N>
+template <std::size_t m_N, std::size_t storage_N>
matrix_solver_w_t<m_N, storage_N>::matrix_solver_w_t(netlist_t &anetlist, const pstring &name,
- const solver_parameters_t *params, const unsigned size)
+ const solver_parameters_t *params, const std::size_t size)
: matrix_solver_t(anetlist, name, NOSORT, params)
,m_cnt(0)
, m_dim(size)
{
- for (unsigned k = 0; k < N(); k++)
+ for (std::size_t k = 0; k < N(); k++)
{
m_last_RHS[k] = 0.0;
}
diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp
index 52cccfd8419..d2ecf3c5bd2 100644
--- a/src/lib/netlist/solver/nld_solver.cpp
+++ b/src/lib/netlist/solver/nld_solver.cpp
@@ -10,34 +10,37 @@
*/
#if 0
-#pragma GCC optimize "-ffast-math"
-#pragma GCC optimize "-fstrict-aliasing"
-#pragma GCC optimize "-ftree-vectorizer-verbose=2"
-#pragma GCC optimize "-fopt-info-vec"
-#pragma GCC optimize "-fopt-info-vec-missed"
-//#pragma GCC optimize "-ftree-parallelize-loops=4"
-#pragma GCC optimize "-funroll-loops"
-#pragma GCC optimize "-funswitch-loops"
-#pragma GCC optimize "-fvariable-expansion-in-unroller"
-#pragma GCC optimize "-funsafe-loop-optimizations"
-#pragma GCC optimize "-fvect-cost-model"
-#pragma GCC optimize "-fvariable-expansion-in-unroller"
-#pragma GCC optimize "-ftree-loop-if-convert-stores"
-#pragma GCC optimize "-ftree-loop-distribution"
-#pragma GCC optimize "-ftree-loop-im"
-#pragma GCC optimize "-ftree-loop-ivcanon"
-#pragma GCC optimize "-fivopts"
+#pragma GCC optimize "fast-math"
+#pragma GCC optimize "strict-aliasing"
+#pragma GCC optimize "tree-vectorize"
+#pragma GCC optimize "tree-vectorizer-verbose=7"
+#pragma GCC optimize "opt-info-vec"
+#pragma GCC optimize "opt-info-vec-missed"
+//#pragma GCC optimize "tree-parallelize-loops=4"
+#pragma GCC optimize "unroll-loops"
+#pragma GCC optimize "unswitch-loops"
+#pragma GCC optimize "variable-expansion-in-unroller"
+#pragma GCC optimize "unsafe-loop-optimizations"
+#pragma GCC optimize "vect-cost-model"
+#pragma GCC optimize "variable-expansion-in-unroller"
+#pragma GCC optimize "tree-loop-if-convert-stores"
+#pragma GCC optimize "tree-loop-distribution"
+#pragma GCC optimize "tree-loop-im"
+#pragma GCC optimize "tree-loop-ivcanon"
+#pragma GCC optimize "ivopts"
#endif
-#include <iostream>
#include <algorithm>
+#include <cmath> // <<= needed by windows build
+
#include "nl_lists.h"
#if HAS_OPENMP
#include "omp.h"
#endif
-#include "plib/putil.h"
+#include "nl_factory.h"
+
#include "nld_solver.h"
#include "nld_matrix_solver.h"
@@ -107,6 +110,10 @@ NETLIB_UPDATE(solver)
ATTR_UNUSED const netlist_time ts = m_mat_solvers[i]->solve();
}
}
+
+ for (auto & solver : m_mat_solvers)
+ if (solver->has_timestep_devices() || force_solve)
+ solver->update_inputs();
}
else
for (int i = 0; i < t_cnt; i++)
@@ -114,12 +121,16 @@ NETLIB_UPDATE(solver)
{
// Ignore return value
ATTR_UNUSED const netlist_time ts = m_mat_solvers[i]->solve();
+ solver->update_inputs();
}
#else
for (auto & solver : m_mat_solvers)
if (solver->has_timestep_devices() || force_solve)
+ {
// Ignore return value
ATTR_UNUSED const netlist_time ts = solver->solve();
+ solver->update_inputs();
+ }
#endif
/* step circuit */
@@ -131,65 +142,65 @@ NETLIB_UPDATE(solver)
}
template <class C>
-std::unique_ptr<matrix_solver_t> create_it(netlist_t &nl, pstring name, solver_parameters_t &params, unsigned size)
+std::unique_ptr<matrix_solver_t> create_it(netlist_t &nl, pstring name, solver_parameters_t &params, std::size_t size)
{
typedef C solver;
return plib::make_unique<solver>(nl, name, &params, size);
}
-template <int m_N, int storage_N>
-std::unique_ptr<matrix_solver_t> NETLIB_NAME(solver)::create_solver(unsigned size, const bool use_specific)
+template <std::size_t m_N, std::size_t storage_N>
+std::unique_ptr<matrix_solver_t> NETLIB_NAME(solver)::create_solver(std::size_t size, const pstring &solvername)
{
- pstring solvername = plib::pfmt("Solver_{1}")(m_mat_solvers.size());
- if (use_specific && m_N == 1)
- return plib::make_unique<matrix_solver_direct1_t>(netlist(), solvername, &m_params);
- else if (use_specific && m_N == 2)
- return plib::make_unique<matrix_solver_direct2_t>(netlist(), solvername, &m_params);
- else
+ if (pstring("SOR_MAT").equals(m_method()))
{
- if (pstring("SOR_MAT").equals(m_method()))
- {
- return create_it<matrix_solver_SOR_mat_t<m_N, storage_N>>(netlist(), solvername, m_params, size);
- //typedef matrix_solver_SOR_mat_t<m_N,storage_N> solver_sor_mat;
- //return plib::make_unique<solver_sor_mat>(netlist(), solvername, &m_params, size);
- }
- else if (pstring("MAT_CR").equals(m_method()))
+ return create_it<matrix_solver_SOR_mat_t<m_N, storage_N>>(netlist(), solvername, m_params, size);
+ //typedef matrix_solver_SOR_mat_t<m_N,storage_N> solver_sor_mat;
+ //return plib::make_unique<solver_sor_mat>(netlist(), solvername, &m_params, size);
+ }
+ else if (pstring("MAT_CR").equals(m_method()))
+ {
+ if (size > 0) // GCR always outperforms MAT solver
{
typedef matrix_solver_GCR_t<m_N,storage_N> solver_mat;
return plib::make_unique<solver_mat>(netlist(), solvername, &m_params, size);
}
- else if (pstring("MAT").equals(m_method()))
+ else
{
typedef matrix_solver_direct_t<m_N,storage_N> solver_mat;
return plib::make_unique<solver_mat>(netlist(), solvername, &m_params, size);
}
- else if (pstring("SM").equals(m_method()))
- {
- /* Sherman-Morrison Formula */
- typedef matrix_solver_sm_t<m_N,storage_N> solver_mat;
- return plib::make_unique<solver_mat>(netlist(), solvername, &m_params, size);
- }
- else if (pstring("W").equals(m_method()))
- {
- /* Woodbury Formula */
- typedef matrix_solver_w_t<m_N,storage_N> solver_mat;
- return plib::make_unique<solver_mat>(netlist(), solvername, &m_params, size);
- }
- else if (pstring("SOR").equals(m_method()))
- {
- typedef matrix_solver_SOR_t<m_N,storage_N> solver_GS;
- return plib::make_unique<solver_GS>(netlist(), solvername, &m_params, size);
- }
- else if (pstring("GMRES").equals(m_method()))
- {
- typedef matrix_solver_GMRES_t<m_N,storage_N> solver_GMRES;
- return plib::make_unique<solver_GMRES>(netlist(), solvername, &m_params, size);
- }
- else
- {
- netlist().log().fatal("Unknown solver type: {1}\n", m_method());
- return nullptr;
- }
+ }
+ else if (pstring("MAT").equals(m_method()))
+ {
+ typedef matrix_solver_direct_t<m_N,storage_N> solver_mat;
+ return plib::make_unique<solver_mat>(netlist(), solvername, &m_params, size);
+ }
+ else if (pstring("SM").equals(m_method()))
+ {
+ /* Sherman-Morrison Formula */
+ typedef matrix_solver_sm_t<m_N,storage_N> solver_mat;
+ return plib::make_unique<solver_mat>(netlist(), solvername, &m_params, size);
+ }
+ else if (pstring("W").equals(m_method()))
+ {
+ /* Woodbury Formula */
+ typedef matrix_solver_w_t<m_N,storage_N> solver_mat;
+ return plib::make_unique<solver_mat>(netlist(), solvername, &m_params, size);
+ }
+ else if (pstring("SOR").equals(m_method()))
+ {
+ typedef matrix_solver_SOR_t<m_N,storage_N> solver_GS;
+ return plib::make_unique<solver_GS>(netlist(), solvername, &m_params, size);
+ }
+ else if (pstring("GMRES").equals(m_method()))
+ {
+ typedef matrix_solver_GMRES_t<m_N,storage_N> solver_GMRES;
+ return plib::make_unique<solver_GMRES>(netlist(), solvername, &m_params, size);
+ }
+ else
+ {
+ log().fatal(MF_1_UNKNOWN_SOLVER_TYPE, m_method());
+ return nullptr;
}
}
@@ -214,7 +225,7 @@ struct net_splitter
groups.back().push_back(n);
for (auto &p : n->m_core_terms)
{
- if (p->is_type(terminal_t::TERMINAL))
+ if (p->is_type(detail::terminal_type::TERMINAL))
{
terminal_t *pt = static_cast<terminal_t *>(p);
analog_net_t *other_net = &pt->m_otherterm->net();
@@ -275,13 +286,13 @@ void NETLIB_NAME(solver)::post_start()
//m_params.m_max_timestep = std::max(m_params.m_max_timestep, m_params.m_max_timestep::)
// Override log statistics
- pstring p = plib::util::environment("NL_STATS");
+ pstring p = plib::util::environment("NL_STATS", "");
if (p != "")
m_params.m_log_stats = p.as_long();
else
m_params.m_log_stats = m_log_stats();
- netlist().log().verbose("Scanning net groups ...");
+ log().verbose("Scanning net groups ...");
// determine net groups
net_splitter splitter;
@@ -289,86 +300,103 @@ void NETLIB_NAME(solver)::post_start()
splitter.run(netlist());
// setup the solvers
- netlist().log().verbose("Found {1} net groups in {2} nets\n", splitter.groups.size(), netlist().m_nets.size());
+ log().verbose("Found {1} net groups in {2} nets\n", splitter.groups.size(), netlist().m_nets.size());
for (auto & grp : splitter.groups)
{
std::unique_ptr<matrix_solver_t> ms;
- unsigned net_count = static_cast<unsigned>(grp.size());
+ std::size_t net_count = grp.size();
+ pstring sname = plib::pfmt("Solver_{1}")(m_mat_solvers.size());
switch (net_count)
{
#if 1
case 1:
- ms = create_solver<1,1>(1, use_specific);
+ if (use_specific)
+ ms = plib::make_unique<matrix_solver_direct1_t>(netlist(), sname, &m_params);
+ else
+ ms = create_solver<1,1>(1, sname);
break;
case 2:
- ms = create_solver<2,2>(2, use_specific);
+ if (use_specific)
+ ms = plib::make_unique<matrix_solver_direct2_t>(netlist(), sname, &m_params);
+ else
+ ms = create_solver<2,2>(2, sname);
break;
case 3:
- ms = create_solver<3,3>(3, use_specific);
+ ms = create_solver<3,3>(3, sname);
break;
case 4:
- ms = create_solver<4,4>(4, use_specific);
+ ms = create_solver<4,4>(4, sname);
break;
case 5:
- ms = create_solver<5,5>(5, use_specific);
+ ms = create_solver<5,5>(5, sname);
break;
case 6:
- ms = create_solver<6,6>(6, use_specific);
+ ms = create_solver<6,6>(6, sname);
break;
case 7:
- ms = create_solver<7,7>(7, use_specific);
+ ms = create_solver<7,7>(7, sname);
break;
case 8:
- ms = create_solver<8,8>(8, use_specific);
+ ms = create_solver<8,8>(8, sname);
+ break;
+ case 9:
+ ms = create_solver<9,9>(9, sname);
break;
case 10:
- ms = create_solver<10,10>(10, use_specific);
+ ms = create_solver<10,10>(10, sname);
break;
case 11:
- ms = create_solver<11,11>(11, use_specific);
+ ms = create_solver<11,11>(11, sname);
break;
case 12:
- ms = create_solver<12,12>(12, use_specific);
+ ms = create_solver<12,12>(12, sname);
break;
case 15:
- ms = create_solver<15,15>(15, use_specific);
+ ms = create_solver<15,15>(15, sname);
break;
case 31:
- ms = create_solver<31,31>(31, use_specific);
+ ms = create_solver<31,31>(31, sname);
+ break;
+ case 35:
+ ms = create_solver<31,31>(31, sname);
break;
case 49:
- ms = create_solver<49,49>(49, use_specific);
+ ms = create_solver<49,49>(49, sname);
break;
#if 0
case 87:
- ms = create_solver<87,87>(87, use_specific);
+ ms = create_solver<87,87>(87, sname);
break;
#endif
#endif
default:
- netlist().log().warning("No specific solver found for netlist of size {1}", net_count);
- if (net_count <= 16)
+ log().warning(MW_1_NO_SPECIFIC_SOLVER, net_count);
+ if (net_count <= 8)
+ {
+ ms = create_solver<0, 8>(net_count, sname);
+ }
+ else if (net_count <= 16)
{
- ms = create_solver<0,16>(net_count, use_specific);
+ ms = create_solver<0,16>(net_count, sname);
}
else if (net_count <= 32)
{
- ms = create_solver<0,32>(net_count, use_specific);
+ ms = create_solver<0,32>(net_count, sname);
}
else
if (net_count <= 64)
{
- ms = create_solver<0,64>(net_count, use_specific);
+ ms = create_solver<0,64>(net_count, sname);
}
else
if (net_count <= 128)
{
- ms = create_solver<0,128>(net_count, use_specific);
+ ms = create_solver<0,128>(net_count, sname);
}
else
{
- netlist().log().fatal("Encountered netgroup with > 128 nets");
+ log().fatal(MF_1_NETGROUP_SIZE_EXCEEDED_1, 128);
ms = nullptr; /* tease compilers */
}
@@ -379,16 +407,16 @@ void NETLIB_NAME(solver)::post_start()
ms->set_delegate_pointer();
ms->setup(grp);
- netlist().log().verbose("Solver {1}", ms->name());
- netlist().log().verbose(" ==> {2} nets", grp.size());
- netlist().log().verbose(" has {1} elements", ms->has_dynamic_devices() ? "dynamic" : "no dynamic");
- netlist().log().verbose(" has {1} elements", ms->has_timestep_devices() ? "timestep" : "no timestep");
+ log().verbose("Solver {1}", ms->name());
+ log().verbose(" ==> {2} nets", grp.size());
+ log().verbose(" has {1} elements", ms->has_dynamic_devices() ? "dynamic" : "no dynamic");
+ log().verbose(" has {1} elements", ms->has_timestep_devices() ? "timestep" : "no timestep");
for (auto &n : grp)
{
- netlist().log().verbose("Net {1}", n->name());
+ log().verbose("Net {1}", n->name());
for (const auto &pcore : n->m_core_terms)
{
- netlist().log().verbose(" {1}", pcore->name());
+ log().verbose(" {1}", pcore->name());
}
}
@@ -396,12 +424,16 @@ void NETLIB_NAME(solver)::post_start()
}
}
-void NETLIB_NAME(solver)::create_solver_code(plib::postream &strm)
+void NETLIB_NAME(solver)::create_solver_code(std::map<pstring, pstring> &mp)
{
for (auto & s : m_mat_solvers)
- s->create_solver_code(strm);
+ {
+ auto r = s->create_solver_code();
+ mp[r.first] = r.second; // automatically overwrites identical names
+ }
}
+ NETLIB_DEVICE_IMPL(solver)
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/solver/nld_solver.h b/src/lib/netlist/solver/nld_solver.h
index e3ba6419f8b..4f6eb2a21d9 100644
--- a/src/lib/netlist/solver/nld_solver.h
+++ b/src/lib/netlist/solver/nld_solver.h
@@ -8,7 +8,8 @@
#ifndef NLD_SOLVER_H_
#define NLD_SOLVER_H_
-#include "nl_setup.h"
+#include <map>
+
#include "nl_base.h"
#include "plib/pstream.h"
#include "solver/nld_matrix_solver.h"
@@ -17,14 +18,6 @@
#define ATTR_ALIGNED(N) ATTR_ALIGN
// ----------------------------------------------------------------------------------------
-// Macros
-// ----------------------------------------------------------------------------------------
-
-#define SOLVER(name, freq) \
- NET_REGISTER_DEV(SOLVER, name) \
- PARAM(name.FREQ, freq)
-
-// ----------------------------------------------------------------------------------------
// solver
// ----------------------------------------------------------------------------------------
@@ -59,7 +52,7 @@ NETLIB_OBJECT(solver)
/* automatic time step */
, m_dynamic_ts(*this, "DYNAMIC_TS", 0)
- , m_dynamic_lte(*this, "DYNAMIC_LTE", 5e-5) // diff/timestep
+ , m_dynamic_lte(*this, "DYNAMIC_LTE", 1e-5) // diff/timestep
, m_dynamic_min_ts(*this, "DYNAMIC_MIN_TIMESTEP", 1e-6) // nl_double timestep resolution
, m_log_stats(*this, "LOG_STATS", 1) // nl_double timestep resolution
@@ -76,7 +69,7 @@ NETLIB_OBJECT(solver)
inline nl_double gmin() { return m_gmin(); }
- void create_solver_code(plib::postream &strm);
+ void create_solver_code(std::map<pstring, pstring> &mp);
NETLIB_UPDATEI();
NETLIB_RESETI();
@@ -107,8 +100,8 @@ private:
solver_parameters_t m_params;
- template <int m_N, int storage_N>
- std::unique_ptr<matrix_solver_t> create_solver(unsigned size, bool use_specific);
+ template <std::size_t m_N, std::size_t storage_N>
+ std::unique_ptr<matrix_solver_t> create_solver(std::size_t size, const pstring &solvername);
};
} //namespace devices
diff --git a/src/lib/netlist/solver/vector_base.h b/src/lib/netlist/solver/vector_base.h
index 3f0c53c8ade..b294eb0ee48 100644..100755
--- a/src/lib/netlist/solver/vector_base.h
+++ b/src/lib/netlist/solver/vector_base.h
@@ -36,14 +36,14 @@ private:
#endif
template<typename T>
-inline void vec_set (const std::size_t & n, const T &scalar, T * RESTRICT result)
+inline static void vec_set (const std::size_t n, const T scalar, T * RESTRICT result)
{
for ( std::size_t i = 0; i < n; i++ )
result[i] = scalar;
}
template<typename T>
-inline T vecmult (const std::size_t & n, const T * RESTRICT a1, const T * RESTRICT a2 )
+inline static T vecmult (const std::size_t n, const T * RESTRICT a1, const T * RESTRICT a2 )
{
T value = 0.0;
for ( std::size_t i = 0; i < n; i++ )
@@ -52,7 +52,7 @@ inline T vecmult (const std::size_t & n, const T * RESTRICT a1, const T * RESTRI
}
template<typename T>
-inline T vecmult2 (const std::size_t & n, const T *a1)
+inline static T vecmult2 (const std::size_t n, const T *a1)
{
T value = 0.0;
for ( std::size_t i = 0; i < n; i++ )
@@ -63,43 +63,56 @@ inline T vecmult2 (const std::size_t & n, const T *a1)
return value;
}
-template<typename T>
-inline void vec_mult_scalar (const std::size_t & n, const T * RESTRICT v, const T & scalar, T * RESTRICT result)
+template<typename T, std::size_t N>
+inline static void vec_mult_scalar (const std::size_t n, const T (& RESTRICT v)[N], const T & scalar, T (& RESTRICT result)[N])
{
- for ( std::size_t i = 0; i < n; i++ )
- {
- result[i] = scalar * v[i];
- }
+ if (n != N)
+ for ( std::size_t i = 0; i < n; i++ )
+ result[i] = scalar * v[i];
+ else
+ for ( std::size_t i = 0; i < N; i++ )
+ result[i] = scalar * v[i];
+}
+
+template<typename T, std::size_t N>
+inline static void vec_add_mult_scalar (const std::size_t n, const T (& RESTRICT v)[N], const T scalar, T (& RESTRICT result)[N])
+{
+ if (n != N)
+ for ( std::size_t i = 0; i < n; i++ )
+ result[i] = result[i] + scalar * v[i];
+ else
+ for ( std::size_t i = 0; i < N; i++ )
+ result[i] = result[i] + scalar * v[i];
}
template<typename T>
-inline void vec_add_mult_scalar (const std::size_t & n, const T * RESTRICT v, const T scalar, T * RESTRICT result)
+inline static void vec_add_mult_scalar_p(const std::size_t & n, const T * RESTRICT v, const T scalar, T * RESTRICT result)
{
for ( std::size_t i = 0; i < n; i++ )
result[i] += scalar * v[i];
}
-inline void vec_add_ip(const std::size_t & n, const double * RESTRICT v, double * RESTRICT result)
+inline static void vec_add_ip(const std::size_t n, const double * RESTRICT v, double * RESTRICT result)
{
for ( std::size_t i = 0; i < n; i++ )
result[i] += v[i];
}
template<typename T>
-inline void vec_sub(const std::size_t & n, const T * RESTRICT v1, const T * RESTRICT v2, T * RESTRICT result)
+inline void vec_sub(const std::size_t n, const T * RESTRICT v1, const T * RESTRICT v2, T * RESTRICT result)
{
for ( std::size_t i = 0; i < n; i++ )
result[i] = v1[i] - v2[i];
}
template<typename T>
-inline void vec_scale (const std::size_t & n, T * RESTRICT v, const T scalar)
+inline void vec_scale (const std::size_t n, T * RESTRICT v, const T scalar)
{
for ( std::size_t i = 0; i < n; i++ )
v[i] = scalar * v[i];
}
-inline double vec_maxabs(const std::size_t & n, const double * RESTRICT v)
+inline double vec_maxabs(const std::size_t n, const double * RESTRICT v)
{
double ret = 0.0;
for ( std::size_t i = 0; i < n; i++ )
diff --git a/src/lib/netlist/tools/nl_convert.cpp b/src/lib/netlist/tools/nl_convert.cpp
index 9523febf06a..5b0bfd267c3 100644
--- a/src/lib/netlist/tools/nl_convert.cpp
+++ b/src/lib/netlist/tools/nl_convert.cpp
@@ -6,7 +6,6 @@
*/
#include <algorithm>
-#include <cstdio>
#include <cmath>
#include <unordered_map>
#include "nl_convert.h"
@@ -18,7 +17,7 @@
* define a model param on core device
*/
/* Format: external name,netlist device,model */
-static const char *s_lib_map =
+static const pstring s_lib_map =
"SN74LS00D, TTL_7400_DIP, 74LSXX\n"
"SN74LS04D, TTL_7404_DIP, 74LSXX\n"
"SN74ALS08D, TTL_7408_DIP, 74ALSXX\n"
@@ -44,11 +43,12 @@ using lib_map_t = std::unordered_map<pstring, lib_map_entry>;
static lib_map_t read_lib_map(const pstring lm)
{
plib::pistringstream istrm(lm);
+ plib::putf8_reader reader(istrm);
lib_map_t m;
pstring line;
- while (istrm.readline(line))
+ while (reader.readline(line))
{
- plib::pstring_vector_t split(line, ",");
+ std::vector<pstring> split(plib::psplit(line, ","));
m[split[0].trim()] = { split[1].trim(), split[2].trim() };
}
return m;
@@ -185,21 +185,21 @@ const pstring nl_convert_base_t::get_nl_val(const double val)
{
{
int i = 0;
- while (m_units[i].m_unit != "-" )
+ while (pstring(m_units[i].m_unit, pstring::UTF8) != "-" )
{
if (m_units[i].m_mult <= std::abs(val))
break;
i++;
}
- return plib::pfmt(m_units[i].m_func.c_str())(val / m_units[i].m_mult);
+ return plib::pfmt(pstring(m_units[i].m_func, pstring::UTF8))(val / m_units[i].m_mult);
}
}
double nl_convert_base_t::get_sp_unit(const pstring &unit)
{
int i = 0;
- while (m_units[i].m_unit != "-")
+ while (pstring(m_units[i].m_unit, pstring::UTF8) != "-")
{
- if (m_units[i].m_unit == unit)
+ if (pstring(m_units[i].m_unit, pstring::UTF8) == unit)
return m_units[i].m_mult;
i++;
}
@@ -242,7 +242,7 @@ nl_convert_base_t::unit_t nl_convert_base_t::m_units[] = {
void nl_convert_spice_t::convert(const pstring &contents)
{
- plib::pstring_vector_t spnl(contents, "\n");
+ std::vector<pstring> spnl(plib::psplit(contents, "\n"));
// Add gnd net
@@ -274,7 +274,7 @@ void nl_convert_spice_t::process_line(const pstring &line)
{
if (line != "")
{
- plib::pstring_vector_t tt(line, " ", true);
+ std::vector<pstring> tt(plib::psplit(line, " ", true));
double val = 0.0;
switch (tt[0].code_at(0))
{
@@ -313,7 +313,7 @@ void nl_convert_spice_t::process_line(const pstring &line)
model = tt[5];
else
model = tt[4];
- plib::pstring_vector_t m(model,"{");
+ std::vector<pstring> m(plib::psplit(model,"{"));
if (m.size() == 2)
{
if (m[1].len() != 4)
@@ -401,19 +401,13 @@ void nl_convert_spice_t::process_line(const pstring &line)
Eagle converter
-------------------------------------------------*/
-nl_convert_eagle_t::tokenizer::tokenizer(nl_convert_eagle_t &convert, plib::pistream &strm)
+nl_convert_eagle_t::tokenizer::tokenizer(nl_convert_eagle_t &convert, plib::putf8_reader &strm)
: plib::ptokenizer(strm)
, m_convert(convert)
{
set_identifier_chars("abcdefghijklmnopqrstuvwvxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890_.-");
set_number_chars(".0123456789", "0123456789eE-."); //FIXME: processing of numbers
- char ws[5];
- ws[0] = ' ';
- ws[1] = 9;
- ws[2] = 10;
- ws[3] = 13;
- ws[4] = 0;
- set_whitespace(ws);
+ set_whitespace(pstring("").cat(' ').cat(9).cat(10).cat(13));
/* FIXME: gnetlist doesn't print comments */
set_comment("/*", "*/", "//");
set_string_char('\'');
@@ -435,7 +429,8 @@ void nl_convert_eagle_t::tokenizer::verror(const pstring &msg, int line_num, con
void nl_convert_eagle_t::convert(const pstring &contents)
{
plib::pistringstream istrm(contents);
- tokenizer tok(*this, istrm);
+ plib::putf8_reader reader(istrm);
+ tokenizer tok(*this, reader);
out("NETLIST_START(dummy)\n");
add_term("GND", "GND");
@@ -543,19 +538,13 @@ void nl_convert_eagle_t::convert(const pstring &contents)
RINF converter
-------------------------------------------------*/
-nl_convert_rinf_t::tokenizer::tokenizer(nl_convert_rinf_t &convert, plib::pistream &strm)
+nl_convert_rinf_t::tokenizer::tokenizer(nl_convert_rinf_t &convert, plib::putf8_reader &strm)
: plib::ptokenizer(strm)
, m_convert(convert)
{
set_identifier_chars(".abcdefghijklmnopqrstuvwvxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890_-");
set_number_chars("0123456789", "0123456789eE-."); //FIXME: processing of numbers
- char ws[5];
- ws[0] = ' ';
- ws[1] = 9;
- ws[2] = 10;
- ws[3] = 13;
- ws[4] = 0;
- set_whitespace(ws);
+ set_whitespace(pstring("").cat(' ').cat(9).cat(10).cat(13));
/* FIXME: gnetlist doesn't print comments */
set_comment("","","//"); // FIXME:needs to be confirmed
set_string_char('"');
@@ -589,7 +578,8 @@ void nl_convert_rinf_t::tokenizer::verror(const pstring &msg, int line_num, cons
void nl_convert_rinf_t::convert(const pstring &contents)
{
plib::pistringstream istrm(contents);
- tokenizer tok(*this, istrm);
+ plib::putf8_reader reader(istrm);
+ tokenizer tok(*this, reader);
auto lm = read_lib_map(s_lib_map);
out("NETLIST_START(dummy)\n");
diff --git a/src/lib/netlist/tools/nl_convert.h b/src/lib/netlist/tools/nl_convert.h
index 3536488c766..d0d12c377e0 100644
--- a/src/lib/netlist/tools/nl_convert.h
+++ b/src/lib/netlist/tools/nl_convert.h
@@ -49,7 +49,7 @@ protected:
double get_sp_val(const pstring &sin);
- plib::pstream_fmt_writer_t out;
+ plib::putf8_fmt_writer out;
private:
struct net_t
@@ -59,14 +59,14 @@ private:
: m_name(aname), m_no_export(false) {}
const pstring &name() { return m_name;}
- plib::pstring_vector_t &terminals() { return m_terminals; }
+ std::vector<pstring> &terminals() { return m_terminals; }
void set_no_export() { m_no_export = true; }
bool is_no_export() { return m_no_export; }
private:
pstring m_name;
bool m_no_export;
- plib::pstring_vector_t m_terminals;
+ std::vector<pstring> m_terminals;
};
struct dev_t
@@ -101,8 +101,8 @@ private:
};
struct unit_t {
- pstring m_unit;
- pstring m_func;
+ const char *m_unit;
+ const char *m_func;
double m_mult;
};
@@ -166,7 +166,7 @@ public:
class tokenizer : public plib::ptokenizer
{
public:
- tokenizer(nl_convert_eagle_t &convert, plib::pistream &strm);
+ tokenizer(nl_convert_eagle_t &convert, plib::putf8_reader &strm);
token_id_t m_tok_ADD;
token_id_t m_tok_VALUE;
@@ -202,7 +202,7 @@ public:
class tokenizer : public plib::ptokenizer
{
public:
- tokenizer(nl_convert_rinf_t &convert, plib::pistream &strm);
+ tokenizer(nl_convert_rinf_t &convert, plib::putf8_reader &strm);
token_id_t m_tok_HEA;
token_id_t m_tok_APP;
diff --git a/src/lib/util/chd.cpp b/src/lib/util/chd.cpp
index 0db64344861..dc7c334b1bf 100644
--- a/src/lib/util/chd.cpp
+++ b/src/lib/util/chd.cpp
@@ -885,7 +885,7 @@ chd_error chd_file::read_hunk(uint32_t hunknum, void *buffer)
// get a pointer to the map entry
uint64_t blockoffs;
uint32_t blocklen;
- uint32_t blockcrc;
+ util::crc32_t blockcrc;
uint8_t *rawmap;
uint8_t *dest = reinterpret_cast<uint8_t *>(buffer);
switch (m_version)
@@ -2147,12 +2147,12 @@ void chd_file::decompress_v5_map()
// read the reader
uint8_t rawbuf[16];
file_read(m_mapoffset, rawbuf, sizeof(rawbuf));
- uint32_t mapbytes = be_read(&rawbuf[0], 4);
- uint64_t firstoffs = be_read(&rawbuf[4], 6);
- uint16_t mapcrc = be_read(&rawbuf[10], 2);
- uint8_t lengthbits = rawbuf[12];
- uint8_t selfbits = rawbuf[13];
- uint8_t parentbits = rawbuf[14];
+ uint32_t const mapbytes = be_read(&rawbuf[0], 4);
+ uint64_t const firstoffs = be_read(&rawbuf[4], 6);
+ util::crc16_t const mapcrc = be_read(&rawbuf[10], 2);
+ uint8_t const lengthbits = rawbuf[12];
+ uint8_t const selfbits = rawbuf[13];
+ uint8_t const parentbits = rawbuf[14];
// now read the map
std::vector<uint8_t> compressed(mapbytes);
diff --git a/src/lib/util/hashing.h b/src/lib/util/hashing.h
index 906bad047b4..5e9c9134c97 100644
--- a/src/lib/util/hashing.h
+++ b/src/lib/util/hashing.h
@@ -15,10 +15,12 @@
#include "osdcore.h"
#include "corestr.h"
-#include <string>
#include "md5.h"
#include "sha1.h"
+#include <functional>
+#include <string>
+
namespace util {
//**************************************************************************
@@ -132,13 +134,23 @@ protected:
// final digest
struct crc32_t
{
- bool operator==(const crc32_t &rhs) const { return m_raw == rhs.m_raw; }
- bool operator!=(const crc32_t &rhs) const { return m_raw != rhs.m_raw; }
+ crc32_t() { }
+ constexpr crc32_t(const crc32_t &rhs) = default;
+ constexpr crc32_t(const uint32_t crc) : m_raw(crc) { }
+
+ constexpr bool operator==(const crc32_t &rhs) const { return m_raw == rhs.m_raw; }
+ constexpr bool operator!=(const crc32_t &rhs) const { return m_raw != rhs.m_raw; }
+
+ crc32_t &operator=(const crc32_t &rhs) = default;
crc32_t &operator=(const uint32_t crc) { m_raw = crc; return *this; }
- operator uint32_t() const { return m_raw; }
+
+ constexpr operator uint32_t() const { return m_raw; }
+
bool from_string(const char *string, int length = -1);
std::string as_string() const;
+
uint32_t m_raw;
+
static const crc32_t null;
};
@@ -178,13 +190,23 @@ protected:
// final digest
struct crc16_t
{
- bool operator==(const crc16_t &rhs) const { return m_raw == rhs.m_raw; }
- bool operator!=(const crc16_t &rhs) const { return m_raw != rhs.m_raw; }
+ crc16_t() { }
+ constexpr crc16_t(const crc16_t &rhs) = default;
+ constexpr crc16_t(const uint16_t crc) : m_raw(crc) { }
+
+ constexpr bool operator==(const crc16_t &rhs) const { return m_raw == rhs.m_raw; }
+ constexpr bool operator!=(const crc16_t &rhs) const { return m_raw != rhs.m_raw; }
+
+ crc16_t &operator=(const crc16_t &rhs) = default;
crc16_t &operator=(const uint16_t crc) { m_raw = crc; return *this; }
- operator uint16_t() const { return m_raw; }
+
+ constexpr operator uint16_t() const { return m_raw; }
+
bool from_string(const char *string, int length = -1);
std::string as_string() const;
+
uint16_t m_raw;
+
static const crc16_t null;
};
@@ -220,4 +242,22 @@ protected:
} // namespace util
+namespace std {
+
+template <> struct hash<::util::crc32_t>
+{
+ typedef ::util::crc32_t argument_type;
+ typedef std::size_t result_type;
+ result_type operator()(argument_type const & s) const { return std::hash<std::uint32_t>()(s); }
+};
+
+template <> struct hash<::util::crc16_t>
+{
+ typedef ::util::crc16_t argument_type;
+ typedef std::size_t result_type;
+ result_type operator()(argument_type const & s) const { return std::hash<std::uint16_t>()(s); }
+};
+
+} // namespace std
+
#endif // __HASHING_H__
diff --git a/src/lib/util/path_to_regex.cpp b/src/lib/util/path_to_regex.cpp
index 927ababbb8a..89a21a5e7f6 100644
--- a/src/lib/util/path_to_regex.cpp
+++ b/src/lib/util/path_to_regex.cpp
@@ -1,7 +1,7 @@
// license:MIT
// copyright-holders:Alfred Bratterud
-// NOTE: Author allowed MAME project to distribute this file under MIT
-// license. Other projects need to do it under Apache 2 license
+// NOTE: Author allowed MAME project to distribute this file under MIT
+// license. Other projects need to do it under Apache 2 license
//
// This file is a part of the IncludeOS unikernel - www.includeos.org
//
diff --git a/src/lib/util/path_to_regex.hpp b/src/lib/util/path_to_regex.hpp
index 7608d77bb5d..a6b11a22031 100644
--- a/src/lib/util/path_to_regex.hpp
+++ b/src/lib/util/path_to_regex.hpp
@@ -1,7 +1,7 @@
// license:MIT
// copyright-holders:Alfred Bratterud
-// NOTE: Author allowed MAME project to distribute this file under MIT
-// license. Other projects need to do it under Apache 2 license
+// NOTE: Author allowed MAME project to distribute this file under MIT
+// license. Other projects need to do it under Apache 2 license
//
// This file is a part of the IncludeOS unikernel - www.includeos.org
//
diff --git a/src/lib/util/server_ws.hpp b/src/lib/util/server_ws.hpp
index 170dc31ae63..b9d4721e96b 100644
--- a/src/lib/util/server_ws.hpp
+++ b/src/lib/util/server_ws.hpp
@@ -64,7 +64,7 @@ namespace webpp {
}
};
-
+
class Connection {
friend class SocketServerBase<socket_type>;
friend class SocketServer<socket_type>;
@@ -142,7 +142,7 @@ namespace webpp {
catch (...) {}
}
};
-
+
class Message : public std::istream {
friend class SocketServerBase<socket_type>;
diff --git a/src/lib/util/sha1.hpp b/src/lib/util/sha1.hpp
index 7befbd326f0..a293bebb7cc 100644
--- a/src/lib/util/sha1.hpp
+++ b/src/lib/util/sha1.hpp
@@ -36,76 +36,76 @@ namespace { // local
// Rotate an integer value to left.
inline unsigned int rol(unsigned int value, unsigned int steps) {
- return ((value << steps) | (value >> (32 - steps)));
+ return ((value << steps) | (value >> (32 - steps)));
}
// Sets the first 16 integers in the buffert to zero.
// Used for clearing the W buffert.
inline void clearWBuffert(unsigned int * buffert)
{
- for (int pos = 16; --pos >= 0;)
- {
- buffert[pos] = 0;
- }
+ for (int pos = 16; --pos >= 0;)
+ {
+ buffert[pos] = 0;
+ }
}
inline void innerHash(unsigned int * result, unsigned int * w)
{
- unsigned int a = result[0];
- unsigned int b = result[1];
- unsigned int c = result[2];
- unsigned int d = result[3];
- unsigned int e = result[4];
-
- int round = 0;
-
- #define sha1macro(func,val) \
- { \
- const unsigned int t = rol(a, 5) + (func) + e + val + w[round]; \
- e = d; \
- d = c; \
- c = rol(b, 30); \
- b = a; \
- a = t; \
- }
-
- while (round < 16)
- {
- sha1macro((b & c) | (~b & d), 0x5a827999)
- ++round;
- }
- while (round < 20)
- {
- w[round] = rol((w[round - 3] ^ w[round - 8] ^ w[round - 14] ^ w[round - 16]), 1);
- sha1macro((b & c) | (~b & d), 0x5a827999)
- ++round;
- }
- while (round < 40)
- {
- w[round] = rol((w[round - 3] ^ w[round - 8] ^ w[round - 14] ^ w[round - 16]), 1);
- sha1macro(b ^ c ^ d, 0x6ed9eba1)
- ++round;
- }
- while (round < 60)
- {
- w[round] = rol((w[round - 3] ^ w[round - 8] ^ w[round - 14] ^ w[round - 16]), 1);
- sha1macro((b & c) | (b & d) | (c & d), 0x8f1bbcdc)
- ++round;
- }
- while (round < 80)
- {
- w[round] = rol((w[round - 3] ^ w[round - 8] ^ w[round - 14] ^ w[round - 16]), 1);
- sha1macro(b ^ c ^ d, 0xca62c1d6)
- ++round;
- }
-
- #undef sha1macro
-
- result[0] += a;
- result[1] += b;
- result[2] += c;
- result[3] += d;
- result[4] += e;
+ unsigned int a = result[0];
+ unsigned int b = result[1];
+ unsigned int c = result[2];
+ unsigned int d = result[3];
+ unsigned int e = result[4];
+
+ int round = 0;
+
+ #define sha1macro(func,val) \
+ { \
+ const unsigned int t = rol(a, 5) + (func) + e + val + w[round]; \
+ e = d; \
+ d = c; \
+ c = rol(b, 30); \
+ b = a; \
+ a = t; \
+ }
+
+ while (round < 16)
+ {
+ sha1macro((b & c) | (~b & d), 0x5a827999)
+ ++round;
+ }
+ while (round < 20)
+ {
+ w[round] = rol((w[round - 3] ^ w[round - 8] ^ w[round - 14] ^ w[round - 16]), 1);
+ sha1macro((b & c) | (~b & d), 0x5a827999)
+ ++round;
+ }
+ while (round < 40)
+ {
+ w[round] = rol((w[round - 3] ^ w[round - 8] ^ w[round - 14] ^ w[round - 16]), 1);
+ sha1macro(b ^ c ^ d, 0x6ed9eba1)
+ ++round;
+ }
+ while (round < 60)
+ {
+ w[round] = rol((w[round - 3] ^ w[round - 8] ^ w[round - 14] ^ w[round - 16]), 1);
+ sha1macro((b & c) | (b & d) | (c & d), 0x8f1bbcdc)
+ ++round;
+ }
+ while (round < 80)
+ {
+ w[round] = rol((w[round - 3] ^ w[round - 8] ^ w[round - 14] ^ w[round - 16]), 1);
+ sha1macro(b ^ c ^ d, 0xca62c1d6)
+ ++round;
+ }
+
+ #undef sha1macro
+
+ result[0] += a;
+ result[1] += b;
+ result[2] += c;
+ result[3] += d;
+ result[4] += e;
}
} // namespace
@@ -118,62 +118,62 @@ inline void innerHash(unsigned int * result, unsigned int * w)
* the sha1 result in.
*/
inline void calc(void const * src, size_t bytelength, unsigned char * hash) {
- // Init the result array.
- unsigned int result[5] = { 0x67452301, 0xefcdab89, 0x98badcfe,
- 0x10325476, 0xc3d2e1f0 };
-
- // Cast the void src pointer to be the byte array we can work with.
- unsigned char const * sarray = static_cast<unsigned char const *>(src);
-
- // The reusable round buffer
- unsigned int w[80];
-
- // Loop through all complete 64byte blocks.
-
- size_t endCurrentBlock;
- size_t currentBlock = 0;
-
- if (bytelength >= 64) {
- size_t const endOfFullBlocks = bytelength - 64;
-
- while (currentBlock <= endOfFullBlocks) {
- endCurrentBlock = currentBlock + 64;
-
- // Init the round buffer with the 64 byte block data.
- for (int roundPos = 0; currentBlock < endCurrentBlock; currentBlock += 4)
- {
- // This line will swap endian on big endian and keep endian on
- // little endian.
- w[roundPos++] = static_cast<unsigned int>(sarray[currentBlock + 3])
- | (static_cast<unsigned int>(sarray[currentBlock + 2]) << 8)
- | (static_cast<unsigned int>(sarray[currentBlock + 1]) << 16)
- | (static_cast<unsigned int>(sarray[currentBlock]) << 24);
- }
- innerHash(result, w);
- }
- }
-
- // Handle the last and not full 64 byte block if existing.
- endCurrentBlock = bytelength - currentBlock;
- clearWBuffert(w);
- size_t lastBlockBytes = 0;
- for (;lastBlockBytes < endCurrentBlock; ++lastBlockBytes) {
- w[lastBlockBytes >> 2] |= static_cast<unsigned int>(sarray[lastBlockBytes + currentBlock]) << ((3 - (lastBlockBytes & 3)) << 3);
- }
-
- w[lastBlockBytes >> 2] |= 0x80 << ((3 - (lastBlockBytes & 3)) << 3);
- if (endCurrentBlock >= 56) {
- innerHash(result, w);
- clearWBuffert(w);
- }
- w[15] = bytelength << 3;
- innerHash(result, w);
-
- // Store hash in result pointer, and make sure we get in in the correct
- // order on both endian models.
- for (int hashByte = 20; --hashByte >= 0;) {
- hash[hashByte] = (result[hashByte >> 2] >> (((3 - hashByte) & 0x3) << 3)) & 0xff;
- }
+ // Init the result array.
+ unsigned int result[5] = { 0x67452301, 0xefcdab89, 0x98badcfe,
+ 0x10325476, 0xc3d2e1f0 };
+
+ // Cast the void src pointer to be the byte array we can work with.
+ unsigned char const * sarray = static_cast<unsigned char const *>(src);
+
+ // The reusable round buffer
+ unsigned int w[80];
+
+ // Loop through all complete 64byte blocks.
+
+ size_t endCurrentBlock;
+ size_t currentBlock = 0;
+
+ if (bytelength >= 64) {
+ size_t const endOfFullBlocks = bytelength - 64;
+
+ while (currentBlock <= endOfFullBlocks) {
+ endCurrentBlock = currentBlock + 64;
+
+ // Init the round buffer with the 64 byte block data.
+ for (int roundPos = 0; currentBlock < endCurrentBlock; currentBlock += 4)
+ {
+ // This line will swap endian on big endian and keep endian on
+ // little endian.
+ w[roundPos++] = static_cast<unsigned int>(sarray[currentBlock + 3])
+ | (static_cast<unsigned int>(sarray[currentBlock + 2]) << 8)
+ | (static_cast<unsigned int>(sarray[currentBlock + 1]) << 16)
+ | (static_cast<unsigned int>(sarray[currentBlock]) << 24);
+ }
+ innerHash(result, w);
+ }
+ }
+
+ // Handle the last and not full 64 byte block if existing.
+ endCurrentBlock = bytelength - currentBlock;
+ clearWBuffert(w);
+ size_t lastBlockBytes = 0;
+ for (;lastBlockBytes < endCurrentBlock; ++lastBlockBytes) {
+ w[lastBlockBytes >> 2] |= static_cast<unsigned int>(sarray[lastBlockBytes + currentBlock]) << ((3 - (lastBlockBytes & 3)) << 3);
+ }
+
+ w[lastBlockBytes >> 2] |= 0x80 << ((3 - (lastBlockBytes & 3)) << 3);
+ if (endCurrentBlock >= 56) {
+ innerHash(result, w);
+ clearWBuffert(w);
+ }
+ w[15] = bytelength << 3;
+ innerHash(result, w);
+
+ // Store hash in result pointer, and make sure we get in in the correct
+ // order on both endian models.
+ for (int hashByte = 20; --hashByte >= 0;) {
+ hash[hashByte] = (result[hashByte >> 2] >> (((3 - hashByte) & 0x3) << 3)) & 0xff;
+ }
}
} // namespace sha1
diff --git a/src/lib/util/unicode.cpp b/src/lib/util/unicode.cpp
index 5849abb8d73..b48cef44c79 100644
--- a/src/lib/util/unicode.cpp
+++ b/src/lib/util/unicode.cpp
@@ -15,7 +15,7 @@
#define UTF8PROC_DLLEXPORT
#endif
-#include "utf8proc/utf8proc.h"
+#include <utf8proc.h>
#include <codecvt>
#include <locale>
@@ -389,7 +389,7 @@ std::string utf8_from_wstring(const std::wstring &string)
//-------------------------------------------------
// internal_normalize_unicode - uses utf8proc to
-// normalize unicode
+// normalize unicode
//-------------------------------------------------
static std::string internal_normalize_unicode(const char *s, size_t length, unicode_normalization_form normalization_form, bool null_terminated)
@@ -437,7 +437,7 @@ static std::string internal_normalize_unicode(const char *s, size_t length, unic
//-------------------------------------------------
// normalize_unicode - uses utf8proc to normalize
-// unicode
+// unicode
//-------------------------------------------------
std::string normalize_unicode(const std::string &s, unicode_normalization_form normalization_form)
@@ -448,7 +448,7 @@ std::string normalize_unicode(const std::string &s, unicode_normalization_form n
//-------------------------------------------------
// normalize_unicode - uses utf8proc to normalize
-// unicode
+// unicode
//-------------------------------------------------
std::string normalize_unicode(const char *s, unicode_normalization_form normalization_form)
@@ -459,7 +459,7 @@ std::string normalize_unicode(const char *s, unicode_normalization_form normaliz
//-------------------------------------------------
// normalize_unicode - uses utf8proc to normalize
-// unicode
+// unicode
//-------------------------------------------------
std::string normalize_unicode(const char *s, size_t length, unicode_normalization_form normalization_form)
diff --git a/src/mame/audio/nl_kidniki.h b/src/mame/audio/nl_kidniki.h
index 29fbc1a094c..c511958bccb 100644
--- a/src/mame/audio/nl_kidniki.h
+++ b/src/mame/audio/nl_kidniki.h
@@ -1,4 +1,6 @@
// license:BSD-3-Clause
// copyright-holders:Andrew Gardner, Couriersud
+#include "netlist/nl_setup.h"
+
NETLIST_EXTERNAL(kidniki)
diff --git a/src/mame/audio/nl_mario.cpp b/src/mame/audio/nl_mario.cpp
index 6a7dab55359..2a00b09c152 100644
--- a/src/mame/audio/nl_mario.cpp
+++ b/src/mame/audio/nl_mario.cpp
@@ -96,12 +96,12 @@ static NETLIST_START(nl_mario_snd1)
NET_C(R7.2, 2J_B.FC)
NET_C(C4.2, GND)
- SN74LS629(1J_B, CAP_N(39)) /* C5 */
+ SN74LS629(1J_B, CAP_N(39)) /* C5 */
NET_C(1J_B.RNG, V5)
NET_C(1J_B.ENQ, ttllow)
NET_C(GND, 1J_B.GND)
- SN74LS629(2J_B, CAP_N(6.8)) /* C16 */
+ SN74LS629(2J_B, CAP_N(6.8)) /* C16 */
NET_C(2J_B.RNG, V5)
NET_C(2J_B.ENQ, ttllow)
NET_C(GND, 2J_B.GND)
diff --git a/src/mame/audio/polyplay.cpp b/src/mame/audio/polyplay.cpp
index 7a32b4c1cbe..87e881c2509 100644
--- a/src/mame/audio/polyplay.cpp
+++ b/src/mame/audio/polyplay.cpp
@@ -30,4 +30,4 @@ WRITE_LINE_MEMBER(polyplay_state::ctc_zc1_w)
m_flipflop2 = ~m_flipflop2;
m_speaker2->level_w(m_flipflop2);
}
-} \ No newline at end of file
+}
diff --git a/src/mame/drivers/5clown.cpp b/src/mame/drivers/5clown.cpp
index c4440d0e9f1..56cdac32fe2 100644
--- a/src/mame/drivers/5clown.cpp
+++ b/src/mame/drivers/5clown.cpp
@@ -874,7 +874,7 @@ static INPUT_PORTS_START( fclown )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("IN0-3")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Setting") PORT_CODE(KEYCODE_9)
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Setting")
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(3) PORT_NAME("Coin In")
diff --git a/src/mame/drivers/aa310.cpp b/src/mame/drivers/aa310.cpp
index f62ebc51a4b..00e468750b5 100644
--- a/src/mame/drivers/aa310.cpp
+++ b/src/mame/drivers/aa310.cpp
@@ -87,6 +87,7 @@
#include "cpu/arm/arm.h"
#include "includes/archimds.h"
#include "formats/acorn_dsk.h"
+#include "formats/apd_dsk.h"
#include "machine/i2cmem.h"
#include "machine/ram.h"
#include "machine/wd_fdc.h"
@@ -351,7 +352,8 @@ INPUT_PORTS_END
FLOPPY_FORMATS_MEMBER( aa310_state::floppy_formats )
FLOPPY_ACORN_ADFS_NEW_FORMAT,
- FLOPPY_ACORN_ADFS_OLD_FORMAT
+ FLOPPY_ACORN_ADFS_OLD_FORMAT,
+ FLOPPY_APD_FORMAT
FLOPPY_FORMATS_END
static SLOT_INTERFACE_START( aa310_floppies )
diff --git a/src/mame/drivers/aerofgt.cpp b/src/mame/drivers/aerofgt.cpp
index 3fd5d2b8953..2fb4748ccdd 100644
--- a/src/mame/drivers/aerofgt.cpp
+++ b/src/mame/drivers/aerofgt.cpp
@@ -93,7 +93,7 @@ WRITE8_MEMBER(aerofgt_state::pending_command_clear_w)
WRITE8_MEMBER(aerofgt_state::aerofgt_sh_bankswitch_w)
{
- membank("bank1")->set_entry(data & 0x03);
+ m_soundbank->set_entry(data & 0x03);
}
WRITE16_MEMBER(aerofgt_state::pspikesb_oki_banking_w)
@@ -112,9 +112,9 @@ WRITE16_MEMBER(aerofgt_state::aerfboo2_okim6295_banking_w)
WRITE8_MEMBER(aerofgt_state::aerfboot_okim6295_banking_w)
{
- /*bit 2 (0x4) setted too?*/
+ /*bit 2 (0x4) set too?*/
if (data & 0x4)
- membank("okibank")->set_entry(data & 0x3);
+ m_okibank->set_entry(data & 0x3);
}
WRITE8_MEMBER(aerofgt_state::karatblzbl_d7759_write_port_0_w)
@@ -374,7 +374,7 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8, aerofgt_state )
AM_RANGE(0x0000, 0x77ff) AM_ROM
AM_RANGE(0x7800, 0x7fff) AM_RAM
- AM_RANGE(0x8000, 0xffff) AM_ROMBANK("bank1")
+ AM_RANGE(0x8000, 0xffff) AM_ROMBANK("soundbank")
ADDRESS_MAP_END
static ADDRESS_MAP_START( turbofrc_sound_portmap, AS_IO, 8, aerofgt_state )
@@ -1304,9 +1304,7 @@ MACHINE_START_MEMBER(aerofgt_state,common)
MACHINE_START_MEMBER(aerofgt_state,aerofgt)
{
- uint8_t *rom = memregion("audiocpu")->base();
-
- membank("bank1")->configure_entries(0, 4, &rom[0x10000], 0x8000);
+ m_soundbank->configure_entries(0, 4, memregion("audiocpu")->base(), 0x8000);
MACHINE_START_CALL_MEMBER(common);
}
@@ -1320,7 +1318,7 @@ MACHINE_RESET_MEMBER(aerofgt_state,aerofgt)
{
MACHINE_RESET_CALL_MEMBER(common);
- membank("bank1")->set_entry(0); /* needed by spinlbrk */
+ m_soundbank->set_entry(0); /* needed by spinlbrk */
}
static MACHINE_CONFIG_START( pspikes, aerofgt_state )
@@ -1922,9 +1920,8 @@ ROM_START( pspikes )
ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
ROM_LOAD16_WORD_SWAP( "pspikes2.bin", 0x00000, 0x40000, CRC(ec0c070e) SHA1(4ddcc184e835a2f9d15f01aaa03734fd75fe797e) )
- ROM_REGION( 0x30000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
ROM_LOAD( "19", 0x00000, 0x20000, CRC(7e8ed6e5) SHA1(eeb1a1e1989fad8fc1e741928422efaec0598868) )
- ROM_RELOAD( 0x10000, 0x20000 )
ROM_REGION( 0x080000, "gfx1", 0 )
ROM_LOAD( "g7h", 0x000000, 0x80000, CRC(74c23c3d) SHA1(c0ac57d1f05c42556f97154ce1a08f465948546b) )
@@ -1947,9 +1944,8 @@ ROM_START( pspikesk )
ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
ROM_LOAD16_WORD_SWAP( "20", 0x00000, 0x40000, CRC(75cdcee2) SHA1(272a08c46c1d0989f9fbb156e28e6a7ffa9c0a53) )
- ROM_REGION( 0x30000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
ROM_LOAD( "19", 0x00000, 0x20000, CRC(7e8ed6e5) SHA1(eeb1a1e1989fad8fc1e741928422efaec0598868) )
- ROM_RELOAD( 0x10000, 0x20000 )
ROM_REGION( 0x080000, "gfx1", 0 )
ROM_LOAD( "g7h", 0x000000, 0x80000, CRC(74c23c3d) SHA1(c0ac57d1f05c42556f97154ce1a08f465948546b) )
@@ -1973,9 +1969,8 @@ ROM_START( pspikesu )
ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
ROM_LOAD16_WORD_SWAP( "svolly91.73", 0x00000, 0x40000, CRC(bfbffcdb) SHA1(2bba99cb6d0cb2fbb3cd1242551dd7e2c6ebef50) )
- ROM_REGION( 0x30000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
ROM_LOAD( "19", 0x00000, 0x20000, CRC(7e8ed6e5) SHA1(eeb1a1e1989fad8fc1e741928422efaec0598868) )
- ROM_RELOAD( 0x10000, 0x20000 )
ROM_REGION( 0x080000, "gfx1", 0 )
ROM_LOAD( "g7h", 0x000000, 0x80000, CRC(74c23c3d) SHA1(c0ac57d1f05c42556f97154ce1a08f465948546b) )
@@ -1995,9 +1990,8 @@ ROM_START( svolly91 )
ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */
ROM_LOAD16_WORD_SWAP( "u11.jpn", 0x00000, 0x40000, CRC(ea2e4c82) SHA1(f9cf9122499d9b1e54221fb8b6ef9c12004ca85e) )
- ROM_REGION( 0x30000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
ROM_LOAD( "19", 0x00000, 0x20000, CRC(7e8ed6e5) SHA1(eeb1a1e1989fad8fc1e741928422efaec0598868) )
- ROM_RELOAD( 0x10000, 0x20000 )
ROM_REGION( 0x080000, "gfx1", 0 )
ROM_LOAD( "g7h", 0x000000, 0x80000, CRC(74c23c3d) SHA1(c0ac57d1f05c42556f97154ce1a08f465948546b) )
@@ -2374,9 +2368,8 @@ ROM_START( karatblz )
ROM_LOAD16_WORD_SWAP( "rom2v3", 0x00000, 0x40000, CRC(01f772e1) SHA1(f87f19a82d75839b5671f23ce14218d7b910eabc) )
ROM_LOAD16_WORD_SWAP( "1.u15", 0x40000, 0x40000, CRC(d16ee21b) SHA1(d454cdf22b72a537b9d7ae73deb8136a4f09da47) )
- ROM_REGION( 0x30000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
ROM_LOAD( "5.u92", 0x00000, 0x20000, CRC(97d67510) SHA1(1ffd419e3dec7de1099cd5819b0309f7dd0df80e) )
- ROM_RELOAD( 0x10000, 0x20000 )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_LOAD( "gha.u55", 0x00000, 0x80000, CRC(3e0cea91) SHA1(bab41715f106d364013b64649441d280bc6893cf) )
@@ -2406,9 +2399,8 @@ ROM_START( karatblza )
ROM_LOAD16_WORD_SWAP( "v2.u14", 0x00000, 0x40000, CRC(7a78976e) SHA1(3b74b80765622b8488bdd0729ec98a2c7584cad5) )
ROM_LOAD16_WORD_SWAP( "v1.u15", 0x40000, 0x40000, CRC(47e410fe) SHA1(d26fc93f91ccf00856db2b7dfd0d905d87e99bd8) )
- ROM_REGION( 0x30000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
ROM_LOAD( "5.u92", 0x00000, 0x20000, CRC(97d67510) SHA1(1ffd419e3dec7de1099cd5819b0309f7dd0df80e) )
- ROM_RELOAD( 0x10000, 0x20000 )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_LOAD( "gha.u55", 0x00000, 0x80000, CRC(3e0cea91) SHA1(bab41715f106d364013b64649441d280bc6893cf) )
@@ -2438,9 +2430,8 @@ ROM_START( karatblzu )
ROM_LOAD16_WORD_SWAP( "2.u14", 0x00000, 0x40000, CRC(202e6220) SHA1(2605511a0574cbc39fdf3d8ae27a0aa9b43345fb) )
ROM_LOAD16_WORD_SWAP( "1.u15", 0x40000, 0x40000, CRC(d16ee21b) SHA1(d454cdf22b72a537b9d7ae73deb8136a4f09da47) )
- ROM_REGION( 0x30000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
ROM_LOAD( "5.u92", 0x00000, 0x20000, CRC(97d67510) SHA1(1ffd419e3dec7de1099cd5819b0309f7dd0df80e) )
- ROM_RELOAD( 0x10000, 0x20000 )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_LOAD( "gha.u55", 0x00000, 0x80000, CRC(3e0cea91) SHA1(bab41715f106d364013b64649441d280bc6893cf) )
@@ -2470,9 +2461,8 @@ ROM_START( karatblzj )
ROM_LOAD16_WORD_SWAP( "2tecmo.u14", 0x00000, 0x40000, CRC(57e52654) SHA1(15939d8f7c693b9248f3dd2b2ad5fbae2c19621f) )
ROM_LOAD16_WORD_SWAP( "1.u15", 0x40000, 0x40000, CRC(d16ee21b) SHA1(d454cdf22b72a537b9d7ae73deb8136a4f09da47) )
- ROM_REGION( 0x30000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
ROM_LOAD( "5.u92", 0x00000, 0x20000, CRC(97d67510) SHA1(1ffd419e3dec7de1099cd5819b0309f7dd0df80e) )
- ROM_RELOAD( 0x10000, 0x20000 )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_LOAD( "gha.u55", 0x00000, 0x80000, CRC(3e0cea91) SHA1(bab41715f106d364013b64649441d280bc6893cf) )
@@ -2560,9 +2550,8 @@ ROM_START( turbofrc ) // World version with no copyright notice
ROM_LOAD16_WORD_SWAP( "4v1.subpcb.u1", 0x40000, 0x40000, CRC(6cd5312b) SHA1(57b109fe268fb963e981c91b6d288667a3c9a665) ) // 27c2048 - located on a OR-10 SUB BOARD - 4 stamped on chip with VideoSystem logo V
ROM_LOAD16_WORD_SWAP( "4v3.u14", 0x80000, 0x40000, CRC(63f50557) SHA1(f8dba8c9ba412c9a67457ec31a804c57593ab20b) ) // 27c2048 - 4 stamped on chip with VideoSystem logo V
- ROM_REGION( 0x30000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
ROM_LOAD( "6.u166", 0x00000, 0x20000, CRC(2ca14a65) SHA1(95f6e7b4fa7ca26872ff472d7e6fb75fd4f281d5) ) // 27c1001
- ROM_RELOAD( 0x10000, 0x20000 )
ROM_REGION( 0x0a0000, "gfx1", 0 )
ROM_LOAD( "lh534ggs.u94", 0x000000, 0x80000, CRC(baa53978) SHA1(7f103122dd0bf675226ccf309fba73f645e0c79b) ) // mask rom
@@ -2595,9 +2584,8 @@ ROM_START( turbofrcu ) // US version: most notable thing in there is the points
ROM_LOAD16_WORD_SWAP( "8v1.subpcb.u1", 0x40000, 0x40000, CRC(cc324da6) SHA1(ed2eaff7351914e3ebaf925ddc01be9d44d89fa6) ) // 27c2048 - located on a OR-10 SUB BOARD - 8 stamped on chip with VideoSystem logo V
ROM_LOAD16_WORD_SWAP( "8v3.u14", 0x80000, 0x40000, CRC(c0a15480) SHA1(1ec99382e0a00a8167773b1d454a63cc5cd6199c) ) // 27c2048 - 8 stamped on chip with VideoSystem logo V
- ROM_REGION( 0x30000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
ROM_LOAD( "6.u166", 0x00000, 0x20000, CRC(2ca14a65) SHA1(95f6e7b4fa7ca26872ff472d7e6fb75fd4f281d5) ) // 27c1001
- ROM_RELOAD( 0x10000, 0x20000 )
ROM_REGION( 0x0a0000, "gfx1", 0 )
ROM_LOAD( "lh534ggs.u94", 0x000000, 0x80000, CRC(baa53978) SHA1(7f103122dd0bf675226ccf309fba73f645e0c79b) ) // mask rom
@@ -2628,9 +2616,8 @@ ROM_START( aerofgt )
ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 code */
ROM_LOAD16_WORD_SWAP( "1.u4", 0x00000, 0x80000, CRC(6fdff0a2) SHA1(7cc9529b426091027aa3e23586cb7d162376c0ff) )
- ROM_REGION( 0x30000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
ROM_LOAD( "2.153", 0x00000, 0x20000, CRC(a1ef64ec) SHA1(fa3e434738bf4e742ad68882c1e914100ce0f761) )
- ROM_RELOAD( 0x10000, 0x20000 )
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_LOAD( "538a54.124", 0x000000, 0x80000, CRC(4d2c4df2) SHA1(f51c2b3135f0a921ac1a79e63d6878c03cb6254b) )
@@ -2652,9 +2639,8 @@ ROM_START( aerofgtb )
ROM_LOAD16_BYTE( "v2", 0x00000, 0x40000, CRC(5c9de9f0) SHA1(93b62c59f0bc052c6fdbd5aae292a7ab2122dfd1) )
ROM_LOAD16_BYTE( "v1", 0x00001, 0x40000, CRC(89c1dcf4) SHA1(41401d63049c140e4254dc791022d85c44271390) )
- ROM_REGION( 0x30000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
ROM_LOAD( "v3", 0x00000, 0x20000, CRC(cbb18cf4) SHA1(7119a7536cf710660ff06d1e7d2879c79ef12b3d) )
- ROM_RELOAD( 0x10000, 0x20000 )
ROM_REGION( 0x080000, "gfx1", 0 )
ROM_LOAD( "it-19-03", 0x000000, 0x80000, CRC(85eba1a4) SHA1(5691a95d6359fdab29be0d615066370c2b856c0a) )
@@ -2682,9 +2668,8 @@ ROM_START( aerofgtc )
ROM_LOAD16_BYTE( "v2.149", 0x00000, 0x40000, CRC(f187aec6) SHA1(8905af34f114ae22fbfbd3ae115f19280bdd4fb3) )
ROM_LOAD16_BYTE( "v1.111", 0x00001, 0x40000, CRC(9e684b19) SHA1(b5e1e5b74ed9fd223c9315ee2d548e620224c102) )
- ROM_REGION( 0x30000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
ROM_LOAD( "2.153", 0x00000, 0x20000, CRC(a1ef64ec) SHA1(fa3e434738bf4e742ad68882c1e914100ce0f761) )
- ROM_RELOAD( 0x10000, 0x20000 )
/* gfx ROMs were missing in this set, I'm using the aerofgtb ones */
ROM_REGION( 0x080000, "gfx1", 0 )
@@ -2713,9 +2698,8 @@ ROM_START( sonicwi )
ROM_LOAD16_BYTE( "2.149", 0x00000, 0x40000, CRC(3d1b96ba) SHA1(941be323c0cb15e05c92b897984617b05c5cf676) )
ROM_LOAD16_BYTE( "1.111", 0x00001, 0x40000, CRC(a3d09f94) SHA1(a1064d659488878f5303edc2b8636312ab632a83) )
- ROM_REGION( 0x30000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* 64k for the audio CPU + banks */
ROM_LOAD( "2.153", 0x00000, 0x20000, CRC(a1ef64ec) SHA1(fa3e434738bf4e742ad68882c1e914100ce0f761) ) // 3.156
- ROM_RELOAD( 0x10000, 0x20000 )
/* gfx ROMs were missing in this set, I'm using the aerofgtb ones */
ROM_REGION( 0x080000, "gfx1", 0 )
@@ -2823,7 +2807,7 @@ ROM_END
DRIVER_INIT_MEMBER(aerofgt_state, banked_oki)
{
- membank("okibank")->configure_entries(0, 4, memregion("oki")->base() + 0x20000, 0x20000);
+ m_okibank->configure_entries(0, 4, memregion("oki")->base() + 0x20000, 0x20000);
}
diff --git a/src/mame/drivers/aleisttl.cpp b/src/mame/drivers/aleisttl.cpp
index df43a588445..51c2e64ff1a 100644
--- a/src/mame/drivers/aleisttl.cpp
+++ b/src/mame/drivers/aleisttl.cpp
@@ -7,7 +7,7 @@
Chase (aka Chase1) (1976)
Deluxe Soccer (1973)
Fire Power (1975) EG-1020-2
- Fütsball (1975)
+ Fötsball (1975)
Galaxy Raider (1974)
Hesitation (1974) AL-6500?
Hockey, Soccer, Tennis (1974)
diff --git a/src/mame/drivers/alg.cpp b/src/mame/drivers/alg.cpp
index 2828a8e3512..258e2df1a35 100644
--- a/src/mame/drivers/alg.cpp
+++ b/src/mame/drivers/alg.cpp
@@ -320,11 +320,13 @@ static MACHINE_CONFIG_START( alg_r1, alg_state )
/* sound hardware */
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
- MCFG_SOUND_ADD("amiga", AMIGA, amiga_state::CLK_C1_NTSC)
+ MCFG_SOUND_ADD("amiga", PAULA_8364, amiga_state::CLK_C1_NTSC)
MCFG_SOUND_ROUTE(0, "lspeaker", 0.25)
MCFG_SOUND_ROUTE(1, "rspeaker", 0.25)
MCFG_SOUND_ROUTE(2, "rspeaker", 0.25)
MCFG_SOUND_ROUTE(3, "lspeaker", 0.25)
+ MCFG_PAULA_MEM_READ_CB(READ16(amiga_state, chip_ram_r))
+ MCFG_PAULA_INT_CB(WRITELINE(amiga_state, paula_int_w))
MCFG_SOUND_MODIFY("laserdisc")
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
diff --git a/src/mame/drivers/amiga.cpp b/src/mame/drivers/amiga.cpp
index e60f4298d8d..7cd26f8acfd 100644
--- a/src/mame/drivers/amiga.cpp
+++ b/src/mame/drivers/amiga.cpp
@@ -8,6 +8,7 @@
#include "emu.h"
#include "includes/amiga.h"
+#include "bus/amiga/keyboard/keyboard.h"
#include "bus/amiga/zorro/zorro.h"
#include "cpu/m68000/m68000.h"
#include "cpu/m6502/m6502.h"
@@ -20,11 +21,11 @@
#include "machine/nvram.h"
#include "machine/i2cmem.h"
#include "machine/amigafdc.h"
-#include "machine/amigakbd.h"
#include "machine/cr511b.h"
#include "machine/rp5c01.h"
#include "softlist.h"
+
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -1318,7 +1319,7 @@ static MACHINE_CONFIG_START( amiga_base, amiga_state )
MCFG_MOS6526_PA_OUTPUT_CALLBACK(WRITE8(amiga_state, cia_0_port_a_write))
MCFG_MOS6526_PB_OUTPUT_CALLBACK(DEVWRITE8("cent_data_out", output_latch_device, write))
MCFG_MOS6526_PC_CALLBACK(DEVWRITELINE("centronics", centronics_device, write_strobe))
- MCFG_MOS6526_SP_CALLBACK(DEVWRITELINE("kbd", amigakbd_device, kdat_w))
+ MCFG_MOS6526_SP_CALLBACK(DEVWRITELINE("kbd", amiga_keyboard_bus_device, kdat_in_w)) MCFG_DEVCB_INVERT
MCFG_DEVICE_ADD("cia_1", MOS8520, amiga_state::CLK_E_PAL)
MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(amiga_state, cia_1_irq))
@@ -1328,11 +1329,13 @@ static MACHINE_CONFIG_START( amiga_base, amiga_state )
// audio
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
- MCFG_SOUND_ADD("amiga", AMIGA, amiga_state::CLK_C1_PAL)
+ MCFG_SOUND_ADD("amiga", PAULA_8364, amiga_state::CLK_C1_PAL)
MCFG_SOUND_ROUTE(0, "lspeaker", 0.50)
MCFG_SOUND_ROUTE(1, "rspeaker", 0.50)
MCFG_SOUND_ROUTE(2, "rspeaker", 0.50)
MCFG_SOUND_ROUTE(3, "lspeaker", 0.50)
+ MCFG_PAULA_MEM_READ_CB(READ16(amiga_state, chip_ram_r))
+ MCFG_PAULA_INT_CB(WRITELINE(amiga_state, paula_int_w))
// floppy drives
MCFG_DEVICE_ADD("fdc", AMIGA_FDC, amiga_state::CLK_7M_PAL)
@@ -1358,10 +1361,10 @@ static MACHINE_CONFIG_START( amiga_base, amiga_state )
MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
// keyboard
- MCFG_DEVICE_ADD("kbd", AMIGAKBD, 0)
- MCFG_AMIGA_KEYBOARD_KCLK_CALLBACK(DEVWRITELINE("cia_0", mos8520_device, cnt_w))
- MCFG_AMIGA_KEYBOARD_KDAT_CALLBACK(DEVWRITELINE("cia_0", mos8520_device, sp_w))
- MCFG_AMIGA_KEYBOARD_KRST_CALLBACK(WRITELINE(amiga_state, kbreset_w))
+ MCFG_AMIGA_KEYBOARD_INTERFACE_ADD("kbd", "a500_us")
+ MCFG_AMIGA_KEYBOARD_KCLK_HANDLER(DEVWRITELINE("cia_0", mos8520_device, cnt_w))
+ MCFG_AMIGA_KEYBOARD_KDAT_HANDLER(DEVWRITELINE("cia_0", mos8520_device, sp_w))
+ MCFG_AMIGA_KEYBOARD_KRST_HANDLER(WRITELINE(amiga_state, kbreset_w))
// software
MCFG_SOFTWARE_LIST_ADD("wb_list", "amiga_workbench")
@@ -1694,6 +1697,12 @@ static MACHINE_CONFIG_DERIVED_CLASS( a1200, amiga_base, a1200_state )
MCFG_ATA_INTERFACE_ADD("ata", ata_devices, "hdd", nullptr, false)
MCFG_ATA_INTERFACE_IRQ_HANDLER(DEVWRITELINE("gayle", gayle_device, ide_interrupt_w))
+ // keyboard
+#if 0
+ MCFG_DEVICE_MODIFY("kbd")
+ MCFG_SLOT_DEFAULT_OPTION("a1200_us")
+#endif
+
// todo: pcmcia
MACHINE_CONFIG_END
@@ -2064,10 +2073,6 @@ ROM_START( a1200 )
ROM_SYSTEM_BIOS(2, "logica2", "Logica Diagnostic 2.0")
ROMX_LOAD("logica2.u6a", 0x00000, 0x40000, CRC(566bc3f9) SHA1(891d3b7892843517d800d24593168b1d8f1646ca), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(3))
ROMX_LOAD("logica2.u6b", 0x00002, 0x40000, CRC(aac94759) SHA1(da8a4f9ae1aa84f5e2a5dcc5c9d7e4378a9698b7), ROM_GROUPWORD | ROM_REVERSE | ROM_SKIP(2) | ROM_BIOS(3))
-
- ROM_REGION(0x4000, "keyboard", 0)
- ROM_LOAD("391508-01.u13", 0x0000, 0x1040, NO_DUMP) // COMMODORE | 391508-01 REV0 | KEYBOARD MPU (MC68HC05C4AFN)
- ROM_LOAD("391508-02.u13", 0x0000, 0x2f40, NO_DUMP) // Amiga Tech REV1 Keyboard MPU (MC68HC05C12FN)
ROM_END
#define rom_a1200n rom_a1200
diff --git a/src/mame/drivers/aristmk5.cpp b/src/mame/drivers/aristmk5.cpp
index 4b385c086a2..c9651eeb8cb 100644
--- a/src/mame/drivers/aristmk5.cpp
+++ b/src/mame/drivers/aristmk5.cpp
@@ -13,10 +13,10 @@
TODO (MK-5 specific):
- Fix remaining errors
- - If all tests passes, this msg is printed on the keyboard serial port:
- "System Startup Code Entered \n Gos_create could not allocate stack for the new process \n
- Unrecoverable error occurred. System will now restart"
- Apparently it looks like some sort of protection device ...
+ - Layouts for various configurations
+ - Bill acceptor
+ - Serial printer
+ - Default NVRAM
code DASMing of POST (adonis):
- bp 0x3400224:
@@ -179,9 +179,11 @@
#include "machine/input_merger.h"
#include "machine/nvram.h"
#include "machine/ins8250.h"
+#include "machine/ticket.h"
#include "sound/volt_reg.h"
#include "aristmk5.lh"
+#include "aristmk5_us.lh"
class aristmk5_state : public archimedes_state
{
@@ -191,26 +193,35 @@ public:
, m_eeprom(*this, "eeprom%d", 0)
, m_rtc(*this, "rtc")
, m_nvram(*this, "nvram")
+ , m_hopper(*this, "hopper")
, m_sram(*this, "sram")
+ , m_p1(*this, "P1")
+ , m_p2(*this, "P2")
, m_extra_ports(*this, "EXTRA")
{ }
DECLARE_WRITE32_MEMBER(Ns5w48);
DECLARE_READ32_MEMBER(Ns5x58);
- DECLARE_READ32_MEMBER(mk5_ioc_r);
- DECLARE_WRITE32_MEMBER(mk5_ioc_w);
DECLARE_READ32_MEMBER(Ns5r50);
- DECLARE_WRITE32_MEMBER(sram_banksel_w);
- DECLARE_WRITE32_MEMBER(eeprom_w);
- DECLARE_WRITE32_MEMBER(rtc_w);
- DECLARE_READ32_MEMBER(eeprom_r);
- DECLARE_READ32_MEMBER(ldor_r);
- DECLARE_WRITE32_MEMBER(ldor_clk_w);
+ DECLARE_WRITE8_MEMBER(sram_banksel_w);
+ DECLARE_WRITE8_MEMBER(eeprom_w);
+ DECLARE_WRITE8_MEMBER(eeprom_usa_w);
+ DECLARE_WRITE8_MEMBER(rtc_w);
+ DECLARE_WRITE8_MEMBER(rtc_usa_w);
+ DECLARE_WRITE8_MEMBER(hopper_w);
+ DECLARE_READ8_MEMBER(eeprom_r);
+ DECLARE_READ8_MEMBER(ldor_r);
+ DECLARE_WRITE8_MEMBER(ldor_clk_w);
DECLARE_WRITE8_MEMBER(buttons_lamps_w);
DECLARE_WRITE8_MEMBER(other_lamps_w);
DECLARE_WRITE8_MEMBER(bill_acceptor_lamps_w);
DECLARE_READ8_MEMBER(sram_r);
DECLARE_WRITE8_MEMBER(sram_w);
+ DECLARE_WRITE8_MEMBER(spi_mux_w);
+ DECLARE_WRITE8_MEMBER(spi_data_w);
+ DECLARE_READ8_MEMBER(spi_int_ack_r);
+ DECLARE_WRITE8_MEMBER(spi_int_ack_w);
+ DECLARE_READ8_MEMBER(spi_data_r);
DECLARE_WRITE_LINE_MEMBER(uart_irq_callback);
DECLARE_DRIVER_INIT(aristmk5);
@@ -218,27 +229,130 @@ public:
virtual void machine_reset() override;
TIMER_CALLBACK_MEMBER(mk5_VSYNC_callback);
TIMER_CALLBACK_MEMBER(mk5_2KHz_callback);
+ TIMER_CALLBACK_MEMBER(spi_timer);
INPUT_CHANGED_MEMBER(coin_start);
CUSTOM_INPUT_MEMBER(coin_r);
+ CUSTOM_INPUT_MEMBER(coin_usa_r);
+ CUSTOM_INPUT_MEMBER(hopper_r);
private:
required_device_array<eeprom_serial_93cxx_device, 2> m_eeprom;
required_device<ds1302_device> m_rtc;
required_device<nvram_device> m_nvram;
+ required_device<ticket_dispenser_device> m_hopper;
required_memory_region m_sram;
+ required_ioport m_p1;
+ required_ioport m_p2;
required_ioport m_extra_ports;
emu_timer * m_mk5_2KHz_timer;
emu_timer * m_mk5_VSYNC_timer;
- uint8_t m_ext_latch;
+ emu_timer * m_spi_timer;
uint8_t m_sram_bank;
- uint8_t m_flyback;
uint8_t m_ldor_shift_reg;
+ uint8_t m_hopper_test;
uint64_t m_coin_start_cycles;
+ uint8_t m_coin_div;
+ uint8_t m_spi_mux;
+ uint8_t m_spi_latch;
+ uint8_t m_spi_bits;
+ uint32_t m_spi_data[8];
};
+WRITE8_MEMBER(aristmk5_state::spi_mux_w)
+{
+ uint8_t spi_mux = (data >> 4) & 7;
+
+ if (spi_mux == m_spi_mux)
+ return;
+
+ m_spi_mux = spi_mux;
+
+ switch (m_spi_mux)
+ {
+ case 0: // Test
+ case 3: // not used
+ break;
+
+ case 1: // Top box lamps
+ break;
+
+ case 2: // Mechanical meters
+ for(int i=0; i<4; i++)
+ output().set_lamp_value(32 + i, BIT(m_spi_data[m_spi_mux], 1 + i)); // Tower Lamps
+ break;
+
+ case 4: // Door inputs
+ m_spi_data[m_spi_mux] = m_p1->read();
+ break;
+
+ case 5: // Door outputs
+ for(int i=0; i<32; i++)
+ output().set_lamp_value(i, BIT(m_spi_data[m_spi_mux], i));
+ break;
+
+ case 6: // Main board slow I/O
+ m_spi_data[m_spi_mux] = m_p2->read() & ~((data & 0x80) ? 0 : 0x100);
+ break;
+
+ case 7: // Main board security registers
+ break;
+ }
+}
+
+WRITE8_MEMBER(aristmk5_state::spi_data_w)
+{
+ m_spi_latch = data;
+ m_spi_bits = 0;
+
+ // start the SPI clock
+ m_spi_timer->adjust(attotime::from_hz((double)MASTER_CLOCK / 9 / 512 / 2), 0, attotime::from_hz((double)MASTER_CLOCK / 9 / 512 / 2));
+}
+
+READ8_MEMBER(aristmk5_state::spi_data_r)
+{
+ return m_spi_latch;
+}
+
+READ8_MEMBER(aristmk5_state::spi_int_ack_r)
+{
+ archimedes_clear_irq_b(0x08);
+ return 0;
+}
+
+WRITE8_MEMBER(aristmk5_state::spi_int_ack_w)
+{
+ archimedes_clear_irq_b(0x08);
+}
+
+TIMER_CALLBACK_MEMBER(aristmk5_state::spi_timer)
+{
+ if (m_spi_mux == 0 || m_spi_mux == 3)
+ {
+ m_spi_latch = (((m_spi_latch & 1) << 7) ^ 0x80) | ((m_spi_latch >> 1) & 0x7f);
+ }
+ else
+ {
+ static int mux_bits[8] = { 0, 16, 16, 0, 24, 32, 24, 8 };
+
+ uint32_t mux_mask = ((uint32_t)1 << (mux_bits[m_spi_mux] - 1)) - 1;
+ uint32_t spi_in_bit = m_spi_data[m_spi_mux] & 1;
+ uint32_t spi_out_bit = m_spi_latch & 1;
+
+ m_spi_data[m_spi_mux] = (spi_out_bit << (mux_bits[m_spi_mux] - 1)) | ((m_spi_data[m_spi_mux] >> 1) & mux_mask);
+ m_spi_latch = (spi_in_bit << 7) | ((m_spi_latch >> 1) & 0x7f);
+ }
+
+ // SPI interrupt
+ if (++m_spi_bits == 8)
+ {
+ m_spi_timer->adjust(attotime::never);
+ archimedes_request_irq_b(0x08);
+ }
+}
+
WRITE_LINE_MEMBER(aristmk5_state::uart_irq_callback)
{
if (state)
@@ -249,7 +363,7 @@ WRITE_LINE_MEMBER(aristmk5_state::uart_irq_callback)
TIMER_CALLBACK_MEMBER(aristmk5_state::mk5_VSYNC_callback)
{
- m_ioc_regs[IRQ_STATUS_A] |= 0x08; //turn vsync bit on
+ archimedes_request_irq_a(0x08); //turn vsync bit on
m_mk5_VSYNC_timer->adjust(attotime::never);
}
@@ -300,7 +414,7 @@ WRITE32_MEMBER(aristmk5_state::Ns5w48)
*/
- m_ioc_regs[IRQ_STATUS_A] &= ~0x08;
+ archimedes_clear_irq_a(0x08);
/* bit 1 bit 0 */
if((data &~(0x02)) && (data & (0x01))) // external video crystal is enabled. 25 mhz
@@ -323,7 +437,7 @@ WRITE32_MEMBER(aristmk5_state::Ns5w48)
TIMER_CALLBACK_MEMBER(aristmk5_state::mk5_2KHz_callback)
{
- m_ioc_regs[IRQ_STATUS_A] |= 0x01;
+ archimedes_request_irq_a(0x01);
m_mk5_2KHz_timer->adjust(attotime::never);
}
@@ -350,62 +464,17 @@ READ32_MEMBER(aristmk5_state::Ns5x58)
// reset 2KHz timer
- m_mk5_2KHz_timer->adjust(attotime::from_hz(1953.125));
- m_ioc_regs[IRQ_STATUS_A] &= ~0x01;
- m_maincpu->set_input_line(ARM_IRQ_LINE, CLEAR_LINE);
+ m_mk5_2KHz_timer->adjust(attotime::from_hz((double)MASTER_CLOCK / 9 / 4096));
+ archimedes_clear_irq_a(0x01);
return 0xffffffff;
}
-/* same as plain AA but with the I2C unconnected */
-READ32_MEMBER(aristmk5_state::mk5_ioc_r)
-{
- uint32_t ioc_addr;
-
- ioc_addr = offset*4;
- ioc_addr >>= 16;
- ioc_addr &= 0x37;
-
- if(((ioc_addr == 0x20) || (ioc_addr == 0x30)) && (offset & 0x1f) == 0)
- {
- int vert_pos;
-
- vert_pos = m_screen->vpos();
- m_flyback = (vert_pos <= m_vidc_regs[VIDC_VDSR] || vert_pos >= m_vidc_regs[VIDC_VDER]) ? 0x80 : 0x00;
-
- //i2c_data = (i2cmem_sda_read(machine().device("i2cmem")) & 1);
-
- return (m_flyback) | (m_ioc_regs[CONTROL] & 0x7c) | (1<<1) | 1;
- }
-
- return archimedes_ioc_r(space,offset,mem_mask);
-}
-
-WRITE32_MEMBER(aristmk5_state::mk5_ioc_w)
-{
- uint32_t ioc_addr;
-
- ioc_addr = offset*4;
- ioc_addr >>= 16;
- ioc_addr &= 0x37;
-
- if(!m_ext_latch)
- {
- if(((ioc_addr == 0x20) || (ioc_addr == 0x30)) && (offset & 0x1f) == 0)
- {
- m_ioc_regs[CONTROL] = data & 0x7c;
- return;
- }
- else
- archimedes_ioc_w(space,offset,data,mem_mask);
- }
-}
-
READ32_MEMBER(aristmk5_state::Ns5r50)
{
return 0xf5; // checked inside the CPU check, unknown meaning
}
-READ32_MEMBER(aristmk5_state::eeprom_r)
+READ8_MEMBER(aristmk5_state::eeprom_r)
{
uint8_t data = 0x00;
if (m_eeprom[0]->do_read() && m_eeprom[1]->do_read())
@@ -417,46 +486,60 @@ READ32_MEMBER(aristmk5_state::eeprom_r)
return data;
}
-WRITE32_MEMBER(aristmk5_state::rtc_w)
+WRITE8_MEMBER(aristmk5_state::hopper_w)
{
- if (ACCESSING_BITS_0_7)
- {
- m_rtc->ce_w(BIT(data, 5));
+ m_hopper->write(space, 0, (data & 0x02) ? 0x80 : 0);
+ m_hopper_test = BIT(data, 2);
+}
+
+WRITE8_MEMBER(aristmk5_state::rtc_w)
+{
+ m_rtc->ce_w(BIT(data, 5));
- if (BIT(data, 6))
- m_rtc->io_w(BIT(data, 3));
+ if (BIT(data, 6))
+ m_rtc->io_w(BIT(data, 3));
- m_rtc->sclk_w(BIT(data, 4));
- }
+ m_rtc->sclk_w(BIT(data, 4));
}
-WRITE32_MEMBER(aristmk5_state::eeprom_w)
+WRITE8_MEMBER(aristmk5_state::rtc_usa_w)
{
- if (ACCESSING_BITS_0_7)
- {
- m_eeprom[0]->cs_write(BIT(data, 5));
- m_eeprom[1]->cs_write(BIT(data, 6));
- m_eeprom[0]->di_write(BIT(data, 3));
- m_eeprom[1]->di_write(BIT(data, 3));
- m_eeprom[0]->clk_write(BIT(data, 4));
- m_eeprom[1]->clk_write(BIT(data, 4));
- }
+ rtc_w(space, offset, data, mem_mask);
+ m_hopper_test = BIT(data, 2);
}
-READ32_MEMBER(aristmk5_state::ldor_r)
+WRITE8_MEMBER(aristmk5_state::eeprom_w)
+{
+ m_coin_div = data & 1;
+
+ m_eeprom[0]->cs_write(BIT(data, 5));
+ m_eeprom[1]->cs_write(BIT(data, 6));
+ m_eeprom[0]->di_write(BIT(data, 3));
+ m_eeprom[1]->di_write(BIT(data, 3));
+ m_eeprom[0]->clk_write(BIT(data, 4));
+ m_eeprom[1]->clk_write(BIT(data, 4));
+}
+
+WRITE8_MEMBER(aristmk5_state::eeprom_usa_w)
+{
+ eeprom_w(space, offset, data, mem_mask);
+ m_hopper->write(space, 0, (data & 0x04) ? 0x80 : 0);
+}
+
+READ8_MEMBER(aristmk5_state::ldor_r)
{
if (m_extra_ports->read() & 0x01)
m_ldor_shift_reg = 0; // open the Logic door clears the shift register
- return (m_ldor_shift_reg & 0x80);
+ return (m_ldor_shift_reg & 0x80) | 0x60 | ((m_hopper_test && m_hopper->line_r()) ? 0x10 : 0x00);
}
-WRITE32_MEMBER(aristmk5_state::ldor_clk_w)
+WRITE8_MEMBER(aristmk5_state::ldor_clk_w)
{
m_ldor_shift_reg = (m_ldor_shift_reg << 1) | BIT(data, 0);
}
-WRITE32_MEMBER(aristmk5_state::sram_banksel_w)
+WRITE8_MEMBER(aristmk5_state::sram_banksel_w)
{
/*
@@ -537,36 +620,16 @@ static ADDRESS_MAP_START( aristmk5_map, AS_PROGRAM, 32, aristmk5_state )
AM_RANGE(0x02000000, 0x02ffffff) AM_RAM AM_SHARE("physicalram") /* physical RAM - 16 MB for now, should be 512k for the A310 */
/* MK-5 overrides */
- AM_RANGE(0x03010420, 0x03010423) AM_WRITE(sram_banksel_w) // SRAM bank select write
- AM_RANGE(0x03010440, 0x03010443) AM_WRITE(rtc_w)
- AM_RANGE(0x03010450, 0x03010453) AM_WRITE(eeprom_w)
- AM_RANGE(0x03010800, 0x03010803) AM_READ(eeprom_r)
-
- AM_RANGE(0x03010580, 0x03010583) AM_READ_PORT("P3")
- AM_RANGE(0x03010700, 0x03010703) AM_READ_PORT("P6")
- AM_RANGE(0x03012000, 0x03012003) AM_READ_PORT("P1")
- AM_RANGE(0x03012010, 0x03012013) AM_READ_PORT("P2")
- AM_RANGE(0x03012200, 0x03012203) AM_READ_PORT("DSW1")
- AM_RANGE(0x03012210, 0x03012213) AM_READ_PORT("DSW2")
- AM_RANGE(0x03010584, 0x03010587) AM_READ_PORT("P4")
- AM_RANGE(0x03012184, 0x03012187) AM_READ_PORT("P5")
-
- AM_RANGE(0x03012020, 0x03012023) AM_READ(ldor_r)
- AM_RANGE(0x03012070, 0x03012073) AM_WRITE(ldor_clk_w)
-
- AM_RANGE(0x03012000, 0x0301201f) AM_WRITE8(buttons_lamps_w, 0x000000ff)
- AM_RANGE(0x03012030, 0x0301203f) AM_WRITE8(other_lamps_w, 0x000000ff)
- AM_RANGE(0x03012380, 0x0301238f) AM_WRITE8(bill_acceptor_lamps_w, 0x000000ff)
+ AM_RANGE(0x03010420, 0x03010423) AM_WRITE8(sram_banksel_w, 0x000000ff) // SRAM bank select write
AM_RANGE(0x03010480, 0x0301049f) AM_DEVREADWRITE8("uart_0a", ins8250_uart_device, ins8250_r, ins8250_w, 0x000000ff)
AM_RANGE(0x03010500, 0x0301051f) AM_DEVREADWRITE8("uart_0b", ins8250_uart_device, ins8250_r, ins8250_w, 0x000000ff)
+ AM_RANGE(0x03010580, 0x03010583) AM_READ_PORT("P3")
AM_RANGE(0x03010600, 0x0301061f) AM_DEVREADWRITE8("uart_1a", ins8250_uart_device, ins8250_r, ins8250_w, 0x000000ff)
AM_RANGE(0x03010680, 0x0301069f) AM_DEVREADWRITE8("uart_1b", ins8250_uart_device, ins8250_r, ins8250_w, 0x000000ff)
- AM_RANGE(0x03012100, 0x0301211f) AM_DEVREADWRITE8("uart_2a", ins8250_uart_device, ins8250_r, ins8250_w, 0x000000ff)
- AM_RANGE(0x03012140, 0x0301215f) AM_DEVREADWRITE8("uart_2b", ins8250_uart_device, ins8250_r, ins8250_w, 0x000000ff)
- AM_RANGE(0x03012300, 0x0301231f) AM_DEVREADWRITE8("uart_3a", ins8250_uart_device, ins8250_r, ins8250_w, 0x000000ff)
- AM_RANGE(0x03012340, 0x0301235f) AM_DEVREADWRITE8("uart_3b", ins8250_uart_device, ins8250_r, ins8250_w, 0x000000ff)
+ AM_RANGE(0x03010700, 0x03010703) AM_READ_PORT("P6")
+ AM_RANGE(0x03010800, 0x03010803) AM_READ8(eeprom_r, 0x000000ff)
AM_RANGE(0x03010810, 0x03010813) AM_DEVREADWRITE("watchdog", watchdog_timer_device, reset32_r, reset32_w) //MK-5 specific, watchdog
AM_RANGE(0x03220000, 0x0323ffff) AM_READWRITE8(sram_r, sram_w, 0x000000ff)
@@ -575,8 +638,7 @@ static ADDRESS_MAP_START( aristmk5_map, AS_PROGRAM, 32, aristmk5_state )
AM_RANGE(0x03250050, 0x03250053) AM_READ(Ns5r50) //IOEB ID register
AM_RANGE(0x03250058, 0x0325005b) AM_READ(Ns5x58) //IOEB interrupt Latch
-
- AM_RANGE(0x03000000, 0x0331ffff) AM_READWRITE(mk5_ioc_r, mk5_ioc_w)
+ AM_RANGE(0x03000000, 0x0331ffff) AM_READWRITE(archimedes_ioc_r, archimedes_ioc_w)
AM_RANGE(0x03320000, 0x0333ffff) AM_READWRITE8(sram_r, sram_w, 0x000000ff)
AM_RANGE(0x03400000, 0x035fffff) AM_WRITE(archimedes_vidc_w)
@@ -589,17 +651,58 @@ ADDRESS_MAP_END
/* U.S games have no dram emulator enabled */
static ADDRESS_MAP_START( aristmk5_usa_map, AS_PROGRAM, 32, aristmk5_state )
AM_RANGE(0x00000000, 0x01ffffff) AM_READWRITE(archimedes_memc_logical_r, archimedes_memc_logical_w)
+
+ AM_RANGE(0x03010440, 0x03010443) AM_WRITE8(rtc_usa_w, 0x000000ff)
+ AM_RANGE(0x03010450, 0x03010453) AM_WRITE8(eeprom_usa_w, 0x000000ff)
+
+ AM_RANGE(0x03012000, 0x03012003) AM_READ_PORT("P1")
+ AM_RANGE(0x03012010, 0x03012013) AM_READ_PORT("P2")
+ AM_RANGE(0x03012200, 0x03012203) AM_READ_PORT("DSW1")
+ AM_RANGE(0x03012210, 0x03012213) AM_READ_PORT("DSW2")
+ AM_RANGE(0x03010584, 0x03010587) AM_READ_PORT("P4")
+
+ AM_RANGE(0x03012020, 0x03012023) AM_READ8(ldor_r, 0x000000ff)
+ AM_RANGE(0x03012070, 0x03012073) AM_WRITE8(ldor_clk_w, 0x000000ff)
+ AM_RANGE(0x03012184, 0x03012187) AM_READ_PORT("P5")
+
+ AM_RANGE(0x03012000, 0x0301201f) AM_WRITE8(buttons_lamps_w, 0x000000ff)
+ AM_RANGE(0x03012030, 0x0301203f) AM_WRITE8(other_lamps_w, 0x000000ff)
+ AM_RANGE(0x03012380, 0x0301238f) AM_WRITE8(bill_acceptor_lamps_w, 0x000000ff)
+
+ AM_RANGE(0x03012100, 0x0301211f) AM_DEVREADWRITE8("uart_2a", ins8250_uart_device, ins8250_r, ins8250_w, 0x000000ff)
+ AM_RANGE(0x03012140, 0x0301215f) AM_DEVREADWRITE8("uart_2b", ins8250_uart_device, ins8250_r, ins8250_w, 0x000000ff)
+ AM_RANGE(0x03012300, 0x0301231f) AM_DEVREADWRITE8("uart_3a", ins8250_uart_device, ins8250_r, ins8250_w, 0x000000ff)
+ AM_RANGE(0x03012340, 0x0301235f) AM_DEVREADWRITE8("uart_3b", ins8250_uart_device, ins8250_r, ins8250_w, 0x000000ff)
+
AM_IMPORT_FROM(aristmk5_map)
ADDRESS_MAP_END
/* with dram emulator enabled */
static ADDRESS_MAP_START( aristmk5_drame_map, AS_PROGRAM, 32, aristmk5_state )
AM_RANGE(0x00000000, 0x01ffffff) AM_READWRITE(aristmk5_drame_memc_logical_r, archimedes_memc_logical_w)
+
+ AM_RANGE(0x03010430, 0x03010433) AM_WRITE8(hopper_w, 0x000000ff)
+ AM_RANGE(0x03010440, 0x03010443) AM_WRITE8(rtc_w, 0x000000ff)
+ AM_RANGE(0x03010450, 0x03010453) AM_WRITE8(eeprom_w, 0x000000ff)
+
+ AM_RANGE(0x03010400, 0x03010403) AM_WRITE8(spi_mux_w, 0x000000ff)
+ AM_RANGE(0x03010470, 0x03010473) AM_WRITE8(spi_data_w, 0x000000ff)
+ AM_RANGE(0x03010850, 0x03010853) AM_READWRITE8(spi_int_ack_r, spi_int_ack_w, 0x000000ff)
+ AM_RANGE(0x03010870, 0x03010873) AM_READ8(spi_data_r, 0x000000ff)
+
+ AM_RANGE(0x03014000, 0x0301401f) AM_DEVREADWRITE8("uart_2a", ins8250_uart_device, ins8250_r, ins8250_w, 0x000000ff)
+ AM_RANGE(0x03014020, 0x0301403f) AM_DEVREADWRITE8("uart_2b", ins8250_uart_device, ins8250_r, ins8250_w, 0x000000ff)
+
AM_IMPORT_FROM(aristmk5_map)
ADDRESS_MAP_END
-CUSTOM_INPUT_MEMBER(aristmk5_state::coin_r)
+CUSTOM_INPUT_MEMBER(aristmk5_state::hopper_r)
+{
+ return (m_hopper_test && m_hopper->line_r()) ? 0 : 1;
+}
+
+CUSTOM_INPUT_MEMBER(aristmk5_state::coin_usa_r)
{
// ---x Coin Acceptor
// --x- Credit Sense
@@ -608,6 +711,9 @@ CUSTOM_INPUT_MEMBER(aristmk5_state::coin_r)
uint8_t data = 0x07;
+ if (!m_coin_div)
+ data |= 0x08;
+
if (m_coin_start_cycles)
{
attotime diff = m_maincpu->cycles_to_attotime(m_maincpu->total_cycles() - m_coin_start_cycles);
@@ -626,13 +732,37 @@ CUSTOM_INPUT_MEMBER(aristmk5_state::coin_r)
return data;
}
+CUSTOM_INPUT_MEMBER(aristmk5_state::coin_r)
+{
+ uint8_t data = 0x01;
+
+ if (m_coin_start_cycles)
+ {
+ attotime diff = m_maincpu->cycles_to_attotime(m_maincpu->total_cycles() - m_coin_start_cycles);
+
+ if (diff > attotime::from_msec(10) && diff < attotime::from_msec(15))
+ data &= ~0x01;
+ if (diff > attotime::from_msec(0) && diff < attotime::from_msec(20))
+ data |= 0x10;
+ if (diff > attotime::from_msec(15) && diff < attotime::from_msec(30))
+ data |= 0x08;
+ if (diff > attotime::from_msec(25) && !m_coin_div)
+ data |= 0x02;
+
+ if (diff > attotime::from_msec(30))
+ m_coin_start_cycles = 0;
+ }
+
+ return data;
+}
+
INPUT_CHANGED_MEMBER(aristmk5_state::coin_start)
{
if (newval && !m_coin_start_cycles)
m_coin_start_cycles = m_maincpu->total_cycles();
}
-static INPUT_PORTS_START( aristmk5 )
+static INPUT_PORTS_START( aristmk5_usa )
/* This simulates the ROM swap */
PORT_START("ROM_LOAD")
PORT_CONFNAME( 0x03, 0x03, "System Mode" )
@@ -684,27 +814,85 @@ static INPUT_PORTS_START( aristmk5 )
PORT_START("P3")
PORT_BIT(0x00000001, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z)
PORT_BIT(0x00000002, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X)
- PORT_BIT(0x00000004, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C)
+ PORT_BIT(0x00000004, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_N)
PORT_BIT(0x00000008, IP_ACTIVE_HIGH, IPT_SERVICE)
- PORT_BIT(0x00000010, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V)
+ PORT_BIT(0x00000010, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("Reset Key")
PORT_BIT(0x00000020, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_TOGGLE PORT_NAME("Bill acceptor door")
PORT_BIT(0x00000040, IP_ACTIVE_LOW , IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_TOGGLE PORT_NAME("Main door")
PORT_BIT(0x00000080, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_TOGGLE PORT_NAME("Cashbox door")
- PORT_START("P6")
- PORT_BIT(0x00000002, IP_ACTIVE_LOW, IPT_KEYPAD) // Battery
-
PORT_START("P4")
- PORT_BIT(0x00000078, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_CUSTOM_MEMBER(DEVICE_SELF, aristmk5_state, coin_r, nullptr)
+ PORT_BIT(0x00000078, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_CUSTOM_MEMBER(DEVICE_SELF, aristmk5_state, coin_usa_r, nullptr)
PORT_START("P5")
- PORT_BIT(0x00000008, IP_ACTIVE_LOW, IPT_KEYPAD) // Meters
+ PORT_BIT(0x00000008, IP_ACTIVE_LOW, IPT_OTHER) // Meters
+
+ PORT_START("P6")
+ PORT_BIT(0x00000002, IP_ACTIVE_LOW, IPT_OTHER) // Battery
PORT_START("EXTRA")
- PORT_BIT(0x00000001, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_CODE(KEYCODE_L) PORT_NAME("Logic door")
+ PORT_BIT(0x00000001, IP_ACTIVE_HIGH, IPT_OTHER) PORT_TOGGLE PORT_CODE(KEYCODE_L) PORT_NAME("Logic door")
PORT_BIT(0x00000002, IP_ACTIVE_HIGH, IPT_COIN1) PORT_CHANGED_MEMBER(DEVICE_SELF, aristmk5_state, coin_start, nullptr)
INPUT_PORTS_END
+static INPUT_PORTS_START( aristmk5 )
+ /* This simulates the ROM swap */
+ PORT_START("ROM_LOAD")
+ PORT_CONFNAME( 0x03, 0x03, "System Mode" )
+ PORT_CONFSETTING( 0x00, "USA Set Chip v4.04.09 Mode" )
+ PORT_CONFSETTING( 0x01, "USA Set Chip v4.04.00 Mode" )
+ PORT_CONFSETTING( 0x02, "USA Set Chip v4.02.04 Mode" )
+ PORT_CONFSETTING( 0x03, "Game Mode" )
+
+ PORT_START("P1")
+ PORT_BIT(0x00000001, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q)
+ PORT_BIT(0x00000002, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W)
+ PORT_BIT(0x00000004, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E)
+ PORT_BIT(0x00000008, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R)
+ PORT_BIT(0x00000010, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T)
+ PORT_BIT(0x00000020, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y)
+ PORT_BIT(0x00000040, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U)
+ PORT_BIT(0x00000080, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I)
+ PORT_BIT(0x00000100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A)
+ PORT_BIT(0x00000200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S)
+ PORT_BIT(0x00000400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D)
+ PORT_BIT(0x00000800, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F)
+ PORT_BIT(0x00001000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G)
+ PORT_BIT(0x00002000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H)
+ PORT_BIT(0x00004000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J)
+ PORT_BIT(0x00008000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K)
+ PORT_BIT(0x00ff0000, IP_ACTIVE_HIGH, IPT_UNUSED)
+
+ PORT_START("P2")
+ PORT_BIT(0x00000001, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_V) PORT_NAME("Reset Key")
+ PORT_BIT(0x00000002, IP_ACTIVE_HIGH, IPT_SERVICE)
+ PORT_BIT(0x00000004, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x00000008, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x00000010, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x00000020, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x00000040, IP_ACTIVE_HIGH, IPT_OTHER) // Hopper full
+ PORT_BIT(0x00000080, IP_ACTIVE_HIGH, IPT_OTHER) // Hopper empty
+ PORT_BIT(0x00000100, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_TOGGLE PORT_NAME("Main door optical sensor")
+ PORT_BIT(0x0000fe00, IP_ACTIVE_HIGH, IPT_UNUSED) // Unused optical security sensors
+ PORT_BIT(0x00010000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_L) PORT_TOGGLE PORT_NAME("Logic door")
+ PORT_BIT(0x00020000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Z) PORT_TOGGLE PORT_NAME("Topbox door")
+ PORT_BIT(0x00040000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_X) PORT_TOGGLE PORT_NAME("Meter cage")
+ PORT_BIT(0x00080000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_C) PORT_TOGGLE PORT_NAME("Cashbox door")
+ PORT_BIT(0x00100000, IP_ACTIVE_LOW, IPT_KEYPAD) PORT_CODE(KEYCODE_M) PORT_TOGGLE PORT_NAME("Main door")
+ PORT_BIT(0x00200000, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_B) PORT_TOGGLE PORT_NAME("Bill acceptor door")
+ PORT_BIT(0x00c00000, IP_ACTIVE_HIGH, IPT_UNUSED) // Unused mechanical security switch
+
+ PORT_START("P3")
+ PORT_BIT(0x00000002, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CUSTOM_MEMBER(DEVICE_SELF, aristmk5_state, hopper_r, nullptr)
+ PORT_BIT(0x000000f8, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_CUSTOM_MEMBER(DEVICE_SELF, aristmk5_state, coin_r, nullptr)
+
+ PORT_START("P6")
+ PORT_BIT(0x00000002, IP_ACTIVE_LOW, IPT_OTHER) // Battery
+
+ PORT_START("EXTRA")
+ PORT_BIT(0x00000001, IP_ACTIVE_HIGH, IPT_COIN1) PORT_CHANGED_MEMBER(DEVICE_SELF, aristmk5_state, coin_start, nullptr)
+INPUT_PORTS_END
+
DRIVER_INIT_MEMBER(aristmk5_state,aristmk5)
{
archimedes_driver_init();
@@ -845,12 +1033,13 @@ void aristmk5_state::machine_start()
m_mk5_2KHz_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(aristmk5_state::mk5_2KHz_callback),this));
m_mk5_VSYNC_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(aristmk5_state::mk5_VSYNC_callback),this));
+ m_spi_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(aristmk5_state::spi_timer), this));
}
void aristmk5_state::machine_reset()
{
archimedes_reset();
- m_mk5_2KHz_timer->adjust(attotime::from_hz(1953.125)); // 8MHz / 4096
+ m_mk5_2KHz_timer->adjust(attotime::from_hz((double)MASTER_CLOCK / 9 / 4096)); // 8MHz / 4096
m_mk5_VSYNC_timer->adjust(attotime::from_hz(50000)); // default bit 1 & bit 2 == 0
m_ioc_regs[IRQ_STATUS_B] |= 0x40; //hack, set keyboard irq empty to be ON
@@ -876,15 +1065,15 @@ void aristmk5_state::machine_reset()
m_ldor_shift_reg = 0x55;
m_coin_start_cycles = 0;
m_sram_bank = 0;
+ m_hopper_test = 1;
+ m_coin_div = 0;
+ m_spi_mux = 0;
+ m_spi_latch = 0;
+ m_spi_bits = 0;
+ memset(m_spi_data, 0, sizeof(m_spi_data));
}
-#if 0
-#define NVRAM_SIZE 256
-#define NVRAM_PAGE_SIZE 0 /* max size of one write request */
-#endif
-
-
static MACHINE_CONFIG_START( aristmk5, aristmk5_state )
MCFG_CPU_ADD("maincpu", ARM, MASTER_CLOCK/6) // 12000000
MCFG_CPU_PROGRAM_MAP(aristmk5_drame_map)
@@ -892,9 +1081,6 @@ static MACHINE_CONFIG_START( aristmk5, aristmk5_state )
MCFG_WATCHDOG_ADD("watchdog")
MCFG_WATCHDOG_TIME_INIT(attotime::from_seconds(2)) /* 1.6 - 2 seconds */
-// MCFG_I2CMEM_ADD("i2cmem")
-// MCFG_I2CMEM_PAGE_SIZE(NVRAM_PAGE_SIZE)
-// MCFG_I2CMEM_DATA_SIZE(NVRAM_SIZE)
/* TODO: this isn't supposed to access a keyboard ... */
MCFG_DEVICE_ADD("kart", AAKART, 12000000/128) // TODO: frequency
@@ -941,6 +1127,8 @@ static MACHINE_CONFIG_START( aristmk5, aristmk5_state )
MCFG_DS1302_ADD("rtc", XTAL_32_768kHz)
+ MCFG_TICKET_DISPENSER_ADD("hopper", attotime::from_msec(100), TICKET_MOTOR_ACTIVE_HIGH, TICKET_STATUS_ACTIVE_LOW)
+
MCFG_SPEAKER_STANDARD_MONO("speaker")
MCFG_SOUND_ADD("dac0", DAC_16BIT_R2R_TWOS_COMPLEMENT, 0) MCFG_SOUND_ROUTE(0, "speaker", 0.1) // unknown DAC
MCFG_SOUND_ADD("dac1", DAC_16BIT_R2R_TWOS_COMPLEMENT, 0) MCFG_SOUND_ROUTE(0, "speaker", 0.1) // unknown DAC
@@ -961,6 +1149,14 @@ static MACHINE_CONFIG_START( aristmk5, aristmk5_state )
MCFG_SOUND_ROUTE_EX(0, "dac7", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE_EX(0, "dac7", -1.0, DAC_VREF_NEG_INPUT)
MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_DERIVED( aristmk5_touch, aristmk5 )
+ MCFG_DEVICE_MODIFY("uart_0a")
+ MCFG_INS8250_OUT_TX_CB(DEVWRITELINE("microtouch", microtouch_device, rx))
+
+ MCFG_MICROTOUCH_ADD("microtouch", 2400, DEVWRITELINE("uart_0a", ins8250_uart_device, rx_w))
+MACHINE_CONFIG_END
+
static MACHINE_CONFIG_DERIVED( aristmk5_usa, aristmk5 )
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_PROGRAM_MAP(aristmk5_usa_map)
@@ -1462,7 +1658,7 @@ ROM_END
// 630 - 10 Credit Multiplier / 9 Line Multiline.
-// The Chariot Challenge - NSW/ACT - A - 10/08/98.
+// The Chariot Challenge - Venezuela - A - 10/08/98.
// 04J00714
ROM_START( chariotc )
ARISTOCRAT_MK5_BIOS
@@ -1825,6 +2021,24 @@ ROM_START( dolphntrb )
ROM_REGION( 0x20000*4, "sram", ROMREGION_ERASE00 )
ROM_END
+ROM_START( dolphntrce )
+ ARISTOCRAT_MK5_BIOS
+
+ ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
+ ROM_LOAD32_WORD("ahg1606.u7", 0x0000000, 0x0080000, CRC(d468edf7) SHA1(100672d09184e06130ce253749bd9e20ee0a06d4) )
+ ROM_LOAD32_WORD("ahg1606.u11", 0x0000002, 0x0080000, CRC(0fe64635) SHA1(b504216e59984951b46701019f87cad759ab60f2) )
+ ROM_LOAD32_WORD("ahg1606.u8", 0x0100000, 0x0080000, CRC(a53a2de4) SHA1(1741af795f88e867021f3c08d8990611d893a8e8) )
+ ROM_LOAD32_WORD("ahg1606.u12", 0x0100002, 0x0080000, CRC(c2e268a2) SHA1(6aeb27ae844dbf495c64be210bcac97f4c7a6969) )
+ ROM_LOAD32_WORD("ahg1606.u9", 0x0200000, 0x0080000, CRC(fe9146f7) SHA1(95bef8910d213d588d45ec2639828a31aab6603c) )
+ ROM_LOAD32_WORD("ahg1606.u13", 0x0200002, 0x0080000, CRC(d6aa89fe) SHA1(eccb49d49f533aeed9fefb14018bcc06d3fdaf23) )
+ ROM_LOAD32_WORD("ahg1606.u10", 0x0300000, 0x0080000, CRC(0be76189) SHA1(a458f620f48b9f4a73f59d31ba98864c5a64e1d7) )
+ ROM_LOAD32_WORD("ahg1606.u14", 0x0300002, 0x0080000, CRC(c6c59ed6) SHA1(0ce8e5824c5937ffe2eeb34320db9dc568bca7cb) )
+
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) /* ARM Code */
+ ROM_REGION( 0x200000, "vram", ROMREGION_ERASE00 )
+ ROM_REGION( 0x20000*4, "sram", ROMREGION_ERASE00 )
+ROM_END
+
// 602/1 - 10 Credit Multiplier / 9 Line Multiline.
// Dolphin Treasure - Export B - 06/12/96.
@@ -1862,6 +2076,17 @@ ROM_START( dolphntru )
ROM_LOAD( "rtc", 0x000000, 0x00001f, CRC(6909acb0) SHA1(6a4589599cd1c477e916474e7b029e9a4e92019b) )
ROM_END
+ROM_START( drgneye )
+ ARISTOCRAT_MK5_BIOS
+
+ ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
+ ROM_LOAD32_WORD("0100521v.u7", 0x0000000, 0x0080000, CRC(db9c952d) SHA1(4cbe3ffe6cf0bb112cb9a2d7a4ff0b28154d32c1) )
+ ROM_LOAD32_WORD("0100521v.u11", 0x0000002, 0x0080000, CRC(2bb47749) SHA1(796f610e5202b5eb26a6e901d43ee5d9e3f95332) )
+
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) /* ARM Code */
+ ROM_REGION( 0x200000, "vram", ROMREGION_ERASE00 )
+ ROM_REGION( 0x20000*4, "sram", ROMREGION_ERASE00 )
+ROM_END
ROM_START( dynajack )
ARISTOCRAT_MK5_BIOS
@@ -2113,6 +2338,24 @@ ROM_START( goldpyra )
ROM_REGION( 0x20000*4, "sram", ROMREGION_ERASE00 )
ROM_END
+ROM_START( goldpyrb )
+ ARISTOCRAT_MK5_BIOS
+
+ ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
+ // these are the 'bios' for Casino games (could be moved to a different base set)
+ ROM_LOAD32_WORD( "0700474v.u7", 0x000000, 0x80000, CRC(04b7dcbf) SHA1(eded1223336181bb08f9593247f1f79d96278b75) )
+ ROM_LOAD32_WORD( "0700474v.u11", 0x000002, 0x80000, CRC(a89ce1b5) SHA1(411b474a111f23ebd834bea5af0bf0cf3926d590) )
+
+ ROM_LOAD32_WORD( "0100878v.u8", 0x100000, 0x80000, CRC(c3184f1c) SHA1(3f808b465175108d48ca5b2560e4546b30a7fd72) )
+ ROM_LOAD32_WORD( "0100878v.u12", 0x100002, 0x80000, CRC(acb3de77) SHA1(e0e337d6efbd6ee8e0c0ec2653c3dc0bd5741ff4) )
+ ROM_LOAD32_WORD( "0100878v.u9", 0x200000, 0x80000, CRC(0a2f6903) SHA1(11fd913f8c3a677ae07c7ec50548a82c1eaf63ee) )
+ ROM_LOAD32_WORD( "0100878v.u13", 0x200002, 0x80000, CRC(0df660be) SHA1(73d370d90655dada34f2b5b2209652632c34a22e) )
+
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) /* ARM Code */
+ ROM_REGION( 0x200000, "vram", ROMREGION_ERASE00 )
+ ROM_REGION( 0x20000*4, "sram", ROMREGION_ERASE00 )
+ROM_END
+
ROM_START( goldenra )
ARISTOCRAT_MK5_BIOS
@@ -2549,6 +2792,25 @@ ROM_START( marmagic )
ROM_REGION( 0x20000*4, "sram", ROMREGION_ERASE00 )
ROM_END
+ROM_START( marmagicua )
+ ARISTOCRAT_MK5_BIOS
+
+ ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
+ ROM_LOAD32_WORD( "ehg1558.u7", 0x000000, 0x80000, CRC(7c2602ae) SHA1(f5a13154448041575e4bea1399ed0a5a0888d493) )
+ ROM_LOAD32_WORD( "ehg1558.u11", 0x000002, 0x80000, CRC(4fe3b18a) SHA1(cc36eddd264de1a088c16e1b741168130d895bd7) )
+ ROM_LOAD32_WORD( "ehg1558.u8", 0x100000, 0x80000, CRC(c9ff4bd8) SHA1(5766d7c39e753fb2a2412a41338dcfd4e31b642b) )
+ ROM_LOAD32_WORD( "ehg1558.u12", 0x100002, 0x80000, CRC(d00cd217) SHA1(2be7c1ef6c0a39d1c7ed391feeaf0f42a6471bae) )
+ ROM_LOAD32_WORD( "ehg1558.u9", 0x200000, 0x80000, CRC(879e4b14) SHA1(52d9540dd3ed51d42a31d1a7effe75e995e95330) )
+ ROM_LOAD32_WORD( "ehg1558.u13", 0x200002, 0x80000, CRC(770872a1) SHA1(cd430385a3dfc080decfa2402d7dbad0db912e15) )
+ ROM_LOAD32_WORD( "ehg1558.u10", 0x300000, 0x80000, CRC(4301eb40) SHA1(1a32c61df2ab04c365135378d97d18bbb0b50179) )
+ ROM_LOAD32_WORD( "ehg1558.u14", 0x300002, 0x80000, CRC(a2096cb3) SHA1(c2bba35396f9c83b17d692a384b6406f3441c8f5) )
+
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) /* ARM Code */
+ ROM_REGION( 0x200000, "vram", ROMREGION_ERASE00 )
+ ROM_REGION( 0x20000*4, "sram", ROMREGION_ERASE00 )
+ROM_END
+
+
// US003 - Multi credit / Multi line.
// Margarita Magic [Reel Game] - NSW/ACT - A - 07/07/2000.
@@ -2781,6 +3043,21 @@ ROM_START( pantmag )
ROM_REGION( 0x20000*4, "sram", ROMREGION_ERASE00 )
ROM_END
+ROM_START( pantmaga )
+ ARISTOCRAT_MK5_BIOS
+
+ ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
+ ROM_LOAD32_WORD("0100716v.u7", 0x0000000, 0x0080000, CRC(8646a4a6) SHA1(1449ba497e4ccebf5de9630bfaf31ad3c583fc44) )
+ ROM_LOAD32_WORD("0100716v.u11", 0x0000002, 0x0080000, CRC(61ae2a5a) SHA1(3b11c0f1c6e1464211e6dea958f08d7212ee5756) )
+ ROM_LOAD32_WORD("0100716v.u8", 0x0100000, 0x0080000, CRC(91997f98) SHA1(2353abdc0b160cf087230f0c290f37f045a4d07b) )
+ ROM_LOAD32_WORD("0100716v.u12", 0x0100002, 0x0080000, CRC(6adfd0ab) SHA1(3b6479bcd95812f5678a27adc7decbc881cd6caa) )
+
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) /* ARM Code */
+ ROM_REGION( 0x200000, "vram", ROMREGION_ERASE00 )
+ ROM_REGION( 0x20000*4, "sram", ROMREGION_ERASE00 )
+ROM_END
+
+
// MV4115/6 - 9/20 Line Multiline Multiplier.
// Party Gras [Reel Game] - Export A - 10/11/2001.
@@ -2970,7 +3247,7 @@ ROM_START( pengpayu )
ROM_END
-ROM_START( petshop )
+ROM_START( petshopa )
ARISTOCRAT_MK5_BIOS
// checksum code not found (due to bad rom)
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
@@ -2984,6 +3261,51 @@ ROM_START( petshop )
ROM_REGION( 0x20000*4, "sram", ROMREGION_ERASE00 )
ROM_END
+ROM_START( petshop )
+ ARISTOCRAT_MK5_BIOS
+
+ ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
+ ROM_LOAD32_WORD("0100731v.u7", 0x0000000, 0x0080000, CRC(01cffccc) SHA1(a39d943e700fff34d82bcff8c61f2586ee65e673) )
+ ROM_LOAD32_WORD("0100731v.u11", 0x0000002, 0x0080000, CRC(a8e906c5) SHA1(f6dd7bcf5fa90933c9741699f0c1e07b685ccb40) )
+ ROM_LOAD32_WORD("0100731v.u8", 0x0100000, 0x0080000, CRC(757e1296) SHA1(e14508bbaa3439a93c8b716267a2198ed3c54728) )
+ ROM_LOAD32_WORD("0100731v.u12", 0x0100002, 0x0080000, CRC(6e74cd57) SHA1(9092e656cbd8627b208b81ca0d737483a779bce1) )
+
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) /* ARM Code */
+ ROM_REGION( 0x200000, "vram", ROMREGION_ERASE00 )
+ ROM_REGION( 0x20000*4, "sram", ROMREGION_ERASE00 )
+ROM_END
+
+ROM_START( phantpay )
+ ARISTOCRAT_MK5_BIOS
+
+ ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
+ ROM_LOAD32_WORD("0500005v.u7", 0x0000000, 0x0080000, CRC(2cfc44a7) SHA1(a2a93047311d7a1f45e2915478ba2a11d5179194) )
+ ROM_LOAD32_WORD("0500005v.u11", 0x0000002, 0x0080000, CRC(3e91ed2a) SHA1(92d49bd78d329ad53cb2063af2d324eada3f53d1) )
+ ROM_LOAD32_WORD("0500005v.u8", 0x0100000, 0x0080000, CRC(ab1e77e9) SHA1(5a8da1210214ccc89dfde2e28f5142036a743172) )
+ ROM_LOAD32_WORD("0500005v.u12", 0x0100002, 0x0080000, CRC(d43a092a) SHA1(5f851bd179b14ef3983b460ed932810f3713d3e5) )
+
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) /* ARM Code */
+ ROM_REGION( 0x200000, "vram", ROMREGION_ERASE00 )
+ ROM_REGION( 0x20000*4, "sram", ROMREGION_ERASE00 )
+ROM_END
+
+ROM_START( penpir2 )
+ ARISTOCRAT_MK5_BIOS
+
+ ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
+ // these are the 'bios' for Casino games (could be moved to a different base set)
+ ROM_LOAD32_WORD( "0700474v.u7", 0x000000, 0x80000, CRC(04b7dcbf) SHA1(eded1223336181bb08f9593247f1f79d96278b75) )
+ ROM_LOAD32_WORD( "0700474v.u11", 0x000002, 0x80000, CRC(a89ce1b5) SHA1(411b474a111f23ebd834bea5af0bf0cf3926d590) )
+
+ ROM_LOAD32_WORD( "0100869v.u8", 0x100000, 0x80000, CRC(5a87f637) SHA1(0fee8140637e9f923727e8c358c9f59b8319855d) )
+ ROM_LOAD32_WORD( "0100869v.u12", 0x100002, 0x80000, CRC(2aef04c1) SHA1(7415f436960c7b4a43634161ca317b2ae34ee745) )
+ ROM_LOAD32_WORD( "0100869v.u9", 0x200000, 0x80000, CRC(05de2653) SHA1(7d3f9d50013d8137cef285940b04209cfdae4a1d) )
+ ROM_LOAD32_WORD( "0100869v.u13", 0x200002, 0x80000, CRC(e1dbfd58) SHA1(687b7254279734e1835e1713d032b5aa2cf70812) )
+
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) /* ARM Code */
+ ROM_REGION( 0x200000, "vram", ROMREGION_ERASE00 )
+ ROM_REGION( 0x20000*4, "sram", ROMREGION_ERASE00 )
+ROM_END
ROM_START( przfight )
ARISTOCRAT_MK5_BIOS
@@ -3183,6 +3505,20 @@ ROM_START( qnilemax )
ROM_REGION( 0x20000*4, "sram", ROMREGION_ERASE00 )
ROM_END
+ROM_START( qtbird )
+ ARISTOCRAT_MK5_BIOS
+
+ ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
+ ROM_LOAD32_WORD("0500009v.u7", 0x0000000, 0x0080000, CRC(f294fc0a) SHA1(f3d60ca6008445f535fce027f5ec3fe82ae552c3) )
+ ROM_LOAD32_WORD("0500009v.u11", 0x0000002, 0x0080000, CRC(328b7e04) SHA1(5c49f60b7c88d6e94e7ab464fad4eee6806f327a) )
+ ROM_LOAD32_WORD("0500009v.u8", 0x0100000, 0x0080000, CRC(764b5568) SHA1(a097992499044b7ca017a8c85387dc1ea94ff27a) )
+ ROM_LOAD32_WORD("0500009v.u12", 0x0100002, 0x0080000, CRC(bb8344a9) SHA1(8b0e904b937c7f34470ad946076240b0c54bf434) )
+
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) /* ARM Code */
+ ROM_REGION( 0x200000, "vram", ROMREGION_ERASE00 )
+ ROM_REGION( 0x20000*4, "sram", ROMREGION_ERASE00 )
+ROM_END
+
ROM_START( rainwrce )
ARISTOCRAT_MK5_BIOS
@@ -3329,7 +3665,7 @@ ROM_START( sbuk2 )
ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
ROM_LOAD32_WORD("0400501v.u7", 0x0000000, 0x0080000, CRC(f025775d) SHA1(71a94f6f17fa7cdcd997b0117b8f4afe21606a69) )
ROM_LOAD32_WORD("0400501v.u11", 0x0000002, 0x0080000, CRC(f1b51a61) SHA1(8e9fcb071f704122e13333094828a41974646792) )
- ROM_LOAD32_WORD("0400501v.u8", 0x0100000, 0x0080000, CRC(03912f4e) SHA1(48bdcd2160e05261b7d834c53e1d483acaad098f) )
+ ROM_LOAD32_WORD("0400501v.u8", 0x0100000, 0x0080000, BAD_DUMP CRC(03912f4e) SHA1(48bdcd2160e05261b7d834c53e1d483acaad098f) ) // bit 0x20 is stuck on for most of the ROM
ROM_LOAD32_WORD("0400501v.u12", 0x0100002, 0x0080000, CRC(f9b65d2b) SHA1(f519fc284aaa08d3619e4d88e92e690320cf5432) )
ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) /* ARM Code */
@@ -3570,7 +3906,7 @@ ROM_START( unicorndnz )
ROM_REGION( 0x20000*4, "sram", ROMREGION_ERASE00 )
ROM_END
-ROM_START( wamazon )
+ROM_START( wamazona )
ARISTOCRAT_MK5_BIOS
/*
Checksum code found at 0x000b68
@@ -3584,7 +3920,7 @@ ROM_START( wamazon )
ROM_LOAD32_WORD("0200285v.u7", 0x0000000, 0x0080000, CRC(bfa21358) SHA1(6b76656401b3dbbace8d4335951468b9885fc7f0) )
ROM_LOAD32_WORD("0200285v.u11", 0x0000002, 0x0080000, CRC(54b2a375) SHA1(635fde5c678b908fa58c0e04ba9b7a84fac1f7fe) )
ROM_LOAD32_WORD("0200285v.u8", 0x0100000, 0x0080000, CRC(4e39f128) SHA1(91d3c6a9e5c30275c3f8967dde55214df097f2ba) )
- ROM_LOAD32_WORD("0200285v.u12", 0x0100002, 0x0080000, CRC(2cd12986) SHA1(b6b0bd6dd8c964498edc3763cb5c450795042a8d) )
+ ROM_LOAD32_WORD("0200285v.u12", 0x0100002, 0x0080000, BAD_DUMP CRC(2cd12986) SHA1(b6b0bd6dd8c964498edc3763cb5c450795042a8d) ) // actually a bad dump of u7 from oscara5!
ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) /* ARM Code */
ROM_REGION( 0x200000, "vram", ROMREGION_ERASE00 )
@@ -3592,7 +3928,7 @@ ROM_START( wamazon )
ROM_END
-ROM_START( wamazona )
+ROM_START( wamazon )
ARISTOCRAT_MK5_BIOS
/*
Checksum code found at 0x000b68
@@ -3710,6 +4046,33 @@ ROM_START( wcougaru )
ROM_LOAD( "rtc", 0x000000, 0x00001f, CRC(6909acb0) SHA1(6a4589599cd1c477e916474e7b029e9a4e92019b) )
ROM_END
+ROM_START( wizways )
+ ARISTOCRAT_MK5_BIOS
+
+ ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
+ ROM_LOAD32_WORD("0200396v.u7", 0x0000000, 0x0080000, CRC(85fca945) SHA1(ca48a907b4f6c1b665ae053e2992681f02166cb1) )
+ ROM_LOAD32_WORD("0200396v.u11", 0x0000002, 0x0080000, CRC(677c855f) SHA1(a4ec8e6151271af292379ead28214ef9163bfdc3) )
+ ROM_LOAD32_WORD("0200396v.u8", 0x0100000, 0x0080000, CRC(4b1192ae) SHA1(2537249ccfc8c507762ac2c46d05ef13fa3d0bf9) )
+ ROM_LOAD32_WORD("0200396v.u12", 0x0100002, 0x0080000, CRC(934d7286) SHA1(205f72b62d83667e9068141346bda3bcb9742a83) )
+
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) /* ARM Code */
+ ROM_REGION( 0x200000, "vram", ROMREGION_ERASE00 )
+ ROM_REGION( 0x20000*4, "sram", ROMREGION_ERASE00 )
+ROM_END
+
+ROM_START( wnpost )
+ ARISTOCRAT_MK5_BIOS
+
+ ROM_REGION( 0x400000, "game_prg", ROMREGION_ERASEFF )
+ ROM_LOAD32_WORD("rhg041804.u7", 0x0000000, 0x0080000, CRC(73274802) SHA1(9838a63d5f4e1bf31675ac15c34a17e709f2f647) )
+ ROM_LOAD32_WORD("rhg041804.u11", 0x0000002, 0x0080000, CRC(4f076a94) SHA1(2962429c930ffc17e2f37a006215ee6f1c649953) )
+ ROM_LOAD32_WORD("rhg041804.u8", 0x0100000, 0x0080000, CRC(b1830ffa) SHA1(c23a97bfdfe9e408f0ec8053646d6c8c8e06a263) )
+ ROM_LOAD32_WORD("rhg041804.u12", 0x0100002, 0x0080000, CRC(ff70b305) SHA1(3c832ed20b1d00318fd3d2428bb469735f68965b) )
+
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 ) /* ARM Code */
+ ROM_REGION( 0x200000, "vram", ROMREGION_ERASE00 )
+ ROM_REGION( 0x20000*4, "sram", ROMREGION_ERASE00 )
+ROM_END
ROM_START( wthing )
ARISTOCRAT_MK5_BIOS
@@ -3766,118 +4129,133 @@ GAME( 1995, aristmk5, 0, aristmk5, aristmk5, aristmk5_state, aristmk
// Dates listed below are for the combination (reel layout), not release dates
GAMEL( 1998, adonis, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Adonis (0200751V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 602/9, A - 25/05/98, Rev 10
GAMEL( 1998, adonisa, adonis, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Adonis (0100751V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 602/9, A - 25/05/98, Rev 9
-GAMEL( 2001, adonisu, adonis, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Adonis (BHG1508, US)", MACHINE_FLAGS, layout_aristmk5 ) // MV4124/1, B - 31/07/01 - BAD DUMP
GAMEL( 1999, adonisce, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Adonis - Cash Express (0201005V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 602/9, C - 06/07/99
GAMEL( 1996, baddog, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Bad Dog Poker (0200428V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 386/56, A - 17/12/96
-GAMEL( 1996, blackpnt, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Black Panther (0200818V, Victoria)", MACHINE_FLAGS, layout_aristmk5 ) // 594/1, A - 30/07/96
GAMEL( 1998, bootsctn, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Boot Scootin' (0100812V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 616/1, B - 11/12/98
-GAMEL( 1999, bootsctnu, bootsctn, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Boot Scootin' (GHG1012-02, US)", MACHINE_FLAGS, layout_aristmk5 ) // MV4098, A - 25/08/99 - BAD DUMP
GAMEL( 1996, bumblbug, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Bumble Bugs (0200510V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 593, D - 5/07/96
GAMEL( 1996, bumblbugql,bumblbug, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Bumble Bugs (0200456V, Queensland)", MACHINE_FLAGS, layout_aristmk5 ) // 593, D - 5/07/96
-GAMEL( 1997, bumblbugu, bumblbug, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Bumble Bugs (CHG0479-03, US)", MACHINE_FLAGS, layout_aristmk5 ) // 593, D - 05/07/97 - BAD DUMP
GAMEL( 1995, buttdeli, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Butterfly Delight (0200143V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 571/4, A - 19/12/95
GAMEL( 1999, cashcat, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Cash Cat (0300863V, New Zealand)", MACHINE_FLAGS, layout_aristmk5 ) // MV4089, A - 4/1/99
GAMEL( 1997, cashcham, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Cash Chameleon (0100438V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 603/1, C - 15/4/97
-GAMEL( 1996, cashchamu, cashcham, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Cash Chameleon (DHG4078-99, US)", MACHINE_FLAGS, layout_aristmk5 ) // 603(a), B - 06/12/96 - BAD DUMP
GAMEL( 1998, cashchama, cashcham, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Cash Chameleon (0200437V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 603(a), D - 18/02/98
GAMEL( 1998, cashchamnz,cashcham, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Cash Chameleon (0300781V, New Zealand)", MACHINE_FLAGS, layout_aristmk5 ) // MV4067, A - 31/08/98
GAMEL( 1997, cashcra5, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Cash Crop (0300467V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 607, C - 14/07/97
-GAMEL( 1998, chariotc, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "The Chariot Challenge (04J00714, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 630, A - 10/08/98, Rev 12
+GAMEL( 1998, chariotc, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "The Chariot Challenge (04J00714, Venezuela)", MACHINE_FLAGS, layout_aristmk5 ) // 630, A - 10/08/98, Rev 12
GAMEL( 1998, chariotca, chariotc, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "The Chariot Challenge (0100787V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 630/1, A - 10/08/98
GAMEL( 2001, checkma5, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Checkmate (01J00681, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // JB011, B - 06/07/01
GAMEL( 1996, chickna5, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Chicken (0100351V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 596, A - 27/08/96
-GAMEL( 1998, chickna5u, chickna5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Chicken (RHG0730-03, US)", MACHINE_FLAGS, layout_aristmk5 ) // 596, C - 23/02/98 - BAD DUMP
+GAMEL( 1998, chickna5u, chickna5, aristmk5_usa, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Chicken (RHG0730-03, US)", MACHINE_FLAGS, layout_aristmk5_us ) // 596, C - 23/02/98
GAMEL( 1998, chickna5qld,chickna5,aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Chicken (0200530V, Queensland)", MACHINE_FLAGS, layout_aristmk5 ) // 596, C - 23/02/98
GAMEL( 1998, coralrc2, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Coral Riches II (0100919V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 577/7, A - 29/12/98
GAMEL( 1998, cuckoo, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Cuckoo (0200753V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 615/1, D - 03/07/98
-GAMEL( 2000, cuckoou, cuckoo, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Cuckoo (CHG1195, US)", MACHINE_FLAGS, layout_aristmk5 ) // MV4104, C - 02/02/00
+GAMEL( 2000, cuckoou, cuckoo, aristmk5_usa, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Cuckoo (CHG1195, US)", MACHINE_FLAGS, layout_aristmk5_us ) // MV4104, C - 02/02/00
GAMEL( 1995, dstbloom, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Desert Bloom (0200111V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 577/2, A - 12/10/95
GAMEL( 1999, diamdove, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Diamond Dove (0101018V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 640, B - 19/05/99
-GAMEL( 1996, dmdfever, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Diamond Fever (0200302V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 483/7, E - 05/09/96
-GAMEL( 1997, dimtouch, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Diamond Touch (0400433V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 604, E - 30/06/97
+GAMEL( 1996, dmdfever, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Diamond Fever (0200302V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 483/7, E - 05/09/96 - jumps to service mode
+GAMEL( 1997, dimtouch, aristmk5, aristmk5_touch, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Diamond Touch (0400433V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 604, E - 30/06/97
GAMEL( 1996, dolphntr, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Dolphin Treasure (0200424V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 602/1, B - 06/12/96, Rev 3
GAMEL( 1996, dolphntra, dolphntr, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Dolphin Treasure (0100424V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 602/1, B - 06/12/96, Rev 1.24.4.0
GAMEL( 1996, dolphntrb, dolphntr, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Dolphin Treasure (0100388V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 602, B - 10/12/96
-GAMEL( 1996, dolphntru, dolphntr, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Dolphin Treasure (FHG4077-02, US)", MACHINE_FLAGS, layout_aristmk5 ) // 602/1, B - 06/12/96
+GAMEL( 1996, dolphntru, dolphntr, aristmk5_usa, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Dolphin Treasure (FHG4077-02, US)", MACHINE_FLAGS, layout_aristmk5_us ) // 602/1, B - 06/12/96
+GAMEL( 1999, dolphntrce,dolphntr, aristmk5_usa, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Dolphin Treasure - Cash Express (AHG1606, US)",MACHINE_FLAGS, layout_aristmk5_us ) // MV4090, D - 22/12/99
+GAMEL( 1997, drgneye, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Dragon's Eye (0100521V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 610, A - 09/05/97
GAMEL( 2000, dynajack, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Dynamite Jack (01J00081, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // JB004, A - 12/07/2000
GAMEL( 1998, eldorda5, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "El Dorado (0100652V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 623, B - 24/03/98
GAMEL( 1995, eforsta5, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Enchanted Forest (0400122V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 570/3, E - 23/06/95
-GAMEL( 1997, eforsta5u, eforsta5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Enchanted Forest (JHG0415-03, US)", MACHINE_FLAGS, layout_aristmk5 ) // MV4033, B - 10/02/97
GAMEL( 2000, fortellr, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Fortune Teller (01J00131, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // JB006, D - 24/11/2000
-GAMEL( 1998, gambler, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "The Gambler (EHG0916-02, US)", MACHINE_FLAGS, layout_aristmk5 ) // MV4084/1, A - 30/10/98 - POSSIBLE BAD DUMP
GAMEL( 2001, geisha, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Geisha (0101408V, New Zealand)", MACHINE_FLAGS, layout_aristmk5 ) // MV4127, A - 05/03/01
-GAMEL( 1999, genmagi, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Genie Magic (0200894V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // ???, C - 15/02/99
+GAMEL( 1999, genmagi, aristmk5, aristmk5_touch, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Genie Magic (0200894V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // ???, C - 15/02/99
GAMEL( 1998, gnomeatw, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Gnome Around The World (0100767V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 625, C - 18/12/98
-GAMEL( 1997, goldpyr, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Golden Pyramids (AHG1205-03, US)", MACHINE_FLAGS, layout_aristmk5 ) // MV4091, B - 13/05/97
-GAMEL( 1997, goldpyra, goldpyr, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Golden Pyramids (AHG1206-99, US)", MACHINE_FLAGS, layout_aristmk5 ) // 602/2, B - 13/05/97 - BAD DUMP
+GAMEL( 1997, goldpyr, aristmk5, aristmk5_usa, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Golden Pyramids (AHG1205-03, US)", MACHINE_FLAGS, layout_aristmk5_us ) // MV4091, B - 13/05/97
+GAMEL( 1998, goldpyrb, goldpyr, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Golden Pyramids (0100878V, Victoria)", MACHINE_FLAGS, layout_aristmk5 ) // 602/5, C - 19/06/98
GAMEL( 2000, goldenra, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Golden Ra (0101164V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 661, A - 10/04/00
GAMEL( 1999, incasun, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Inca Sun (0100872V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 631/3 B, B - 03/05/99
GAMEL( 1999, incasunsp, incasun, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Inca Sun (0100872V, NSW/ACT, Show Program)", MACHINE_FLAGS, layout_aristmk5 ) // 631/3 B, B - 03/05/99
GAMEL( 2000, incasunnz, incasun, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Inca Sun (0101108V, New Zealand)", MACHINE_FLAGS, layout_aristmk5 ) // MV4113, A - 6/3/00
-GAMEL( 2000, incasunu, incasun, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Inca Sun (CHG1458, US)", MACHINE_FLAGS, layout_aristmk5 ) // MV4130/3, A - 05/09/00
+GAMEL( 2000, incasunu, incasun, aristmk5_usa, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Inca Sun (CHG1458, US)", MACHINE_FLAGS, layout_aristmk5_us ) // MV4130/3, A - 05/09/00
GAMEL( 1998, indrema5, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Indian Dreaming (0100845V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 628/1, B - 15/12/98
GAMEL( 1996, jungjuic, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Jungle Juice (0200240V, New Zealand)", MACHINE_FLAGS, layout_aristmk5 ) // 566/3, F - 06/03/96
GAMEL( 1995, kgalah, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "King Galah (0200536V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 613/6, A - 21/07/95
-GAMEL( 2001, koalamnt, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Koala Mint (CHG1573, US)", MACHINE_FLAGS, layout_aristmk5 ) // MV4137, A - 12/09/01 - BAD DUMP
GAMEL( 1998, kookabuk, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Kooka Bucks (0100677V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 661, A - 03/04/98
GAMEL( 1997, locoloot, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Loco Loot (0100472V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 599/2, C - 17/06/97
GAMEL( 1998, locolootnz,locoloot, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Loco Loot (0600725V, New Zealand)", MACHINE_FLAGS, layout_aristmk5 ) // MV4064, A - 8/7/98
GAMEL( 1997, lonewolf, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Lone Wolf (0100587V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 621, A - 29/10/97
-GAMEL( 1997, mgarden, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Magic Garden (AHG1211-99, US)", MACHINE_FLAGS, layout_aristmk5 ) // MV4033, B - 10/02/97 - BAD DUMP
-GAMEL( 2000, magimask, aristmk5, aristmk5_usa_touch, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Magic Mask (DHG1309, US)", MACHINE_FLAGS, layout_aristmk5 ) // MV4115, A - 09/05/00
-GAMEL( 2000, magimaska, magimask, aristmk5_usa_touch, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Magic Mask (AHG1548, US)", MACHINE_FLAGS, layout_aristmk5 ) // MV4115, A - 09/05/00
-GAMEL( 1997, magtcha5, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Magic Touch (0200455V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 606, A - 06/03/97
+GAMEL( 2000, magimask, aristmk5, aristmk5_usa_touch, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Magic Mask (DHG1309, US)", MACHINE_FLAGS, layout_aristmk5_us ) // MV4115, A - 09/05/00
+GAMEL( 2000, magimaska, magimask, aristmk5_usa_touch, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Magic Mask (AHG1548, US)", MACHINE_FLAGS, layout_aristmk5_us ) // MV4115, A - 09/05/00
+GAMEL( 1997, magtcha5, aristmk5, aristmk5_touch, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Magic Touch (0200455V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 606, A - 06/03/97
GAMEL( 2000, marmagic, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Margarita Magic (01J00101, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // JB005, A - 07/07/00
-GAMEL( 2000, marmagicu, marmagic, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Margarita Magic (EHG1559, US)", MACHINE_FLAGS, layout_aristmk5 ) // US003, A - 07/07/00 - BAD DUMP
-GAMEL( 1996, minemine, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Mine, Mine, Mine (VHG0416-99, US)", MACHINE_FLAGS, layout_aristmk5 ) // 559/2, E - 14/02/96
+GAMEL( 2000, marmagicua,marmagic, aristmk5_usa, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Margarita Magic (EHG1558, US)", MACHINE_FLAGS, layout_aristmk5_us ) // US003, 07/07/2000
+GAMEL( 1996, minemine, aristmk5, aristmk5_usa, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Mine, Mine, Mine (VHG0416-99, US)", MACHINE_FLAGS, layout_aristmk5_us ) // 559/2, E - 14/02/96
GAMEL( 1997, monmouse, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Money Mouse (0400469V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 607/1, B - 08/04/97
GAMEL( 2001, montree, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Money Tree (0201397V, New Zealand)", MACHINE_FLAGS, layout_aristmk5 ) // MV4126, C - 12/04/01
-GAMEL( 1996, mountmon, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Mountain Money (0100294V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) //595/3, B - 11/06/96
+GAMEL( 1996, mountmon, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Mountain Money (0100294V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 595/3, B - 11/06/96
GAMEL( 2000, multidrw, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Multidraw - Free Games (0200956V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 386/64, E - 08/05/00
GAMEL( 1996, mystgard, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Mystic Garden (0100275V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 595/1, B - 11/06/96
GAMEL( 1999, orchidms, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Orchid Mist (0200849V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 601/3, C - 03/02/99
GAMEL( 1996, oscara5, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Oscar (0200348V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 593/2, C - 20/09/96
GAMEL( 1999, pantmag, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Panther Magic (0101046V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 594/7, A - 06/10/99
-GAMEL( 2001, partygrs, aristmk5, aristmk5_usa_touch, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Party Gras (AHG1567, US)", MACHINE_FLAGS, layout_aristmk5 ) // MV4115/6, A - 10/11/01
-GAMEL( 2001, partygrsa, partygrs, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Party Gras (BHG1284, US)", MACHINE_FLAGS, layout_aristmk5 ) // MV4115/3, B - 06/02/01 - BAD DUMP
+GAMEL( 1999, pantmaga, pantmag, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Panther Magic (0100716V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 594/4, A - 13/05/98
+GAMEL( 2001, partygrs, aristmk5, aristmk5_usa_touch, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Party Gras (AHG1567, US)", MACHINE_FLAGS, layout_aristmk5_us ) // MV4115/6, A - 10/11/01
GAMEL( 2000, peaflut, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Peacock Flutter (02J00011, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // JB001, A - 10/03/00
GAMEL( 1997, pengpay, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Penguin Pays (0200460V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 586/4(a), D - 03/06/97
GAMEL( 1996, pengpaya, pengpay, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Penguin Pays (0200357V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 586/4, C - 12/11/96
GAMEL( 1997, pengpayb, pengpay, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Penguin Pays (0200359V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 586/3(a), D - 03/06/97
-GAMEL( 1997, pengpayu, pengpay, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Penguin Pays (BHI0417-03, US)", MACHINE_FLAGS, layout_aristmk5 ) // 586/7(b) B - 14/07/97
-GAMEL( 1998, petshop, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Pet Shop (0100679V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 618, A - 09/03/98 - BAD DUMP
+GAMEL( 1997, pengpayu, pengpay, aristmk5_usa, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Penguin Pays (BHI0417-03, US)", MACHINE_FLAGS, layout_aristmk5_us ) // 586/7(b) B - 14/07/97
+GAMEL( 1998, petshop, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Pet Shop (0100731V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 618/1, A - 17/04/98
+GAMEL( 1995, phantpay, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Phantom Pays (0500005V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 570/1, E - 12/09/95
+GAMEL( 1998, penpir2, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Penguin Pirate II (0100869V, Victoria)", MACHINE_FLAGS, layout_aristmk5 ) // 619/3, A - 17/12/98
GAMEL( 1996, przfight, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Prize Fight (0100299V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 578/4, B - 08/08/96
GAMEL( 1998, qcash, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Queens of Cash (0100706V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 603/6, C - 23/07/98
GAMEL( 1997, qnile, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Queen of the Nile (0100439V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 602/4, B - 13/05/97
GAMEL( 1997, qnilea, qnile, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Queen of the Nile (0300440V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 602/3, B - 13/05/97
GAMEL( 1997, qnileb, qnile, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Queen of the Nile (0200439V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 602/4, B - 13/05/97
GAMEL( 1997, qnilec, qnile, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Queen of the Nile (0300439V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 602/4, B - 13/05/97
-GAMEL( 1997, qnileu, qnile, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Queen of the Nile (GHG4091-02, US)", MACHINE_FLAGS, layout_aristmk5 ) // MV4091, B - 13/05/97
-GAMEL( 1999, qnilemax, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Queen of the Nile - Maximillions (0401072V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 602/4, D - 18/06/99
+GAMEL( 1997, qnileu, qnile, aristmk5_usa, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Queen of the Nile (GHG4091-02, US)", MACHINE_FLAGS, layout_aristmk5_us ) // MV4091, B - 13/05/97
+GAMEL( 1999, qnilemax, aristmk5, aristmk5_touch, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Queen of the Nile - Maximillions (0401072V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 602/4, D - 18/06/99
+GAMEL( 1994, qtbird, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Q.T. Bird (0500009V, NSW/ACT) ", MACHINE_FLAGS, layout_aristmk5 ) // 581, A - 27/10/94
GAMEL( 2000, rainwrce, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Rainbow Warriors - Cash Express (0101332V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 655, B - 02/03/00
GAMEL( 1998, reelrock, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Reelin-n-Rockin (0100779V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 628, A - 13/07/98
GAMEL( 1997, retrsam, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Return of the Samurai (0400549V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 608, A - 17/04/97
GAMEL( 1997, retrsama, retrsam, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Return of the Samurai (0200506V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 608, A - 17/04/97
GAMEL( 1997, retrsamb, retrsam, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Return of the Samurai (0200549V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 608, A - 17/04/97
GAMEL( 1997, sumospin, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Sumo Spins (0200606V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 622, A - 08/12/97
-GAMEL( 1999, sbuk2, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Super Bucks II (0400501V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 578, G - 26/07/99
GAMEL( 1998, sbuk3, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Super Bucks III (0200711V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 626, A - 22/04/98
GAMEL( 1995, swhr2, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Sweethearts II (0200004V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 577/1, C - 07/09/95
-GAMEL( 1998, swhr2u, swhr2, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Sweethearts II (PHG0742-02, US)", MACHINE_FLAGS, layout_aristmk5 ) // MV4061, A - 29/06/98 - BAD DUMP
GAMEL( 1995, swhr2v, swhr2, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Sweet Hearts II (01J01986, Venezuela)", MACHINE_FLAGS, layout_aristmk5 ) // 577/1, C - 07/09/95
-GAMEL( 199?, topbana, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Top Banana (0100550V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // BAD DUMP
+GAMEL( 1997, topbana, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Top Banana (0100550V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 594/3, A - 18/08/97
GAMEL( 2000, trstrove, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Treasure Trove (01J00161, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // JB001/3, A - 5/10/00
GAMEL( 2002, tritreat, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Triple Treat (0201692V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 692, A - 17/05/02
GAMEL( 2001, trojhors, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Trojan Horse (01J00851, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // JB001/5, A - 30/10/01
-GAMEL( 1997, trpdlght, aristmk5, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Tropical Delight (PHG0625-02, US)", MACHINE_FLAGS, layout_aristmk5 ) // 577/3, D - 24/09/97 - BAD DUMP
GAMEL( 1998, unicornd, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Unicorn Dreaming (0100791V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 631/1, A - 31/08/98
GAMEL( 2000, unicorndnz,unicornd, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Unicorn Dreaming (0101228V, New Zealand)", MACHINE_FLAGS, layout_aristmk5 ) // MV4113/1, A - 05/04/2000
-GAMEL( 1996, wamazon, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Wild Amazon (0200285V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 506/6, A - 7/5/96
-GAMEL( 1996, wamazona, wamazon, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Wild Amazon (0200507V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 506/8, A - 10/10/96
+GAMEL( 1996, wamazon, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Wild Amazon (0200507V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 506/8, A - 10/10/96
GAMEL( 1996, wamazonv, wamazon, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Wild Amazon (01J01996, Venezuela)", MACHINE_FLAGS, layout_aristmk5 ) // 506/8, A - 10/10/96
GAMEL( 1996, wildbill, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Wild Bill (0100297V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 543/8, C - 15/08/96
GAMEL( 1996, wcougar, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Wild Cougar (0100167V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 569/9, B - 27/2/96
-GAMEL( 1997, wcougaru, wcougar, aristmk5_usa, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Wild Cougar (NHG0296-04, US)", MACHINE_FLAGS, layout_aristmk5 ) // 569/8, D - 19/05/97
+GAMEL( 1997, wcougaru, wcougar, aristmk5_usa, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Wild Cougar (NHG0296-04, US)", MACHINE_FLAGS, layout_aristmk5_us ) // 569/8, D - 19/05/97
+GAMEL( 1996, wizways, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Wizard Ways (0200396V, NSW/ACT) ", MACHINE_FLAGS, layout_aristmk5 ) // 598/3, A - 04/11/96
+GAMEL( 1997, wnpost, aristmk5, aristmk5_usa, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Winning Post (RHG0418-04, US)", MACHINE_FLAGS, layout_aristmk5_us ) // 541/2, G - 11/02/97
GAMEL( 1999, wthing, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Wild Thing (0101158V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 608/4, B - 14/12/99
GAMEL( 1999, wtiger, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "White Tiger Classic (0200954V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 638/1, B - 08/07/99
+// the following might be bad dumps or need different hardware (unconfirmed)
+GAMEL( 1996, blackpnt, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Black Panther (0200818V, Victoria)", MACHINE_FLAGS, layout_aristmk5 ) // 594/1, A - 30/07/96 - doesn't boot, 'needs VLC (Video Lottery Consultants) comms instead of QCOM' (or bad?)
+
+// the following parent sets are known bad dumps, and do not boot (confirmed)
+GAMEL( 1998, gambler, aristmk5, aristmk5_usa, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "The Gambler (EHG0916-02, US)", MACHINE_FLAGS, layout_aristmk5_us ) // MV4084/1, A - 30/10/98
+GAMEL( 2001, koalamnt, aristmk5, aristmk5_usa, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Koala Mint (CHG1573, US)", MACHINE_FLAGS, layout_aristmk5_us ) // MV4137, A - 12/09/01
+GAMEL( 1997, mgarden, aristmk5, aristmk5_usa, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Magic Garden (AHG1211-99, US)", MACHINE_FLAGS, layout_aristmk5_us ) // MV4033, B - 10/02/97
+GAMEL( 1997, trpdlght, aristmk5, aristmk5_usa, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Tropical Delight (PHG0625-02, US)", MACHINE_FLAGS, layout_aristmk5_us ) // 577/3, D - 24/09/97
+GAMEL( 1999, sbuk2, aristmk5, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Super Bucks II (0400501V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 578, G - 26/07/99
+// the following clone sets are known bad dumps, and do not boot (confirmed)
+GAMEL( 2001, adonisu, adonis, aristmk5_usa, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Adonis (BHG1508, US)", MACHINE_FLAGS, layout_aristmk5_us ) // MV4124/1, B - 31/07/01
+GAMEL( 1999, bootsctnu, bootsctn, aristmk5_usa, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Boot Scootin' (GHG1012-02, US)", MACHINE_FLAGS, layout_aristmk5_us ) // MV4098, A - 25/08/99
+GAMEL( 1997, bumblbugu, bumblbug, aristmk5_usa, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Bumble Bugs (CHG0479-03, US)", MACHINE_FLAGS, layout_aristmk5_us ) // 593, D - 05/07/97
+GAMEL( 1996, cashchamu, cashcham, aristmk5_usa, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Cash Chameleon (DHG4078-99, US)", MACHINE_FLAGS, layout_aristmk5_us ) // 603(a), B - 06/12/96
+GAMEL( 1997, eforsta5u, eforsta5, aristmk5_usa, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Enchanted Forest (JHG0415-03, US)", MACHINE_FLAGS, layout_aristmk5_us ) // MV4033, B - 10/02/97
+GAMEL( 1997, goldpyra, goldpyr, aristmk5_usa, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Golden Pyramids (AHG1206-99, US)", MACHINE_FLAGS, layout_aristmk5_us ) // 602/2, B - 13/05/97
+GAMEL( 2000, marmagicu, marmagic, aristmk5_usa, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Margarita Magic (EHG1559, US)", MACHINE_FLAGS, layout_aristmk5_us ) // US003, A - 07/07/00
+GAMEL( 2001, partygrsa, partygrs, aristmk5_usa_touch, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Party Gras (BHG1284, US)", MACHINE_FLAGS, layout_aristmk5_us ) // MV4115/3, B - 06/02/01
+GAMEL( 1998, petshopa, petshop, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Pet Shop (0100679V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 618, A - 09/03/98
+GAMEL( 1998, swhr2u, swhr2, aristmk5_usa, aristmk5_usa, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Sweethearts II (PHG0742-02, US)", MACHINE_FLAGS, layout_aristmk5_us ) // MV4061, A - 29/06/98
+GAMEL( 1996, wamazona, wamazon, aristmk5, aristmk5, aristmk5_state, aristmk5, ROT0, "Aristocrat", "Wild Amazon (0200285V, NSW/ACT)", MACHINE_FLAGS, layout_aristmk5 ) // 506/6, A - 7/5/96
diff --git a/src/mame/drivers/armedf.cpp b/src/mame/drivers/armedf.cpp
index 51545f99ead..7de230d0770 100644
--- a/src/mame/drivers/armedf.cpp
+++ b/src/mame/drivers/armedf.cpp
@@ -338,7 +338,7 @@ Notes:
---- -x-- ---- ---- disable fg layer
---- --x- ---- ---- disable sprite
---- ---x ---- ---- disable tx layer
- ---- ---- 1--1 ---- unknown
+ ---- ---- 1--1 ---- unknown
---- ---- ---- --x- coin counter 1
---- ---- ---- ---x coin counter 0
*/
@@ -1584,7 +1584,7 @@ static MACHINE_CONFIG_START( bigfghtr, bigfghtr_state )
MCFG_CPU_ADD("mcu", I8751, XTAL_16MHz/2) // verified
MCFG_CPU_PROGRAM_MAP(bigfghtr_mcu_map)
MCFG_CPU_IO_MAP(bigfghtr_mcu_io_map)
-
+
MCFG_MACHINE_START_OVERRIDE(armedf_state,armedf)
MCFG_MACHINE_RESET_OVERRIDE(armedf_state,armedf)
diff --git a/src/mame/drivers/arsystems.cpp b/src/mame/drivers/arsystems.cpp
index b9c3aeb92ce..25e81048373 100644
--- a/src/mame/drivers/arsystems.cpp
+++ b/src/mame/drivers/arsystems.cpp
@@ -312,11 +312,13 @@ static MACHINE_CONFIG_START( arcadia, arcadia_amiga_state )
/* sound hardware */
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
- MCFG_SOUND_ADD("amiga", AMIGA, amiga_state::CLK_C1_NTSC)
+ MCFG_SOUND_ADD("amiga", PAULA_8364, amiga_state::CLK_C1_NTSC)
MCFG_SOUND_ROUTE(0, "lspeaker", 0.50)
MCFG_SOUND_ROUTE(1, "rspeaker", 0.50)
MCFG_SOUND_ROUTE(2, "rspeaker", 0.50)
MCFG_SOUND_ROUTE(3, "lspeaker", 0.50)
+ MCFG_PAULA_MEM_READ_CB(READ16(amiga_state, chip_ram_r))
+ MCFG_PAULA_INT_CB(WRITELINE(amiga_state, paula_int_w))
/* cia */
MCFG_DEVICE_ADD("cia_0", MOS8520, amiga_state::CLK_E_NTSC)
diff --git a/src/mame/drivers/asteroid.cpp b/src/mame/drivers/asteroid.cpp
index 574c420501e..08520d50cbd 100644
--- a/src/mame/drivers/asteroid.cpp
+++ b/src/mame/drivers/asteroid.cpp
@@ -323,7 +323,7 @@ static INPUT_PORTS_START( asteroid )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER("dvg", dvg_device, done_r, nullptr)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_CODE(KEYCODE_SPACE) PORT_CODE(JOYCODE_BUTTON3) /* hyperspace */
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(JOYCODE_BUTTON1) /* fire */
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SERVICE ) PORT_NAME("Diagnostic Step") PORT_CODE(KEYCODE_F1)
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_NAME("Diagnostic Step")
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_TILT )
PORT_SERVICE( 0x80, IP_ACTIVE_HIGH )
@@ -416,7 +416,7 @@ static INPUT_PORTS_START( asterock )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, asteroid_state,clock_r, nullptr)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_CODE(KEYCODE_SPACE) PORT_CODE(JOYCODE_BUTTON3) /* hyperspace */
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(JOYCODE_BUTTON1) /* fire */
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Diagnostic Step") PORT_CODE(KEYCODE_F1)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Diagnostic Step")
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_TILT )
PORT_SERVICE( 0x80, IP_ACTIVE_LOW )
@@ -457,7 +457,7 @@ static INPUT_PORTS_START( astdelux )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER("dvg", dvg_device, done_r, nullptr)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_CODE(KEYCODE_SPACE) PORT_CODE(JOYCODE_BUTTON3) /* hyperspace */
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(JOYCODE_BUTTON1) /* fire */
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SERVICE ) PORT_NAME("Diagnostic Step") PORT_CODE(KEYCODE_F1)
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_NAME("Diagnostic Step")
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_TILT )
PORT_SERVICE( 0x80, IP_ACTIVE_HIGH )
@@ -542,7 +542,7 @@ static INPUT_PORTS_START( llander )
/* Of the rest, Bit 6 is the 3KHz source. 3,4 and 5 are unknown */
PORT_BIT( 0x38, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, asteroid_state,clock_r, nullptr)
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Diagnostic Step") PORT_CODE(KEYCODE_F1)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Diagnostic Step")
PORT_START("IN1")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 )
diff --git a/src/mame/drivers/astrof.cpp b/src/mame/drivers/astrof.cpp
index 85720b45726..278773aefa2 100644
--- a/src/mame/drivers/astrof.cpp
+++ b/src/mame/drivers/astrof.cpp
@@ -1196,20 +1196,20 @@ ROM_END
/* Star Fighter (VGG)
CPUs
-QTY Type clock position function
-1x R6502-13 2a 8-bit Microprocessor - main
-1x TBA810 2f Audio Amplifier - sound
-1x oscillator 10595 9c
+QTY Type clock position function
+1x R6502-13 2a 8-bit Microprocessor - main
+1x TBA810 2f Audio Amplifier - sound
+1x oscillator 10595 9c
ROMs
-QTY Type position status
-6x TMS2716 0-5 dumped
-1x MMI6341-1J 12c dumped
+QTY Type position status
+6x TMS2716 0-5 dumped
+1x MMI6341-1J 12c dumped
RAMs
-QTY Type position
-19x ITT4027 1-19
-2x 2114L3PC 5b,6b
+QTY Type position
+19x ITT4027 1-19
+2x 2114L3PC 5b,6b
Others
1x 22x2 edge connector
diff --git a/src/mame/drivers/asuka.cpp b/src/mame/drivers/asuka.cpp
index 77144702d7a..3c31e120919 100644
--- a/src/mame/drivers/asuka.cpp
+++ b/src/mame/drivers/asuka.cpp
@@ -1570,10 +1570,10 @@ ROM_END
ROM_START( cadashi )
ROM_REGION( 0x80000, "maincpu", 0 ) /* 512k for 68000 code */
- ROM_LOAD16_BYTE( "c21-14it", 0x00000, 0x20000, CRC(d1d9e613) SHA1(296c188daec962bdb4e78e20f1cc4c7d1f4dda09) ) /* need correct Taito ID #s for these roms */
- ROM_LOAD16_BYTE( "c21-16it", 0x00001, 0x20000, CRC(142256ef) SHA1(9ffc64d7c900bfa0300de9e6d18c7458f4c76ed7) ) /* ID numbers should be at least 26 or higher */
- ROM_LOAD16_BYTE( "c21-13it", 0x40000, 0x20000, CRC(c9cf6e30) SHA1(872c871cd60e0aa7149660277f67f90748d82743) )
- ROM_LOAD16_BYTE( "c21-17it", 0x40001, 0x20000, CRC(641fc9dd) SHA1(1497e39f6b250de39ef2785aaca7e68a803612fa) )
+ ROM_LOAD16_BYTE( "c21_27-1.ic11", 0x00000, 0x20000, CRC(d1d9e613) SHA1(296c188daec962bdb4e78e20f1cc4c7d1f4dda09) )
+ ROM_LOAD16_BYTE( "c21_29-1.ic15", 0x00001, 0x20000, CRC(142256ef) SHA1(9ffc64d7c900bfa0300de9e6d18c7458f4c76ed7) )
+ ROM_LOAD16_BYTE( "c21_26-1.ic10", 0x40000, 0x20000, CRC(c9cf6e30) SHA1(872c871cd60e0aa7149660277f67f90748d82743) )
+ ROM_LOAD16_BYTE( "c21_28-1.ic14", 0x40001, 0x20000, CRC(641fc9dd) SHA1(1497e39f6b250de39ef2785aaca7e68a803612fa) )
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_LOAD( "c21-02.9", 0x00000, 0x80000, CRC(205883b9) SHA1(5aafee8cab3f949a7db91bcc26912f331041b51e) ) /* SCR tiles (8 x 8) */
diff --git a/src/mame/drivers/atarittl.cpp b/src/mame/drivers/atarittl.cpp
index c414f7471b3..b63e10a6a70 100644
--- a/src/mame/drivers/atarittl.cpp
+++ b/src/mame/drivers/atarittl.cpp
@@ -57,9 +57,9 @@
netlist system per-game:
TM-057 (Stunt Cycle)
- 566 Voltage-Controlled Oscillator
- 1N751A Zener Diode
- 1N752A Zener Diode
+ 566 Voltage-Controlled Oscillator
+ 1N751A Zener Diode
+ 1N752A Zener Diode
TM-055 (Indy 4)
7406 Hex Inverter Buffers/Drivers with O.C. H.V. Outputs (note: Might not be needed, could just clone from 7404)
@@ -94,13 +94,13 @@
#define HRES_MULT (1)
// end
-#define SC_VIDCLOCK (14318181/2)
-#define SC_HTOTAL (0x1C8+1) // 456
-#define SC_VTOTAL (0x103+1) // 259
-#define SC_HBSTART (SC_HTOTAL)
-#define SC_HBEND (32)
-#define SC_VBSTART (SC_VTOTAL)
-#define SC_VBEND (8)
+#define SC_VIDCLOCK (14318181/2)
+#define SC_HTOTAL (0x1C8+1) // 456
+#define SC_VTOTAL (0x103+1) // 259
+#define SC_HBSTART (SC_HTOTAL)
+#define SC_HBEND (32)
+#define SC_VBSTART (SC_VTOTAL)
+#define SC_VBEND (8)
class atarikee_state : public driver_device
{
@@ -136,8 +136,6 @@ public:
, m_maincpu(*this, "maincpu")
//, m_video(*this, "fixfreq")
, m_probe_screen(*this, "screen")
- , m_hf1(*this, "maincpu:hf1")
- , m_d7(*this, "maincpu:d7")
, m_probe_bit0(0.0)
, m_probe_bit1(0.0)
, m_probe_bit2(0.0)
@@ -174,8 +172,6 @@ private:
required_device<netlist_mame_device_t> m_maincpu;
//required_device<fixedfreq_device> m_video;
required_device<screen_device> m_probe_screen;
- required_device<netlist_mame_rom_t> m_hf1;
- required_device<netlist_mame_rom_t> m_d7;
int m_probe_bit0;
int m_probe_bit1;
@@ -184,7 +180,7 @@ private:
int m_probe_bit4;
int m_probe_bit5;
int m_probe_bit6;
-
+
std::unique_ptr<int[]> m_probe_data;
int m_last_beam;
@@ -331,9 +327,6 @@ static MACHINE_CONFIG_START( stuntcyc, stuntcyc_state )
MCFG_DEVICE_ADD("maincpu", NETLIST_CPU, STUNTCYC_NL_CLOCK)
MCFG_NETLIST_SETUP(stuntcyc)
- MCFG_NETLIST_ROM_REGION("maincpu", "hf1", "hf1", "004275.f1", 0x0000, 0x0200)
- MCFG_NETLIST_ROM_REGION("maincpu", "d7", "d7", "004811.d7", 0x0000, 0x0020)
-
//MCFG_NETLIST_ANALOG_OUTPUT("maincpu", "vid0", "VIDEO_OUT", fixedfreq_device, update_vid, "fixfreq")
MCFG_NETLIST_LOGIC_OUTPUT("maincpu", "probe_bit0", "probe_bit0", stuntcyc_state, probe_bit0_cb, "")
MCFG_NETLIST_LOGIC_OUTPUT("maincpu", "probe_bit1", "probe_bit1", stuntcyc_state, probe_bit1_cb, "")
@@ -495,10 +488,10 @@ ROM_END
ROM_START( stuntcyc )
ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 )
- ROM_REGION( 0x0200, "hf1", ROMREGION_ERASE00 )
+ ROM_REGION( 0x0200, "maincpu:004275.f1", ROMREGION_ERASE00 )
ROM_LOAD( "004275.f1", 0x0000, 0x0200, CRC(4ed5a99d) SHA1(1e5f439bce72e78dfff76fd8f61187c6ef484a64) ) // Motorcycle & Bus
- ROM_REGION( 0x0020, "d7", ROMREGION_ERASE00 )
+ ROM_REGION( 0x0020, "maincpu:004811.d7", ROMREGION_ERASE00 )
ROM_LOAD( "004811.d7", 0x0000, 0x0020, CRC(31a09efb) SHA1(fd5d538c9ec1234acf7c74ca0704113d220abbf6) ) // Score Translator
ROM_END
diff --git a/src/mame/drivers/atlantis.cpp b/src/mame/drivers/atlantis.cpp
index 4d27c17a824..ff03e937c58 100644
--- a/src/mame/drivers/atlantis.cpp
+++ b/src/mame/drivers/atlantis.cpp
@@ -232,7 +232,7 @@ WRITE32_MEMBER(atlantis_state::board_ctrl_w)
break;
case CTRL_VSYNC_CLEAR:
//VSYNC_IE (0x1)
- //VSYNC_POL (0x2) off=negative true, on=positive true
+ //VSYNC_POL (0x2) off=negative true, on=positive true
// 0x1 VBlank clear?
if (changeData & 0x1) {
if ((data & 0x0001) == 0) {
diff --git a/src/mame/drivers/atom.cpp b/src/mame/drivers/atom.cpp
index cb412dc9cd8..9f9a2da2a5d 100644
--- a/src/mame/drivers/atom.cpp
+++ b/src/mame/drivers/atom.cpp
@@ -75,12 +75,12 @@ Hardware: PPIA 8255
The identity number of each station is set up in hardware by links to IC 8. IC 8 is an octal buffer which when enabled feeds the cards station ID to the computer bus.
Each link codes a bit in an eight bit binary number allowing any station ID in the range 0 to 255 to be set up. if a link is left open then the bit is a one, when a
link is made the bit is a zero. Hence all links open corresponds to station ID 255, and all links made to station ID 0. Each station must have a unique identity and
- some indentities are associated with specific functions on the network. Station ID zero is reserved for broadcast signals and should not be used. Station ID 255 is
- reserved at present for the file server, and 235 for the printer server. Wire links must be soldered to each network station card during installation, a sugested
+ some identities are associated with specific functions on the network. Station ID zero is reserved for broadcast signals and should not be used. Station ID 255 is
+ reserved at present for the file server, and 235 for the printer server. Wire links must be soldered to each network station card during installation, a suggested
scheme for number allocation is to number normal user stations from one upwards and to number special stations and servers from 255 downwards.
2011 June 04 - Phill Harvey-Smith
- Fixed "ERROR" repeating infinite loop, caused by random values in machine_start() being poked into the wrong memory reigion causing the basic ROM to become
+ Fixed "ERROR" repeating infinite loop, caused by random values in machine_start() being poked into the wrong memory region causing the basic ROM to become
corrupted. Values are now correctly placed in bytes 0x0008 - 0x000B of RAM.
@@ -90,10 +90,9 @@ Hardware: PPIA 8255
TODO:
- - connect to softwarelist
- e000 EPROM switching
- display should be monochrome -- Should be optional, Acorn produced a Colour Card, and there is
- at least one aftermarket Colour card.
+ at least one after market Colour card.
- ram expansion
- tap files
- mouse
@@ -287,17 +286,16 @@ static ADDRESS_MAP_START( atombb_mem, AS_PROGRAM, 8, atom_state )
ADDRESS_MAP_END
/*-------------------------------------------------
- ADDRESS_MAP( prophet2_mem )
+ ADDRESS_MAP( prophet_mem )
-------------------------------------------------*/
-//static ADDRESS_MAP_START( prophet2_mem, AS_PROGRAM, 8, atom_state )
+//static ADDRESS_MAP_START( prophet_mem, AS_PROGRAM, 8, atom_state )
// AM_RANGE(0x0000, 0x09ff) AM_RAM
// AM_RANGE(0x0a00, 0x7fff) AM_RAM
// AM_RANGE(0x8000, 0x97ff) AM_RAM AM_SHARE("video_ram")
// AM_RANGE(0x9800, 0x9fff) AM_RAM
+// AM_RANGE(0xa000, 0xafff) AM_ROM AM_REGION("ic24", 0)
// AM_RANGE(0xb000, 0xb003) AM_MIRROR(0x3fc) AM_DEVREADWRITE(INS8255_TAG, i8255_device, read, write)
-//// AM_RANGE(0xb400, 0xb403) AM_DEVREADWRITE(MC6854_TAG, mc6854_device, read, write)
-//// AM_RANGE(0xb404, 0xb404) AM_READ_PORT("ECONET")
// AM_RANGE(0xb800, 0xb80f) AM_MIRROR(0x3f0) AM_DEVREADWRITE(R6522_TAG, via6522_device, read, write)
// AM_RANGE(0xc000, 0xffff) AM_ROM AM_REGION(SY6502_TAG, 0)
//ADDRESS_MAP_END
@@ -603,7 +601,7 @@ WRITE_LINE_MEMBER( atom_state::atom_8271_interrupt_callback )
WRITE_LINE_MEMBER( atom_state::motor_w )
{
for (int i=0; i != 2; i++) {
- char devname[1];
+ char devname[8];
sprintf(devname, "%d", i);
floppy_connector *con = m_fdc->subdevice<floppy_connector>(devname);
if (con) {
@@ -681,7 +679,7 @@ image_init_result atom_state::load_cart(device_image_interface &image, generic_s
if (size > 0x1000)
{
- image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported ROM size");
return image_init_result::FAIL;
}
@@ -754,7 +752,7 @@ static MACHINE_CONFIG_START( atom, atom_state )
MCFG_QUICKLOAD_ADD("quickload", atom_state, atom_atm, "atm", 0)
- /* cartridge */
+ /* utility rom slot */
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_linear_slot, "atom_cart")
MCFG_GENERIC_EXTENSIONS("bin,rom")
MCFG_GENERIC_LOAD(atom_state, cart_load)
@@ -867,14 +865,19 @@ MACHINE_CONFIG_END
//static MACHINE_CONFIG_DERIVED( prophet2, atom )
// /* basic machine hardware */
// MCFG_CPU_MODIFY(SY6502_TAG)
-// MCFG_CPU_PROGRAM_MAP(prophet2_mem)
+// MCFG_CPU_PROGRAM_MAP(prophet_mem)
//
// /* fdc */
// MCFG_DEVICE_REMOVE(I8271_TAG)
// MCFG_DEVICE_REMOVE(I8271_TAG ":0")
// MCFG_DEVICE_REMOVE(I8271_TAG ":1")
//
+// /* internal ram */
+// MCFG_RAM_MODIFY(RAM_TAG)
+// MCFG_RAM_DEFAULT_SIZE("32K")
+
// /* Software lists */
+// MCFG_SOFTWARE_LIST_REMOVE("rom_list")
// MCFG_SOFTWARE_LIST_REMOVE("flop_list")
//MACHINE_CONFIG_END
@@ -883,7 +886,16 @@ MACHINE_CONFIG_END
-------------------------------------------------*/
//static MACHINE_CONFIG_DERIVED( prophet3, atom )
+// /* basic machine hardware */
+// MCFG_CPU_MODIFY(SY6502_TAG)
+// MCFG_CPU_PROGRAM_MAP(prophet_mem)
//
+// /* internal ram */
+// MCFG_RAM_MODIFY(RAM_TAG)
+// MCFG_RAM_DEFAULT_SIZE("32K")
+
+// /* Software lists */
+// MCFG_SOFTWARE_LIST_REMOVE("rom_list")
//MACHINE_CONFIG_END
/*-------------------------------------------------
diff --git a/src/mame/drivers/attache.cpp b/src/mame/drivers/attache.cpp
index 8172815e861..48571180652 100644
--- a/src/mame/drivers/attache.cpp
+++ b/src/mame/drivers/attache.cpp
@@ -261,7 +261,7 @@ uint32_t attache_state::screen_update(screen_device &screen, bitmap_rgb32 &bitma
}
else
bitmap.fill(0);
-
+
// Text output
for(y=0;y<(bitmap.height()-1)/10;y++) // lines
{
diff --git a/src/mame/drivers/atvtrack.cpp b/src/mame/drivers/atvtrack.cpp
index 914ea4ac667..8d624e22ebc 100644
--- a/src/mame/drivers/atvtrack.cpp
+++ b/src/mame/drivers/atvtrack.cpp
@@ -85,9 +85,9 @@ write - enable slave CPU, gpu, etc most of bits is unclear
SH4 XTAL is 33MHz, SH4 MD0-2 pins is 001 or 011 (CPU core clk = XTAL*6, preipheral clk = XTAL, bus clk is XTAL or XTAL*2)
TODO:
- devicify NAND
- somehow hook PVR2 renderer here
- add sound
+ devicify NAND
+ somehow hook PVR2 renderer here
+ add sound
*/
@@ -206,9 +206,9 @@ WRITE64_MEMBER(atvtrack_state::control_w)
else
m_subcpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
}
-// logerror("Write %08x at %08x ",dat, 0x20000+addr*4+0);
-// logbinary(dat);
-// logerror("\n");
+// logerror("Write %08x at %08x ",dat, 0x20000+addr*4+0);
+// logbinary(dat);
+// logerror("\n");
}
READ64_MEMBER(atvtrack_state::nand_data_r)
@@ -319,7 +319,7 @@ WRITE32_MEMBER(atvtrack_state::gpu_w)
{
case 0x00/4:
// not really required, game code will go even if GPU CPU shows no signs of live
- if (data) // internal CPU start ?
+ if (data) // internal CPU start ?
m_subcpu->space(AS_PROGRAM).write_byte(0x18001350, 1); // simulate GPUs internal CPU reply to skip busy loop
break;
case 0x70/4:
@@ -369,7 +369,7 @@ WRITE64_MEMBER(atvtrack_state::ioport_w)
// bit 7 IO - data bit *1 always 1 / set to 30 during slave CPU test, then to 10
// bit 6 IO - data bit Test ADC CS, ~DAC CS unused
// bit 5 IO - data bit Down ADC CLK, ~DAC CLK unused
- // bit 4 IO - data bit Service DAC data JP6 lamp
+ // bit 4 IO - data bit Service DAC data JP6 lamp
// bit 3 IO - data bit Up ADC data JP5 coin counter
// bit 2 I - unk, (SD: 1 = FPGA ready after config)
// bit 1 O - data bits operation direction: 0 - output, 1 - input (SD: FPGA config data)
@@ -389,9 +389,9 @@ WRITE64_MEMBER(atvtrack_state::ioport_w)
if (data & 0x0100)
m_slaverun = true;
}
-// logerror("SH4 16bit i/o port write ");
-// logbinary((uint32_t)data,15,0);
-// logerror("\n");
+// logerror("SH4 16bit i/o port write ");
+// logbinary((uint32_t)data,15,0);
+// logerror("\n");
}
#ifdef SPECIALMODE
if (offset == SH4_IOPORT_DMA/8) {
@@ -424,7 +424,7 @@ uint32_t atvtrack_state::screen_update_atvtrack(screen_device &screen, bitmap_rg
void get_altera10ke_eab(u8* dst, u8 *pof, int eab)
{
// extract Altera FLEX 10KE 4kbit Embedded Array Block (EAB)
- u32 startbit = 0x45b * 8 + 1 + (0x25e6 * 8) * eab; // base ofsset actually depends on POF header size, however this EPC1PC8 dump havent it (bad dumper software?)
+ u32 startbit = 0x45b * 8 + 1 + (0x25e6 * 8) * eab; // base ofsset actually depends on POF header size, however this EPC1PC8 dump havent it (bad dumper software?)
for (u32 bit = 0; bit < 4096; bit++)
{
diff --git a/src/mame/drivers/avt.cpp b/src/mame/drivers/avt.cpp
index 59e34ebaa5a..061ba6e77ee 100644
--- a/src/mame/drivers/avt.cpp
+++ b/src/mame/drivers/avt.cpp
@@ -405,9 +405,9 @@
************************************************************************************************/
-#define MASTER_CLOCK XTAL_10MHz /* unknown */
+#define MASTER_CLOCK XTAL_16MHz /* unknown */
#define CPU_CLOCK MASTER_CLOCK/4 /* guess... seems accurate */
-#define CRTC_CLOCK MASTER_CLOCK/16 /* it gives 59.410646 fps with current settings */
+#define CRTC_CLOCK MASTER_CLOCK/24 /* it gives 63.371293 Hz. with current settings */
#include "emu.h"
#include "cpu/z80/z80.h"
@@ -519,14 +519,14 @@ uint32_t avt_state::screen_update_avt(screen_device &screen, bitmap_ind16 &bitma
count = 0;
- for(y=0;y<mc6845_v_display;y++)
+ for(y = 0; y < mc6845_v_display; y++)
{
- for(x=0;x<mc6845_h_display;x++)
+ for(x = 0; x < mc6845_h_display; x++)
{
uint16_t tile = m_videoram[count] | ((m_colorram[count] & 1) << 8);
uint8_t color = (m_colorram[count] & 0xf0) >> 4;
- gfx->opaque(bitmap,cliprect,tile,color,0,0,x*8,(y*8));
+ gfx->opaque(bitmap, cliprect, tile,color, 0, 0, x * 8, y * 8);
count++;
}
@@ -597,6 +597,8 @@ PALETTE_INIT_MEMBER(avt_state, avt)
// popmessage("written : %02X", data);
//}
+// [:crtc] M6845: Mode Control 10 is not supported!!!
+
WRITE8_MEMBER( avt_state::avt_6845_address_w )
{
m_crtc_index = data;
@@ -631,9 +633,9 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( avt_portmap, AS_IO, 8, avt_state )
ADDRESS_MAP_GLOBAL_MASK(0xff)
// AM_RANGE(0x00, 0x03) unk, maybe IO
-// AM_RANGE(0x00, 0x00) AM_READ_PORT("IN0")
+// AM_RANGE(0x00, 0x00) AM_READ_PORT("DSW1")
// AM_RANGE(0x01, 0x01) AM_READ_PORT("IN1")
- AM_RANGE(0x02, 0x02) AM_READ_PORT("DSW1")
+ AM_RANGE(0x02, 0x02) AM_READ_PORT("IN0")
// AM_RANGE(0x08, 0x0b) unk, maybe IO
// AM_RANGE(0x08, 0x08) AM_READ_PORT("IN2")
// AM_RANGE(0x09, 0x09) AM_READ_PORT("IN3")
@@ -644,13 +646,67 @@ static ADDRESS_MAP_START( avt_portmap, AS_IO, 8, avt_state )
ADDRESS_MAP_END
/* I/O byte R/W
+ (from avtbingo)
+
+ inputs are throusg port 02h, masked with 0x3F & 0x40.
+
+ 02C3: DB 02 in a,($02)
+ 02C5: 2F cpl
+ 02C6: E6 3F and $3F
+ 02C8: C9 ret
+
+ 02D1: DB 02 in a,($02)
+ 02D3: 2F cpl
+ 02D4: E6 3F and $3F
+ 02D6: CD B2 02 call $02B2
+ 02D9: C9 ret
+
+ 0338: DB 02 in a,($02) --> poll IN0
+ 033A: E6 40 and $40 ------> check for IN0-7 if active.
+ 033C: 28 02 jr z,$0340 --> to continue the program.
+ 033E: AF xor a
+ 033F: C9 ret
+ ....
+ 1ACB: B7 or a
+ 1ACC: 28 03 jr z,$1AD1 --> to continue the program.
+ 1ACE: CD B6 2D call $2DB6 ----> nothing there!!!
+
+
+ poll the port 00h and compare with 0x03
+
+ 1379: 0E 00 ld c,$00
+ 137B: ED 78 in a,(c)
+ 137D: FE 03 cp $03
+ 137F: 20 04 jr nz,$1385
+ ...code continues...
- -----------------
+ -----------------
- unknown writes:
+ unknown writes:
+ [:maincpu] ':maincpu' (01D4): unmapped io memory write to 0001 = 0F & FF
+ [:maincpu] ':maincpu' (01D8): unmapped io memory write to 0009 = 4F & FF
+ [:maincpu] ':maincpu' (01DC): unmapped io memory write to 000B = CF & FF
+ [:maincpu] ':maincpu' (01E0): unmapped io memory write to 000B = C0 & FF
+ [:maincpu] ':maincpu' (01E4): unmapped io memory write to 000A = C0 & FF \
+ [:maincpu] ':maincpu' (02CD): unmapped io memory write to 000A = EE & FF \
+ [:maincpu] ':maincpu' (030E): unmapped io memory write to 000A = C0 & FF > Alternate these values too often... Mux selector?
+ [:maincpu] ':maincpu' (02CD): unmapped io memory write to 000A = EE & FF /
+ [:maincpu] ':maincpu' (030E): unmapped io memory write to 000A = C0 & FF /
+
+ [:maincpu] ':maincpu' (0321): unmapped io memory write to 0003 = 06 & FF \
+ [:maincpu] ':maincpu' (0325): unmapped io memory write to 0003 = CF & FF \
+ [:maincpu] ':maincpu' (0329): unmapped io memory write to 0003 = FF & FF > Unknown commands.
+ [:maincpu] ':maincpu' (032D): unmapped io memory write to 0003 = 97 & FF /
+ [:maincpu] ':maincpu' (0331): unmapped io memory write to 0003 = F7 & FF /
+
+ [:maincpu] ':maincpu' (0335): unmapped io memory write to 000A = C0 & FF \
+ [:maincpu] ':maincpu' (02CD): unmapped io memory write to 000A = EE & FF \
+ [:maincpu] ':maincpu' (030E): unmapped io memory write to 000A = C0 & FF > Same as above...
+ [:maincpu] ':maincpu' (02CD): unmapped io memory write to 000A = EE & FF /
+ [:maincpu] ':maincpu' (030E): unmapped io memory write to 000A = C0 & FF /
avtnfl and avtbingo have similarities.
@@ -659,7 +715,6 @@ ADDRESS_MAP_END
all access a000/c000 with an offset of 0x800 for video.
avtnfl and avtbingo use 28/29 for CRTC.
-
*/
/*********************************************
@@ -823,6 +878,20 @@ static INPUT_PORTS_START( symbols )
INPUT_PORTS_END
+static INPUT_PORTS_START( avtbingo )
+ PORT_START("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_POKER_HOLD3 ) PORT_NAME("Column 3 UP")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_POKER_HOLD2 ) PORT_NAME("Column 2 UP")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_POKER_HOLD1 ) PORT_NAME("Column 1 UP")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_POKER_HOLD5 ) PORT_NAME("Column 5 UP")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_POKER_HOLD4 ) PORT_NAME("Column 4 UP")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_7) PORT_NAME("IN0-7") // Used. Masked 0x40. See code at PC=0338.
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
+INPUT_PORTS_END
+
+
+
/*********************************************
* Graphics Layouts *
*********************************************/
@@ -960,8 +1029,8 @@ ROM_END
* Game Drivers *
*********************************************/
-/* YEAR NAME PARENT MACHINE INPUT INIT ROT COMPANY FULLNAME FLAGS */
-GAME( 1985, avtsym14, 0, avt, symbols, driver_device, 0, ROT0, "Advanced Video Technology", "Symbols (ver 1.4)", MACHINE_NOT_WORKING )
-GAME( 1985, avtsym25, avtsym14, avt, symbols, driver_device, 0, ROT0, "Advanced Video Technology", "Symbols (ver 2.5)", MACHINE_NOT_WORKING )
-GAME( 1985, avtbingo, 0, avt, symbols, driver_device, 0, ROT0, "Advanced Video Technology", "Arrow Bingo", MACHINE_NOT_WORKING )
-GAME( 1989, avtnfl, 0, avt, symbols, driver_device, 0, ROT0, "Advanced Video Technology", "NFL (ver 109)", MACHINE_NOT_WORKING )
+/* YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS */
+GAME( 1985, avtsym14, 0, avt, symbols, driver_device, 0, ROT0, "Advanced Video Technology", "Symbols (ver 1.4)", MACHINE_NOT_WORKING )
+GAME( 1985, avtsym25, avtsym14, avt, symbols, driver_device, 0, ROT0, "Advanced Video Technology", "Symbols (ver 2.5)", MACHINE_NOT_WORKING )
+GAME( 1985, avtbingo, 0, avt, avtbingo, driver_device, 0, ROT0, "Advanced Video Technology", "Arrow Bingo", MACHINE_NOT_WORKING )
+GAME( 1989, avtnfl, 0, avt, symbols, driver_device, 0, ROT0, "Advanced Video Technology", "NFL (ver 109)", MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/aztarac.cpp b/src/mame/drivers/aztarac.cpp
index dcdda3ae0cf..56de6ca3405 100644
--- a/src/mame/drivers/aztarac.cpp
+++ b/src/mame/drivers/aztarac.cpp
@@ -198,22 +198,27 @@ MACHINE_CONFIG_END
ROM_START( aztarac )
ROM_REGION( 0xc000, "maincpu", 0 )
- ROM_LOAD16_BYTE( "l8_6.bin", 0x000000, 0x001000, CRC(25f8da18) SHA1(e8179ba3683e39c8225b549ead74c8af2d0a0b3e) )
- ROM_LOAD16_BYTE( "n8_0.bin", 0x000001, 0x001000, CRC(04e20626) SHA1(2b6a04992037257830df2c01a6da748fb4449f79) )
- ROM_LOAD16_BYTE( "l7_7.bin", 0x002000, 0x001000, CRC(230e244c) SHA1(42283a368144acf2aad2ef390e312e0951c3ea64) )
- ROM_LOAD16_BYTE( "n7_1.bin", 0x002001, 0x001000, CRC(37b12697) SHA1(da288b077902e3205600a021c3fac5730f9fb832) )
- ROM_LOAD16_BYTE( "l6_8.bin", 0x004000, 0x001000, CRC(1293fb9d) SHA1(5a8d512372fd38f1a55f990f5c3eb51833c463d8) )
- ROM_LOAD16_BYTE( "n6_2.bin", 0x004001, 0x001000, CRC(712c206a) SHA1(eb29f161189c14d84896502940e3ab6cc3bd1cd0) )
- ROM_LOAD16_BYTE( "l5_9.bin", 0x006000, 0x001000, CRC(743a6501) SHA1(da83a8f756466bcd94d4b0cc28a1a1858e9532f3) )
- ROM_LOAD16_BYTE( "n5_3.bin", 0x006001, 0x001000, CRC(a65cbf99) SHA1(dd06f98c0989604bd4ac6317e545e1fcf6722e75) )
- ROM_LOAD16_BYTE( "l4_a.bin", 0x008000, 0x001000, CRC(9cf1b0a1) SHA1(dd644026f49d8430c0b4cf4c750dc33c013c19fc) )
- ROM_LOAD16_BYTE( "n4_4.bin", 0x008001, 0x001000, CRC(5f0080d5) SHA1(fb1303f9a02067faea2ac4d523051c416de9cf35) )
- ROM_LOAD16_BYTE( "l3_b.bin", 0x00a000, 0x001000, CRC(8cc7f7fa) SHA1(fefb9a4fdd63878bc5d8138e3e8456cb6638425a) )
- ROM_LOAD16_BYTE( "n3_5.bin", 0x00a001, 0x001000, CRC(40452376) SHA1(1d058b7ecd2bbff3393950aab9215b262908475b) )
+ ROM_LOAD16_BYTE( "6.l8", 0x000000, 0x001000, CRC(25f8da18) SHA1(e8179ba3683e39c8225b549ead74c8af2d0a0b3e) )
+ ROM_LOAD16_BYTE( "0.n8", 0x000001, 0x001000, CRC(04e20626) SHA1(2b6a04992037257830df2c01a6da748fb4449f79) )
+ ROM_LOAD16_BYTE( "7.l7", 0x002000, 0x001000, CRC(230e244c) SHA1(42283a368144acf2aad2ef390e312e0951c3ea64) )
+ ROM_LOAD16_BYTE( "1.n7", 0x002001, 0x001000, CRC(37b12697) SHA1(da288b077902e3205600a021c3fac5730f9fb832) )
+ ROM_LOAD16_BYTE( "8.l6", 0x004000, 0x001000, CRC(1293fb9d) SHA1(5a8d512372fd38f1a55f990f5c3eb51833c463d8) )
+ ROM_LOAD16_BYTE( "2.n6", 0x004001, 0x001000, CRC(712c206a) SHA1(eb29f161189c14d84896502940e3ab6cc3bd1cd0) )
+ ROM_LOAD16_BYTE( "9.l5", 0x006000, 0x001000, CRC(743a6501) SHA1(da83a8f756466bcd94d4b0cc28a1a1858e9532f3) )
+ ROM_LOAD16_BYTE( "3.n5", 0x006001, 0x001000, CRC(a65cbf99) SHA1(dd06f98c0989604bd4ac6317e545e1fcf6722e75) )
+ ROM_LOAD16_BYTE( "a.l4", 0x008000, 0x001000, CRC(9cf1b0a1) SHA1(dd644026f49d8430c0b4cf4c750dc33c013c19fc) )
+ ROM_LOAD16_BYTE( "4.n4", 0x008001, 0x001000, CRC(5f0080d5) SHA1(fb1303f9a02067faea2ac4d523051c416de9cf35) )
+ ROM_LOAD16_BYTE( "b.l3", 0x00a000, 0x001000, CRC(8cc7f7fa) SHA1(fefb9a4fdd63878bc5d8138e3e8456cb6638425a) )
+ ROM_LOAD16_BYTE( "5.n3", 0x00a001, 0x001000, CRC(40452376) SHA1(1d058b7ecd2bbff3393950aab9215b262908475b) )
ROM_REGION( 0x10000, "audiocpu", 0 )
- ROM_LOAD( "j4_c.bin", 0x0000, 0x1000, CRC(e897dfcd) SHA1(750df3d08512d8098a13ec62677831efa164c126) )
- ROM_LOAD( "j3_d.bin", 0x1000, 0x1000, CRC(4016de77) SHA1(7232ec003f1b9d3623d762f3270108a1d1837846) )
+ ROM_LOAD( "c.j4", 0x0000, 0x1000, CRC(e897dfcd) SHA1(750df3d08512d8098a13ec62677831efa164c126) )
+ ROM_LOAD( "d.j3", 0x1000, 0x1000, CRC(4016de77) SHA1(7232ec003f1b9d3623d762f3270108a1d1837846) )
+
+ ROM_REGION( 0x3000, "proms", 0 ) /* not hooked up */
+ ROM_LOAD( "l5.l5", 0x0000, 0x0020, CRC(317fb438) SHA1(3130e1dbde06228707ba46ae85d8df8cc8f32b67) )
+ ROM_LOAD( "k8.k8", 0x0000, 0x1000, CRC(596ad8d9) SHA1(7e2d2d3e02712911ef5ef55d1df5740f6ec28bcb) )
+ ROM_LOAD( "k9.k9", 0x0000, 0x1000, CRC(b8544823) SHA1(78ff1fcb7e640929765533592015cfccef690179) )
ROM_END
diff --git a/src/mame/drivers/bublbobl.cpp b/src/mame/drivers/bublbobl.cpp
index fc5ff1f7d10..8c84a56b31b 100644
--- a/src/mame/drivers/bublbobl.cpp
+++ b/src/mame/drivers/bublbobl.cpp
@@ -804,7 +804,7 @@ static MACHINE_CONFIG_START( tokio, bublbobl_state )
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( tokiob, tokio )
-
+
MCFG_DEVICE_REMOVE("maincpu")
MCFG_DEVICE_REMOVE("bmcu")
diff --git a/src/mame/drivers/bwidow.cpp b/src/mame/drivers/bwidow.cpp
index 3eb06741e9e..e9d7c1c4629 100644
--- a/src/mame/drivers/bwidow.cpp
+++ b/src/mame/drivers/bwidow.cpp
@@ -447,7 +447,7 @@ static INPUT_PORTS_START( bwidow )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN1 ) // To fit "Coin A" Dip Switch
PORT_BIT( 0x0c, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_SERVICE( 0x10, IP_ACTIVE_LOW )
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Diagnostic Step") PORT_CODE(KEYCODE_F1)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Diagnostic Step")
/* bit 6 is the VG HALT bit. We set it to "low" */
/* per default (busy vector processor). */
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER("avg", avg_device, done_r, nullptr)
@@ -525,7 +525,7 @@ static INPUT_PORTS_START( gravitar )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN1 ) // To fit "Coin A" Dip Switch
PORT_BIT( 0x0c, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_SERVICE( 0x10, IP_ACTIVE_LOW )
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Diagnostic Step") PORT_CODE(KEYCODE_F1)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Diagnostic Step")
/* bit 6 is the VG HALT bit. We set it to "low" */
/* per default (busy vector processor). */
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER("avg", avg_device, done_r, nullptr)
@@ -633,7 +633,7 @@ static INPUT_PORTS_START( spacduel )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN1 ) // To fit "Coin A" Dip Switch
PORT_BIT( 0x0c, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_SERVICE( 0x10, IP_ACTIVE_LOW )
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Diagnostic Step") PORT_CODE(KEYCODE_F1)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Diagnostic Step")
/* bit 6 is the VG HALT bit. We set it to "low" */
/* per default (busy vector processor). */
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER("avg", avg_device, done_r, nullptr)
diff --git a/src/mame/drivers/bzone.cpp b/src/mame/drivers/bzone.cpp
index f95bf75f3d7..2da43382822 100644
--- a/src/mame/drivers/bzone.cpp
+++ b/src/mame/drivers/bzone.cpp
@@ -355,7 +355,7 @@ ADDRESS_MAP_END
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )\
PORT_BIT( 0x0c, IP_ACTIVE_LOW, IPT_UNUSED )\
PORT_SERVICE( 0x10, IP_ACTIVE_LOW )\
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Diagnostic Step") PORT_CODE(KEYCODE_F1)\
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Diagnostic Step") \
/* bit 6 is the VG HALT bit. We set it to "low" */\
/* per default (busy vector processor). */\
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER("avg", avg_bzone_device, done_r, nullptr)\
diff --git a/src/mame/drivers/cc40.cpp b/src/mame/drivers/cc40.cpp
index d17b7ffca90..e6b97398ebd 100644
--- a/src/mame/drivers/cc40.cpp
+++ b/src/mame/drivers/cc40.cpp
@@ -108,21 +108,21 @@ public:
memory_region *m_cart_rom;
- uint8_t m_bus_control;
- uint8_t m_power;
- uint8_t m_banks;
- uint8_t m_clock_control;
- uint8_t m_clock_divider;
- uint8_t m_key_select;
-
- std::unique_ptr<uint8_t[]> m_sysram[2];
- uint16_t m_sysram_size[2];
- uint16_t m_sysram_end[2];
- uint16_t m_sysram_mask[2];
+ u8 m_bus_control;
+ u8 m_power;
+ u8 m_banks;
+ u8 m_clock_control;
+ u8 m_clock_divider;
+ u8 m_key_select;
+
+ std::unique_ptr<u8[]> m_sysram[2];
+ u16 m_sysram_size[2];
+ u16 m_sysram_end[2];
+ u16 m_sysram_mask[2];
void postload();
- void init_sysram(int chip, uint16_t size);
- void update_lcd_indicator(uint8_t y, uint8_t x, int state);
+ void init_sysram(int chip, u16 size);
+ void update_lcd_indicator(u8 y, u8 x, int state);
void update_clock_divider();
DECLARE_READ8_MEMBER(sysram_r);
@@ -156,7 +156,7 @@ public:
DEVICE_IMAGE_LOAD_MEMBER(cc40_state, cc40_cartridge)
{
- uint32_t size = m_cart->common_get_size("rom");
+ u32 size = m_cart->common_get_size("rom");
// max size is 4*32KB
if (size > 0x20000)
@@ -186,7 +186,7 @@ PALETTE_INIT_MEMBER(cc40_state, cc40)
palette.set_pen_color(2, rgb_t(131, 136, 139)); // lcd pixel off
}
-void cc40_state::update_lcd_indicator(uint8_t y, uint8_t x, int state)
+void cc40_state::update_lcd_indicator(u8 y, u8 x, int state)
{
// reference _________________...
// output# |10 11 12 13 14 0 1 2 3 4
@@ -336,7 +336,7 @@ WRITE8_MEMBER(cc40_state::clock_control_w)
READ8_MEMBER(cc40_state::keyboard_r)
{
- uint8_t ret = 0;
+ u8 ret = 0;
// read selected keyboard rows
for (int i = 0; i < 8; i++)
@@ -510,12 +510,12 @@ void cc40_state::machine_reset()
bankswitch_w(space, 0, 0);
}
-void cc40_state::init_sysram(int chip, uint16_t size)
+void cc40_state::init_sysram(int chip, u16 size)
{
if (m_sysram[chip] == nullptr)
{
// init to largest possible
- m_sysram[chip] = std::make_unique<uint8_t[]>(0x2000);
+ m_sysram[chip] = std::make_unique<u8[]>(0x2000);
save_pointer(NAME(m_sysram[chip].get()), 0x2000, chip);
save_item(NAME(m_sysram_size[chip]), chip);
diff --git a/src/mame/drivers/cclimber.cpp b/src/mame/drivers/cclimber.cpp
index 79d17c18954..65f4aca72f1 100644
--- a/src/mame/drivers/cclimber.cpp
+++ b/src/mame/drivers/cclimber.cpp
@@ -308,6 +308,13 @@ WRITE8_MEMBER(cclimber_state::nmi_mask_w)
}
+READ8_MEMBER(cclimber_state::bagmanf_a000_r)
+{
+ // Should this actually use the same PAL16R6 as the parent set?
+ return 0x3f;
+}
+
+
/* Note that River Patrol reads/writes to a000-a4f0. This is a bug in the code.
The instruction at 0x0593 should say LD DE,$8000 */
@@ -436,22 +443,23 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( bagmanf_map, AS_PROGRAM, 8, cclimber_state )
AM_RANGE(0x0000, 0x5fff) AM_ROM
AM_RANGE(0x6000, 0x6bff) AM_RAM /* Crazy Kong only */
- AM_RANGE(0x8000, 0x83ff) AM_RAM
- AM_RANGE(0x8800, 0x88ff) AM_RAM AM_SHARE("bigspriteram")
+ AM_RANGE(0x8000, 0x8000) AM_READ_PORT("P1")
+ AM_RANGE(0x8800, 0x8800) AM_READ_PORT("P2")
+ AM_RANGE(0x8800, 0x88ff) AM_RAM AM_SHARE("bigspriteram") // wrong
AM_RANGE(0x8900, 0x8bff) AM_RAM /* not used, but initialized */
AM_RANGE(0x9000, 0x93ff) AM_RAM AM_SHARE("videoram")
AM_RANGE(0xffe0, 0xffff) AM_RAM AM_SHARE("column_scroll") // wrong, is this area even connected?
+ AM_RANGE(0x9800, 0x9800) AM_READ_PORT("SYSTEM")
AM_RANGE(0x9800, 0x981f) AM_RAM AM_SHARE("spriteram")
AM_RANGE(0x98dc, 0x98df) AM_RAM AM_SHARE("bigspritectrl") // wrong
AM_RANGE(0x9800, 0x9bff) AM_RAM AM_SHARE("colorram")
AM_RANGE(0x9c00, 0x9fff) AM_RAM /* not used, but initialized */
- AM_RANGE(0xa000, 0xa000) AM_READ_PORT("P1") AM_WRITE(nmi_mask_w)
+ AM_RANGE(0xa000, 0xa000) AM_READ(bagmanf_a000_r) AM_WRITE(nmi_mask_w)
AM_RANGE(0xa001, 0xa002) AM_WRITEONLY AM_SHARE("flip_screen")
AM_RANGE(0xa004, 0xa004) AM_DEVWRITE("cclimber_audio", cclimber_audio_device, sample_trigger_w)
-
- AM_RANGE(0xa800, 0xa800) AM_READ_PORT("P2") AM_DEVWRITE("cclimber_audio", cclimber_audio_device, sample_rate_w)
+ AM_RANGE(0xa800, 0xa800) AM_READNOP AM_DEVWRITE("cclimber_audio", cclimber_audio_device, sample_rate_w)
AM_RANGE(0xb000, 0xb000) AM_READ_PORT("DSW") AM_DEVWRITE("cclimber_audio", cclimber_audio_device, sample_volume_w)
- AM_RANGE(0xb800, 0xb800) AM_READ_PORT("SYSTEM")
+ AM_RANGE(0xb800, 0xb800) AM_READNOP
ADDRESS_MAP_END
static ADDRESS_MAP_START( toprollr_decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, cclimber_state )
@@ -613,27 +621,9 @@ static INPUT_PORTS_START( ckong )
INPUT_PORTS_END
static INPUT_PORTS_START( bagmanf )
- PORT_START("P1")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 )
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 )
-
- PORT_START("P2")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN3 )
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN4 )
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START2 )
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_COCKTAIL
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_COCKTAIL
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_COCKTAIL
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
+ PORT_INCLUDE( ckong )
- PORT_START("DSW")
+ PORT_MODIFY("DSW")
PORT_DIPNAME( 0x03, 0x02, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW1:1,2")
PORT_DIPSETTING( 0x03, "2" )
PORT_DIPSETTING( 0x02, "3" )
@@ -656,8 +646,6 @@ static INPUT_PORTS_START( bagmanf )
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Cabinet ) ) /* Cabinet type set through edge connector, not dip switch (verified on real pcb) */
PORT_DIPSETTING( 0x80, DEF_STR( Upright ) )
PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) )
-
- PORT_START("SYSTEM")
INPUT_PORTS_END
/* Similar to normal Crazy Kong except for the lives per game */
@@ -2277,6 +2265,7 @@ ROM_END
this set also explains why the cannonball set above contained a number of bagman roms, it was clearly
a half-converted board.
+ A bootleg of "Le Bagnard" with a KCK-series motherboard has also been observed.
*/
ROM_START( bagmanf )
ROM_REGION( 0x6000, "maincpu", 0 )
@@ -2297,8 +2286,8 @@ ROM_START( bagmanf )
ROM_REGION( 0x2000, "gfx2", ROMREGION_ERASE00 )
ROM_REGION( 0x0060, "proms", 0 )
- ROM_LOAD( "v6", 0x0000, 0x0020, CRC(b3fc1505) SHA1(5b94adde0428a26b815c7eb9b3f3716470d349c7) )
- ROM_LOAD( "u6", 0x0020, 0x0020, CRC(26aada9e) SHA1(f59645e606ea4f0dd0fc4ea47dd03f526c534941) )
+ ROM_LOAD( "v6", 0x0020, 0x0020, CRC(b3fc1505) SHA1(5b94adde0428a26b815c7eb9b3f3716470d349c7) )
+ ROM_LOAD( "u6", 0x0000, 0x0020, CRC(26aada9e) SHA1(f59645e606ea4f0dd0fc4ea47dd03f526c534941) )
ROM_LOAD( "t6", 0x0040, 0x0020, CRC(676b3166) SHA1(29b9434cd34d43ea5664e436e2a24b54f8d88aac) )
/* as well as one of the program roms, the daughterboard contains the speech hardware + roms */
diff --git a/src/mame/drivers/cdi.cpp b/src/mame/drivers/cdi.cpp
index a2c70c94c23..0cdcea594ee 100644
--- a/src/mame/drivers/cdi.cpp
+++ b/src/mame/drivers/cdi.cpp
@@ -950,7 +950,7 @@ static MACHINE_CONFIG_DERIVED( quizard1, quizard )
MCFG_CPU_ADD("mcu", I8751, 8000000)
MCFG_CPU_IO_MAP(mcu_io_map)
-// MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cdi_state, irq0_line_pulse)
+// MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cdi_state, irq0_line_pulse)
MACHINE_CONFIG_END
@@ -967,7 +967,7 @@ static MACHINE_CONFIG_DERIVED( quizard4, quizard )
MCFG_CPU_ADD("mcu", I8751, 8000000)
MCFG_CPU_IO_MAP(mcu_io_map)
-// MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cdi_state, irq0_line_pulse)
+// MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cdi_state, irq0_line_pulse)
MACHINE_CONFIG_END
@@ -1058,12 +1058,12 @@ ROM_END
/* Quizard notes
- The MCU controls the protection sequence, which in turn controls the game display language.
- Each Quizard game (1,2,3,4) requires it's own MCU, you can upgrade between revisions by changing
- just the CD, but not between games as a new MCU is required.
+ The MCU controls the protection sequence, which in turn controls the game display language.
+ Each Quizard game (1,2,3,4) requires it's own MCU, you can upgrade between revisions by changing
+ just the CD, but not between games as a new MCU is required.
- The only dumped MCUs are German region ones for Quizard 1 and 4.
- A Czech Quizard 4 MCU was located but it was an 89c51 type instead
+ The only dumped MCUs are German region ones for Quizard 1 and 4.
+ A Czech Quizard 4 MCU was located but it was an 89c51 type instead
*/
@@ -1084,7 +1084,7 @@ ROM_START( quizard ) /* CD-ROM printed ??/?? */
DISK_IMAGE_READONLY( "quizard18", 0, BAD_DUMP SHA1(ede873b22957f2a707bbd3039e962ef2ca5aedbd) )
ROM_REGION(0x1000, "mcu", 0)
- ROM_LOAD( "quizard1_german_d8751.bin", 0x0000, 0x1000, CRC(95f45b6b) SHA1(51b34956539b1e2cf0306f243a970750f1e18d01) )
+ ROM_LOAD( "quizard1_german_d8751.bin", 0x0000, 0x1000, CRC(95f45b6b) SHA1(51b34956539b1e2cf0306f243a970750f1e18d01) ) // confirmed good on original hardware
ROM_END
@@ -1102,7 +1102,7 @@ ROM_START( quizard_17 )
DISK_IMAGE_READONLY( "quizard17", 0, BAD_DUMP SHA1(4bd698f076505b4e17be978481bce027eb47123b) )
ROM_REGION(0x1000, "mcu", 0)
- ROM_LOAD( "quizard1_german_d8751.bin", 0x0000, 0x1000, CRC(95f45b6b) SHA1(51b34956539b1e2cf0306f243a970750f1e18d01) )
+ ROM_LOAD( "quizard1_german_d8751.bin", 0x0000, 0x1000, CRC(95f45b6b) SHA1(51b34956539b1e2cf0306f243a970750f1e18d01) ) // confirmed good on original hardware
ROM_END
ROM_START( quizard_12 ) /* CD-ROM printed 01/95 */
@@ -1119,7 +1119,7 @@ ROM_START( quizard_12 ) /* CD-ROM printed 01/95 */
DISK_IMAGE_READONLY( "quizard12", 0, BAD_DUMP SHA1(6e41683b96b74e903040842aeb18437ad7813c82) )
ROM_REGION(0x1000, "mcu", 0)
- ROM_LOAD( "quizard1_german_d8751.bin", 0x0000, 0x1000, CRC(95f45b6b) SHA1(51b34956539b1e2cf0306f243a970750f1e18d01) )
+ ROM_LOAD( "quizard1_german_d8751.bin", 0x0000, 0x1000, CRC(95f45b6b) SHA1(51b34956539b1e2cf0306f243a970750f1e18d01) ) // confirmed good on original hardware
ROM_END
ROM_START( quizard_10 )
@@ -1139,7 +1139,7 @@ ROM_START( quizard_10 )
DISK_IMAGE_READONLY( "quizard10", 0, SHA1(5715db50f0d5ffe06f47c0943f4bf0481ab6048e) )
ROM_REGION(0x1000, "mcu", 0)
- ROM_LOAD( "quizard1_german_d8751.bin", 0x0000, 0x1000, CRC(95f45b6b) SHA1(51b34956539b1e2cf0306f243a970750f1e18d01) )
+ ROM_LOAD( "quizard1_german_d8751.bin", 0x0000, 0x1000, CRC(95f45b6b) SHA1(51b34956539b1e2cf0306f243a970750f1e18d01) ) // confirmed good on original hardware
ROM_END
@@ -1230,7 +1230,7 @@ ROM_START( quizard4 ) /* CD-ROM printed 09/98 */
DISK_IMAGE_READONLY( "quizard4r42", 0, BAD_DUMP SHA1(a5d5c8950b4650b8753f9119dc7f1ccaa2aa5442) )
ROM_REGION(0x1000, "mcu", 0)
- ROM_LOAD( "quizard4_german_d8751.bin", 0x0000, 0x1000, CRC(77be0b40) SHA1(113b5c239480a2259f55e411ba8fb3972e6d4301) )
+ ROM_LOAD( "quizard4_german_d8751.bin", 0x0000, 0x1000, CRC(77be0b40) SHA1(113b5c239480a2259f55e411ba8fb3972e6d4301) ) // confirmed good on original hardware
ROM_END
ROM_START( quizard4_41 )
@@ -1247,7 +1247,7 @@ ROM_START( quizard4_41 )
DISK_IMAGE_READONLY( "quizard4r41", 0, BAD_DUMP SHA1(2c0484c6545aac8e00b318328c6edce6f5dde43d) )
ROM_REGION(0x1000, "mcu", 0)
- ROM_LOAD( "quizard4_german_d8751.bin", 0x0000, 0x1000, CRC(77be0b40) SHA1(113b5c239480a2259f55e411ba8fb3972e6d4301) )
+ ROM_LOAD( "quizard4_german_d8751.bin", 0x0000, 0x1000, CRC(77be0b40) SHA1(113b5c239480a2259f55e411ba8fb3972e6d4301) ) // confirmed good on original hardware
ROM_END
ROM_START( quizard4_40 ) /* CD-ROM printed 07/97 */
@@ -1264,7 +1264,7 @@ ROM_START( quizard4_40 ) /* CD-ROM printed 07/97 */
DISK_IMAGE_READONLY( "quizard4r40", 0, BAD_DUMP SHA1(288cc37a994e4f1cbd47aa8c92342879c6fc0b87) )
ROM_REGION(0x1000, "mcu", 0)
- ROM_LOAD( "quizard4_german_d8751.bin", 0x0000, 0x1000, CRC(77be0b40) SHA1(113b5c239480a2259f55e411ba8fb3972e6d4301) )
+ ROM_LOAD( "quizard4_german_d8751.bin", 0x0000, 0x1000, CRC(77be0b40) SHA1(113b5c239480a2259f55e411ba8fb3972e6d4301) ) // confirmed good on original hardware
ROM_END
diff --git a/src/mame/drivers/cfx9850.cpp b/src/mame/drivers/cfx9850.cpp
index a3a74af5640..5c120979a51 100644
--- a/src/mame/drivers/cfx9850.cpp
+++ b/src/mame/drivers/cfx9850.cpp
@@ -30,219 +30,185 @@ public:
: driver_device(mconfig, type, tag),
m_video_ram(*this, "video_ram"),
m_display_ram(*this, "display_ram"),
- m_ko1(*this, "KO1"),
- m_ko2(*this, "KO2"),
- m_ko3(*this, "KO3"),
- m_ko4(*this, "KO4"),
- m_ko5(*this, "KO5"),
- m_ko6(*this, "KO6"),
- m_ko7(*this, "KO7"),
- m_ko8(*this, "KO8"),
- m_ko9(*this, "KO9"),
- m_ko10(*this, "KO10"),
- m_ko11(*this, "KO11"),
- m_ko12(*this, "KO12") ,
+ m_ko_port(*this, "KO.%u", 0),
m_maincpu(*this, "maincpu") { }
- DECLARE_WRITE8_MEMBER(cfx9850_kol_w);
- DECLARE_WRITE8_MEMBER(cfx9850_koh_w);
- DECLARE_READ8_MEMBER(cfx9850_ki_r);
- DECLARE_READ8_MEMBER(cfx9850_battery_level_r);
- required_shared_ptr<uint8_t> m_video_ram;
- required_shared_ptr<uint8_t> m_display_ram;
- uint16_t m_ko; /* KO lines KO1 - KO14 */
+ DECLARE_WRITE8_MEMBER(kol_w);
+ DECLARE_WRITE8_MEMBER(koh_w);
+ DECLARE_READ8_MEMBER(ki_r);
+ DECLARE_READ8_MEMBER(in0_r);
+ required_shared_ptr<u8> m_video_ram;
+ required_shared_ptr<u8> m_display_ram;
+ u16 m_ko; // KO lines KO1 - KO14
DECLARE_PALETTE_INIT(cfx9850);
- uint32_t screen_update_cfx9850(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ u32 screen_update_cfx9850(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
protected:
- required_ioport m_ko1;
- required_ioport m_ko2;
- required_ioport m_ko3;
- required_ioport m_ko4;
- required_ioport m_ko5;
- required_ioport m_ko6;
- required_ioport m_ko7;
- required_ioport m_ko8;
- required_ioport m_ko9;
- required_ioport m_ko10;
- required_ioport m_ko11;
- required_ioport m_ko12;
+ required_ioport_array<12> m_ko_port;
required_device<cpu_device> m_maincpu;
};
-static ADDRESS_MAP_START( cfx9850, AS_PROGRAM, 8, cfx9850_state )
+static ADDRESS_MAP_START(cfx9850, AS_PROGRAM, 8, cfx9850_state)
AM_RANGE( 0x000000, 0x007fff ) AM_ROM
AM_RANGE( 0x080000, 0x0807ff ) AM_RAM AM_SHARE("video_ram")
-// AM_RANGE( 0x100000, 0x10ffff ) /* some memory mapped i/o? */
-// AM_RANGE( 0x110000, 0x11ffff ) /* some memory mapped i/o? */
+// AM_RANGE( 0x100000, 0x10ffff ) // some memory mapped i/o?
+// AM_RANGE( 0x110000, 0x11ffff ) // some memory mapped i/o?
AM_RANGE( 0x200000, 0x27ffff ) AM_ROM AM_REGION( "bios", 0 )
AM_RANGE( 0x400000, 0x40ffff ) AM_RAM
AM_RANGE( 0x600000, 0x6007ff ) AM_MIRROR(0xf800) AM_RAM AM_SHARE("display_ram")
-// AM_RANGE( 0xe10000, 0xe1ffff ) /* some memory mapped i/o? */
+// AM_RANGE( 0xe10000, 0xe1ffff ) // some memory mapped i/o?
ADDRESS_MAP_END
-WRITE8_MEMBER( cfx9850_state::cfx9850_kol_w )
+WRITE8_MEMBER(cfx9850_state::kol_w)
{
- m_ko = ( m_ko & 0xff00 ) | data;
+ m_ko = (m_ko & 0xff00) | data;
}
-WRITE8_MEMBER( cfx9850_state::cfx9850_koh_w )
+WRITE8_MEMBER(cfx9850_state::koh_w)
{
- m_ko = ( m_ko & 0x00ff ) | ( data << 8 );
+ m_ko = (m_ko & 0x00ff) | (data << 8);
}
-READ8_MEMBER( cfx9850_state::cfx9850_ki_r )
+READ8_MEMBER(cfx9850_state::ki_r)
{
- uint8_t data = 0;
-
- if ( m_ko & ( 1 << 0 ) ) data |= m_ko1->read();
- if ( m_ko & ( 1 << 1 ) ) data |= m_ko2->read();
- if ( m_ko & ( 1 << 2 ) ) data |= m_ko3->read();
- if ( m_ko & ( 1 << 3 ) ) data |= m_ko4->read();
- if ( m_ko & ( 1 << 4 ) ) data |= m_ko5->read();
- if ( m_ko & ( 1 << 5 ) ) data |= m_ko6->read();
- if ( m_ko & ( 1 << 6 ) ) data |= m_ko7->read();
- if ( m_ko & ( 1 << 7 ) ) data |= m_ko8->read();
- if ( m_ko & ( 1 << 8 ) ) data |= m_ko9->read();
- if ( m_ko & ( 1 << 9 ) ) data |= m_ko10->read();
- if ( m_ko & ( 1 << 10 ) ) data |= m_ko11->read();
- if ( m_ko & ( 1 << 11 ) ) data |= m_ko12->read();
+ u8 data = 0;
+
+ for (int i = 0; i < 12; i++)
+ {
+ if (BIT(m_ko, i))
+ {
+ data |= m_ko_port[i]->read();
+ }
+ }
return data;
}
-READ8_MEMBER( cfx9850_state::cfx9850_battery_level_r )
+READ8_MEMBER(cfx9850_state::in0_r)
{
+ // battery level
return 0x30;
}
-static ADDRESS_MAP_START( cfx9850_io, AS_IO, 8, cfx9850_state )
- AM_RANGE( HCD62121_KOL, HCD62121_KOL ) AM_WRITE( cfx9850_kol_w )
- AM_RANGE( HCD62121_KOH, HCD62121_KOH ) AM_WRITE( cfx9850_koh_w )
- AM_RANGE( HCD62121_KI, HCD62121_KI ) AM_READ( cfx9850_ki_r )
- AM_RANGE( HCD62121_IN0, HCD62121_IN0 ) AM_READ( cfx9850_battery_level_r )
-ADDRESS_MAP_END
-
-
-static INPUT_PORTS_START( cfx9850 )
- PORT_START( "KO1" )
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "AC On/Off" ) PORT_CODE(KEYCODE_BACKSLASH)
- PORT_BIT( 0xfe, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START( "KO2" )
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "EXE Enter" ) PORT_CODE(KEYCODE_ENTER)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "(-) Ares" ) PORT_CODE(KEYCODE_MINUS)
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "EXP Pi" ) PORT_CODE(KEYCODE_EQUALS)
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( ". SPACE" ) PORT_CODE(KEYCODE_SPACE)
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "0 Z" ) PORT_CODE(KEYCODE_Z)
- PORT_BIT( 0x83, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START( "KO3" )
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "- ] Y" ) PORT_CODE(KEYCODE_Y)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "+ [ X" ) PORT_CODE(KEYCODE_X)
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "3 W" ) PORT_CODE(KEYCODE_W)
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "2 V" ) PORT_CODE(KEYCODE_V)
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "1 U" ) PORT_CODE(KEYCODE_U)
- PORT_BIT( 0x83, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START( "KO4" )
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "/ } T" ) PORT_CODE(KEYCODE_T)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "* { S" ) PORT_CODE(KEYCODE_S)
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "6 R" ) PORT_CODE(KEYCODE_R)
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "5 Q" ) PORT_CODE(KEYCODE_Q)
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "4 P" ) PORT_CODE(KEYCODE_P)
- PORT_BIT( 0x83, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START( "KO5" )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "DEL DG" ) PORT_CODE(KEYCODE_BACKSPACE)
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "9 O" ) PORT_CODE(KEYCODE_O)
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "8 N" ) PORT_CODE(KEYCODE_N)
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "7 M" ) PORT_CODE(KEYCODE_M)
- PORT_BIT( 0x87, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START( "KO6" )
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "TAB L" ) PORT_CODE(KEYCODE_L)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( ", K" ) PORT_CODE(KEYCODE_K)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( ") x^-1 J" ) PORT_CODE(KEYCODE_J)
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "( .. I" ) PORT_CODE(KEYCODE_I)
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "F<=>0 H" ) PORT_CODE(KEYCODE_H)
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "a b/c G" ) PORT_CODE(KEYCODE_G)
- PORT_BIT( 0x81, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START( "KO7" )
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "tan tan^-1 F" ) PORT_CODE(KEYCODE_F)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "cos cas^-1 E" ) PORT_CODE(KEYCODE_E)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "sin sin^-1 D" ) PORT_CODE(KEYCODE_D)
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "ln e^x C" ) PORT_CODE(KEYCODE_C)
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "log 10^x B" ) PORT_CODE(KEYCODE_B)
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "x,d,t A" ) PORT_CODE(KEYCODE_A)
- PORT_BIT( 0x81, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START( "KO8" )
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "Right" ) PORT_CODE(KEYCODE_RIGHT)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "Down" ) PORT_CODE(KEYCODE_DOWN)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "EXIT QUIT" ) PORT_CODE(KEYCODE_STOP)
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "/\\ .. .." ) PORT_CODE(KEYCODE_COMMA)
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "x^2 sqrt .." ) PORT_CODE(KEYCODE_SLASH)
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "ALPHA ..-LOCK" ) PORT_CODE(KEYCODE_CAPSLOCK)
- PORT_BIT( 0x81, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START( "KO9" )
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "Up" ) PORT_CODE(KEYCODE_UP)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "Left" ) PORT_CODE(KEYCODE_LEFT)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "MENU SET UP" ) PORT_CODE(KEYCODE_OPENBRACE)
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "VARS PRGM" ) PORT_CODE(KEYCODE_CLOSEBRACE)
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "OPTN" ) PORT_CODE(KEYCODE_LCONTROL)
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "SHIFT" ) PORT_CODE(KEYCODE_LSHIFT)
- PORT_BIT( 0x81, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START( "KO10" )
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "F6 G<=>T" ) PORT_CODE(KEYCODE_F6)
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "F5 G-Solv" ) PORT_CODE(KEYCODE_F5)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "F4 Sketch" ) PORT_CODE(KEYCODE_F4)
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "F3 V-Window" ) PORT_CODE(KEYCODE_F3)
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "F2 Zoom" ) PORT_CODE(KEYCODE_F2)
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "F1 Trace" ) PORT_CODE(KEYCODE_F1)
- PORT_BIT( 0x81, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- /* KO11 is not connected */
- PORT_START( "KO11" )
- PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START( "KO12" )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME( "TEST" ) PORT_CODE(KEYCODE_TILDE)
- PORT_BIT( 0xf7, IP_ACTIVE_HIGH, IPT_UNUSED )
+static INPUT_PORTS_START(cfx9850)
+ PORT_START("KO.0")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("AC On/Off") PORT_CODE(KEYCODE_BACKSLASH)
+ PORT_BIT(0xfe, IP_ACTIVE_HIGH, IPT_UNUSED)
+
+ PORT_START("KO.1")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("EXE Enter") PORT_CODE(KEYCODE_ENTER)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("(-) Ares") PORT_CODE(KEYCODE_MINUS)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("EXP Pi") PORT_CODE(KEYCODE_EQUALS)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(". SPACE") PORT_CODE(KEYCODE_SPACE)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("0 Z") PORT_CODE(KEYCODE_Z)
+ PORT_BIT(0x83, IP_ACTIVE_HIGH, IPT_UNUSED)
+
+ PORT_START("KO.2")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("- ] Y") PORT_CODE(KEYCODE_Y)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("+ [ X") PORT_CODE(KEYCODE_X)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("3 W") PORT_CODE(KEYCODE_W)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("2 V") PORT_CODE(KEYCODE_V)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("1 U") PORT_CODE(KEYCODE_U)
+ PORT_BIT(0x83, IP_ACTIVE_HIGH, IPT_UNUSED)
+
+ PORT_START("KO.3")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("/ } T") PORT_CODE(KEYCODE_T)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("* { S") PORT_CODE(KEYCODE_S)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("6 R") PORT_CODE(KEYCODE_R)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("5 Q") PORT_CODE(KEYCODE_Q)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("4 P") PORT_CODE(KEYCODE_P)
+ PORT_BIT(0x83, IP_ACTIVE_HIGH, IPT_UNUSED)
+
+ PORT_START("KO.4")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("DEL DG") PORT_CODE(KEYCODE_BACKSPACE)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("9 O") PORT_CODE(KEYCODE_O)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("8 N") PORT_CODE(KEYCODE_N)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("7 M") PORT_CODE(KEYCODE_M)
+ PORT_BIT(0x87, IP_ACTIVE_HIGH, IPT_UNUSED)
+
+ PORT_START("KO.5")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("TAB L") PORT_CODE(KEYCODE_L)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(", K") PORT_CODE(KEYCODE_K)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(") x^-1 J") PORT_CODE(KEYCODE_J)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("( .. I") PORT_CODE(KEYCODE_I)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F<=>0 H") PORT_CODE(KEYCODE_H)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("a b/c G") PORT_CODE(KEYCODE_G)
+ PORT_BIT(0x81, IP_ACTIVE_HIGH, IPT_UNUSED)
+
+ PORT_START("KO.6")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("tan tan^-1 F") PORT_CODE(KEYCODE_F)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("cos cas^-1 E") PORT_CODE(KEYCODE_E)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("sin sin^-1 D") PORT_CODE(KEYCODE_D)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ln e^x C") PORT_CODE(KEYCODE_C)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("log 10^x B") PORT_CODE(KEYCODE_B)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("x,d,t A") PORT_CODE(KEYCODE_A)
+ PORT_BIT(0x81, IP_ACTIVE_HIGH, IPT_UNUSED)
+
+ PORT_START("KO.7")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Right") PORT_CODE(KEYCODE_RIGHT)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Down") PORT_CODE(KEYCODE_DOWN)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("EXIT QUIT") PORT_CODE(KEYCODE_STOP)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("/\\ .. ..") PORT_CODE(KEYCODE_COMMA)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("x^2 sqrt ..") PORT_CODE(KEYCODE_SLASH)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ALPHA ..-LOCK") PORT_CODE(KEYCODE_CAPSLOCK)
+ PORT_BIT(0x81, IP_ACTIVE_HIGH, IPT_UNUSED)
+
+ PORT_START("KO.8")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Up") PORT_CODE(KEYCODE_UP)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Left") PORT_CODE(KEYCODE_LEFT)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("MENU SET UP") PORT_CODE(KEYCODE_OPENBRACE)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("VARS PRGM") PORT_CODE(KEYCODE_CLOSEBRACE)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("OPTN") PORT_CODE(KEYCODE_LCONTROL)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT)
+ PORT_BIT(0x81, IP_ACTIVE_HIGH, IPT_UNUSED)
+
+ PORT_START("KO.9")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F6 G<=>T") PORT_CODE(KEYCODE_F6)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F5 G-Solv") PORT_CODE(KEYCODE_F5)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F4 Sketch") PORT_CODE(KEYCODE_F4)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F3 V-Window") PORT_CODE(KEYCODE_F3)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F2 Zoom") PORT_CODE(KEYCODE_F2)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F1 Trace") PORT_CODE(KEYCODE_F1)
+ PORT_BIT(0x81, IP_ACTIVE_HIGH, IPT_UNUSED)
+
+ // KO11 is not connected
+ PORT_START("KO.10")
+ PORT_BIT(0xff, IP_ACTIVE_HIGH, IPT_UNUSED)
+
+ PORT_START("KO.11")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("TEST") PORT_CODE(KEYCODE_TILDE)
+ PORT_BIT(0xf7, IP_ACTIVE_HIGH, IPT_UNUSED)
INPUT_PORTS_END
PALETTE_INIT_MEMBER(cfx9850_state, cfx9850)
{
- palette.set_pen_color( 0, 0xff, 0xff, 0xff );
- palette.set_pen_color( 1, 0x00, 0x00, 0xff );
- palette.set_pen_color( 2, 0x00, 0xff, 0x00 );
- palette.set_pen_color( 3, 0xff, 0x00, 0x00 );
+ palette.set_pen_color(0, 0xff, 0xff, 0xff);
+ palette.set_pen_color(1, 0x00, 0x00, 0xff);
+ palette.set_pen_color(2, 0x00, 0xff, 0x00);
+ palette.set_pen_color(3, 0xff, 0x00, 0x00);
}
-uint32_t cfx9850_state::screen_update_cfx9850(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 cfx9850_state::screen_update_cfx9850(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
- uint16_t offset = 0;
+ u16 offset = 0;
- for ( int i = 0; i < 16; i++ )
+ for (int i = 0; i < 16; i++)
{
int x = 120 - i * 8;
- for ( int j = 0; j < 64; j++ )
+ for (int j = 0; j < 64; j++)
{
- uint8_t data1 = m_display_ram[ offset ];
- uint8_t data2 = m_display_ram[ offset + 0x400 ];
+ u8 data1 = m_display_ram[offset];
+ u8 data2 = m_display_ram[offset + 0x400];
- for ( int b = 0; b < 8; b++ )
+ for (int b = 0; b < 8; b++)
{
bitmap.pix16(63-j, x+b) = ( data1 & 0x80 ) ? ( data2 & 0x80 ? 3 : 2 ) : ( data2 & 0x80 ? 1 : 0 );
data1 <<= 1;
@@ -257,37 +223,40 @@ uint32_t cfx9850_state::screen_update_cfx9850(screen_device &screen, bitmap_ind1
}
-static MACHINE_CONFIG_START( cfx9850, cfx9850_state )
- MCFG_CPU_ADD( "maincpu", HCD62121, 4300000 ) /* 4.3 MHz */
- MCFG_CPU_PROGRAM_MAP( cfx9850 )
- MCFG_CPU_IO_MAP( cfx9850_io )
+static MACHINE_CONFIG_START(cfx9850, cfx9850_state)
+ MCFG_CPU_ADD("maincpu", HCD62121, 4300000) /* 4.3 MHz */
+ MCFG_CPU_PROGRAM_MAP(cfx9850)
+ MCFG_HCD62121_KOL_CB(WRITE8(cfx9850_state, kol_w))
+ MCFG_HCD62121_KOH_CB(WRITE8(cfx9850_state, koh_w))
+ MCFG_HCD62121_KI_CB(READ8(cfx9850_state, ki_r))
+ MCFG_HCD62121_IN0_CB(READ8(cfx9850_state, in0_r))
- MCFG_SCREEN_ADD( "screen", LCD )
- MCFG_SCREEN_REFRESH_RATE( 60 )
- MCFG_SCREEN_SIZE( 128, 64 )
- MCFG_SCREEN_VISIBLE_AREA( 0, 127, 0, 63 )
+ MCFG_SCREEN_ADD("screen", LCD)
+ MCFG_SCREEN_REFRESH_RATE(60)
+ MCFG_SCREEN_SIZE(128, 64)
+ MCFG_SCREEN_VISIBLE_AREA(0, 127, 0, 63)
MCFG_SCREEN_UPDATE_DRIVER(cfx9850_state, screen_update_cfx9850)
MCFG_SCREEN_PALETTE("palette")
MCFG_DEFAULT_LAYOUT(layout_lcd)
- /* TODO: It uses a color display, but I'm being lazy here. 3 colour lcd */
- MCFG_PALETTE_ADD( "palette", 4 )
+ // TODO: Verify amount of colors and palette
+ MCFG_PALETTE_ADD("palette", 4)
MCFG_PALETTE_INIT_OWNER(cfx9850_state, cfx9850)
MACHINE_CONFIG_END
-ROM_START( cfx9850 )
- ROM_REGION( 0x8000, "maincpu", 0 )
- ROM_LOAD( "hcd62121.bin", 0x0000, 0x8000, CRC(e72075f8) SHA1(f50d176e1c225dab69abfc67702c9dfb296b6a78) )
+ROM_START(cfx9850)
+ ROM_REGION(0x8000, "maincpu", 0)
+ ROM_LOAD("hcd62121.bin", 0x0000, 0x8000, CRC(e72075f8) SHA1(f50d176e1c225dab69abfc67702c9dfb296b6a78))
- ROM_REGION( 0x80000, "bios", 0 )
- /* No idea yet which rom is what version. */
- ROM_SYSTEM_BIOS( 0, "rom1", "rom1, version unknown" )
- ROMX_LOAD( "cfx9850.bin", 0x00000, 0x80000, CRC(6c9bd903) SHA1(d5b6677ab4e0d3f84e5769e89e8f3d101f98f848), ROM_BIOS(1) )
- ROM_SYSTEM_BIOS( 1, "rom2", "rom2, version unknown" )
- ROMX_LOAD( "cfx9850b.bin", 0x00000, 0x80000, CRC(cd3c497f) SHA1(1d1aa38205eec7aba3ed6bef7389767e38afe075), ROM_BIOS(2) )
+ ROM_REGION(0x80000, "bios", 0)
+ // Unknown yet which rom is which version.
+ ROM_SYSTEM_BIOS(0, "rom1", "rom1, version unknown")
+ ROMX_LOAD("cfx9850.bin", 0x00000, 0x80000, CRC(6c9bd903) SHA1(d5b6677ab4e0d3f84e5769e89e8f3d101f98f848), ROM_BIOS(1))
+ ROM_SYSTEM_BIOS(1, "rom2", "rom2, version unknown")
+ ROMX_LOAD("cfx9850b.bin", 0x00000, 0x80000, CRC(cd3c497f) SHA1(1d1aa38205eec7aba3ed6bef7389767e38afe075), ROM_BIOS(2))
ROM_END
-COMP( 1996, cfx9850, 0, 0, cfx9850, cfx9850, driver_device, 0, "Casio", "CFX-9850G", MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
+COMP(1996, cfx9850, 0, 0, cfx9850, cfx9850, driver_device, 0, "Casio", "CFX-9850G", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
diff --git a/src/mame/drivers/coco12.cpp b/src/mame/drivers/coco12.cpp
index 35a3d776915..7b4c38df94f 100644
--- a/src/mame/drivers/coco12.cpp
+++ b/src/mame/drivers/coco12.cpp
@@ -107,19 +107,6 @@ INPUT_PORTS_END
//-------------------------------------------------
-// INPUT_PORTS( coco_cart_autostart )
-//-------------------------------------------------
-
-INPUT_PORTS_START( coco_cart_autostart )
- PORT_START(CART_AUTOSTART_TAG)
- PORT_CONFNAME( 0x01, 0x01, "Cart Auto-Start" )
- PORT_CONFSETTING( 0x00, DEF_STR( Off ))
- PORT_CONFSETTING( 0x01, DEF_STR( On ))
-INPUT_PORTS_END
-
-
-
-//-------------------------------------------------
// INPUT_PORTS( coco_beckerport )
//-------------------------------------------------
@@ -238,7 +225,6 @@ static INPUT_PORTS_START( coco )
PORT_INCLUDE( coco_keyboard )
PORT_INCLUDE( coco_joystick )
PORT_INCLUDE( coco_analog_control )
- PORT_INCLUDE( coco_cart_autostart )
PORT_INCLUDE( coco_rtc )
PORT_INCLUDE( coco_beckerport )
INPUT_PORTS_END
diff --git a/src/mame/drivers/coco3.cpp b/src/mame/drivers/coco3.cpp
index cefb1940070..15f41f0f42d 100644
--- a/src/mame/drivers/coco3.cpp
+++ b/src/mame/drivers/coco3.cpp
@@ -221,7 +221,6 @@ static INPUT_PORTS_START( coco3 )
PORT_INCLUDE( coco3_keyboard )
PORT_INCLUDE( coco3_joystick )
PORT_INCLUDE( coco_analog_control )
- PORT_INCLUDE( coco_cart_autostart )
PORT_INCLUDE( coco_rat_mouse )
PORT_INCLUDE( coco_lightgun )
PORT_INCLUDE( coco_rtc )
diff --git a/src/mame/drivers/cubo.cpp b/src/mame/drivers/cubo.cpp
index d16ecd6a5e5..b0240f3d3b3 100644
--- a/src/mame/drivers/cubo.cpp
+++ b/src/mame/drivers/cubo.cpp
@@ -1049,11 +1049,13 @@ static MACHINE_CONFIG_START( cubo, cubo_state )
/* sound hardware */
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
- MCFG_SOUND_ADD("amiga", AMIGA, amiga_state::CLK_C1_PAL)
+ MCFG_SOUND_ADD("amiga", PAULA_8364, amiga_state::CLK_C1_PAL)
MCFG_SOUND_ROUTE(0, "lspeaker", 0.25)
MCFG_SOUND_ROUTE(1, "rspeaker", 0.25)
MCFG_SOUND_ROUTE(2, "rspeaker", 0.25)
MCFG_SOUND_ROUTE(3, "lspeaker", 0.25)
+ MCFG_PAULA_MEM_READ_CB(READ16(amiga_state, chip_ram_r))
+ MCFG_PAULA_INT_CB(WRITELINE(amiga_state, paula_int_w))
MCFG_SOUND_ADD("cdda", CDDA, 0)
MCFG_SOUND_ROUTE(0, "lspeaker", 0.50)
diff --git a/src/mame/drivers/d9final.cpp b/src/mame/drivers/d9final.cpp
index 9d1328e1cc2..f076490d0bc 100644
--- a/src/mame/drivers/d9final.cpp
+++ b/src/mame/drivers/d9final.cpp
@@ -130,7 +130,7 @@ static ADDRESS_MAP_START( d9final_map, AS_PROGRAM, 8, d9final_state )
AM_RANGE(0xd000, 0xd7ff) AM_RAM_WRITE(sc0_lovram) AM_SHARE("lo_vram")
AM_RANGE(0xd800, 0xdfff) AM_RAM_WRITE(sc0_hivram) AM_SHARE("hi_vram")
AM_RANGE(0xe000, 0xe7ff) AM_RAM_WRITE(sc0_cram) AM_SHARE("cram")
- AM_RANGE(0xf000, 0xf007) AM_READ(prot_latch_r) //AM_DEVWRITE("essnd", es8712_device, es8712_w)
+ AM_RANGE(0xf000, 0xf007) AM_READ(prot_latch_r) //AM_DEVREADWRITE("essnd", es8712_device, read, write)
AM_RANGE(0xf800, 0xf80f) AM_DEVREADWRITE("rtc", rtc62421_device, read, write)
ADDRESS_MAP_END
diff --git a/src/mame/drivers/dblcrown.cpp b/src/mame/drivers/dblcrown.cpp
index 257103cd97a..9ba9a8c1525 100644
--- a/src/mame/drivers/dblcrown.cpp
+++ b/src/mame/drivers/dblcrown.cpp
@@ -47,6 +47,7 @@
#include "emu.h"
#include "cpu/z80/z80.h"
#include "sound/ay8910.h"
+#include "machine/i8255.h"
#include "machine/nvram.h"
#include "machine/watchdog.h"
@@ -79,9 +80,7 @@ public:
std::unique_ptr<uint8_t[]> m_vram;
uint8_t m_vram_bank[2];
uint8_t m_mux_data;
- uint8_t m_lamps_data;
- DECLARE_READ8_MEMBER(bank_r);
DECLARE_WRITE8_MEMBER(bank_w);
DECLARE_READ8_MEMBER(irq_source_r);
DECLARE_WRITE8_MEMBER(irq_source_w);
@@ -91,12 +90,10 @@ public:
DECLARE_WRITE8_MEMBER(vram_w);
DECLARE_READ8_MEMBER(vram_bank_r);
DECLARE_WRITE8_MEMBER(vram_bank_w);
- DECLARE_READ8_MEMBER(mux_r);
DECLARE_WRITE8_MEMBER(mux_w);
DECLARE_READ8_MEMBER(in_mux_r);
DECLARE_READ8_MEMBER(in_mux_type_r);
DECLARE_WRITE8_MEMBER(output_w);
- DECLARE_READ8_MEMBER(lamps_r);
DECLARE_WRITE8_MEMBER(lamps_w);
DECLARE_WRITE8_MEMBER(watchdog_w);
@@ -159,11 +156,6 @@ uint32_t dblcrown_state::screen_update( screen_device &screen, bitmap_ind16 &bit
return 0;
}
-READ8_MEMBER( dblcrown_state::bank_r)
-{
- return m_bank;
-}
-
WRITE8_MEMBER( dblcrown_state::bank_w)
{
m_bank = data;
@@ -246,11 +238,6 @@ WRITE8_MEMBER( dblcrown_state::vram_bank_w)
printf("vram bank = %02x\n",data);
}
-READ8_MEMBER( dblcrown_state::mux_r)
-{
- return m_mux_data;
-}
-
WRITE8_MEMBER( dblcrown_state::mux_w)
{
m_mux_data = data;
@@ -307,11 +294,6 @@ WRITE8_MEMBER( dblcrown_state::output_w )
}
-READ8_MEMBER( dblcrown_state::lamps_r )
-{
- return m_lamps_data;
-}
-
WRITE8_MEMBER( dblcrown_state::lamps_w )
{
/* bits
@@ -333,8 +315,6 @@ WRITE8_MEMBER( dblcrown_state::lamps_w )
output().set_lamp_value(5, (data >> 5) & 1); /* Hold 3 */
output().set_lamp_value(6, (data >> 6) & 1); /* Hold 2 */
output().set_lamp_value(7, (data >> 7) & 1); /* Hold 1 */
-
- m_lamps_data = data;
}
WRITE8_MEMBER(dblcrown_state::watchdog_w)
@@ -377,10 +357,8 @@ static ADDRESS_MAP_START( dblcrown_io, AS_IO, 8, dblcrown_state )
AM_RANGE(0x03, 0x03) AM_READ_PORT("DSWD")
AM_RANGE(0x04, 0x04) AM_READ(in_mux_r)
AM_RANGE(0x05, 0x05) AM_READ(in_mux_type_r)
- AM_RANGE(0x10, 0x10) AM_READWRITE(lamps_r, lamps_w)
- AM_RANGE(0x11, 0x11) AM_READWRITE(bank_r, bank_w)
- AM_RANGE(0x12, 0x12) AM_READWRITE(mux_r, mux_w)
- AM_RANGE(0x20, 0x21) AM_DEVWRITE("aysnd", ay8910_device, address_data_w)
+ AM_RANGE(0x10, 0x13) AM_DEVREADWRITE("ppi", i8255_device, read, write)
+ AM_RANGE(0x20, 0x21) AM_DEVWRITE("ymz", ymz284_device, address_data_w)
AM_RANGE(0x30, 0x30) AM_WRITE(watchdog_w)
AM_RANGE(0x40, 0x40) AM_WRITE(output_w)
ADDRESS_MAP_END
@@ -638,9 +616,14 @@ static MACHINE_CONFIG_START( dblcrown, dblcrown_state )
MCFG_NVRAM_ADD_0FILL("nvram")
+ MCFG_DEVICE_ADD("ppi", I8255, 0)
+ MCFG_I8255_OUT_PORTA_CB(WRITE8(dblcrown_state, lamps_w))
+ MCFG_I8255_OUT_PORTB_CB(WRITE8(dblcrown_state, bank_w))
+ MCFG_I8255_OUT_PORTC_CB(WRITE8(dblcrown_state, mux_w))
+
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
- MCFG_SOUND_ADD("aysnd", AY8910, SND_CLOCK)
+ MCFG_SOUND_ADD("ymz", YMZ284, SND_CLOCK)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75)
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/dccons.cpp b/src/mame/drivers/dccons.cpp
index 68f36b83194..cb96b4c7f88 100644
--- a/src/mame/drivers/dccons.cpp
+++ b/src/mame/drivers/dccons.cpp
@@ -347,16 +347,6 @@ WRITE64_MEMBER(dc_cons_state::dc_pdtra_w )
PDTRA = (data & 0xffff);
}
-READ64_MEMBER(dc_cons_state::dc_arm_r )
-{
- return *((uint64_t *)dc_sound_ram.target()+offset);
-}
-
-WRITE64_MEMBER(dc_cons_state::dc_arm_w )
-{
- COMBINE_DATA((uint64_t *)dc_sound_ram.target() + offset);
-}
-
#if 0
READ8_MEMBER(dc_cons_state::dc_flash_r)
{
@@ -383,7 +373,7 @@ static ADDRESS_MAP_START( dc_map, AS_PROGRAM, 64, dc_cons_state )
AM_RANGE(0x00600000, 0x006007ff) AM_READWRITE(dc_modem_r, dc_modem_w )
AM_RANGE(0x00700000, 0x00707fff) AM_READWRITE32(dc_aica_reg_r, dc_aica_reg_w, 0xffffffffffffffffU)
AM_RANGE(0x00710000, 0x0071000f) AM_MIRROR(0x02000000) AM_DEVREADWRITE16("aicartc", aicartc_device, read, write, 0x0000ffff0000ffffU )
- AM_RANGE(0x00800000, 0x009fffff) AM_READWRITE(dc_arm_r, dc_arm_w )
+ AM_RANGE(0x00800000, 0x009fffff) AM_READWRITE(sh4_soundram_r, sh4_soundram_w )
// AM_RANGE(0x01000000, 0x01ffffff) G2 Ext Device #1
// AM_RANGE(0x02700000, 0x02707fff) AICA reg mirror
// AM_RANGE(0x02800000, 0x02ffffff) AICA wave mem mirror
@@ -564,9 +554,9 @@ static INPUT_PORTS_START( dc )
//A4 - A5, second analog stick, unused on DC
PORT_START("MAMEDEBUG")
- PORT_DIPNAME( 0x01, 0x00, "Bilinear Filtering" )
- PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x01, DEF_STR( On ) )
+ PORT_CONFNAME( 0x01, 0x00, "Bilinear Filtering" )
+ PORT_CONFSETTING( 0x00, DEF_STR( Off ) )
+ PORT_CONFSETTING( 0x01, DEF_STR( On ) )
PORT_START("SCREEN_TYPE")
PORT_CONFNAME( 0x03, 0x03, "Screen Connection Type" )
@@ -575,27 +565,6 @@ static INPUT_PORTS_START( dc )
PORT_CONFSETTING( 0x03, "S-Video" )
INPUT_PORTS_END
-MACHINE_RESET_MEMBER(dc_cons_state,dc_console)
-{
- dc_state::machine_reset();
- m_aica->set_ram_base(dc_sound_ram, 2*1024*1024);
-}
-
-WRITE_LINE_MEMBER(dc_cons_state::aica_irq)
-{
- m_soundcpu->set_input_line(ARM7_FIRQ_LINE, state ? ASSERT_LINE : CLEAR_LINE);
-}
-
-WRITE_LINE_MEMBER(dc_cons_state::sh4_aica_irq)
-{
- if(state)
- dc_sysctrl_regs[SB_ISTEXT] |= IST_EXT_AICA;
- else
- dc_sysctrl_regs[SB_ISTEXT] &= ~IST_EXT_AICA;
-
- dc_update_interrupt_status();
-}
-
static MACHINE_CONFIG_FRAGMENT( gdrom_config )
MCFG_DEVICE_MODIFY("cdda")
MCFG_SOUND_ROUTE(0, "^^^^lspeaker", 1.0)
@@ -642,8 +611,8 @@ static MACHINE_CONFIG_START( dc, dc_cons_state )
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
MCFG_SOUND_ADD("aica", AICA, 0)
MCFG_AICA_MASTER
- MCFG_AICA_IRQ_CB(WRITELINE(dc_cons_state, aica_irq))
- MCFG_AICA_MAIN_IRQ_CB(WRITELINE(dc_cons_state, sh4_aica_irq))
+ MCFG_AICA_IRQ_CB(WRITELINE(dc_state, aica_irq))
+ MCFG_AICA_MAIN_IRQ_CB(WRITELINE(dc_state, sh4_aica_irq))
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
MCFG_SOUND_ROUTE(0, "rspeaker", 1.0)
diff --git a/src/mame/drivers/ddragon.cpp b/src/mame/drivers/ddragon.cpp
index 00b93ff2efa..0ceccf6eec9 100644
--- a/src/mame/drivers/ddragon.cpp
+++ b/src/mame/drivers/ddragon.cpp
@@ -55,7 +55,6 @@ Dip locations verified with manual for ddragon & ddragon2
#include "emu.h"
#include "cpu/m6809/hd6309.h"
#include "cpu/m6800/m6800.h"
-#include "cpu/m6805/m68705.h"
#include "cpu/m6809/m6809.h"
#include "cpu/z80/z80.h"
#include "sound/ym2151.h"
@@ -183,7 +182,7 @@ WRITE8_MEMBER(ddragon_state::ddragon_bankswitch_w)
}
-WRITE8_MEMBER(ddragon_state::toffy_bankswitch_w)
+WRITE8_MEMBER(toffy_state::toffy_bankswitch_w)
{
m_scrollx_hi = data & 0x01;
m_scrolly_hi = (data & 0x02) >> 1;
@@ -195,7 +194,7 @@ WRITE8_MEMBER(ddragon_state::toffy_bankswitch_w)
}
-READ8_MEMBER(ddragon_state::darktowr_mcu_bank_r)
+READ8_MEMBER(darktowr_state::darktowr_mcu_bank_r)
{
// logerror("BankRead %05x %08x\n",space.device().safe_pc(),offset);
@@ -216,26 +215,27 @@ READ8_MEMBER(ddragon_state::darktowr_mcu_bank_r)
}
if (offset == 0x1401 || offset == 1)
- return m_darktowr_mcu_ports[0];
+ return m_mcu_port_a_out;
logerror("Unmapped mcu bank read %04x\n",offset);
return 0xff;
}
-WRITE8_MEMBER(ddragon_state::darktowr_mcu_bank_w)
+WRITE8_MEMBER(darktowr_state::darktowr_mcu_bank_w)
{
logerror("BankWrite %05x %08x %08x\n", space.device().safe_pc(), offset, data);
if (offset == 0x1400 || offset == 0)
{
- m_darktowr_mcu_ports[1] = BITSWAP8(data,0,1,2,3,4,5,6,7);
- logerror("MCU PORT 1 -> %04x (from %04x)\n", BITSWAP8(data,0,1,2,3,4,5,6,7), data);
+ uint8_t const value(BITSWAP8(data, 0, 1, 2, 3, 4, 5, 6, 7));
+ m_mcu->pb_w(space, 0, value);
+ logerror("MCU PORT 1 -> %04x (from %04x)\n", value, data);
}
}
-WRITE8_MEMBER(ddragon_state::darktowr_bankswitch_w)
+WRITE8_MEMBER(darktowr_state::darktowr_bankswitch_w)
{
m_scrollx_hi = (data & 0x01);
m_scrolly_hi = ((data & 0x02) >> 1);
@@ -250,7 +250,7 @@ WRITE8_MEMBER(ddragon_state::darktowr_bankswitch_w)
membank("bank1")->set_entry(newbank);
if (newbank == 4 && oldbank != 4)
- space.install_readwrite_handler(0x4000, 0x7fff, read8_delegate(FUNC(ddragon_state::darktowr_mcu_bank_r),this), write8_delegate(FUNC(ddragon_state::darktowr_mcu_bank_w),this));
+ space.install_readwrite_handler(0x4000, 0x7fff, read8_delegate(FUNC(darktowr_state::darktowr_mcu_bank_r),this), write8_delegate(FUNC(darktowr_state::darktowr_mcu_bank_w),this));
else if (newbank != 4 && oldbank == 4)
space.install_readwrite_bank(0x4000, 0x7fff, "bank1");
}
@@ -351,10 +351,10 @@ CUSTOM_INPUT_MEMBER(ddragon_state::subcpu_bus_free)
}
-WRITE8_MEMBER(ddragon_state::darktowr_mcu_w)
+WRITE8_MEMBER(darktowr_state::mcu_port_a_w)
{
- logerror("McuWrite %05x %08x %08x\n",space.device().safe_pc(), offset, data);
- m_darktowr_mcu_ports[offset] = data;
+ logerror("McuWrite %05x %08x %08x\n", space.device().safe_pc(), offset, data);
+ m_mcu_port_a_out = data;
}
@@ -594,21 +594,6 @@ ADDRESS_MAP_END
/*************************************
*
- * MCU memory maps
- *
- *************************************/
-
-static ADDRESS_MAP_START( mcu_map, AS_PROGRAM, 8, ddragon_state )
- ADDRESS_MAP_GLOBAL_MASK(0x7ff)
- AM_RANGE(0x0000, 0x0007) AM_RAM_WRITE(darktowr_mcu_w) AM_SHARE("darktowr_mcu")
- AM_RANGE(0x0008, 0x007f) AM_RAM
- AM_RANGE(0x0080, 0x07ff) AM_ROM
-ADDRESS_MAP_END
-
-
-
-/*************************************
- *
* Input ports
*
*************************************/
@@ -1104,17 +1089,17 @@ static MACHINE_CONFIG_START( ddragon2, ddragon_state )
MACHINE_CONFIG_END
-static MACHINE_CONFIG_DERIVED( darktowr, ddragon )
+static MACHINE_CONFIG_DERIVED_CLASS( darktowr, ddragon, darktowr_state )
/* basic machine hardware */
- MCFG_CPU_ADD("mcu", M68705,XTAL_4MHz)
- MCFG_CPU_PROGRAM_MAP(mcu_map)
+ MCFG_CPU_ADD("mcu", M68705P3, XTAL_4MHz)
+ MCFG_M68705_PORTA_W_CB(WRITE8(darktowr_state, mcu_port_a_w))
/* video hardware */
MACHINE_CONFIG_END
-static MACHINE_CONFIG_DERIVED( toffy, ddragon )
+static MACHINE_CONFIG_DERIVED_CLASS( toffy, ddragon, toffy_state )
/* basic machine hardware */
MCFG_DEVICE_REMOVE("sub")
@@ -1809,7 +1794,7 @@ ROM_START( tstrike )
ROM_REGION( 0x10000, "soundcpu", 0 ) /* audio cpu */
ROM_LOAD( "tstrike.30", 0x08000, 0x08000, CRC(3f3f04a1) SHA1(45d2b4542ec783c1c4122616606be6c160f76c06) )
- ROM_REGION( 0x0800, "mcu", 0 ) /* 8k for the microcontroller */
+ ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
ROM_LOAD( "68705prt.mcu", 0x00000, 0x0800, CRC(34cbb2d3) SHA1(8e0c3b13c636012d88753d547c639b1a8af85680) )
ROM_REGION( 0x08000, "gfx1", 0 )
@@ -1853,7 +1838,7 @@ ROM_START( tstrikea )
ROM_REGION( 0x10000, "soundcpu", 0 ) /* audio cpu */
ROM_LOAD( "tstrike.30", 0x08000, 0x08000, CRC(3f3f04a1) SHA1(45d2b4542ec783c1c4122616606be6c160f76c06) )
- ROM_REGION( 0x0800, "mcu", 0 ) /* 8k for the microcontroller */
+ ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
ROM_LOAD( "68705prt.mcu", 0x00000, 0x0800, CRC(34cbb2d3) SHA1(8e0c3b13c636012d88753d547c639b1a8af85680) )
ROM_REGION( 0x08000, "gfx1", 0 )
@@ -1897,7 +1882,7 @@ ROM_START( ddungeon )
ROM_REGION( 0x10000, "soundcpu", 0 ) /* audio cpu */
ROM_LOAD( "dd30.30", 0x08000, 0x08000, CRC(ef1af99a) SHA1(7ced695b81ca9efbb7b28b78013e112edac85672) )
- ROM_REGION( 0x0800, "mcu", 0 ) /* 8k for the microcontroller */
+ ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
ROM_LOAD( "dd_mcu.bin", 0x00000, 0x0800, CRC(34cbb2d3) SHA1(8e0c3b13c636012d88753d547c639b1a8af85680) )
ROM_REGION( 0x10000, "gfx1", 0 ) /* GFX? */
@@ -1936,7 +1921,7 @@ ROM_START( ddungeone )
ROM_REGION( 0x10000, "soundcpu", 0 ) /* audio cpu */
ROM_LOAD( "21j-0-1", 0x08000, 0x08000, CRC(9efa95bb) SHA1(da997d9cc7b9e7b2c70a4b6d30db693086a6f7d8) ) /* from ddragon */
- ROM_REGION( 0x0800, "mcu", 0 ) /* 8k for the microcontroller */
+ ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
ROM_LOAD( "dd_mcu.bin", 0x00000, 0x0800, CRC(34cbb2d3) SHA1(8e0c3b13c636012d88753d547c639b1a8af85680) )
ROM_REGION( 0x10000, "gfx1", 0 ) /* GFX? */
@@ -1973,7 +1958,7 @@ ROM_START( darktowr )
ROM_REGION( 0x10000, "soundcpu", 0 ) /* audio cpu */
ROM_LOAD( "21j-0-1", 0x08000, 0x08000, CRC(9efa95bb) SHA1(da997d9cc7b9e7b2c70a4b6d30db693086a6f7d8) ) /* from ddragon */
- ROM_REGION( 0x0800, "mcu", 0 ) /* 8k for the microcontroller */
+ ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
ROM_LOAD( "68705prt.mcu", 0x00000, 0x0800, CRC(34cbb2d3) SHA1(8e0c3b13c636012d88753d547c639b1a8af85680) )
ROM_REGION( 0x08000, "gfx1", 0 ) /* chars */
@@ -2090,23 +2075,26 @@ DRIVER_INIT_MEMBER(ddragon_state,ddragon2)
}
-DRIVER_INIT_MEMBER(ddragon_state,darktowr)
+DRIVER_INIT_MEMBER(darktowr_state, darktowr)
{
+ save_item(NAME(m_mcu_port_a_out));
+
m_sprite_irq = INPUT_LINE_NMI;
m_ym_irq = M6809_FIRQ_LINE;
m_technos_video_hw = 0;
- m_maincpu->space(AS_PROGRAM).install_write_handler(0x3808, 0x3808, write8_delegate(FUNC(ddragon_state::darktowr_bankswitch_w),this));
+ m_maincpu->space(AS_PROGRAM).install_write_handler(0x3808, 0x3808, write8_delegate(FUNC(darktowr_state::darktowr_bankswitch_w), this));
+ m_mcu_port_a_out = 0xff;
}
-DRIVER_INIT_MEMBER(ddragon_state,toffy)
+DRIVER_INIT_MEMBER(toffy_state, toffy)
{
int i, length;
uint8_t *rom;
m_ym_irq = M6809_FIRQ_LINE;
m_technos_video_hw = 0;
- m_maincpu->space(AS_PROGRAM).install_write_handler(0x3808, 0x3808, write8_delegate(FUNC(ddragon_state::toffy_bankswitch_w),this));
+ m_maincpu->space(AS_PROGRAM).install_write_handler(0x3808, 0x3808, write8_delegate(FUNC(toffy_state::toffy_bankswitch_w), this));
/* the program rom has a simple bitswap encryption */
rom = memregion("maincpu")->base();
@@ -2170,32 +2158,32 @@ DRIVER_INIT_MEMBER(ddragon_state,ddragon6809)
*
*************************************/
-GAME( 1987, ddragon, 0, ddragon, ddragon, ddragon_state, ddragon, ROT0, "Technos Japan", "Double Dragon (Japan)", MACHINE_SUPPORTS_SAVE )
-GAME( 1987, ddragonw, ddragon, ddragon, ddragon, ddragon_state, ddragon, ROT0, "Technos Japan (Taito license)", "Double Dragon (World set 1)", MACHINE_SUPPORTS_SAVE )
-GAME( 1987, ddragonw1, ddragon, ddragon, ddragon, ddragon_state, ddragon, ROT0, "Technos Japan (Taito license)", "Double Dragon (World set 2)", MACHINE_SUPPORTS_SAVE )
-GAME( 1987, ddragonu, ddragon, ddragon, ddragon, ddragon_state, ddragon, ROT0, "Technos Japan (Taito America license)", "Double Dragon (US set 1)", MACHINE_SUPPORTS_SAVE )
-GAME( 1987, ddragonua, ddragon, ddragon, ddragon, ddragon_state, ddragon, ROT0, "Technos Japan (Taito America license)", "Double Dragon (US set 2)", MACHINE_SUPPORTS_SAVE )
-GAME( 1987, ddragonub, ddragon, ddragon, ddragon, ddragon_state, ddragon, ROT0, "Technos Japan (Taito America license)", "Double Dragon (US set 3)", MACHINE_SUPPORTS_SAVE )
-GAME( 1987, ddragonb2, ddragon, ddragon, ddragon, ddragon_state, ddragon, ROT0, "bootleg", "Double Dragon (bootleg)", MACHINE_SUPPORTS_SAVE )
-GAME( 1987, ddragonb, ddragon, ddragonb, ddragon, ddragon_state, ddragon, ROT0, "bootleg", "Double Dragon (bootleg with HD6309)", MACHINE_SUPPORTS_SAVE ) // according to dump notes
-GAME( 1987, ddragonba, ddragon, ddragonba, ddragon, ddragon_state, ddragon, ROT0, "bootleg", "Double Dragon (bootleg with M6803)", MACHINE_SUPPORTS_SAVE )
-GAME( 1987, ddragon6809, ddragon, ddragon6809, ddragon, ddragon_state, ddragon6809, ROT0, "bootleg", "Double Dragon (bootleg with 3xM6809, set 1)", MACHINE_NOT_WORKING )
-GAME( 1987, ddragon6809a,ddragon, ddragon6809, ddragon, ddragon_state, ddragon6809, ROT0, "bootleg", "Double Dragon (bootleg with 3xM6809, set 2)", MACHINE_NOT_WORKING )
-
-GAME( 1988, ddragon2, 0, ddragon2, ddragon2, ddragon_state, ddragon2, ROT0, "Technos Japan", "Double Dragon II - The Revenge (World)", MACHINE_SUPPORTS_SAVE )
-GAME( 1988, ddragon2u, ddragon2, ddragon2, ddragon2, ddragon_state, ddragon2, ROT0, "Technos Japan", "Double Dragon II - The Revenge (US)", MACHINE_SUPPORTS_SAVE )
-GAME( 1988, ddragon2j, ddragon2, ddragon2, ddragon2, ddragon_state, ddragon2, ROT0, "Technos Japan", "Double Dragon II - The Revenge (Japan)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // bad dump
-GAME( 1988, ddragon2b, ddragon2, ddragon2, ddragon2, ddragon_state, ddragon2, ROT0, "bootleg", "Double Dragon II - The Revenge (US, bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1987, ddragon, 0, ddragon, ddragon, ddragon_state, ddragon, ROT0, "Technos Japan", "Double Dragon (Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1987, ddragonw, ddragon, ddragon, ddragon, ddragon_state, ddragon, ROT0, "Technos Japan (Taito license)", "Double Dragon (World set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1987, ddragonw1, ddragon, ddragon, ddragon, ddragon_state, ddragon, ROT0, "Technos Japan (Taito license)", "Double Dragon (World set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1987, ddragonu, ddragon, ddragon, ddragon, ddragon_state, ddragon, ROT0, "Technos Japan (Taito America license)", "Double Dragon (US set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1987, ddragonua, ddragon, ddragon, ddragon, ddragon_state, ddragon, ROT0, "Technos Japan (Taito America license)", "Double Dragon (US set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1987, ddragonub, ddragon, ddragon, ddragon, ddragon_state, ddragon, ROT0, "Technos Japan (Taito America license)", "Double Dragon (US set 3)", MACHINE_SUPPORTS_SAVE )
+GAME( 1987, ddragonb2, ddragon, ddragon, ddragon, ddragon_state, ddragon, ROT0, "bootleg", "Double Dragon (bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1987, ddragonb, ddragon, ddragonb, ddragon, ddragon_state, ddragon, ROT0, "bootleg", "Double Dragon (bootleg with HD6309)", MACHINE_SUPPORTS_SAVE ) // according to dump notes
+GAME( 1987, ddragonba, ddragon, ddragonba, ddragon, ddragon_state, ddragon, ROT0, "bootleg", "Double Dragon (bootleg with M6803)", MACHINE_SUPPORTS_SAVE )
+GAME( 1987, ddragon6809, ddragon, ddragon6809, ddragon, ddragon_state, ddragon6809, ROT0, "bootleg", "Double Dragon (bootleg with 3xM6809, set 1)", MACHINE_NOT_WORKING )
+GAME( 1987, ddragon6809a,ddragon, ddragon6809, ddragon, ddragon_state, ddragon6809, ROT0, "bootleg", "Double Dragon (bootleg with 3xM6809, set 2)", MACHINE_NOT_WORKING )
+
+GAME( 1988, ddragon2, 0, ddragon2, ddragon2, ddragon_state, ddragon2, ROT0, "Technos Japan", "Double Dragon II - The Revenge (World)", MACHINE_SUPPORTS_SAVE )
+GAME( 1988, ddragon2u, ddragon2, ddragon2, ddragon2, ddragon_state, ddragon2, ROT0, "Technos Japan", "Double Dragon II - The Revenge (US)", MACHINE_SUPPORTS_SAVE )
+GAME( 1988, ddragon2j, ddragon2, ddragon2, ddragon2, ddragon_state, ddragon2, ROT0, "Technos Japan", "Double Dragon II - The Revenge (Japan)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // bad dump
+GAME( 1988, ddragon2b, ddragon2, ddragon2, ddragon2, ddragon_state, ddragon2, ROT0, "bootleg", "Double Dragon II - The Revenge (US, bootleg)", MACHINE_SUPPORTS_SAVE )
/* these were conversions of double dragon */
-GAME( 1991, tstrike, 0, darktowr, tstrike, ddragon_state, darktowr, ROT0, "East Coast Coin Company", "Thunder Strike (set 1)", MACHINE_SUPPORTS_SAVE ) // same manufacturer as The Game Room?
-GAME( 1991, tstrikea, tstrike, darktowr, tstrike, ddragon_state, darktowr, ROT0, "The Game Room", "Thunder Strike (set 2, older)", MACHINE_SUPPORTS_SAVE )
-GAME( 1992, ddungeon, 0, darktowr, ddungeon, ddragon_state, darktowr, ROT0, "The Game Room", "Dangerous Dungeons (set 1)", MACHINE_SUPPORTS_SAVE )
-GAME( 1992, ddungeone,ddungeon, darktowr, ddungeon, ddragon_state, darktowr, ROT0, "East Coast Coin Company", "Dangerous Dungeons (set 2)", MACHINE_SUPPORTS_SAVE )
-GAME( 1992, darktowr, 0, darktowr, darktowr, ddragon_state, darktowr, ROT0, "The Game Room", "Dark Tower", MACHINE_SUPPORTS_SAVE )
+GAME( 1991, tstrike, 0, darktowr, tstrike, darktowr_state, darktowr, ROT0, "East Coast Coin Company", "Thunder Strike (set 1)", MACHINE_SUPPORTS_SAVE ) // same manufacturer as The Game Room?
+GAME( 1991, tstrikea, tstrike, darktowr, tstrike, darktowr_state, darktowr, ROT0, "The Game Room", "Thunder Strike (set 2, older)", MACHINE_SUPPORTS_SAVE )
+GAME( 1992, ddungeon, 0, darktowr, ddungeon, darktowr_state, darktowr, ROT0, "The Game Room", "Dangerous Dungeons (set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1992, ddungeone, ddungeon, darktowr, ddungeon, darktowr_state, darktowr, ROT0, "East Coast Coin Company", "Dangerous Dungeons (set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1992, darktowr, 0, darktowr, darktowr, darktowr_state, darktowr, ROT0, "The Game Room", "Dark Tower", MACHINE_SUPPORTS_SAVE )
/* these run on their own board, but are basically the same game. Toffy even has 'dangerous dungeons' text in it */
-GAME( 1993, toffy, 0, toffy, toffy, ddragon_state, toffy, ROT0, "Midas", "Toffy", MACHINE_SUPPORTS_SAVE )
+GAME( 1993, toffy, 0, toffy, toffy, toffy_state, toffy, ROT0, "Midas", "Toffy", MACHINE_SUPPORTS_SAVE )
-GAME( 1994, stoffy, 0, toffy, toffy, ddragon_state, toffy, ROT0, "Midas", "Super Toffy", MACHINE_SUPPORTS_SAVE )
-GAME( 1994, stoffyu, stoffy, toffy, toffy, ddragon_state, toffy, ROT0, "Midas (Unico license)", "Super Toffy (Unico license)", MACHINE_SUPPORTS_SAVE )
+GAME( 1994, stoffy, 0, toffy, toffy, toffy_state, toffy, ROT0, "Midas", "Super Toffy", MACHINE_SUPPORTS_SAVE )
+GAME( 1994, stoffyu, stoffy, toffy, toffy, toffy_state, toffy, ROT0, "Midas (Unico license)", "Super Toffy (Unico license)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/dec0.cpp b/src/mame/drivers/dec0.cpp
index 11b387ccca6..a04f9106f89 100644
--- a/src/mame/drivers/dec0.cpp
+++ b/src/mame/drivers/dec0.cpp
@@ -51,7 +51,45 @@ ToDo:
- Get rid of ROM patches in Sly Spy and Hippodrome;
- background pen in Birdie Try is presumably wrong.
- Pixel clock frequency isn't verified;
-- Finally, get a proper decap of the MCUs used by Bad Dudes and Birdie Try;
+- Finally, get a proper decap of the MCUs used by Dragonninja and Birdie Try;
+
+
+Bad Dudes MCU dump came from an MCU that had been damaged during a misguided
+attempt at decapping. Data didn't read consistently, and the final dump was
+built up from multiple dumps by taking the most common value for each location.
+It appears there may be one bit error in the dump. The MCU implements a
+command to calculate a program ROM checksum and compare the low byte of the
+result to a value supplied by the host CPU, but with the dump as-is, it doesn't
+work. Here's the code in question:
+
+0AB0: 51 50 acall $0A50
+0AB2: C3 clr c
+0AB3: 48 orl a,r0
+0AB4: 70 02 jnz $0AB8
+0AB6: 80 89 sjmp $0A41
+0AB8: 21 F0 ajmp $09F0
+
+The function at $0A50 reads the expected value from the host, $0A41 is the
+normal command response, and $09F0 is the error response. The orl instruction
+doesn't make sense here. However, changing it from 48 to 60 makes it an xrl
+instruction which would work as expected.
+
+Unfortunately the game doesn't issue this command during the attract loop or
+first level, so I haven't been able to test it. I can't even use the checksum
+function to verify that the program is good because the expected value mod 256
+has to be supplied by the host.
+
+The current Dragonninja MCU program was made by hacking the expected startup
+synchronisation command in the Bad Dudes MCU program (location $09A4 changed
+from $0B to $03). There may be other differences in a real Dragonninja MCU.
+The table of expected values for command 7 is the same for Dragonninja (from
+debugging main CPU program).
+
+Bad Dudes only seems to use commands $0B (sync), $01 (reset if parameter is not
+$3B), $07 (return table index if parameter matches table otherwise reset) and
+$09 (set table index to zero). Dragonninja only seems to use commands $03 (on
+startup), $07 (same function as Bad Dudes) and $09 (same function as Bad
+Dudes). Most of the MCU program isn't utilised.
PCB Layouts
@@ -168,6 +206,7 @@ Notes:
#include "cpu/h6280/h6280.h"
#include "cpu/z80/z80.h"
#include "cpu/mcs51/mcs51.h"
+#include "cpu/m6805/m68705.h"
#include "includes/dec0.h"
#include "sound/2203intf.h"
#include "sound/3812intf.h"
@@ -1560,6 +1599,16 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( baddudes, dec0 )
+ MCFG_CPU_ADD("mcu", I8751, XTAL_8MHz)
+ MCFG_CPU_IO_MAP(mcu_io_map)
+
+ /* video hardware */
+ MCFG_SCREEN_MODIFY("screen")
+ MCFG_SCREEN_UPDATE_DRIVER(dec0_state, screen_update_baddudes)
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_DERIVED( drgninjab, dec0 )
+
/* video hardware */
MCFG_SCREEN_MODIFY("screen")
MCFG_SCREEN_UPDATE_DRIVER(dec0_state, screen_update_baddudes)
@@ -1668,6 +1717,9 @@ static MACHINE_CONFIG_DERIVED( midresb, midres )
MCFG_CPU_REPLACE("audiocpu", M6502, 1500000 )
MCFG_CPU_PROGRAM_MAP(dec0_s_map)
+ MCFG_CPU_ADD("mcu", M68705R3, XTAL_3_579545MHz)
+ MCFG_DEVICE_DISABLE()
+
MCFG_SOUND_MODIFY("ym2")
MCFG_YM3812_IRQ_HANDLER(INPUTLINE("audiocpu", 0))
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
@@ -1685,6 +1737,10 @@ static MACHINE_CONFIG_DERIVED( midresb, midres )
MACHINE_CONFIG_END
+static MACHINE_CONFIG_DERIVED( midresbj, midresb )
+ MCFG_DEVICE_REMOVE("mcu")
+MACHINE_CONFIG_END
+
/******************************************************************************/
ROM_START( hbarrel )
@@ -1795,8 +1851,8 @@ ROM_START( baddudes )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU */
ROM_LOAD( "ei07.8a", 0x8000, 0x8000, CRC(9fb1ef4b) SHA1(f4dd0773be93c2ad8b0faacd12939c531b5aa130) )
- ROM_REGION( 0x1000, "mcu", 0 ) /* i8751 microcontroller */
- ROM_LOAD( "ei31.9a", 0x0000, 0x1000, NO_DUMP )
+ ROM_REGION( 0x1000, "mcu", 0 ) /* i8751 microcontroller - see notes */
+ ROM_LOAD( "ei31.9a", 0x0000, 0x1000, CRC(2a8745d2) SHA1(f15ab17b1e7836d603135f5c66ca2e3d72f6e4a2) BAD_DUMP )
ROM_REGION( 0x10000, "gfx1", 0 ) /* chars */
ROM_LOAD( "ei25.15j", 0x00000, 0x08000, CRC(bcf59a69) SHA1(486727e19c12ea55b47e2ef773d0d0471cf50083) )
@@ -1838,8 +1894,8 @@ ROM_START( drgninja )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU */
ROM_LOAD( "eg07.8a", 0x8000, 0x8000, CRC(001d2f51) SHA1(f186671f0450ccf9201577a5caf0efc490c6645e) )
- ROM_REGION( 0x1000, "mcu", 0 ) /* i8751 microcontroller */
- ROM_LOAD( "i8751", 0x0000, 0x1000, NO_DUMP )
+ ROM_REGION( 0x1000, "mcu", 0 ) /* i8751 microcontroller - using hacked baddudes program */
+ ROM_LOAD( "i8751", 0x0000, 0x1000, CRC(c3f6bc70) SHA1(3c80197dc70c6cb283df5d11d29a9d9baabcd99b) BAD_DUMP )
/* various graphic and sound roms also differ when compared to baddudes */
@@ -2685,7 +2741,7 @@ ROM_START( ffantasybl )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 6502 sound */
ROM_LOAD( "15.bin", 0x8000, 0x8000, CRC(9871b98d) SHA1(2b6c46bc2b10a28946d6ad8251e1a156a0b99947) )
- ROM_REGION( 0x10000, "cpu2", 0 ) /* 68705 MCU */ // (labeled on PCB as Z80, but it isn't!)
+ ROM_REGION( 0x1000, "mcu", 0 ) /* 68705 MCU */ // (labeled on PCB as Z80, but it isn't!)
ROM_LOAD( "68705u3.bin", 0x00000, 0x1000, NO_DUMP ) // nor dumped, maybe it's the same as the midresb one?
ROM_REGION( 0x20000, "gfx1", 0 ) /* chars */
@@ -3181,7 +3237,7 @@ ROM_START( midresb )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 6502 sound */ // same as hippodrome / fighting fantasy...
ROM_LOAD( "15.bin", 0x8000, 0x8000, CRC(9871b98d) SHA1(2b6c46bc2b10a28946d6ad8251e1a156a0b99947) )
- ROM_REGION( 0x10000, "cpu2", 0 ) /* 68705 MCU */
+ ROM_REGION( 0x1000, "mcu", 0 ) /* 68705 MCU */
ROM_LOAD( "68705r3.bin", 0x00000, 0x1000, CRC(ad5b1c13) SHA1(3616dc5969323a54e3e171d169f76250ae4e711a) )
ROM_REGION( 0x20000, "gfx1", 0 ) /* chars */
@@ -3233,7 +3289,7 @@ ROM_START( midresbj )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 6502 sound */
ROM_LOAD( "15", 0x0000, 0x10000, CRC(99d47166) SHA1(a9a1adfe47be8dd3e4d6f8c783447e09be1747b2) )
- ROM_REGION( 0x10000, "cpu2", ROMREGION_ERASE00 ) /* 68705 MCU */
+ ROM_REGION( 0x1000, "mcu", ROMREGION_ERASE00 ) /* 68705 MCU */
//ROM_LOAD( "68705r3.bin", 0x00000, 0x1000, CRC(ad5b1c13) SHA1(3616dc5969323a54e3e171d169f76250ae4e711a) ) // unpopulated socket
ROM_REGION( 0x20000, "gfx1", 0 ) /* chars */
@@ -3381,8 +3437,8 @@ DRIVER_INIT_MEMBER(dec0_state,ffantasybl)
// YEAR, NAME, PARENT, MACHINE, INPUT, STATE/DEVICE, INIT, MONITOR,COMPANY, FULLNAME, FLAGS
GAME( 1987, hbarrel, 0, hbarrel, hbarrel, dec0_state, hbarrel, ROT270, "Data East USA", "Heavy Barrel (US)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, hbarrelw, hbarrel, hbarrel, hbarrel, dec0_state, hbarrel, ROT270, "Data East Corporation", "Heavy Barrel (World)", MACHINE_SUPPORTS_SAVE )
-GAME( 1988, baddudes, 0, baddudes, baddudes, dec0_state, baddudes, ROT0, "Data East USA", "Bad Dudes vs. Dragonninja (US)", MACHINE_SUPPORTS_SAVE )
-GAME( 1988, drgninja, baddudes, baddudes, drgninja, dec0_state, baddudes, ROT0, "Data East Corporation", "Dragonninja (Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1988, baddudes, 0, baddudes, baddudes, dec0_state, hbarrel, ROT0, "Data East USA", "Bad Dudes vs. Dragonninja (US)", MACHINE_SUPPORTS_SAVE )
+GAME( 1988, drgninja, baddudes, baddudes, drgninja, dec0_state, hbarrel, ROT0, "Data East Corporation", "Dragonninja (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, birdtry, 0, birdtry, birdtry, dec0_state, birdtry, ROT270, "Data East Corporation", "Birdie Try (Japan)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // protection controls game related data, impossible to emulate without a working PCB
GAME( 1988, robocop, 0, robocop, robocop, dec0_state, robocop, ROT0, "Data East Corporation", "Robocop (World revision 4)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, robocopw, robocop, robocop, robocop, dec0_state, robocop, ROT0, "Data East Corporation", "Robocop (World revision 3)", MACHINE_SUPPORTS_SAVE )
@@ -3408,17 +3464,15 @@ GAME( 1990, bouldashj, bouldash, slyspy, bouldash, dec0_state, slyspy, ROT0
// bootlegs
// more or less just an unprotected versions of the game, everything intact
-GAME( 1988, robocopb, robocop, robocopb, robocop, dec0_state, robocop, ROT0, "bootleg", "Robocop (World bootleg)", MACHINE_SUPPORTS_SAVE )
-GAME( 1988, drgninjab, baddudes, baddudes, drgninja, dec0_state, baddudes, ROT0, "bootleg", "Dragonninja (bootleg)", MACHINE_SUPPORTS_SAVE )
-
-
+GAME( 1988, robocopb, robocop, robocopb, robocop, dec0_state, robocop, ROT0, "bootleg", "Robocop (World bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1988, drgninjab, baddudes, drgninjab, drgninja, dec0_state, drgninja, ROT0, "bootleg", "Dragonninja (bootleg)", MACHINE_SUPPORTS_SAVE )
// this is a common bootleg board
-GAME( 1989, midresb, midres, midresb, midresb, dec0_state, midresb, ROT0, "bootleg", "Midnight Resistance (bootleg with 68705)", MACHINE_SUPPORTS_SAVE ) // need to hook up 68705? (probably unused)
-GAME( 1989, midresbj, midres, midresb, midresb, dec0_state, midresb, ROT0, "bootleg", "Midnight Resistance (Joystick bootleg)", MACHINE_SUPPORTS_SAVE )
-GAME( 1989, ffantasybl, hippodrm, ffantasybl, ffantasybl, dec0_state, ffantasybl, ROT0, "bootleg", "Fighting Fantasy (bootleg with 68705)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // 68705 not dumped, might be the same as midresb
-GAME( 1988, drgninjab2, baddudes, baddudes, drgninja, dec0_state, baddudes, ROT0, "bootleg", "Dragonninja (bootleg with 68705)", MACHINE_SUPPORTS_SAVE ) // is this the same board as above? (region warning hacked to World, but still shows Japanese text)
+GAME( 1989, midresb, midres, midresb, midresb, dec0_state, midresb, ROT0, "bootleg", "Midnight Resistance (bootleg with 68705)", MACHINE_SUPPORTS_SAVE ) // need to hook up 68705? (probably unused)
+GAME( 1989, midresbj, midres, midresbj, midresb, dec0_state, midresb, ROT0, "bootleg", "Midnight Resistance (Joystick bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1989, ffantasybl, hippodrm, ffantasybl, ffantasybl, dec0_state, ffantasybl, ROT0, "bootleg", "Fighting Fantasy (bootleg with 68705)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // 68705 not dumped, might be the same as midresb
+GAME( 1988, drgninjab2, baddudes, drgninjab, drgninja, dec0_state, drgninja, ROT0, "bootleg", "Dragonninja (bootleg with 68705)", MACHINE_SUPPORTS_SAVE ) // is this the same board as above? (region warning hacked to World, but still shows Japanese text)
// these are different to the above but quite similar to each other
GAME( 1988, automat, robocop, automat, robocop, dec0_state, robocop, ROT0, "bootleg", "Automat (bootleg of Robocop)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // sound rom / music from section z with mods for ADPCM?
diff --git a/src/mame/drivers/deco32.cpp b/src/mame/drivers/deco32.cpp
index 09d80fa33b4..a1696f126a6 100644
--- a/src/mame/drivers/deco32.cpp
+++ b/src/mame/drivers/deco32.cpp
@@ -457,7 +457,7 @@ void deco32_state::deco32_set_audio_output(uint8_t raw_data)
// TODO: assume linear with a 0.0-1.0 dB scale for now
uint8_t raw_vol = 0xff - raw_data;
float vol_output = ((float)raw_vol) / 255.0f;
-
+
m_ym2151->set_output_gain(ALL_OUTPUTS, vol_output);
m_oki1->set_output_gain(ALL_OUTPUTS, vol_output);
m_oki2->set_output_gain(ALL_OUTPUTS, vol_output);
@@ -734,8 +734,8 @@ WRITE32_MEMBER(deco32_state::nslasher_eeprom_w)
pri_w(space,0,data&0x3,0xffffffff); /* Bit 0 - layer priority toggle, Bit 1 - BG2/3 Joint mode (8bpp) */
}
-
-// popmessage("%08x",data);
+
+// popmessage("%08x",data);
if (ACCESSING_BITS_8_15)
deco32_set_audio_output((data >> 8) & 0xff);
}
diff --git a/src/mame/drivers/ep64.cpp b/src/mame/drivers/ep64.cpp
index a1b9c94f4c2..f094b9dba0d 100644
--- a/src/mame/drivers/ep64.cpp
+++ b/src/mame/drivers/ep64.cpp
@@ -151,7 +151,7 @@ Notes: (All IC's shown)
#include "emu.h"
#include "softlist.h"
-#include "audio/dave.h"
+#include "sound/dave.h"
#include "bus/rs232/rs232.h"
#include "bus/ep64/exp.h"
#include "cpu/z80/z80.h"
diff --git a/src/mame/drivers/equites.cpp b/src/mame/drivers/equites.cpp
index 4c108332c09..c07d0c42c7d 100644
--- a/src/mame/drivers/equites.cpp
+++ b/src/mame/drivers/equites.cpp
@@ -781,7 +781,7 @@ static INPUT_PORTS_START( gekisou )
PORT_START("IN1")
PORT_BIT( 0x0100, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_BIT( 0x0200, IP_ACTIVE_HIGH, IPT_COIN2 )
- PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_SERVICE) PORT_NAME("Settings") PORT_CODE(KEYCODE_F1)
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_SERVICE ) // settings
PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x1000, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_UNKNOWN )
diff --git a/src/mame/drivers/esd16.cpp b/src/mame/drivers/esd16.cpp
index 75483cb0372..5dad197c838 100644
--- a/src/mame/drivers/esd16.cpp
+++ b/src/mame/drivers/esd16.cpp
@@ -23,6 +23,7 @@ Year + Game PCB Notes
98 Multi Champ ESD 11-09-98 (also a year 1999 revision)
99 Multi Champ Deluxe ESD 08-26-1999 (also a year 2000 revision)
99 Head Panic ESD 05-28-99 (All English version, copyright 1999)
+99 Head Panic ESD 06-10-1999 (All English version, copyright 1999)
00 Head Panic ESD 08-26-1999 (All English version, copyright 2000)
00 Head Panic ESD 08-26-1999 (with Fuuki, Story in Japanese)
00 Deluxe 5 ESD (no date is marked on PCB)
@@ -1026,7 +1027,7 @@ Notes:
2x pushbutton
-ESD 08-26-1999
+ESD 08-26-1999 (ESD 06-10-1999 nearly identical)
|-----------------------------------------|
| 3014 3812 6116 6295 ESD4 |
|VOL ESD3 Z80 * |
@@ -1121,6 +1122,33 @@ ROM_START( hedpanicf ) /* Story line in Japanese, game instructions in English *
ROM_END
+ROM_START( hedpanica ) /* Story line & game instructions in English, copyright year is 1999 - ESD 06-10-1999 PCB */
+ ROM_REGION( 0x080000, "maincpu", 0 ) /* 68000 Code */
+ ROM_LOAD16_BYTE( "esd12.cu03", 0x000000, 0x040000, CRC(deb7e0a0) SHA1(ef3a00e9bfdffd7c89326ad97a261f9a7b9863ae) ) /* CU03 */
+ ROM_LOAD16_BYTE( "esd11.cu02", 0x000001, 0x040000, CRC(e1418f23) SHA1(39f14172d9b1a0d47edfe2456362fddc22f60066) ) /* CU02 */
+
+ ROM_REGION( 0x40000, "audiocpu", 0 ) /* Z80 Code */
+ ROM_LOAD( "esd3.su06", 0x00000, 0x40000, CRC(a88d4424) SHA1(eefb5ac79632931a36f360713c482cd079891f91) ) /* AT27C020 mask rom */
+
+ ROM_REGION( 0x600000, "spr", 0 ) /* Sprites, 16x16x5 */
+ ROM_LOAD( "ju04", 0x200000, 0x200000, CRC(4f3503d7) SHA1(4bed795c7328e0ebfa97688918eb8a908c29deb8) )
+ ROM_LOAD( "ju06", 0x000000, 0x200000, CRC(9f6f6193) SHA1(c7c7ae6898ab7177eefb0e525d827666e2af9f7e) )
+ /* expand this to take up 0x200000 bytes too so we can decode it */
+ ROM_LOAD16_BYTE( "esd5.bin", 0x400000, 0x080000, CRC(6968265a) SHA1(84b4f2d8b3bf6ea4117fa8281c76b58df778261d) ) /* JU07 */
+ ROM_FILL( 0x500000, 0x100000, 0x00 )
+
+ ROM_REGION( 0x400000, "bgs", 0 ) /* Layers, 16x16x8 */
+ ROM_LOAD16_BYTE( "fu35", 0x000000, 0x200000, CRC(9b5a45c5) SHA1(fbd8bc6ccc068d2cc7fe4f575fa0847f53e786ab) )
+ ROM_LOAD16_BYTE( "fu34", 0x000001, 0x200000, CRC(8f2099cc) SHA1(40795ae5fb8de613c2d5b6147992c153695bf698) )
+
+ ROM_REGION( 0x80000, "oki", 0 ) /* Samples */
+ ROM_LOAD( "esd4.bin", 0x000000, 0x080000, CRC(5692fe92) SHA1(4423039cb437ab36d198b212ef394bf1704be404) ) /* SU10 */
+
+ ROM_REGION16_BE( 0x80, "eeprom", 0 )
+ ROM_LOAD( "hedpanic.nv", 0x0000, 0x0080, CRC(e91f4038) SHA1(f492de71170900f87912a272ab4f4a3a37ba31fe) )
+ROM_END
+
+
ROM_START( hedpanico ) /* Story line & game instructions in English, copyright year is 1999 - ESD 05-28-99 PCB which uses older style sprites */
ROM_REGION( 0x080000, "maincpu", 0 ) /* 68000 Code */
ROM_LOAD16_BYTE( "esd2.rom", 0x000000, 0x040000, CRC(70b08424) SHA1(2ba4fb3b749e31db4239a9173b8509366400152f) ) /* CU03 */
@@ -1600,6 +1628,9 @@ GAME( 2001, jumppope, jumppop, jumppop, jumppop, driver_device, 0, ROT0, "Ema
/* ESD 05-28-99 */
GAME( 1999, hedpanico,hedpanic, hedpanio, hedpanic, driver_device, 0, ROT0, "ESD", "Head Panic (ver. 0615, 15/06/1999)", MACHINE_SUPPORTS_SAVE )
+/* ESD 06-10-1999 */
+GAME( 1999, hedpanica,hedpanic, hedpanic, hedpanic, driver_device, 0, ROT0, "ESD", "Head Panic (ver. 0702, 02/07/1999)", MACHINE_SUPPORTS_SAVE )
+
/* ESD 08-26-1999 */
GAME( 2000, mchampdx, 0, mchampdx, hedpanic, driver_device, 0, ROT0, "ESD", "Multi Champ Deluxe (ver. 0106, 06/01/2000)", MACHINE_SUPPORTS_SAVE )
GAME( 1999, mchampdxa,mchampdx, mchampdx, hedpanic, driver_device, 0, ROT0, "ESD", "Multi Champ Deluxe (ver. 1126, 26/11/1999)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/exidy.cpp b/src/mame/drivers/exidy.cpp
index f9c22dedd0d..4edd6d74aec 100644
--- a/src/mame/drivers/exidy.cpp
+++ b/src/mame/drivers/exidy.cpp
@@ -1118,6 +1118,31 @@ ROM_START( mtrap )
ROM_END
+ROM_START( mtrap2 )
+ ROM_REGION( 0x10000, "maincpu", 0 )
+ ROM_LOAD( "mtl-2.11a", 0xa000, 0x1000, CRC(a8cc3a18) SHA1(09fa9eff5ae5cb923d6e9137ba9a4b6944acffb2) )
+ ROM_LOAD( "mtl-2.10a", 0xb000, 0x1000, CRC(e26b074c) SHA1(e8882edc818860d887c08e8083a40c4717412b2f) )
+ ROM_LOAD( "mtl-2.9a", 0xc000, 0x1000, CRC(845394f6) SHA1(a150a6f00465abb787d8d46a2e32d8985364554e) )
+ ROM_LOAD( "mtl-2.8a", 0xd000, 0x1000, CRC(854d2d50) SHA1(4213999acbc03ee8300b2fcf86349cd7450adae5) )
+ ROM_LOAD( "mtl-2.7a", 0xe000, 0x1000, CRC(3d235f95) SHA1(57031d9784c55853dcf6e396ee685d8dd0d3ef87) )
+ ROM_LOAD( "mtl-2.6a", 0xf000, 0x1000, CRC(7ed7632a) SHA1(6800d3c1b901808373d3edd2a3fcf699f93d7daf) )
+
+ ROM_REGION( 0x8000, "audiocpu", 0 )
+ ROM_LOAD( "mta5a.bin", 0x6800, 0x0800, CRC(dbe4ec02) SHA1(34e965428dbb4b9c558927bb80d19cb550b53228) )
+ ROM_LOAD( "mta6a.bin", 0x7000, 0x0800, CRC(c00f0c05) SHA1(398b0bc2a7e54b1e2326ed067bf6bb15cc52ed39) )
+ ROM_LOAD( "mta7a.bin", 0x7800, 0x0800, CRC(f3f16ca7) SHA1(3928c5da246c43036a7b4cbb140a1734d5f1fb03) )
+
+ ROM_REGION( 0x4000, "cvsdcpu", 0 ) /* 16k for digital sound processor */
+ ROM_LOAD( "mta2a.bin", 0x0000, 0x1000, CRC(13db8ed3) SHA1(939352323bdcd7df25db5eb2e30f269bcaebe6af) )
+ ROM_LOAD( "mta3a.bin", 0x1000, 0x1000, CRC(31bdfe5c) SHA1(b10bfe9e56dd617c5b4cd8b5bfec9c7f537b1086) )
+ ROM_LOAD( "mta4a.bin", 0x2000, 0x1000, CRC(1502d0e8) SHA1(8ef51ad4601299016f1821a5c65bec0199dd5474) )
+ ROM_LOAD( "mta1a.bin", 0x3000, 0x1000, CRC(658482a6) SHA1(c0d770fbeaa7cb3e0eef47d8caa0f8a78841692e) )
+
+ ROM_REGION( 0x0800, "gfx1", 0 )
+ ROM_LOAD( "mtl11d.bin", 0x0000, 0x0800, CRC(c6e4d339) SHA1(b091923e4d52e93d7c567afba217a10b2a3735fc) )
+ROM_END
+
+
ROM_START( mtrap3 )
ROM_REGION( 0x10000, "maincpu", 0 )
ROM_LOAD( "mtl-3.11a", 0xa000, 0x1000, CRC(4091be6e) SHA1(a4432f4588915276583f4b2e8db527fd24eb4291) )
@@ -1566,6 +1591,7 @@ GAME( 1980, phantoma, spectar, rallys, phantoma, exidy_state, phantoma, ROT0,
GAME( 1980, phantom, spectar, rallys, phantoma, exidy_state, phantoma, ROT0, "bootleg (Proel)", "Phantom (bootleg of Spectar)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1981, mtrap, 0, mtrap, mtrap, exidy_state, mtrap, ROT0, "Exidy", "Mouse Trap (version 5)", MACHINE_SUPPORTS_SAVE )
+GAME( 1981, mtrap2, mtrap, mtrap, mtrap, exidy_state, mtrap, ROT0, "Exidy", "Mouse Trap (version 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1981, mtrap3, mtrap, mtrap, mtrap, exidy_state, mtrap, ROT0, "Exidy", "Mouse Trap (version 3)", MACHINE_SUPPORTS_SAVE )
GAME( 1981, mtrap4, mtrap, mtrap, mtrap, exidy_state, mtrap, ROT0, "Exidy", "Mouse Trap (version 4)", MACHINE_SUPPORTS_SAVE )
GAME( 1981, mtrapb, mtrap, mtrap, mtrap, exidy_state, mtrap, ROT0, "bootleg", "Mouse Trap (bootleg)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/fccpu20.cpp b/src/mame/drivers/fccpu20.cpp
index 5d951b25216..95d930fbe19 100644
--- a/src/mame/drivers/fccpu20.cpp
+++ b/src/mame/drivers/fccpu20.cpp
@@ -2,67 +2,50 @@
// copyright-holders:Joakim Larsson Edstrom
/***************************************************************************
*
- * Force SYS68K CPU-20 VME SBC drivers
- *
- * 24/12/2016
- *
- * Thanks to Al Kossow and his site http://www.bitsavers.org/ I got the information
- * required to start the work with this driver.
- *
- *
- * ||
- * || || CPU-20
- * ||||--||_____________________________________________________________
- * ||||--|| |
- * || || _ |__
- * || | | |
- * || | | |
- * || | | |
- * || | | |
- * || | | |
- * || | | |
- * || | |VME|
- * || | | |
- * || | |P1 |
- * || | | |
- * || | | |
- * || | | |
- * || | | |
- * || | | |
- * || | | |
- * || |_| |
- * || |___|
- * || |
- * || |
- * || |
- * || |
- * || |
- * || |
- * || |
- * || |
- * || |___
- * || _| |
- * || | | |
- * || | | |
- * || | | |
- * || | | |
- * || | |VME|
- * || | | |
- * || | |P2 |
- * || | | |
- * || | | |
- * || | | |
- * || | | |
- * || | | |
- * || | | |
- * || | | |
- * || | | |
- * || |_| |
- * || |___|
- * || || +
- * ||||--|| |
- * ||||--||--------------------------------------------------------------+
- * ||
+ * Force SYS68K CPU-20 and CPU-21 VME SBC drivers
+ *
+ * The only purpose of this driver is to be able to start the VME board as
+ * a single board computer and not as a slot device. It allows the board to
+ * have a layout and number of other goodies as board driver too but the chassi
+ * emulated here is really imaginary representing any chassi that provides power
+ * and used without any other VME board installed.
+ *
+ * This board occupies two mechanical slots but is only using one slot.
+ *
+ * If you want to combine multiple VME boards there are a few multi VME slot chassi
+ * board drivers which will allow you to do that, such as the 'miniforce' driver.
+ *
+ * +=============================+
+ * | CPU-20 | SYS68K/PWR-09A |
+ * | | |
+ * | RST | |
+ * | ABT |O +5v |
+ * | |O +12v |
+ * |O RUN O RUN|O -12v |
+ * |O HLT |O ON |
+ * |O BM | |
+ * | | |
+ * |O FLM O SL0| |
+ * |O EPR O SL1| |
+ * |O 2WS | +-------+ |
+ * |O 4WS | | o |PWR |
+ * |O 6WS | | | |
+ * |O 8WS | +-------+ |
+ * |O12WS | |
+ * |O14WS | |
+ * | | |
+ * | CSH | |
+ * | R/M | |
+ * | | |
+ * | o | |
+ * | o | |
+ * | o | |
+ * | o | |
+ * | RS232/422 | |
+ * | P4 P3 | |
+ * | | |
+ * |SLOT1| 1U | |
+ * +=============================+
*
* History of Force Computers
*---------------------------
@@ -70,113 +53,33 @@
*
* Misc links about Force Computes and this board:
*------------------------------------------------
- * http://bitsavers.org/pdf/forceComputers/
- *
- * Description(s)
- * -------------
- * CPU-20 has the following feature set:
- * - 68020 CPU with l6.7MHz Clock Frequency
- * - 68881 Floating Point Coprocessor with l6.7MHz Clock Frequency
- * - Static RAM 5l2Kbyte with 55ns access time
- * - 5l2Kbyte (max) of ROM/EPROM for the system
- * - 2 RS232 Multi Protocol Communication Interfaces (110-38400 Baud)
- * - Parallel Interface and Timer Chip provides local control and timer function
- * - VMXbus Primary Master Interface to p2 connector
- * - Local Interrupt handling via interrupt vectors
- * - Each VMEbus IRQ level can be enabled/disabled via software
- * - Address range for the short I/O address modifies (AM4)
- * - Address range for the standard address modifier
- * - Single level bus arbiter
- * - One level slave bus arbitration
- * - Power monitor
- * - RESET and SOFTWARE ABORT function switches
- * - Fully VMEbus, VMXbus and IEEE Pl~14 compatible
- *
- * Address Map
- * --------------------------------------------------------------------------
- * Range Decscription
- * --------------------------------------------------------------------------
-Basadressen av I / O-enheter:
- * 00000000-0xxFFFFF Shared DRAM D8-D32
- * 0yy00000-FAFFFFFF VME A32 D8-D32 yy=xx+1
- * FB000000-FBFEFFFF VME A24 D8-D32
- * FBFF0000-FBFFFFFF VME A16 D8-D32
- * FC000000-FCFEFFFF VME A24 D8-D16
- * FCFF0000-FCFFFFFF VME A16 D8-D16
- * FF800800 BIM
- * FF800C00 PIT
- * FF800000 MPCC
- * FF800A00 RTC
- * --------------------------------------------------------------------------
- *
- * PIT #1 hardware wiring
- * ----------------------------------------------------------
- * PA0-PA3 TBC
- * PA4-PA7
- * H1-H4
- * PB0-PB2
- * PB3-PB4
- * PB5
- * PB6-PB7
- * PC0,PC1
- * PC4,PC7
- * PC2
- * PC3
- * PC5
- * PC6
- *
- * PIT #2 hardware setup wiring
- * ----------------------------------------------------------
- * PA0-PA7 TBC
- * H1-H4
- * PB0-PB2
- * PB3-PB7
- * PC0-PC1
- * PC2
- * PC3
- * PC4
- * PC5
- * PC6
- * PC7
+ * See the CPU-20 slot device code in vme_fccpu20.cpp
*
*---------------------------------------------------------------------------
* TODO:
- * - Find accurate documentation and adjust memory map
- * - Add layout
- * - Write & add 68561 UART
- * - Add 68230 PIT
- * - Add variants of boards in the CPU-20 and CPU-21 family
- * - Add FGA, DUSCC devices and CPU-22 variants
- *
+ * - Add front layout
****************************************************************************/
#include "emu.h"
-#include "cpu/m68000/m68000.h"
#include "bus/vme/vme.h"
-#include "bus/vme/vme_fcisio.h"
-#include "bus/vme/vme_fcscsi.h"
-#include "bus/rs232/rs232.h"
-#include "machine/68230pit.h"
-#include "machine/68153bim.h"
-#include "machine/clock.h"
+#include "bus/vme/vme_fccpu20.h"
-#define LOG_GENERAL 0x01
-#define LOG_SETUP 0x02
-#define LOG_PRINTF 0x04
-#define LOG_INT 0x08
+//**************************************************************************
+// CONFIGURABLE LOGGING
+//**************************************************************************
-#define VERBOSE 0 // (LOG_PRINTF | LOG_SETUP | LOG_GENERAL | LOG_INT)
+#define LOG_GENERAL (1U << 0)
+#define LOG_SETUP (1U << 1)
-#define LOGMASK(mask, ...) do { if (VERBOSE & mask) logerror(__VA_ARGS__); } while (0)
-#define LOGLEVEL(mask, level, ...) do { if ((VERBOSE & mask) >= level) logerror(__VA_ARGS__); } while (0)
+//#define VERBOSE (LOG_GENERAL | LOG_SETUP)
+//#define LOG_OUTPUT_FUNC printf
+#include "logmacro.h"
-#define LOG(...) LOGMASK(LOG_GENERAL, __VA_ARGS__)
-#define LOGSETUP(...) LOGMASK(LOG_SETUP, __VA_ARGS__)
-#define LOGINT(...) LOGMASK(LOG_INT, __VA_ARGS__)
+#define LOGSETUP(...) LOGMASKED(LOG_SETUP, __VA_ARGS__)
-#if VERBOSE & LOG_PRINTF
-#define logerror printf
-#endif
+//**************************************************************************
+// MACROS / CONSTANTS
+//**************************************************************************
#ifdef _MSC_VER
#define FUNCNAME __func__
@@ -188,204 +91,104 @@ class cpu20_state : public driver_device
{
public:
cpu20_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device (mconfig, type, tag)
- , m_maincpu (*this, "maincpu")
- , m_pit (*this, "pit")
- , m_bim (*this, "bim")
+ : driver_device (mconfig, type, tag)
{
}
- DECLARE_READ32_MEMBER (bootvect_r);
- DECLARE_WRITE32_MEMBER (bootvect_w);
-
- DECLARE_WRITE_LINE_MEMBER(bim_irq_callback);
- uint8_t bim_irq_state;
- int bim_irq_level;
-
- virtual void machine_start () override;
- virtual void machine_reset () override;
-private:
- required_device<m68000_base_device> m_maincpu;
- required_device<pit68230_device> m_pit;
- required_device<bim68153_device> m_bim;
-
- // Pointer to System ROMs needed by bootvect_r and masking RAM buffer for post reset accesses
- uint32_t *m_sysrom;
- uint32_t m_sysram[2];
- void update_irq_to_maincpu();
+ DECLARE_DRIVER_INIT(cpu21s) { LOGSETUP("%s\n", FUNCNAME); }
+ DECLARE_DRIVER_INIT(cpu21) { LOGSETUP("%s\n", FUNCNAME); }
+ DECLARE_DRIVER_INIT(cpu21a) { LOGSETUP("%s\n", FUNCNAME); }
+ DECLARE_DRIVER_INIT(cpu21ya) { LOGSETUP("%s\n", FUNCNAME); }
+ DECLARE_DRIVER_INIT(cpu21b) { LOGSETUP("%s\n", FUNCNAME); }
+ DECLARE_DRIVER_INIT(cpu21yb) { LOGSETUP("%s\n", FUNCNAME); }
};
-/*
-*/
-static ADDRESS_MAP_START (cpu20_mem, AS_PROGRAM, 32, cpu20_state)
- ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE (0x00000000, 0x00000007) AM_ROM AM_READ (bootvect_r) /* ROM mirror just during reset */
- AM_RANGE (0x00000000, 0x00000007) AM_RAM AM_WRITE (bootvect_w) /* After first write we act as RAM */
- AM_RANGE (0x00000008, 0x003fffff) AM_RAM /* RAM installed in machine start */
- AM_RANGE (0xff040000, 0xff04ffff) AM_RAM /* RAM installed in machine start */
- AM_RANGE (0xff000000, 0xff00ffff) AM_ROM AM_REGION("roms", 0x0000)
-// AM_RANGE (0xff800000, 0xff80000f) AM_DEVREADWRITE8("mpcc", mpcc68561_device, read, write, 0x00ff00ff)
-// AM_RANGE (0xff800200, 0xff80020f) AM_DEVREADWRITE8("pit2", pit68230_device, read, write, 0xff00ff00)
- AM_RANGE (0xff800800, 0xff80080f) AM_DEVREADWRITE8("bim", bim68153_device, read, write, 0xff00ff00)
-// AM_RANGE (0xff800a00, 0xff800a0f) AM_DEVREADWRITE8("rtc", rtc_device, read, write, 0x00ff00ff)
- AM_RANGE (0xff800c00, 0xff800dff) AM_DEVREADWRITE8("pit", pit68230_device, read, write, 0xffffffff)
-ADDRESS_MAP_END
-
/* Input ports */
static INPUT_PORTS_START (cpu20)
INPUT_PORTS_END
-/* Start it up */
-void cpu20_state::machine_start ()
-{
- LOGSETUP("%s\n", FUNCNAME);
-
- save_pointer (NAME (m_sysrom), sizeof(m_sysrom));
- save_pointer (NAME (m_sysram), sizeof(m_sysram));
-
- /* Setup pointer to bootvector in ROM for bootvector handler bootvect_r */
- m_sysrom = (uint32_t*)(memregion ("roms")->base());
-}
-
-void cpu20_state::machine_reset ()
-{
- LOGSETUP("%s\n", FUNCNAME);
+/* Slot interfaces */
+static SLOT_INTERFACE_START(cpu20_vme_cards)
+ SLOT_INTERFACE("fccpu20", VME_FCCPU20)
+SLOT_INTERFACE_END
- /* Reset pointer to bootvector in ROM for bootvector handler bootvect_r */
- if (m_sysrom == &m_sysram[0]) /* Condition needed because memory map is not setup first time */
- m_sysrom = (uint32_t*)(memregion ("roms")->base());
-}
+static SLOT_INTERFACE_START(cpu21s_vme_cards)
+ SLOT_INTERFACE("fccpu21s", VME_FCCPU21S)
+SLOT_INTERFACE_END
-#if 0
-/* setup board ID */
-DRIVER_INIT_MEMBER( cpu20_state, cpu20x ) { LOGSETUP("%s\n", FUNCNAME); m_board_id = 0x50; }
-DRIVER_INIT_MEMBER( cpu20_state, cpu20xa ) { LOGSETUP("%s\n", FUNCNAME); m_board_id = 0x50; }
-DRIVER_INIT_MEMBER( cpu20_state, cpu20za ) { LOGSETUP("%s\n", FUNCNAME); m_board_id = 0x50; }
-DRIVER_INIT_MEMBER( cpu20_state, cpu20zbe ) { LOGSETUP("%s\n", FUNCNAME); m_board_id = 0x50; }
-DRIVER_INIT_MEMBER( cpu20_state, cpu20be8 ) { LOGSETUP("%s\n", FUNCNAME); m_board_id = 0x50; }
-DRIVER_INIT_MEMBER( cpu20_state, cpu20be16 ) { LOGSETUP("%s\n", FUNCNAME); m_board_id = 0x50; }
-DRIVER_INIT_MEMBER( cpu20_state, cpu20lite4 ) { LOGSETUP("%s\n", FUNCNAME); m_board_id = 0x50; }
-DRIVER_INIT_MEMBER( cpu20_state, cpu20lite8 ) { LOGSETUP("%s\n", FUNCNAME); m_board_id = 0x50; }
-DRIVER_INIT_MEMBER( cpu20_state, cpu33 ) { LOGSETUP("%s\n", FUNCNAME); m_board_id = 0x68; } // 0x60 skips FGA prompt
-#endif
+static SLOT_INTERFACE_START(cpu21_vme_cards)
+ SLOT_INTERFACE("fccpu21", VME_FCCPU21)
+SLOT_INTERFACE_END
-/* Boot vector handler, the PCB hardwires the first 8 bytes from 0xff800000 to 0x0 at reset*/
-READ32_MEMBER (cpu20_state::bootvect_r){
- LOG("%s\n", FUNCNAME);
- return m_sysrom[offset];
-}
+static SLOT_INTERFACE_START(cpu21a_vme_cards)
+ SLOT_INTERFACE("fccpu21a", VME_FCCPU21A)
+SLOT_INTERFACE_END
-WRITE32_MEMBER (cpu20_state::bootvect_w){
- LOG("%s\n", FUNCNAME);
- m_sysram[offset % sizeof(m_sysram)] &= ~mem_mask;
- m_sysram[offset % sizeof(m_sysram)] |= (data & mem_mask);
- m_sysrom = &m_sysram[0]; // redirect all upcomming accesses to masking RAM until reset.
-}
+static SLOT_INTERFACE_START(cpu21ya_vme_cards)
+ SLOT_INTERFACE("fccpu21ya", VME_FCCPU21YA)
+SLOT_INTERFACE_END
-WRITE_LINE_MEMBER(cpu20_state::bim_irq_callback)
-{
- LOGINT("%s(%02x)\n", FUNCNAME, state);
+static SLOT_INTERFACE_START(cpu21b_vme_cards)
+ SLOT_INTERFACE("fccpu21b", VME_FCCPU21B)
+SLOT_INTERFACE_END
- bim_irq_state = state;
- bim_irq_level = m_bim->get_irq_level();
- LOGINT(" - BIM irq level %02x\n", bim_irq_level);
- update_irq_to_maincpu();
-}
+static SLOT_INTERFACE_START(cpu21yb_vme_cards)
+ SLOT_INTERFACE("fccpu21yb", VME_FCCPU21YB)
+SLOT_INTERFACE_END
-void cpu20_state::update_irq_to_maincpu()
-{
- LOGINT("%s()\n", FUNCNAME);
- LOGINT(" - bim_irq_level: %02x\n", bim_irq_level);
- LOGINT(" - bim_irq_state: %02x\n", bim_irq_state);
- switch (bim_irq_level & 0x07)
- {
- case 1: m_maincpu->set_input_line(M68K_IRQ_1, bim_irq_state); break;
- case 2: m_maincpu->set_input_line(M68K_IRQ_2, bim_irq_state); break;
- case 3: m_maincpu->set_input_line(M68K_IRQ_3, bim_irq_state); break;
- case 4: m_maincpu->set_input_line(M68K_IRQ_4, bim_irq_state); break;
- case 5: m_maincpu->set_input_line(M68K_IRQ_5, bim_irq_state); break;
- case 6: m_maincpu->set_input_line(M68K_IRQ_6, bim_irq_state); break;
- case 7: m_maincpu->set_input_line(M68K_IRQ_7, bim_irq_state); break;
- default: logerror("Programmatic error in %s, please report\n", FUNCNAME);
- }
-}
+/* Machine configurations */
+MACHINE_CONFIG_START (cpu20, cpu20_state)
+ MCFG_VME_DEVICE_ADD("vme")
+ MCFG_VME_SLOT_ADD ("vme", "slot1", cpu20_vme_cards, "fccpu20")
+MACHINE_CONFIG_END
-static SLOT_INTERFACE_START(fccpu20_vme_cards)
- SLOT_INTERFACE("fcisio", VME_FCISIO1)
- SLOT_INTERFACE("fcscsi", VME_FCSCSI1)
-SLOT_INTERFACE_END
+MACHINE_CONFIG_START (cpu21s, cpu20_state)
+ MCFG_VME_DEVICE_ADD("vme")
+ MCFG_VME_SLOT_ADD ("vme", "slot1", cpu21s_vme_cards, "fccpu21s")
+MACHINE_CONFIG_END
-/*
- * Machine configuration
- */
-static MACHINE_CONFIG_START (cpu20, cpu20_state)
- /* basic machine hardware */
- MCFG_CPU_ADD ("maincpu", M68020, XTAL_16MHz) /* Crytstal not verified */
- MCFG_CPU_PROGRAM_MAP (cpu20_mem)
- MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("bim", bim68153_device, iack)
+MACHINE_CONFIG_START (cpu21, cpu20_state)
+ MCFG_VME_DEVICE_ADD("vme")
+ MCFG_VME_SLOT_ADD ("vme", "slot1", cpu21_vme_cards, "fccpu21")
+MACHINE_CONFIG_END
+MACHINE_CONFIG_START (cpu21a, cpu20_state)
MCFG_VME_DEVICE_ADD("vme")
- MCFG_VME_SLOT_ADD ("vme", "slot1", fccpu20_vme_cards, nullptr)
+ MCFG_VME_SLOT_ADD ("vme", "slot1", cpu21a_vme_cards, "fccpu21a")
+MACHINE_CONFIG_END
- /* PIT Parallel Interface and Timer device, assumed strapped for on board clock */
- MCFG_DEVICE_ADD ("pit", PIT68230, XTAL_8_664MHz)
- MCFG_PIT68230_TIMER_IRQ_CB(DEVWRITELINE("bim", bim68153_device, int2_w))
+MACHINE_CONFIG_START (cpu21ya, cpu20_state)
+ MCFG_VME_DEVICE_ADD("vme")
+ MCFG_VME_SLOT_ADD ("vme", "slot1", cpu21ya_vme_cards, "fccpu21ya")
+MACHINE_CONFIG_END
-// MCFG_DEVICE_ADD ("pit2", PIT68230, XTAL_8_664MHz)
+MACHINE_CONFIG_START (cpu21b, cpu20_state)
+ MCFG_VME_DEVICE_ADD("vme")
+ MCFG_VME_SLOT_ADD ("vme", "slot1", cpu21b_vme_cards, "fccpu21b")
+MACHINE_CONFIG_END
- MCFG_MC68153_ADD("bim", XTAL_16MHz / 2)
- MCFG_BIM68153_OUT_INT_CB(WRITELINE(cpu20_state, bim_irq_callback))
- /*INT0 - Abort switch */
- /*INT1 - MPCC@8.064 MHz aswell */
- /*INT2 - PI/T timer */
- /*INT3 - SYSFAIL/IRQVMX/ACFAIL/MPCC2/3 */
+MACHINE_CONFIG_START (cpu21yb, cpu20_state)
+ MCFG_VME_DEVICE_ADD("vme")
+ MCFG_VME_SLOT_ADD ("vme", "slot1", cpu21yb_vme_cards, "fccpu21yb")
MACHINE_CONFIG_END
-/* ROM definitions */
-ROM_START (fccpu20) /* This is an original rom dump */
- ROM_REGION32_BE(0x10000, "roms", 0)
-// Boots with Board ID set to: 0x36 (FGA002 BOOT on terminal P4, "Wait until harddisk is up to speed " on terminal P1)
- ROM_LOAD32_BYTE("L.BIN", 0x000002, 0x4000, CRC (174ab801) SHA1 (0d7b8ed29d5fdd4bd2073005008120c5f20128dd))
- ROM_LOAD32_BYTE("LL.BIN", 0x000003, 0x4000, CRC (9fd9e3e4) SHA1 (e5a7c87021e6be412dd5a8166d9f62b681169eda))
- ROM_LOAD32_BYTE("U.BIN", 0x000001, 0x4000, CRC (d1afe4c0) SHA1 (b5baf9798d73632f7bb843cbc4b306c8c03f4296))
- ROM_LOAD32_BYTE("UU.BIN", 0x000000, 0x4000, CRC (b54d623b) SHA1 (49b272184a04570b09004de71fae0ed0d1bf5929))
-ROM_END
+/* ROM configurations */
+ROM_START(fccpu20sbc) ROM_END
-/*
- * System ROM information
- *
- * xxxxxxx bootprom version xxx is released mmm dd, yyyy, coprighted by FORCE Computers Gmbh
- *
- * BIM setup: (reordered for improved reading)
- * : 0 Reg vector <- 1f
- * : 1 Reg vector <- 1c
- * : 2 Reg vector <- 1d
- * : 3 Reg vector <- 1c
- * : 0 Reg control <- 57 - Lev:7 Auto Disable:0 Int Enable:1 Vector:0 Auto Clear:1 Flag:0
- * : 1 Reg control <- 54 - Lev:4 Auto Disable:0 Int Enable:1 Vector:0 Auto Clear:1 Flag:0
- * : 2 Reg control <- 55 - Lev:5 Auto Disable:0 Int Enable:1 Vector:0 Auto Clear:1 Flag:0
- * : 3 Reg control <- 54 - Lev:4 Auto Disable:0 Int Enable:1 Vector:0 Auto Clear:1 Flag:0
- *
- * PIT setup:
- * :pit Reg 0a -> 00
- * :pit Reg 00 <- 30 - PGCR - Mode 0, H34:enabled, H12:enabled, Sense assert H4:Lo, H3:Lo, H2:Lo, H1:Lo
- * :pit Reg 01 <- 08 - PSSR - PC4 pin activated, PC5 pin support no interrupts, H prio mode:0
- * :pit Reg 06 <- 84 - PACR
- * :pit Reg 02 <- 00 - PADDR: 00
- * :pit Reg 07 <- 84 - PBCR
- * :pit Reg 09 <- ff - PBDR
- * :pit Reg 03 <- ff - PBDDR: ff
- * :pit Reg 0c <- 07 - PCDR
- * :pit Reg 04 <- 87 - PCDDR: 87
- * :pit Reg 15 <- d8 - CPRL
- * :pit Reg 14 <- 09 - CPRM
- * :pit Reg 13 <- 00 - CPRH
- * :pit Reg 10 <- e1 - TCR - PC3 used as TOUT and PC7 used as I/O pin, Interrupts enabled
- - PC2 used as I/O pin,CLK and x32 prescaler are used
- - Timer reload the preload values when reaching 0 (zero)
- - Timer is enabled
- */
+/* Boards supported by same rom set, need to do like this to avoid need for multi named rom sets */
+#define rom_fccpu21ssbc rom_fccpu20sbc
+#define rom_fccpu21sbc rom_fccpu20sbc
+#define rom_fccpu21asbc rom_fccpu20sbc
+#define rom_fccpu21yasbc rom_fccpu20sbc
+#define rom_fccpu21bsbc rom_fccpu20sbc
+#define rom_fccpu21ybsbc rom_fccpu20sbc
/* Driver */
-/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
-COMP (1986, fccpu20, 0, 0, cpu20, cpu20, driver_device, 0, "Force Computers Gmbh", "SYS68K/CPU-20", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW | MACHINE_TYPE_COMPUTER )
+/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
+COMP (1986, fccpu20sbc, 0, 0, cpu20, cpu20, driver_device, 0, "Force Computers Gmbh", "SYS68K/CPU-20", MACHINE_NO_SOUND_HW | MACHINE_TYPE_COMPUTER )
+COMP (1986, fccpu21ssbc, fccpu20sbc, 0, cpu21s, cpu20, cpu20_state, cpu21s, "Force Computers Gmbh", "SYS68K/CPU-21S", MACHINE_NO_SOUND_HW | MACHINE_TYPE_COMPUTER )
+COMP (1986, fccpu21sbc, fccpu20sbc, 0, cpu21, cpu20, cpu20_state, cpu21, "Force Computers Gmbh", "SYS68K/CPU-21", MACHINE_NO_SOUND_HW | MACHINE_TYPE_COMPUTER )
+COMP (1986, fccpu21asbc, fccpu20sbc, 0, cpu21a, cpu20, cpu20_state, cpu21a, "Force Computers Gmbh", "SYS68K/CPU-21A", MACHINE_NO_SOUND_HW | MACHINE_TYPE_COMPUTER )
+COMP (1986, fccpu21yasbc, fccpu20sbc, 0, cpu21ya, cpu20, cpu20_state, cpu21ya, "Force Computers Gmbh", "SYS68K/CPU-21YA", MACHINE_NO_SOUND_HW | MACHINE_TYPE_COMPUTER )
+COMP (1986, fccpu21bsbc, fccpu20sbc, 0, cpu21b, cpu20, cpu20_state, cpu21b, "Force Computers Gmbh", "SYS68K/CPU-21B", MACHINE_NO_SOUND_HW | MACHINE_TYPE_COMPUTER )
+COMP (1986, fccpu21ybsbc, fccpu20sbc, 0, cpu21yb, cpu20, cpu20_state, cpu21yb, "Force Computers Gmbh", "SYS68K/CPU-21YB", MACHINE_NO_SOUND_HW | MACHINE_TYPE_COMPUTER )
diff --git a/src/mame/drivers/fccpu30.cpp b/src/mame/drivers/fccpu30.cpp
index 33ea2d70ce7..35540290f72 100644
--- a/src/mame/drivers/fccpu30.cpp
+++ b/src/mame/drivers/fccpu30.cpp
@@ -70,6 +70,14 @@
*
* History of Force Computers
*---------------------------
+ * 1981 Force Computers was founded in San Jose, California. Over time a European headquarter was opened
+ * in Munich, Germany, and a Japanese headquarter in Tokyo
+ * 1996 Force was aquired by Solectron Corporation in 1996
+ * 2004 Force was sold off from Solectron to Motorola
+ * 2008 Force was aquired by Emerson as part of the Motorola Embedded Division
+ * 2016 Force was aquired by Platinum Equity as part of the Emerson Network Power Division
+ *
+ * Force developed and produced VME board products based on SPARC, Pentium, PowerPC and 68K.
*
* Misc links about Force Computes and this board:
*------------------------------------------------
@@ -636,7 +644,7 @@ void cpu30_state::update_irq_to_maincpu()
static SLOT_INTERFACE_START(fccpu30_vme_cards)
SLOT_INTERFACE("fcisio", VME_FCISIO1)
SLOT_INTERFACE("fcscsi", VME_FCSCSI1)
-SLOT_INTERFACE_END
+SLOT_INTERFACE_END
/*
* Machine configuration
diff --git a/src/mame/drivers/fidel6502.cpp b/src/mame/drivers/fidel6502.cpp
index 08b725beed3..b7d10af30f3 100644
--- a/src/mame/drivers/fidel6502.cpp
+++ b/src/mame/drivers/fidel6502.cpp
@@ -235,7 +235,7 @@ CPU is a R65C02P4, running at 4MHz
NE556 dual-timer IC:
- timer#1, one-shot at power-on, to CPU _RESET
-- timer#2: R1=82K+50K pot at 26K, R2=1K, C=22nf, to CPU _IRQ: ~596Hz, active low=15.25us
+- timer#2: R1=82K+50K pot at 26K, R2=1K, C=22nF, to CPU _IRQ: ~596Hz, active low=15.25us
Memory map:
-----------
@@ -383,8 +383,7 @@ I/O is via TTL, very similar to Designer Display
******************************************************************************/
-#include "emu.h"
-#include "includes/fidelz80.h"
+#include "includes/fidelbase.h"
#include "cpu/m6502/m6502.h"
#include "cpu/m6502/r65c02.h"
#include "cpu/m6502/m65sc02.h"
@@ -409,11 +408,11 @@ I/O is via TTL, very similar to Designer Display
#include "fidel_su9.lh" // clickable
-class fidel6502_state : public fidelz80base_state
+class fidel6502_state : public fidelbase_state
{
public:
fidel6502_state(const machine_config &mconfig, device_type type, const char *tag)
- : fidelz80base_state(mconfig, type, tag),
+ : fidelbase_state(mconfig, type, tag),
m_ppi8255(*this, "ppi8255"),
m_cart(*this, "cartslot")
{ }
@@ -535,7 +534,7 @@ WRITE8_MEMBER(fidel6502_state::csc_pia0_pb_w)
READ8_MEMBER(fidel6502_state::csc_pia0_pb_r)
{
// d2: printer?
- uint8_t data = 0x04;
+ u8 data = 0x04;
// d3: TSI BUSY line
if (m_speech->busy_r())
@@ -679,7 +678,7 @@ WRITE8_MEMBER(fidel6502_state::eas_ppi_portc_w)
READ8_MEMBER(fidel6502_state::eas_ppi_portb_r)
{
// d0: printer? white wire from LED pcb
- uint8_t data = 1;
+ u8 data = 1;
// d1: TSI BUSY line
data |= (m_speech->busy_r()) ? 2 : 0;
@@ -712,7 +711,7 @@ WRITE8_MEMBER(fidel6502_state::sc9_control_w)
{
// d0-d3: 74245 P0-P3
// 74245 Q0-Q8: input mux, led select
- uint16_t sel = 1 << (data & 0xf) & 0x3ff;
+ u16 sel = 1 << (data & 0xf) & 0x3ff;
m_inp_mux = sel & 0x1ff;
sc9_prepare_display();
@@ -748,7 +747,7 @@ WRITE8_MEMBER(fidel6502_state::sc12_control_w)
{
// d0-d3: 7442 a0-a3
// 7442 0-8: led data, input mux
- uint16_t sel = 1 << (data & 0xf) & 0x3ff;
+ u16 sel = 1 << (data & 0xf) & 0x3ff;
m_inp_mux = sel & 0x1ff;
// 7442 9: speaker out
@@ -803,24 +802,24 @@ READ8_MEMBER(fidel6502_state::fexcelv_speech_r)
WRITE8_MEMBER(fidel6502_state::fexcel_ttl_w)
{
// a0-a2,d0: 74259(1)
- uint8_t mask = 1 << offset;
+ u8 mask = 1 << offset;
m_led_select = (m_led_select & ~mask) | ((data & 1) ? mask : 0);
// 74259 Q0-Q3: 7442 a0-a3
// 7442 0-8: led data, input mux
- uint16_t sel = 1 << (m_led_select & 0xf) & 0x3ff;
- uint8_t led_data = sel & 0xff;
+ u16 sel = 1 << (m_led_select & 0xf) & 0x3ff;
+ u8 led_data = sel & 0xff;
m_inp_mux = sel & 0x1ff;
// 7442 9: speaker out
m_dac->write(BIT(sel, 9));
// 74259 Q4-Q7,Q2,Q1: digit/led select (active low)
- uint8_t led_sel = ~BITSWAP8(m_led_select,0,3,1,2,7,6,5,4) & 0x3f;
+ u8 led_sel = ~BITSWAP8(m_led_select,0,3,1,2,7,6,5,4) & 0x3f;
// a0-a2,d1: digit segment data (model 6093)
m_7seg_data = (m_7seg_data & ~mask) | ((data & 2) ? mask : 0);
- uint8_t seg_data = BITSWAP8(m_7seg_data,0,1,3,2,7,5,6,4);
+ u8 seg_data = BITSWAP8(m_7seg_data,0,1,3,2,7,5,6,4);
// update display: 4 7seg leds, 2*8 chessboard leds
for (int i = 0; i < 6; i++)
@@ -850,7 +849,7 @@ WRITE8_MEMBER(fidel6502_state::fexcel_ttl_w)
READ8_MEMBER(fidel6502_state::fexcelb_ttl_r)
{
// a0-a2,d6: from speech board: language switches and TSI BUSY line, otherwise tied to VCC
- uint8_t d6 = (m_inp_matrix[9].read_safe(0xff) >> offset & 1) ? 0x40 : 0;
+ u8 d6 = (m_inp_matrix[9].read_safe(0xff) >> offset & 1) ? 0x40 : 0;
// a0-a2,d7: multiplexed inputs (active low)
return d6 | ((read_inputs(9) >> offset & 1) ? 0 : 0x80);
@@ -858,7 +857,7 @@ READ8_MEMBER(fidel6502_state::fexcelb_ttl_r)
READ8_MEMBER(fidel6502_state::fexcel_ttl_r)
{
- uint8_t d7 = 0x80;
+ u8 d7 = 0x80;
// 74259(1) Q7 + 74251 I0: battery status
if (m_inp_mux == 1 && ~m_led_select & 0x80)
@@ -878,15 +877,15 @@ READ8_MEMBER(fidel6502_state::fexcel_ttl_r)
WRITE8_MEMBER(fidel6502_state::fdesdis_control_w)
{
- uint8_t q3_old = m_led_select & 8;
+ u8 q3_old = m_led_select & 8;
// a0-a2,d7: 74259
- uint8_t mask = 1 << offset;
+ u8 mask = 1 << offset;
m_led_select = (m_led_select & ~mask) | ((data & 0x80) ? mask : 0);
// 74259 Q4-Q7: 7442 a0-a3
// 7442 0-8: led data, input mux
- uint16_t sel = 1 << (m_led_select >> 4 & 0xf) & 0x3ff;
+ u16 sel = 1 << (m_led_select >> 4 & 0xf) & 0x3ff;
m_inp_mux = sel & 0x1ff;
// 7442 9: speaker out
@@ -913,7 +912,7 @@ WRITE8_MEMBER(fidel6502_state::fdesdis_control_w)
WRITE8_MEMBER(fidel6502_state::fdesdis_lcd_w)
{
// a0-a2,d0-d3: 4*74259 to lcd digit segments
- uint32_t mask = BITSWAP8(1 << offset,3,7,6,0,1,2,4,5);
+ u32 mask = BITSWAP8(1 << offset,3,7,6,0,1,2,4,5);
for (int i = 0; i < 4; i++)
{
m_7seg_data = (m_7seg_data & ~mask) | ((data >> i & 1) ? 0 : mask);
@@ -943,12 +942,12 @@ DRIVER_INIT_MEMBER(fidel6502_state, fdesdis)
WRITE8_MEMBER(fidel6502_state::chesster_control_w)
{
// a0-a2,d7: 74259(1)
- uint8_t mask = 1 << offset;
+ u8 mask = 1 << offset;
m_led_select = (m_led_select & ~mask) | ((data & 0x80) ? mask : 0);
// 74259 Q4-Q7: 7442 a0-a3
// 7442 0-8: led data, input mux
- uint16_t sel = 1 << (m_led_select >> 4 & 0xf) & 0x3ff;
+ u16 sel = 1 << (m_led_select >> 4 & 0xf) & 0x3ff;
m_inp_mux = sel & 0x1ff;
// 74259 Q0,Q1: led select (active low)
@@ -1554,7 +1553,7 @@ static MACHINE_CONFIG_START( rsc, fidel6502_state )
MCFG_PIA_CA2_HANDLER(WRITELINE(fidel6502_state, csc_pia1_ca2_w))
MCFG_PIA_CB2_HANDLER(WRITELINE(fidel6502_state, csc_pia1_cb2_w))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80base_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelbase_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_fidel_rsc_v2)
/* sound hardware */
@@ -1569,7 +1568,7 @@ static MACHINE_CONFIG_START( csc, fidel6502_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M6502, 3900000/2) // from 3.9MHz resonator
MCFG_CPU_PROGRAM_MAP(csc_map)
- MCFG_CPU_PERIODIC_INT_DRIVER(fidelz80base_state, irq0_line_hold, 600) // 38400kHz/64
+ MCFG_CPU_PERIODIC_INT_DRIVER(fidel6502_state, irq0_line_hold, 600) // 38400kHz/64
MCFG_DEVICE_ADD("pia0", PIA6821, 0)
MCFG_PIA_READPB_HANDLER(READ8(fidel6502_state, csc_pia0_pb_r))
@@ -1586,7 +1585,7 @@ static MACHINE_CONFIG_START( csc, fidel6502_state )
MCFG_PIA_CA2_HANDLER(WRITELINE(fidel6502_state, csc_pia1_ca2_w))
MCFG_PIA_CB2_HANDLER(WRITELINE(fidel6502_state, csc_pia1_cb2_w))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80base_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelbase_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_fidel_csc)
/* sound hardware */
@@ -1614,7 +1613,7 @@ static MACHINE_CONFIG_START( eas, fidel6502_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", R65C02, XTAL_3MHz)
MCFG_CPU_PROGRAM_MAP(eas_map)
- MCFG_CPU_PERIODIC_INT_DRIVER(fidelz80base_state, irq0_line_hold, 600) // guessed
+ MCFG_CPU_PERIODIC_INT_DRIVER(fidel6502_state, irq0_line_hold, 600) // guessed
MCFG_DEVICE_ADD("ppi8255", I8255, 0) // port B: input, port A & C: output
MCFG_I8255_OUT_PORTA_CB(WRITE8(fidel6502_state, eas_ppi_porta_w))
@@ -1623,7 +1622,7 @@ static MACHINE_CONFIG_START( eas, fidel6502_state )
MCFG_NVRAM_ADD_0FILL("nvram")
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80base_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelbase_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_fidel_eas)
/* sound hardware */
@@ -1639,7 +1638,7 @@ static MACHINE_CONFIG_START( eas, fidel6502_state )
/* cartridge */
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "fidel_scc")
MCFG_GENERIC_EXTENSIONS("bin,dat")
- MCFG_GENERIC_LOAD(fidelz80base_state, scc_cartridge)
+ MCFG_GENERIC_LOAD(fidelbase_state, scc_cartridge)
MCFG_SOFTWARE_LIST_ADD("cart_list", "fidel_scc")
MACHINE_CONFIG_END
@@ -1648,7 +1647,7 @@ static MACHINE_CONFIG_DERIVED( eag, eas )
/* basic machine hardware */
MCFG_CPU_REPLACE("maincpu", R65C02, XTAL_5MHz) // R65C02P4
MCFG_CPU_PROGRAM_MAP(eag_map)
- MCFG_CPU_PERIODIC_INT_DRIVER(fidelz80base_state, irq0_line_hold, 600) // guessed
+ MCFG_CPU_PERIODIC_INT_DRIVER(fidel6502_state, irq0_line_hold, 600) // guessed
MCFG_DEFAULT_LAYOUT(layout_fidel_eag)
MACHINE_CONFIG_END
@@ -1658,11 +1657,11 @@ static MACHINE_CONFIG_START( sc9, fidel6502_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M6502, 1400000) // from ceramic resonator "681 JSA", measured
MCFG_CPU_PROGRAM_MAP(sc9_map)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_on", fidel6502_state, irq_on, attotime::from_hz(610)) // from 555 timer (22nf, 102K, 2.7K)
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_on", fidel6502_state, irq_on, attotime::from_hz(610)) // from 555 timer (22nF, 102K, 2.7K)
MCFG_TIMER_START_DELAY(attotime::from_hz(610) - attotime::from_usec(41)) // active for 41us
MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_off", fidel6502_state, irq_off, attotime::from_hz(610))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80base_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelbase_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_fidel_sc9)
/* sound hardware */
@@ -1674,7 +1673,7 @@ static MACHINE_CONFIG_START( sc9, fidel6502_state )
/* cartridge */
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "fidel_scc")
MCFG_GENERIC_EXTENSIONS("bin,dat")
- MCFG_GENERIC_LOAD(fidelz80base_state, scc_cartridge)
+ MCFG_GENERIC_LOAD(fidelbase_state, scc_cartridge)
MCFG_SOFTWARE_LIST_ADD("cart_list", "fidel_scc")
MACHINE_CONFIG_END
@@ -1699,11 +1698,11 @@ static MACHINE_CONFIG_START( sc12, fidel6502_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", R65C02, XTAL_4MHz)
MCFG_CPU_PROGRAM_MAP(sc12_map)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_on", fidel6502_state, irq_on, attotime::from_hz(596)) // from 556 timer (22nf, 82K+26K, 1K)
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_on", fidel6502_state, irq_on, attotime::from_hz(596)) // from 556 timer (22nF, 82K+26K, 1K)
MCFG_TIMER_START_DELAY(attotime::from_hz(596) - attotime::from_nsec(15250)) // active for 15.25us
MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_off", fidel6502_state, irq_off, attotime::from_hz(596))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80base_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelbase_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_fidel_sc12)
/* sound hardware */
@@ -1715,7 +1714,7 @@ static MACHINE_CONFIG_START( sc12, fidel6502_state )
/* cartridge */
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "fidel_scc")
MCFG_GENERIC_EXTENSIONS("bin,dat")
- MCFG_GENERIC_LOAD(fidelz80base_state, scc_cartridge)
+ MCFG_GENERIC_LOAD(fidelbase_state, scc_cartridge)
MCFG_SOFTWARE_LIST_ADD("cart_list", "fidel_scc")
MACHINE_CONFIG_END
@@ -1724,11 +1723,11 @@ static MACHINE_CONFIG_START( fexcel, fidel6502_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M65SC02, XTAL_12MHz/4) // G65SC102P-3, 12.0M ceramic resonator
MCFG_CPU_PROGRAM_MAP(fexcel_map)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_on", fidel6502_state, irq_on, attotime::from_hz(630)) // from 556 timer (22nf, 102K, 1K)
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_on", fidel6502_state, irq_on, attotime::from_hz(630)) // from 556 timer (22nF, 102K, 1K)
MCFG_TIMER_START_DELAY(attotime::from_hz(630) - attotime::from_nsec(15250)) // active for 15.25us
MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_off", fidel6502_state, irq_off, attotime::from_hz(630))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80base_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelbase_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_fidel_ex)
/* sound hardware */
@@ -1761,7 +1760,7 @@ static MACHINE_CONFIG_DERIVED( fdes2000, fexcel )
// change irq timer frequency
MCFG_DEVICE_REMOVE("irq_on")
MCFG_DEVICE_REMOVE("irq_off")
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_on", fidel6502_state, irq_on, attotime::from_hz(585)) // from 556 timer (22nf, 110K, 1K)
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_on", fidel6502_state, irq_on, attotime::from_hz(585)) // from 556 timer (22nF, 110K, 1K)
MCFG_TIMER_START_DELAY(attotime::from_hz(585) - attotime::from_nsec(15250)) // active for 15.25us
MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_off", fidel6502_state, irq_off, attotime::from_hz(585))
@@ -1787,11 +1786,11 @@ static MACHINE_CONFIG_START( fdes2100d, fidel6502_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M65C02, XTAL_6MHz) // W65C02P-6
MCFG_CPU_PROGRAM_MAP(fdesdis_map)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_on", fidel6502_state, irq_on, attotime::from_hz(630)) // from 556 timer (22nf, 102K, 1K)
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_on", fidel6502_state, irq_on, attotime::from_hz(630)) // from 556 timer (22nF, 102K, 1K)
MCFG_TIMER_START_DELAY(attotime::from_hz(630) - attotime::from_nsec(15250)) // active for 15.25us
MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_off", fidel6502_state, irq_off, attotime::from_hz(630))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80base_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelbase_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_fidel_desdis)
/* sound hardware */
@@ -1817,7 +1816,7 @@ static MACHINE_CONFIG_START( chesster, fidel6502_state )
MCFG_TIMER_START_DELAY(attotime::from_hz(9615) - attotime::from_nsec(2600)) // active for 2.6us
MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_off", fidel6502_state, irq_off, attotime::from_hz(9615))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80base_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelbase_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_fidel_chesster)
/* sound hardware */
diff --git a/src/mame/drivers/fidel68k.cpp b/src/mame/drivers/fidel68k.cpp
index fd59a10968c..d0eff017227 100644
--- a/src/mame/drivers/fidel68k.cpp
+++ b/src/mame/drivers/fidel68k.cpp
@@ -153,8 +153,7 @@ B0000x-xxxxxx: see V7, -800000
******************************************************************************/
-#include "emu.h"
-#include "includes/fidelz80.h"
+#include "includes/fidelbase.h"
#include "cpu/m68000/m68000.h"
#include "machine/ram.h"
#include "machine/nvram.h"
@@ -165,11 +164,11 @@ B0000x-xxxxxx: see V7, -800000
#include "fidel_eag_68k.lh" // clickable
-class fidel68k_state : public fidelz80base_state
+class fidel68k_state : public fidelbase_state
{
public:
fidel68k_state(const machine_config &mconfig, device_type type, const char *tag)
- : fidelz80base_state(mconfig, type, tag),
+ : fidelbase_state(mconfig, type, tag),
m_ram(*this, "ram")
{ }
@@ -203,7 +202,7 @@ public:
WRITE8_MEMBER(fidel68k_state::fexcel68k_mux_w)
{
// a1-a3,d0: 74259
- uint8_t mask = 1 << offset;
+ u8 mask = 1 << offset;
m_led_select = (m_led_select & ~mask) | ((data & 1) ? mask : 0);
// 74259 Q0-Q3: 74145 A-D (Q4-Q7 N/C)
@@ -222,7 +221,7 @@ void fidel68k_state::eag_prepare_display()
{
// Excel 68000: 4*7seg leds, 8*8 chessboard leds
// EAG: 8*7seg leds(2 panels), (8+1)*8 chessboard leds
- uint8_t seg_data = BITSWAP8(m_7seg_data,0,1,3,2,7,5,6,4);
+ u8 seg_data = BITSWAP8(m_7seg_data,0,1,3,2,7,5,6,4);
set_display_segmask(0x1ff, 0x7f);
display_matrix(16, 9, m_led_data << 8 | seg_data, m_inp_mux);
}
@@ -258,7 +257,7 @@ WRITE8_MEMBER(fidel68k_state::eag_mux_w)
// d0-d3: 74145 A-D
// 74145 0-8: input mux, digit/led select
// 74145 9: speaker out
- uint16_t sel = 1 << (data & 0xf);
+ u16 sel = 1 << (data & 0xf);
m_dac->write(BIT(sel, 9));
m_inp_mux = sel & 0x1ff;
eag_prepare_display();
@@ -557,11 +556,11 @@ static MACHINE_CONFIG_START( fexcel68k, fidel68k_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M68000, XTAL_12MHz) // HD68HC000P12
MCFG_CPU_PROGRAM_MAP(fexcel68k_map)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_on", fidel68k_state, irq_on, attotime::from_hz(618)) // theoretical frequency from 556 timer (22nf, 91K + 20K POT @ 14.8K, 0.1K), measurement was 580Hz
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_on", fidel68k_state, irq_on, attotime::from_hz(618)) // theoretical frequency from 556 timer (22nF, 91K + 20K POT @ 14.8K, 0.1K), measurement was 580Hz
MCFG_TIMER_START_DELAY(attotime::from_hz(618) - attotime::from_nsec(1525)) // active for 1.525us
MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_off", fidel68k_state, irq_off, attotime::from_hz(618))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80base_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelbase_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_fidel_ex_68k)
/* sound hardware */
@@ -582,7 +581,7 @@ static MACHINE_CONFIG_START( eag, fidel68k_state )
MCFG_NVRAM_ADD_1FILL("nvram")
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80base_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelbase_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_fidel_eag_68k)
MCFG_RAM_ADD("ram")
@@ -598,7 +597,7 @@ static MACHINE_CONFIG_START( eag, fidel68k_state )
/* cartridge */
MCFG_GENERIC_CARTSLOT_ADD("cartslot", generic_plain_slot, "fidel_scc")
MCFG_GENERIC_EXTENSIONS("bin,dat")
- MCFG_GENERIC_LOAD(fidelz80base_state, scc_cartridge)
+ MCFG_GENERIC_LOAD(fidelbase_state, scc_cartridge)
MCFG_SOFTWARE_LIST_ADD("cart_list", "fidel_scc")
MACHINE_CONFIG_END
@@ -631,7 +630,7 @@ static MACHINE_CONFIG_DERIVED( eagv11, eagv7 )
MCFG_CPU_REPLACE("maincpu", M68EC040, XTAL_36MHz*2*2) // wrong! should be M68EC060 @ 72MHz
MCFG_CPU_PROGRAM_MAP(eagv11_map)
- MCFG_CPU_PERIODIC_INT_DRIVER(fidelz80base_state, irq2_line_hold, 600)
+ MCFG_CPU_PERIODIC_INT_DRIVER(fidel68k_state, irq2_line_hold, 600)
MCFG_DEVICE_REMOVE("irq_on") // 8.25us is too long
MCFG_DEVICE_REMOVE("irq_off")
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/fidelz80.cpp b/src/mame/drivers/fidelz80.cpp
index c468c229d32..6b15a1ee86d 100644
--- a/src/mame/drivers/fidelz80.cpp
+++ b/src/mame/drivers/fidelz80.cpp
@@ -489,8 +489,7 @@ expect that the software reads these once on startup only.
******************************************************************************/
-#include "emu.h"
-#include "includes/fidelz80.h"
+#include "includes/fidelbase.h"
#include "cpu/z80/z80.h"
#include "cpu/mcs48/mcs48.h"
#include "machine/i8255.h"
@@ -507,11 +506,11 @@ expect that the software reads these once on startup only.
#include "fidel_vsc.lh" // clickable
-class fidelz80_state : public fidelz80base_state
+class fidelz80_state : public fidelbase_state
{
public:
fidelz80_state(const machine_config &mconfig, device_type type, const char *tag)
- : fidelz80base_state(mconfig, type, tag),
+ : fidelbase_state(mconfig, type, tag),
m_mcu(*this, "mcu"),
m_z80pio(*this, "z80pio"),
m_ppi8255(*this, "ppi8255"),
@@ -570,7 +569,7 @@ public:
// machine start/reset
-void fidelz80base_state::machine_start()
+void fidelbase_state::machine_start()
{
// zerofill
memset(m_display_state, 0, sizeof(m_display_state));
@@ -603,7 +602,7 @@ void fidelz80base_state::machine_start()
save_item(NAME(m_speech_bank));
}
-void fidelz80base_state::machine_reset()
+void fidelbase_state::machine_reset()
{
}
@@ -618,9 +617,9 @@ void fidelz80base_state::machine_reset()
// The device may strobe the outputs very fast, it is unnoticeable to the user.
// To prevent flickering here, we need to simulate a decay.
-void fidelz80base_state::display_update()
+void fidelbase_state::display_update()
{
- uint32_t active_state[0x20];
+ u32 active_state[0x20];
for (int y = 0; y < m_display_maxy; y++)
{
@@ -633,7 +632,7 @@ void fidelz80base_state::display_update()
m_display_decay[y][x] = m_display_wait;
// determine active state
- uint32_t ds = (m_display_decay[y][x] != 0) ? 1 : 0;
+ u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0;
active_state[y] |= (ds << x);
}
}
@@ -671,7 +670,7 @@ void fidelz80base_state::display_update()
memcpy(m_display_cache, active_state, sizeof(m_display_cache));
}
-TIMER_DEVICE_CALLBACK_MEMBER(fidelz80base_state::display_decay_tick)
+TIMER_DEVICE_CALLBACK_MEMBER(fidelbase_state::display_decay_tick)
{
// slowly turn off unpowered segments
for (int y = 0; y < m_display_maxy; y++)
@@ -682,13 +681,13 @@ TIMER_DEVICE_CALLBACK_MEMBER(fidelz80base_state::display_decay_tick)
display_update();
}
-void fidelz80base_state::set_display_size(int maxx, int maxy)
+void fidelbase_state::set_display_size(int maxx, int maxy)
{
m_display_maxx = maxx;
m_display_maxy = maxy;
}
-void fidelz80base_state::set_display_segmask(uint32_t digits, uint32_t mask)
+void fidelbase_state::set_display_segmask(u32 digits, u32 mask)
{
// set a segment mask per selected digit, but leave unselected ones alone
for (int i = 0; i < 0x20; i++)
@@ -699,12 +698,12 @@ void fidelz80base_state::set_display_segmask(uint32_t digits, uint32_t mask)
}
}
-void fidelz80base_state::display_matrix(int maxx, int maxy, uint32_t setx, uint32_t sety, bool update)
+void fidelbase_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update)
{
set_display_size(maxx, maxy);
// update current state
- uint32_t mask = (1 << maxx) - 1;
+ u32 mask = (1 << maxx) - 1;
for (int y = 0; y < maxy; y++)
m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0;
@@ -715,9 +714,9 @@ void fidelz80base_state::display_matrix(int maxx, int maxy, uint32_t setx, uint3
// generic input handlers
-uint16_t fidelz80base_state::read_inputs(int columns)
+u16 fidelbase_state::read_inputs(int columns)
{
- uint16_t ret = 0;
+ u16 ret = 0;
// read selected input rows
for (int i = 0; i < columns; i++)
@@ -739,9 +738,9 @@ INPUT_CHANGED_MEMBER(fidelz80_state::reset_button)
// cartridge
-DEVICE_IMAGE_LOAD_MEMBER(fidelz80base_state, scc_cartridge)
+DEVICE_IMAGE_LOAD_MEMBER(fidelbase_state, scc_cartridge)
{
- uint32_t size = m_cart->common_get_size("rom");
+ u32 size = m_cart->common_get_size("rom");
// max size is 16KB?
if (size > 0x4000)
@@ -769,7 +768,7 @@ DEVICE_IMAGE_LOAD_MEMBER(fidelz80base_state, scc_cartridge)
void fidelz80_state::vcc_prepare_display()
{
// 4 7seg leds (note: sel d0 for extra leds)
- uint8_t outdata = (m_7seg_data & 0x7f) | (m_led_select << 7 & 0x80);
+ u8 outdata = (m_7seg_data & 0x7f) | (m_led_select << 7 & 0x80);
set_display_segmask(0xf, 0x7f);
display_matrix(8, 4, outdata, m_led_select >> 2 & 0xf);
}
@@ -836,7 +835,7 @@ WRITE8_MEMBER(fidelz80_state::vcc_ppi_portb_w)
READ8_MEMBER(fidelz80_state::vcc_ppi_portc_r)
{
// d0-d3: multiplexed inputs (active low), also language switches
- uint8_t lan = (~m_led_select & 0x40) ? m_inp_matrix[4]->read() : 0;
+ u8 lan = (~m_led_select & 0x40) ? m_inp_matrix[4]->read() : 0;
return ~(lan | read_inputs(4)) & 0xf;
}
@@ -879,7 +878,7 @@ WRITE8_MEMBER(fidelz80_state::cc10_ppi_porta_w)
WRITE8_MEMBER(fidelz80_state::bcc_control_w)
{
// a0-a2,d7: digit segment data via NE591, Q7 is speaker out
- uint8_t mask = 1 << (offset & 7);
+ u8 mask = 1 << (offset & 7);
m_7seg_data = (m_7seg_data & ~mask) | ((data & 0x80) ? mask : 0);
m_dac->write(BIT(m_7seg_data, 7));
@@ -951,7 +950,7 @@ READ8_MEMBER(fidelz80_state::vsc_pio_porta_r)
READ8_MEMBER(fidelz80_state::vsc_pio_portb_r)
{
- uint8_t data = 0;
+ u8 data = 0;
// d4: TSI BUSY line
data |= (m_speech->busy_r()) ? 0 : 0x10;
@@ -987,7 +986,7 @@ WRITE8_MEMBER(fidelz80_state::vsc_pio_portb_w)
void fidelz80_state::vbrc_prepare_display()
{
// 14seg led segments, d15 is extra led, d14 is unused (tone on prototype?)
- uint16_t outdata = BITSWAP16(m_7seg_data,12,13,1,6,5,2,0,7,15,11,10,14,4,3,9,8);
+ u16 outdata = BITSWAP16(m_7seg_data,12,13,1,6,5,2,0,7,15,11,10,14,4,3,9,8);
set_display_segmask(0xff, 0x3fff);
display_matrix(16, 8, outdata, m_led_select);
}
@@ -1093,7 +1092,7 @@ ADDRESS_MAP_END
// VSC io: A2 is 8255 _CE, A3 is Z80 PIO _CE - in theory, both chips can be accessed simultaneously
READ8_MEMBER(fidelz80_state::vsc_io_trampoline_r)
{
- uint8_t data = 0xff; // open bus
+ u8 data = 0xff; // open bus
if (~offset & 4)
data &= m_ppi8255->read(space, offset & 3);
if (~offset & 8)
@@ -1452,7 +1451,7 @@ static MACHINE_CONFIG_START( bcc, fidelz80_state )
MCFG_CPU_PROGRAM_MAP(bcc_map)
MCFG_CPU_IO_MAP(bcc_io)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80base_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelbase_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_fidel_bcc)
/* sound hardware */
@@ -1476,7 +1475,7 @@ static MACHINE_CONFIG_START( cc10, fidelz80_state )
MCFG_I8255_IN_PORTC_CB(READ8(fidelz80_state, vcc_ppi_portc_r))
MCFG_I8255_OUT_PORTC_CB(WRITE8(fidelz80_state, vcc_ppi_portc_w))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80base_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelbase_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_fidel_cc)
/* sound hardware */
@@ -1500,7 +1499,7 @@ static MACHINE_CONFIG_START( vcc, fidelz80_state )
MCFG_I8255_IN_PORTC_CB(READ8(fidelz80_state, vcc_ppi_portc_r))
MCFG_I8255_OUT_PORTC_CB(WRITE8(fidelz80_state, vcc_ppi_portc_w))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80base_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelbase_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_fidel_vcc)
MCFG_MACHINE_START_OVERRIDE(fidelz80_state,vcc)
@@ -1518,7 +1517,7 @@ static MACHINE_CONFIG_START( vsc, fidelz80_state )
MCFG_CPU_ADD("maincpu", Z80, 3900000) // 3.9MHz resonator
MCFG_CPU_PROGRAM_MAP(vsc_map)
MCFG_CPU_IO_MAP(vsc_io)
- MCFG_CPU_PERIODIC_INT_DRIVER(fidelz80base_state, nmi_line_pulse, 600) // 555 timer, approx 600hz
+ MCFG_CPU_PERIODIC_INT_DRIVER(fidelz80_state, nmi_line_pulse, 600) // 555 timer, approx 600hz
MCFG_DEVICE_ADD("ppi8255", I8255, 0)
MCFG_I8255_OUT_PORTA_CB(WRITE8(fidelz80_state, vsc_ppi_porta_w))
@@ -1530,7 +1529,7 @@ static MACHINE_CONFIG_START( vsc, fidelz80_state )
MCFG_Z80PIO_IN_PB_CB(READ8(fidelz80_state, vsc_pio_portb_r))
MCFG_Z80PIO_OUT_PB_CB(WRITE8(fidelz80_state, vsc_pio_portb_w))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80base_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelbase_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_fidel_vsc)
/* sound hardware */
@@ -1553,7 +1552,7 @@ static MACHINE_CONFIG_START( vbrc, fidelz80_state )
MCFG_I8243_ADD("i8243", NOOP, WRITE8(fidelz80_state, vbrc_ioexp_port_w))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80base_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelbase_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_fidel_vbrc)
/* sound hardware */
diff --git a/src/mame/drivers/firetrk.cpp b/src/mame/drivers/firetrk.cpp
index 6faf9916048..7a465d04edd 100644
--- a/src/mame/drivers/firetrk.cpp
+++ b/src/mame/drivers/firetrk.cpp
@@ -434,7 +434,7 @@ static INPUT_PORTS_START( firetrk )
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Cabinet ))
PORT_DIPSETTING( 0x00, "Smokey Joe (1 Player)" )
PORT_DIPSETTING( 0x40, "Fire Truck (2 Players)" )
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SERVICE ) PORT_NAME("Diag Hold") PORT_CODE(KEYCODE_F6)
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_NAME("Diag Hold")
PORT_START("BIT_7")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )
@@ -444,7 +444,7 @@ static INPUT_PORTS_START( firetrk )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_COIN2 )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, firetrk_state,crash_r, (void *)2)
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SERVICE ) PORT_NAME("Diag Step") PORT_CODE(KEYCODE_F1)
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_NAME("Diag Step")
PORT_START("HORN")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Horn") PORT_PLAYER(1) PORT_CHANGED_MEMBER(DEVICE_SELF, firetrk_state,firetrk_horn_changed, 0)
diff --git a/src/mame/drivers/fromance.cpp b/src/mame/drivers/fromance.cpp
index 758d9b36602..6c52c93ab69 100644
--- a/src/mame/drivers/fromance.cpp
+++ b/src/mame/drivers/fromance.cpp
@@ -37,9 +37,9 @@ Memo:
- 2player's input is not supported.
-- Identify CRT Controller and fix layer misalignment in nekkyoku due of dynamic
- changes. Actually same custom component as other V-System games of the era,
- @seealso aerofgt.cpp
+- Identify CRT Controller and fix layer misalignment in nekkyoku due of dynamic
+ changes. Actually same custom component as other V-System games of the era,
+ @seealso aerofgt.cpp
- nekkyoku: soft reset enables flip screen without any real reason.
diff --git a/src/mame/drivers/funkball.cpp b/src/mame/drivers/funkball.cpp
index 2fd5f95a6b8..e5fcdf890fd 100644
--- a/src/mame/drivers/funkball.cpp
+++ b/src/mame/drivers/funkball.cpp
@@ -227,13 +227,7 @@ READ8_MEMBER( funkball_state::serial_r )
WRITE8_MEMBER( funkball_state::serial_w )
{
if(offset == 0)
- {
- // TODO: hack, main CPU sends a CR only here, actually expecting Windows-style newline.
- if(data == 0x0d)
- m_terminal->write(space,0,0x0a);
- else
- m_terminal->write(space,0,data);
- }
+ m_terminal->write(space,0,data);
}
uint8_t funkball_state::funkball_config_reg_r()
diff --git a/src/mame/drivers/funworld.cpp b/src/mame/drivers/funworld.cpp
index e79f7e6966e..0aab16424f3 100644
--- a/src/mame/drivers/funworld.cpp
+++ b/src/mame/drivers/funworld.cpp
@@ -5289,12 +5289,15 @@ ROM_END
Power Card (Fun World)
Version 0263 / 1993-10-22
- Amatic encrypted CPU
- based on 65SC02 (bitwise) family
+ Amatic encrypted CPU based on 65SC02 (bitwise) family,
+ with the following components inside:
- Looks like a Bonus Card / Big Deal clone.
- Inside the program ROM there is a reference to "Mega Card",
- but the graphics are from Power Card.
+ 1x CY7C291A (prom replacement).
+ 1x 65SC02 (CPU).
+ 1x TI74F245A (3-state octal latch from Texas Instruments).
+ 1x 7400 (quad 2-input NAND gate).
+
+ (Same as Mega Card CPU)
PCB Layout...
@@ -5368,12 +5371,20 @@ ROM_END
'---------------'
1 2 3 4 5 6 7 8
+
+ Looks like a Bonus Card / Big Deal clone.
+ Inside the program ROM there is a reference to "Mega Card",
+ but the graphics are from Power Card.
+
*/
ROM_START( powercrd )
ROM_REGION( 0x10000, "maincpu", 0 ) /* need proper decryption */
ROM_LOAD( "263a1.bin", 0x8000, 0x8000, CRC(9e5e477d) SHA1(428464a64bea8cb478bc8033859baa47d7de0297) ) /* just the 2nd half */
ROM_LOAD( "263a2.bin", 0x4000, 0x8000, CRC(11b1a13f) SHA1(766c1a45c238467d6a292795f5a159187966ceec) ) /* just the 2nd half */
+ ROM_REGION( 0x0800, "decode", 0 ) /* from the CY7C291A inside of the custom CPU */
+ ROM_LOAD( "powercrd_cy7c291a.bin", 0x0000, 0x0800, CRC(f1d8f35d) SHA1(2b5f9222a81a627d43fd8448385f85c71c24b914) ) /* new dump */
+
ROM_REGION( 0x10000, "gfx1", 0 )
ROM_LOAD( "power_c_zg2.ic11", 0x0000, 0x8000, CRC(108380bb) SHA1(922beffe3c06f391239125e6f4ccc86ec6980c45) )
ROM_LOAD( "power_c_zg1.ic10", 0x8000, 0x8000, CRC(dc9e70c6) SHA1(7ac5bdc734d9829ea6349b60817445cb88d7387c) )
@@ -5386,6 +5397,143 @@ ROM_START( powercrd )
ROM_END
+/*
+
+ Mega Card (MC3).
+ Ver. 0210.
+ Fun World, 1993.
+
+ Encrypted poker game.
+
+ 1x Custom encrypted Fun World CPU based on 65SC02 (Same as Power Card).
+ 1x GM68B45S CRTC.
+ 2x EF6821P PIAs.
+ 1x AY38910A.
+ 2x ULN2003AN (out).
+ 1x PAL16L8ACN (PLD).
+ 1x Maxim MAX690CPA (Microprocessor Supervisory Circuits).
+
+ RAM:
+ 1x GoldStar GM76C28-10.
+ 1x KM6264BL-10.
+
+ ROM:
+ 4x 27C256 (two for program, two for GFX).
+ 1x N82S147AN bipolar PROM.
+
+ Other:
+
+ 1x 16MHz Xtal.
+ 1x 8 DIP switches bank.
+ 1x 3V. CR2025 lithium battery.
+
+ 1X 17x2 Pin male connector.
+ 1X 22x2 Pin edge connector.
+ 1X 8x2 Pin edge connector.
+
+
+
+ PCB layout:
+
+ .----------------------------------------------------------------------------------------------------------------------.
+ | |
+ | .--------. .--------. .-------. |
+ | | | .------------. | | | | |
+ | | | | GD74LS157 | | | | | .---. '---.
+ | | | '------------' |Goldstar| | | | | .---. 8 ---|
+ | |GOLDSTAR| | | | | |ULN| | | ---|
+ | | | .------------. |GM76C28 | | | |200| |74L| P ---|
+ | | | | GD74LS157 | | -10 | | | |3AN| |S04| I ---|
+ | |GM68B45S| '------------' | | |AY38910| | | |P | N ---|
+ | | | | | |A/P | | | | | ---|
+ | | | .------------. | | .-------------------------------------. | | '---' | | C ---|
+ | | | | GD74LS157 | | | |## ooooooooooooooooooooooooooooooo ##| | | '---' O ---|
+ | | | '------------' | | |## ooooooooooooooooooooooooooooooo ##| | | N ---|
+ | | | '--------' '-------------------------------------' | | .---. N ---|
+ | | | .------------. | | | | ---|
+ | | | | GD74LS157 | .--------------. .--------------. | | |ULN| .---'
+ | | | '------------' | PAL16L8ACN | | EMPTY SOCKET | | | |200| |
+ | | | '--------------' '--------------' | | |3AN| |
+ | | | .------------------. .-----. .--------------------------------. | | | | |
+ | '--------' | | |XTAL | |Lfnd. Nr: 0057 | '-------' '---' |
+ | | KM6264BL-10 | |16.00| |Type: 'F' | .-------. |
+ | .-------------. | | |0MHz | |Datum: 17.3.93 | | | |
+ | | GD74LS245 | | | | | | | | | |
+ | '-------------' '------------------' '-----' | FUN WORLD | | | '---.
+ | | | | | ---|
+ | .-------------. .------------. '--------------------------------' | | ---|
+ | | HD74LS374P | | HD74LS374P | |EF6821P| ---|
+ | '-------------' '------------' .---. .---. .--------------------. | | ---|
+ | |GD7| |GD7| | | | | ---|
+ |.--------------------. .----------. |4LS| |4LS| | EMPTY SOCKET | | | .---. ---|
+ ||MEGA | |74LS194AN | |368| |245| | | | | | 8| ---|
+ ||ZG 1 | '----------' |A | | | | | | | | | ---|
+ || 27C256| | | | | '--------------------' | | | | 22 ---|
+ || IC10| .----------. '---' | | | | |DIP| ---|
+ |'--------------------' |74LS194AN | | | .--------------------. | | | | P ---|
+ | '----------' | | |MEGA MC 3 | | | | | I ---|
+ | '---' | 210/F/1 | | | | | N ---|
+ |.--------------------. .----------. | 27C256| | | | 1| ---|
+ ||MEGA | |74LS194AN | .---. .---. .---. | IC37| | | '---' C ---|
+ ||ZG 2 | '----------' |GD7| |MN7| |GD7| '--------------------' '-------' O ---|
+ || 27C256| |4LS| |4HC| |4LS| .-------. N ---|
+ || IC11| .----------. |393| |241| |139| .--------------------. | | N ---|
+ |'--------------------' |74LS194AN | | | | | | | |MEGA MC 3 | | | E ---|
+ | '----------' | | | | | | | 210/F/2 | | | C ---|
+ | '---' | | '---' | 27C256| | | T ---|
+ |.----------. .----------. | | | IC41| | | O ---|
+ ||GD74LS174 | |HD74LS02P | | | '--------------------' |EF6821P| R ---|
+ |'----------' '----------' '---' | | ---|
+ | ------- .---. | | ---|
+ |.---. .---. .---. .---. / CR-2025 \ |HD7| | | ---|
+ ||GD7| | | |HD7| |MAX| | LITHIUM | |4LS| | | ---|
+ ||4LS| |N82| |4LS| |690| | BATTERY | |02P| | | ---|
+ ||174| |S14| |374| '---' \ +3V. / | | | | ---|
+ || | |7AN| |P | Maxim ------- | | | | ---|
+ || | | | | | MAX690CPA '---' | | ---|
+ |'---' | | | | | | .---'
+ | | | | | | | |
+ | '---' '---' '-------' |
+ | |
+ '----------------------------------------------------------------------------------------------------------------------'
+
+
+ The encrypted CPU:
+
+ It's a DIP40 custom IC. It has inside a PLCC28 IC and 3 dies:
+
+ The PLCC28 chip is a CY7C291A (prom replacement)
+ DIE#1 is a TI74F245A, a 3-state octal latch from Texas Instruments.
+ DIE#2 is the CPU, a 65SC02.
+ DIE#3 is a 7400, a quad 2-input NAND gate.
+
+ Is unknown how they are connected.
+
+*/
+
+ROM_START( megacard )
+ ROM_REGION( 0x10000, "maincpu", 0 ) /* need proper decryption */
+ ROM_LOAD( "mega_mc3_210-f-1.ic37", 0x8000, 0x8000, CRC(747f5ed1) SHA1(06757bb6a792dca93978b17b54c28e413e3720b1) ) /* just the 2nd half */
+ ROM_LOAD( "mega_mc3_210-f-2.ic41", 0x4000, 0x8000, CRC(373094d2) SHA1(8aed2502e89b0e7522e88f351ac256f1afad7ee8) ) /* just the 2nd half */
+
+ ROM_REGION( 0x0300, "die_65sc02", 0 ) /* from the 65SC02 die inside of the custom CPU */
+ ROM_LOAD( "gteu65decoderom.bin", 0x0000, 0x02f1, CRC(089af0c6) SHA1(0f46a73a7859a694a07ebe74d476fae80e57e329) )
+
+ ROM_REGION( 0x0800, "decode", 0 ) /* from the CY7C291A inside of the custom CPU */
+ ROM_LOAD( "megacard_cy7291a.bin", 0x0000, 0x0800, CRC(596f01ac) SHA1(a8606a1dd385fbb46b1a96f11a759fa6580803d8) ) /* new dump */
+
+ ROM_REGION( 0x10000, "gfx1", 0 )
+ ROM_LOAD( "mega_zg2.ic11", 0x0000, 0x8000, CRC(0993d380) SHA1(e5e2386948fba2fb6b79339af27bd1d0f1e198ca) )
+ ROM_LOAD( "mega_zg1.ic10", 0x8000, 0x8000, CRC(de2e2dd0) SHA1(17962d84838f39de41bc7a41d399fd18cd0bd5b7) )
+
+ ROM_REGION( 0x0200, "proms", 0 )
+ ROM_LOAD( "n82s147an.bin", 0x0000, 0x0200, CRC(136245f3) SHA1(715309982fcafbce88b08237ca46acec31273938) )
+
+ ROM_REGION( 0x0200, "plds", 0 )
+ ROM_LOAD( "megacard_pal16l8.bin", 0x0000, 0x0117, CRC(3159a548) SHA1(ad904fa35b78570e44323469967803e34ef4bc0c) )
+ROM_END
+
+
/* (Multi) Joker Card from Vesely Svet (Sprightly World). Czech poker game.
Program roms seems encrypted. Seems to be a Big Deal clone, running in
Fun World Multi Win hardware.
@@ -6764,7 +6912,6 @@ GAMEL( 1986, bonuscrd, 0, fw2ndpal, bonuscrd, driver_device, 0,
GAMEL( 1986, bonuscrda, bonuscrd, fw2ndpal, bonuscrd, driver_device, 0, ROT0, "Fun World", "Bonus Card (Austrian, ATG Electronic hack)", MACHINE_IMPERFECT_COLORS, layout_bonuscrd ) // use fw1stpal machine for green background
GAMEL( 1986, bigdeal, bonuscrd, fw2ndpal, bigdeal, driver_device, 0, ROT0, "Fun World", "Big Deal (Hungarian, set 1)", MACHINE_IMPERFECT_COLORS, layout_bonuscrd )
GAMEL( 1986, bigdealb, bonuscrd, fw2ndpal, bigdeal, driver_device, 0, ROT0, "Fun World", "Big Deal (Hungarian, set 2)", MACHINE_IMPERFECT_COLORS, layout_bonuscrd )
-GAME( 1993, powercrd, 0, fw2ndpal, funworld, driver_device, 0, ROT0, "Fun World", "Power Card (Ver 0263, encrypted)", MACHINE_NOT_WORKING ) // clone of Bonus Card.
// CMC Italian jamma PCB's...
GAMEL( 1996, cuoreuno, 0, cuoreuno, cuoreuno, driver_device, 0, ROT0, "C.M.C.", "Cuore 1 (Italian)", 0, layout_jollycrd )
@@ -6827,6 +6974,8 @@ GAMEL( 198?, jolyjokrc, jolyjokr, fw1stpal, funworld, driver_device, 0,
// Encrypted games...
GAME( 1992, multiwin, 0, fw1stpal, funworld, funworld_state, multiwin, ROT0, "Fun World", "Multi Win (Ver.0167, encrypted)", MACHINE_NOT_WORKING )
+GAME( 1993, powercrd, 0, fw2ndpal, funworld, driver_device, 0, ROT0, "Fun World", "Power Card (Ver 0263, encrypted)", MACHINE_NOT_WORKING ) // clone of Bonus Card.
+GAME( 1993, megacard, 0, fw2ndpal, funworld, driver_device, 0, ROT0, "Fun World", "Mega Card (Ver.0210, encrypted)", MACHINE_NOT_WORKING )
GAME( 1993, jokercrd, 0, fw2ndpal, funworld, driver_device, 0, ROT0, "Vesely Svet", "Joker Card (Ver.A267BC, encrypted)", MACHINE_NOT_WORKING )
GAME( 198?, saloon, 0, saloon, saloon, funworld_state, saloon, ROT0, "<unknown>", "Saloon (French, encrypted)", MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/gcpinbal.cpp b/src/mame/drivers/gcpinbal.cpp
index a495ec75730..4ae33117ac7 100644
--- a/src/mame/drivers/gcpinbal.cpp
+++ b/src/mame/drivers/gcpinbal.cpp
@@ -23,8 +23,6 @@ TODO
----
- Screen flipping support
- - Understand role of bit 5 of IN1
- - Hook up 93C46 EEPROM
- Hook up ES-8712
- Sort out the IOC commands for the M6585 & ES-8712
- Is SW3 actually used?
@@ -64,7 +62,7 @@ ES-9209B
CPU: TMP68HC000P-16
Sound: OKI M6295
OKI M6585
- Ecxellent ES-8712
+ Excellent ES-8712
OSC: 32MHz, 14.31818MHz & 1056kHz, 640kHz resonators
RAM: Sony CXK5864BSP-10L 8K x 8bit high speed CMOS SRAM
Alliance AS7C256-20PC 32K x 8bit CMOS SRAM
@@ -189,8 +187,11 @@ WRITE16_MEMBER(gcpinbal_state::ioc_w)
m_oki->set_rom_bank((data & 0x800) >> 11);
break;
+ // 93C46 serial EEPROM (status read at D80087)
case 0x45:
- //m_adpcm_idle = 1;
+ m_eeprom->di_write(BIT(data >> 8, 2));
+ m_eeprom->clk_write(BIT(data >> 8, 1));
+ m_eeprom->cs_write(BIT(data >> 8, 0));
break;
// OKIM6295
@@ -254,6 +255,8 @@ WRITE16_MEMBER(gcpinbal_state::ioc_w)
/* Controlled through ioc? */
WRITE_LINE_MEMBER(gcpinbal_state::gcp_adpcm_int)
{
+ if (!state)
+ return;
if (m_adpcm_idle)
m_msm->reset_w(1);
if (m_adpcm_start >= 0x200000 || m_adpcm_start > m_adpcm_end)
@@ -266,8 +269,8 @@ WRITE_LINE_MEMBER(gcpinbal_state::gcp_adpcm_int)
{
uint8_t *ROM = memregion("msm")->base();
- m_adpcm_data = ((m_adpcm_trigger ? (ROM[m_adpcm_start] & 0x0f) : (ROM[m_adpcm_start] & 0xf0) >> 4));
- m_msm->data_w(m_adpcm_data & 0xf);
+ m_adpcm_select->ab_w(ROM[m_adpcm_start]);
+ m_adpcm_select->select_w(m_adpcm_trigger);
m_adpcm_trigger ^= 1;
if (m_adpcm_trigger == 0)
m_adpcm_start++;
@@ -366,7 +369,7 @@ static INPUT_PORTS_START( gcpinbal )
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNKNOWN )
- PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNKNOWN ) // This bit gets tested (search for d8 00 87)
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_READ_LINE_DEVICE_MEMBER("eeprom", eeprom_serial_93cxx_device, do_read)
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_COIN1 )
@@ -443,7 +446,6 @@ void gcpinbal_state::machine_start()
save_item(NAME(m_adpcm_end));
save_item(NAME(m_adpcm_idle));
save_item(NAME(m_adpcm_trigger));
- save_item(NAME(m_adpcm_data));
}
void gcpinbal_state::machine_reset()
@@ -460,7 +462,6 @@ void gcpinbal_state::machine_reset()
m_adpcm_start = 0;
m_adpcm_end = 0;
m_adpcm_trigger = 0;
- m_adpcm_data = 0;
m_bg0_gfxset = 0;
m_bg1_gfxset = 0;
m_msm_start = 0;
@@ -475,6 +476,8 @@ static MACHINE_CONFIG_START( gcpinbal, gcpinbal_state )
MCFG_CPU_PROGRAM_MAP(gcpinbal_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", gcpinbal_state, gcpinbal_interrupt)
+ MCFG_EEPROM_SERIAL_93C46_ADD("eeprom")
+
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@@ -497,6 +500,9 @@ static MACHINE_CONFIG_START( gcpinbal, gcpinbal_state )
MCFG_OKIM6295_ADD("oki", XTAL_1_056MHz, OKIM6295_PIN7_HIGH)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
+ MCFG_DEVICE_ADD("adpcm_select", HCT157, 0)
+ MCFG_74157_OUT_CB(DEVWRITE8("msm", msm6585_device, data_w))
+
MCFG_SOUND_ADD("msm", MSM6585, XTAL_640kHz)
MCFG_MSM6585_VCLK_CB(WRITELINE(gcpinbal_state, gcp_adpcm_int)) /* VCK function */
MCFG_MSM6585_PRESCALER_SELECTOR(MSM6585_S40) /* 16 kHz */
diff --git a/src/mame/drivers/gkigt.cpp b/src/mame/drivers/gkigt.cpp
index 451b249cb1c..b7f536f13a5 100644
--- a/src/mame/drivers/gkigt.cpp
+++ b/src/mame/drivers/gkigt.cpp
@@ -279,9 +279,9 @@ ROM_START( ms3 )
ROM_REGION( 0x200000, "snd", 0 )
ROM_LOAD( "1h5053xx.u6", 0x000000, 0x080000, CRC(6735c65a) SHA1(198cacec5441aa615c0de63a0b4e47265636bcee) )
-
+
ROM_REGION( 0x20000, "nvram", 0 )
- ROM_LOAD( "nvram", 0x000000, 0x020000, CRC(acbbc6d9) SHA1(6e86d24ad3793b41f1f23f80f9bdb22767abc3bf) )
+ ROM_LOAD( "nvram", 0x000000, 0x020000, CRC(acbbc6d9) SHA1(6e86d24ad3793b41f1f23f80f9bdb22767abc3bf) )
ROM_END
ROM_START( ms72c )
@@ -302,9 +302,9 @@ ROM_START( ms72c )
ROM_REGION( 0x200000, "snd", 0 )
ROM_LOAD( "1H5008FA Multistar 7.u6", 0x000000, 0x100000, CRC(69656637) SHA1(28c2cf48856ee4f820146fdbd0f3c7e307892dc6) )
-
+
ROM_REGION( 0x20000, "nvram", 0 )
- ROM_LOAD( "nvram", 0x000000, 0x020000, CRC(b5e42dbc) SHA1(f6afadb6877bca2cef40725b001c7918f9c99359) )
+ ROM_LOAD( "nvram", 0x000000, 0x020000, CRC(b5e42dbc) SHA1(f6afadb6877bca2cef40725b001c7918f9c99359) )
ROM_END
diff --git a/src/mame/drivers/gladiatr.cpp b/src/mame/drivers/gladiatr.cpp
index 828fa447413..7b915a13739 100644
--- a/src/mame/drivers/gladiatr.cpp
+++ b/src/mame/drivers/gladiatr.cpp
@@ -270,22 +270,6 @@ WRITE8_MEMBER(gladiatr_state::gladiatr_irq_patch_w)
WRITE_LINE_MEMBER(gladiatr_state::tclk_w)
{
m_tclk_val = state != 0;
-
- // these are actually edge-triggered, but MAME only supports polled inputs
-
- u8 const new_in0_val(m_in0->read());
- if (BIT(~new_in0_val & (new_in0_val ^ m_in0_val), 5))
- m_cctl_p1 = (m_cctl_p1 & 0xfc) | BIT(~new_in0_val, 5) | (BIT(~new_in0_val, 5) << 1);
- else
- m_cctl_p1 = (m_cctl_p1 & 0xfe) | BIT(~new_in0_val, 5);
- m_in0_val = new_in0_val;
-
- u8 const new_in1_val(m_in0->read());
- if (BIT(~new_in1_val & (new_in1_val ^ m_in1_val), 5))
- m_cctl_p2 = (m_cctl_p2 & 0xfc) | BIT(~new_in1_val, 5) | (BIT(~new_in1_val, 5) << 1);
- else
- m_cctl_p2 = (m_cctl_p2 & 0xfe) | BIT(~new_in1_val, 5);
- m_in1_val = new_in1_val;
}
READ8_MEMBER(gladiatr_state::cctl_p1_r)
@@ -370,6 +354,33 @@ READ8_MEMBER(gladiatr_state::csnd_p2_r)
}
+INPUT_CHANGED_MEMBER(gladiatr_state::p1_s1)
+{
+ // P11 gets the value of 1P-S2 at the moment 1P-S1 was pressed
+ if (oldval && !newval)
+ m_cctl_p1 = (m_cctl_p1 & 0xfd) | (BIT(m_cctl_p1, 0) << 1);
+}
+
+INPUT_CHANGED_MEMBER(gladiatr_state::p1_s2)
+{
+ // P10 is high when 1P-S2 is pressed
+ m_cctl_p1 = (m_cctl_p1 & 0xfe) | (newval ? 0x00 : 0x01);
+}
+
+INPUT_CHANGED_MEMBER(gladiatr_state::p2_s1)
+{
+ // P21 gets the value of 2P-S2 at the moment 2P-S1 was pressed
+ if (oldval && !newval)
+ m_cctl_p2 = (m_cctl_p2 & 0xfd) | (BIT(m_cctl_p2, 0) << 1);
+}
+
+INPUT_CHANGED_MEMBER(gladiatr_state::p2_s2)
+{
+ // P20 is high when 2P-S2 is pressed
+ m_cctl_p2 = (m_cctl_p2 & 0xfe) | (newval ? 0x00 : 0x01);
+}
+
+
READ8_MEMBER(ppking_state::ppking_f1_r)
{
@@ -622,8 +633,8 @@ static INPUT_PORTS_START( gladiatr )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_8WAY
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_8WAY
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, gladiatr_state, p1_s1, 0)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_CHANGED_MEMBER(DEVICE_SELF, gladiatr_state, p2_s2, 0)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2 )
@@ -632,8 +643,8 @@ static INPUT_PORTS_START( gladiatr )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_COCKTAIL
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_COCKTAIL
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_COCKTAIL
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL PORT_CHANGED_MEMBER(DEVICE_SELF, gladiatr_state, p2_s1, 0)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL PORT_CHANGED_MEMBER(DEVICE_SELF, gladiatr_state, p2_s2, 0)
PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) // coin counter outputs
PORT_START("IN2") // cctl p1
@@ -1143,16 +1154,12 @@ DRIVER_INIT_MEMBER(gladiatr_state,gladiatr)
membank("bank2")->set_entry(0);
m_tclk_val = false;
- m_in0_val = 0xff;
- m_in1_val = 0xff;
m_cctl_p1 = 0xff;
m_cctl_p2 = 0xff;
m_ucpu_p1 = 0xff;
m_csnd_p1 = 0xff;
save_item(NAME(m_tclk_val));
- save_item(NAME(m_in0_val));
- save_item(NAME(m_in1_val));
save_item(NAME(m_cctl_p1));
save_item(NAME(m_cctl_p2));
save_item(NAME(m_ucpu_p1));
diff --git a/src/mame/drivers/goldstar.cpp b/src/mame/drivers/goldstar.cpp
index bf75c1ca50f..173b04f54c1 100644
--- a/src/mame/drivers/goldstar.cpp
+++ b/src/mame/drivers/goldstar.cpp
@@ -922,8 +922,22 @@ ADDRESS_MAP_END
/* need to check item by item...
- PPIs are OK.
- RAM/ROM are OK.
+
+ PPIs are OK:
+ B800 = 9B (A, B, C, all input)
+ B810 = 9B (A, B, C, all input)
+ B820 = 90 (A input, B & C output)
+
+ RAM/ROM/NVRAM are OK.
+
+ Reels RAM and scroll are OK.
+ (only reel 2 seems to be used by the game)
+
+ Video & atr RAM are OK.
+
+ PSG is OK.
+
+ AY8910 ports are OK.
*/
static ADDRESS_MAP_START( mbstar_map, AS_PROGRAM, 8, goldstar_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM
@@ -4111,6 +4125,163 @@ static INPUT_PORTS_START( bingownga )
PORT_DIPSETTING( 0x28, "1 Coin/10 Credits" )
INPUT_PORTS_END
+static INPUT_PORTS_START( mbstar )
+ PORT_START("IN0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_1) PORT_NAME("IN0-1")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CODE(KEYCODE_2) PORT_NAME("Increment top's 'S' (bet?)") // Increment top's 'S' (looks like bet)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_3) PORT_NAME("IN0-3")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_4) PORT_NAME("IN0-4")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CODE(KEYCODE_5) PORT_NAME("Collect") // Collect. Also used to blank the BK.
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_6) PORT_NAME("IN0-6")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CODE(KEYCODE_7) PORT_NAME("Bookkeeping: Down") // BK: down.
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CODE(KEYCODE_8) PORT_NAME("Bookkeeping: Set/Enter - Start") // BK: enter. (start?)
+
+ PORT_START("IN1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_Q) PORT_NAME("IN1-1")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_W) PORT_NAME("IN1-2")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_E) PORT_NAME("IN1-3")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_R) PORT_NAME("IN1-4")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_T) PORT_NAME("IN1-5")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_Y) PORT_NAME("IN1-6")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_U) PORT_NAME("IN1-7")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_I) PORT_NAME("IN1-8")
+
+ PORT_START("IN2")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_A) PORT_NAME("IN2-1")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_S) PORT_NAME("IN2-2")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_D) PORT_NAME("IN2-3")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_F) PORT_NAME("IN2-4")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_G) PORT_NAME("IN2-5")
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_H) PORT_NAME("IN2-6")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_J) PORT_NAME("IN2-7")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_K) PORT_NAME("IN2-8")
+
+ PORT_START("IN3")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_Z) PORT_NAME("IN3-1")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_X) PORT_NAME("IN3-2")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_C) PORT_NAME("IN3-3")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CODE(KEYCODE_V) PORT_NAME("Coin 1") PORT_IMPULSE(2) // coin 1
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CODE(KEYCODE_B) PORT_NAME("Coin 2") PORT_IMPULSE(2) // coin 2
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CODE(KEYCODE_N) PORT_NAME("Note") // note acceptor
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CODE(KEYCODE_M) PORT_NAME("Remote") // remote credits
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CODE(KEYCODE_L) PORT_NAME("Coin 3 (tokens)") // coin 3 (tokens)
+
+ PORT_START("IN4")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("IN4-1")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("Operator Bookkeeping") // operator bookkeeping
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("IN4-3")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("IN4-4")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("Payout") // payout?
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("IN4-6")
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("IN4-7")
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("Supervisor Bookkeeping") // supervisor bookkeeping
+
+ PORT_START("DSW1")
+ PORT_DIPNAME( 0x01, 0x01, "DSW1")
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("DSW2")
+ PORT_DIPNAME( 0x01, 0x01, "DSW2")
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) ) // enter in a different mode, and no attract.
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) // seems to accellerate the different mode.
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("DSW3")
+ PORT_DIPNAME( 0x01, 0x01, "DSW3")
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START("DSW4")
+ PORT_DIPNAME( 0x01, 0x01, "DSW4")
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+INPUT_PORTS_END
+
+
static INPUT_PORTS_START( magodds )
PORT_START("IN0") /* d800 */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
@@ -11332,7 +11503,7 @@ ROM_END
/*
Mega Bonus Star II (Millennium Edition, Euro)
Auto-Data Graz, 2002.
-
+
W4 derivative hardware...
PCB has a daughterboard with:
@@ -11372,7 +11543,58 @@ ROM_END
C: DM74LS374N
D: DS1232
-
+ Unknown Zilog 40pin IC (scratched):
+ (could be either a Z86C15 or Z86C91 MCU)
+
+ +-----V-----+
+ VCC -|01 40|- 74LS08N (Pin 01)
+ XTAL 8MHz <-|02 39|- GAL16V8 (Pin 17)
+ XTAL 8MHz >-|03 Z 38|- 74LS374 (Pin 03)
+ N/C -|04 I 37|- 74LS374 (Pin 04)
+ N/C -|05 L 36|- 74LS374 (Pin 07)
+ 74LS08N (Pin 10) -|06 O 35|- 74LS374 (Pin 08)
+ GAL16V8 (Pin 07) -|07 G 34|- 74LS374 (Pin 13)
+ GAL16V8 (Pin 08) -|08 33|- 74LS374 (Pin 14)
+ 74LS374 (Pin 11) -|09 32|- 74LS374 (Pin 17)
+ N/C -|10 31|- 74LS374 (Pin 18)
+ GND -|11 30|- 74LS374 (Pin 01)
+ N/C -|12 29|- 74LS08N (Pin 02)
+ 27C512 (A08) -|13 28|- 27C512 (Q7)
+ 27C512 (A09) -|14 27|- 27C512 (Q6)
+ 27C512 (A10) -|15 26|- 27C512 (Q5)
+ 27C512 (A11) -|16 25|- 27C512 (Q4)
+ 27C512 (A12) -|17 24|- 27C512 (Q3)
+ 27C512 (A13) -|18 23|- 27C512 (Q2)
+ 27C512 (A14) -|19 22|- 27C512 (Q1)
+ 27C512 (A15) -|20 21|- 27C512 (Q0)
+ +-----------+
+
+ 40-Pin DIP Pin Identification for Z86C15 MCU (for reference):
+
+ ---------------------------------------------------------
+ Pin Symbol Function Direction
+ ---------------------------------------------------------
+ 01 VCC Power Supply Input
+ 02 CLKOUT Z8 System Clock Output
+ 03 RCIN RC Oscillator Clock Input
+ 04 P37 Port 3, Pin 7 Output
+ 05 P30 Port 3, Pin 0 Input
+ 06 /RESET Reset Input
+ 07 AGND Analog Ground
+ 08 NC Not Connected
+ 09 /WDTOUT Watch-Dog Timer Output
+ 10 P35 Port 3, Pin 5 Output
+ 11 GND Ground
+ 12 P32 Port 3, Pin 2 Input
+ 13-20 P00-P07 Port 0, Pins 0,1,2,3,4,5,6,7 In/Output
+ 21-28 P10-P17 Port 1, Pins 0,1,2,3,4,5,6,7 In/Output
+ 29 P34 Port 3, Pin 4 Output
+ 30 P33 Port 3, Pin 3 Input
+ 31-38 P20-P27 Port 2, Pins 0,1,2,3,4,5,6,7 In/Output
+ 39 P31 Port 3, Pin 1 Input
+ 40 P36 Port 3, Pin 6 Output
+ ---------------------------------------------------------
+
BASE Board (based on WING W4):
XTAL: 11.98135MHZ
@@ -15826,7 +16048,7 @@ GAME( 1991, megaline, 0, megaline, megaline, driver_device, 0,
GAMEL( 1993, bingowng, 0, bingowng, bingowng, driver_device, 0, ROT0, "Wing Co., Ltd.", "Bingo (set 1)", 0, layout_bingowng )
GAMEL( 1993, bingownga, bingowng, bingownga,bingownga,driver_device, 0, ROT0, "Wing Co., Ltd.", "Bingo (set 2)", 0, layout_bingowng )
-GAME( 2002, mbs2euro, 0, mbstar, lucky8, driver_device, 0, ROT0, "Auto-Data Graz", "Mega Bonus Star II (Euro, Millennium Edition)", MACHINE_NOT_WORKING ) // need more work in memory map, inputs, and reels alignment.
+GAME( 2002, mbs2euro, 0, mbstar, mbstar, driver_device, 0, ROT0, "Auto-Data Graz", "Mega Bonus Star II (Euro, Millennium Edition)", MACHINE_NOT_WORKING ) // need more work in memory map, inputs, and reels alignment.
// --- Flaming 7's hardware (W-4 derivative) ---
diff --git a/src/mame/drivers/gts80.cpp b/src/mame/drivers/gts80.cpp
index 09e1adc3500..bf6ec22fbcf 100644
--- a/src/mame/drivers/gts80.cpp
+++ b/src/mame/drivers/gts80.cpp
@@ -577,6 +577,17 @@ ROM_START(marspf)
ROM_LOAD("f666-s2.snd", 0x7800, 0x0800, CRC(7bd64d94) SHA1(a52492820e69f2072fd1dffb5cbb48fb960e19ce))
ROM_END
+ROM_START(marspp)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("u2_80.bin", 0x2000, 0x1000, CRC(4f0bc7b1) SHA1(612cbacdca5cfa6ad23940796df3b7c385be79fe))
+ ROM_LOAD("u3_80.bin", 0x3000, 0x1000, CRC(1e69f9d0) SHA1(ad738cac2555830257b531e5e533b15362f624b9))
+ ROM_LOAD("666s-1.cpu", 0x1000, 0x0800, CRC(029e0bcf) SHA1(20764464ede38bee2a726fc2ae98a60375b3cb1c))
+
+ ROM_REGION(0x10000, "r1sound:audiocpu", 0)
+ ROM_LOAD("666-s1.snd", 0x7000, 0x0800, CRC(d33dc8a5) SHA1(8d071c392996a74c3cdc2cf5ea3be3c86553ce89))
+ ROM_LOAD("666-s2.snd", 0x7800, 0x0800, CRC(e5616f3e) SHA1(a6b5ebd0b456a555db0889cd63ce79aafc64dbe5))
+ROM_END
+
/*-------------------------------------------------------------------
/ Panthera #652
/-------------------------------------------------------------------*/
@@ -785,6 +796,7 @@ ROM_END
/* cust */GAME(1981, pnkpnthr, 0, gts80_s, gts80, gts80_state, gts80, ROT0, "Gottlieb", "Pink Panther", MACHINE_IS_SKELETON_MECHANICAL)
/* disp1 */GAME(1981, marsp, 0, gts80_ss, gts80, gts80_state, gts80, ROT0, "Gottlieb", "Mars - God of War", MACHINE_IS_SKELETON_MECHANICAL)
/* disp1 */GAME(1981, marspf, marsp, gts80_ss, gts80, gts80_state, gts80, ROT0, "Gottlieb", "Mars - God of War (French speech)", MACHINE_IS_SKELETON_MECHANICAL)
+/* disp1 */GAME(1981, marspp, marsp, gts80_ss, gts80, gts80_state, gts80, ROT0, "Gottlieb", "Mars - God of War (Prototype)", MACHINE_IS_SKELETON_MECHANICAL)
/* disp1 */GAME(1981, vlcno_ax, 0, gts80_ss, gts80, gts80_state, gts80, ROT0, "Gottlieb", "Volcano", MACHINE_IS_SKELETON_MECHANICAL)
/* disp1 */GAME(1981, vlcno_1c, 0, gts80_s, gts80, gts80_state, gts80, ROT0, "Gottlieb", "Volcano (Sound Only set 1)", MACHINE_IS_SKELETON_MECHANICAL)
/* disp1 */GAME(1981, vlcno_1b, vlcno_1c, gts80_s, gts80, gts80_state, gts80, ROT0, "Gottlieb", "Volcano (Sound Only set 2)", MACHINE_IS_SKELETON_MECHANICAL)
diff --git a/src/mame/drivers/gts80b.cpp b/src/mame/drivers/gts80b.cpp
index fdd883cb3f2..9a0b2e58146 100644
--- a/src/mame/drivers/gts80b.cpp
+++ b/src/mame/drivers/gts80b.cpp
@@ -478,6 +478,19 @@ ROM_START(amazonh3)
ROM_REGION(0x10000, "cpu2", ROMREGION_ERASEFF)
ROM_END
+ROM_START(amazonh3a)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("684d-1-cpu.rom", 0x2000, 0x2000, CRC(bf4674e1) SHA1(30974f89f9e4cbb61f8f620499ee6a64c9b7b31c))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("684d-snd.rom",0x8000,0x8000, CRC(a660f233) SHA1(3b80629696a2fd5aa4a86ed472e60c95d3cfa906))
+
+ ROM_REGION(0x10000, "cpu2", ROMREGION_ERASEFF)
+ROM_END
+
/*-------------------------------------------------------------------
/ Arena (#709)
/-------------------------------------------------------------------*/
@@ -519,6 +532,44 @@ ROM_START(arenaa)
ROM_LOAD("yrom2.snd",0xc000,0x2000, CRC(cc2aef4e) SHA1(a6e243de99f6a76eb527e879f4441c036dd379b6))
ROM_END
+ROM_START(arenaf)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2f.cpu", 0x1000, 0x0800, CRC(49b127d8) SHA1(0436f83e969b4bfc7edaf881bf7556a868c88cdc))
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_RELOAD(0x9000, 0x0800)
+ ROM_RELOAD(0xd000, 0x0800)
+ ROM_LOAD("prom1f.cpu", 0x2000, 0x2000, CRC(391fb7de) SHA1(ec47a6e057d18a0043afccb694c23d0fa0d42aa0))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd",0xe000,0x2000, CRC(78e6cbf1) SHA1(7b66a0cb211a93cf475172aa0465a952009e1a59))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd",0xe000,0x2000, CRC(f7a951c2) SHA1(12d7a6119d9033ae02c6312c9af888bfc7c63ad1))
+ ROM_LOAD("yrom2.snd",0xc000,0x2000, CRC(cc2aef4e) SHA1(a6e243de99f6a76eb527e879f4441c036dd379b6))
+ROM_END
+
+ROM_START(arenag)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2g.cpu", 0x1000, 0x0800, CRC(e170d1cd) SHA1(bd7919eb9e480309f794ac25a371c7b818dcd01b))
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_RELOAD(0x9000, 0x0800)
+ ROM_RELOAD(0xd000, 0x0800)
+ ROM_LOAD("prom1g.cpu", 0x2000, 0x2000, CRC(71fd6e48) SHA1(5c87ba79968085d386fd1357c9d8b2b7a745682a))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd",0xe000,0x2000, CRC(78e6cbf1) SHA1(7b66a0cb211a93cf475172aa0465a952009e1a59))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd",0xe000,0x2000, CRC(f7a951c2) SHA1(12d7a6119d9033ae02c6312c9af888bfc7c63ad1))
+ ROM_LOAD("yrom2.snd",0xc000,0x2000, CRC(cc2aef4e) SHA1(a6e243de99f6a76eb527e879f4441c036dd379b6))
+ROM_END
+
/*-------------------------------------------------------------------
/ Bad Girls (#717)
/-------------------------------------------------------------------*/
@@ -540,6 +591,42 @@ ROM_START(badgirls)
ROM_LOAD("yrom1.snd", 0x8000, 0x8000, CRC(ab3b8e2d) SHA1(b57a0b804b42b923bb102d295e3b8a69b1033d27))
ROM_END
+ROM_START(badgirlsf)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2f.cpu", 0x1000, 0x0800, CRC(58c35099) SHA1(ff76bd28175ea0f5d0437c16c5ae6886339edfe2))
+ ROM_CONTINUE(0x9000, 0x0800)
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_CONTINUE(0xd000, 0x0800)
+ ROM_LOAD("prom1f.cpu", 0x2000, 0x2000, CRC(9861147a) SHA1(e9d31cd1130bc1785db26c23f52944842fdd4ca0))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd", 0x8000, 0x8000, CRC(452dec20) SHA1(a9c41dfb2d83c5671ab96e946f13df774b567976))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd", 0x8000, 0x8000, CRC(ab3b8e2d) SHA1(b57a0b804b42b923bb102d295e3b8a69b1033d27))
+ROM_END
+
+ROM_START(badgirlsg)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2g.cpu", 0x1000, 0x0800, CRC(55aa30ac) SHA1(9544485ccf52a2ad51a00cce0c12871db099699f))
+ ROM_CONTINUE(0x9000, 0x0800)
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_CONTINUE(0xd000, 0x0800)
+ ROM_LOAD("prom1g.cpu", 0x2000, 0x2000, CRC(f2923255) SHA1(645b62d015e3a4feaf485c600eb345824f551b9e))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd", 0x8000, 0x8000, CRC(452dec20) SHA1(a9c41dfb2d83c5671ab96e946f13df774b567976))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd", 0x8000, 0x8000, CRC(ab3b8e2d) SHA1(b57a0b804b42b923bb102d295e3b8a69b1033d27))
+ROM_END
+
/*-------------------------------------------------------------------
/ Big House (#713)
/-------------------------------------------------------------------*/
@@ -561,6 +648,42 @@ ROM_START(bighouse)
ROM_LOAD("yrom1.snd", 0x8000, 0x8000, CRC(0b1ba1cb) SHA1(26327689992018837b1c9957c515ab67248623eb))
ROM_END
+ROM_START(bighousef)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2f.cpu", 0x1000, 0x0800, CRC(767efc44) SHA1(6b8f9a580e6a6ad92c9efe9f4345496d5063b7a8))
+ ROM_CONTINUE(0x9000, 0x0800)
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_CONTINUE(0xd000, 0x0800)
+ ROM_LOAD("prom1f.cpu", 0x2000, 0x2000, CRC(b87150bc) SHA1(2ebdf27ede3445ac99068c8cec712c06e57c7ffc))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd", 0x8000, 0x8000, CRC(f330fd04) SHA1(1288c47f636d9d5b826a2b870b81788a630e489e))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd", 0x8000, 0x8000, CRC(0b1ba1cb) SHA1(26327689992018837b1c9957c515ab67248623eb))
+ROM_END
+
+ROM_START(bighouseg)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2g.cpu", 0x1000, 0x0800, CRC(214f0afb) SHA1(9874773e4ffa2472e78d42dfa9e21a621bf7b49e))
+ ROM_CONTINUE(0x9000, 0x0800)
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_CONTINUE(0xd000, 0x0800)
+ ROM_LOAD("prom1g.cpu", 0x2000, 0x2000, CRC(374f3593) SHA1(e90d867fff28ee86f017b1b638bc26f1bcde6b81))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd", 0x8000, 0x8000, CRC(f330fd04) SHA1(1288c47f636d9d5b826a2b870b81788a630e489e))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd", 0x8000, 0x8000, CRC(0b1ba1cb) SHA1(26327689992018837b1c9957c515ab67248623eb))
+ROM_END
+
/*-------------------------------------------------------------------
/ Bone Busters Inc. (#719)
/-------------------------------------------------------------------*/
@@ -606,6 +729,27 @@ ROM_START(bonebstrf)
ROM_LOAD("yrom1.snd", 0x8000, 0x8000, CRC(a95eedfc) SHA1(5ced2d6869a9895f8ff26d830b21d3c9364b32e7))
ROM_END
+ROM_START(bonebstrg)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2g.cpu", 0x1000, 0x0800, CRC(3b85c8bd) SHA1(5c99349dc3ae05b82932d6ec9d2d1a29c2a7e36d))
+ ROM_CONTINUE(0x9000, 0x0800)
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_CONTINUE(0xd000, 0x0800)
+ ROM_LOAD("prom1g.cpu", 0x2000, 0x2000, CRC(a0aab93e) SHA1(b7fa3d6eeb1977e4d91644aab1ac03aeee6934d0))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu4", 0)
+ ROM_LOAD("drom2.snd", 0x8000, 0x8000, CRC(d147d78d) SHA1(f8f6d6a1921685b883b224a9ea85ead52a32a4c3))
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd", 0x8000, 0x8000, CRC(ec43f4e9) SHA1(77b0988700be7a597dca7e5f06ac5d3c6834ce21))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd", 0x8000, 0x8000, CRC(a95eedfc) SHA1(5ced2d6869a9895f8ff26d830b21d3c9364b32e7))
+ROM_END
+
/*-------------------------------------------------------------------
/ Bounty Hunter (#694)
/-------------------------------------------------------------------*/
@@ -620,6 +764,17 @@ ROM_START(bountyh)
ROM_LOAD("694-s.snd", 0x0800, 0x0800, CRC(a0383e41) SHA1(156514d2b52fcd89b608b85991c5066780949979))
ROM_END
+ROM_START(bountyhg)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom1g.cpu", 0x2000, 0x2000, CRC(ea4b7e2d) SHA1(9141c950b33e32ae8ad76fd0dd06d1a13d38be9d))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x1000, "r0sound:audiocpu", 0)
+ ROM_LOAD("694-s.snd", 0x0800, 0x0800, CRC(a0383e41) SHA1(156514d2b52fcd89b608b85991c5066780949979))
+ROM_END
+
/*-------------------------------------------------------------------
/ Chicago Cubs' Triple Play (#696)
/-------------------------------------------------------------------*/
@@ -666,16 +821,70 @@ ROM_START(diamondp)
ROM_LOAD("yrom1.snd", 0x8000, 0x8000, CRC(0a18d626) SHA1(6b367668be55ca04c69c4c4c5a4a524ae8f790f8))
ROM_END
+ROM_START(diamondpf)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2f.cpu", 0x1000, 0x0800, CRC(943019a8) SHA1(558c3696339bb6e150b4ddb499bc60897d5954ec))
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_RELOAD(0x9000, 0x0800)
+ ROM_RELOAD(0xd000, 0x0800)
+ ROM_LOAD("prom1f.cpu", 0x2000, 0x2000, CRC(479b0267) SHA1(a9586c5b2cc3561ba3409123eca5a73ebabfd823))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd", 0x8000, 0x8000, CRC(c216d1e4) SHA1(aa38db5ad36d1d1d35e727ab27c1f1c05a9627cd))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd", 0x8000, 0x8000, CRC(0a18d626) SHA1(6b367668be55ca04c69c4c4c5a4a524ae8f790f8))
+ROM_END
+
+ROM_START(diamondpg)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2g.cpu", 0x1000, 0x0800, CRC(f0ef69f6) SHA1(1f48bb656bb20073e2ff261199cb94919f0bb2ab))
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_RELOAD(0x9000, 0x0800)
+ ROM_RELOAD(0xd000, 0x0800)
+ ROM_LOAD("prom1g.cpu", 0x2000, 0x2000, CRC(961cfdf9) SHA1(97135f77705969736f704acdeda6157bb765c73e))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd", 0x8000, 0x8000, CRC(c216d1e4) SHA1(aa38db5ad36d1d1d35e727ab27c1f1c05a9627cd))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd", 0x8000, 0x8000, CRC(0a18d626) SHA1(6b367668be55ca04c69c4c4c5a4a524ae8f790f8))
+ROM_END
+
/*-------------------------------------------------------------------
/ Excalibur (#715)
/-------------------------------------------------------------------*/
ROM_START(excalibr)
ROM_REGION(0x10000, "maincpu", 0)
- ROM_LOAD("prom2.cpu", 0x1000, 0x0800, CRC(499e2e41) SHA1(1e3fcba18882bd7df30a43843916aa5d7968eecc))
+ ROM_LOAD("prom2.cpu", 0x1000, 0x0800, CRC(082d64ab) SHA1(0eae3b549839fc281d2487d483d0b4e723ebdc48))
+ ROM_CONTINUE(0x9000, 0x0800)
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_CONTINUE(0xd000, 0x0800)
+ ROM_LOAD("prom1.cpu", 0x2000, 0x2000, CRC(e8902c16) SHA1(c3e4ece6be7027a4deef052ba4be752070e9b542))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd", 0x8000, 0x8000, CRC(a4368cd0) SHA1(c48513e56899938dc83a3545d8ee9def3dc1491f))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd", 0x8000, 0x8000, CRC(9f194744) SHA1(dbd73b546071c3d4f0dcfe21e3e646da716c5b71))
+ROM_END
+
+ROM_START(excalibrf)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2f.cpu", 0x1000, 0x0800, CRC(499e2e41) SHA1(1e3fcba18882bd7df30a43843916aa5d7968eecc))
ROM_CONTINUE(0x9000, 0x0800)
ROM_RELOAD(0x5000, 0x0800)
ROM_CONTINUE(0xd000, 0x0800)
- ROM_LOAD("prom1.cpu", 0x2000, 0x2000, CRC(ed1083d7) SHA1(3ff829ecfaba7d20c75268d3ee5224cb3cac3507))
+ ROM_LOAD("prom1f.cpu", 0x2000, 0x2000, CRC(ed1083d7) SHA1(3ff829ecfaba7d20c75268d3ee5224cb3cac3507))
ROM_RELOAD(0x6000, 0x2000)
ROM_RELOAD(0xa000, 0x2000)
ROM_RELOAD(0xe000, 0x2000)
@@ -709,6 +918,44 @@ ROM_START(genesisp)
ROM_LOAD("yrom2.snd",0xc000,0x2000, CRC(0528c024) SHA1(d24ff7e088b08c1f35b54be3c806f8a8757d96c7))
ROM_END
+ROM_START(genesispf)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2f.cpu", 0x1000, 0x0800, CRC(ea7f824f) SHA1(45f619153e0584cffd33e6e09e6f5a97ab9522b2))
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_RELOAD(0x9000, 0x0800)
+ ROM_RELOAD(0xd000, 0x0800)
+ ROM_LOAD("prom1f.cpu", 0x2000, 0x2000, CRC(e7ef875b) SHA1(37ac83d9a75ce604c5a4173ce918beb64f75cd3e))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd",0xe000,0x2000, CRC(758e1743) SHA1(6df3011c044796afcd88e52d1ca69692cb489ff4))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd",0xe000,0x2000, CRC(4869b0ec) SHA1(b8a56753257205af56e06105515b8a700bb1935b))
+ ROM_LOAD("yrom2.snd",0xc000,0x2000, CRC(0528c024) SHA1(d24ff7e088b08c1f35b54be3c806f8a8757d96c7))
+ROM_END
+
+ROM_START(genesispg)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2g.cpu", 0x1000, 0x0800, CRC(e8fc30af) SHA1(2401bff3cf566cae4e6de6167fa004c5fe232928))
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_RELOAD(0x9000, 0x0800)
+ ROM_RELOAD(0xd000, 0x0800)
+ ROM_LOAD("prom1g.cpu", 0x2000, 0x2000, CRC(68a27ec1) SHA1(b14a933e6c7e2972faef8dfecebabe3da4021367))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd",0xe000,0x2000, CRC(758e1743) SHA1(6df3011c044796afcd88e52d1ca69692cb489ff4))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd",0xe000,0x2000, CRC(4869b0ec) SHA1(b8a56753257205af56e06105515b8a700bb1935b))
+ ROM_LOAD("yrom2.snd",0xc000,0x2000, CRC(0528c024) SHA1(d24ff7e088b08c1f35b54be3c806f8a8757d96c7))
+ROM_END
+
/*-------------------------------------------------------------------
/ Gold Wings (#707)
/-------------------------------------------------------------------*/
@@ -731,6 +978,44 @@ ROM_START(goldwing)
ROM_LOAD("yrom2.snd",0xc000,0x2000, CRC(4e482023) SHA1(62e97d229eb28ff67f0ebc4ee04c1b4918a4affe))
ROM_END
+ROM_START(goldwingf)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2f.cpu", 0x1000, 0x0800, CRC(50337adf) SHA1(dc286d52e6872edd68af442cbd0442babc174b93))
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_RELOAD(0x9000, 0x0800)
+ ROM_RELOAD(0xd000, 0x0800)
+ ROM_LOAD("prom1f.cpu", 0x2000, 0x2000, CRC(ec046fc0) SHA1(856f09f420e0f37488b0a896a37fffad62f18d6d))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd",0xe000,0x2000, CRC(892dbb21) SHA1(e24611544693e95dd2b9c0f2532c4d1f0b8ac10c))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd",0xe000,0x2000, CRC(e17e9b1f) SHA1(ada9a6139a13ef31173801d560ec732d5a285140))
+ ROM_LOAD("yrom2.snd",0xc000,0x2000, CRC(4e482023) SHA1(62e97d229eb28ff67f0ebc4ee04c1b4918a4affe))
+ROM_END
+
+ROM_START(goldwingg)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2g.cpu", 0x1000, 0x0800, CRC(f69c963c) SHA1(9e39344ecfcca1115e12c559c66eaa21716c0ce2))
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_RELOAD(0x9000, 0x0800)
+ ROM_RELOAD(0xd000, 0x0800)
+ ROM_LOAD("prom1g.cpu", 0x2000, 0x2000, CRC(a9349b2f) SHA1(836c86d8db8be5ac29013bbe4daec8d96d15fba0))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd",0xe000,0x2000, CRC(892dbb21) SHA1(e24611544693e95dd2b9c0f2532c4d1f0b8ac10c))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd",0xe000,0x2000, CRC(e17e9b1f) SHA1(ada9a6139a13ef31173801d560ec732d5a285140))
+ ROM_LOAD("yrom2.snd",0xc000,0x2000, CRC(4e482023) SHA1(62e97d229eb28ff67f0ebc4ee04c1b4918a4affe))
+ROM_END
+
/*-------------------------------------------------------------------
/ Hollywood Heat (#703)
/-------------------------------------------------------------------*/
@@ -753,6 +1038,44 @@ ROM_START(hlywoodh)
ROM_LOAD("yrom2.snd",0xc000,0x2000, CRC(51709c2f) SHA1(5834d7b72bd36e30c87377dc7c3ad0cf26ff303a))
ROM_END
+ROM_START(hlywoodhf)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2f.cpu", 0x1000, 0x0800, CRC(969ca81f) SHA1(2606a0f63434056c5d2b509a885c9919a7a5d70f))
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_RELOAD(0x9000, 0x0800)
+ ROM_RELOAD(0xd000, 0x0800)
+ ROM_LOAD("prom1f.cpu", 0x2000, 0x2000, CRC(ddc45d2d) SHA1(8bd50f3e0049fe322f7bc626d39f9787cfea1940))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd",0xe000,0x2000, CRC(a698ec33) SHA1(e7c1d28279ec4f12095c3a106c6cefcc2a84b31e))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd",0xe000,0x2000, CRC(9232591e) SHA1(72883e0c542c572226c6c654bea14749cc9e351f))
+ ROM_LOAD("yrom2.snd",0xc000,0x2000, CRC(51709c2f) SHA1(5834d7b72bd36e30c87377dc7c3ad0cf26ff303a))
+ROM_END
+
+ROM_START(hlywoodhg)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2g.cpu", 0x1000, 0x0800, CRC(bf60b631) SHA1(944089895d4253dd094a8f6b7168f9e62a75568a))
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_RELOAD(0x9000, 0x0800)
+ ROM_RELOAD(0xd000, 0x0800)
+ ROM_LOAD("prom1g.cpu", 0x2000, 0x2000, CRC(0f212d15) SHA1(b671b8fbc50f5528f0de061c7695932035266a0e))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd",0xe000,0x2000, CRC(a698ec33) SHA1(e7c1d28279ec4f12095c3a106c6cefcc2a84b31e))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd",0xe000,0x2000, CRC(9232591e) SHA1(72883e0c542c572226c6c654bea14749cc9e351f))
+ ROM_LOAD("yrom2.snd",0xc000,0x2000, CRC(51709c2f) SHA1(5834d7b72bd36e30c87377dc7c3ad0cf26ff303a))
+ROM_END
+
/*-------------------------------------------------------------------
/ Hot Shots (#718)
/-------------------------------------------------------------------*/
@@ -774,6 +1097,42 @@ ROM_START(hotshots)
ROM_LOAD("yrom1.snd", 0x8000, 0x8000, CRC(2933a80e) SHA1(5982b9ed361d90f8ea47047fc29770ef142acbec))
ROM_END
+ROM_START(hotshotsf)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2f.cpu", 0x1000, 0x0800, CRC(476e260c) SHA1(2b88920c77462d190f9b98aebf8fcb5c9e853ecd))
+ ROM_CONTINUE(0x9000, 0x0800)
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_CONTINUE(0xd000, 0x0800)
+ ROM_LOAD("prom1f.cpu", 0x2000, 0x2000, CRC(8d74aca7) SHA1(c25b015ad8a6fa142c7cb46e2ac0229eb00289cf))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd", 0x8000, 0x8000, CRC(42c3cc3d) SHA1(26ca7f3a71b83df18ac6be1d1eb28da20120285e))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd", 0x8000, 0x8000, CRC(2933a80e) SHA1(5982b9ed361d90f8ea47047fc29770ef142acbec))
+ROM_END
+
+ROM_START(hotshotsg)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2g.cpu", 0x1000, 0x0800, CRC(7e2f0d59) SHA1(b8a7b9be3e4d705631e017da87b27be53ed23f30))
+ ROM_CONTINUE(0x9000, 0x0800)
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_CONTINUE(0xd000, 0x0800)
+ ROM_LOAD("prom1g.cpu", 0x2000, 0x2000, CRC(e07b46ad) SHA1(c7b48dcfb074f3d0f38a6d49028ba172946467fc))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd", 0x8000, 0x8000, CRC(42c3cc3d) SHA1(26ca7f3a71b83df18ac6be1d1eb28da20120285e))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd", 0x8000, 0x8000, CRC(2933a80e) SHA1(5982b9ed361d90f8ea47047fc29770ef142acbec))
+ROM_END
+
/*-------------------------------------------------------------------
/ Monte Carlo (#708)
/-------------------------------------------------------------------*/
@@ -815,6 +1174,63 @@ ROM_START(mntecrloa)
ROM_LOAD("yrom2.snd",0xc000,0x2000, CRC(a95d1a6b) SHA1(91946ef7af0e4dd96db6d2d6f4f2e9a3a7279b81))
ROM_END
+ROM_START(mntecrlof)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2f.cpu", 0x1000, 0x0800, CRC(f6842631) SHA1(7447994d2055c7fa12aaf35e93436ee829f5b7ae))
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_RELOAD(0x9000, 0x0800)
+ ROM_RELOAD(0xd000, 0x0800)
+ ROM_LOAD("prom1f.cpu", 0x2000, 0x2000, CRC(33a8dbc9) SHA1(5ef586e2b1ba7f245723584bc14c60c2860d19fc))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd",0xe000,0x2000, CRC(1a53ac15) SHA1(f2751664a09431e908873580ddf4f44df9b4eda7))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd",0xe000,0x2000, CRC(6e234c49) SHA1(fdb4126ecdaac378d144e9dd3c29b4e79290da2a))
+ ROM_LOAD("yrom2.snd",0xc000,0x2000, CRC(a95d1a6b) SHA1(91946ef7af0e4dd96db6d2d6f4f2e9a3a7279b81))
+ROM_END
+
+ROM_START(mntecrlog)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2g.cpu", 0x1000, 0x0800, CRC(2a5e0c4f) SHA1(b386168bd911b9977104c47da962d0248f22614b))
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_RELOAD(0x9000, 0x0800)
+ ROM_RELOAD(0xd000, 0x0800)
+ ROM_LOAD("prom1g.cpu", 0x2000, 0x2000, CRC(25e015f1) SHA1(4b1467438def657eac3b8a858d7b17c102e14f0d))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd",0xe000,0x2000, CRC(1a53ac15) SHA1(f2751664a09431e908873580ddf4f44df9b4eda7))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd",0xe000,0x2000, CRC(6e234c49) SHA1(fdb4126ecdaac378d144e9dd3c29b4e79290da2a))
+ ROM_LOAD("yrom2.snd",0xc000,0x2000, CRC(a95d1a6b) SHA1(91946ef7af0e4dd96db6d2d6f4f2e9a3a7279b81))
+ROM_END
+
+ROM_START(mntecrlo2)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2_2.cpu", 0x1000, 0x0800, CRC(8e72a68f) SHA1(8320c44020f7d5f9e887b17556252f1c617235ac))
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_RELOAD(0x9000, 0x0800)
+ ROM_RELOAD(0xd000, 0x0800)
+ ROM_LOAD("prom1_2.cpu", 0x2000, 0x2000, CRC(9bd6a010) SHA1(680ce076452ab3fd911fa58fc48c07ea2ec793da))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd",0xe000,0x2000, CRC(1a53ac15) SHA1(f2751664a09431e908873580ddf4f44df9b4eda7))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd",0xe000,0x2000, CRC(6e234c49) SHA1(fdb4126ecdaac378d144e9dd3c29b4e79290da2a))
+ ROM_LOAD("yrom2.snd",0xc000,0x2000, CRC(a95d1a6b) SHA1(91946ef7af0e4dd96db6d2d6f4f2e9a3a7279b81))
+ROM_END
+
/*-------------------------------------------------------------------
/ Night Moves C-103
/-------------------------------------------------------------------*/
@@ -857,6 +1273,24 @@ ROM_START(raven)
ROM_LOAD("yrom1.snd",0xe000,0x2000, CRC(ee5f868b) SHA1(23ef4112b94109ad4d4a6b9bb5215acec20e5e55))
ROM_END
+ROM_START(raveng)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2g.cpu", 0x1000, 0x0800, CRC(4ca540a5) SHA1(50bb240465d80b7763574e1261f8d0ddda5ad587))
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_RELOAD(0x9000, 0x0800)
+ ROM_RELOAD(0xd000, 0x0800)
+ ROM_LOAD("prom1g.cpu", 0x2000, 0x2000, CRC(3441aeda) SHA1(12dd2faac64170bad5cf5b9247283f64df9e5337))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd",0xe000,0x2000, CRC(a04bf7d0) SHA1(5be5d445b199e7dc9d42e7ee5e9b31c18dec3881))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd",0xe000,0x2000, CRC(ee5f868b) SHA1(23ef4112b94109ad4d4a6b9bb5215acec20e5e55))
+ROM_END
+
ROM_START(ravena)
ROM_REGION(0x10000, "maincpu", 0)
ROM_LOAD("prom2a.cpu", 0x1000, 0x0800, CRC(a693785e) SHA1(7c8878f1c3c5205b3ae46a78c881bbd2b722838d))
@@ -896,6 +1330,24 @@ ROM_START(robowars)
ROM_LOAD("yrom1.snd", 0x8000, 0x8000, CRC(7ecd8b67) SHA1(c5167b0acc64e535d389ba70be92a65672e119f6))
ROM_END
+ROM_START(robowarsf)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2f.cpu", 0x1000, 0x0800, CRC(1afa0e69) SHA1(178813494b877ac9ca36863661596b4df04df1bb))
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_RELOAD(0x9000, 0x0800)
+ ROM_RELOAD(0xd000, 0x0800)
+ ROM_LOAD("prom1f.cpu", 0x2000, 0x2000, CRC(263cb8f9) SHA1(ba27ca0618b9ed68c258a654bdd00a24f8413239))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd", 0x8000, 0x8000, CRC(ea59b6a1) SHA1(6a4cdd37ba85f94f703afd1c5d3f102f51fedf46))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd", 0x8000, 0x8000, CRC(7ecd8b67) SHA1(c5167b0acc64e535d389ba70be92a65672e119f6))
+ROM_END
+
/*-------------------------------------------------------------------
/ Rock (#697)
/-------------------------------------------------------------------*/
@@ -913,6 +1365,20 @@ ROM_START(rock)
ROM_LOAD("yrom1.snd",0xe000,0x2000, CRC(effba2ad) SHA1(2288a4f655376e0aa18f8ecd9a3818ed4d6c6891))
ROM_END
+ROM_START(rockg)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom1g.cpu", 0x2000, 0x2000, CRC(2de3f1e5) SHA1(ceb964292703080bb742dbc073a14dbf745ad38e))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd",0xe000,0x2000, CRC(03830e81) SHA1(786f85eba5a8f5e9cc659305623e1d178b5410f6))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd",0xe000,0x2000, CRC(effba2ad) SHA1(2288a4f655376e0aa18f8ecd9a3818ed4d6c6891))
+ROM_END
+
/*-------------------------------------------------------------------
/ Rock Encore (#704)
/-------------------------------------------------------------------*/
@@ -931,6 +1397,21 @@ ROM_START(rock_enc)
ROM_LOAD("yrom2a.snd",0xc000,0x2000, CRC(66645a3f) SHA1(f06261af81e6b1829d639933297d2461a8c993fc))
ROM_END
+ROM_START(rock_encg)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom1g.cpu", 0x2000, 0x2000, CRC(2de3f1e5) SHA1(ceb964292703080bb742dbc073a14dbf745ad38e))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1a.snd",0xe000,0x2000, CRC(b8aa8912) SHA1(abff690256c0030807b2d4dfa0516496516384e8))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1a.snd",0xe000,0x2000, CRC(a62e3b94) SHA1(59636c2ac7ebbd116a0eb39479c97299ba391906))
+ ROM_LOAD("yrom2a.snd",0xc000,0x2000, CRC(66645a3f) SHA1(f06261af81e6b1829d639933297d2461a8c993fc))
+ROM_END
+
/*-------------------------------------------------------------------
/ Spring Break (#706)
/-------------------------------------------------------------------*/
@@ -972,6 +1453,44 @@ ROM_START(sprbreaka)
ROM_LOAD("yrom2.snd",0xc000,0x2000, CRC(0fb0128e) SHA1(3bdc5ed11b8e062f71f2a78b955830bd985e80a3))
ROM_END
+ROM_START(sprbreakf)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2f.cpu", 0x1000, 0x0800, CRC(c0ee0555) SHA1(3d2aef5a8a6452f9f87b4ec2040643dda5843ebd))
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_RELOAD(0x9000, 0x0800)
+ ROM_RELOAD(0xd000, 0x0800)
+ ROM_LOAD("prom1f.cpu", 0x2000, 0x2000, CRC(608cf4d5) SHA1(41193eb036da7c7d05f313d1a68723504a7a90f4))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd",0xe000,0x2000, CRC(97d3f9ba) SHA1(1b34c7e51373c26d29d757c57a2b0333fe38d19e))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd",0xe000,0x2000, CRC(5ea89df9) SHA1(98ce7661a4d862fd02c77e69b0f6e9372c3ade2b))
+ ROM_LOAD("yrom2.snd",0xc000,0x2000, CRC(0fb0128e) SHA1(3bdc5ed11b8e062f71f2a78b955830bd985e80a3))
+ROM_END
+
+ROM_START(sprbreakg)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2g.cpu", 0x1000, 0x0800, CRC(fa4b750d) SHA1(89f797f65fc18473419080810bca4590f77e2502))
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_RELOAD(0x9000, 0x0800)
+ ROM_RELOAD(0xd000, 0x0800)
+ ROM_LOAD("prom1g.cpu", 0x2000, 0x2000, CRC(2d9c4640) SHA1(3671a962334f5c84ae2635891ee90c62be69da5c))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd",0xe000,0x2000, CRC(97d3f9ba) SHA1(1b34c7e51373c26d29d757c57a2b0333fe38d19e))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd",0xe000,0x2000, CRC(5ea89df9) SHA1(98ce7661a4d862fd02c77e69b0f6e9372c3ade2b))
+ ROM_LOAD("yrom2.snd",0xc000,0x2000, CRC(0fb0128e) SHA1(3bdc5ed11b8e062f71f2a78b955830bd985e80a3))
+ROM_END
+
ROM_START(sprbreaks)
ROM_REGION(0x10000, "maincpu", 0)
ROM_LOAD("prom2.rv2", 0x1000, 0x0800, CRC(911cd14f) SHA1(2bc3ff6a3889da69b97f8ec318f93208e3d42cfe))
@@ -1009,6 +1528,21 @@ ROM_START(tagteamp)
ROM_LOAD("698-s.snd", 0x0800, 0x0800, CRC(9c8191b7) SHA1(12b017692f078dcdc8e4bbf1ffcea1c5d0293d06))
ROM_END
+ROM_START(tagteampg)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2g.cpu", 0x1000, 0x0800, CRC(5e6d2da7) SHA1(9b23d1ac34163edeaceffe806a2a559f3d408b41))
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_RELOAD(0x9000, 0x0800)
+ ROM_RELOAD(0xd000, 0x0800)
+ ROM_LOAD("prom1g.cpu", 0x2000, 0x2000, CRC(e206c519) SHA1(0d5b3237807b6f11633ab9be2b0e5b000369a0e8))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x1000, "r0sound:audiocpu", 0)
+ ROM_LOAD("698-s.snd", 0x0800, 0x0800, CRC(9c8191b7) SHA1(12b017692f078dcdc8e4bbf1ffcea1c5d0293d06))
+ROM_END
+
ROM_START(tagteamp2)
ROM_REGION(0x10000, "maincpu", 0)
ROM_LOAD("prom2a.cpu", 0x1000, 0x0800, CRC(6d56b636) SHA1(8f50f2742be727835e7343307787b4b5daa1623a))
@@ -1045,6 +1579,42 @@ ROM_START(txsector)
ROM_LOAD("yrom1.snd", 0x8000, 0x8000, CRC(469ef444) SHA1(faa16f34357a53c3fc61b59251fabdc44c605000))
ROM_END
+ROM_START(txsectorf)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2f.cpu", 0x1000, 0x0800, CRC(1bd08247) SHA1(968cc30e5e5c783e73cb3278a58189c4f8b8186f))
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_RELOAD(0x9000, 0x0800)
+ ROM_RELOAD(0xd000, 0x0800)
+ ROM_LOAD("prom1f.cpu", 0x2000, 0x2000, CRC(8df27155) SHA1(67aeeab0d50e43674082e1dd99a849db64ba00b2))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd", 0x8000, 0x8000, CRC(61d66ca1) SHA1(59b1705b13d46b29f45257c566274f3cdce15ec2))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd", 0x8000, 0x8000, CRC(469ef444) SHA1(faa16f34357a53c3fc61b59251fabdc44c605000))
+ROM_END
+
+ROM_START(txsectorg)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2g.cpu", 0x1000, 0x0800, CRC(2b17261f) SHA1(a3195190c0d5116b60e487a7b7f3a28c1f110e89))
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_RELOAD(0x9000, 0x0800)
+ ROM_RELOAD(0xd000, 0x0800)
+ ROM_LOAD("prom1g.cpu", 0x2000, 0x2000, CRC(83ea2f11) SHA1(ac3570597512c71c099aa15f0750a12a3e206b83))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd", 0x8000, 0x8000, CRC(61d66ca1) SHA1(59b1705b13d46b29f45257c566274f3cdce15ec2))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd", 0x8000, 0x8000, CRC(469ef444) SHA1(faa16f34357a53c3fc61b59251fabdc44c605000))
+ROM_END
+
/*-------------------------------------------------------------------
/ Victory (#710)
/-------------------------------------------------------------------*/
@@ -1066,6 +1636,42 @@ ROM_START(victoryp)
ROM_LOAD("yrom1.snd", 0x8000, 0x8000, CRC(921a100e) SHA1(0c3c7eae4ceeb5a1a8150bac52203d3f1e8f917e))
ROM_END
+ROM_START(victorypf)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2f.cpu", 0x1000, 0x0800, CRC(dffcfa77) SHA1(3efaca85295ca55268b8d7c7cfe8f09f159d5fbd))
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_RELOAD(0x9000, 0x0800)
+ ROM_RELOAD(0xd000, 0x0800)
+ ROM_LOAD("prom1f.cpu", 0x2000, 0x2000, CRC(d3a9df20) SHA1(7e0a97a4c1b488af89959cbaa693e23302479d0a))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd", 0x8000, 0x8000, CRC(4ab6dab7) SHA1(7e21e69029e60052112ddd5c7481582ea6684dc1))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd", 0x8000, 0x8000, CRC(921a100e) SHA1(0c3c7eae4ceeb5a1a8150bac52203d3f1e8f917e))
+ROM_END
+
+ROM_START(victorypg)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("prom2g.cpu", 0x1000, 0x0800, CRC(b191a87a) SHA1(f205ffb41c5ba34e3cefc96ca870a5d08bee8854))
+ ROM_RELOAD(0x5000, 0x0800)
+ ROM_RELOAD(0x9000, 0x0800)
+ ROM_RELOAD(0xd000, 0x0800)
+ ROM_LOAD("prom1g.cpu", 0x2000, 0x2000, CRC(097b9062) SHA1(e7f05084b36f84b9948702ba297700473386ae6d))
+ ROM_RELOAD(0x6000, 0x2000)
+ ROM_RELOAD(0xa000, 0x2000)
+ ROM_RELOAD(0xe000, 0x2000)
+
+ ROM_REGION(0x10000, "cpu3", 0)
+ ROM_LOAD("drom1.snd", 0x8000, 0x8000, CRC(4ab6dab7) SHA1(7e21e69029e60052112ddd5c7481582ea6684dc1))
+
+ ROM_REGION(0x10000, "cpu2", 0)
+ ROM_LOAD("yrom1.snd", 0x8000, 0x8000, CRC(921a100e) SHA1(0c3c7eae4ceeb5a1a8150bac52203d3f1e8f917e))
+ROM_END
+
/*-------------------------------------------------------------------
/ System 80B Test Fixture
/-------------------------------------------------------------------*/
@@ -1087,35 +1693,69 @@ ROM_START(s80btest)
ROM_END
GAME(1985, bountyh, 0, gts80b_s, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Bounty Hunter", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1985, bountyhg, bountyh, gts80b_s, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Bounty Hunter (German)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1985, triplay, 0, gts80b_s, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Chicago Cubs' Triple Play", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1985, triplaya, triplay, gts80b_s, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Chicago Cubs' Triple Play (alternate set)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1985, rock, 0, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Rock", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1985, rockg, rock, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Rock (German)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1985, tagteamp, 0, gts80b_s, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Tag-Team Wrestling", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1985, tagteampg, tagteamp, gts80b_s, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Tag-Team Wrestling (German)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1985, tagteamp2, tagteamp, gts80b_s, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Tag-Team Wrestling (rev.2)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1986, raven, 0, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Raven", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1986, ravena, raven, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Raven (alternate set)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, raveng, raven, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Raven (German)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1986, hlywoodh, 0, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Hollywood Heat", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, hlywoodhf, hlywoodh, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Hollywood Heat (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, hlywoodhg, hlywoodh, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Hollywood Heat (German)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1986, rock_enc, rock, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Rock Encore", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, rock_encg, rock, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Rock Encore (German)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1986, genesisp, 0, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Genesis", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, genesispf, genesisp, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Genesis (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, genesispg, genesisp, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Genesis (German)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1987, amazonh2, 0, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Amazon Hunt II (French)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1987, sprbreak, 0, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Spring Break", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1987, sprbreaka, sprbreak, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Spring Break (alternate set)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, sprbreakf, sprbreak, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Spring Break (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, sprbreakg, sprbreak, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Spring Break (German)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1987, sprbreaks, sprbreak, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Spring Break (single ball game)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1986, goldwing, 0, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Gold Wings", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, goldwingf, goldwing, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Gold Wings (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, goldwingg, goldwing, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Gold Wings (German)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1987, mntecrlo, 0, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Monte Carlo (Pinball)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1987, mntecrloa, mntecrlo, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Monte Carlo (Pinball, alternate set)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, mntecrlof, mntecrlo, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Monte Carlo (Pinball, French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, mntecrlog, mntecrlo, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Monte Carlo (Pinball, German)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, mntecrlo2, mntecrlo, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Monte Carlo (Pinball, rev. 2)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1987, arena, 0, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Arena", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1987, arenaa, arena, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Arena (alternate set)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, arenaf, arena, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Arena (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, arenag, arena, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Arena (German)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1987, victoryp, 0, gts80b_s2, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Victory (Pinball)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, victorypf, victoryp, gts80b_s2, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Victory (Pinball, French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, victorypg, victoryp, gts80b_s2, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Victory (Pinball, German)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1988, diamondp, 0, gts80b_s2, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Diamond Lady", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1988, diamondpf, diamondp, gts80b_s2, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Diamond Lady (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1988, diamondpg, diamondp, gts80b_s2, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Diamond Lady (German)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1988, txsector, 0, gts80b_s2, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "TX-Sector", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1988, txsectorf, txsector, gts80b_s2, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "TX-Sector (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1988, txsectorg, txsector, gts80b_s2, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "TX-Sector (German)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1989, bighouse, 0, gts80b_s3, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Big House", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1989, bighousef, bighouse, gts80b_s3, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Big House (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1989, bighouseg, bighouse, gts80b_s3, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Big House (German)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1988, robowars, 0, gts80b_s2, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Robo-War", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1988, robowarsf, robowars, gts80b_s2, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Robo-War (French)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1988, excalibr, 0, gts80b_s3, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Excalibur", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1988, excalibrf, excalibr, gts80b_s3, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Excalibur (French)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1988, badgirls, 0, gts80b_s3, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Bad Girls", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1988, badgirlsf, badgirls, gts80b_s3, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Bad Girls (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1988, badgirlsg, badgirls, gts80b_s3, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Bad Girls (German)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1989, hotshots, 0, gts80b_s2, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Hot Shots", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1989, hotshotsf, hotshots, gts80b_s2, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Hot Shots (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1989, hotshotsg, hotshots, gts80b_s2, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Hot Shots (German)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1989, bonebstr, 0, bonebstr, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Bone Busters Inc.", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1989, bonebstrf, bonebstr, bonebstr, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Bone Busters Inc. (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1989, bonebstrg, bonebstr, bonebstr, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Bone Busters Inc. (German)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1989, nmoves, 0, gts80b_s2, gts80b, gts80b_state, gts80b, ROT0, "International Concepts", "Night Moves", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1987, amazonh3, 0, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Amazon Hunt III (French)", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1987, amazonh3a, amazonh3, gts80b_s1, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "Amazon Hunt III (rev. 1, French)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(198?, s80btest, 0, gts80b_s2, gts80b, gts80b_state, gts80b, ROT0, "Gottlieb", "System 80B Test", MACHINE_IS_SKELETON_MECHANICAL)
diff --git a/src/mame/drivers/gundealr.cpp b/src/mame/drivers/gundealr.cpp
index 21f077ab6c5..37eb95f4a91 100644
--- a/src/mame/drivers/gundealr.cpp
+++ b/src/mame/drivers/gundealr.cpp
@@ -70,7 +70,7 @@ WRITE8_MEMBER(gundealr_state::yamyam_bankswitch_w)
-static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, gundealr_state )
+static ADDRESS_MAP_START( base_map, AS_PROGRAM, 8, gundealr_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1")
AM_RANGE(0xc000, 0xc000) AM_READ_PORT("DSW0")
@@ -78,16 +78,26 @@ static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, gundealr_state )
AM_RANGE(0xc004, 0xc004) AM_READ_PORT("IN0")
AM_RANGE(0xc005, 0xc005) AM_READ_PORT("IN1")
AM_RANGE(0xc006, 0xc006) AM_READ_PORT("IN2")
- AM_RANGE(0xc010, 0xc013) AM_WRITE(yamyam_fg_scroll_w) /* Yam Yam only */
- AM_RANGE(0xc014, 0xc014) AM_WRITE(gundealr_flipscreen_w)
AM_RANGE(0xc016, 0xc016) AM_WRITE(yamyam_bankswitch_w)
- AM_RANGE(0xc020, 0xc023) AM_WRITE(gundealr_fg_scroll_w) /* Gun Dealer only */
AM_RANGE(0xc400, 0xc7ff) AM_RAM_WRITE(gundealr_paletteram_w) AM_SHARE("paletteram")
AM_RANGE(0xc800, 0xcfff) AM_RAM_WRITE(gundealr_bg_videoram_w) AM_SHARE("bg_videoram")
AM_RANGE(0xd000, 0xdfff) AM_RAM_WRITE(gundealr_fg_videoram_w) AM_SHARE("fg_videoram")
AM_RANGE(0xe000, 0xffff) AM_RAM AM_SHARE("rambase")
ADDRESS_MAP_END
+static ADDRESS_MAP_START( gundealr_main_map, AS_PROGRAM, 8, gundealr_state )
+ AM_IMPORT_FROM(base_map)
+ AM_RANGE(0xc014, 0xc014) AM_WRITE(gundealr_flipscreen_w)
+ AM_RANGE(0xc020, 0xc023) AM_WRITE(gundealr_fg_scroll_w)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( yamyam_main_map, AS_PROGRAM, 8, gundealr_state )
+ AM_IMPORT_FROM(base_map)
+ AM_RANGE(0xc010, 0xc013) AM_WRITE(yamyam_fg_scroll_w)
+ AM_RANGE(0xc014, 0xc014) AM_WRITE(yamyam_flipscreen_w)
+ AM_RANGE(0xc015, 0xc015) AM_WRITENOP // Bit 7 = MCU reset?
+ADDRESS_MAP_END
+
static ADDRESS_MAP_START( main_portmap, AS_IO, 8, gundealr_state )
ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x00, 0x01) AM_DEVREADWRITE("ymsnd", ym2203_device, read, write)
@@ -379,13 +389,11 @@ void gundealr_state::machine_start()
membank("bank1")->configure_entries(0, 8, &ROM[0x10000], 0x4000);
- save_item(NAME(m_flipscreen));
save_item(NAME(m_scroll));
}
void gundealr_state::machine_reset()
{
- m_flipscreen = 0;
m_scroll[0] = 0;
m_scroll[1] = 0;
m_scroll[2] = 0;
@@ -406,7 +414,7 @@ static MACHINE_CONFIG_START( gundealr, gundealr_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, XTAL_12MHz/2) /* 6 MHz verified for Yam! Yam!? */
- MCFG_CPU_PROGRAM_MAP(main_map)
+ MCFG_CPU_PROGRAM_MAP(gundealr_main_map)
MCFG_CPU_IO_MAP(main_portmap)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", gundealr_state, gundealr_scanline, "screen", 0, 1)
@@ -496,6 +504,8 @@ TIMER_DEVICE_CALLBACK_MEMBER(gundealr_state::yamyam_mcu_sim)
}
static MACHINE_CONFIG_DERIVED( yamyam, gundealr )
+ MCFG_CPU_MODIFY("maincpu")
+ MCFG_CPU_PROGRAM_MAP(yamyam_main_map)
MCFG_TIMER_DRIVER_ADD_PERIODIC("mcusim", gundealr_state, yamyam_mcu_sim, attotime::from_hz(6000000/60)) /* 6mhz confirmed */
MACHINE_CONFIG_END
@@ -592,6 +602,9 @@ ROM_START( yamyam ) /* DY-90010001 PCB */
ROM_REGION( 0x20000, "gfx2", 0 )
ROM_LOAD( "1.16a", 0x00000, 0x20000, CRC(b122828d) SHA1(90994ba548893a2eacdd58351cfa3952f4af926a) )
+
+ ROM_REGION( 0x0100, "proms", 0 )
+ ROM_LOAD( "4.7e", 0x0000, 0x0100, NO_DUMP)
ROM_END
ROM_START( yamyamk ) /* DY-90010001 PCB */
@@ -607,6 +620,9 @@ ROM_START( yamyamk ) /* DY-90010001 PCB */
ROM_REGION( 0x20000, "gfx2", 0 )
ROM_LOAD( "1.16a", 0x00000, 0x20000, CRC(b122828d) SHA1(90994ba548893a2eacdd58351cfa3952f4af926a) )
+
+ ROM_REGION( 0x0100, "proms", 0 )
+ ROM_LOAD( "4.7e", 0x0000, 0x0100, NO_DUMP)
ROM_END
ROM_START( wiseguy ) /* DY-90010001 PCB */
@@ -622,6 +638,9 @@ ROM_START( wiseguy ) /* DY-90010001 PCB */
ROM_REGION( 0x20000, "gfx2", 0 )
ROM_LOAD( "1.16a", 0x00000, 0x20000, CRC(b122828d) SHA1(90994ba548893a2eacdd58351cfa3952f4af926a) )
+
+ ROM_REGION( 0x0100, "proms", 0 )
+ ROM_LOAD( "4.7e", 0x0000, 0x0100, NO_DUMP)
ROM_END
@@ -629,7 +648,7 @@ ROM_END
GAME( 1990, gundealr, 0, gundealr, gundealr, driver_device, 0, ROT270, "Dooyong", "Gun Dealer", MACHINE_SUPPORTS_SAVE )
GAME( 1990, gundealra, gundealr, gundealr, gundealr, driver_device, 0, ROT270, "Dooyong", "Gun Dealer (alt card set)", MACHINE_SUPPORTS_SAVE )
GAME( 1990, gundealrt, gundealr, gundealr, gundealt, driver_device, 0, ROT270, "Dooyong (Tecmo license)", "Gun Dealer (Japan)", MACHINE_SUPPORTS_SAVE )
-GAME( 1990, gundealrbl, gundealr, gundealr, gundealr, driver_device, 0, ROT270, "bootleg", "Gun Dealer (bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1990, gundealrbl, gundealr, yamyam, gundealr, driver_device, 0, ROT270, "bootleg", "Gun Dealer (bootleg)", MACHINE_SUPPORTS_SAVE )
GAME( 1990, yamyam, 0, yamyam, yamyam, driver_device, 0, ROT0, "Dooyong", "Yam! Yam!?", MACHINE_SUPPORTS_SAVE )
GAME( 1990, yamyamk, yamyam, yamyam, yamyam, driver_device, 0, ROT0, "Dooyong", "Yam! Yam!? (Korea)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/hazeltin.cpp b/src/mame/drivers/hazeltin.cpp
index c39d5f5a104..c72d9c87c42 100644
--- a/src/mame/drivers/hazeltin.cpp
+++ b/src/mame/drivers/hazeltin.cpp
@@ -44,10 +44,12 @@ References:
#define MISCKEYS_TAG "misc_keys"
#define SCREEN_TAG "screen"
#define BAUD_PROM_TAG "u39"
-#define NL_PROM_TAG "videobrd:u71"
-#define NL_EPROM_TAG "videobrd:u78"
-#define VIDEO_PROM_TAG "u71"
-#define CHAR_EPROM_TAG "u78"
+//#define NL_PROM_TAG "videobrd:u71"
+//#define NL_EPROM_TAG "videobrd:u78"
+// VIDEO_PROM at u71
+#define VIDEO_PROM_TAG NETLIST_TAG ":u90_702128_82s129.bin"
+// CHAR_EPROM at u78
+#define CHAR_EPROM_TAG NETLIST_TAG ":u83_chr.bin"
#define VIDEO_OUT_TAG "videobrd:video_out"
#define VBLANK_OUT_TAG "videobrd:vblank"
#define TVINTERQ_OUT_TAG "videobrd:tvinterq"
@@ -79,8 +81,6 @@ public:
: driver_device(mconfig, type, tag)
, m_maincpu(*this, CPU_TAG)
, m_video_board(*this, NETLIST_TAG)
- , m_u71(*this, NL_PROM_TAG)
- , m_u78(*this, NL_EPROM_TAG)
, m_u9(*this, "videobrd:u9")
, m_u10(*this, "videobrd:u10")
, m_u11(*this, "videobrd:u11")
@@ -164,8 +164,6 @@ public:
private:
required_device<cpu_device> m_maincpu;
required_device<netlist_mame_device_t> m_video_board;
- required_device<netlist_mame_rom_t> m_u71;
- required_device<netlist_mame_rom_t> m_u78;
required_device<netlist_ram_pointer_t> m_u9;
required_device<netlist_ram_pointer_t> m_u10;
required_device<netlist_ram_pointer_t> m_u11;
@@ -712,9 +710,6 @@ static MACHINE_CONFIG_START( hazl1500, hazl1500_state )
MCFG_DEVICE_ADD(NETLIST_TAG, NETLIST_CPU, VIDEOBRD_CLOCK)
MCFG_NETLIST_SETUP(hazelvid)
- MCFG_NETLIST_ROM_REGION(NETLIST_TAG, VIDEO_PROM_TAG, VIDEO_PROM_TAG, "u90_702128_82s129.bin", 0x0000, 0x0100)
- MCFG_NETLIST_ROM_REGION(NETLIST_TAG, CHAR_EPROM_TAG, CHAR_EPROM_TAG, "u83_chr.bin", 0x0000, 0x0800)
-
// First 1K
MCFG_NETLIST_RAM_POINTER(NETLIST_TAG, "u22", "u22")
MCFG_NETLIST_RAM_POINTER(NETLIST_TAG, "u23", "u23")
diff --git a/src/mame/drivers/hh_amis2k.cpp b/src/mame/drivers/hh_amis2k.cpp
index 92ddc8343df..c08b8a0f448 100644
--- a/src/mame/drivers/hh_amis2k.cpp
+++ b/src/mame/drivers/hh_amis2k.cpp
@@ -48,14 +48,14 @@ public:
required_device<speaker_sound_device> m_speaker;
required_device<timer_device> m_a12_decay_timer;
- uint8_t m_d;
- uint16_t m_a;
- uint8_t m_q2;
- uint8_t m_q3;
+ u8 m_d;
+ u16 m_a;
+ u8 m_q2;
+ u8 m_q3;
- uint16_t m_display_state[0x10];
- uint16_t m_display_cache[0x10];
- uint8_t m_display_decay[0x100];
+ u16 m_display_state[0x10];
+ u16 m_display_cache[0x10];
+ u8 m_display_decay[0x100];
DECLARE_WRITE8_MEMBER(write_d);
DECLARE_WRITE16_MEMBER(write_a);
@@ -110,7 +110,7 @@ inline bool wildfire_state::index_is_7segled(int index)
void wildfire_state::display_update()
{
- uint16_t active_state[0x10];
+ u16 active_state[0x10];
for (int i = 0; i < 0x10; i++)
{
@@ -292,7 +292,7 @@ enum
lG = 0x01
};
-static const uint8_t wildfire_7seg_table[0x10] =
+static const u8 wildfire_7seg_table[0x10] =
{
0x7e, 0x30, 0x6d, 0x79, 0x33, 0x5b, 0x5f, 0x70, 0x7f, 0x7b, // 0-9 unaltered
0x77, // A -> unused?
diff --git a/src/mame/drivers/hh_cop400.cpp b/src/mame/drivers/hh_cop400.cpp
index 1795c35e368..b51c4c1eb45 100644
--- a/src/mame/drivers/hh_cop400.cpp
+++ b/src/mame/drivers/hh_cop400.cpp
@@ -7,25 +7,30 @@
TODO:
- why does h2hbaskb need a workaround on writing L pins?
+ - plus1: which sensor position is which colour?
***************************************************************************/
#include "emu.h"
#include "cpu/cop400/cop400.h"
+#include "sound/speaker.h"
#include "sound/dac.h"
#include "sound/volt_reg.h"
+//#include "rendlay.h"
// internal artwork
#include "bship82.lh" // clickable
#include "ctstein.lh" // clickable
-#include "einvaderc.lh" // test-layout(but still playable)
+#include "einvaderc.lh"
#include "funjacks.lh" // clickable
#include "funrlgl.lh"
#include "h2hbaskb.lh"
+#include "lchicken.lh" // clickable
#include "lightfgt.lh" // clickable
+#include "mdallas.lh"
#include "qkracer.lh"
-//#include "hh_cop400_test.lh" // common test-layout - use external artwork
+#include "hh_cop400_test.lh" // common test-layout - use external artwork
class hh_cop400_state : public driver_device
@@ -35,6 +40,7 @@ public:
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_inp_matrix(*this, "IN.%u", 0),
+ m_speaker(*this, "speaker"),
m_display_wait(33),
m_display_maxy(1),
m_display_maxx(0)
@@ -42,33 +48,34 @@ public:
// devices
required_device<cpu_device> m_maincpu;
- optional_ioport_array<5> m_inp_matrix; // max 5
+ optional_ioport_array<6> m_inp_matrix; // max 6
+ optional_device<speaker_sound_device> m_speaker;
// misc common
- uint8_t m_l; // MCU port L write data
- uint8_t m_g; // MCU port G write data
- uint8_t m_d; // MCU port D write data
- int m_so; // MCU SO line state
- int m_sk; // MCU SK line state
- uint16_t m_inp_mux; // multiplexed inputs mask
+ u8 m_l; // MCU port L write data
+ u8 m_g; // MCU port G write data
+ u8 m_d; // MCU port D write data
+ int m_so; // MCU SO line state
+ int m_sk; // MCU SK line state
+ u16 m_inp_mux; // multiplexed inputs mask
- uint16_t read_inputs(int columns);
+ u16 read_inputs(int columns);
// display common
- int m_display_wait; // led/lamp off-delay in microseconds (default 33ms)
- int m_display_maxy; // display matrix number of rows
- int m_display_maxx; // display matrix number of columns (max 31 for now)
+ int m_display_wait; // led/lamp off-delay in microseconds (default 33ms)
+ int m_display_maxy; // display matrix number of rows
+ int m_display_maxx; // display matrix number of columns (max 31 for now)
- uint32_t m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
- uint16_t m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
- uint32_t m_display_cache[0x20]; // (internal use)
- uint8_t m_display_decay[0x20][0x20]; // (internal use)
+ u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
+ u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
+ u32 m_display_cache[0x20]; // (internal use)
+ u8 m_display_decay[0x20][0x20]; // (internal use)
TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
void display_update();
void set_display_size(int maxx, int maxy);
- void set_display_segmask(uint32_t digits, uint32_t mask);
- void display_matrix(int maxx, int maxy, uint32_t setx, uint32_t sety, bool update = true);
+ void set_display_segmask(u32 digits, u32 mask);
+ void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true);
protected:
virtual void machine_start() override;
@@ -128,7 +135,7 @@ void hh_cop400_state::machine_reset()
void hh_cop400_state::display_update()
{
- uint32_t active_state[0x20];
+ u32 active_state[0x20];
for (int y = 0; y < m_display_maxy; y++)
{
@@ -141,7 +148,7 @@ void hh_cop400_state::display_update()
m_display_decay[y][x] = m_display_wait;
// determine active state
- uint32_t ds = (m_display_decay[y][x] != 0) ? 1 : 0;
+ u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0;
active_state[y] |= (ds << x);
}
}
@@ -196,7 +203,7 @@ void hh_cop400_state::set_display_size(int maxx, int maxy)
m_display_maxy = maxy;
}
-void hh_cop400_state::set_display_segmask(uint32_t digits, uint32_t mask)
+void hh_cop400_state::set_display_segmask(u32 digits, u32 mask)
{
// set a segment mask per selected digit, but leave unselected ones alone
for (int i = 0; i < 0x20; i++)
@@ -207,12 +214,12 @@ void hh_cop400_state::set_display_segmask(uint32_t digits, uint32_t mask)
}
}
-void hh_cop400_state::display_matrix(int maxx, int maxy, uint32_t setx, uint32_t sety, bool update)
+void hh_cop400_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update)
{
set_display_size(maxx, maxy);
// update current state
- uint32_t mask = (1 << maxx) - 1;
+ u32 mask = (1 << maxx) - 1;
for (int y = 0; y < maxy; y++)
m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0;
@@ -223,10 +230,10 @@ void hh_cop400_state::display_matrix(int maxx, int maxy, uint32_t setx, uint32_t
// generic input handlers
-uint16_t hh_cop400_state::read_inputs(int columns)
+u16 hh_cop400_state::read_inputs(int columns)
{
// active low
- uint16_t ret = 0xffff;
+ u16 ret = 0xffff;
// read selected input rows
for (int i = 0; i < columns; i++)
@@ -277,7 +284,7 @@ WRITE8_MEMBER(ctstein_state::write_g)
WRITE8_MEMBER(ctstein_state::write_l)
{
- // L0-L3: button lamps (strobed)
+ // L0-L3: button lamps
display_matrix(4, 1, data & 0xf, 1);
}
@@ -313,21 +320,20 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( ctstein, ctstein_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", COP421, 860000) // approximation - RC osc. R=12K, C=100pf
+ MCFG_CPU_ADD("maincpu", COP421, 850000) // approximation - RC osc. R=12K, C=100pF
MCFG_COP400_CONFIG(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false) // guessed
MCFG_COP400_WRITE_G_CB(WRITE8(ctstein_state, write_g))
MCFG_COP400_WRITE_L_CB(WRITE8(ctstein_state, write_l))
- MCFG_COP400_WRITE_SK_CB(DEVWRITELINE("dac", dac_bit_interface, write))
+ MCFG_COP400_WRITE_SK_CB(DEVWRITELINE("speaker", speaker_sound_device, level_w))
MCFG_COP400_READ_L_CB(READ8(ctstein_state, read_l))
MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_cop400_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_ctstein)
/* sound hardware */
- MCFG_SPEAKER_STANDARD_MONO("speaker")
- MCFG_SOUND_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE_EX(0, "dac", 1.0, DAC_VREF_POS_INPUT)
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MACHINE_CONFIG_END
@@ -379,8 +385,8 @@ WRITE8_MEMBER(h2hbaskb_state::write_g)
WRITE8_MEMBER(h2hbaskb_state::write_l)
{
// D2,D3 double as multiplexer
- uint16_t mask = ((m_d >> 2 & 1) * 0x00ff) | ((m_d >> 3 & 1) * 0xff00);
- uint16_t sel = (m_g | m_d << 4 | m_g << 8 | m_d << 12) & mask;
+ u16 mask = ((m_d >> 2 & 1) * 0x00ff) | ((m_d >> 3 & 1) * 0xff00);
+ u16 sel = (m_g | m_d << 4 | m_g << 8 | m_d << 12) & mask;
// D2+G0,G1 are 7segs
set_display_segmask(3, 0x7f);
@@ -437,22 +443,21 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( h2hbaskb, h2hbaskb_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", COP420, 1600000) // approximation - RC osc. R=43K, C=101pf
- MCFG_COP400_CONFIG(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false) // guessed
+ MCFG_CPU_ADD("maincpu", COP420, 850000) // approximation - RC osc. R=43K, C=101pF
+ MCFG_COP400_CONFIG(COP400_CKI_DIVISOR_8, COP400_CKO_OSCILLATOR_OUTPUT, false) // guessed
MCFG_COP400_WRITE_D_CB(WRITE8(h2hbaskb_state, write_d))
MCFG_COP400_WRITE_G_CB(WRITE8(h2hbaskb_state, write_g))
MCFG_COP400_WRITE_L_CB(WRITE8(h2hbaskb_state, write_l))
MCFG_COP400_READ_IN_CB(READ8(h2hbaskb_state, read_in))
- MCFG_COP400_WRITE_SO_CB(DEVWRITELINE("dac", dac_bit_interface, write))
+ MCFG_COP400_WRITE_SO_CB(DEVWRITELINE("speaker", speaker_sound_device, level_w))
MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_cop400_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_h2hbaskb)
/* sound hardware */
- MCFG_SPEAKER_STANDARD_MONO("speaker")
- MCFG_SOUND_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE_EX(0, "dac", 1.0, DAC_VREF_POS_INPUT)
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MACHINE_CONFIG_END
@@ -468,20 +473,15 @@ MACHINE_CONFIG_END
The first version was on TMS1100 (see hh_tms1k.c), this is the reprogrammed
second release with a gray case instead of black.
- NOTE!: MAME external artwork is required
-
***************************************************************************/
class einvaderc_state : public hh_cop400_state
{
public:
einvaderc_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_cop400_state(mconfig, type, tag),
- m_dac(*this, "dac")
+ : hh_cop400_state(mconfig, type, tag)
{ }
- required_device<dac_bit_interface> m_dac;
-
void prepare_display();
DECLARE_WRITE8_MEMBER(write_d);
DECLARE_WRITE8_MEMBER(write_g);
@@ -498,8 +498,8 @@ void einvaderc_state::prepare_display()
set_display_segmask(7, 0x7f);
// update display
- uint8_t l = BITSWAP8(m_l,7,6,0,1,2,3,4,5);
- uint16_t grid = (m_d | m_g << 4 | m_sk << 8 | m_so << 9) ^ 0x0ff;
+ u8 l = BITSWAP8(m_l,7,6,0,1,2,3,4,5);
+ u16 grid = (m_d | m_g << 4 | m_sk << 8 | m_so << 9) ^ 0x0ff;
display_matrix(8, 10, l, grid);
}
@@ -520,7 +520,7 @@ WRITE8_MEMBER(einvaderc_state::write_g)
WRITE_LINE_MEMBER(einvaderc_state::write_sk)
{
// SK: speaker out + led grid 8
- m_dac->write(state);
+ m_speaker->level_w(state);
m_sk = state;
prepare_display();
}
@@ -555,7 +555,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( einvaderc, einvaderc_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", COP444, 1000000) // approximation - RC osc. R=47K, C=100pf
+ MCFG_CPU_ADD("maincpu", COP444L, 900000) // approximation - RC osc. R=47K, C=100pF
MCFG_COP400_CONFIG(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false) // guessed
MCFG_COP400_READ_IN_CB(IOPORT("IN.0"))
MCFG_COP400_WRITE_D_CB(WRITE8(einvaderc_state, write_d))
@@ -564,14 +564,175 @@ static MACHINE_CONFIG_START( einvaderc, einvaderc_state )
MCFG_COP400_WRITE_SO_CB(WRITELINE(einvaderc_state, write_so))
MCFG_COP400_WRITE_L_CB(WRITE8(einvaderc_state, write_l))
+ /* video hardware */
+ MCFG_SCREEN_SVG_ADD("screen", "svg")
+ MCFG_SCREEN_REFRESH_RATE(50)
+ MCFG_SCREEN_SIZE(913, 1080)
+ MCFG_SCREEN_VISIBLE_AREA(0, 913-1, 0, 1080-1)
MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_cop400_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_einvaderc)
/* sound hardware */
- MCFG_SPEAKER_STANDARD_MONO("speaker")
- MCFG_SOUND_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE_EX(0, "dac", 1.0, DAC_VREF_POS_INPUT)
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+MACHINE_CONFIG_END
+
+
+
+
+
+/***************************************************************************
+
+ LJN I Took a Lickin' From a Chicken
+ * COP421 MCU label ~/005 COP421-NJC/N
+ * 11 leds, 1-bit sound, motor to a rubber chicken with a pulley in the middle
+
+ This toy includes 4 games: Tic Tac Toe, Chicken Sez, and Total Recall I/II.
+
+ known releases:
+ - USA: I Took a Lickin' From a Chicken (KMart Corporation/LJN?)
+ - Japan: Professor Chicken's Genius Classroom 「ã«ã‚ã¨ã‚Šåšå£«ã®å¤©æ‰æ•™å®¤ã€,
+ distributed by Bandai
+
+***************************************************************************/
+
+class lchicken_state : public hh_cop400_state
+{
+public:
+ lchicken_state(const machine_config &mconfig, device_type type, const char *tag)
+ : hh_cop400_state(mconfig, type, tag)
+ { }
+
+ u8 m_motor_pos;
+ TIMER_DEVICE_CALLBACK_MEMBER(motor_sim_tick);
+ DECLARE_CUSTOM_INPUT_MEMBER(motor_switch);
+
+ DECLARE_WRITE8_MEMBER(write_l);
+ DECLARE_WRITE8_MEMBER(write_d);
+ DECLARE_WRITE8_MEMBER(write_g);
+ DECLARE_READ8_MEMBER(read_g);
+ DECLARE_WRITE_LINE_MEMBER(write_so);
+ DECLARE_READ_LINE_MEMBER(read_si);
+
+protected:
+ virtual void machine_start() override;
+};
+
+// handlers
+
+TIMER_DEVICE_CALLBACK_MEMBER(lchicken_state::motor_sim_tick)
+{
+ if (~m_inp_mux & 8)
+ {
+ m_motor_pos++;
+ output().set_value("motor_pos", 100 * (m_motor_pos / (float)0x100));
+ }
+}
+
+WRITE8_MEMBER(lchicken_state::write_l)
+{
+ // L0-L3: led data
+ // L4-L6: led select
+ // L7: N/C
+ display_matrix(4, 3, ~data & 0xf, data >> 4 & 7);
+}
+
+WRITE8_MEMBER(lchicken_state::write_d)
+{
+ // D0-D3: input mux
+ // D3: motor on
+ m_inp_mux = data & 0xf;
+ output().set_value("motor_on", ~data >> 3 & 1);
+}
+
+WRITE8_MEMBER(lchicken_state::write_g)
+{
+ m_g = data;
+}
+
+READ8_MEMBER(lchicken_state::read_g)
+{
+ // G0-G3: multiplexed inputs
+ return read_inputs(4) & m_g;
+}
+
+WRITE_LINE_MEMBER(lchicken_state::write_so)
+{
+ // SO: speaker out
+ m_speaker->level_w(state);
+ m_so = state;
+}
+
+READ_LINE_MEMBER(lchicken_state::read_si)
+{
+ // SI: SO
+ return m_so;
+}
+
+
+// config
+
+static INPUT_PORTS_START( lchicken )
+ PORT_START("IN.0") // D0 port G
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("IN.1") // D1 port G
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("IN.2") // D2 port G
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("IN.3") // D3 port G
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, lchicken_state, motor_switch, nullptr)
+INPUT_PORTS_END
+
+CUSTOM_INPUT_MEMBER(lchicken_state::motor_switch)
+{
+ return m_motor_pos > 0xe8; // approximation
+}
+
+void lchicken_state::machine_start()
+{
+ hh_cop400_state::machine_start();
+
+ // zerofill, register for savestates
+ m_motor_pos = 0;
+ save_item(NAME(m_motor_pos));
+}
+
+static MACHINE_CONFIG_START( lchicken, lchicken_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", COP421, 850000) // approximation - RC osc. R=12K, C=100pF
+ MCFG_COP400_CONFIG(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false) // guessed
+ MCFG_COP400_WRITE_L_CB(WRITE8(lchicken_state, write_l))
+ MCFG_COP400_WRITE_D_CB(WRITE8(lchicken_state, write_d))
+ MCFG_COP400_WRITE_G_CB(WRITE8(lchicken_state, write_g))
+ MCFG_COP400_READ_G_CB(READ8(lchicken_state, read_g))
+ MCFG_COP400_WRITE_SO_CB(WRITELINE(lchicken_state, write_so))
+ MCFG_COP400_READ_SI_CB(READLINE(lchicken_state, read_si))
+
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("chicken_motor", lchicken_state, motor_sim_tick, attotime::from_msec(6000/0x100)) // ~6sec for a full rotation
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_cop400_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_DEFAULT_LAYOUT(layout_lchicken)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MACHINE_CONFIG_END
@@ -590,12 +751,9 @@ class funjacks_state : public hh_cop400_state
{
public:
funjacks_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_cop400_state(mconfig, type, tag),
- m_dac(*this, "dac")
+ : hh_cop400_state(mconfig, type, tag)
{ }
- required_device<dac_bit_interface> m_dac;
-
DECLARE_WRITE8_MEMBER(write_d);
DECLARE_WRITE8_MEMBER(write_l);
DECLARE_WRITE8_MEMBER(write_g);
@@ -623,7 +781,7 @@ WRITE8_MEMBER(funjacks_state::write_l)
WRITE8_MEMBER(funjacks_state::write_g)
{
// G1: speaker out
- m_dac->write(BIT(data, 1));
+ m_speaker->level_w(data >> 1 & 1);
m_g = data;
}
@@ -668,7 +826,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( funjacks, funjacks_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", COP410, 1000000) // approximation - RC osc. R=47K, C=56pf
+ MCFG_CPU_ADD("maincpu", COP410, 1000000) // approximation - RC osc. R=47K, C=56pF
MCFG_COP400_CONFIG(COP400_CKI_DIVISOR_8, COP400_CKO_OSCILLATOR_OUTPUT, false) // guessed
MCFG_COP400_WRITE_D_CB(WRITE8(funjacks_state, write_d))
MCFG_COP400_WRITE_L_CB(WRITE8(funjacks_state, write_l))
@@ -680,10 +838,9 @@ static MACHINE_CONFIG_START( funjacks, funjacks_state )
MCFG_DEFAULT_LAYOUT(layout_funjacks)
/* sound hardware */
- MCFG_SPEAKER_STANDARD_MONO("speaker")
- MCFG_SOUND_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE_EX(0, "dac", 1.0, DAC_VREF_POS_INPUT)
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MACHINE_CONFIG_END
@@ -706,12 +863,9 @@ class funrlgl_state : public hh_cop400_state
{
public:
funrlgl_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_cop400_state(mconfig, type, tag),
- m_dac(*this, "dac")
+ : hh_cop400_state(mconfig, type, tag)
{ }
- required_device<dac_bit_interface> m_dac;
-
DECLARE_WRITE8_MEMBER(write_d);
DECLARE_WRITE8_MEMBER(write_l);
DECLARE_WRITE8_MEMBER(write_g);
@@ -740,7 +894,7 @@ WRITE8_MEMBER(funrlgl_state::write_l)
WRITE8_MEMBER(funrlgl_state::write_g)
{
// G3: speaker out
- m_dac->write(BIT(data, 3));
+ m_speaker->level_w(data >> 3 & 1);
}
@@ -765,12 +919,11 @@ INPUT_CHANGED_MEMBER(funrlgl_state::reset_button)
m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
}
-
static MACHINE_CONFIG_START( funrlgl, funrlgl_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", COP410, 1000000) // approximation - RC osc. R=51K, C=91pf
- MCFG_COP400_CONFIG(COP400_CKI_DIVISOR_8, COP400_CKO_OSCILLATOR_OUTPUT, true) // guessed
+ MCFG_CPU_ADD("maincpu", COP410, 1000000) // approximation - RC osc. R=51K, C=91pF
+ MCFG_COP400_CONFIG(COP400_CKI_DIVISOR_8, COP400_CKO_OSCILLATOR_OUTPUT, false) // guessed
MCFG_COP400_WRITE_D_CB(WRITE8(funrlgl_state, write_d))
MCFG_COP400_WRITE_L_CB(WRITE8(funrlgl_state, write_l))
MCFG_COP400_READ_L_TRISTATE_CB(READ8(funrlgl_state, read_l_tristate))
@@ -781,10 +934,145 @@ static MACHINE_CONFIG_START( funrlgl, funrlgl_state )
MCFG_DEFAULT_LAYOUT(layout_funrlgl)
/* sound hardware */
- MCFG_SPEAKER_STANDARD_MONO("speaker")
- MCFG_SOUND_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE_EX(0, "dac", 1.0, DAC_VREF_POS_INPUT)
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+MACHINE_CONFIG_END
+
+
+
+
+
+/***************************************************************************
+
+ Mattel Dalla$ (J.R. handheld)
+ * COP444 MCU label COP444L-HYN/N
+ * 8-digit 7seg display, 1-bit sound
+
+ This is a board game, only the handheld device is emulated here.
+
+***************************************************************************/
+
+class mdallas_state : public hh_cop400_state
+{
+public:
+ mdallas_state(const machine_config &mconfig, device_type type, const char *tag)
+ : hh_cop400_state(mconfig, type, tag)
+ { }
+
+ void prepare_display();
+ DECLARE_WRITE8_MEMBER(write_l);
+ DECLARE_WRITE8_MEMBER(write_d);
+ DECLARE_WRITE8_MEMBER(write_g);
+ DECLARE_READ8_MEMBER(read_in);
+};
+
+// handlers
+
+void mdallas_state::prepare_display()
+{
+ set_display_segmask(0xff, 0xff);
+ display_matrix(8, 8, m_l, ~(m_d << 4 | m_g));
+}
+
+WRITE8_MEMBER(mdallas_state::write_l)
+{
+ // L: digit segment data
+ m_l = data;
+ prepare_display();
+}
+
+WRITE8_MEMBER(mdallas_state::write_d)
+{
+ // D: select digit, input mux high
+ m_inp_mux = (m_inp_mux & 0xf) | (data << 4 & 3);
+ m_d = data & 0xf;
+ prepare_display();
+}
+
+WRITE8_MEMBER(mdallas_state::write_g)
+{
+ // G: select digit, input mux low
+ m_inp_mux = (m_inp_mux & 0x30) | (data & 0xf);
+ m_g = data & 0xf;
+ prepare_display();
+}
+
+READ8_MEMBER(mdallas_state::read_in)
+{
+ // IN: multiplexed inputs
+ return read_inputs(6) & 0xf;
+}
+
+
+// config
+
+/* physical button layout and labels is like this:
+
+ < ON> [YES] [NO] [NEXT]
+ [W] [N] [S] [E]
+ [7] [8] [9] [STATUS]
+ [4] [5] [6] [ASSETS]
+ [1] [2] [3] [START]
+ [CLEAR] [0] [MOVE] [ENTER]
+*/
+
+static INPUT_PORTS_START( mdallas )
+ PORT_START("IN.0") // G0 port IN
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_CODE(KEYCODE_DEL) PORT_NAME("Clear")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Move")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter")
+
+ PORT_START("IN.1") // G1 port IN
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Start")
+
+ PORT_START("IN.2") // G2 port IN
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Assets")
+
+ PORT_START("IN.3") // G3 port IN
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Status")
+
+ PORT_START("IN.4") // D0 port IN
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("West") // W
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Next")
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("East") // E
+
+ PORT_START("IN.5") // D1 port IN
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("No")
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("Yes")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("South") // S
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("North") // N
+INPUT_PORTS_END
+
+static MACHINE_CONFIG_START( mdallas, mdallas_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", COP444L, 1000000) // approximation - RC osc. R=57K, C=101pF
+ MCFG_COP400_CONFIG(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false) // guessed
+ MCFG_COP400_WRITE_L_CB(WRITE8(mdallas_state, write_l))
+ MCFG_COP400_WRITE_D_CB(WRITE8(mdallas_state, write_d))
+ MCFG_COP400_WRITE_G_CB(WRITE8(mdallas_state, write_g))
+ MCFG_COP400_READ_IN_CB(READ8(mdallas_state, read_in))
+ MCFG_COP400_WRITE_SO_CB(DEVWRITELINE("speaker", speaker_sound_device, level_w))
+
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_cop400_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_DEFAULT_LAYOUT(layout_mdallas)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MACHINE_CONFIG_END
@@ -795,7 +1083,10 @@ MACHINE_CONFIG_END
Milton Bradley Plus One
* COP410L MCU in 8-pin DIP, label ~/029 MM 57405 (die label COP410L/B NNE)
- * 4 sensors(1 on each die side), 1-bit sound
+ * orientation sensor(4 directions), 1-bit sound
+
+ This is a board game, each player needs to rotate a triangular pyramid
+ shaped piece the same as the previous player, plus 1.
***************************************************************************/
@@ -803,21 +1094,31 @@ class plus1_state : public hh_cop400_state
{
public:
plus1_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_cop400_state(mconfig, type, tag),
- m_dac(*this, "dac")
+ : hh_cop400_state(mconfig, type, tag)
{ }
- required_device<dac_bit_interface> m_dac;
-
DECLARE_WRITE8_MEMBER(write_d);
+ DECLARE_WRITE8_MEMBER(write_l);
+ DECLARE_READ8_MEMBER(read_l);
};
// handlers
WRITE8_MEMBER(plus1_state::write_d)
{
- // D?: speaker out
- m_dac->write(BIT(data, 0));
+ // D0?: speaker out
+ m_speaker->level_w(data & 1);
+}
+
+WRITE8_MEMBER(plus1_state::write_l)
+{
+ m_l = data;
+}
+
+READ8_MEMBER(plus1_state::read_l)
+{
+ // L: IN.1, mask with output
+ return m_inp_matrix[1]->read() & m_l;
}
@@ -826,34 +1127,34 @@ WRITE8_MEMBER(plus1_state::write_d)
static INPUT_PORTS_START( plus1 )
PORT_START("IN.0") // port G
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 )
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Sensor Position 3")
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Sensor Position 1")
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_START("IN.1") // port L
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 )
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_NAME("Sensor Position 4")
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("Sensor Position 2")
PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END
static MACHINE_CONFIG_START( plus1, plus1_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", COP410, 1000000) // approximation - RC osc. R=51K, C=100pf
+ MCFG_CPU_ADD("maincpu", COP410, 1000000) // approximation - RC osc. R=51K, C=100pF
MCFG_COP400_CONFIG(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false) // guessed
MCFG_COP400_WRITE_D_CB(WRITE8(plus1_state, write_d))
MCFG_COP400_READ_G_CB(IOPORT("IN.0"))
- MCFG_COP400_READ_L_CB(IOPORT("IN.1"))
+ MCFG_COP400_WRITE_L_CB(WRITE8(plus1_state, write_l))
+ MCFG_COP400_READ_L_CB(READ8(plus1_state, read_l))
/* no visual feedback! */
/* sound hardware */
- MCFG_SPEAKER_STANDARD_MONO("speaker")
- MCFG_SOUND_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE_EX(0, "dac", 1.0, DAC_VREF_POS_INPUT)
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MACHINE_CONFIG_END
@@ -898,7 +1199,7 @@ public:
void lightfgt_state::prepare_display()
{
- uint8_t grid = (m_so | m_d << 1) ^ 0x1f;
+ u8 grid = (m_so | m_d << 1) ^ 0x1f;
display_matrix(5, 5, m_l, grid);
}
@@ -969,22 +1270,21 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( lightfgt, lightfgt_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", COP421, 950000) // approximation - RC osc. R=82K, C=56pf
+ MCFG_CPU_ADD("maincpu", COP421, 950000) // approximation - RC osc. R=82K, C=56pF
MCFG_COP400_CONFIG(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false) // guessed
MCFG_COP400_WRITE_SO_CB(WRITELINE(lightfgt_state, write_so))
MCFG_COP400_WRITE_D_CB(WRITE8(lightfgt_state, write_d))
MCFG_COP400_WRITE_L_CB(WRITE8(lightfgt_state, write_l))
- MCFG_COP400_WRITE_SK_CB(DEVWRITELINE("dac", dac_bit_interface, write))
+ MCFG_COP400_WRITE_SK_CB(DEVWRITELINE("speaker", speaker_sound_device, level_w))
MCFG_COP400_READ_G_CB(READ8(lightfgt_state, read_g))
MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_cop400_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_lightfgt)
/* sound hardware */
- MCFG_SPEAKER_STANDARD_MONO("speaker")
- MCFG_SOUND_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25)
- MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
- MCFG_SOUND_ROUTE_EX(0, "dac", 1.0, DAC_VREF_POS_INPUT)
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MACHINE_CONFIG_END
@@ -1124,8 +1424,8 @@ base pulled high with 4.7K resistor, connects directly to G3, 1K resistor to G2,
static MACHINE_CONFIG_START( bship82, bship82_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", COP420, 3000000) // approximation - RC osc. R=14K, C=100pf
- MCFG_COP400_CONFIG(COP400_CKI_DIVISOR_16, COP400_CKO_OSCILLATOR_OUTPUT, false) // guessed
+ MCFG_CPU_ADD("maincpu", COP420, 750000) // approximation - RC osc. R=14K, C=100pF
+ MCFG_COP400_CONFIG(COP400_CKI_DIVISOR_4, COP400_CKO_OSCILLATOR_OUTPUT, false) // guessed
MCFG_COP400_WRITE_D_CB(WRITE8(bship82_state, write_d))
MCFG_COP400_WRITE_G_CB(DEVWRITE8("dac", dac_byte_interface, write)) // G: 4-bit signed DAC
MCFG_COP400_READ_L_CB(READ8(bship82_state, read_l))
@@ -1137,8 +1437,8 @@ static MACHINE_CONFIG_START( bship82, bship82_state )
MCFG_DEFAULT_LAYOUT(layout_bship82)
/* sound hardware */
- MCFG_SPEAKER_STANDARD_MONO("speaker")
- MCFG_SOUND_ADD("dac", DAC_4BIT_BINARY_WEIGHTED_SIGN_MAGNITUDE, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.125) // unknown DAC
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("dac", DAC_4BIT_BINARY_WEIGHTED_SIGN_MAGNITUDE, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.125) // unknown DAC
MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
MCFG_SOUND_ROUTE_EX(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE_EX(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
MACHINE_CONFIG_END
@@ -1256,7 +1556,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( qkracer, qkracer_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", COP420, 1000000) // approximation - RC osc. R=47K, C=100pf
+ MCFG_CPU_ADD("maincpu", COP420, 1000000) // approximation - RC osc. R=47K, C=100pF
MCFG_COP400_CONFIG(COP400_CKI_DIVISOR_32, COP400_CKO_OSCILLATOR_OUTPUT, false) // guessed
MCFG_COP400_WRITE_D_CB(WRITE8(qkracer_state, write_d))
MCFG_COP400_WRITE_G_CB(WRITE8(qkracer_state, write_g))
@@ -1295,6 +1595,15 @@ ROM_END
ROM_START( einvaderc )
ROM_REGION( 0x0800, "maincpu", 0 )
ROM_LOAD( "copl444-hrz_n_inv_ii", 0x0000, 0x0800, CRC(76400f38) SHA1(0e92ab0517f7b7687293b189d30d57110df20fe0) )
+
+ ROM_REGION( 80636, "svg", 0)
+ ROM_LOAD( "einvaderc.svg", 0, 80636, CRC(a52d0166) SHA1(f69397ebcc518701f30a47b4d62e5a700825375a) ) // by hap, ver. 18 jan 2017
+ROM_END
+
+
+ROM_START( lchicken )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "cop421-njc_n", 0x0000, 0x0400, CRC(319e7985) SHA1(9714327518f65ebefe38ac7911bed2b9b9c77307) )
ROM_END
@@ -1310,9 +1619,15 @@ ROM_START( funrlgl )
ROM_END
+ROM_START( mdallas )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "copl444l-hyn_n", 0x0000, 0x0800, CRC(7848b78c) SHA1(778d24512180892f58c49df3c72ca77b2618d63b) )
+ROM_END
+
+
ROM_START( plus1 )
ROM_REGION( 0x0200, "maincpu", 0 )
- ROM_LOAD( "cop410l_b_nne", 0x0000, 0x0200, BAD_DUMP CRC(8626fdb8) SHA1(fd241b6dde0e4e86b439cb2c5bb3a82fb257d7e1) ) // still need to verify
+ ROM_LOAD( "cop410l_b_nne", 0x0000, 0x0200, CRC(d861b80c) SHA1(4652f8ee0dd4c3c48b625285bb4f094d96434071) )
ROM_END
@@ -1340,12 +1655,15 @@ CONS( 1979, ctstein, 0, 0, ctstein, ctstein, driver_device, 0, "Cas
CONS( 1980, h2hbaskb, 0, 0, h2hbaskb, h2hbaskb, driver_device, 0, "Coleco", "Head to Head Basketball/Hockey/Soccer (COP420L version)", MACHINE_SUPPORTS_SAVE )
-CONS( 1981, einvaderc, einvader, 0, einvaderc, einvaderc, driver_device, 0, "Entex", "Space Invader (Entex, COP444L version)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
+CONS( 1981, einvaderc, einvader, 0, einvaderc, einvaderc, driver_device, 0, "Entex", "Space Invader (Entex, COP444L version)", MACHINE_SUPPORTS_SAVE )
+
+CONS( 1980, lchicken, 0, 0, lchicken, lchicken, driver_device, 0, "LJN", "I Took a Lickin' From a Chicken", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_MECHANICAL )
CONS( 1979, funjacks, 0, 0, funjacks, funjacks, driver_device, 0, "Mattel", "Funtronics Jacks", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1979, funrlgl, 0, 0, funrlgl, funrlgl, driver_device, 0, "Mattel", "Funtronics Red Light Green Light", MACHINE_SUPPORTS_SAVE )
+CONS( 1981, mdallas, 0, 0, mdallas, mdallas, driver_device, 0, "Mattel", "Dalla$ (J.R. handheld)", MACHINE_SUPPORTS_SAVE ) // ***
-CONS( 1980, plus1, 0, 0, plus1, plus1, driver_device, 0, "Milton Bradley", "Plus One", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING ) // ***
+CONS( 1980, plus1, 0, 0, plus1, plus1, driver_device, 0, "Milton Bradley", "Plus One", MACHINE_SUPPORTS_SAVE ) // ***
CONS( 1981, lightfgt, 0, 0, lightfgt, lightfgt, driver_device, 0, "Milton Bradley", "Lightfight", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK )
CONS( 1982, bship82, bship, 0, bship82, bship82, driver_device, 0, "Milton Bradley", "Electronic Battleship (1982 version)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // ***
diff --git a/src/mame/drivers/hh_hmcs40.cpp b/src/mame/drivers/hh_hmcs40.cpp
index 4cd7736585a..ea66da14cdf 100644
--- a/src/mame/drivers/hh_hmcs40.cpp
+++ b/src/mame/drivers/hh_hmcs40.cpp
@@ -122,34 +122,34 @@ public:
optional_device<speaker_sound_device> m_speaker;
// misc common
- uint8_t m_r[8]; // MCU R ports write data (optional)
- uint16_t m_d; // MCU D port write data (optional)
- uint8_t m_int[2]; // MCU INT0/1 pins state
- uint16_t m_inp_mux; // multiplexed inputs mask
+ u8 m_r[8]; // MCU R ports write data (optional)
+ u16 m_d; // MCU D port write data (optional)
+ u8 m_int[2]; // MCU INT0/1 pins state
+ u16 m_inp_mux; // multiplexed inputs mask
- uint16_t read_inputs(int columns);
+ u16 read_inputs(int columns);
void refresh_interrupts(void);
void set_interrupt(int line, int state);
DECLARE_INPUT_CHANGED_MEMBER(single_interrupt_line);
// display common
- int m_display_wait; // led/lamp off-delay in microseconds (default 33ms)
- int m_display_maxy; // display matrix number of rows
- int m_display_maxx; // display matrix number of columns (max 47 for now)
+ int m_display_wait; // led/lamp off-delay in microseconds (default 33ms)
+ int m_display_maxy; // display matrix number of rows
+ int m_display_maxx; // display matrix number of columns (max 47 for now)
- uint32_t m_grid; // VFD current row data
- uint64_t m_plate; // VFD current column data
+ u32 m_grid; // VFD current row data
+ u64 m_plate; // VFD current column data
- uint64_t m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
- uint16_t m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
- uint64_t m_display_cache[0x20]; // (internal use)
- uint8_t m_display_decay[0x20][0x40]; // (internal use)
+ u64 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
+ u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
+ u64 m_display_cache[0x20]; // (internal use)
+ u8 m_display_decay[0x20][0x40]; // (internal use)
TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
void display_update();
void set_display_size(int maxx, int maxy);
- void set_display_segmask(uint32_t digits, uint32_t mask);
- void display_matrix(int maxx, int maxy, uint64_t setx, uint32_t sety, bool update = true);
+ void set_display_segmask(u32 digits, u32 mask);
+ void display_matrix(int maxx, int maxy, u64 setx, u32 sety, bool update = true);
protected:
virtual void machine_start() override;
@@ -210,7 +210,7 @@ void hh_hmcs40_state::machine_reset()
void hh_hmcs40_state::display_update()
{
- uint64_t active_state[0x20];
+ u64 active_state[0x20];
for (int y = 0; y < m_display_maxy; y++)
{
@@ -223,7 +223,7 @@ void hh_hmcs40_state::display_update()
m_display_decay[y][x] = m_display_wait;
// determine active state
- uint64_t ds = (m_display_decay[y][x] != 0) ? 1 : 0;
+ u64 ds = (m_display_decay[y][x] != 0) ? 1 : 0;
active_state[y] |= (ds << x);
}
}
@@ -278,7 +278,7 @@ void hh_hmcs40_state::set_display_size(int maxx, int maxy)
m_display_maxy = maxy;
}
-void hh_hmcs40_state::set_display_segmask(uint32_t digits, uint32_t mask)
+void hh_hmcs40_state::set_display_segmask(u32 digits, u32 mask)
{
// set a segment mask per selected digit, but leave unselected ones alone
for (int i = 0; i < 0x20; i++)
@@ -289,12 +289,12 @@ void hh_hmcs40_state::set_display_segmask(uint32_t digits, uint32_t mask)
}
}
-void hh_hmcs40_state::display_matrix(int maxx, int maxy, uint64_t setx, uint32_t sety, bool update)
+void hh_hmcs40_state::display_matrix(int maxx, int maxy, u64 setx, u32 sety, bool update)
{
set_display_size(maxx, maxy);
// update current state
- uint64_t mask = (u64(1) << maxx) - 1;
+ u64 mask = (u64(1) << maxx) - 1;
for (int y = 0; y < maxy; y++)
m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (u64(1) << maxx)) : 0;
@@ -305,9 +305,9 @@ void hh_hmcs40_state::display_matrix(int maxx, int maxy, uint64_t setx, uint32_t
// generic input handlers
-uint16_t hh_hmcs40_state::read_inputs(int columns)
+u16 hh_hmcs40_state::read_inputs(int columns)
{
- uint16_t ret = 0;
+ u16 ret = 0;
// read selected input rows
for (int i = 0; i < columns; i++)
@@ -382,7 +382,7 @@ WRITE8_MEMBER(bambball_state::plate_w)
m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
// update display
- uint16_t plate = BITSWAP16(m_plate,13,8,4,12,9,10,14,1,7,0,15,11,6,3,5,2);
+ u16 plate = BITSWAP16(m_plate,13,8,4,12,9,10,14,1,7,0,15,11,6,3,5,2);
display_matrix(16, 9, plate, m_grid);
}
@@ -491,8 +491,8 @@ public:
void bmboxing_state::prepare_display()
{
- uint16_t grid = BITSWAP16(m_grid,15,14,13,12,11,10,9,0,1,2,3,4,5,6,7,8);
- uint32_t plate = BITSWAP16(m_plate,15,14,13,12,1,2,0,3,11,4,10,7,5,6,9,8);
+ u16 grid = BITSWAP16(m_grid,15,14,13,12,11,10,9,0,1,2,3,4,5,6,7,8);
+ u32 plate = BITSWAP16(m_plate,15,14,13,12,1,2,0,3,11,4,10,7,5,6,9,8);
display_matrix(12, 9, plate, grid);
}
@@ -630,8 +630,8 @@ public:
void bfriskyt_state::prepare_display()
{
- uint16_t grid = BITSWAP16(m_grid,15,14,13,12,11,10,9,8,0,1,2,3,4,5,6,7);
- uint32_t plate = BITSWAP24(m_plate,23,22,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21);
+ u16 grid = BITSWAP16(m_grid,15,14,13,12,11,10,9,8,0,1,2,3,4,5,6,7);
+ u32 plate = BITSWAP24(m_plate,23,22,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21);
display_matrix(22, 8, plate, grid);
}
@@ -649,7 +649,7 @@ WRITE16_MEMBER(bfriskyt_state::grid_w)
m_speaker->level_w(data >> 6 & 1);
// D11-D15: input mux
- uint8_t inp_mux = data >> 11 & 0x1f;
+ u8 inp_mux = data >> 11 & 0x1f;
if (inp_mux != m_inp_mux)
{
m_inp_mux = inp_mux;
@@ -698,7 +698,6 @@ INPUT_CHANGED_MEMBER(bfriskyt_state::input_changed)
update_int1();
}
-
static MACHINE_CONFIG_START( bfriskyt, bfriskyt_state )
/* basic machine hardware */
@@ -763,8 +762,8 @@ WRITE8_MEMBER(packmon_state::plate_w)
m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
// update display
- uint16_t grid = BITSWAP16(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9);
- uint32_t plate = BITSWAP24(m_plate,23,22,21,20,0,1,2,3,4,5,6,19,18,17,16,15,14,13,12,11,10,9,8,7);
+ u16 grid = BITSWAP16(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9);
+ u32 plate = BITSWAP24(m_plate,23,22,21,20,0,1,2,3,4,5,6,19,18,17,16,15,14,13,12,11,10,9,8,7);
display_matrix(20, 10, plate, grid);
}
@@ -873,8 +872,8 @@ public:
void msthawk_state::prepare_display()
{
- uint16_t grid = BITSWAP16(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9);
- uint32_t plate = BITSWAP24(m_plate,23,22,21,19,20,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
+ u16 grid = BITSWAP16(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9);
+ u32 plate = BITSWAP24(m_plate,23,22,21,19,20,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
display_matrix(21, 10, plate, grid);
}
@@ -892,7 +891,7 @@ WRITE16_MEMBER(msthawk_state::grid_w)
m_speaker->level_w(data >> 5 & 1);
// D10-D15: input mux
- uint8_t inp_mux = data >> 10 & 0x3f;
+ u8 inp_mux = data >> 10 & 0x3f;
if (inp_mux != m_inp_mux)
{
m_inp_mux = inp_mux;
@@ -944,7 +943,6 @@ INPUT_CHANGED_MEMBER(msthawk_state::input_changed)
update_int0();
}
-
static MACHINE_CONFIG_START( msthawk, msthawk_state )
/* basic machine hardware */
@@ -1006,8 +1004,8 @@ WRITE8_MEMBER(bzaxxon_state::plate_w)
m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
// update display
- uint16_t grid = BITSWAP16(m_grid,15,14,13,12,11,6,7,8,9,10,5,4,3,2,1,0);
- uint32_t plate = BITSWAP24(m_plate,23,22,21,20,5,7,0,1,2,3,4,6,19,16,17,18,15,14,13,12,10,8,9,11) | 0x800;
+ u16 grid = BITSWAP16(m_grid,15,14,13,12,11,6,7,8,9,10,5,4,3,2,1,0);
+ u32 plate = BITSWAP24(m_plate,23,22,21,20,5,7,0,1,2,3,4,6,19,16,17,18,15,14,13,12,10,8,9,11) | 0x800;
display_matrix(20, 11, plate, grid);
}
@@ -1017,7 +1015,7 @@ WRITE16_MEMBER(bzaxxon_state::grid_w)
m_speaker->level_w(data >> 4 & 1);
// D7-D10: input mux
- uint8_t inp_mux = data >> 7 & 0xf;
+ u8 inp_mux = data >> 7 & 0xf;
if (inp_mux != m_inp_mux)
{
m_inp_mux = inp_mux;
@@ -1066,7 +1064,6 @@ INPUT_CHANGED_MEMBER(bzaxxon_state::input_changed)
update_int1();
}
-
static MACHINE_CONFIG_START( bzaxxon, bzaxxon_state )
/* basic machine hardware */
@@ -1127,8 +1124,8 @@ WRITE8_MEMBER(zackman_state::plate_w)
m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
// update display
- uint8_t grid = BITSWAP8(m_grid,0,1,2,3,4,5,6,7);
- uint32_t plate = BITSWAP32(m_plate,31,30,27,0,1,2,3,4,5,6,7,8,9,10,11,24,25,26,29,28,23,22,21,20,19,18,17,16,15,14,13,12);
+ u8 grid = BITSWAP8(m_grid,0,1,2,3,4,5,6,7);
+ u32 plate = BITSWAP32(m_plate,31,30,27,0,1,2,3,4,5,6,7,8,9,10,11,24,25,26,29,28,23,22,21,20,19,18,17,16,15,14,13,12);
display_matrix(29, 8, plate, grid);
}
@@ -1138,7 +1135,7 @@ WRITE16_MEMBER(zackman_state::grid_w)
m_speaker->level_w(data >> 2 & 1);
// D11-D14: input mux
- uint8_t inp_mux = data >> 11 & 0xf;
+ u8 inp_mux = data >> 11 & 0xf;
if (inp_mux != m_inp_mux)
{
m_inp_mux = inp_mux;
@@ -1183,7 +1180,6 @@ INPUT_CHANGED_MEMBER(zackman_state::input_changed)
update_int0();
}
-
static MACHINE_CONFIG_START( zackman, zackman_state )
/* basic machine hardware */
@@ -1243,8 +1239,8 @@ public:
void bpengo_state::prepare_display()
{
- uint8_t grid = BITSWAP8(m_grid,0,1,2,3,4,5,6,7);
- uint32_t plate = BITSWAP32(m_plate,31,30,29,28,23,22,21,16,17,18,19,20,27,26,25,24,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
+ u8 grid = BITSWAP8(m_grid,0,1,2,3,4,5,6,7);
+ u32 plate = BITSWAP32(m_plate,31,30,29,28,23,22,21,16,17,18,19,20,27,26,25,24,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
display_matrix(25, 8, plate, grid);
}
@@ -1262,7 +1258,7 @@ WRITE16_MEMBER(bpengo_state::grid_w)
m_speaker->level_w(data >> 10 & 1);
// D12-D15: input mux
- uint8_t inp_mux = data >> 12 & 0xf;
+ u8 inp_mux = data >> 12 & 0xf;
if (inp_mux != m_inp_mux)
{
m_inp_mux = inp_mux;
@@ -1311,7 +1307,6 @@ INPUT_CHANGED_MEMBER(bpengo_state::input_changed)
update_int0();
}
-
static MACHINE_CONFIG_START( bpengo, bpengo_state )
/* basic machine hardware */
@@ -1372,8 +1367,8 @@ public:
void bbtime_state::prepare_display()
{
- uint8_t grid = BITSWAP8(m_grid,7,6,0,1,2,3,4,5);
- uint32_t plate = BITSWAP32(m_plate,31,30,29,28,25,24,26,27,22,23,15,14,12,11,10,8,7,6,4,1,5,9,13,3,2,16,17,18,19,20,0,21) | 0x1;
+ u8 grid = BITSWAP8(m_grid,7,6,0,1,2,3,4,5);
+ u32 plate = BITSWAP32(m_plate,31,30,29,28,25,24,26,27,22,23,15,14,12,11,10,8,7,6,4,1,5,9,13,3,2,16,17,18,19,20,0,21) | 0x1;
display_matrix(28, 6, plate, grid);
}
@@ -1391,7 +1386,7 @@ WRITE16_MEMBER(bbtime_state::grid_w)
m_speaker->level_w(data >> 3 & 1);
// D10-D14: input mux
- uint8_t inp_mux = data >> 10 & 0x1f;
+ u8 inp_mux = data >> 10 & 0x1f;
if (inp_mux != m_inp_mux)
{
m_inp_mux = inp_mux;
@@ -1437,7 +1432,6 @@ INPUT_CHANGED_MEMBER(bbtime_state::input_changed)
update_int0();
}
-
static MACHINE_CONFIG_START( bbtime, bbtime_state )
/* basic machine hardware */
@@ -1498,8 +1492,8 @@ WRITE8_MEMBER(bdoramon_state::plate_w)
m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
// update display
- uint8_t grid = BITSWAP8(m_grid,0,1,2,3,4,5,7,6);
- uint32_t plate = BITSWAP24(m_plate,23,22,21,20,11,19,18,17,16,15,14,13,12,10,9,8,7,6,5,4,3,2,1,0);
+ u8 grid = BITSWAP8(m_grid,0,1,2,3,4,5,7,6);
+ u32 plate = BITSWAP24(m_plate,23,22,21,20,11,19,18,17,16,15,14,13,12,10,9,8,7,6,5,4,3,2,1,0);
display_matrix(19, 8, plate, grid);
}
@@ -1597,8 +1591,8 @@ WRITE8_MEMBER(bultrman_state::plate_w)
m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
// update display
- uint8_t grid = BITSWAP8(m_grid,0,1,2,3,4,5,6,7);
- uint32_t plate = BITSWAP24(m_plate,23,22,21,20,19,0,18,17,16,15,14,13,12,3,11,10,9,8,7,6,5,4,1,2);
+ u8 grid = BITSWAP8(m_grid,0,1,2,3,4,5,6,7);
+ u32 plate = BITSWAP24(m_plate,23,22,21,20,19,0,18,17,16,15,14,13,12,3,11,10,9,8,7,6,5,4,1,2);
display_matrix(18, 8, plate, grid);
}
@@ -1684,7 +1678,7 @@ public:
void machiman_state::prepare_display()
{
- uint32_t plate = BITSWAP24(m_plate,23,22,21,20,19,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18);
+ u32 plate = BITSWAP24(m_plate,23,22,21,20,19,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18);
display_matrix(19, 5, plate, m_grid);
}
@@ -1938,7 +1932,7 @@ WRITE8_MEMBER(alnattck_state::plate_w)
m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
// update display
- uint32_t plate = BITSWAP24(m_plate,23,22,21,20,19,18,17,16,11,9,8,10,7,2,0,1,3,4,5,6,12,13,14,15);
+ u32 plate = BITSWAP24(m_plate,23,22,21,20,19,18,17,16,11,9,8,10,7,2,0,1,3,4,5,6,12,13,14,15);
display_matrix(20, 10, plate, m_grid);
}
@@ -2065,7 +2059,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(cdkong_state::speaker_decay_sim)
void cdkong_state::prepare_display()
{
- uint32_t plate = BITSWAP32(m_plate,31,30,29,24,0,16,8,1,23,17,9,2,18,10,25,27,26,3,15,27,11,11,14,22,6,13,21,5,19,12,20,4) | 0x800800;
+ u32 plate = BITSWAP32(m_plate,31,30,29,24,0,16,8,1,23,17,9,2,18,10,25,27,26,3,15,27,11,11,14,22,6,13,21,5,19,12,20,4) | 0x800800;
display_matrix(29, 11, plate, m_grid);
}
@@ -2183,8 +2177,8 @@ public:
void cgalaxn_state::prepare_display()
{
- uint16_t grid = BITSWAP16(m_grid,15,14,13,12,1,2,0,11,10,9,8,7,6,5,4,3);
- uint16_t plate = BITSWAP16(m_plate,15,14,6,5,4,3,2,1,7,8,9,10,11,0,12,13);
+ u16 grid = BITSWAP16(m_grid,15,14,13,12,1,2,0,11,10,9,8,7,6,5,4,3);
+ u16 plate = BITSWAP16(m_plate,15,14,6,5,4,3,2,1,7,8,9,10,11,0,12,13);
display_matrix(15, 12, plate, grid);
}
@@ -2248,7 +2242,6 @@ INPUT_CHANGED_MEMBER(cgalaxn_state::player_switch)
prepare_display();
}
-
static MACHINE_CONFIG_START( cgalaxn, cgalaxn_state )
/* basic machine hardware */
@@ -2319,8 +2312,8 @@ WRITE8_MEMBER(cpacman_state::plate_w)
m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
// update display
- uint16_t grid = BITSWAP16(m_grid,15,14,13,12,11,0,1,2,3,4,5,6,7,8,9,10);
- uint32_t plate = BITSWAP32(m_plate,31,30,29,28,27,0,1,2,3,8,9,10,11,16,17,18,19,25,26,23,22,21,20,24,15,14,13,12,4,5,6,7);
+ u16 grid = BITSWAP16(m_grid,15,14,13,12,11,0,1,2,3,4,5,6,7,8,9,10);
+ u32 plate = BITSWAP32(m_plate,31,30,29,28,27,0,1,2,3,8,9,10,11,16,17,18,19,25,26,23,22,21,20,24,15,14,13,12,4,5,6,7);
display_matrix(27, 11, plate, grid);
}
@@ -2436,8 +2429,8 @@ WRITE8_MEMBER(cmspacmn_state::plate_w)
m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
// update display
- uint16_t grid = BITSWAP16(m_grid,15,14,13,11,10,9,8,7,6,5,4,3,2,1,0,1);
- uint64_t plate = BIT(m_plate,15)<<32 | BITSWAP32(m_plate,14,13,12,4,5,6,7,24,23,25,22,21,20,13,24,3,19,14,12,11,24,2,10,8,7,25,0,9,1,18,17,16) | 0x1004080;
+ u16 grid = BITSWAP16(m_grid,15,14,13,11,10,9,8,7,6,5,4,3,2,1,0,1);
+ u64 plate = BIT(m_plate,15)<<32 | BITSWAP32(m_plate,14,13,12,4,5,6,7,24,23,25,22,21,20,13,24,3,19,14,12,11,24,2,10,8,7,25,0,9,1,18,17,16) | 0x1004080;
display_matrix(33, 12, plate, grid);
}
@@ -2552,7 +2545,7 @@ void sag_state::prepare_display()
// grid 8-11 are 7segs
set_display_segmask(0xf00, 0x7f);
- uint8_t seg = BITSWAP8(m_plate,3,4,5,6,7,8,9,10);
+ u8 seg = BITSWAP8(m_plate,3,4,5,6,7,8,9,10);
for (int y = 8; y < 12; y++)
m_display_state[y] = (m_grid >> y & 1) ? seg : 0;
@@ -2682,8 +2675,8 @@ public:
void egalaxn2_state::prepare_display()
{
- uint16_t grid = BITSWAP16(m_grid,15,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14);
- uint32_t plate = BITSWAP24(m_plate,23,22,21,20,15,14,13,12,7,6,5,4,3,2,1,0,19,18,17,16,11,10,9,8);
+ u16 grid = BITSWAP16(m_grid,15,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14);
+ u32 plate = BITSWAP24(m_plate,23,22,21,20,15,14,13,12,7,6,5,4,3,2,1,0,19,18,17,16,11,10,9,8);
display_matrix(24, 15, plate, grid);
}
@@ -2865,7 +2858,7 @@ public:
DECLARE_WRITE8_MEMBER(plate_w);
DECLARE_WRITE16_MEMBER(grid_w);
- uint8_t m_cop_irq;
+ u8 m_cop_irq;
DECLARE_WRITE_LINE_MEMBER(speaker_w);
DECLARE_WRITE8_MEMBER(cop_irq_w);
DECLARE_READ8_MEMBER(cop_latch_r);
@@ -2882,8 +2875,8 @@ protected:
void eturtles_state::prepare_display()
{
- uint16_t grid = BITSWAP16(m_grid,15,1,14,13,12,11,10,9,8,7,6,5,4,3,2,0);
- uint32_t plate = BITSWAP32(m_plate,31,30,11,12,18,19,16,17,22,15,20,21,27,26,23,25,24,2,3,1,0,6,4,5,10,9,2,8,7,14,1,13);
+ u16 grid = BITSWAP16(m_grid,15,1,14,13,12,11,10,9,8,7,6,5,4,3,2,0);
+ u32 plate = BITSWAP32(m_plate,31,30,11,12,18,19,16,17,22,15,20,21,27,26,23,25,24,2,3,1,0,6,4,5,10,9,2,8,7,14,1,13);
display_matrix(30, 15, plate | (grid >> 5 & 8), grid); // grid 8 also forces plate 3 high
}
@@ -2902,7 +2895,7 @@ WRITE16_MEMBER(eturtles_state::grid_w)
m_d = data;
// D1-D6: input mux
- uint8_t inp_mux = data >> 1 & 0x3f;
+ u8 inp_mux = data >> 1 & 0x3f;
if (inp_mux != m_inp_mux)
{
m_inp_mux = inp_mux;
@@ -2917,7 +2910,7 @@ WRITE16_MEMBER(eturtles_state::grid_w)
void eturtles_state::update_int()
{
// INT0/1 on multiplexed inputs, and from COP D0
- uint8_t inp = read_inputs(6);
+ u8 inp = read_inputs(6);
set_interrupt(0, (inp & 1) | m_cop_irq);
set_interrupt(1, inp & 2);
}
@@ -2988,7 +2981,6 @@ INPUT_CHANGED_MEMBER(eturtles_state::input_changed)
update_int();
}
-
void eturtles_state::machine_start()
{
hh_hmcs40_state::machine_start();
@@ -3062,8 +3054,8 @@ public:
void estargte_state::prepare_display()
{
- uint16_t grid = BITSWAP16(m_grid,15,0,14,13,12,11,10,9,8,7,6,5,4,3,2,1);
- uint32_t plate = BITSWAP32(m_plate,31,30,29,15,17,19,21,23,25,27,26,24,3,22,20,18,16,14,12,10,8,6,4,2,0,1,3,5,7,9,11,13);
+ u16 grid = BITSWAP16(m_grid,15,0,14,13,12,11,10,9,8,7,6,5,4,3,2,1);
+ u32 plate = BITSWAP32(m_plate,31,30,29,15,17,19,21,23,25,27,26,24,3,22,20,18,16,14,12,10,8,6,4,2,0,1,3,5,7,9,11,13);
display_matrix(29, 14, plate, grid);
}
@@ -3179,8 +3171,8 @@ WRITE8_MEMBER(ghalien_state::plate_w)
m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
// update display
- uint16_t grid = BITSWAP16(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9);
- uint32_t plate = BITSWAP24(m_plate,23,22,21,20,14,12,10,8,9,13,15,2,0,1,3,11,7,5,4,6,19,17,16,18);
+ u16 grid = BITSWAP16(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9);
+ u32 plate = BITSWAP24(m_plate,23,22,21,20,14,12,10,8,9,13,15,2,0,1,3,11,7,5,4,6,19,17,16,18);
display_matrix(20, 10, plate, grid);
}
@@ -3298,8 +3290,8 @@ WRITE8_MEMBER(gckong_state::plate_w)
m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
// update display
- uint16_t grid = BITSWAP16(m_grid,15,14,13,12,11,0,1,2,3,4,5,6,7,8,9,10);
- uint32_t plate = BITSWAP32(m_plate,31,30,29,28,27,26,25,6,7,8,12,13,14,15,16,17,18,17,16,12,11,10,9,8,7,6,5,4,3,2,1,0) | 0x8000;
+ u16 grid = BITSWAP16(m_grid,15,14,13,12,11,0,1,2,3,4,5,6,7,8,9,10);
+ u32 plate = BITSWAP32(m_plate,31,30,29,28,27,26,25,6,7,8,12,13,14,15,16,17,18,17,16,12,11,10,9,8,7,6,5,4,3,2,1,0) | 0x8000;
display_matrix(32, 11, plate, grid);
}
@@ -3309,7 +3301,7 @@ WRITE16_MEMBER(gckong_state::grid_w)
m_speaker->level_w(data >> 2 & 1);
// D5-D8: input mux
- uint8_t inp_mux = data >> 5 & 0xf;
+ u8 inp_mux = data >> 5 & 0xf;
if (inp_mux != m_inp_mux)
{
m_inp_mux = inp_mux;
@@ -3360,7 +3352,6 @@ INPUT_CHANGED_MEMBER(gckong_state::input_changed)
update_int1();
}
-
static MACHINE_CONFIG_START( gckong, gckong_state )
/* basic machine hardware */
@@ -3422,7 +3413,7 @@ WRITE8_MEMBER(gdigdug_state::plate_w)
m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
// update display
- uint32_t plate = BITSWAP32(m_plate,30,31,0,1,2,3,4,5,6,7,20,21,22,27,26,25,28,29,24,23,15,14,13,12,8,9,10,11,19,18,17,16);
+ u32 plate = BITSWAP32(m_plate,30,31,0,1,2,3,4,5,6,7,20,21,22,27,26,25,28,29,24,23,15,14,13,12,8,9,10,11,19,18,17,16);
display_matrix(32, 9, plate, m_grid);
}
@@ -3432,7 +3423,7 @@ WRITE16_MEMBER(gdigdug_state::grid_w)
m_speaker->level_w(data >> 6 & 1);
// D11-D15: input mux
- uint8_t inp_mux = data >> 11 & 0x1f;
+ u8 inp_mux = data >> 11 & 0x1f;
if (inp_mux != m_inp_mux)
{
m_inp_mux = inp_mux;
@@ -3480,7 +3471,6 @@ INPUT_CHANGED_MEMBER(gdigdug_state::input_changed)
update_int1();
}
-
static MACHINE_CONFIG_START( gdigdug, gdigdug_state )
/* basic machine hardware */
@@ -3543,7 +3533,7 @@ public:
void mwcbaseb_state::prepare_display()
{
- uint8_t grid = BITSWAP8(m_grid,0,1,2,3,4,5,6,7);
+ u8 grid = BITSWAP8(m_grid,0,1,2,3,4,5,6,7);
display_matrix(16, 8, m_plate, grid);
}
@@ -3641,7 +3631,7 @@ static INPUT_PORTS_START( mwcbaseb )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("P1 1")
INPUT_PORTS_END
-static const int16_t mwcbaseb_speaker_levels[] = { 0, 0x3fff, -0x4000, 0, -0x4000, 0, -0x8000, -0x4000 };
+static const s16 mwcbaseb_speaker_levels[] = { 0, 0x3fff, -0x4000, 0, -0x4000, 0, -0x8000, -0x4000 };
static MACHINE_CONFIG_START( mwcbaseb, mwcbaseb_state )
@@ -3703,7 +3693,7 @@ WRITE8_MEMBER(pbqbert_state::plate_w)
m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
// update display
- uint32_t plate = BITSWAP32(m_plate,31,30,24,25,26,27,28,15,14,29,13,12,11,10,9,8,7,6,5,4,3,2,1,0,16,17,18,19,20,21,22,23) | 0x400000;
+ u32 plate = BITSWAP32(m_plate,31,30,24,25,26,27,28,15,14,29,13,12,11,10,9,8,7,6,5,4,3,2,1,0,16,17,18,19,20,21,22,23) | 0x400000;
display_matrix(30, 8, plate, m_grid);
}
@@ -3791,8 +3781,8 @@ public:
void kingman_state::prepare_display()
{
- uint16_t grid = BITSWAP16(m_grid,15,14,13,12,11,10,9,0,1,2,3,4,5,6,7,8);
- uint32_t plate = BITSWAP24(m_plate,23,6,7,5,4,3,2,1,0,13,12,20,19,18,17,16,10,11,9,8,14,15,13,12);
+ u16 grid = BITSWAP16(m_grid,15,14,13,12,11,10,9,0,1,2,3,4,5,6,7,8);
+ u32 plate = BITSWAP24(m_plate,23,6,7,5,4,3,2,1,0,13,12,20,19,18,17,16,10,11,9,8,14,15,13,12);
display_matrix(23, 9, plate, grid);
}
@@ -3810,7 +3800,7 @@ WRITE16_MEMBER(kingman_state::grid_w)
m_speaker->level_w(data >> 6 & 1);
// D12-D15: input mux
- uint8_t inp_mux = data >> 12 & 0xf;
+ u8 inp_mux = data >> 12 & 0xf;
if (inp_mux != m_inp_mux)
{
m_inp_mux = inp_mux;
@@ -3856,7 +3846,6 @@ INPUT_CHANGED_MEMBER(kingman_state::input_changed)
update_int0();
}
-
static MACHINE_CONFIG_START( kingman, kingman_state )
/* basic machine hardware */
@@ -3913,8 +3902,8 @@ public:
void tmtron_state::prepare_display()
{
- uint16_t grid = BITSWAP16(m_grid,15,14,13,12,11,10,1,2,3,4,5,6,7,8,9,0);
- uint32_t plate = BITSWAP24(m_plate,23,5,2,21,1,6,7,9,10,11,21,0,19,3,4,8,3,18,17,16,12,13,14,15);
+ u16 grid = BITSWAP16(m_grid,15,14,13,12,11,10,1,2,3,4,5,6,7,8,9,0);
+ u32 plate = BITSWAP24(m_plate,23,5,2,21,1,6,7,9,10,11,21,0,19,3,4,8,3,18,17,16,12,13,14,15);
display_matrix(23, 10, plate, grid);
}
@@ -3932,7 +3921,7 @@ WRITE16_MEMBER(tmtron_state::grid_w)
m_speaker->level_w(data >> 4 & 1);
// D12-D15: input mux
- uint8_t inp_mux = data >> 12 & 0xf;
+ u8 inp_mux = data >> 12 & 0xf;
if (inp_mux != m_inp_mux)
{
m_inp_mux = inp_mux;
@@ -3978,7 +3967,6 @@ INPUT_CHANGED_MEMBER(tmtron_state::input_changed)
update_int1();
}
-
static MACHINE_CONFIG_START( tmtron, tmtron_state )
/* basic machine hardware */
@@ -4040,7 +4028,7 @@ WRITE8_MEMBER(vinvader_state::plate_w)
m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
// update display
- uint16_t plate = BITSWAP16(m_plate,15,11,7,3,10,6,14,2,9,5,13,1,8,4,12,0);
+ u16 plate = BITSWAP16(m_plate,15,11,7,3,10,6,14,2,9,5,13,1,8,4,12,0);
display_matrix(12, 9, plate, m_grid);
}
diff --git a/src/mame/drivers/hh_melps4.cpp b/src/mame/drivers/hh_melps4.cpp
index 0e557ee6b58..f337c6def02 100644
--- a/src/mame/drivers/hh_melps4.cpp
+++ b/src/mame/drivers/hh_melps4.cpp
@@ -34,28 +34,28 @@ public:
optional_device<speaker_sound_device> m_speaker;
// misc common
- uint16_t m_inp_mux; // multiplexed inputs mask
+ u16 m_inp_mux; // multiplexed inputs mask
- uint8_t read_inputs(int columns);
+ u8 read_inputs(int columns);
DECLARE_INPUT_CHANGED_MEMBER(reset_button);
// display common
- int m_display_wait; // led/lamp off-delay in microseconds (default 33ms)
- int m_display_maxy; // display matrix number of rows
- int m_display_maxx; // display matrix number of columns (max 31 for now)
+ int m_display_wait; // led/lamp off-delay in microseconds (default 33ms)
+ int m_display_maxy; // display matrix number of rows
+ int m_display_maxx; // display matrix number of columns (max 31 for now)
- uint32_t m_grid; // VFD current row data
- uint32_t m_plate; // VFD current column data
+ u32 m_grid; // VFD current row data
+ u32 m_plate; // VFD current column data
- uint32_t m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
- uint16_t m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
- uint32_t m_display_cache[0x20]; // (internal use)
- uint8_t m_display_decay[0x20][0x20]; // (internal use)
+ u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
+ u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
+ u32 m_display_cache[0x20]; // (internal use)
+ u8 m_display_decay[0x20][0x20]; // (internal use)
TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
void display_update();
void set_display_size(int maxx, int maxy);
- void display_matrix(int maxx, int maxy, uint32_t setx, uint32_t sety, bool update = true);
+ void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true);
protected:
virtual void machine_start() override;
@@ -109,7 +109,7 @@ void hh_melps4_state::machine_reset()
void hh_melps4_state::display_update()
{
- uint32_t active_state[0x20];
+ u32 active_state[0x20];
for (int y = 0; y < m_display_maxy; y++)
{
@@ -122,7 +122,7 @@ void hh_melps4_state::display_update()
m_display_decay[y][x] = m_display_wait;
// determine active state
- uint32_t ds = (m_display_decay[y][x] != 0) ? 1 : 0;
+ u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0;
active_state[y] |= (ds << x);
}
}
@@ -177,12 +177,12 @@ void hh_melps4_state::set_display_size(int maxx, int maxy)
m_display_maxy = maxy;
}
-void hh_melps4_state::display_matrix(int maxx, int maxy, uint32_t setx, uint32_t sety, bool update)
+void hh_melps4_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update)
{
set_display_size(maxx, maxy);
// update current state
- uint32_t mask = (1 << maxx) - 1;
+ u32 mask = (1 << maxx) - 1;
for (int y = 0; y < maxy; y++)
m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0;
@@ -193,9 +193,9 @@ void hh_melps4_state::display_matrix(int maxx, int maxy, uint32_t setx, uint32_t
// generic input handlers
-uint8_t hh_melps4_state::read_inputs(int columns)
+u8 hh_melps4_state::read_inputs(int columns)
{
- uint8_t ret = 0;
+ u8 ret = 0;
// read selected input rows
for (int i = 0; i < columns; i++)
@@ -246,8 +246,8 @@ public:
void cfrogger_state::prepare_display()
{
- uint16_t grid = BITSWAP16(m_grid,15,14,13,12,0,1,2,3,4,5,6,7,8,9,10,11);
- uint16_t plate = BITSWAP16(m_plate,12,4,13,5,14,6,15,7,3,11,2,10,1,9,0,8);
+ u16 grid = BITSWAP16(m_grid,15,14,13,12,0,1,2,3,4,5,6,7,8,9,10,11);
+ u16 plate = BITSWAP16(m_plate,12,4,13,5,14,6,15,7,3,11,2,10,1,9,0,8);
display_matrix(16, 12, plate, grid);
}
@@ -362,8 +362,8 @@ public:
void gjungler_state::prepare_display()
{
- uint16_t grid = BITSWAP16(m_grid,15,14,13,12,11,10,9,8,7,6,5,4,3,2,0,1);
- uint32_t plate = BITSWAP24(m_plate,23,22,21,20,19,18,8,9,10,11,13,16,15,14,13,12,7,0,6,1,5,2,4,3) | 0x2000;
+ u16 grid = BITSWAP16(m_grid,15,14,13,12,11,10,9,8,7,6,5,4,3,2,0,1);
+ u32 plate = BITSWAP24(m_plate,23,22,21,20,19,18,8,9,10,11,13,16,15,14,13,12,7,0,6,1,5,2,4,3) | 0x2000;
display_matrix(18, 12, plate, grid);
}
diff --git a/src/mame/drivers/hh_pic16.cpp b/src/mame/drivers/hh_pic16.cpp
index c8b013ecd12..8d50186f349 100644
--- a/src/mame/drivers/hh_pic16.cpp
+++ b/src/mame/drivers/hh_pic16.cpp
@@ -50,23 +50,23 @@ public:
optional_device<speaker_sound_device> m_speaker;
// misc common
- uint8_t m_b; // MCU port B data
- uint8_t m_c; // MCU port C data
+ u8 m_b; // MCU port B data
+ u8 m_c; // MCU port C data
// display common
- int m_display_wait; // led/lamp off-delay in microseconds (default 33ms)
- int m_display_maxy; // display matrix number of rows
- int m_display_maxx; // display matrix number of columns (max 31 for now)
+ int m_display_wait; // led/lamp off-delay in microseconds (default 33ms)
+ int m_display_maxy; // display matrix number of rows
+ int m_display_maxx; // display matrix number of columns (max 31 for now)
- uint32_t m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
- uint16_t m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
- uint32_t m_display_cache[0x20]; // (internal use)
- uint8_t m_display_decay[0x20][0x20]; // (internal use)
+ u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
+ u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
+ u32 m_display_cache[0x20]; // (internal use)
+ u8 m_display_decay[0x20][0x20]; // (internal use)
TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
void display_update();
void set_display_size(int maxx, int maxy);
- void display_matrix(int maxx, int maxy, uint32_t setx, uint32_t sety, bool update = true);
+ void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true);
protected:
virtual void machine_start() override;
@@ -118,7 +118,7 @@ void hh_pic16_state::machine_reset()
void hh_pic16_state::display_update()
{
- uint32_t active_state[0x20];
+ u32 active_state[0x20];
for (int y = 0; y < m_display_maxy; y++)
{
@@ -131,7 +131,7 @@ void hh_pic16_state::display_update()
m_display_decay[y][x] = m_display_wait;
// determine active state
- uint32_t ds = (m_display_decay[y][x] != 0) ? 1 : 0;
+ u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0;
active_state[y] |= (ds << x);
}
}
@@ -186,12 +186,12 @@ void hh_pic16_state::set_display_size(int maxx, int maxy)
m_display_maxy = maxy;
}
-void hh_pic16_state::display_matrix(int maxx, int maxy, uint32_t setx, uint32_t sety, bool update)
+void hh_pic16_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update)
{
set_display_size(maxx, maxy);
// update current state
- uint32_t mask = (1 << maxx) - 1;
+ u32 mask = (1 << maxx) - 1;
for (int y = 0; y < maxy; y++)
m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0;
@@ -258,7 +258,7 @@ static INPUT_PORTS_START( maniac )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) // upper-left
INPUT_PORTS_END
-static const int16_t maniac_speaker_levels[] = { 0, 0x7fff, -0x8000, 0 };
+static const s16 maniac_speaker_levels[] = { 0, 0x7fff, -0x8000, 0 };
static MACHINE_CONFIG_START( maniac, maniac_state )
diff --git a/src/mame/drivers/hh_sm510.cpp b/src/mame/drivers/hh_sm510.cpp
index 92fc2c56e06..a0edf5bc8b8 100644
--- a/src/mame/drivers/hh_sm510.cpp
+++ b/src/mame/drivers/hh_sm510.cpp
@@ -34,11 +34,11 @@ public:
optional_device<speaker_sound_device> m_speaker;
// misc common
- uint16_t m_inp_mux; // multiplexed inputs mask
- int m_inp_lines; // number of input mux columns
- uint8_t m_lcd_output_cache[0x100];
+ u16 m_inp_mux; // multiplexed inputs mask
+ int m_inp_lines; // number of input mux columns
+ u8 m_lcd_output_cache[0x100];
- uint8_t read_inputs(int columns);
+ u8 read_inputs(int columns);
virtual void update_k_line();
virtual DECLARE_INPUT_CHANGED_MEMBER(input_changed);
@@ -87,7 +87,7 @@ WRITE16_MEMBER(hh_sm510_state::lcd_segment_w)
for (int seg = 0; seg < 0x10; seg++)
{
int index = offset << 4 | seg;
- uint8_t state = data >> seg & 1;
+ u8 state = data >> seg & 1;
if (state != m_lcd_output_cache[index])
{
@@ -107,9 +107,9 @@ WRITE16_MEMBER(hh_sm510_state::lcd_segment_w)
// generic input handlers - usually S output is input mux, and K input for buttons
-uint8_t hh_sm510_state::read_inputs(int columns)
+u8 hh_sm510_state::read_inputs(int columns)
{
- uint8_t ret = 0;
+ u8 ret = 0;
// read selected input rows
for (int i = 0; i < columns; i++)
diff --git a/src/mame/drivers/hh_tms1k.cpp b/src/mame/drivers/hh_tms1k.cpp
index e14282582f9..b3ebab82e95 100644
--- a/src/mame/drivers/hh_tms1k.cpp
+++ b/src/mame/drivers/hh_tms1k.cpp
@@ -19,6 +19,7 @@
@CP0904A TMS0970 1977, Milton Bradley Comp IV
@MP0905B TMS0970 1977, Parker Brothers Codename Sector
*MP0057 TMS1000 1978, APH Student Speech+ (same ROM contents as TSI Speech+?)
+ @MP0154 TMS1000 1979, Fonas 2 Player Baseball
@MP0158 TMS1000 1979, Entex Soccer (6003)
@MP0163 TMS1000 1979, A-One LSI Match Number/LJN Electronic Concentration
@MP0168 TMS1000 1979, Conic Multisport/Tandy Sports Arena (model 60-2158)
@@ -80,7 +81,7 @@
@MP3476 TMS1100 1979, Milton Bradley Super Simon
MP3479 TMS1100 1980, MicroVision cartridge: Baseball
MP3481 TMS1100 1979, MicroVision cartridge: Connect Four
- *MP3491 TMS1100 1980, Mattel Horserace Analyzer
+ @MP3491 TMS1100 1979, Mattel Thoroughbred Horse Race Analyzer
MP3496 TMS1100 1980, MicroVision cartridge: Sea Duel
M34009 TMS1100 1981, MicroVision cartridge: Alien Raiders (note: MP3498, MP3499, M3400x..)
@M34012 TMS1100 1980, Mattel Dungeons & Dragons - Computer Labyrinth Game
@@ -122,6 +123,8 @@
brighter: tc4/h2hfootb(offense), bankshot(cue ball), ...
- stopthiep: unable to start a game (may be intentional?)
- tbreakup: some of the leds flicker (rom and PLAs doublechecked)
+ - 7in1ss: in 2-player mode, game select and skill select can be configured
+ after selecting a game?
- bship discrete sound, netlist is documented
- finish bshipb SN76477 sound
- improve elecbowl driver
@@ -130,6 +133,7 @@
#include "includes/hh_tms1k.h"
#include "machine/tms1024.h"
+#include "video/hlcd0515.h"
#include "sound/beep.h"
#include "sound/sn76477.h"
#include "sound/s14001a.h"
@@ -158,17 +162,19 @@
#include "ebball3.lh"
#include "ebaskb2.lh"
#include "efootb4.lh"
-#include "einvader.lh" // test-layout(but still playable)
+#include "einvader.lh"
#include "elecbowl.lh"
#include "elecdet.lh"
#include "esbattle.lh"
#include "esoccer.lh"
+#include "f2pbball.lh"
#include "fxmcr165.lh" // clickable
#include "gjackpot.lh"
#include "gpoker.lh"
#include "h2hbaseb.lh"
#include "h2hboxing.lh"
#include "h2hfootb.lh"
+#include "horseran.lh"
#include "lostreas.lh" // clickable
#include "matchnum.lh" // clickable
#include "mathmagi.lh"
@@ -250,7 +256,7 @@ void hh_tms1k_state::machine_reset()
void hh_tms1k_state::display_update()
{
- uint32_t active_state[0x20];
+ u32 active_state[0x20];
for (int y = 0; y < m_display_maxy; y++)
{
@@ -263,7 +269,7 @@ void hh_tms1k_state::display_update()
m_display_decay[y][x] = m_display_wait;
// determine active state
- uint32_t ds = (m_display_decay[y][x] != 0) ? 1 : 0;
+ u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0;
active_state[y] |= (ds << x);
}
}
@@ -325,7 +331,7 @@ void hh_tms1k_state::set_display_size(int maxx, int maxy)
m_display_maxy = maxy;
}
-void hh_tms1k_state::set_display_segmask(uint32_t digits, uint32_t mask)
+void hh_tms1k_state::set_display_segmask(u32 digits, u32 mask)
{
// set a segment mask per selected digit, but leave unselected ones alone
for (int i = 0; i < 0x20; i++)
@@ -336,12 +342,12 @@ void hh_tms1k_state::set_display_segmask(uint32_t digits, uint32_t mask)
}
}
-void hh_tms1k_state::display_matrix(int maxx, int maxy, uint32_t setx, uint32_t sety, bool update)
+void hh_tms1k_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update)
{
set_display_size(maxx, maxy);
// update current state
- uint32_t mask = (1 << maxx) - 1;
+ u32 mask = (1 << maxx) - 1;
for (int y = 0; y < maxy; y++)
m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0;
@@ -352,9 +358,9 @@ void hh_tms1k_state::display_matrix(int maxx, int maxy, uint32_t setx, uint32_t
// generic input handlers
-uint8_t hh_tms1k_state::read_inputs(int columns)
+u8 hh_tms1k_state::read_inputs(int columns)
{
- uint8_t ret = 0;
+ u8 ret = 0;
// read selected input rows
for (int i = 0; i < columns; i++)
@@ -364,10 +370,10 @@ uint8_t hh_tms1k_state::read_inputs(int columns)
return ret;
}
-uint8_t hh_tms1k_state::read_rotated_inputs(int columns, uint8_t rowmask)
+u8 hh_tms1k_state::read_rotated_inputs(int columns, u8 rowmask)
{
- uint8_t ret = 0;
- uint16_t colmask = (1 << columns) - 1;
+ u8 ret = 0;
+ u16 colmask = (1 << columns) - 1;
// read selected input columns
for (int i = 0; i < 8; i++)
@@ -510,12 +516,12 @@ static INPUT_PORTS_START( matchnum )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("Square 1")
INPUT_PORTS_END
-static const int16_t matchnum_speaker_levels[4] = { 0, 0x7fff, -0x8000, 0 };
+static const s16 matchnum_speaker_levels[4] = { 0, 0x7fff, -0x8000, 0 };
static MACHINE_CONFIG_START( matchnum, matchnum_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1000, 325000) // approximation - RC osc. R=47K, C=47pf
+ MCFG_CPU_ADD("maincpu", TMS1000, 325000) // approximation - RC osc. R=47K, C=47pF
MCFG_TMS1XXX_READ_K_CB(READ8(matchnum_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(matchnum_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(matchnum_state, write_o))
@@ -656,7 +662,7 @@ static INPUT_PORTS_START( mathmagi )
INPUT_PORTS_END
// output PLA is not decapped
-static const uint16_t mathmagi_output_pla[0x20] =
+static const u16 mathmagi_output_pla[0x20] =
{
lA+lB+lC+lD+lE+lF, // 0
lB+lC, // 1
@@ -695,7 +701,7 @@ static const uint16_t mathmagi_output_pla[0x20] =
static MACHINE_CONFIG_START( mathmagi, mathmagi_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1100, 175000) // approximation - RC osc. R=68K, C=82pf
+ MCFG_CPU_ADD("maincpu", TMS1100, 175000) // approximation - RC osc. R=68K, C=82pF
MCFG_TMS1XXX_OUTPUT_PLA(mathmagi_output_pla)
MCFG_TMS1XXX_READ_K_CB(READ8(mathmagi_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(mathmagi_state, write_r))
@@ -801,7 +807,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( bcheetah, bcheetah_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1000, 100000) // approximation - RC osc. R=47K, C=47pf
+ MCFG_CPU_ADD("maincpu", TMS1000, 100000) // approximation - RC osc. R=47K, C=47pF
MCFG_TMS1XXX_READ_K_CB(READ8(bcheetah_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(bcheetah_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(bcheetah_state, write_o))
@@ -873,7 +879,7 @@ WRITE16_MEMBER(amaztron_state::write_o)
READ8_MEMBER(amaztron_state::read_k)
{
// K: multiplexed inputs
- uint8_t k = read_inputs(6);
+ u8 k = read_inputs(6);
// the 5th column is tied to K4+K8
if (k & 0x10) k |= 0xc;
@@ -928,7 +934,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( amaztron, amaztron_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1100, 300000) // approximation - RC osc. R=33K?, C=100pf
+ MCFG_CPU_ADD("maincpu", TMS1100, 300000) // approximation - RC osc. R=33K?, C=100pF
MCFG_TMS1XXX_READ_K_CB(READ8(amaztron_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(amaztron_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(amaztron_state, write_o))
@@ -1066,7 +1072,7 @@ static INPUT_PORTS_START( zodiac )
INPUT_PORTS_END
// output PLA is not decapped
-static const uint16_t zodiac_output_pla[0x20] =
+static const u16 zodiac_output_pla[0x20] =
{
0x80, // empty/led 1/7
lC, // i/led 2/8
@@ -1105,7 +1111,7 @@ static const uint16_t zodiac_output_pla[0x20] =
static MACHINE_CONFIG_START( zodiac, zodiac_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1100, 500000) // approximation - RC osc. R=18K, C=100pf
+ MCFG_CPU_ADD("maincpu", TMS1100, 500000) // approximation - RC osc. R=18K, C=100pF
MCFG_TMS1XXX_OUTPUT_PLA(zodiac_output_pla)
MCFG_TMS1XXX_READ_K_CB(READ8(zodiac_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(zodiac_state, write_r))
@@ -1154,7 +1160,7 @@ public:
void cqback_state::prepare_display()
{
// R9 selects between segments B/C or A'/D'
- uint16_t seg = m_o;
+ u16 seg = m_o;
if (m_r & 0x200)
seg = (m_o << 7 & 0x300) | (m_o & 0xf9);
@@ -1221,7 +1227,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( cqback, cqback_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1100, 310000) // approximation - RC osc. R=33K, C=100pf
+ MCFG_CPU_ADD("maincpu", TMS1100, 310000) // approximation - RC osc. R=33K, C=100pF
MCFG_TMS1XXX_READ_K_CB(READ8(cqback_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(cqback_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(cqback_state, write_o))
@@ -1339,7 +1345,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( h2hfootb, h2hfootb_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1100, 310000) // approximation - RC osc. R=39K, C=100pf
+ MCFG_CPU_ADD("maincpu", TMS1100, 310000) // approximation - RC osc. R=39K, C=100pF
MCFG_TMS1XXX_READ_K_CB(READ8(h2hfootb_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(h2hfootb_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(h2hfootb_state, write_o))
@@ -1462,10 +1468,9 @@ INPUT_CHANGED_MEMBER(h2hbaseb_state::skill_switch)
set_clock();
}
-
void h2hbaseb_state::set_clock()
{
- // MCU clock is from an RC circuit with C=47pf, and R value is depending on
+ // MCU clock is from an RC circuit with C=47pF, and R value is depending on
// skill switch: R=51K(1) or 43K(2)
m_maincpu->set_unscaled_clock((m_inp_matrix[5]->read() & 1) ? 400000 : 350000);
}
@@ -1591,7 +1596,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( h2hboxing, h2hboxing_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1100, 350000) // approximation - RC osc. R=39K, C=100pf
+ MCFG_CPU_ADD("maincpu", TMS1100, 350000) // approximation - RC osc. R=39K, C=100pF
MCFG_TMS1XXX_READ_K_CB(READ8(h2hboxing_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(h2hboxing_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(h2hboxing_state, write_o))
@@ -1744,7 +1749,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( tc4, tc4_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1400, 450000) // approximation - RC osc. R=27.3K, C=100pf
+ MCFG_CPU_ADD("maincpu", TMS1400, 450000) // approximation - RC osc. R=27.3K, C=100pF
MCFG_TMS1XXX_READ_K_CB(READ8(tc4_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(tc4_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(tc4_state, write_o))
@@ -1853,7 +1858,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( cnbaskb, cnbaskb_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1000, 400000) // approximation - RC osc. R=39K, C=47pf
+ MCFG_CPU_ADD("maincpu", TMS1000, 400000) // approximation - RC osc. R=39K, C=47pF
MCFG_TMS1XXX_READ_K_CB(READ8(cnbaskb_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(cnbaskb_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(cnbaskb_state, write_o))
@@ -1966,7 +1971,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( cmsport, cmsport_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1000, 375000) // approximation - RC osc. R=47K, C=47pf
+ MCFG_CPU_ADD("maincpu", TMS1000, 375000) // approximation - RC osc. R=47K, C=47pF
MCFG_TMS1XXX_READ_K_CB(READ8(cmsport_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(cmsport_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(cmsport_state, write_o))
@@ -2087,12 +2092,12 @@ static INPUT_PORTS_START( cnfball )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY
INPUT_PORTS_END
-static const int16_t cnfball_speaker_levels[4] = { 0, 0x7fff, -0x8000, 0 };
+static const s16 cnfball_speaker_levels[4] = { 0, 0x7fff, -0x8000, 0 };
static MACHINE_CONFIG_START( cnfball, cnfball_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1000, 400000) // approximation - RC osc. R=39K, C=47pf
+ MCFG_CPU_ADD("maincpu", TMS1000, 400000) // approximation - RC osc. R=39K, C=47pF
MCFG_TMS1XXX_READ_K_CB(READ8(cnfball_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(cnfball_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(cnfball_state, write_o))
@@ -2143,7 +2148,7 @@ public:
void cnfball2_state::prepare_display()
{
// R1 selects between segments B/C or A'/D'
- uint16_t seg = m_o;
+ u16 seg = m_o;
if (~m_r & 2)
seg = (m_o << 7 & 0x300) | (m_o & 0xf9);
@@ -2205,7 +2210,7 @@ static INPUT_PORTS_START( cnfball2 )
INPUT_PORTS_END
// output PLA is not decapped
-static const uint16_t cnfball2_output_pla[0x20] =
+static const u16 cnfball2_output_pla[0x20] =
{
// first half was dumped electronically
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x40, 0x01, 0x08, 0x02, 0x04, 0x00,
@@ -2218,7 +2223,7 @@ static const uint16_t cnfball2_output_pla[0x20] =
static MACHINE_CONFIG_START( cnfball2, cnfball2_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1100, 375000) // approximation - RC osc. R=47K, C=47pf
+ MCFG_CPU_ADD("maincpu", TMS1100, 375000) // approximation - RC osc. R=47K, C=47pF
MCFG_TMS1XXX_OUTPUT_PLA(cnfball2_output_pla)
MCFG_TMS1XXX_READ_K_CB(READ8(cnfball2_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(cnfball2_state, write_r))
@@ -2324,7 +2329,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( esoccer, esoccer_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1000, 350000) // approximation - RC osc. R=47K, C=33pf
+ MCFG_CPU_ADD("maincpu", TMS1000, 350000) // approximation - RC osc. R=47K, C=33pF
MCFG_TMS1XXX_READ_K_CB(READ8(esoccer_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(esoccer_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(esoccer_state, write_o))
@@ -2458,7 +2463,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( ebball, ebball_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1000, 375000) // approximation - RC osc. R=43K, C=47pf
+ MCFG_CPU_ADD("maincpu", TMS1000, 375000) // approximation - RC osc. R=43K, C=47pF
MCFG_TMS1XXX_READ_K_CB(READ8(ebball_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(ebball_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(ebball_state, write_o))
@@ -2581,7 +2586,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( ebball2, ebball2_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1000, 350000) // approximation - RC osc. R=47K, C=47pf
+ MCFG_CPU_ADD("maincpu", TMS1000, 350000) // approximation - RC osc. R=47K, C=47pF
MCFG_TMS1XXX_READ_K_CB(READ8(ebball2_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(ebball2_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(ebball2_state, write_o))
@@ -2744,10 +2749,9 @@ INPUT_CHANGED_MEMBER(ebball3_state::skill_switch)
set_clock();
}
-
void ebball3_state::set_clock()
{
- // MCU clock is from an RC circuit(R=47K, C=33pf) oscillating by default at ~340kHz,
+ // MCU clock is from an RC circuit(R=47K, C=33pF) oscillating by default at ~340kHz,
// but on PRO, the difficulty switch adds an extra 150K resistor to Vdd to speed
// it up to around ~440kHz.
m_maincpu->set_unscaled_clock((m_inp_matrix[3]->read() & 1) ? 440000 : 340000);
@@ -2873,7 +2877,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( esbattle, esbattle_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1000, 425000) // approximation - RC osc. R=47K, C=33pf
+ MCFG_CPU_ADD("maincpu", TMS1000, 425000) // approximation - RC osc. R=47K, C=33pF
MCFG_TMS1XXX_READ_K_CB(READ8(esbattle_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(esbattle_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(esbattle_state, write_o))
@@ -2901,8 +2905,6 @@ MACHINE_CONFIG_END
TMS1100, the second more widespread release runs on a COP400. There are
also differences with the overlay mask.
- NOTE!: MAME external artwork is required
-
***************************************************************************/
class einvader_state : public hh_tms1k_state
@@ -2967,10 +2969,9 @@ INPUT_CHANGED_MEMBER(einvader_state::skill_switch)
set_clock();
}
-
void einvader_state::set_clock()
{
- // MCU clock is from an RC circuit(R=47K, C=56pf) oscillating by default at ~320kHz,
+ // MCU clock is from an RC circuit(R=47K, C=56pF) oscillating by default at ~320kHz,
// but on PRO, the difficulty switch adds an extra 180K resistor to Vdd to speed
// it up to around ~400kHz.
m_maincpu->set_unscaled_clock((m_inp_matrix[0]->read() & 8) ? 400000 : 320000);
@@ -2990,6 +2991,11 @@ static MACHINE_CONFIG_START( einvader, einvader_state )
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(einvader_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(einvader_state, write_o))
+ /* video hardware */
+ MCFG_SCREEN_SVG_ADD("screen", "svg")
+ MCFG_SCREEN_REFRESH_RATE(50)
+ MCFG_SCREEN_SIZE(939, 1080)
+ MCFG_SCREEN_VISIBLE_AREA(0, 939-1, 0, 1080-1)
MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_einvader)
@@ -3100,7 +3106,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( efootb4, efootb4_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1670, 475000) // approximation - RC osc. R=42K, C=47pf
+ MCFG_CPU_ADD("maincpu", TMS1670, 475000) // approximation - RC osc. R=42K, C=47pF
MCFG_TMS1XXX_READ_K_CB(READ8(efootb4_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(efootb4_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(efootb4_state, write_o))
@@ -3221,7 +3227,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( ebaskb2, ebaskb2_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1100, 360000) // approximation - RC osc. R=33K, C=82pf
+ MCFG_CPU_ADD("maincpu", TMS1100, 360000) // approximation - RC osc. R=33K, C=82pF
MCFG_TMS1XXX_READ_K_CB(READ8(ebaskb2_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(ebaskb2_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(ebaskb2_state, write_o))
@@ -3258,6 +3264,8 @@ MACHINE_CONFIG_END
8 = 4.2 18 = 7.3 28 = 8.4 38 = 8.2
9 = 4.3 19 = - 29 = 9.4 39 = 8.3
+ NOTE!: MAME external artwork is required
+
***************************************************************************/
class raisedvl_state : public hh_tms1k_state
@@ -3338,15 +3346,14 @@ INPUT_CHANGED_MEMBER(raisedvl_state::skill_switch)
set_clock();
}
-
void raisedvl_state::set_clock()
{
- // MCU clock is from an RC circuit with C=47pf, R=47K by default. Skills
+ // MCU clock is from an RC circuit with C=47pF, R=47K by default. Skills
// 2 and 3 add a 150K resistor in parallel, and skill 4 adds a 100K one.
// 0: R=47K -> ~350kHz
// 2,3: R=35K8 -> ~425kHz (combined)
// 4: R=32K -> ~465kHz (combined)
- uint8_t inp = m_inp_matrix[1]->read();
+ u8 inp = m_inp_matrix[1]->read();
m_maincpu->set_unscaled_clock((inp & 0x20) ? 465000 : ((inp & 0x10) ? 425000 : 350000));
}
@@ -3379,6 +3386,137 @@ MACHINE_CONFIG_END
/***************************************************************************
+ Fonas 2 Player Baseball
+ * TMS1000NLL MP0154 (die label 1000B, MP0154)
+ * 4 7seg LEDs, 37 other LEDs, 1-bit sound
+
+ known releases:
+ - World: 2 Player Baseball
+ - USA: 2 Player Baseball, distributed by Sears
+ - Canada: 2 Player Baseball, distributed by Talbot Electronics
+
+ led translation table: led zz from game PCB = MAME y.x:
+
+ 0 = - 10 = 2.2 20 = 4.0 30 = 4.4
+ 1 = 2.3 11 = 3.3 21 = 2.7 31 = 3.7
+ 2 = 0.4 12 = 1.2 22 = 0.0 32 = 4.3
+ 3 = 3.2 13 = 2.4 23 = 4.1 33 = 4.6
+ 4 = 0.5 14 = 1.0 24 = 3.1 34 = 3.5
+ 5 = 0.3 15 = 2.1 25 = 0.2 35 = 4.5
+ 6 = 3.4 16 = 1.1 26 = 0.1
+ 7 = 1.3 17 = 4.7 27 = 4.2
+ 8 = 1.4 18 = 2.0 28 = 3.0
+ 9 = 1.7 19 = 0.7 29 = 1.5
+
+***************************************************************************/
+
+class f2pbball_state : public hh_tms1k_state
+{
+public:
+ f2pbball_state(const machine_config &mconfig, device_type type, const char *tag)
+ : hh_tms1k_state(mconfig, type, tag)
+ { }
+
+ void prepare_display();
+ DECLARE_WRITE16_MEMBER(write_r);
+ DECLARE_WRITE16_MEMBER(write_o);
+ DECLARE_READ8_MEMBER(read_k);
+
+ DECLARE_INPUT_CHANGED_MEMBER(reset_button);
+};
+
+// handlers
+
+void f2pbball_state::prepare_display()
+{
+ // R5-R8 are 7segs
+ set_display_segmask(0x1e0, 0x7f);
+ display_matrix(8, 9, m_o, m_r);
+}
+
+WRITE16_MEMBER(f2pbball_state::write_r)
+{
+ // R4,R9,R10: input mux
+ m_inp_mux = (data >> 4 & 1) | (data >> 8 & 6);
+
+ // R9,R10(ANDed together): speaker out
+ m_speaker->level_w(data >> 10 & data >> 9 & 1);
+
+ // R0-R8: led select
+ m_r = data;
+ prepare_display();
+}
+
+WRITE16_MEMBER(f2pbball_state::write_o)
+{
+ // O0-O7: led state
+ m_o = BITSWAP8(data,0,7,6,5,4,3,2,1);
+ prepare_display();
+}
+
+READ8_MEMBER(f2pbball_state::read_k)
+{
+ // K: multiplexed inputs
+ return read_inputs(3);
+}
+
+
+// config
+
+static INPUT_PORTS_START( f2pbball )
+ PORT_START("IN.0") // R4
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Pick Off")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_CONFNAME( 0x0c, 0x04, "Players" )
+ PORT_CONFSETTING( 0x04, "1" )
+ PORT_CONFSETTING( 0x00, "Practice" )
+ PORT_CONFSETTING( 0x08, "2" )
+
+ PORT_START("IN.1") // R9
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("P1 Score")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Steal")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Pitch")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Swing")
+
+ PORT_START("IN.2") // R10
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_COCKTAIL PORT_NAME("P2 Curve Left")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Slow")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Curve Right")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_COCKTAIL PORT_NAME("P2 Fast")
+
+ PORT_START("RESET")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("P1 Reset") PORT_CHANGED_MEMBER(DEVICE_SELF, f2pbball_state, reset_button, 0)
+INPUT_PORTS_END
+
+INPUT_CHANGED_MEMBER(f2pbball_state::reset_button)
+{
+ // reset button is directly wired to TMS1000 INIT pin
+ m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
+}
+
+static MACHINE_CONFIG_START( f2pbball, f2pbball_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", TMS1000, 325000) // approximation - RC osc. R=51K, C=39pF
+ MCFG_TMS1XXX_READ_K_CB(READ8(f2pbball_state, read_k))
+ MCFG_TMS1XXX_WRITE_R_CB(WRITE16(f2pbball_state, write_r))
+ MCFG_TMS1XXX_WRITE_O_CB(WRITE16(f2pbball_state, write_o))
+
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_tms1k_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_DEFAULT_LAYOUT(layout_f2pbball)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+MACHINE_CONFIG_END
+
+
+
+
+
+/***************************************************************************
+
Gakken Poker
* PCB label POKER. gakken
* TMS1370 MP2105 (die label same)
@@ -3503,7 +3641,7 @@ void gpoker_state::machine_reset()
static MACHINE_CONFIG_START( gpoker, gpoker_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1370, 350000) // approximation - RC osc. R=47K, C=47pf
+ MCFG_CPU_ADD("maincpu", TMS1370, 350000) // approximation - RC osc. R=47K, C=47pF
MCFG_TMS1XXX_READ_K_CB(READ8(gpoker_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(gpoker_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(gpoker_state, write_o))
@@ -3616,7 +3754,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( gjackpot, gjackpot_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1670, 450000) // approximation - RC osc. R=47K, C=47pf
+ MCFG_CPU_ADD("maincpu", TMS1670, 450000) // approximation - RC osc. R=47K, C=47pF
MCFG_TMS1XXX_READ_K_CB(READ8(gpoker_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(gjackpot_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(gpoker_state, write_o))
@@ -3665,8 +3803,8 @@ public:
void ginv1000_state::prepare_display()
{
- uint16_t grid = BITSWAP16(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,9,8,7);
- uint16_t plate = BITSWAP16(m_plate,15,14,13,12,3,4,7,8,9,10,11,2,6,5,1,0);
+ u16 grid = BITSWAP16(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,9,8,7);
+ u16 plate = BITSWAP16(m_plate,15,14,13,12,3,4,7,8,9,10,11,2,6,5,1,0);
display_matrix(12, 10, plate, grid);
}
@@ -3677,7 +3815,7 @@ WRITE16_MEMBER(ginv1000_state::write_r)
// R8,R15: input mux
m_inp_mux = (data >> 8 & 1) | (data >> 14 & 2);
-
+
// R1-R10: VFD matrix grid
// R11-R14: VFD matrix plate
m_grid = data >> 1 & 0x3ff;
@@ -3721,7 +3859,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( ginv1000, ginv1000_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1370, 325000) // approximation
+ MCFG_CPU_ADD("maincpu", TMS1370, 340000) // approximation
MCFG_TMS1XXX_READ_K_CB(READ8(ginv1000_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(ginv1000_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(ginv1000_state, write_o))
@@ -3987,7 +4125,7 @@ static INPUT_PORTS_START( elecdet )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, (void *)false)
INPUT_PORTS_END
-static const int16_t elecdet_speaker_levels[4] = { 0, 0x3fff, 0x3fff, 0x7fff };
+static const s16 elecdet_speaker_levels[4] = { 0, 0x3fff, 0x3fff, 0x7fff };
static MACHINE_CONFIG_START( elecdet, elecdet_state )
@@ -4120,7 +4258,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( starwbc, starwbc_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1100, 325000) // approximation - RC osc. R=51K, C=47pf
+ MCFG_CPU_ADD("maincpu", TMS1100, 325000) // approximation - RC osc. R=51K, C=47pF
MCFG_TMS1XXX_READ_K_CB(READ8(starwbc_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(starwbc_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(starwbc_state, write_o))
@@ -4247,7 +4385,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( astro, astro_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1470, 450000) // approximation - RC osc. R=4.7K, C=33pf
+ MCFG_CPU_ADD("maincpu", TMS1470, 450000) // approximation - RC osc. R=4.7K, C=33pF
MCFG_TMS1XXX_READ_K_CB(READ8(astro_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(astro_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(astro_state, write_o))
@@ -4313,8 +4451,8 @@ void elecbowl_state::prepare_display()
}
// lamp muxes
- uint8_t mask = 1 << (m_o & 7);
- uint8_t d = (m_r & 2) ? mask : 0;
+ u8 mask = 1 << (m_o & 7);
+ u8 d = (m_r & 2) ? mask : 0;
if (~m_r & 1)
m_display_state[5] = (m_display_state[5] & ~mask) | d;
if (~m_r & 4)
@@ -4391,7 +4529,7 @@ static INPUT_PORTS_START( elecbowl )
INPUT_PORTS_END
// output PLA is not decapped
-static const uint16_t elecbowl_output_pla[0x20] =
+static const u16 elecbowl_output_pla[0x20] =
{
lA+lB+lC+lD+lE+lF, // 0
lB+lC, // 1
@@ -4412,7 +4550,7 @@ static const uint16_t elecbowl_output_pla[0x20] =
static MACHINE_CONFIG_START( elecbowl, elecbowl_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1100, 350000) // approximation - RC osc. R=33K, C=100pf
+ MCFG_CPU_ADD("maincpu", TMS1100, 350000) // approximation - RC osc. R=33K, C=100pF
MCFG_TMS1XXX_OUTPUT_PLA(elecbowl_output_pla)
MCFG_TMS1XXX_READ_K_CB(READ8(elecbowl_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(elecbowl_state, write_r))
@@ -4433,6 +4571,157 @@ MACHINE_CONFIG_END
/***************************************************************************
+ Mattel Thoroughbred Horse Race Analyzer
+ * PCB label 1670-4619D
+ * TMS1100NLL MP3491-N2 (die label 1100E MP3491)
+ * HLCD0569, 67-segment LCD panel, no sound
+
+ This handheld is not a toy, read the manual for more information. In short,
+ it is a device for prediciting the winning chance of a gambling horserace.
+
+ known releases:
+ - USA: Thoroughbred Horse Race Analyzer
+ - China/Canada: Thoroughbred Horse Race Analyzer, distributed in 1994 by
+ Advanced Handicapping Technologies, Inc.
+
+***************************************************************************/
+
+class horseran_state : public hh_tms1k_state
+{
+public:
+ horseran_state(const machine_config &mconfig, device_type type, const char *tag)
+ : hh_tms1k_state(mconfig, type, tag),
+ m_lcd(*this, "lcd")
+ { }
+
+ required_device<hlcd0569_device> m_lcd;
+
+ DECLARE_WRITE32_MEMBER(lcd_output_w);
+ DECLARE_WRITE16_MEMBER(write_r);
+ DECLARE_READ8_MEMBER(read_k);
+};
+
+// handlers
+
+WRITE32_MEMBER(horseran_state::lcd_output_w)
+{
+ // only 3 rows used
+ if (offset > 2)
+ return;
+
+ // output segments (lamp row*100 + col)
+ for (int i = 0; i < 24; i++)
+ output().set_lamp_value(offset*100 + i+1, data >> i & 1);
+
+ // col5-11 and col13-19 are 7segs
+ for (int i = 0; i < 2; i++)
+ output().set_digit_value(offset << 1 | i, BITSWAP8(data >> (4+8*i),7,3,5,2,0,1,4,6) & 0x7f);
+}
+
+WRITE16_MEMBER(horseran_state::write_r)
+{
+ // R0: HLCD0569 clock
+ // R1: HLCD0569 data in
+ // R2: HLCD0569 _CS
+ m_lcd->write_cs(data >> 2 & 1);
+ m_lcd->write_data(data >> 1 & 1);
+ m_lcd->write_clock(data & 1);
+
+ // R3-R10: input mux
+ m_inp_mux = data >> 3 & 0xff;
+}
+
+READ8_MEMBER(horseran_state::read_k)
+{
+ // K: multiplexed inputs
+ return read_inputs(8);
+}
+
+
+// config
+
+/* physical button layout and labels is like this:
+
+ [PURSE] [DIST.] [P. POSN.] [DAYS] [R.S.L.] [7] [8] [9]
+ [RACES] [WINS] [PLACES] [SHOWS] [EARNINGS] [4] [5] [6]
+ [DISTANCE] [L.E.B. 1st] [L.E.B. 2nd] [L.E.B. 3rd] [FIN. POSN.] [1] [2] [3]
+ [L.E.B. Fin] [SPD. RTG.] [SPD. RTG.] [ANALYZE] [NEXT] [C/H] [C/E] [0]
+
+ R.S.L. = Races Since (Last) Layoff
+ L.E.B. = Last Race / Lengths Back
+*/
+
+static INPUT_PORTS_START( horseran )
+ PORT_START("IN.0") // R3
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Next")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Final Position")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Earnings")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_NAME("R.S.L.")
+
+ PORT_START("IN.1") // R4
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("Analyze")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("L.E.B. 3rd")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("Shows")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_NAME("Days")
+
+ PORT_START("IN.2") // R5
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Speed Rating (right)")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("L.E.B. 2nd")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Places")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_NAME("Post Position")
+
+ PORT_START("IN.3") // R6
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Speed Rating (left)")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("L.E.B. 1st")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("Wins")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_NAME("Distance (L.E.B.)")
+
+ PORT_START("IN.4") // R7
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("L.E.B. Finish")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("Distance")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("Races")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_NAME("Purse")
+
+ PORT_START("IN.5") // R8
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("0")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("3")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("6")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("9")
+
+ PORT_START("IN.6") // R9
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("C/E") // Clear Entry
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("2")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("5")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("8")
+
+ PORT_START("IN.7") // R10
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("C/H") // Clear Horse Information
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("1")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("4")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("7")
+INPUT_PORTS_END
+
+static MACHINE_CONFIG_START( horseran, horseran_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", TMS1100, 300000) // approximation - RC osc. R=56K, C=47pF
+ MCFG_TMS1XXX_READ_K_CB(READ8(horseran_state, read_k))
+ MCFG_TMS1XXX_WRITE_R_CB(WRITE16(horseran_state, write_r))
+
+ /* video hardware */
+ MCFG_DEVICE_ADD("lcd", HLCD0569, 1100) // C=0.022uF
+ MCFG_HLCD0515_WRITE_COLS_CB(WRITE32(horseran_state, lcd_output_w))
+ MCFG_DEFAULT_LAYOUT(layout_horseran)
+
+ /* no sound! */
+MACHINE_CONFIG_END
+
+
+
+
+
+/***************************************************************************
+
Mattel Dungeons & Dragons - Computer Labyrinth Game
* TMS1100 M34012-N2LL (die label M34012)
* 72 buttons, no LEDs, 1-bit sound
@@ -4593,7 +4882,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( mdndclab, mdndclab_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1100, 475000) // approximation - RC osc. R=27K, C=100pf
+ MCFG_CPU_ADD("maincpu", TMS1100, 475000) // approximation - RC osc. R=27K, C=100pF
MCFG_TMS1XXX_READ_K_CB(READ8(mdndclab_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(mdndclab_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(mdndclab_state, write_o))
@@ -4663,7 +4952,6 @@ WRITE16_MEMBER(comp4_state::write_o)
// O0: leds common
// other bits: N/C
m_o = data;
- display_matrix(11, 1, m_r, m_o);
}
READ8_MEMBER(comp4_state::read_k)
@@ -4848,7 +5136,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( bship, bship_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1000, 200000) // approximation - RC osc. R=100K, C=47pf
+ MCFG_CPU_ADD("maincpu", TMS1000, 200000) // approximation - RC osc. R=100K, C=47pF
MCFG_TMS1XXX_READ_K_CB(READ8(bship_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(bship_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(bship_state, write_o))
@@ -4951,7 +5239,7 @@ READ8_MEMBER(bshipb_state::read_k)
static MACHINE_CONFIG_START( bshipb, bshipb_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1000, 200000) // approximation - RC osc. R=100K, C=47pf
+ MCFG_CPU_ADD("maincpu", TMS1000, 200000) // approximation - RC osc. R=100K, C=47pF
MCFG_TMS1XXX_READ_K_CB(READ8(bshipb_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(bshipb_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(bshipb_state, write_o))
@@ -5068,7 +5356,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( simon, simon_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1000, 350000) // approximation - RC osc. R=33K, C=100pf
+ MCFG_CPU_ADD("maincpu", TMS1000, 350000) // approximation - RC osc. R=33K, C=100pF
MCFG_TMS1XXX_READ_K_CB(READ8(simon_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(simon_state, write_r))
@@ -5190,14 +5478,13 @@ INPUT_CHANGED_MEMBER(ssimon_state::speed_switch)
set_clock();
}
-
void ssimon_state::set_clock()
{
- // MCU clock is from an RC circuit with C=100pf, R=x depending on speed switch:
+ // MCU clock is from an RC circuit with C=100pF, R=x depending on speed switch:
// 0 Simple: R=51K -> ~200kHz
// 1 Normal: R=37K -> ~275kHz
// 2 Super: R=22K -> ~400kHz
- uint8_t inp = m_inp_matrix[6]->read();
+ u8 inp = m_inp_matrix[6]->read();
m_maincpu->set_unscaled_clock((inp & 2) ? 400000 : ((inp & 1) ? 275000 : 200000));
}
@@ -5385,12 +5672,12 @@ void bigtrak_state::machine_start()
save_item(NAME(m_gearbox_pos));
}
-static const int16_t bigtrak_speaker_levels[8] = { 0, 0x7fff/3, 0x7fff/3, 0x7fff/3*2, 0x7fff/3, 0x7fff/3*2, 0x7fff/3*2, 0x7fff };
+static const s16 bigtrak_speaker_levels[8] = { 0, 0x7fff/3, 0x7fff/3, 0x7fff/3*2, 0x7fff/3, 0x7fff/3*2, 0x7fff/3*2, 0x7fff };
static MACHINE_CONFIG_START( bigtrak, bigtrak_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1000, 200000) // approximation - RC osc. R=83K, C=100pf
+ MCFG_CPU_ADD("maincpu", TMS1000, 200000) // approximation - RC osc. R=83K, C=100pF
MCFG_TMS1XXX_READ_K_CB(READ8(bigtrak_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(bigtrak_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(bigtrak_state, write_o))
@@ -5509,7 +5796,7 @@ void mbdtower_state::prepare_display()
// update current state
if (~m_r & 0x10)
{
- uint8_t o = BITSWAP8(m_o,7,0,4,3,2,1,6,5) & 0x7f;
+ u8 o = BITSWAP8(m_o,7,0,4,3,2,1,6,5) & 0x7f;
m_display_state[2] = (m_o & 0x80) ? o : 0;
m_display_state[1] = (m_o & 0x80) ? 0 : o;
m_display_state[0] = (m_r >> 8 & 1) | (m_r >> 4 & 0xe);
@@ -5623,7 +5910,7 @@ void mbdtower_state::machine_start()
static MACHINE_CONFIG_START( mbdtower, mbdtower_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1400, 425000) // approximation - RC osc. R=43K, C=56pf
+ MCFG_CPU_ADD("maincpu", TMS1400, 425000) // approximation - RC osc. R=43K, C=56pF
MCFG_TMS1XXX_READ_K_CB(READ8(mbdtower_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(mbdtower_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(mbdtower_state, write_o))
@@ -5715,28 +6002,28 @@ static INPUT_PORTS_START( cnsector )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("Range")
PORT_START("IN.1") // O1
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Aim")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("Right")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("Aim")
PORT_START("IN.2") // O2
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Fire")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Recall")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("Evasive Sub") // expert button
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("Recall")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("Fire")
PORT_START("IN.3") // O3
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Sub Finder") // expert button
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("Slower")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("Sub Finder") // expert button
PORT_START("IN.4") // O4
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Teach Mode")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Move Ship")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("Faster")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("Move Ship")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("Teach Mode")
INPUT_PORTS_END
static MACHINE_CONFIG_START( cnsector, cnsector_state )
@@ -5851,12 +6138,12 @@ static INPUT_PORTS_START( merlin )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("New Game")
INPUT_PORTS_END
-static const int16_t merlin_speaker_levels[8] = { 0, 0x7fff/3, 0x7fff/3, 0x7fff/3*2, 0x7fff/3, 0x7fff/3*2, 0x7fff/3*2, 0x7fff };
+static const s16 merlin_speaker_levels[8] = { 0, 0x7fff/3, 0x7fff/3, 0x7fff/3*2, 0x7fff/3, 0x7fff/3*2, 0x7fff/3*2, 0x7fff };
static MACHINE_CONFIG_START( merlin, merlin_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1100, 350000) // approximation - RC osc. R=33K, C=100pf
+ MCFG_CPU_ADD("maincpu", TMS1100, 350000) // approximation - RC osc. R=33K, C=100pF
MCFG_TMS1XXX_READ_K_CB(READ8(merlin_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(merlin_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(merlin_state, write_o))
@@ -5920,7 +6207,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( mmerlin, mmerlin_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1400, 425000) // approximation - RC osc. R=30K, C=100pf
+ MCFG_CPU_ADD("maincpu", TMS1400, 425000) // approximation - RC osc. R=30K, C=100pF
MCFG_TMS1XXX_READ_K_CB(READ8(mmerlin_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(mmerlin_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(mmerlin_state, write_o))
@@ -6030,7 +6317,7 @@ static INPUT_PORTS_START( stopthief )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Off") PORT_CHANGED_MEMBER(DEVICE_SELF, hh_tms1k_state, power_button, (void *)false)
INPUT_PORTS_END
-static const int16_t stopthief_speaker_levels[7] = { 0, 0x7fff/6, 0x7fff/5, 0x7fff/4, 0x7fff/3, 0x7fff/2, 0x7fff };
+static const s16 stopthief_speaker_levels[7] = { 0, 0x7fff/6, 0x7fff/5, 0x7fff/4, 0x7fff/3, 0x7fff/2, 0x7fff };
static MACHINE_CONFIG_START( stopthief, stopthief_state )
@@ -6144,7 +6431,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( bankshot, bankshot_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1400, 475000) // approximation - RC osc. R=24K, C=100pf
+ MCFG_CPU_ADD("maincpu", TMS1400, 475000) // approximation - RC osc. R=24K, C=100pF
MCFG_TMS1XXX_READ_K_CB(READ8(bankshot_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(bankshot_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(bankshot_state, write_o))
@@ -6255,7 +6542,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( splitsec, splitsec_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1400, 475000) // approximation - RC osc. R=24K, C=100pf
+ MCFG_CPU_ADD("maincpu", TMS1400, 475000) // approximation - RC osc. R=24K, C=100pF
MCFG_TMS1XXX_READ_K_CB(READ8(splitsec_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(splitsec_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(splitsec_state, write_o))
@@ -6364,7 +6651,7 @@ static INPUT_PORTS_START( lostreas )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("Up")
INPUT_PORTS_END
-static const int16_t lostreas_speaker_levels[16] =
+static const s16 lostreas_speaker_levels[16] =
{
0, 0x7fff/15, 0x7fff/14, 0x7fff/13, 0x7fff/12, 0x7fff/11, 0x7fff/10, 0x7fff/9,
0x7fff/8, 0x7fff/7, 0x7fff/6, 0x7fff/5, 0x7fff/4, 0x7fff/3, 0x7fff/2, 0x7fff/1
@@ -6373,7 +6660,7 @@ static const int16_t lostreas_speaker_levels[16] =
static MACHINE_CONFIG_START( lostreas, lostreas_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1100, 425000) // approximation - RC osc. R=39K, C=47pf
+ MCFG_CPU_ADD("maincpu", TMS1100, 425000) // approximation - RC osc. R=39K, C=47pF
MCFG_TMS1XXX_READ_K_CB(READ8(lostreas_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(lostreas_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(lostreas_state, write_o))
@@ -6422,8 +6709,8 @@ public:
void tcfball_state::prepare_display()
{
// R8 enables leds, R9 enables digits
- uint16_t mask = ((m_r >> 9 & 1) * 0x7f) | ((m_r >> 8 & 1) * 0x780);
- uint16_t sel = ((m_r & 0x7f) | (m_r << 7 & 0x780)) & mask;
+ u16 mask = ((m_r >> 9 & 1) * 0x7f) | ((m_r >> 8 & 1) * 0x780);
+ u16 sel = ((m_r & 0x7f) | (m_r << 7 & 0x780)) & mask;
set_display_segmask(0x77, 0x7f);
set_display_segmask(0x08, 0xff); // R3 has DP
@@ -6483,7 +6770,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( tcfball, tcfball_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1100, 375000) // approximation - RC osc. R=56K, C=24pf
+ MCFG_CPU_ADD("maincpu", TMS1100, 375000) // approximation - RC osc. R=56K, C=24pF
MCFG_TMS1XXX_READ_K_CB(READ8(tcfball_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(tcfball_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(tcfball_state, write_o))
@@ -6538,7 +6825,7 @@ static INPUT_PORTS_START( tcfballa )
INPUT_PORTS_END
// output PLA is not decapped, dumped electronically
-static const uint16_t tcfballa_output_pla[0x20] =
+static const u16 tcfballa_output_pla[0x20] =
{
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x00, 0x46, 0x70, 0x00, 0x00, 0x00,
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
@@ -6547,7 +6834,7 @@ static const uint16_t tcfballa_output_pla[0x20] =
static MACHINE_CONFIG_START( tcfballa, tcfballa_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1100, 375000) // approximation - RC osc. R=47K, C=50pf
+ MCFG_CPU_ADD("maincpu", TMS1100, 375000) // approximation - RC osc. R=47K, C=50pF
MCFG_TMS1XXX_OUTPUT_PLA(tcfballa_output_pla)
MCFG_TMS1XXX_READ_K_CB(READ8(tcfballa_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(tcfballa_state, write_r))
@@ -6696,7 +6983,7 @@ static INPUT_PORTS_START( tandy12 )
INPUT_PORTS_END
// output PLA is not decapped
-static const uint16_t tandy12_output_pla[0x20] =
+static const u16 tandy12_output_pla[0x20] =
{
// these are certain
0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40,
@@ -6711,7 +6998,7 @@ static const uint16_t tandy12_output_pla[0x20] =
static MACHINE_CONFIG_START( tandy12, tandy12_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1100, 400000) // approximation - RC osc. R=39K, C=47pf
+ MCFG_CPU_ADD("maincpu", TMS1100, 400000) // approximation - RC osc. R=39K, C=47pF
MCFG_TMS1XXX_OUTPUT_PLA(tandy12_output_pla)
MCFG_TMS1XXX_READ_K_CB(READ8(tandy12_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(tandy12_state, write_r))
@@ -6820,7 +7107,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( monkeysee, monkeysee_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1000, 250000) // approximation - RC osc. R=68K, C=47pf
+ MCFG_CPU_ADD("maincpu", TMS1000, 250000) // approximation - RC osc. R=68K, C=47pF
MCFG_TMS1XXX_READ_K_CB(READ8(monkeysee_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(monkeysee_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(monkeysee_state, write_o))
@@ -6969,7 +7256,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( speechp, speechp_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1000, 400000) // approximation - RC osc. R=39K, C=47pf
+ MCFG_CPU_ADD("maincpu", TMS1000, 400000) // approximation - RC osc. R=39K, C=47pF
MCFG_TMS1XXX_READ_K_CB(READ8(speechp_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(speechp_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(speechp_state, write_o))
@@ -7069,12 +7356,12 @@ static INPUT_PORTS_START( copycat )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
-static const int16_t copycat_speaker_levels[4] = { 0, 0x7fff, -0x8000, 0 };
+static const s16 copycat_speaker_levels[4] = { 0, 0x7fff, -0x8000, 0 };
static MACHINE_CONFIG_START( copycat, copycat_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1000, 320000) // approximation - RC osc. R=47K, C=47pf
+ MCFG_CPU_ADD("maincpu", TMS1000, 320000) // approximation - RC osc. R=47K, C=47pF
MCFG_TMS1XXX_READ_K_CB(READ8(copycat_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(copycat_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(copycat_state, write_o))
@@ -7150,7 +7437,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( copycatm2, copycatm2_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1730, 275000) // approximation - RC osc. R=100K, C=47pf
+ MCFG_CPU_ADD("maincpu", TMS1730, 275000) // approximation - RC osc. R=100K, C=47pF
MCFG_TMS1XXX_READ_K_CB(IOPORT("IN.0"))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(copycatm2_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(copycatm2_state, write_o))
@@ -7221,7 +7508,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( ditto, ditto_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1730, 275000) // approximation - RC osc. R=100K, C=47pf
+ MCFG_CPU_ADD("maincpu", TMS1730, 275000) // approximation - RC osc. R=100K, C=47pF
MCFG_TMS1XXX_READ_K_CB(IOPORT("IN.0"))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(ditto_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(ditto_state, write_o))
@@ -7336,7 +7623,7 @@ INPUT_PORTS_END
static MACHINE_CONFIG_START( ss7in1, ss7in1_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1400, 450000) // approximation - RC osc. R=47K, C=47pf
+ MCFG_CPU_ADD("maincpu", TMS1400, 450000) // approximation - RC osc. R=47K, C=47pF
MCFG_TMS1XXX_READ_K_CB(READ8(ss7in1_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(ss7in1_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(ss7in1_state, write_o))
@@ -7398,7 +7685,7 @@ public:
{ }
required_device<tms1024_device> m_expander;
- uint8_t m_exp_port[7];
+ u8 m_exp_port[7];
DECLARE_WRITE8_MEMBER(expander_w);
void prepare_display();
@@ -7504,7 +7791,6 @@ INPUT_CHANGED_MEMBER(tbreakup_state::skill_switch)
set_clock();
}
-
void tbreakup_state::set_clock()
{
// MCU clock is from an analog circuit with resistor of 73K, PRO2 adds 100K
@@ -7657,11 +7943,10 @@ INPUT_CHANGED_MEMBER(phpball_state::flipper_button)
output().set_lamp_value(90 + (int)(uintptr_t)param, newval);
}
-
static MACHINE_CONFIG_START( phpball, phpball_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1100, 375000) // approximation - RC osc. R=47K, C=47pf
+ MCFG_CPU_ADD("maincpu", TMS1100, 375000) // approximation - RC osc. R=47K, C=47pF
MCFG_TMS1XXX_READ_K_CB(READ8(phpball_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(phpball_state, write_r))
MCFG_TMS1XXX_WRITE_O_CB(WRITE16(phpball_state, write_o))
@@ -7787,7 +8072,7 @@ static INPUT_PORTS_START( ssports4 )
INPUT_PORTS_END
// output PLA is not decapped, dumped electronically
-static const uint16_t ssports4_output_pla[0x20] =
+static const u16 ssports4_output_pla[0x20] =
{
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40
@@ -7796,7 +8081,7 @@ static const uint16_t ssports4_output_pla[0x20] =
static MACHINE_CONFIG_START( ssports4, ssports4_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", TMS1100, 375000) // approximation - RC osc. R=47K, C=47pf
+ MCFG_CPU_ADD("maincpu", TMS1100, 375000) // approximation - RC osc. R=47K, C=47pF
MCFG_TMS1XXX_OUTPUT_PLA(ssports4_output_pla)
MCFG_TMS1XXX_READ_K_CB(READ8(ssports4_state, read_k))
MCFG_TMS1XXX_WRITE_R_CB(WRITE16(ssports4_state, write_r))
@@ -8038,6 +8323,9 @@ ROM_START( einvader )
ROM_LOAD( "tms1100_common2_micro.pla", 0, 867, CRC(7cc90264) SHA1(c6e1cf1ffb178061da9e31858514f7cd94e86990) )
ROM_REGION( 365, "maincpu:opla", 0 )
ROM_LOAD( "tms1100_einvader_output.pla", 0, 365, CRC(490158e1) SHA1(61cace1eb09244663de98d8fb04d9459b19668fd) )
+
+ ROM_REGION( 44398, "svg", 0)
+ ROM_LOAD( "einvader.svg", 0, 44398, CRC(48de88fd) SHA1(56a2b9c997a447277b45902ab542eda54e7d5a2f) ) // by hap, ver. 23 mar 2016
ROM_END
@@ -8074,6 +8362,17 @@ ROM_START( raisedvl )
ROM_END
+ROM_START( f2pbball )
+ ROM_REGION( 0x0400, "maincpu", 0 )
+ ROM_LOAD( "mp0154", 0x0000, 0x0400, CRC(c5b45ace) SHA1(b2de32e83ab447b22d6828f0081843f364040b01) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1000_common2_micro.pla", 0, 867, CRC(d33da3cf) SHA1(13c4ebbca227818db75e6db0d45b66ba5e207776) )
+ ROM_REGION( 365, "maincpu:opla", 0 )
+ ROM_LOAD( "tms1000_f2pbball_output.pla", 0, 365, CRC(30c2f28f) SHA1(db969b22475f37f083c3594f5e4f5759048377b8) )
+ROM_END
+
+
ROM_START( gpoker )
ROM_REGION( 0x0800, "maincpu", 0 )
ROM_LOAD( "mp2105", 0x0000, 0x0800, CRC(95a8f5b4) SHA1(d14f00ba9f57e437264d972baa14a14a28ff8719) )
@@ -8123,7 +8422,7 @@ ROM_END
ROM_START( elecdet )
ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "mp6100a", 0x0000, 0x1000, CRC(6f396bb8) SHA1(1f104d4ca9bee0d4572be4779b7551dfe20c4f04) )
+ ROM_LOAD( "mp6100a", 0x0000, 0x1000, CRC(9522fb2d) SHA1(240bdb44b7d67d3b13ebf75851635ac4b4ca2bfd) )
ROM_REGION( 1246, "maincpu:ipla", 0 )
ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
@@ -8179,6 +8478,17 @@ ROM_START( elecbowl )
ROM_END
+ROM_START( horseran )
+ ROM_REGION( 0x0800, "maincpu", 0 )
+ ROM_LOAD( "mp3491", 0x0000, 0x0800, CRC(a0081671) SHA1(a5a07b502c69d429e5bcd1d313e86b6ee057cda6) )
+
+ ROM_REGION( 867, "maincpu:mpla", 0 )
+ ROM_LOAD( "tms1100_common1_micro.pla", 0, 867, CRC(62445fc9) SHA1(d6297f2a4bc7a870b76cc498d19dbb0ce7d69fec) )
+ ROM_REGION( 365, "maincpu:opla", 0 ) // unused
+ ROM_LOAD( "tms1100_horseran_output.pla", 0, 365, CRC(0fea09b0) SHA1(27a56fcf2b490e9a7dbbc6ad48cc8aaca4cada94) )
+ROM_END
+
+
ROM_START( mdndclab )
ROM_REGION( 0x0800, "maincpu", 0 )
ROM_LOAD( "m34012", 0x0000, 0x0800, CRC(e851fccd) SHA1(158362c2821678a51554e02dbb2f9ef5aaf5f59f) )
@@ -8528,10 +8838,12 @@ CONS( 1979, ebball, 0, 0, ebball, ebball, driver_device, 0, "Ent
CONS( 1979, ebball2, 0, 0, ebball2, ebball2, driver_device, 0, "Entex", "Electronic Baseball 2 (Entex)", MACHINE_SUPPORTS_SAVE )
CONS( 1980, ebball3, 0, 0, ebball3, ebball3, driver_device, 0, "Entex", "Electronic Baseball 3 (Entex)", MACHINE_SUPPORTS_SAVE )
CONS( 1979, esbattle, 0, 0, esbattle, esbattle, driver_device, 0, "Entex", "Space Battle (Entex)", MACHINE_SUPPORTS_SAVE )
-CONS( 1980, einvader, 0, 0, einvader, einvader, driver_device, 0, "Entex", "Space Invader (Entex, TMS1100 version)", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
+CONS( 1980, einvader, 0, 0, einvader, einvader, driver_device, 0, "Entex", "Space Invader (Entex, TMS1100 version)", MACHINE_SUPPORTS_SAVE )
CONS( 1980, efootb4 , 0, 0, efootb4, efootb4, driver_device, 0, "Entex", "Color Football 4 (Entex)", MACHINE_SUPPORTS_SAVE )
CONS( 1980, ebaskb2 , 0, 0, ebaskb2, ebaskb2, driver_device, 0, "Entex", "Electronic Basketball 2 (Entex)", MACHINE_SUPPORTS_SAVE )
-CONS( 1980, raisedvl, 0, 0, raisedvl, raisedvl, driver_device, 0, "Entex", "Raise The Devil", MACHINE_SUPPORTS_SAVE )
+CONS( 1980, raisedvl, 0, 0, raisedvl, raisedvl, driver_device, 0, "Entex", "Raise The Devil", MACHINE_SUPPORTS_SAVE | MACHINE_REQUIRES_ARTWORK )
+
+CONS( 1979, f2pbball, 0, 0, f2pbball, f2pbball, driver_device, 0, "Fonas", "2 Player Baseball (Fonas)", MACHINE_SUPPORTS_SAVE )
CONS( 1979, gpoker, 0, 0, gpoker, gpoker, driver_device, 0, "Gakken", "Poker (Gakken, 1979 version)", MACHINE_SUPPORTS_SAVE )
CONS( 1980, gjackpot, 0, 0, gjackpot, gjackpot, driver_device, 0, "Gakken", "Jackpot: Gin Rummy & Black Jack", MACHINE_SUPPORTS_SAVE )
@@ -8547,6 +8859,7 @@ COMP( 1979, astro, 0, 0, astro, astro, driver_device, 0, "Kos
CONS( 1978, elecbowl, 0, 0, elecbowl, elecbowl, driver_device, 0, "Marx", "Electronic Bowling (Marx)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_MECHANICAL | MACHINE_NOT_WORKING ) // ***
+COMP( 1979, horseran, 0, 0, horseran, horseran, driver_device, 0, "Mattel", "Thoroughbred Horse Race Analyzer", MACHINE_SUPPORTS_SAVE | MACHINE_NO_SOUND_HW )
CONS( 1980, mdndclab, 0, 0, mdndclab, mdndclab, driver_device, 0, "Mattel", "Dungeons & Dragons - Computer Labyrinth Game", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // ***
CONS( 1977, comp4, 0, 0, comp4, comp4, driver_device, 0, "Milton Bradley", "Comp IV", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK | MACHINE_NO_SOUND_HW )
diff --git a/src/mame/drivers/hh_ucom4.cpp b/src/mame/drivers/hh_ucom4.cpp
index 7d96935a0e1..160bbde1f72 100644
--- a/src/mame/drivers/hh_ucom4.cpp
+++ b/src/mame/drivers/hh_ucom4.cpp
@@ -67,6 +67,7 @@ TODO:
***************************************************************************/
#include "includes/hh_ucom4.h"
+#include "video/hlcd0515.h"
// internal artwork
#include "efball.lh"
@@ -129,7 +130,7 @@ void hh_ucom4_state::machine_reset()
void hh_ucom4_state::display_update()
{
- uint32_t active_state[0x20];
+ u32 active_state[0x20];
for (int y = 0; y < m_display_maxy; y++)
{
@@ -142,7 +143,7 @@ void hh_ucom4_state::display_update()
m_display_decay[y][x] = m_display_wait;
// determine active state
- uint32_t ds = (m_display_decay[y][x] != 0) ? 1 : 0;
+ u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0;
active_state[y] |= (ds << x);
}
}
@@ -197,12 +198,12 @@ void hh_ucom4_state::set_display_size(int maxx, int maxy)
m_display_maxy = maxy;
}
-void hh_ucom4_state::display_matrix(int maxx, int maxy, uint32_t setx, uint32_t sety, bool update)
+void hh_ucom4_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update)
{
set_display_size(maxx, maxy);
// update current state
- uint32_t mask = (1 << maxx) - 1;
+ u32 mask = (1 << maxx) - 1;
for (int y = 0; y < maxy; y++)
m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0;
@@ -213,9 +214,9 @@ void hh_ucom4_state::display_matrix(int maxx, int maxy, uint32_t setx, uint32_t
// generic input handlers
-uint8_t hh_ucom4_state::read_inputs(int columns)
+u8 hh_ucom4_state::read_inputs(int columns)
{
- uint8_t ret = 0;
+ u8 ret = 0;
// read selected input rows
for (int i = 0; i < columns; i++)
@@ -294,8 +295,8 @@ public:
void ufombs_state::prepare_display()
{
- uint16_t grid = BITSWAP16(m_grid,15,14,13,12,11,10,9,3,2,1,0,4,5,6,7,8);
- uint16_t plate = BITSWAP16(m_plate,15,14,13,12,11,7,10,6,9,5,8,4,0,1,2,3);
+ u16 grid = BITSWAP16(m_grid,15,14,13,12,11,10,9,3,2,1,0,4,5,6,7,8);
+ u16 plate = BITSWAP16(m_plate,15,14,13,12,11,7,10,6,9,5,8,4,0,1,2,3);
display_matrix(10, 9, plate, grid);
}
@@ -339,7 +340,7 @@ static INPUT_PORTS_START( ufombs )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
-static const int16_t ufombs_speaker_levels[] = { 0, 0x7fff, -0x8000, 0 };
+static const s16 ufombs_speaker_levels[] = { 0, 0x7fff, -0x8000, 0 };
static MACHINE_CONFIG_START( ufombs, ufombs_state )
@@ -406,7 +407,7 @@ public:
void ssfball_state::prepare_display()
{
- uint32_t plate = BITSWAP24(m_plate,23,22,21,20,19,11,7,3,12,17,13,18,16,14,15,10,9,8,0,1,2,4,5,6);
+ u32 plate = BITSWAP24(m_plate,23,22,21,20,19,11,7,3,12,17,13,18,16,14,15,10,9,8,0,1,2,4,5,6);
display_matrix(16, 9, plate, m_grid);
}
@@ -485,7 +486,7 @@ static INPUT_PORTS_START( ssfball )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_16WAY
INPUT_PORTS_END
-static const int16_t ssfball_speaker_levels[] = { 0, 0x7fff, -0x8000, 0 };
+static const s16 ssfball_speaker_levels[] = { 0, 0x7fff, -0x8000, 0 };
static MACHINE_CONFIG_START( ssfball, ssfball_state )
@@ -550,7 +551,7 @@ public:
void bmsoccer_state::prepare_display()
{
- uint32_t plate = BITSWAP24(m_plate,23,22,21,20,19,11,7,3,12,17,13,18,16,14,15,8,4,0,9,5,1,10,6,2);
+ u32 plate = BITSWAP24(m_plate,23,22,21,20,19,11,7,3,12,17,13,18,16,14,15,8,4,0,9,5,1,10,6,2);
display_matrix(16, 9, plate, m_grid);
}
@@ -673,8 +674,8 @@ public:
void bmsafari_state::prepare_display()
{
- uint16_t grid = BITSWAP16(m_grid,15,14,13,12,11,10,9,0,1,2,3,4,5,6,7,8);
- uint16_t plate = BITSWAP16(m_plate,15,14,13,12,11,7,10,2,9,5,8,4,0,1,6,3);
+ u16 grid = BITSWAP16(m_grid,15,14,13,12,11,10,9,0,1,2,3,4,5,6,7,8);
+ u16 plate = BITSWAP16(m_plate,15,14,13,12,11,7,10,2,9,5,8,4,0,1,6,3);
display_matrix(10, 9, plate, grid);
}
@@ -783,7 +784,7 @@ public:
void splasfgt_state::prepare_display()
{
- uint32_t plate = BITSWAP24(m_plate,23,22,21,20,19,18,17,13,1,0,8,6,0,10,11,14,15,16,9,5,7,4,2,3);
+ u32 plate = BITSWAP24(m_plate,23,22,21,20,19,18,17,13,1,0,8,6,0,10,11,14,15,16,9,5,7,4,2,3);
display_matrix(16, 9, plate, m_grid);
}
@@ -871,7 +872,7 @@ static INPUT_PORTS_START( splasfgt )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
-static const int16_t splasfgt_speaker_levels[] = { 0, 0x7fff, -0x8000, 0 };
+static const s16 splasfgt_speaker_levels[] = { 0, 0x7fff, -0x8000, 0 };
static MACHINE_CONFIG_START( splasfgt, splasfgt_state )
@@ -935,8 +936,8 @@ public:
void bcclimbr_state::prepare_display()
{
- uint8_t grid = BITSWAP8(m_grid,7,6,0,1,2,3,4,5);
- uint32_t plate = BITSWAP24(m_plate,23,22,21,20,16,17,18,19,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
+ u8 grid = BITSWAP8(m_grid,7,6,0,1,2,3,4,5);
+ u32 plate = BITSWAP24(m_plate,23,22,21,20,16,17,18,19,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0);
display_matrix(20, 6, plate, grid);
}
@@ -1153,8 +1154,8 @@ public:
void invspace_state::prepare_display()
{
- uint16_t grid = BITSWAP16(m_grid,15,14,13,12,11,10,8,9,7,6,5,4,3,2,1,0);
- uint32_t plate = BITSWAP24(m_plate,23,22,21,20,19,9,14,13,8,15,11,10,7,11,3,2,6,10,1,5,9,0,4,8);
+ u16 grid = BITSWAP16(m_grid,15,14,13,12,11,10,8,9,7,6,5,4,3,2,1,0);
+ u32 plate = BITSWAP24(m_plate,23,22,21,20,19,9,14,13,8,15,11,10,7,11,3,2,6,10,1,5,9,0,4,8);
display_matrix(19, 9, plate, grid);
}
@@ -1257,7 +1258,7 @@ public:
void efball_state::prepare_display()
{
- uint16_t plate = BITSWAP16(m_plate,15,14,13,12,11,4,3,0,2,1,6,10,9,5,8,7);
+ u16 plate = BITSWAP16(m_plate,15,14,13,12,11,4,3,0,2,1,6,10,9,5,8,7);
display_matrix(11, 10, plate, m_grid);
}
@@ -1370,8 +1371,8 @@ public:
void galaxy2_state::prepare_display()
{
- uint16_t grid = BITSWAP16(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9);
- uint16_t plate = BITSWAP16(m_plate,15,3,2,6,1,5,4,0,11,10,7,12,14,13,8,9);
+ u16 grid = BITSWAP16(m_grid,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9);
+ u16 plate = BITSWAP16(m_plate,15,3,2,6,1,5,4,0,11,10,7,12,14,13,8,9);
display_matrix(15, 10, plate, grid);
}
@@ -1481,8 +1482,8 @@ public:
void astrocmd_state::prepare_display()
{
- uint16_t grid = BITSWAP16(m_grid,15,14,13,12,11,10,9,8,4,5,6,7,0,1,2,3);
- uint32_t plate = BITSWAP24(m_plate,23,22,21,20,19,3,2,12,13,14,15,16,17,18,0,1,4,8,5,9,7,11,6,10);
+ u16 grid = BITSWAP16(m_grid,15,14,13,12,11,10,9,8,4,5,6,7,0,1,2,3);
+ u32 plate = BITSWAP24(m_plate,23,22,21,20,19,3,2,12,13,14,15,16,17,18,0,1,4,8,5,9,7,11,6,10);
display_matrix(17, 9, plate, grid);
}
@@ -1669,16 +1670,19 @@ class mcompgin_state : public hh_ucom4_state
{
public:
mcompgin_state(const machine_config &mconfig, device_type type, const char *tag)
- : hh_ucom4_state(mconfig, type, tag)
+ : hh_ucom4_state(mconfig, type, tag),
+ m_lcd(*this, "lcd")
{ }
- void prepare_display();
+ required_device<hlcd0569_device> m_lcd;
+
+ DECLARE_WRITE32_MEMBER(lcd_output_w);
DECLARE_WRITE8_MEMBER(unk_w);
};
// handlers
-void mcompgin_state::prepare_display()
+WRITE32_MEMBER(mcompgin_state::lcd_output_w)
{
}
@@ -1718,7 +1722,9 @@ static MACHINE_CONFIG_START( mcompgin, mcompgin_state )
MCFG_UCOM4_WRITE_H_CB(WRITE8(mcompgin_state, unk_w))
MCFG_UCOM4_WRITE_I_CB(WRITE8(mcompgin_state, unk_w))
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_ucom4_state, display_decay_tick, attotime::from_msec(1))
+ /* video hardware */
+ MCFG_DEVICE_ADD("lcd", HLCD0569, 1000) // C=?
+ MCFG_HLCD0515_WRITE_COLS_CB(WRITE32(mcompgin_state, lcd_output_w))
MCFG_DEFAULT_LAYOUT(layout_mcompgin)
/* sound hardware */
@@ -1759,8 +1765,8 @@ public:
void mvbfree_state::prepare_display()
{
- uint16_t grid = BITSWAP16(m_grid,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
- uint16_t plate = BITSWAP16(m_plate,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9);
+ u16 grid = BITSWAP16(m_grid,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
+ u16 plate = BITSWAP16(m_plate,15,14,13,12,11,10,0,1,2,3,4,5,6,7,8,9);
display_matrix(10, 14, plate, grid);
}
@@ -1980,8 +1986,8 @@ public:
void tccombat_state::prepare_display()
{
- uint16_t grid = BITSWAP16(m_grid,15,14,13,12,11,10,9,8,3,2,1,0,7,6,5,4);
- uint32_t plate = BITSWAP24(m_plate,23,22,21,20,11,15,3,10,14,2,9,13,1,0,12,8,15,1,5,0,3,7,2,6);
+ u16 grid = BITSWAP16(m_grid,15,14,13,12,11,10,9,8,3,2,1,0,7,6,5,4);
+ u32 plate = BITSWAP24(m_plate,23,22,21,20,11,15,3,10,14,2,9,13,1,0,12,8,15,1,5,0,3,7,2,6);
display_matrix(20, 9, plate, grid);
}
@@ -2161,7 +2167,6 @@ INPUT_CHANGED_MEMBER(tmtennis_state::difficulty_switch)
set_clock();
}
-
void tmtennis_state::set_clock()
{
// MCU clock is from an LC circuit oscillating by default at ~360kHz,
@@ -2243,8 +2248,8 @@ public:
void tmpacman_state::prepare_display()
{
- uint8_t grid = BITSWAP8(m_grid,0,1,2,3,4,5,6,7);
- uint32_t plate = BITSWAP24(m_plate,23,22,21,20,19,16,17,18,11,10,9,8,0,2,3,1,4,5,6,7,12,13,14,15) | 0x100;
+ u8 grid = BITSWAP8(m_grid,0,1,2,3,4,5,6,7);
+ u32 plate = BITSWAP24(m_plate,23,22,21,20,19,16,17,18,11,10,9,8,0,2,3,1,4,5,6,7,12,13,14,15) | 0x100;
display_matrix(19, 8, plate, grid);
}
@@ -2348,7 +2353,7 @@ public:
void tmscramb_state::prepare_display()
{
- uint32_t plate = BITSWAP24(m_plate,23,22,21,20,19,18,17,3,15,2,14,1,13,16,0,12,8,4,9,5,10,6,11,7) | 0x400;
+ u32 plate = BITSWAP24(m_plate,23,22,21,20,19,18,17,3,15,2,14,1,13,16,0,12,8,4,9,5,10,6,11,7) | 0x400;
display_matrix(17, 10, plate, m_grid);
}
@@ -2450,8 +2455,8 @@ public:
void tcaveman_state::prepare_display()
{
- uint8_t grid = BITSWAP8(m_grid,0,1,2,3,4,5,6,7);
- uint32_t plate = BITSWAP24(m_plate,23,22,21,20,19,10,11,5,6,7,8,0,9,2,18,17,16,3,15,14,13,12,4,1) | 0x40;
+ u8 grid = BITSWAP8(m_grid,0,1,2,3,4,5,6,7);
+ u32 plate = BITSWAP24(m_plate,23,22,21,20,19,10,11,5,6,7,8,0,9,2,18,17,16,3,15,14,13,12,4,1) | 0x40;
display_matrix(19, 8, plate, grid);
}
diff --git a/src/mame/drivers/ibm6580.cpp b/src/mame/drivers/ibm6580.cpp
index a01d2bb60bc..c7fb8ad085f 100644
--- a/src/mame/drivers/ibm6580.cpp
+++ b/src/mame/drivers/ibm6580.cpp
@@ -6,37 +6,37 @@ IBM 6580 Displaywriter.
A green-screen dedicated word-processing workstation. It uses 8" floppy
disks. It could have up to 224k of ram. Consists of:
- Electronics Module 6580
- Display 3300
- Keyboard 5330 [a "beamspring"-type]
- Dual Diskette Unit 6360
+ Electronics Module 6580
+ Display 3300
+ Keyboard 5330 [a "beamspring"-type]
+ Dual Diskette Unit 6360
Optional:
- Printers: 5215, 5218, 5228
- Printer Sharing feature
- Mag Card Unit
- Asynchronous and Bisynchronous communications features
- 66-line display and adapter (800x1056 px, 8x16 character cell)
+ Printers: 5215, 5218, 5228
+ Printer Sharing feature
+ Mag Card Unit
+ Asynchronous and Bisynchronous communications features
+ 66-line display and adapter (800x1056 px, 8x16 character cell)
All chips have IBM part numbers on them. F.e. on system board:
- 8493077 - 8086
- 4178619 - 8251A
- 4178617 - 8257-5
- 4178623 - 8259A
- 4178628 - 8255A-5
- 4178625 - 8253-5
+ 8493077 - 8086
+ 4178619 - 8251A
+ 4178617 - 8257-5
+ 4178623 - 8259A
+ 4178628 - 8255A-5
+ 4178625 - 8253-5
IRQ levels per PSM p. 6-5
- 0 incoming data for printer sharing/3277 DE
- 1 transfer data to commo data link
- 2 printer and mag card data xfer
- 3 keyboard incoming data
- 4 diskette
- 5 (not in use)
- 6 software timer [50 ms period]
- 7 error on commo data link
- nmi "or when a dump switch operation is initiated" ["memory record" button]
+ 0 incoming data for printer sharing/3277 DE
+ 1 transfer data to commo data link
+ 2 printer and mag card data xfer
+ 3 keyboard incoming data
+ 4 diskette
+ 5 (not in use)
+ 6 software timer [50 ms period]
+ 7 error on commo data link
+ nmi "or when a dump switch operation is initiated" ["memory record" button]
To do:
@@ -119,10 +119,10 @@ Displaywriter System Manual S544-2023-0 (?) -- mentioned in US patents 4648071 a
uint8_t gfx_expand[16] = {
- 0x00, 0x03, 0x0c, 0x0f,
- 0x30, 0x33, 0x3c, 0x3f,
- 0xc0, 0xc3, 0xcc, 0xcf,
- 0xf0, 0xf3, 0xfc, 0xff
+ 0x00, 0x03, 0x0c, 0x0f,
+ 0x30, 0x33, 0x3c, 0x3f,
+ 0xc0, 0xc3, 0xcc, 0xcf,
+ 0xf0, 0xf3, 0xfc, 0xff
};
@@ -294,7 +294,7 @@ READ8_MEMBER(ibm6580_state::video_r)
switch (offset)
{
case 8:
- data = 1; // 25-line video board ID. 66-line is 0x40.
+ data = 1; // 25-line video board ID. 66-line is 0x40.
data |= (m_screen->hblank() ? 8 : 0);
data |= (m_screen->vblank() ? 4 : 0);
// pure guesswork. 0x2, 0x10 and 0x20 are unknown video signals.
@@ -315,8 +315,8 @@ READ8_MEMBER(ibm6580_state::video_r)
void ibm6580_state::vblank_w(screen_device &screen, bool state)
{
-// if (state)
-// m_pic8259->ir6_w(state);
+// if (state)
+// m_pic8259->ir6_w(state);
if (ioport("DUMP")->read())
m_p40 |= 4;
@@ -403,7 +403,7 @@ WRITE8_MEMBER(ibm6580_state::led_w)
break;
default:
-// printf ("LED 0x%08x: unknown\n", data);
+// printf ("LED 0x%08x: unknown\n", data);
break;
}
}
@@ -601,22 +601,22 @@ WRITE8_MEMBER(ibm6580_state::floppy_w)
switch (offset)
{
- case 0: // 8150 -- mcu reset?
+ case 0: // 8150 -- mcu reset?
m_floppy_mcu_sr.enqueue(0x00);
m_floppy_mcu_sr.enqueue(0x00);
break;
- case 1: // 8152
+ case 1: // 8152
m_fdc->soft_reset();
break;
- case 5: // 815A
+ case 5: // 815A
m_fdc->fifo_w(space, offset, data);
if (m_floppy_idle)
m_floppy_idle = false;
break;
- case 6: // 815C
+ case 6: // 815C
m_floppy_mcu_cr.enqueue(data);
m_floppy_mcu_cr_fifo++;
if (floppy_mcu_cr_full())
@@ -631,7 +631,7 @@ READ8_MEMBER(ibm6580_state::floppy_r)
switch (offset)
{
- case 0: // 8150
+ case 0: // 8150
// bit 4 -- ?? ready
// bit 5 -- mcu busy
// bit 6 -- ?? idle
@@ -639,14 +639,14 @@ READ8_MEMBER(ibm6580_state::floppy_r)
data |= 0x40;
break;
- case 4: // 8158
+ case 4: // 8158
data = m_fdc->msr_r(space, offset);
break;
- case 5: // 815a
+ case 5: // 815a
data = m_fdc->fifo_r(space, offset);
- case 6: // 815c
+ case 6: // 815c
if (!m_floppy_mcu_sr.empty())
data = m_floppy_mcu_sr.dequeue();
break;
@@ -665,7 +665,7 @@ READ8_MEMBER(ibm6580_state::floppy_r)
f->dskchg_r(), f->idx_r(), f->get_cyl()
));
else
- DBG_LOG(2,"Floppy", ("%02x == %02x (idle %d irq %d drq %d)\n",
+ DBG_LOG(2,"Floppy", ("%02x == %02x (idle %d irq %d drq %d)\n",
0x8150 + (offset << 1), data,
m_floppy_idle, m_fdc->get_irq(), m_fdc->get_drq()
));
@@ -677,17 +677,17 @@ READ8_MEMBER(ibm6580_state::floppy_r)
static ADDRESS_MAP_START(ibm6580_mem, AS_PROGRAM, 16, ibm6580_state)
ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE(0x00000, 0x3ffff) AM_RAM // system RAM
+ AM_RANGE(0x00000, 0x3ffff) AM_RAM // system RAM
AM_RANGE(0x90000, 0x90001) AM_WRITE(unk_latch_w)
- AM_RANGE(0xef000, 0xeffff) AM_RAM AM_SHARE("videoram") // 66-line vram starts at 0xec000
+ AM_RANGE(0xef000, 0xeffff) AM_RAM AM_SHARE("videoram") // 66-line vram starts at 0xec000
AM_RANGE(0xfc000, 0xfffff) AM_ROM AM_REGION("user1", 0)
ADDRESS_MAP_END
static ADDRESS_MAP_START(ibm6580_io, AS_IO, 16, ibm6580_state)
ADDRESS_MAP_UNMAP_HIGH
//
-// AM_RANGE(0x0028, 0x0028) AM_DEVREADWRITE8("upd8251", i8251_device, data_r, data_w)
-// AM_RANGE(0x0029, 0x0029) AM_DEVREADWRITE8("upd8251", i8251_device, status_r, control_w)
+// AM_RANGE(0x0028, 0x0028) AM_DEVREADWRITE8("upd8251", i8251_device, data_r, data_w)
+// AM_RANGE(0x0029, 0x0029) AM_DEVREADWRITE8("upd8251", i8251_device, status_r, control_w)
//
AM_RANGE(0x0000, 0x0007) AM_DEVREADWRITE8("pic8259", pic8259_device, read, write, 0x00ff)
AM_RANGE(0x0008, 0x000f) AM_WRITE (pic_latch_w)
@@ -702,7 +702,7 @@ static ADDRESS_MAP_START(ibm6580_io, AS_IO, 16, ibm6580_state)
AM_RANGE(0x5000, 0x500f) AM_UNMAP
AM_RANGE(0x6000, 0x601f) AM_UNMAP
AM_RANGE(0x8060, 0x807f) AM_UNMAP
- AM_RANGE(0x8150, 0x815f) AM_READWRITE8(floppy_r, floppy_w, 0x00ff) // HLE of floppy board
+ AM_RANGE(0x8150, 0x815f) AM_READWRITE8(floppy_r, floppy_w, 0x00ff) // HLE of floppy board
AM_RANGE(0x81a0, 0x81af) AM_UNMAP
AM_RANGE(0xc000, 0xc00f) AM_UNMAP
AM_RANGE(0xe000, 0xe02f) AM_READWRITE8(video_r, video_w, 0x00ff)
@@ -868,11 +868,11 @@ void ibm6580_state::video_start()
}
FLOPPY_FORMATS_MEMBER( ibm6580_state::floppy_formats )
- FLOPPY_HFE_FORMAT,
- FLOPPY_IPF_FORMAT,
- FLOPPY_MFI_FORMAT,
- FLOPPY_TD0_FORMAT,
- FLOPPY_IMD_FORMAT
+ FLOPPY_HFE_FORMAT,
+ FLOPPY_IPF_FORMAT,
+ FLOPPY_MFI_FORMAT,
+ FLOPPY_TD0_FORMAT,
+ FLOPPY_IMD_FORMAT
FLOPPY_FORMATS_END0
static SLOT_INTERFACE_START( dw_floppies )
@@ -921,9 +921,9 @@ static MACHINE_CONFIG_START( ibm6580, ibm6580_state )
MCFG_UPD765A_ADD(UPD765_TAG, false, false)
MCFG_UPD765_INTRQ_CALLBACK(WRITELINE(ibm6580_state, floppy_intrq))
-// MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("pic8259", pic8259_device, ir4_w))
+// MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("pic8259", pic8259_device, ir4_w))
MCFG_UPD765_DRQ_CALLBACK(DEVWRITELINE("dma8257", i8257_device, dreq0_w))
-// MCFG_UPD765_HDL_CALLBACK(WRITELINE(ibm6580_state, floppy_hdl))
+// MCFG_UPD765_HDL_CALLBACK(WRITELINE(ibm6580_state, floppy_hdl))
MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":0", dw_floppies, "8sssd", ibm6580_state::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":1", dw_floppies, "8sssd", ibm6580_state::floppy_formats)
diff --git a/src/mame/drivers/ibmpcjr.cpp b/src/mame/drivers/ibmpcjr.cpp
index 1a79d4eec40..b050a5ed0e0 100644
--- a/src/mame/drivers/ibmpcjr.cpp
+++ b/src/mame/drivers/ibmpcjr.cpp
@@ -657,6 +657,7 @@ static MACHINE_CONFIG_START( ibmpcjr, pcjr_state)
/* Software lists */
MCFG_SOFTWARE_LIST_ADD("cart_list","ibmpcjr_cart")
MCFG_SOFTWARE_LIST_ADD("flop_list","ibmpcjr_flop")
+ MCFG_SOFTWARE_LIST_COMPATIBLE_ADD("pc_list","ibm5150")
MACHINE_CONFIG_END
static GFXDECODE_START( ibmpcjx )
@@ -680,7 +681,7 @@ static MACHINE_CONFIG_DERIVED( ibmpcjx, ibmpcjr )
MCFG_DEVICE_MODIFY(RAM_TAG)
MCFG_RAM_DEFAULT_SIZE("512K")
MCFG_RAM_EXTRA_OPTIONS("") // only boots with 512k currently
- MACHINE_CONFIG_END
+MACHINE_CONFIG_END
diff --git a/src/mame/drivers/igs011.cpp b/src/mame/drivers/igs011.cpp
index a2d18ca6302..b3c1274878e 100644
--- a/src/mame/drivers/igs011.cpp
+++ b/src/mame/drivers/igs011.cpp
@@ -4788,6 +4788,25 @@ ROM_START( vbowlj )
ROM_COPY( "ics", 0x000000, 0x300000,0x100000)
ROM_END
+ROM_START( vbowlhk )
+ ROM_REGION( 0x80000, "maincpu", 0 )
+ ROM_LOAD16_WORD_SWAP( "bowlingv101hjs.bin", 0x00000, 0x80000, CRC(92fbfa72) SHA1(824b666ea2247ef5a974675925bcef94dbd1a992) ) // second half all 00
+
+ ROM_REGION( 0x400000 * 2, "blitter", 0)
+ ROM_LOAD( "vrbowlng.u69", 0x000000, 0x400000, CRC(b0d339e8) SHA1(a26a5e0202a78e8cdc562b10d64e14eadfa4e115) )
+ // extra space to expand every 4 bits to 8
+
+ ROM_REGION( 0x100000, "blitter_hi", ROMREGION_INVERT )
+ ROM_LOAD( "vrbowlng.u68", 0x000000, 0x100000, CRC(b0ce27e7) SHA1(6d3ef97edd606f384b1e05b152fbea12714887b7) )
+
+ ROM_REGION( 0x400000, "ics", 0 )
+ ROM_LOAD( "vrbowlng.u67", 0x00000, 0x80000, CRC(53000936) SHA1(e50c6216f559a9248c095bdfae05c3be4be79ff3) ) // 8 bit signed mono & u-law
+ ROM_LOAD( "vrbowlng.u66", 0x80000, 0x80000, CRC(f62cf8ed) SHA1(c53e47e2c619ed974ad40ee4aaa4a35147ea8311) ) // 8 bit signed mono
+ ROM_COPY( "ics", 0x000000, 0x100000,0x100000)
+ ROM_COPY( "ics", 0x000000, 0x200000,0x100000)
+ ROM_COPY( "ics", 0x000000, 0x300000,0x100000)
+ROM_END
+
/***************************************************************************
Xing Yen Man Guan
@@ -4821,21 +4840,22 @@ ROM_END
***************************************************************************/
-GAME( 1997, drgnwrld, 0, drgnwrld, drgnwrld, igs011_state, drgnwrld, ROT0, "IGS", "Dragon World (World, V040O)", MACHINE_SUPPORTS_SAVE )
-GAME( 1995, drgnwrldv30, drgnwrld, drgnwrld, drgnwrld, igs011_state, drgnwrldv30, ROT0, "IGS", "Dragon World (World, V030O)", MACHINE_SUPPORTS_SAVE )
-GAME( 1995, drgnwrldv21, drgnwrld, drgnwrld_igs012, drgnwrld, igs011_state, drgnwrldv21, ROT0, "IGS", "Dragon World (World, V021O)", MACHINE_SUPPORTS_SAVE )
-GAME( 1995, drgnwrldv21j, drgnwrld, drgnwrld_igs012, drgnwrldj, igs011_state, drgnwrldv21j, ROT0, "IGS / Alta", "Zhong Guo Long (Japan, V021J)", MACHINE_SUPPORTS_SAVE )
-GAME( 1995, drgnwrldv20j, drgnwrld, drgnwrld_igs012, drgnwrldj, igs011_state, drgnwrldv20j, ROT0, "IGS / Alta", "Zhong Guo Long (Japan, V020J)", MACHINE_SUPPORTS_SAVE )
-GAME( 1995, drgnwrldv10c, drgnwrld, drgnwrld, drgnwrldc, igs011_state, drgnwrldv10c, ROT0, "IGS", "Zhong Guo Long (China, V010C)", MACHINE_SUPPORTS_SAVE )
-GAME( 1995, drgnwrldv11h, drgnwrld, drgnwrld, drgnwrldc, igs011_state, drgnwrldv11h, ROT0, "IGS", "Dong Fang Zhi Zhu (Hong Kong, V011H)", MACHINE_SUPPORTS_SAVE )
-GAME( 1995, drgnwrldv40k, drgnwrld, drgnwrld_igs012, drgnwrldc, igs011_state, drgnwrldv40k, ROT0, "IGS", "Dragon World (Korea, V040K)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
-GAME( 1995, lhb, 0, lhb, lhb, igs011_state, lhb, ROT0, "IGS", "Long Hu Bang (China, V035C)", MACHINE_SUPPORTS_SAVE )
-GAME( 1995, lhbv33c, lhb, lhb, lhb, igs011_state, lhbv33c, ROT0, "IGS", "Long Hu Bang (China, V033C)", MACHINE_SUPPORTS_SAVE )
-GAME( 1995, dbc, lhb, lhb, lhb, igs011_state, dbc, ROT0, "IGS", "Da Ban Cheng (Hong Kong, V027H)", MACHINE_SUPPORTS_SAVE )
-GAME( 1995, ryukobou, lhb, lhb, lhb, igs011_state, ryukobou, ROT0, "IGS / Alta", "Mahjong Ryukobou (Japan, V030J)", MACHINE_SUPPORTS_SAVE )
-GAME( 1996, lhb2, 0, lhb2, lhb2, igs011_state, lhb2, ROT0, "IGS", "Long Hu Bang II (Hong Kong, V185H)", MACHINE_SUPPORTS_SAVE )
-GAME( 1996, xymg, 0, xymg, xymg, igs011_state, xymg, ROT0, "IGS", "Xing Yun Man Guan (China, V651C)", MACHINE_SUPPORTS_SAVE )
-GAME( 1996, wlcc, xymg, wlcc, wlcc, igs011_state, wlcc, ROT0, "IGS", "Wan Li Chang Cheng (China, V638C)", MACHINE_SUPPORTS_SAVE )
-GAME( 1996, vbowl, 0, vbowl, vbowl, igs011_state, vbowl, ROT0, "IGS", "Virtua Bowling (World, V101XCM)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
-GAME( 1996, vbowlj, vbowl, vbowl, vbowlj, igs011_state, vbowlj, ROT0, "IGS / Alta", "Virtua Bowling (Japan, V100JCM)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
-GAME( 1998, nkishusp, lhb2, nkishusp, nkishusp, igs011_state, nkishusp, ROT0, "IGS / Alta", "Mahjong Nenrikishu SP (Japan, V250J)", MACHINE_SUPPORTS_SAVE )
+GAME( 1997, drgnwrld, 0, drgnwrld, drgnwrld, igs011_state, drgnwrld, ROT0, "IGS", "Dragon World (World, V040O)", MACHINE_SUPPORTS_SAVE )
+GAME( 1995, drgnwrldv30, drgnwrld, drgnwrld, drgnwrld, igs011_state, drgnwrldv30, ROT0, "IGS", "Dragon World (World, V030O)", MACHINE_SUPPORTS_SAVE )
+GAME( 1995, drgnwrldv21, drgnwrld, drgnwrld_igs012, drgnwrld, igs011_state, drgnwrldv21, ROT0, "IGS", "Dragon World (World, V021O)", MACHINE_SUPPORTS_SAVE )
+GAME( 1995, drgnwrldv21j, drgnwrld, drgnwrld_igs012, drgnwrldj, igs011_state, drgnwrldv21j, ROT0, "IGS / Alta", "Zhong Guo Long (Japan, V021J)", MACHINE_SUPPORTS_SAVE )
+GAME( 1995, drgnwrldv20j, drgnwrld, drgnwrld_igs012, drgnwrldj, igs011_state, drgnwrldv20j, ROT0, "IGS / Alta", "Zhong Guo Long (Japan, V020J)", MACHINE_SUPPORTS_SAVE )
+GAME( 1995, drgnwrldv10c, drgnwrld, drgnwrld, drgnwrldc, igs011_state, drgnwrldv10c, ROT0, "IGS", "Zhong Guo Long (China, V010C)", MACHINE_SUPPORTS_SAVE )
+GAME( 1995, drgnwrldv11h, drgnwrld, drgnwrld, drgnwrldc, igs011_state, drgnwrldv11h, ROT0, "IGS", "Dong Fang Zhi Zhu (Hong Kong, V011H)", MACHINE_SUPPORTS_SAVE )
+GAME( 1995, drgnwrldv40k, drgnwrld, drgnwrld_igs012, drgnwrldc, igs011_state, drgnwrldv40k, ROT0, "IGS", "Dragon World (Korea, V040K)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
+GAME( 1995, lhb, 0, lhb, lhb, igs011_state, lhb, ROT0, "IGS", "Long Hu Bang (China, V035C)", MACHINE_SUPPORTS_SAVE )
+GAME( 1995, lhbv33c, lhb, lhb, lhb, igs011_state, lhbv33c, ROT0, "IGS", "Long Hu Bang (China, V033C)", MACHINE_SUPPORTS_SAVE )
+GAME( 1995, dbc, lhb, lhb, lhb, igs011_state, dbc, ROT0, "IGS", "Da Ban Cheng (Hong Kong, V027H)", MACHINE_SUPPORTS_SAVE )
+GAME( 1995, ryukobou, lhb, lhb, lhb, igs011_state, ryukobou, ROT0, "IGS / Alta", "Mahjong Ryukobou (Japan, V030J)", MACHINE_SUPPORTS_SAVE )
+GAME( 1996, lhb2, 0, lhb2, lhb2, igs011_state, lhb2, ROT0, "IGS", "Long Hu Bang II (Hong Kong, V185H)", MACHINE_SUPPORTS_SAVE )
+GAME( 1996, xymg, 0, xymg, xymg, igs011_state, xymg, ROT0, "IGS", "Xing Yun Man Guan (China, V651C)", MACHINE_SUPPORTS_SAVE )
+GAME( 1996, wlcc, xymg, wlcc, wlcc, igs011_state, wlcc, ROT0, "IGS", "Wan Li Chang Cheng (China, V638C)", MACHINE_SUPPORTS_SAVE )
+GAME( 1996, vbowl, 0, vbowl, vbowl, igs011_state, vbowl, ROT0, "IGS", "Virtua Bowling (World, V101XCM)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
+GAME( 1996, vbowlj, vbowl, vbowl, vbowlj, igs011_state, vbowlj, ROT0, "IGS / Alta", "Virtua Bowling (Japan, V100JCM)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
+GAME( 1996, vbowlhk, vbowl, vbowl, vbowl, igs011_state, vbowlj, ROT0, "IGS / Tai Tin Amusement", "Virtua Bowling (Honk Kong, V101HJS)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING |MACHINE_IMPERFECT_SOUND ) // different encryption?
+GAME( 1998, nkishusp, lhb2, nkishusp, nkishusp, igs011_state, nkishusp, ROT0, "IGS / Alta", "Mahjong Nenrikishu SP (Japan, V250J)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/interpro.cpp b/src/mame/drivers/interpro.cpp
new file mode 100644
index 00000000000..9cc9264f608
--- /dev/null
+++ b/src/mame/drivers/interpro.cpp
@@ -0,0 +1,348 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+
+#include "includes/interpro.h"
+#include "debugger.h"
+
+#define VERBOSE 0
+#if VERBOSE
+#define LOG_SYSTEM(...) logerror(__VA_ARGS__)
+#define LOG_IDPROM(...) logerror(__VA_ARGS__)
+#else
+#define LOG_SYSTEM(...) {}
+#define LOG_IDPROM(...) {}
+#endif
+
+// machine start
+void interpro_state::machine_start()
+{
+ m_system_reg[SREG_CTRL2] = CTRL2_COLDSTART | CTRL2_PWRENA | CTRL2_PWRUP;
+}
+
+void interpro_state::machine_reset()
+{
+ // flash rom requires the following values
+ m_system_reg[SREG_ERROR] = 0x00;
+ m_system_reg[SREG_STATUS] = 0x400;
+ m_system_reg[SREG_CTRL1] = CTRL1_FLOPRDY;
+}
+
+WRITE16_MEMBER(interpro_state::system_w)
+{
+ switch (offset)
+ {
+ case SREG_LED:
+ LOG_SYSTEM("LED value %d at pc 0x%08x\n", data, space.device().safe_pc());
+ break;
+
+ case SREG_STATUS: // not sure if writable?
+ break;
+
+ case SREG_CTRL1:
+ LOG_SYSTEM("system control register 1 write data 0x%x pc 0x%08x\n", data, space.device().safe_pc());
+
+ if ((data ^ m_system_reg[offset]) & CTRL1_LEDDP)
+ LOG_SYSTEM("LED decimal point %s\n", data & CTRL1_LEDDP ? "on" : "off");
+
+ m_system_reg[offset] = data;
+ break;
+
+ case SREG_CTRL2:
+ LOG_SYSTEM("system control register 2 write data 0x%x pc 0x%08x\n", data, space.device().safe_pc());
+ if (data & CTRL2_RESET)
+ {
+ m_system_reg[SREG_CTRL2] &= ~CTRL2_COLDSTART;
+
+ machine().schedule_soft_reset();
+ }
+ else
+ m_system_reg[offset] = data & 0x0f; // top four bits are not persistent
+ break;
+ }
+}
+
+READ16_MEMBER(interpro_state::system_r)
+{
+ LOG_SYSTEM("system register read offset %d pc 0x%08x\n", offset, space.device().safe_pc());
+ switch (offset)
+ {
+ case SREG_ERROR:
+ case SREG_STATUS:
+ case SREG_CTRL1:
+ case SREG_CTRL2:
+ default:
+ return m_system_reg[offset];
+ break;
+ }
+}
+
+READ32_MEMBER(interpro_state::idprom_r)
+{
+ LOG_IDPROM("idprom read offset 0x%x mask 0x%08x at 0x%08x\n", offset, mem_mask, space.device().safe_pc());
+
+ // abitrary fake number for now, not working properly
+ u32 speed = 70000000;
+ u32 speed1 = speed >> 24;
+ u32 speed2 = speed >> 16;
+ u32 speed3 = speed >> 8;
+
+ static uint8_t idprom[] = {
+ // module type id
+ 'M', 'P', 'C', 'B',
+ '*', '*', '*', '*',
+
+ // ECO bytes
+ 0x87, 0x65, 0x43, 0x21,
+ 0xbb, 0xcc, 0xdd, 0xee,
+
+ // the following 8 bytes are "feature bytes"
+ // the feature bytes contain a 32 bit word which is divided by 40000
+ // if they're empty, a default value of 50 000 000 is used
+ // perhaps this is a system speed (50MHz)?
+ 0x2, 0x34, 0x56, 0x78,
+ (u8)speed1, (u8)speed2, (u8)speed3, (u8)speed,
+
+ // reserved bytes
+ 0xff, 0xff,
+
+ // family
+ // boot rom tests for family == 0x41 or 0x42
+ // if so, speed read from feature bytes 2 & 3
+ // if not, read speed from feature bytes 4-7
+ //0x41, 0x00, // 2800-series CPU
+ 0x24, 0x00, // 2000-series system board
+
+ // footprint and checksum
+ 0x55, 0xaa, 0x55, 0x00
+ };
+
+ switch (offset)
+ {
+ case 0x1f:
+ {
+ uint8_t sum = 0;
+
+ // compute the checksum (sum of all bytes must be == 0x00)
+ for (int i = 0; i < 0x20; i++)
+ sum += idprom[i];
+
+ return 0x100 - (sum & 0xff);
+ }
+
+ default:
+ return idprom[offset];
+ }
+}
+
+READ32_MEMBER(interpro_state::slot0_r)
+{
+ // a known graphics board idprom
+ static uint8_t slot0[] = {
+ 0x00, 0x00, 0x00, 0x00, '9', '6', '3', 'A', // board
+ 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // eco
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // features
+ 0xff, 0xff, // reserved
+ 0x22, 0x00, // family
+ 0x55, 0xaa, 0x55, 0x00
+ };
+
+ return ((uint8_t *)&slot0)[offset % 32];
+}
+
+WRITE8_MEMBER(interpro_state::rtc_w)
+{
+ switch (offset)
+ {
+ case 0x00:
+ // write to RTC register
+ m_rtc->write(space, 1, data);
+ break;
+
+ case 0x40:
+ // set RTC read/write address
+ m_rtc->write(space, 0, data);
+ break;
+
+ default:
+ logerror("rtc: write to unknown offset 0x%02x data 0x%02x at pc 0x%08x\n", offset, data, space.device().safe_pc());
+ break;
+ }
+}
+
+READ8_MEMBER(interpro_state::rtc_r)
+{
+ switch (offset)
+ {
+ case 0x00:
+ // read from RTC register
+ return m_rtc->read(space, 1);
+
+ // read from InterPro system ID PROM (contains MAC address)
+ case 0x40: return 0x12;
+ case 0x41: return 0x34;
+ case 0x42: return 0x56;
+
+ default:
+ logerror("rtc: read from unknown offset 0x%02x at pc 0x%08x\n", offset, space.device().safe_pc());
+ return 0xff;
+ }
+}
+
+READ8_MEMBER(interpro_state::scsi_r)
+{
+ return m_scsi->read(space, offset >> 6, mem_mask);
+}
+
+WRITE8_MEMBER(interpro_state::scsi_w)
+{
+ m_scsi->write(space, offset >> 6, data, mem_mask);
+}
+
+// driver init
+DRIVER_INIT_MEMBER(interpro_state, ip2800)
+{
+ //address_space &as = m_mmu->space(AS_1);
+}
+
+// these maps point the cpu virtual addresses to the mmu
+static ADDRESS_MAP_START(clipper_insn_map, AS_PROGRAM, 32, interpro_state)
+ AM_RANGE(0x00000000, 0xffffffff) AM_DEVREAD32(INTERPRO_MMU_TAG, cammu_device, mmu_r, 0xffffffff)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START(clipper_data_map, AS_DATA, 32, interpro_state)
+AM_RANGE(0x00000000, 0xffffffff) AM_DEVREADWRITE32(INTERPRO_MMU_TAG, cammu_device, mmu_r, mmu_w, 0xffffffff)
+ADDRESS_MAP_END
+
+// these maps represent the real main, i/o and boot spaces of the system
+static ADDRESS_MAP_START(interpro_main_map, AS_0, 32, interpro_state)
+ AM_RANGE(0x00000000, 0x00ffffff) AM_RAM // 16M RAM
+
+ AM_RANGE(0x7f100000, 0x7f11ffff) AM_ROM AM_REGION(INTERPRO_ROM_TAG, 0)
+ AM_RANGE(0x7f180000, 0x7f1bffff) AM_ROM AM_REGION(INTERPRO_EEPROM_TAG, 0)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START(interpro_io_map, AS_1, 32, interpro_state)
+ AM_RANGE(0x00000000, 0x00000fff) AM_DEVICE(INTERPRO_MMU_TAG, cammu_device, map)
+ AM_RANGE(0x00001000, 0x00001fff) AM_RAM
+
+ AM_RANGE(0x40000000, 0x4000003f) AM_DEVICE16(INTERPRO_MCGA_TAG, interpro_mcga_device, map, 0xffff)
+ AM_RANGE(0x4f007e00, 0x4f007eff) AM_DEVICE(INTERPRO_SGA_TAG, interpro_sga_device, map)
+
+ AM_RANGE(0x7f000100, 0x7f00011f) AM_DEVICE8(INTERPRO_FDC_TAG, n82077aa_device, map, 0xff)
+ // this is probably the srx arbiter ga
+ AM_RANGE(0x7f000200, 0x7f0002ff) AM_RAM
+ AM_RANGE(0x7f000300, 0x7f00030f) AM_READWRITE16(system_r, system_w, 0xffff)
+ AM_RANGE(0x7f000400, 0x7f00040f) AM_DEVREADWRITE8(INTERPRO_SCC1_TAG, scc85C30_device, ba_cd_inv_r, ba_cd_inv_w, 0xff)
+ AM_RANGE(0x7f000410, 0x7f00041f) AM_DEVREADWRITE8(INTERPRO_SCC2_TAG, scc85230_device, ba_cd_inv_r, ba_cd_inv_w, 0xff)
+ AM_RANGE(0x7f000500, 0x7f0006ff) AM_READWRITE8(rtc_r, rtc_w, 0xff)
+ AM_RANGE(0x7f000700, 0x7f00077f) AM_READ(idprom_r)
+ AM_RANGE(0x7f001000, 0x7f001fff) AM_READWRITE8(scsi_r, scsi_w, 0x0000ff00)
+
+ AM_RANGE(0x7f0fff00, 0x7f0fffff) AM_DEVICE(INTERPRO_IOGA_TAG, interpro_ioga_device, map)
+
+ AM_RANGE(0x08000000, 0x08000fff) AM_NOP // bogus
+ AM_RANGE(0x8f000000, 0x8f0fffff) AM_READ(slot0_r)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START(interpro_boot_map, AS_2, 32, interpro_state)
+ AM_RANGE(0x00000000, 0x00001fff) AM_RAM
+ADDRESS_MAP_END
+
+FLOPPY_FORMATS_MEMBER(interpro_state::floppy_formats)
+ FLOPPY_PC_FORMAT
+FLOPPY_FORMATS_END
+
+static SLOT_INTERFACE_START(interpro_floppies)
+ SLOT_INTERFACE("525dd", FLOPPY_525_DD)
+ SLOT_INTERFACE("35hd", FLOPPY_35_HD)
+SLOT_INTERFACE_END
+
+// input ports
+static INPUT_PORTS_START(ip2800)
+INPUT_PORTS_END
+
+static MACHINE_CONFIG_START(ip2800, interpro_state)
+ MCFG_CPU_ADD(INTERPRO_CPU_TAG, CLIPPER_C400, XTAL_10MHz)
+ MCFG_CPU_PROGRAM_MAP(clipper_insn_map)
+ MCFG_CPU_DATA_MAP(clipper_data_map)
+ MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE(INTERPRO_IOGA_TAG, interpro_ioga_device, inta_cb)
+
+ MCFG_DEVICE_ADD(INTERPRO_MMU_TAG, CAMMU_C4T, 0)
+ MCFG_DEVICE_ADDRESS_MAP(AS_0, interpro_main_map)
+ MCFG_DEVICE_ADDRESS_MAP(AS_1, interpro_io_map)
+ MCFG_DEVICE_ADDRESS_MAP(AS_2, interpro_boot_map)
+ MCFG_CAMMU_SSW_CB(DEVREADLINE(INTERPRO_CPU_TAG, clipper_device, ssw))
+
+ // serial controllers and rs232 bus
+ MCFG_SCC85C30_ADD(INTERPRO_SCC1_TAG, XTAL_4_9152MHz, 0, 0, 0, 0)
+
+ MCFG_Z80SCC_OUT_TXDA_CB(DEVWRITELINE("rs232a", rs232_port_device, write_txd))
+ MCFG_Z80SCC_OUT_TXDB_CB(DEVWRITELINE("rs232b", rs232_port_device, write_txd))
+ MCFG_Z80SCC_OUT_INT_CB(DEVWRITELINE(INTERPRO_IOGA_TAG, interpro_ioga_device, ir11_w))
+
+ MCFG_RS232_PORT_ADD("rs232a", default_rs232_devices, nullptr)
+ MCFG_RS232_RXD_HANDLER(DEVWRITELINE(INTERPRO_SCC1_TAG, z80scc_device, rxa_w))
+ MCFG_RS232_DCD_HANDLER(DEVWRITELINE(INTERPRO_SCC1_TAG, z80scc_device, dcda_w))
+ MCFG_RS232_CTS_HANDLER(DEVWRITELINE(INTERPRO_SCC1_TAG, z80scc_device, ctsa_w))
+
+ // the following port is known as "port 2"
+ MCFG_RS232_PORT_ADD("rs232b", default_rs232_devices, "terminal")
+ MCFG_RS232_RXD_HANDLER(DEVWRITELINE(INTERPRO_SCC1_TAG, z80scc_device, rxb_w))
+ MCFG_RS232_DCD_HANDLER(DEVWRITELINE(INTERPRO_SCC1_TAG, z80scc_device, dcdb_w))
+ MCFG_RS232_CTS_HANDLER(DEVWRITELINE(INTERPRO_SCC1_TAG, z80scc_device, ctsb_w))
+
+ MCFG_SCC85230_ADD(INTERPRO_SCC2_TAG, XTAL_4_9152MHz, 0, 0, 0, 0)
+
+ // real-time clock/non-volatile memory
+ MCFG_MC146818_ADD(INTERPRO_RTC_TAG, XTAL_32_768kHz)
+ MCFG_MC146818_UTC(true)
+ MCFG_MC146818_IRQ_HANDLER(DEVWRITELINE(INTERPRO_IOGA_TAG, interpro_ioga_device, ir9_w))
+
+ // floppy
+ MCFG_N82077AA_ADD(INTERPRO_FDC_TAG, n82077aa_device::MODE_PS2)
+ MCFG_UPD765_INTRQ_CALLBACK(DEVWRITELINE(INTERPRO_IOGA_TAG, interpro_ioga_device, ir1_w))
+ MCFG_UPD765_DRQ_CALLBACK(DEVWRITELINE(INTERPRO_IOGA_TAG, interpro_ioga_device, drq_floppy))
+ MCFG_FLOPPY_DRIVE_ADD("fdc:0", interpro_floppies, "525dd", interpro_state::floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:1", interpro_floppies, "35hd", interpro_state::floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(false)
+
+ // scsi
+ MCFG_DEVICE_ADD(INTERPRO_SCSI_TAG, SCSI_PORT, 0)
+ MCFG_SCSIDEV_ADD(INTERPRO_SCSI_TAG ":" SCSI_PORT_DEVICE1, "harddisk", SCSIHD, SCSI_ID_0)
+ MCFG_SCSIDEV_ADD(INTERPRO_SCSI_TAG ":" SCSI_PORT_DEVICE2, "cdrom", SCSICD, SCSI_ID_3)
+
+ MCFG_DEVICE_ADD(INTERPRO_SCSI_ADAPTER_TAG, NCR539X, XTAL_12_5MHz)
+ MCFG_LEGACY_SCSI_PORT(INTERPRO_SCSI_TAG)
+ MCFG_NCR539X_OUT_IRQ_CB(DEVWRITELINE(INTERPRO_IOGA_TAG, interpro_ioga_device, ir0_w))
+ MCFG_NCR539X_OUT_DRQ_CB(DEVWRITELINE(INTERPRO_IOGA_TAG, interpro_ioga_device, drq_scsi))
+
+ // i/o gate array
+ MCFG_INTERPRO_IOGA_ADD(INTERPRO_IOGA_TAG)
+ MCFG_INTERPRO_IOGA_NMI_CB(INPUTLINE(INTERPRO_CPU_TAG, INPUT_LINE_NMI))
+ MCFG_INTERPRO_IOGA_IRQ_CB(INPUTLINE(INTERPRO_CPU_TAG, INPUT_LINE_IRQ0))
+ //MCFG_INTERPRO_IOGA_DMA_CB(IOGA_DMA_CHANNEL_PLOTTER, unknown)
+ //MCFG_INTERPRO_IOGA_DMA_CB(IOGA_DMA_SCSI, DEVREAD8(INTERPRO_SCSI_TAG, ncr539x_device, dma_read_data), DEVWRITE8(INTERPRO_SCSI_TAG, ncr539x_device, dma_write_data))
+ MCFG_INTERPRO_IOGA_DMA_CB(IOGA_DMA_FLOPPY, DEVREAD8(INTERPRO_FDC_TAG, n82077aa_device, mdma_r), DEVWRITE8(INTERPRO_FDC_TAG, n82077aa_device, mdma_w))
+ MCFG_INTERPRO_IOGA_DMA_CB(IOGA_DMA_SERIAL, DEVREAD8(INTERPRO_SCC1_TAG, z80scc_device, da_r), DEVWRITE8(INTERPRO_SCC1_TAG, z80scc_device, da_w))
+ MCFG_INTERPRO_IOGA_FDCTC_CB(DEVWRITELINE(INTERPRO_FDC_TAG, n82077aa_device, tc_line_w))
+ MCFG_INTERPRO_IOGA_DMA_BUS(INTERPRO_CAMMU_TAG, AS_0)
+
+ // memory control gate array
+ MCFG_DEVICE_ADD(INTERPRO_MCGA_TAG, INTERPRO_MCGA, 0)
+
+ // srx gate array
+ MCFG_DEVICE_ADD(INTERPRO_SGA_TAG, INTERPRO_SGA, 0)
+
+MACHINE_CONFIG_END
+
+ROM_START(ip2800)
+ ROM_REGION(0x0020000, INTERPRO_ROM_TAG, 0)
+ ROM_SYSTEM_BIOS(0, "IP2830", "IP2830")
+ ROMX_LOAD("ip2830_rom.bin", 0x00000, 0x20000, CRC(467ce7bd) SHA1(53faee40d5df311f53b24c930e434cbf94a5c4aa), ROM_BIOS(1))
+
+ ROM_REGION(0x0040000, INTERPRO_EEPROM_TAG, 0)
+ ROM_LOAD_OPTIONAL("ip2830_eeprom.bin", 0x00000, 0x40000, CRC(a0c0899f) SHA1(dda6fbca81f9885a1a76ca3c25e80463a83a0ef7))
+ROM_END
+
+/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
+COMP( 1990, ip2800, 0, 0, ip2800, ip2800, interpro_state, ip2800, "Intergraph", "InterPro 2800", MACHINE_NOT_WORKING | MACHINE_NO_SOUND)
diff --git a/src/mame/drivers/jollyjgr.cpp b/src/mame/drivers/jollyjgr.cpp
index cc2039a7fe6..c3db52b8913 100644
--- a/src/mame/drivers/jollyjgr.cpp
+++ b/src/mame/drivers/jollyjgr.cpp
@@ -669,13 +669,13 @@ void jollyjgr_state::machine_reset()
static MACHINE_CONFIG_START( jollyjgr, jollyjgr_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", Z80, XTAL_18MHz/6) /* 3MHz verified */
+ MCFG_CPU_ADD("maincpu", Z80, XTAL_18MHz/6) /* 3MHz verified */
MCFG_CPU_PROGRAM_MAP(jollyjgr_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", jollyjgr_state, jollyjgr_interrupt)
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(59.18) /* 59.1864Hz measured */
+ MCFG_SCREEN_REFRESH_RATE(59.18) /* 59.1864Hz measured */
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_SIZE(256, 256)
MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
@@ -689,7 +689,7 @@ static MACHINE_CONFIG_START( jollyjgr, jollyjgr_state )
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
- MCFG_SOUND_ADD("aysnd", AY8910, XTAL_3_579545MHz/2) /* 1.7897725MHz verified */
+ MCFG_SOUND_ADD("aysnd", AY8910, XTAL_3_579545MHz/2) /* 1.7897725MHz verified */
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.45)
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/k28.cpp b/src/mame/drivers/k28.cpp
index c68620e1d1c..50420033dde 100644
--- a/src/mame/drivers/k28.cpp
+++ b/src/mame/drivers/k28.cpp
@@ -50,30 +50,30 @@ public:
required_ioport_array<7> m_inp_matrix;
// display common
- int m_display_wait; // led/lamp off-delay in microseconds (default 33ms)
- int m_display_maxy; // display matrix number of rows
- int m_display_maxx; // display matrix number of columns (max 31 for now)
+ int m_display_wait; // led/lamp off-delay in microseconds (default 33ms)
+ int m_display_maxy; // display matrix number of rows
+ int m_display_maxx; // display matrix number of columns (max 31 for now)
- uint32_t m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
- uint16_t m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
- uint32_t m_display_cache[0x20]; // (internal use)
- uint8_t m_display_decay[0x20][0x20]; // (internal use)
+ u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
+ u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
+ u32 m_display_cache[0x20]; // (internal use)
+ u8 m_display_decay[0x20][0x20]; // (internal use)
TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
void display_update();
void set_display_size(int maxx, int maxy);
- void set_display_segmask(uint32_t digits, uint32_t mask);
- void display_matrix(int maxx, int maxy, uint32_t setx, uint32_t sety, bool update = true);
+ void set_display_segmask(u32 digits, u32 mask);
+ void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true);
bool m_power_on;
- uint8_t m_inp_mux;
- uint8_t m_phoneme;
+ u8 m_inp_mux;
+ u8 m_phoneme;
int m_speech_strobe;
int m_vfd_data_enable;
int m_vfd_data_in;
int m_vfd_clock;
- uint64_t m_vfd_shiftreg;
- uint64_t m_vfd_shiftreg_out;
+ u64 m_vfd_shiftreg;
+ u64 m_vfd_shiftreg_out;
int m_vfd_shiftcount;
DECLARE_WRITE8_MEMBER(mcu_p0_w);
@@ -168,7 +168,7 @@ void k28_state::power_off()
void k28_state::display_update()
{
- uint32_t active_state[0x20];
+ u32 active_state[0x20];
for (int y = 0; y < m_display_maxy; y++)
{
@@ -181,7 +181,7 @@ void k28_state::display_update()
m_display_decay[y][x] = m_display_wait;
// determine active state
- uint32_t ds = (m_display_decay[y][x] != 0) ? 1 : 0;
+ u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0;
active_state[y] |= (ds << x);
}
}
@@ -236,7 +236,7 @@ void k28_state::set_display_size(int maxx, int maxy)
m_display_maxy = maxy;
}
-void k28_state::set_display_segmask(uint32_t digits, uint32_t mask)
+void k28_state::set_display_segmask(u32 digits, u32 mask)
{
// set a segment mask per selected digit, but leave unselected ones alone
for (int i = 0; i < 0x20; i++)
@@ -247,12 +247,12 @@ void k28_state::set_display_segmask(uint32_t digits, uint32_t mask)
}
}
-void k28_state::display_matrix(int maxx, int maxy, uint32_t setx, uint32_t sety, bool update)
+void k28_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update)
{
set_display_size(maxx, maxy);
// update current state
- uint32_t mask = (1 << maxx) - 1;
+ u32 mask = (1 << maxx) - 1;
for (int y = 0; y < maxy; y++)
m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0;
@@ -297,7 +297,7 @@ WRITE8_MEMBER(k28_state::mcu_p0_w)
READ8_MEMBER(k28_state::mcu_p1_r)
{
- uint8_t data = 0;
+ u8 data = 0;
// multiplexed inputs (active low)
for (int i = 0; i < 7; i++)
@@ -352,11 +352,11 @@ WRITE8_MEMBER(k28_state::mcu_prog_w)
m_vfd_shiftcount = 0;
// output 0-15: digit segment data
- uint16_t seg_data = (uint16_t)(m_vfd_shiftreg >> 19);
+ u16 seg_data = (u16)(m_vfd_shiftreg >> 19);
seg_data = BITSWAP16(seg_data,0,1,13,9,10,12,14,8,3,4,5,2,15,11,6,7);
// output 16-24: digit select
- uint16_t digit_sel = (uint16_t)(m_vfd_shiftreg >> 10) & 0x1ff;
+ u16 digit_sel = (u16)(m_vfd_shiftreg >> 10) & 0x1ff;
set_display_segmask(0x1ff, 0x3fff);
display_matrix(16, 9, seg_data, digit_sel);
diff --git a/src/mame/drivers/kangaroo.cpp b/src/mame/drivers/kangaroo.cpp
index c213279a5f8..112b9cad2e2 100644
--- a/src/mame/drivers/kangaroo.cpp
+++ b/src/mame/drivers/kangaroo.cpp
@@ -544,21 +544,23 @@ ROM_END
ROM_START( kangaroob )
ROM_REGION( 0x14000, "maincpu", 0 )
- ROM_LOAD( "tvg_75.0", 0x0000, 0x1000, CRC(0d18c581) SHA1(0e0f89d644b79e887c53e5294783843ca7e875ba) )
- ROM_LOAD( "tvg_76.1", 0x1000, 0x1000, CRC(5978d37a) SHA1(684c1092de4a0927a03752903c86c3bbe99e868a) )
- ROM_LOAD( "tvg_77.2", 0x2000, 0x1000, CRC(522d1097) SHA1(09fe627a46d32df2e098d9fad7757f9d61bef41f) )
- ROM_LOAD( "tvg_78.3", 0x3000, 0x1000, CRC(063da970) SHA1(582ff21dd46c651f07a4846e0f8a7544a5891988) )
- ROM_LOAD( "tvg_79.4", 0x4000, 0x1000, CRC(9e5cf8ca) SHA1(015387f038c5670f88c9b22453d074bd9b2a129d) )
- ROM_LOAD( "k6", 0x5000, 0x1000, CRC(7644504a) SHA1(7a8a4bd163d2cdf27390ab2ef65fb7fa6fc1a361) )
+ ROM_LOAD( "k1.ic7", 0x0000, 0x1000, CRC(0d18c581) SHA1(0e0f89d644b79e887c53e5294783843ca7e875ba) )
+ ROM_LOAD( "k2.ic8", 0x1000, 0x1000, CRC(5978d37a) SHA1(684c1092de4a0927a03752903c86c3bbe99e868a) )
+ ROM_LOAD( "k3.ic9", 0x2000, 0x1000, CRC(522d1097) SHA1(09fe627a46d32df2e098d9fad7757f9d61bef41f) )
+ ROM_LOAD( "k4.ic10", 0x3000, 0x1000, CRC(063da970) SHA1(582ff21dd46c651f07a4846e0f8a7544a5891988) )
+ ROM_LOAD( "k5.ic16", 0x4000, 0x1000, CRC(9e5cf8ca) SHA1(015387f038c5670f88c9b22453d074bd9b2a129d) )
+ ROM_LOAD( "k6.ic17", 0x5000, 0x1000, CRC(7644504a) SHA1(7a8a4bd163d2cdf27390ab2ef65fb7fa6fc1a361) )
ROM_REGION( 0x10000, "audiocpu", 0 )
- ROM_LOAD( "tvg_81.8", 0x0000, 0x1000, CRC(fb449bfd) SHA1(f593a0339f47e121736a927587132aeb52704557) )
+ ROM_LOAD( "k7.ic24", 0x0000, 0x1000, CRC(fb449bfd) SHA1(f593a0339f47e121736a927587132aeb52704557) )
+
+ // MB8841 at IC29 and 2716 at IC28 not populated
ROM_REGION( 0x4000, "gfx1", 0 )
- ROM_LOAD( "tvg_83.v0", 0x0000, 0x1000, CRC(c0446ca6) SHA1(fca6ba565051337c0198c93b7b8477632e0dd0b6) )
- ROM_LOAD( "tvg_85.v2", 0x1000, 0x1000, CRC(72c52695) SHA1(87f4715fbb7d509bd9cc4e71e2afb0d475bbac13) )
- ROM_LOAD( "tvg_84.v1", 0x2000, 0x1000, CRC(e4cb26c2) SHA1(5016db9d48fdcfb757618659d063b90862eb0e90) )
- ROM_LOAD( "tvg_86.v3", 0x3000, 0x1000, CRC(9e6a599f) SHA1(76b4eddb4efcd8189d8cc5962d8497e82885f212) )
+ ROM_LOAD( "k10.ic76", 0x0000, 0x1000, CRC(c0446ca6) SHA1(fca6ba565051337c0198c93b7b8477632e0dd0b6) )
+ ROM_LOAD( "k11.ic77", 0x1000, 0x1000, CRC(72c52695) SHA1(87f4715fbb7d509bd9cc4e71e2afb0d475bbac13) )
+ ROM_LOAD( "k8.ic52", 0x2000, 0x1000, CRC(e4cb26c2) SHA1(5016db9d48fdcfb757618659d063b90862eb0e90) )
+ ROM_LOAD( "k9.ic53", 0x3000, 0x1000, CRC(9e6a599f) SHA1(76b4eddb4efcd8189d8cc5962d8497e82885f212) )
ROM_END
diff --git a/src/mame/drivers/konamim2.cpp b/src/mame/drivers/konamim2.cpp
index 716f0bce1ff..3ac8f75ccde 100644
--- a/src/mame/drivers/konamim2.cpp
+++ b/src/mame/drivers/konamim2.cpp
@@ -192,6 +192,7 @@ Notes:
#include "cdrom.h"
#include "cpu/powerpc/ppc.h"
#include "imagedev/chd_cd.h"
+#include "machine/terminal.h"
#include "softlist.h"
struct CDE_DMA
@@ -209,10 +210,19 @@ public:
konamim2_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_main_ram(*this, "main_ram"),
+ m_terminal(*this, "terminal"),
+ m_in_country(*this, "COUNTRY"),
+ m_in_card(*this, "CARD"),
+ m_in_monitor(*this, "MONITOR"),
m_maincpu(*this, "maincpu"),
m_subcpu(*this, "sub") { }
required_shared_ptr<uint64_t> m_main_ram;
+ required_device<generic_terminal_device> m_terminal;
+ required_ioport m_in_country;
+ required_ioport m_in_card;
+ required_ioport m_in_monitor;
+
uint32_t m_vdl0_address;
uint32_t m_vdl1_address;
uint32_t m_irq_enable;
@@ -242,17 +252,24 @@ public:
DECLARE_READ64_MEMBER(unk30000_r);
DECLARE_READ64_MEMBER(unk30030_r);
DECLARE_WRITE64_MEMBER(video_w);
- DECLARE_WRITE64_MEMBER(video_irq_ack_w);
+ DECLARE_WRITE32_MEMBER(video_irq_ack_w);
DECLARE_READ64_MEMBER(unk4000280_r);
- DECLARE_WRITE64_MEMBER(unk4000010_w);
+ DECLARE_WRITE8_MEMBER(serial_w);
DECLARE_WRITE64_MEMBER(unk4000418_w);
DECLARE_WRITE64_MEMBER(reset_w);
DECLARE_READ64_MEMBER(cde_r);
DECLARE_WRITE64_MEMBER(cde_w);
DECLARE_READ64_MEMBER(device2_r);
DECLARE_READ64_MEMBER(cpu_r);
+ DECLARE_READ8_MEMBER(id3_r);
+ DECLARE_READ8_MEMBER(id4_r);
+ DECLARE_READ8_MEMBER(id5_r);
+ DECLARE_READ8_MEMBER(id6_r);
+ DECLARE_READ8_MEMBER(id7_r);
+
DECLARE_DRIVER_INIT(m2);
virtual void video_start() override;
+ virtual void machine_reset() override;
uint32_t screen_update_m2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(m2);
void cde_init();
@@ -271,21 +288,32 @@ void konamim2_state::video_start()
uint32_t konamim2_state::screen_update_m2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int i, j;
-
uint32_t fb_start = 0xffffffff;
+ uint32_t fb_size;
+ //uint32_t config;
+ int height = 384,width = 512;
+
if (m_vdl0_address != 0)
{
- fb_start = *(uint32_t*)&m_main_ram[(m_vdl0_address - 0x40000000) / 8] - 0x40000000;
+ uint32_t cur_vdl_address = screen.frame_number() & 1 ? m_vdl0_address : m_vdl1_address;
+ // TODO: this looks more likely to be a framebuffer copy, with parameters!
+ fb_start = *(uint32_t*)&m_main_ram[(cur_vdl_address - 0x40000000) / 8] - 0x40000000;
+ fb_size = m_main_ram[((cur_vdl_address - 0x40000000) / 8) + 2] >> 32;
+ //config = m_main_ram[(cur_vdl_address - 0x40000000) / 8] >> 32;
+ //popmessage("%08x",config);
+
+ height = fb_size & 0x1ff;
+ width = (fb_size >> 24) * 16;
}
-
+
if (fb_start <= 0x800000)
{
uint16_t *frame = (uint16_t*)&m_main_ram[fb_start/8];
- for (j=0; j < 384; j++)
+ for (j=0; j < height; j++)
{
- uint16_t *fb = &frame[(j*512)];
+ uint16_t *fb = &frame[(j*width)];
uint16_t *d = &bitmap.pix16(j);
- for (i=0; i < 512; i++)
+ for (i=0; i < width; i++)
{
d[i^3] = *fb++ & 0x7fff;
}
@@ -382,7 +410,7 @@ WRITE64_MEMBER(konamim2_state::unk4_w)
if (data & 0x800000)
{
// osd_printf_debug("CPU '%s': CPU1 IRQ at %08X\n", device().tag(), space.device().safe_pc());
- m_subcpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE);
+ m_subcpu->set_input_line(PPC_IRQ, ASSERT_LINE);
}
m_unk20004 = (uint32_t)(data);
@@ -417,14 +445,12 @@ WRITE64_MEMBER(konamim2_state::video_w)
}
}
-WRITE64_MEMBER(konamim2_state::video_irq_ack_w)
+WRITE32_MEMBER(konamim2_state::video_irq_ack_w)
{
- if (ACCESSING_BITS_32_63)
+ if (data & 0x8000)
{
- if ((data >> 32) & 0x8000)
- {
- m_irq_active &= ~0x800000;
- }
+ m_irq_active &= ~0x800000;
+ m_maincpu->set_input_line(PPC_IRQ, CLEAR_LINE);
}
}
@@ -436,14 +462,14 @@ READ64_MEMBER(konamim2_state::unk4000280_r)
uint32_t sys_config = 0x03600000;
- sys_config |= 0 << 0; // Bit 0: PAL/NTSC switch (default is selected by encoder)
- sys_config |= 0 << 2; // Bit 2-3: Video Encoder (0 = MEIENC, 1 = VP536, 2 = BT9103, 3 = DENC)
- sys_config |= 3 << 11; // Bit 11-12: Country
+ sys_config |= 0 << 0; // Bit 0: PAL/NTSC switch (default is selected by encoder)
+ sys_config |= 0 << 2; // Bit 2-3: Video Encoder (0 = MEIENC, 1 = VP536, 2 = BT9103, 3 = DENC)
+ sys_config |= m_in_country->read() << 11; // Bit 11-12: Country
// 0 = ???
// 1 = UK
// 2 = Japan
// 3 = US
- sys_config |= 0xb << 15; // Bit 15-18: 0x8 = AC-DevCard
+ sys_config |= m_in_card->read() << 15; // Bit 15-18: 0x8 = AC-DevCard
// 0xb = AC-CoreBoard
// 0xc = DevCard (not allowed)
// 0xe = Upgrade (not allowed)
@@ -454,16 +480,9 @@ READ64_MEMBER(konamim2_state::unk4000280_r)
}
-WRITE64_MEMBER(konamim2_state::unk4000010_w)
+WRITE8_MEMBER(konamim2_state::serial_w)
{
- if ((data & 0xff) == 0xd)
- {
-// osd_printf_debug("\n");
- }
- else
- {
-// osd_printf_debug("%c", (uint8_t)(data & 0xff));
- }
+ m_terminal->write(space,0,data & 0xff);
}
WRITE64_MEMBER(konamim2_state::unk4000418_w)
@@ -1115,53 +1134,138 @@ READ64_MEMBER(konamim2_state::cpu_r)
if (ACCESSING_BITS_32_63)
{
r = (uint64_t)((&space.device() != m_maincpu) ? 0x80000000 : 0);
- //r |= 0x40000000; // sets Video-LowRes !?
+ r |= m_in_monitor->read() << 30;
return r << 32;
}
return 0;
}
+READ8_MEMBER(konamim2_state::id3_r)
+{
+ return 0x03;
+}
+
+READ8_MEMBER(konamim2_state::id4_r)
+{
+ return 0x04;
+}
+
+READ8_MEMBER(konamim2_state::id5_r)
+{
+ return 0x05;
+}
+
+READ8_MEMBER(konamim2_state::id6_r)
+{
+ return 0x06;
+}
+
+READ8_MEMBER(konamim2_state::id7_r)
+{
+ return 0x07;
+}
+
static ADDRESS_MAP_START( m2_main, AS_PROGRAM, 64, konamim2_state )
+ AM_RANGE(0x00000000, 0x0000007f) AM_RAM // ???
AM_RANGE(0x00010040, 0x00010047) AM_READWRITE(irq_enable_r, irq_enable_w)
AM_RANGE(0x00010050, 0x00010057) AM_READ(irq_active_r)
AM_RANGE(0x00020000, 0x00020007) AM_READWRITE(unk4_r, unk4_w)
+ AM_RANGE(0x00020400, 0x000207ff) AM_RAM // ???
+ AM_RANGE(0x00020800, 0x00020807) AM_RAM // ???
AM_RANGE(0x00030000, 0x00030007) AM_READ(unk30000_r)
AM_RANGE(0x00030010, 0x00030017) AM_WRITE(video_w)
AM_RANGE(0x00030030, 0x00030037) AM_READ(unk30030_r)
- AM_RANGE(0x00030400, 0x00030407) AM_WRITE(video_irq_ack_w)
+ AM_RANGE(0x00030400, 0x00030407) AM_WRITE32(video_irq_ack_w,0x00000000ffffffffU)
+
AM_RANGE(0x01000000, 0x01000fff) AM_READWRITE(cde_r, cde_w)
+
AM_RANGE(0x02000000, 0x02000fff) AM_READ(device2_r)
- AM_RANGE(0x04000010, 0x04000017) AM_WRITE(unk4000010_w)
- AM_RANGE(0x04000018, 0x0400001f) AM_READ(unk1_r)
+
+ AM_RANGE(0x03000000, 0x03000007) AM_READ8(id3_r, 0x00ff000000000000U)
+
+ AM_RANGE(0x04000000, 0x04000007) AM_READ8(id4_r, 0x00ff000000000000U)
+ AM_RANGE(0x04000010, 0x04000017) AM_WRITE8(serial_w,0x00000000000000ffU)
+ AM_RANGE(0x04000018, 0x0400001f) AM_READ(unk1_r) // serial status
AM_RANGE(0x04000020, 0x04000027) AM_WRITE(reset_w)
- AM_RANGE(0x04000418, 0x0400041f) AM_WRITE(unk4000418_w)
+ AM_RANGE(0x04000418, 0x0400041f) AM_WRITE(unk4000418_w) // serial status ack
AM_RANGE(0x04000208, 0x0400020f) AM_READ(unk3_r)
AM_RANGE(0x04000280, 0x04000287) AM_READ(unk4000280_r)
+
+ AM_RANGE(0x05000000, 0x05000007) AM_READ8(id5_r, 0x00ff000000000000U)
+
+ AM_RANGE(0x06000000, 0x06000007) AM_READ8(id6_r, 0x00ff000000000000U)
+
+ AM_RANGE(0x07000000, 0x07000007) AM_READ8(id7_r, 0x00ff000000000000U)
+
AM_RANGE(0x10000000, 0x10000007) AM_READ(cpu_r)
AM_RANGE(0x10000008, 0x10001007) AM_NOP // ???
+
AM_RANGE(0x20000000, 0x201fffff) AM_ROM AM_SHARE("share2")
AM_RANGE(0x40000000, 0x407fffff) AM_RAM AM_SHARE("main_ram")
AM_RANGE(0xfff00000, 0xffffffff) AM_ROM AM_REGION("boot", 0) AM_SHARE("share2")
ADDRESS_MAP_END
+static ADDRESS_MAP_START( 3do_m2_main, AS_PROGRAM, 64, konamim2_state )
+// ADDRESS_MAP_UNMAP_HIGH
+ AM_IMPORT_FROM( m2_main )
+
+// AM_RANGE(0x00000000, 0x000cffff) devices?
+ADDRESS_MAP_END
+
static INPUT_PORTS_START( m2 )
+ // TODO: it's unknown if these are actual dip-switches or internal to something
+ PORT_START("COUNTRY")
+ PORT_CONFNAME( 0x03, 0x03, "Country" )
+ PORT_CONFSETTING( 0x00, "<Invalid>" )
+ PORT_CONFSETTING( 0x01, "UK" )
+ PORT_CONFSETTING( 0x02, "Japan" )
+ PORT_CONFSETTING( 0x03, "US" )
+
+ PORT_START("CARD")
+ PORT_CONFNAME( 0x0f, 0x0b, "Card Type" )
+ PORT_CONFSETTING( 0x08, "AC-DevCard" )
+ PORT_CONFSETTING( 0x0b, "AC-CoreBoard" )
+ PORT_CONFSETTING( 0x0c, "DevCard (not allowed)" )
+ PORT_CONFSETTING( 0x0e, "Upgrade (not allowed)" )
+ PORT_CONFSETTING( 0x0f, "Multiplayer (not allowed)" )
+
+ PORT_START("MONITOR")
+ PORT_CONFNAME( 0x01, 0x00, "Monitor Type" )
+ PORT_CONFSETTING( 0x01, "15 KHz" )
+ PORT_CONFSETTING( 0x00, "24 KHz" )
INPUT_PORTS_END
INTERRUPT_GEN_MEMBER(konamim2_state::m2)
{
+ /*
+ 0x000001
+ 0x000008
+ 0x200000
+ 0x800000 VBlank irq
+ */
+
if (m_irq_enable & 0x800000)
{
+ //m_irq_enable |= 0x800000;
m_irq_active |= 0x800000;
+ device.execute().set_input_line(PPC_IRQ, ASSERT_LINE);
}
-
+
/*if (m_irq_enable & 0x8)
{
m_irq_active |= 0x8;
}*/
- device.execute().set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE);
+
+}
+
+void konamim2_state::machine_reset()
+{
+ m_unk3 = 0xffffffffffffffffU;
+ m_unk20004 = 0;
+ cde_init();
}
static MACHINE_CONFIG_START( m2, konamim2_state )
@@ -1176,18 +1280,22 @@ static MACHINE_CONFIG_START( m2, konamim2_state )
MCFG_PPC_BUS_FREQUENCY(33000000) /* Multiplier 2, Bus = 33MHz, Core = 66MHz */
MCFG_CPU_PROGRAM_MAP(m2_main)
+ // TODO: declaring as second screen causes palette confusion (wants to use palette from the other screen?)
+ MCFG_DEVICE_ADD("terminal", GENERIC_TERMINAL, 0)
+
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
- MCFG_SCREEN_SIZE(640, 480)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
+ MCFG_SCREEN_SIZE(704, 512)
MCFG_SCREEN_VISIBLE_AREA(0, 511, 0, 383)
MCFG_SCREEN_UPDATE_DRIVER(konamim2_state, screen_update_m2)
MCFG_SCREEN_PALETTE("palette")
MCFG_PALETTE_ADD_RRRRRGGGGGBBBBB("palette")
- /*cd-rom*/
+
+ /*cd-rom*/
MCFG_CDROM_ADD( "cdrom" )
MCFG_CDROM_INTERFACE("3do_m2_cdrom")
@@ -1195,6 +1303,12 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED_CLASS ( 3do_m2, m2, konamim2_state )
+ MCFG_CPU_MODIFY("maincpu")
+ MCFG_CPU_PROGRAM_MAP(3do_m2_main)
+
+ MCFG_CPU_MODIFY("sub")
+ MCFG_CPU_PROGRAM_MAP(3do_m2_main)
+
MCFG_SOFTWARE_LIST_ADD("cd_list","3do_m2")
MACHINE_CONFIG_END
@@ -1329,9 +1443,7 @@ ROM_END
DRIVER_INIT_MEMBER(konamim2_state,m2)
{
- m_unk3 = 0xffffffffffffffffU;
- m_unk20004 = 0;
- cde_init();
+
}
GAME( 1997, polystar, 0, m2, m2, konamim2_state, m2, ROT0, "Konami", "Tobe! Polystars (ver JAA)", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
diff --git a/src/mame/drivers/kurukuru.cpp b/src/mame/drivers/kurukuru.cpp
index 33c82310780..a0b1a5727e4 100644
--- a/src/mame/drivers/kurukuru.cpp
+++ b/src/mame/drivers/kurukuru.cpp
@@ -113,6 +113,130 @@
AB = NEC C1663C 8926B.
+ Pinout:
+
+ solder side |##| components
+ -------------------|--|-----------------
+ gnd |01| gnd
+ gnd |02| gnd
+ +5v |03| +5v
+ +5v |04| +5v
+ -5v |05| -5v
+ +12v |06| +12v
+ | |
+ hole (no connector) |07| hole (no connector)
+ | |
+ Coin B (10Y) meter |08| Coin A (100Y) meter
+ hopper motor |09| unknown out (ULN2003, pin15)
+ speaker - |10| speaker +
+ (ULN2003, pin13) unknown out |11| unknown out (ULN2003, pin12)
+ green |12| red
+ sync |13| blue
+ (ULN2003, pin13) unknown out |14| video gnd
+ | |
+ medal in |15| management
+ coin B (10Y) in |16| reset
+ coin A (100Y) in |17| unknown in (active)
+ +5v |<|-- (diode) |18| (diode) --|>| +5v
+ +5v |<|-- (diode) |19| (diode) --|>| +5v
+ | |
+ Botechin (5th) |20| (1st) Boketa
+ (active) unknown in |21| (2nd) Kunio
+ (active) unknown in |22| (3rd) Pyon-Pyon
+ start |23| (4th) Pyokorin
+ payout |24| hopper in (opto in)
+ | |
+ not used |25| not used
+ not used |26| not used
+ gnd |27| gnd
+ gnd |28| gnd
+
+
+ Pyon Pyon Jump DIP switches:
+
+ .---------------------------------------------------------------------------------.
+ | DIP Switches bank #1 1 2 3 4 5 6 7 8 |
+ +-------------------------------------+-------------------------------------------+
+ +-----------------+-------------------+-------------------------------------------+
+ | Coinage Coin A | 1 coin / 11 medal | off off off |
+ +-----------------+-------------------+-------------------------------------------+
+ | Coinage Coin A | 1 coin / 10 medal | off off on |
+ +-----------------+-------------------+-------------------------------------------+
+ | Coinage Coin A | 1 coin / 6 medal | off on off |
+ +-----------------+-------------------+-------------------------------------------+
+ | Coinage Coin A | 1 coin / 5 medal | off on on |
+ +-----------------+-------------------+-------------------------------------------+
+ | Coinage Coin A | 1 coin / 4 medal | on off off |
+ +-----------------+-------------------+-------------------------------------------+
+ | Coinage Coin A | 1 coin / 3 medal | on off on |
+ +-----------------+-------------------+-------------------------------------------+
+ | Coinage Coin A | 1 coin / 2 medal | on on off |
+ +-----------------+-------------------+-------------------------------------------+
+ | Coinage Coin A | 1 coin / 1 medal | on on on |
+ +-----------------+-------------------+-------------------------------------------+
+ | Coin A (100Y) | Exchange | off |
+ +-----------------+-------------------+-------------------------------------------+
+ | Coin A (100Y) | Credit | on |
+ +-----------------+-------------------+-------------------------------------------+
+ | Win | Medal out | off |
+ +-----------------+-------------------+-------------------------------------------+
+ | Win | Credit | on |
+ +-----------------+-------------------+-------------------------------------------+
+ | Coinage config | Coin A: Payout | off |
+ +-----------------+-------------------+-------------------------------------------+
+ | Coinage config | Coin A: Normal | on |
+ +-----------------+-------------------+-------------------------------------------+
+ | Payout Mode | Manual | off |
+ +-----------------+-------------------+-------------------------------------------+
+ | Payout Mode | Automatic | on |
+ +-----------------+-------------------+-------------------------------------------+
+ | Repeat last bet | No | off |
+ +-----------------+-------------------+-------------------------------------------+
+ | Repeat last bet | Yes | on |
+ '-----------------+-------------------+-------------------------------------------'
+
+ .---------------------------------------------------------------------------------.
+ | DIP Switches bank #2 1 2 3 4 5 6 7 8 |
+ +-------------------------------------+-------------------------------------------+
+ +-----------------+-------------------+-------------------------------------------+
+ | Percentage | 95% | on on on |
+ +-----------------+-------------------+-------------------------------------------+
+ | Percentage | 90% | on on off |
+ +-----------------+-------------------+-------------------------------------------+
+ | Percentage | 85% | on off on |
+ +-----------------+-------------------+-------------------------------------------+
+ | Percentage | 80% | on off off |
+ +-----------------+-------------------+-------------------------------------------+
+ | Percentage | 75% | off on on |
+ +-----------------+-------------------+-------------------------------------------+
+ | Percentage | 70% | off on off |
+ +-----------------+-------------------+-------------------------------------------+
+ | Percentage | 60% | off off on |
+ +-----------------+-------------------+-------------------------------------------+
+ | Percentage | 50% | off off off |
+ +-----------------+-------------------+-------------------------------------------+
+ | Winwave | Small | off |
+ +-----------------+-------------------+-------------------------------------------+
+ | Winwave | Big | on |
+ +-----------------+-------------------+-------------------------------------------+
+ | M.Medal | Off | off |
+ +-----------------+-------------------+-------------------------------------------+
+ | M.Medal | On | on |
+ +-----------------+-------------------+-------------------------------------------+
+ | HG | 20-1 | off off |
+ +-----------------+-------------------+-------------------------------------------+
+ | HG | 50-1 | off on |
+ +-----------------+-------------------+-------------------------------------------+
+ | HG | 100-1 | on off |
+ +-----------------+-------------------+-------------------------------------------+
+ | HG | 200-1 | on on |
+ +-----------------+-------------------+-------------------------------------------+
+ | unknown | off |
+ +-------------------------------------+-------------------------------------------+
+ | unknown | on |
+ '-------------------------------------+-------------------------------------------'
+
+
************************************************************************************
General Notes....
diff --git a/src/mame/drivers/laserbas.cpp b/src/mame/drivers/laserbas.cpp
index b612920396b..c079b525a74 100644
--- a/src/mame/drivers/laserbas.cpp
+++ b/src/mame/drivers/laserbas.cpp
@@ -1,22 +1,32 @@
// license:BSD-3-Clause
-// copyright-holders:Tomasz Slanina
+// copyright-holders: Tomasz Slanina, Morten Shearman Kirkegaard, Samuel Neves, Peter Wilhelmsen
+
/********************************************
Laser Base / Future Flash driver
- IC marked as Z1 is probably protection device
- mapped in memory region f800-fbff
- (similar to the one used in Parallel Turn)
-
- Reads form this device depends on previous
- writes (adr, data), address and previous
- operation (read or write).
- Pinout is almost identical to 2716 - type EPROM,
- except separated /RD and /WR signals and lacks
- of /CS
-
- Tomasz Slanina analog [at] op.pl
-
============================================
+TODO:
+- Video: weird palette changes, Laserbase colors, missing bg scrolling between stages (CRT address lines + m_hset ( or m_vset ?))
+- Sound: sound related i/o writes ( out_w handler )
+- Interrupts - NMI/Int timing is wrong, it's based on measures of broken PCB
+TS 20.01.2017
+
+There's incomplete schematics available. It's missing a couple of important elements (analog sound, interrupts).
+PCB contains big analog sound section, currently only partially emulated ( timers + counters + xors + dacs). There's many capacitors,
+resistors and few ICs, including:
+
+7B LM2902N - Op Amps
+4B LM2902N
+2B LM2902N
+1B LM2902N
+6B LM1496N - Balanced Modulator-Demodulator
+3B CA3080E - Op Amp
+6C NE555P - Timer
+4A NE555P - Timer
+6A SN94560AN - ? a tone generator (similar to SN76477 ?)
+3A MB84013B - Dual D flip-flop
+2A MN3008 - 2048-stage long delay low noise BBD (reverb effect generator)
+1C MB3712 - Power Amp.
DASM notes:
@@ -53,127 +63,168 @@ expected: 43 FB CC 9A D4 23 6C 01 3E <- From ROM 4
#include "cpu/z80/z80.h"
#include "video/mc6845.h"
#include "machine/pit8253.h"
+#include "sound/dac.h"
+#include "sound/volt_reg.h"
class laserbas_state : public driver_device
{
public:
laserbas_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
- m_protram(*this, "protram"),
- m_maincpu(*this, "maincpu") { }
+ m_maincpu(*this, "maincpu"),
+ m_palette(*this, "palette"),
+ m_dac1(*this, "dac1"),
+ m_dac2(*this, "dac2"),
+ m_dac3(*this, "dac3"),
+ m_dac4(*this, "dac4"),
+ m_dac5(*this, "dac5"),
+ m_dac6(*this, "dac6")
+ { }
/* misc */
- int m_count;
-
+ int m_dac_data;
+ int m_counter[6];
+ int m_cnt_out[6];
+ int m_nmi;
/* video-related */
int m_vrambank;
- uint8_t m_vram1[0x8000];
- uint8_t m_vram2[0x8000];
+ uint8_t m_vram[0x10000];
+ int m_hset, m_vset;
+ int m_bset;
+ int m_scl;
bool m_flipscreen;
- required_shared_ptr<uint8_t> m_protram;
+ uint64_t m_z1data;
+ void write_pit_out(int num, int state);
DECLARE_READ8_MEMBER(vram_r);
DECLARE_WRITE8_MEMBER(vram_w);
- DECLARE_WRITE8_MEMBER(vrambank_w);
- DECLARE_READ8_MEMBER(protram_r);
- DECLARE_WRITE8_MEMBER(protram_w);
+ DECLARE_WRITE8_MEMBER(videoctrl_w);
+ DECLARE_READ8_MEMBER(z1_r);
DECLARE_READ8_MEMBER(track_lo_r);
DECLARE_READ8_MEMBER(track_hi_r);
DECLARE_WRITE8_MEMBER(out_w);
+ DECLARE_WRITE_LINE_MEMBER(pit_out_0_w);
+ DECLARE_WRITE_LINE_MEMBER(pit_out_1_w);
+ DECLARE_WRITE_LINE_MEMBER(pit_out_2_w);
+ DECLARE_WRITE_LINE_MEMBER(pit_out_3_w);
+ DECLARE_WRITE_LINE_MEMBER(pit_out_4_w);
+ DECLARE_WRITE_LINE_MEMBER(pit_out_5_w);
+ TIMER_DEVICE_CALLBACK_MEMBER(laserbas_scanline);
+ MC6845_UPDATE_ROW(crtc_update_row);
+
virtual void machine_start() override;
virtual void machine_reset() override;
- virtual void video_start() override;
- uint32_t screen_update_laserbas(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
required_device<cpu_device> m_maincpu;
+ required_device<palette_device> m_palette;
+ required_device<dac_byte_interface> m_dac1;
+ required_device<dac_byte_interface> m_dac2;
+ required_device<dac_byte_interface> m_dac3;
+ required_device<dac_byte_interface> m_dac4;
+ required_device<dac_byte_interface> m_dac5;
+ required_device<dac_byte_interface> m_dac6;
};
-void laserbas_state::video_start()
+TIMER_DEVICE_CALLBACK_MEMBER( laserbas_state::laserbas_scanline )
{
- save_item(NAME(m_vram1));
- save_item(NAME(m_vram2));
- save_item(NAME(m_flipscreen));
+ int scanline = param;
+
+ if(scanline == 0 || scanline == 135)
+ {
+ m_maincpu->set_input_line(0, HOLD_LINE );
+ }
+
+ if(scanline == 240 && m_nmi)
+ {
+ m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
+ }
}
-uint32_t laserbas_state::screen_update_laserbas(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+MC6845_UPDATE_ROW( laserbas_state::crtc_update_row )
{
- int x,y, x0,y0, x1,y1, delta;
+ int x = 0;
+ int x_max = 0x100;
+ int dx = 1;
if (m_flipscreen)
{
- delta = -1;
- x0 = 256-1; x1 = -1;
- y0 = 256-1; y1 = -1;
- }
- else
- {
- delta = 1;
- x0 = 0; x1 = 256;
- y0 = 0; y1 = 256;
+ y = 0xdf - y;
+ x = 0xff;
+ x_max = -1;
+ dx = -1;
}
- int pixaddr = 0;
- for (y = y0; y != y1; y += delta)
+ int pixaddr = y << 8;
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
+ uint32_t *b = &bitmap.pix32(y);
+
+ while (x != x_max)
{
- for (x = x0; x != x1; x += delta)
- {
- uint8_t p1 = m_vram1[pixaddr/2];
- uint8_t p2 = m_vram2[pixaddr/2];
- uint8_t mask = (pixaddr & 1) ? 0xf0 : 0x0f;
- uint8_t shift = (pixaddr & 1) ? 4 : 0;
-
- if (p2 & mask)
- bitmap.pix16(y, x) = (p2 & mask) >> shift;
- else
- bitmap.pix16(y, x) = ((p1 & mask) >> shift) + 16;
-
- pixaddr++;
- }
+ int offset = (pixaddr >> 1) & 0x7fff;
+ int shift = (pixaddr & 1) * 4; // two 4 bit pixels in one byte
+ int p1 = (m_vram[offset] >> shift) & 0xf;
+ int p2 = (m_vram[offset + 0x8000] >> shift) & 0xf; // 0x10000 VRAM, two 4 bit layers 0x8000 bytes each
+ int p;
+
+ if (p2)
+ p = p2;
+ else if (p1)
+ p = p1 + 16;
+ else
+ p = m_bset;
+
+ b[x] = palette[p];
+
+ pixaddr++;
+ x += dx;
}
-
- return 0;
}
READ8_MEMBER(laserbas_state::vram_r)
{
- if(!m_vrambank)
- return m_vram1[offset];
- else
- return m_vram2[offset];
+ return m_vram[offset+(m_vrambank?0x8000:0)];
}
WRITE8_MEMBER(laserbas_state::vram_w)
{
- if(!m_vrambank)
- m_vram1[offset] = data;
- else
- m_vram2[offset] = data;
-}
-
-#if 0
-READ8_MEMBER(laserbas_state::read_unk)
-{
- m_count ^= 0x80;
- return m_count | 0x7f;
-}
-#endif
-
-WRITE8_MEMBER(laserbas_state::vrambank_w)
-{
- m_vrambank = data & 0x40;
- m_flipscreen = !(data & 0x80);
+ m_vram[offset+(m_vrambank?0x8000:0)] = data;
}
-READ8_MEMBER(laserbas_state::protram_r)
+WRITE8_MEMBER(laserbas_state::videoctrl_w)
{
- uint8_t prot = m_protram[offset];
-// prot = machine().rand();
-// logerror("%s: Z1 read %03x = %02x\n", machine().describe_context(), offset, prot);
- return prot;
+ if(!(offset&1))
+ {
+ m_vrambank = data & 0x40; // layer select
+ m_flipscreen = !(data & 0x80);
+ m_vset = (data>>3)&7; // inc-ed on interrupts ( 8 ints / frame ?)
+ m_hset = data&7;
+ }
+ else
+ {
+ data^=0xff;
+ m_bset = data>>4; // bg pen
+ m_scl = (data&8)>>3; // unknown
+ m_nmi=data&1; // nmi enable (not on schematics, traced)
+ }
}
-WRITE8_MEMBER(laserbas_state::protram_w)
+READ8_MEMBER(laserbas_state::z1_r)
{
-// logerror("%s: Z1 write %03x = %02x\n", machine().describe_context(), offset, data);
- m_protram[offset] = data;
+ m_z1data = (m_z1data >> 10) | (uint64_t(offset & 0x03ff) << 30);
+
+ auto const x = [this] (unsigned b) { return BIT(m_z1data, b); };
+ auto const nx = [this] (unsigned b) { return BIT(~m_z1data, b); };
+ auto const MUX2 = [] (bool s, uint16_t a, uint16_t b) { return s ? a : b; };
+
+ uint8_t const bit7 = MUX2(x(36) & x(33), x(31) ^ x(35), (nx(33) & (nx(20) | nx(36))) | (nx(36) & x(24)));
+ uint8_t const bit6 = MUX2(x(36), MUX2(x(33), x(29), nx(23) | x(30)), x(33) & x(15));
+ uint8_t const bit5 = MUX2(x(36), nx(33) & x(27), x(32) | x(33));
+ uint8_t const bit4 = MUX2(x(36), MUX2(x(33), nx(24), nx(35)), MUX2(nx(33), x(4), MUX2(nx(26), x(5) & x(23), MUX2(x(23), x(19), nx(13) | x(20)))));
+ uint8_t const bit3 = MUX2(x(36), x(33) & x(11), MUX2(x(33), x(25) | nx(31), x(24)));
+ uint8_t const bit2 = MUX2(x(33), MUX2(x(36), x(28), x(20)), MUX2(x(36), nx(11), nx(39)));
+ uint8_t const bit1 = MUX2(x(36), MUX2(x(23), MUX2(x(26), nx(18), nx(10)) | x(33), MUX2(x(26), x(1), x(29)) & nx(33)), MUX2(x(33), x(7), x(17)));
+ uint8_t const bit0 = MUX2(x(33), MUX2(x(36), x(22), nx(26)), MUX2(x(36), x(14), x(21)));
+
+ return (bit7 << 7) | (bit6 << 6) | (bit5 << 5) | (bit4 << 4) | (bit3 << 3) | (bit2 << 2) | (bit1 << 1) | (bit0 << 0);
}
READ8_MEMBER(laserbas_state::track_lo_r)
@@ -181,29 +232,103 @@ READ8_MEMBER(laserbas_state::track_lo_r)
uint8_t dx = ioport("TRACK_X")->read();
uint8_t dy = ioport("TRACK_Y")->read();
if (dx & 0x10)
- dx ^= 0x0f;
+ dx ^= 0xf;
if (dy & 0x10)
dy ^= 0x0f;
- return (dx & 0x0f) | ((dy & 0x0f) << 4);
+ int data = (dx & 0x0f) | ((dy & 0x0f) << 4);
+ return data;
}
+
READ8_MEMBER(laserbas_state::track_hi_r)
{
- return ((ioport("TRACK_X")->read() & 0x10) >> 4) | ((ioport("TRACK_Y")->read() & 0x10) >> 3);
+ int data = ((ioport("TRACK_X")->read() & 0x10) >> 4) | ((ioport("TRACK_Y")->read() & 0x10) >> 3);
+ return data;
}
WRITE8_MEMBER(laserbas_state::out_w)
{
- static uint8_t out[4];
- out[offset] = data;
- // port 20: mask 01 = service1, mask 02 = pulsed (no delay) waiting for start1, mask 08 = coin2, mask 40 = coin1
- popmessage("OUT 20: %02x %02x - %02x %02x", out[0], out[1], out[2], out[3]);
+ /* sound related , maybe also lamps */
+}
+
+void laserbas_state::machine_start()
+{
+ save_item(NAME(m_vram));
+ save_item(NAME(m_flipscreen));
+ save_item(NAME(m_vrambank));
+ save_item(NAME(m_hset));
+ save_item(NAME(m_vset));
+ save_item(NAME(m_bset));
+ save_item(NAME(m_scl));
+ save_item(NAME(m_nmi));
+ save_item(NAME(m_dac_data));
+ save_item(NAME(m_counter));
+ save_item(NAME(m_cnt_out));
+ save_item(NAME(m_z1data));
+}
+
+void laserbas_state::machine_reset()
+{
+ m_vrambank = 0;
+ m_flipscreen = false;
+ m_nmi=0;
+ m_bset = 0;
+ m_hset = 0;
+ m_vset = 0;
+ m_scl = 0;
+}
+
+void laserbas_state::write_pit_out(int num, int state)
+{
+ state^=1; // 7404 (6G)
+ if((!state)& m_cnt_out[num]){ // 0->1 rising edge CLK
+ m_counter[num] = (m_counter[num]+1)&0x0f; // 4 bit counters 74393
+ }
+ int data =(state) | ((m_counter[num]&7)<<1); // combine output from 8253 with counter bits 0-3
+ data<<=4;
+ if(m_counter[num]&8) data^=0x0f; // counter bit 4 xors the data ( 7486 x 6)
+ switch(num){
+ case 0: m_dac1->write(data);break; // 4 resistor packs : 47k, 100k, 220k, 470k
+ case 1: m_dac2->write(data);break;
+ case 2: m_dac3->write(data);break;
+ case 3: m_dac4->write(data);break;
+ case 4: m_dac5->write(data);break;
+ case 5: m_dac6->write(data);break;
+ }
+
+ m_cnt_out[num]=state;
+}
+
+WRITE_LINE_MEMBER(laserbas_state::pit_out_0_w)
+{
+ write_pit_out(0,state);
+}
+
+WRITE_LINE_MEMBER(laserbas_state::pit_out_1_w)
+{
+ write_pit_out(1,state);
+}
+WRITE_LINE_MEMBER(laserbas_state::pit_out_2_w)
+{
+ write_pit_out(2,state);
+}
+WRITE_LINE_MEMBER(laserbas_state::pit_out_3_w)
+{
+ write_pit_out(3,state);
+}
+WRITE_LINE_MEMBER(laserbas_state::pit_out_4_w)
+{
+ write_pit_out(4,state);
+}
+WRITE_LINE_MEMBER(laserbas_state::pit_out_5_w)
+{
+ write_pit_out(5,state);
}
static ADDRESS_MAP_START( laserbas_memory, AS_PROGRAM, 8, laserbas_state )
AM_RANGE(0x0000, 0x3fff) AM_ROM
AM_RANGE(0x4000, 0xbfff) AM_READWRITE(vram_r, vram_w)
- AM_RANGE(0xc000, 0xf7ff) AM_ROM
- AM_RANGE(0xf800, 0xfbff) AM_READWRITE(protram_r, protram_w) AM_SHARE("protram") /* protection device */
+ AM_RANGE(0xc000, 0xf7ff) AM_ROM AM_WRITENOP
+ AM_RANGE(0xf800, 0xfbff) AM_READ(z1_r) AM_WRITENOP /* protection device */
AM_RANGE(0xfc00, 0xffff) AM_RAM
ADDRESS_MAP_END
@@ -211,11 +336,11 @@ static ADDRESS_MAP_START( laserbas_io, AS_IO, 8, laserbas_state )
ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x00, 0x00) AM_DEVWRITE("crtc", mc6845_device, address_w)
AM_RANGE(0x01, 0x01) AM_DEVWRITE("crtc", mc6845_device, register_w)
- AM_RANGE(0x10, 0x10) AM_WRITE(vrambank_w)
+ AM_RANGE(0x10, 0x11) AM_WRITE(videoctrl_w)
AM_RANGE(0x20, 0x20) AM_READ_PORT("DSW")
AM_RANGE(0x21, 0x21) AM_READ_PORT("INPUTS")
AM_RANGE(0x22, 0x22) AM_READ(track_hi_r)
- AM_RANGE(0x23, 0x23) AM_READ(track_lo_r) // AM_WRITE(test_w)
+ AM_RANGE(0x23, 0x23) AM_READ(track_lo_r)
AM_RANGE(0x20, 0x23) AM_WRITE(out_w)
AM_RANGE(0x40, 0x43) AM_DEVREADWRITE("pit0", pit8253_device, read, write)
AM_RANGE(0x44, 0x47) AM_DEVREADWRITE("pit1", pit8253_device, read, write)
@@ -234,8 +359,8 @@ static INPUT_PORTS_START( laserbas )
PORT_DIPSETTING( 0x04, "10k" ) PORT_CONDITION("INPUTS", 0x20, EQUALS, 0x20)
PORT_DIPSETTING( 0x00, "30k" ) PORT_CONDITION("INPUTS", 0x20, EQUALS, 0x20)
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Demo_Sounds ) ) PORT_CONDITION("INPUTS", 0x20, EQUALS, 0x20)
- PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_CONDITION("INPUTS", 0x20, EQUALS, 0x20)
- PORT_DIPSETTING( 0x08, DEF_STR( On ) ) PORT_CONDITION("INPUTS", 0x20, EQUALS, 0x20)
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) PORT_CONDITION("INPUTS", 0x20, EQUALS, 0x20)
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_CONDITION("INPUTS", 0x20, EQUALS, 0x20)
PORT_DIPNAME( 0x30, 0x30, DEF_STR( Coin_B ) ) PORT_CONDITION("INPUTS", 0x20, EQUALS, 0x20)
PORT_DIPSETTING( 0x10, DEF_STR( 3C_1C ) ) PORT_CONDITION("INPUTS", 0x20, EQUALS, 0x20)
PORT_DIPSETTING( 0x20, DEF_STR( 2C_1C ) ) PORT_CONDITION("INPUTS", 0x20, EQUALS, 0x20)
@@ -259,7 +384,7 @@ static INPUT_PORTS_START( laserbas )
PORT_START("INPUTS") // $21
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 )
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL PORT_PLAYER(2)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START1 )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START2 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN2 )
@@ -268,58 +393,67 @@ static INPUT_PORTS_START( laserbas )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 ) // service coin
PORT_START("TRACK_X")
- PORT_BIT( 0x1f, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(10) PORT_KEYDELTA(1) PORT_RESET
+ PORT_BIT( 0x01f, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(30) PORT_KEYDELTA(20) PORT_RESET
PORT_START("TRACK_Y")
- PORT_BIT( 0x1f, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(10) PORT_KEYDELTA(1) PORT_RESET PORT_REVERSE
+ PORT_BIT( 0x01f, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(30) PORT_KEYDELTA(20) PORT_RESET PORT_REVERSE
INPUT_PORTS_END
-void laserbas_state::machine_start()
-{
- save_item(NAME(m_vrambank));
- save_item(NAME(m_count));
-}
-
-void laserbas_state::machine_reset()
-{
- m_vrambank = 0;
- m_flipscreen = false;
- m_count = 0;
-}
+#define CLOCK 16680000
+#define PIT_CLOCK (CLOCK/16) // 12 divider ?
static MACHINE_CONFIG_START( laserbas, laserbas_state )
- MCFG_CPU_ADD("maincpu", Z80, 4000000)
+ MCFG_CPU_ADD("maincpu", Z80, CLOCK / 4)
MCFG_CPU_PROGRAM_MAP(laserbas_memory)
MCFG_CPU_IO_MAP(laserbas_io)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", laserbas_state, irq0_line_hold)
-// MCFG_TIMER_DRIVER_ADD_PERIODIC("nmi", laserbas_state, nmi_line_pulse, attotime::from_hz(60))
+ MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", laserbas_state, laserbas_scanline, "screen", 0, 1)
/* TODO: clocks aren't known */
MCFG_DEVICE_ADD("pit0", PIT8253, 0)
- MCFG_PIT8253_CLK0(31250)
- MCFG_PIT8253_CLK1(31250)
- MCFG_PIT8253_CLK2(31250)
+ MCFG_PIT8253_CLK0(PIT_CLOCK)
+ MCFG_PIT8253_CLK1(PIT_CLOCK)
+ MCFG_PIT8253_CLK2(PIT_CLOCK)
+ MCFG_PIT8253_OUT0_HANDLER(WRITELINE(laserbas_state, pit_out_0_w))
+ MCFG_PIT8253_OUT1_HANDLER(WRITELINE(laserbas_state, pit_out_1_w))
+ MCFG_PIT8253_OUT2_HANDLER(WRITELINE(laserbas_state, pit_out_2_w))
MCFG_DEVICE_ADD("pit1", PIT8253, 0)
- MCFG_PIT8253_CLK0(31250)
- MCFG_PIT8253_CLK1(31250)
- MCFG_PIT8253_CLK2(31250)
+ MCFG_PIT8253_CLK0(PIT_CLOCK)
+ MCFG_PIT8253_CLK1(PIT_CLOCK)
+ MCFG_PIT8253_CLK2(PIT_CLOCK)
+ MCFG_PIT8253_OUT0_HANDLER(WRITELINE(laserbas_state, pit_out_3_w))
+ MCFG_PIT8253_OUT1_HANDLER(WRITELINE(laserbas_state, pit_out_4_w))
+ MCFG_PIT8253_OUT2_HANDLER(WRITELINE(laserbas_state, pit_out_5_w))
MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
- MCFG_SCREEN_SIZE(32*8, 32*8)
- MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(laserbas_state, screen_update_laserbas)
- MCFG_SCREEN_PALETTE("palette")
+ MCFG_SCREEN_RAW_PARAMS(4000000, 256, 0, 256, 256, 0, 256) /* temporary, CRTC will configure screen */
+ MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
MCFG_MC6845_ADD("crtc", H46505, "screen", 3000000/4) /* unknown clock, hand tuned to get ~60 fps */
MCFG_MC6845_SHOW_BORDER_AREA(false)
MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(laserbas_state, crtc_update_row)
MCFG_PALETTE_ADD("palette", 32)
MCFG_PALETTE_FORMAT(RRRGGGBB)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("speaker")
+ MCFG_SOUND_ADD("dac1", DAC_4BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.16)
+ MCFG_SOUND_ADD("dac2", DAC_4BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.16)
+ MCFG_SOUND_ADD("dac3", DAC_4BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.16)
+ MCFG_SOUND_ADD("dac4", DAC_4BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.16)
+ MCFG_SOUND_ADD("dac5", DAC_4BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.16)
+ MCFG_SOUND_ADD("dac6", DAC_4BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.16)
+ MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
+ MCFG_SOUND_ROUTE_EX(0, "dac1", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE_EX(0, "dac1", -1.0, DAC_VREF_NEG_INPUT)
+ MCFG_SOUND_ROUTE_EX(0, "dac2", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE_EX(0, "dac2", -1.0, DAC_VREF_NEG_INPUT)
+ MCFG_SOUND_ROUTE_EX(0, "dac3", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE_EX(0, "dac3", -1.0, DAC_VREF_NEG_INPUT)
+ MCFG_SOUND_ROUTE_EX(0, "dac4", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE_EX(0, "dac4", -1.0, DAC_VREF_NEG_INPUT)
+ MCFG_SOUND_ROUTE_EX(0, "dac5", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE_EX(0, "dac5", -1.0, DAC_VREF_NEG_INPUT)
+ MCFG_SOUND_ROUTE_EX(0, "dac6", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE_EX(0, "dac6", -1.0, DAC_VREF_NEG_INPUT)
+
MACHINE_CONFIG_END
/*
@@ -410,6 +544,6 @@ ROM_START( futflash )
ROM_LOAD( "ff.8", 0xf000, 0x0800, CRC(623f558f) SHA1(be6c6565df658555f21c43a8c2459cf399794a84) )
ROM_END
-GAME( 1981, laserbas, 0, laserbas, laserbas, driver_device, 0, ROT270, "Hoei (Amstar license)", "Laser Base (set 1)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
-GAME( 1981, laserbasa,laserbas, laserbas, laserbas, driver_device, 0, ROT270, "Hoei (Amstar license)", "Laser Base (set 2)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
-GAME( 1981, futflash, laserbas, laserbas, laserbas, driver_device, 0, ROT270, "Hoei", "Future Flash", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
+GAME( 1980, futflash, 0, laserbas, laserbas, driver_device, 0, ROT270, "Hoei", "Future Flash", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_COLORS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1981, laserbas, futflash, laserbas, laserbas, driver_device, 0, ROT270, "Hoei (Amstar license)", "Laser Base (set 1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_COLORS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1981, laserbasa,futflash, laserbas, laserbas, driver_device, 0, ROT270, "Hoei (Amstar license)", "Laser Base (set 2)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_COLORS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/lastbank.cpp b/src/mame/drivers/lastbank.cpp
index 94526115a8c..b9baa4bea98 100644
--- a/src/mame/drivers/lastbank.cpp
+++ b/src/mame/drivers/lastbank.cpp
@@ -8,14 +8,13 @@
Uses a TC0091LVC, a variant of the one used on Taito L HW
- TODO:
- - sound;
-
***************************************************************************/
#include "emu.h"
#include "cpu/z80/z80.h"
#include "sound/2203intf.h"
+#include "sound/es8712.h"
+#include "sound/okim6295.h"
#include "machine/tc009xlvc.h"
#define MASTER_CLOCK XTAL_14_31818MHz
@@ -26,11 +25,15 @@ public:
lastbank_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
- m_vdp(*this, "tc0091lvc")
+ m_vdp(*this, "tc0091lvc"),
+ m_oki(*this, "oki"),
+ m_essnd(*this, "essnd")
{ }
required_device<cpu_device> m_maincpu;
required_device<tc0091lvc_device> m_vdp;
+ required_device<okim6295_device> m_oki;
+ required_device<es8712_device> m_essnd;
virtual void video_start() override;
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
@@ -41,6 +44,8 @@ public:
uint8_t m_irq_vector[3];
uint8_t m_irq_enable;
uint8_t m_mux_data;
+ uint8_t m_soundlatch[2];
+ uint8_t m_sound_flags;
DECLARE_READ8_MEMBER(lastbank_rom_r);
@@ -53,8 +58,16 @@ public:
DECLARE_WRITE8_MEMBER(lastbank_ram_2_w);
DECLARE_WRITE8_MEMBER(lastbank_ram_3_w);
+ DECLARE_WRITE8_MEMBER(output_w);
+
DECLARE_READ8_MEMBER(mux_0_r);
DECLARE_WRITE8_MEMBER(mux_w);
+ DECLARE_WRITE8_MEMBER(soundlatch_w);
+
+ DECLARE_READ8_MEMBER(soundlatch1_r);
+ DECLARE_READ8_MEMBER(soundlatch2_r);
+ DECLARE_WRITE8_MEMBER(sound_flags_w);
+ DECLARE_CUSTOM_INPUT_MEMBER(sound_status_r);
DECLARE_READ8_MEMBER(lastbank_rom_bank_r);
DECLARE_WRITE8_MEMBER(lastbank_rom_bank_w);
@@ -180,11 +193,45 @@ READ8_MEMBER(lastbank_state::mux_0_r)
return res;
}
+WRITE8_MEMBER(lastbank_state::output_w)
+{
+ //logerror("%s: Writing %02x to A80%x\n", machine().describe_context(), data, offset);
+}
+
WRITE8_MEMBER(lastbank_state::mux_w)
{
m_mux_data = data;
}
+WRITE8_MEMBER(lastbank_state::soundlatch_w)
+{
+ m_soundlatch[offset] = data;
+}
+
+READ8_MEMBER(lastbank_state::soundlatch1_r)
+{
+ return m_soundlatch[0];
+}
+
+READ8_MEMBER(lastbank_state::soundlatch2_r)
+{
+ return m_soundlatch[1];
+}
+
+WRITE8_MEMBER(lastbank_state::sound_flags_w)
+{
+ m_sound_flags = data;
+ if (!BIT(data, 4))
+ m_essnd->reset();
+ if (!BIT(data, 5))
+ m_oki->reset();
+}
+
+CUSTOM_INPUT_MEMBER(lastbank_state::sound_status_r)
+{
+ return BIT(m_sound_flags, 0) << 1 | BIT(m_sound_flags, 1);
+}
+
static ADDRESS_MAP_START( tc0091lvc_map, AS_PROGRAM, 8, lastbank_state )
AM_RANGE(0x0000, 0x5fff) AM_ROM
AM_RANGE(0x6000, 0x7fff) AM_READ(lastbank_rom_r)
@@ -205,15 +252,13 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( lastbank_map, AS_PROGRAM, 8, lastbank_state )
AM_IMPORT_FROM( tc0091lvc_map )
- AM_RANGE(0xa000, 0xa7ff) AM_RAM AM_SHARE("share1")
- AM_RANGE(0xa800, 0xa800) AM_READ_PORT("COINS") AM_WRITENOP
- AM_RANGE(0xa801, 0xa801) AM_WRITENOP
- AM_RANGE(0xa802, 0xa802) AM_WRITENOP
+ AM_RANGE(0xa000, 0xa7ff) AM_RAM
+ AM_RANGE(0xa800, 0xa800) AM_READ_PORT("COINS")
+ AM_RANGE(0xa800, 0xa802) AM_WRITE(output_w)
AM_RANGE(0xa803, 0xa803) AM_WRITE(mux_w) // mux for $a808 / $a80c
- AM_RANGE(0xa804, 0xa804) AM_READ_PORT("VBLANK")
- AM_RANGE(0xa805, 0xa805) AM_WRITENOP
- AM_RANGE(0xa806, 0xa806) AM_WRITENOP
- AM_RANGE(0xa807, 0xa807) AM_WRITENOP
+ AM_RANGE(0xa804, 0xa804) AM_READ_PORT("SPECIAL")
+ AM_RANGE(0xa805, 0xa806) AM_WRITE(soundlatch_w)
+ AM_RANGE(0xa807, 0xa807) AM_WRITENOP // hopper?
AM_RANGE(0xa808, 0xa808) AM_READ(mux_0_r)
AM_RANGE(0xa80c, 0xa80c) AM_READ(mux_0_r)
AM_RANGE(0xa81c, 0xa81c) AM_READ_PORT("DSW0")
@@ -225,11 +270,15 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( lastbank_audio_map, AS_PROGRAM, 8, lastbank_state )
AM_RANGE(0x0000, 0xbfff) AM_ROM
AM_RANGE(0xc000, 0xdfff) AM_RAM
- AM_RANGE(0xe000, 0xe7ff) AM_RAM AM_SHARE("share1")
+ AM_RANGE(0xe000, 0xe7ff) AM_RAM
ADDRESS_MAP_END
static ADDRESS_MAP_START( lastbank_audio_io, AS_IO, 8, lastbank_state )
ADDRESS_MAP_GLOBAL_MASK(0xff)
+ AM_RANGE(0x00, 0x06) AM_DEVREADWRITE("essnd", es8712_device, read, write)
+ AM_RANGE(0x40, 0x40) AM_DEVREADWRITE("oki", okim6295_device, read, write)
+ AM_RANGE(0x80, 0x80) AM_READ(soundlatch1_r) AM_WRITE(sound_flags_w)
+ AM_RANGE(0xc0, 0xc0) AM_READ(soundlatch2_r)
ADDRESS_MAP_END
static INPUT_PORTS_START( lastbank )
@@ -243,7 +292,7 @@ static INPUT_PORTS_START( lastbank )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_GAMBLE_KEYIN ) PORT_CODE(KEYCODE_N)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 )
- PORT_START("VBLANK")
+ PORT_START("SPECIAL")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE2 ) PORT_NAME("Reset")
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE3 ) PORT_NAME("Service")
PORT_DIPNAME( 0x04, 0x04, "Hopper Count" )
@@ -252,8 +301,8 @@ static INPUT_PORTS_START( lastbank )
PORT_DIPNAME( 0x08, 0x08, "Hopper Empty" )
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_BIT( 0x70, IP_ACTIVE_LOW, IPT_UNKNOWN ) // bit 6 is a status of some sort
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen")
+ PORT_BIT( 0x30, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0xc0, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, lastbank_state, sound_status_r, nullptr)
PORT_START("P1_KEY0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON15 ) PORT_NAME("1P 5-6") PORT_CODE(KEYCODE_V)
@@ -300,106 +349,116 @@ static INPUT_PORTS_START( lastbank )
PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("DSW0")
- PORT_DIPNAME( 0x01, 0x01, "DSWA" )
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:1")
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:2")
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:3")
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:4")
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:5")
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:6")
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:7")
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:8")
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("DSW1")
- PORT_DIPNAME( 0x01, 0x01, "DSWA" )
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:1")
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:2")
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:3")
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:4")
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:5")
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:6")
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("DSW2:7")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:8")
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("DSW2")
- PORT_DIPNAME( 0x01, 0x01, "DSWA" )
- PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0f, 0x0f, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("DSW3:1,2,3,4")
+ PORT_DIPSETTING( 0x07, "1 Coin /100 Credits" )
+ PORT_DIPSETTING( 0x08, "1 Coin /50 Credits" )
+ PORT_DIPSETTING( 0x09, "1 Coin /25 Credits" )
+ PORT_DIPSETTING( 0x0a, "1 Coin /20 Credits" )
+ PORT_DIPSETTING( 0x0b, "1 Coin /10 Credits" )
+ PORT_DIPSETTING( 0x0c, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0x0d, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x01, "5 Coins /2 Credits" )
+ PORT_DIPSETTING( 0x0e, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x05, DEF_STR( 2C_3C ) )
+ PORT_DIPSETTING( 0x0f, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x06, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 5C_1C ) )
+ PORT_DIPSETTING( 0x00, "10 Coins /1 Credit" )
+ PORT_DIPNAME( 0xf0, 0xf0, "Coin C" ) PORT_DIPLOCATION("DSW3:5,6,7,8")
+ PORT_DIPSETTING( 0x70, "1 Coin /100 Credits" )
+ PORT_DIPSETTING( 0x80, "1 Coin /50 Credits" )
+ PORT_DIPSETTING( 0x90, "1 Coin /25 Credits" )
+ PORT_DIPSETTING( 0xa0, "1 Coin /20 Credits" )
+ PORT_DIPSETTING( 0xb0, "1 Coin /10 Credits" )
+ PORT_DIPSETTING( 0xc0, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0xd0, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x10, "5 Coins /2 Credits" )
+ PORT_DIPSETTING( 0xe0, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x50, DEF_STR( 2C_3C ) )
+ PORT_DIPSETTING( 0xf0, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x60, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x30, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( 5C_1C ) )
+ PORT_DIPSETTING( 0x00, "10 Coins /1 Credit" )
PORT_START("DSW3")
- PORT_DIPNAME( 0x01, 0x01, "DSWA" )
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:1")
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:2")
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:3")
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x38, 0x38, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("DSW4:4,5,6")
+ PORT_DIPSETTING( 0x30, "1 Coin /50 Credits" )
+ PORT_DIPSETTING( 0x38, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x28, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x18, DEF_STR( 5C_1C ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( 6C_1C ) )
+ PORT_DIPSETTING( 0x08, "9 Coins /1 Credit" )
+ PORT_DIPSETTING( 0x00, "10 Coins /1 Credit" )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:7")
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW4:8")
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
INPUT_PORTS_END
@@ -461,7 +520,7 @@ static MACHINE_CONFIG_START( lastbank, lastbank_state )
MCFG_CPU_ADD("audiocpu",Z80,MASTER_CLOCK/4)
MCFG_CPU_PROGRAM_MAP(lastbank_audio_map)
MCFG_CPU_IO_MAP(lastbank_audio_io)
- MCFG_CPU_PERIODIC_INT_DRIVER(lastbank_state, nmi_line_pulse, 60)
+ // yes, we have no interrupts
MCFG_QUANTUM_PERFECT_CPU("maincpu")
@@ -488,7 +547,12 @@ static MACHINE_CONFIG_START( lastbank, lastbank_state )
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
- // es8712
+
+ MCFG_OKIM6295_ADD("oki", 1000000, OKIM6295_PIN7_HIGH)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75)
+
+ MCFG_ES8712_ADD("essnd", 12000)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
MACHINE_CONFIG_END
/***************************************************************************
@@ -508,9 +572,11 @@ ROM_START( lastbank )
ROM_LOAD( "u11", 0x000000, 0x100000, CRC(2588d82d) SHA1(426f6821862d54123e53410e2776586ddf6b21e7) )
ROM_LOAD( "5.u10", 0x100000, 0x020000, CRC(51f3c5a7) SHA1(73d4c8817fe96d75be32c43e816e93c52b5d2b27) )
- ROM_REGION( 0x200000, "essnd", 0 ) /* Samples */
+ ROM_REGION( 0x40000, "oki", 0 )
ROM_LOAD( "6.u55", 0x00000, 0x40000, CRC(9e78e234) SHA1(031f93e4bc338d0257fa673da7ce656bb1cda5fb) )
- ROM_LOAD( "7.u60", 0x40000, 0x80000, CRC(41be7146) SHA1(00f1c0d5809efccf888e27518a2a5876c4b633d8) )
+
+ ROM_REGION( 0x80000, "essnd", 0 ) /* Samples */
+ ROM_LOAD( "7.u60", 0x00000, 0x80000, CRC(41be7146) SHA1(00f1c0d5809efccf888e27518a2a5876c4b633d8) )
ROM_END
-GAME( 1994, lastbank, 0, lastbank, lastbank, driver_device, 0, ROT0, "Excellent System", "Last Bank (v1.16)", MACHINE_NO_SOUND )
+GAME( 1994, lastbank, 0, lastbank, lastbank, driver_device, 0, ROT0, "Excellent System", "Last Bank (v1.16)", 0 )
diff --git a/src/mame/drivers/lwriter.cpp b/src/mame/drivers/lwriter.cpp
index 7cf46040af8..03da909522a 100644
--- a/src/mame/drivers/lwriter.cpp
+++ b/src/mame/drivers/lwriter.cpp
@@ -1,23 +1,54 @@
// license:BSD-3-Clause
-// copyright-holders:Joakim Larsson Edstrom
+// copyright-holders:Joakim Larsson Edstrom, Jonathan Gevaryahu
/******************************************************************************
Apple LaserWriter II NT driver
+ 0x000000 - 0x1fffff SRAM/ROM (switches based on overlay)
+ 0x200000 - 0x3fffff ROM
+ 0x400000 - 0x5fffff RAM
+ 0x600000 - 0x7fffff ??? more RAM?
+ 0x800000 - 0x9fffff LED/Printer Controls(MSB), FIFO to print mechanism(LSB)
+ 0xa00000 - 0xbfffff Zilog 8530 SCC (Serial Control Chip) Read
+ 0xc00000 - 0xdfffff Zilog 8530 SCC (Serial Control Chip) Write
+ 0xe00000 - 0xefffff Rockwell 6522 VIA
+ 0xf00000 - 0xffffef ??? (the ROM appears to be accessing here)
+ 0xfffff0 - 0xffffff ???Auto Vector??
+
TODO:
- - Figure out what VIA pins is connected to switch on front that selects LocalTalk
- - Let the board identify itself to a emulated mac driver so it displays the printer icon on the desktop
+ - Get the board to pass its self test, it fails long before it even bothers reading the dipswitches
+ - Hook up the rest of the VIA pins to a canon printer HLE stub
+ - Hook up ADB bitbang device to the VIA CB1, CB2 and PortA pins
+ - Hook up VIA Port A, bits 5 and 6 to the SW1 and SW2 panel switches
- Everything else
+ DONE:
+ - Hook up SCC and VIA interrupt pins to the 68k
+ Future:
+ - Let the board identify itself to a emulated mac driver so it displays the printer icon on the desktop
+
+ Self Test LEDs at 0x800000-800001 most significant nybble:
+ 0x8 - <Passes> cpu check? (displayed before the overlay is disabled)
+ 0xF - <Passes> 200000-3fffff ROM checksum
+ 0xE - <Passes> 400000-400007 Low half of DRAM individual bit tests (walking ones and zeroes)
+ 0xD - <Passes> 5ffff8-5fffff High half of DRAM individual bit tests (walking ones and zeroes)
+ 0xC - <Passes> 400000-5fffff comprehensive DRAM data test
+ 0xB - <Passes?> Unknown test
+ 0xA - <Passes> dies if 600000-7fffff doesn't mirror 400000-5fffff ?
+ 0x8 - <Passes> SRAM test 000000-000FFF (2e3616-2e3654)
+ 0x0 - <runs off into weeds> not sure... (2e2fd0... 2db764 is the end of the 'clear ram 41d53f down to 400000' loop...)
+
+ If one of the self tests fails, the uppermost bit will oscillate (c000 4000 c000 4000 etc) forever
******************************************************************************/
/*
* Hardware: 68000@11.16 MHz
8530 SCC
- 6523 TPI or 6522 VIA on newer pcb:s
+ 65C22 VIA on newer pcbs (older pcbs might have a 6523/6525 TPI but the pinout is completely different?)
2MB DRAM
2KB SRAM
- custom 335-0022 EEPROM
+ X2804 EEPROM (custom marked as 335-0022) [note that technically a 2808 or 2816 can go here and will work too]
1MB ROM
+ MMI67L401 64x4 FIFO, x2
+------------------------------------------------------------------------------------------------------------------------+=====+
| 1 2 3 4 5 6 7 8 9 10 11 | #
@@ -79,9 +110,21 @@ public:
, m_maincpu(*this, "maincpu")
, m_scc(*this, "scc")
, m_via(*this, "via")
+ , m_overlay(1)
{ }
- DECLARE_READ16_MEMBER (bootvect_r);
- DECLARE_WRITE16_MEMBER (bootvect_w);
+ DECLARE_READ16_MEMBER(bankedarea_r);
+ DECLARE_WRITE16_MEMBER(bankedarea_w);
+ DECLARE_WRITE8_MEMBER(led_out_w);
+ DECLARE_WRITE8_MEMBER(fifo_out_w);
+ DECLARE_READ8_MEMBER(via_pa_r);
+ DECLARE_WRITE8_MEMBER(via_pa_w);
+ DECLARE_WRITE_LINE_MEMBER(via_ca2_w);
+ DECLARE_READ8_MEMBER(via_pb_r);
+ DECLARE_WRITE8_MEMBER(via_pb_w);
+ DECLARE_WRITE_LINE_MEMBER(via_cb1_w);
+ DECLARE_WRITE_LINE_MEMBER(via_cb2_w);
+ DECLARE_WRITE_LINE_MEMBER(via_int_w);
+ //DECLARE_WRITE_LINE_MEMBER(scc_int);
virtual void machine_start () override;
virtual void machine_reset () override;
private:
@@ -95,32 +138,89 @@ private:
required_device<via6522_device> m_via;
#endif
- // Pointer to System ROMs needed by bootvect_r and masking RAM buffer for post reset accesses
- uint16_t *m_sysrom;
- uint16_t m_sysram[2];
+ uint16_t *m_dram_ptr, *m_sram_ptr, *m_rom_ptr;
+ bool m_overlay;
};
+/*
+Address maps (x = ignored; * = selects address within this range)
+68k address map:
+a23 a22 a21 a20 a19 a18 a17 a16 a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 (a0 via UDS/LDS)
+* * * PAL16R6 U80
+* * * * * * decoded by pals
+Overlay ON:
+0 0 0 * * * * * * * * * * * * * * * * * * * * * R ROM
+0 0 0 0 0 0 * * * * * * * * * * * * * * * * * * R ROMEN1
+0 0 0 0 0 1 * * * * * * * * * * * * * * * * * * R ROMEN2
+0 0 0 0 1 0 * * * * * * * * * * * * * * * * * * R ROMEN3
+0 0 0 0 1 1 * * * * * * * * * * * * * * * * * * R ROMEN4
+0 0 0 1 x x x x x x x x x x x x x x x x x x x x OPEN BUS
+Overlay OFF:
+0 0 0 ? ? ?0? x x x x x x * * * * * * * * * * * * RW SRAM
+Unknown:
+? ? ? ? ? ? x x x x x x (*) (*) * * * * * * * * * 1 RW 2804 EEPROM
+ (technically a10 and a11 are ignored, but if a 2808 or 2816 is put in this spot the address lines do connect to the appropriate pins)
+Common:
+0 0 1 * * * * * * * * * * * * * * * * * * * * * R ROM
+0 0 1 0 0 0 * * * * * * * * * * * * * * * * * * R ROMEN1
+0 0 1 0 0 1 * * * * * * * * * * * * * * * * * * R ROMEN2
+0 0 1 0 1 0 * * * * * * * * * * * * * * * * * * R ROMEN3
+0 0 1 0 1 1 * * * * * * * * * * * * * * * * * * R ROMEN4
+0 0 1 1 x x x x x x x x x x x x x x x x x x x x OPEN BUS
+0 1 0 * * * * * * * * * * * * * * * * * * * * * RW DRAM
+0 1 1 * * * * * * * * * * * * * * * * * * * * * RW ???? DRAM mirror?
+1 0 0 ? ? ? x x x x x x x x x x x x x x x x x 0 W 64x8 FIFO
+1 0 0 ? ? ? x x x x x x x x x x x x x x x x x 1 W Status LEDs and mech
+1 0 1 ? ? ? x x x x x x x x x x x x x x x * * 1 R 8530 SCC Read
+1 1 0 ? ? ? x x x x x x x x x x x x x x x * * 0 W 8530 SCC Write
+1 1 1 ?x? ?0? ? x x x x x x x x x x x x x * * * * 0 RW 65C22 VIA
+1 1 1 ?x? ?1? ? x x x x x x x x x x x x x * * * * 0 RW debugger rom/pod area
+ | | | | |
+map when overlay is set:
+000000-1fffff ROM (second half is open bus)
+map when overlay is clear:
+000000-03ffff SRAM(?)
+040000-1fffff ????
+200000-3fffff ROM (second half is open bus)
+400000-5fffff DRAM
+600000-7fffff DRAM mirror
+800000-83ffff LEDs and status bits to printer mechanism, FIFO
+840000-9fffff unknown
+a00000-a3ffff SCC read
+a40000-bfffff unknown
+c00000-c3ffff SCC write
+c40000-dfffff unknown
+e00000-e3ffff VIA
+e40000-f7ffff unknown
+f80000-fbffff debug area (first read must be 0xAAAA5555, then 68k will jump to address of second read)
+fc0000-ffffff unknown
+
+The ADB bit-bang transceiver MCU connects to the VIA CB1 (adbclk) and CB2 (adbdata) pins,
+as well as PA0 (ST1), PA2 (ST2) and PA3 (ADB /INT)
+*/
+
static ADDRESS_MAP_START (maincpu_map, AS_PROGRAM, 16, lwriter_state)
ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE(0x00000000, 0x00000007) AM_ROM AM_READ(bootvect_r) /* ROM mirror just during reset */
- AM_RANGE(0x00000000, 0x00000007) AM_RAM AM_WRITE(bootvect_w) /* After first write we act as RAM */
- AM_RANGE(0x00000008, 0x001fffff) AM_RAM /* 2 Mb DRAM */
- AM_RANGE(0x00200000, 0x003fffff) AM_ROM AM_REGION("roms", 0)
-
- AM_RANGE(0x00c00000, 0x00c00001) AM_DEVWRITE8("scc", scc8530_device, ca_w, 0x00ff)
- AM_RANGE(0x00c00004, 0x00c00005) AM_DEVWRITE8("scc", scc8530_device, da_w, 0x00ff)
- AM_RANGE(0x00a00000, 0x00a00001) AM_DEVREAD8 ("scc", scc8530_device, ca_r, 0xff00)
- AM_RANGE(0x00a00004, 0x00a00005) AM_DEVREAD8 ("scc", scc8530_device, da_r, 0xff00)
+ AM_RANGE(0x000000, 0x1fffff) AM_READWRITE(bankedarea_r, bankedarea_w)
+ AM_RANGE(0x200000, 0x2fffff) AM_ROM AM_REGION("rom", 0) // 1MB ROM
+ //AM_RANGE(0x300000, 0x3fffff) // open bus?
+ AM_RANGE(0x400000, 0x5fffff) AM_RAM AM_REGION("dram", 0) AM_MIRROR(0x200000) // 2MB DRAM
+ AM_RANGE(0x800000, 0x800001) AM_WRITE8(led_out_w, 0xff00) AM_MIRROR(0x1ffffe) // mirror is a guess given that the pals can only decode A18-A23
+ AM_RANGE(0x800000, 0x800001) AM_WRITE8(fifo_out_w, 0x00ff) AM_MIRROR(0x1ffffe) // mirror is a guess given that the pals can only decode A18-A23
+ AM_RANGE(0xc00000, 0xc00001) AM_DEVWRITE8("scc", scc8530_device, ca_w, 0x00ff) AM_MIRROR(0x1ffff8)
+ AM_RANGE(0xc00004, 0xc00005) AM_DEVWRITE8("scc", scc8530_device, da_w, 0x00ff) AM_MIRROR(0x1ffff8)
+ AM_RANGE(0xa00000, 0xa00001) AM_DEVREAD8 ("scc", scc8530_device, ca_r, 0xff00) AM_MIRROR(0x1ffff8)
+ AM_RANGE(0xa00004, 0xa00005) AM_DEVREAD8 ("scc", scc8530_device, da_r, 0xff00) AM_MIRROR(0x1ffff8)
- AM_RANGE(0x00c00002, 0x00c00003) AM_DEVWRITE8("scc", scc8530_device, cb_w, 0x00ff)
- AM_RANGE(0x00c00006, 0x00c00007) AM_DEVWRITE8("scc", scc8530_device, db_w, 0x00ff)
- AM_RANGE(0x00a00002, 0x00a00003) AM_DEVREAD8 ("scc", scc8530_device, cb_r, 0xff00)
- AM_RANGE(0x00a00006, 0x00a00007) AM_DEVREAD8 ("scc", scc8530_device, db_r, 0xff00)
+ AM_RANGE(0xc00002, 0xc00003) AM_DEVWRITE8("scc", scc8530_device, cb_w, 0x00ff) AM_MIRROR(0x1ffff8)
+ AM_RANGE(0xc00006, 0xc00007) AM_DEVWRITE8("scc", scc8530_device, db_w, 0x00ff) AM_MIRROR(0x1ffff8)
+ AM_RANGE(0xa00002, 0xa00003) AM_DEVREAD8 ("scc", scc8530_device, cb_r, 0xff00) AM_MIRROR(0x1ffff8)
+ AM_RANGE(0xa00006, 0xa00007) AM_DEVREAD8 ("scc", scc8530_device, db_r, 0xff00) AM_MIRROR(0x1ffff8)
#if TPI
- AM_RANGE(0x00e00010, 0x00e0001f) AM_DEVREADWRITE8 ("tpi", tpi6523_device, read, write, 0x00ff) // Used on older boards, needs proper mapping
+ AM_RANGE(0xe00010, 0xe0001f) AM_DEVREADWRITE8 ("tpi", tpi6523_device, read, write, 0x00ff) AM_MIRROR(0x17ffe0) // Used on older boards, needs proper mapping
#else
- AM_RANGE(0x00e00000, 0x00e0001f) AM_DEVREADWRITE8 ("via", via6522_device, read, write, 0x00ff)
+ AM_RANGE(0xe00000, 0xe0001f) AM_DEVREADWRITE8 ("via", via6522_device, read, write, 0x00ff) AM_MIRROR(0x17ffe0)
#endif
ADDRESS_MAP_END
@@ -130,28 +230,122 @@ INPUT_PORTS_END
/* Start it up */
void lwriter_state::machine_start()
{
- /* Setup pointer to bootvector in ROM for bootvector handler bootvect_r */
- m_sysrom = (uint16_t*)(memregion ("roms")->base ());
+ m_rom_ptr = (uint16_t*)memregion("rom")->base();
+ m_dram_ptr = (uint16_t*)memregion("dram")->base();
+ m_sram_ptr = (uint16_t*)memregion("sram")->base();
+ // do stuff here later on like setting up printer mechanisms HLE timers etc
+}
+
+void lwriter_state::machine_reset()
+{
+ /* Reset the VIA */
+ m_via->reset();
+}
+
+/* Overlay area */
+READ16_MEMBER(lwriter_state::bankedarea_r)
+{
+ if (m_overlay)
+ {
+ return m_rom_ptr[offset];
+ }
+ else if (offset <= 0x01ffff)
+ {
+ if ((offset > 0x7ff) && !space.debugger_access()) { logerror("Attempt to read banked area (with overlay off) past end of SRAM from offset %08X!\n",offset<<1); }
+ return m_sram_ptr[offset&0x7FF];
+ }
+ if(!space.debugger_access()) { logerror("Attempt to read banked area (with overlay off) past end of SRAM from offset %08X! Returning 0xFFFF!\n",offset<<1); }
+ return 0xFFFF;
+}
+
+WRITE16_MEMBER(lwriter_state::bankedarea_w)
+{
+ if (m_overlay)
+ {
+ if(!space.debugger_access()) { logerror("Attempt to write banked area (with overlay ON) with data %04X to offset %08X IGNORED!\n",data, offset<<1); }
+ return;
+ }
+ else if (offset <= 0x01ffff)
+ {
+ if ((offset > 0x7ff) && !space.debugger_access()) { logerror("Attempt to write banked area (with overlay off) with data %04X to offset %08X!\n",data, offset<<1); }
+ COMBINE_DATA(&m_sram_ptr[offset&0x7FF]);
+ return;
+ }
+ if(!space.debugger_access()) { logerror("Attempt to write banked area (with overlay off) with data %04X to offset %08X IGNORED!\n", data, offset<<1); }
+}
+
+/* 4 diagnostic LEDs, plus 4 i/o lines for the printer */
+WRITE8_MEMBER(lwriter_state::led_out_w)
+{
+ //popmessage("LED status: %02X\n", data&0xFF);
+ logerror("LED status: %02X\n", data&0xFF);
+ popmessage("LED status: %x %x %x %x %x %x %x %x\n", data&0x80, data&0x40, data&0x20, data&0x10, data&0x8, data&0x4, data&0x2, data&0x1);
+}
+
+/* FIFO to printer, 64 bytes long */
+WRITE8_MEMBER(lwriter_state::fifo_out_w)
+{
+ /** TODO: actually emulate this */
+ logerror("FIFO written with: %02X\n", data&0xFF);
+}
+
+/* via stuff */
+READ8_MEMBER(lwriter_state::via_pa_r)
+{
+ logerror(" VIA: Port A read!\n");
+ return 0xFF;
+}
+
+WRITE8_MEMBER(lwriter_state::via_pa_w)
+{
+ logerror(" VIA: Port A written with data of 0x%02x!\n", data);
+}
+
+WRITE_LINE_MEMBER(lwriter_state::via_ca2_w)
+{
+ logerror(" VIA: CA2 written with %d!\n", state);
}
-void lwriter_state::machine_reset ()
+READ8_MEMBER(lwriter_state::via_pb_r)
{
- /* Reset pointer to bootvector in ROM for bootvector handler bootvect_r */
- if (m_sysrom == &m_sysram[0]) /* Condition needed because memory map is not setup first time */
- m_sysrom = (uint16_t*)(memregion ("roms")->base ());
+ logerror(" VIA: Port B read!\n");
+ return 0xFF;
}
-/* Boot vector handler, the PCB hardwires the first 8 bytes from 0xff800000 to 0x0 at reset*/
-READ16_MEMBER (lwriter_state::bootvect_r){
- return m_sysrom[offset];
+WRITE8_MEMBER(lwriter_state::via_pb_w)
+{
+ logerror(" VIA: Port B written with data of 0x%02x!\n", data);
+ /* Like early Mac models which had VIA A4 control overlaying, the
+ * LaserWriter II NT overlay is controlled by VIA B3 */
+ m_overlay = BIT(data,3);
}
-WRITE16_MEMBER (lwriter_state::bootvect_w){
- m_sysram[offset % sizeof(m_sysram)] &= ~mem_mask;
- m_sysram[offset % sizeof(m_sysram)] |= (data & mem_mask);
- m_sysrom = &m_sysram[0]; // redirect all upcomming accesses to masking RAM until reset.
+WRITE_LINE_MEMBER (lwriter_state::via_cb1_w)
+{
+ logerror(" VIA: CB1 written with %d!\n", state);
}
+WRITE_LINE_MEMBER(lwriter_state::via_cb2_w)
+{
+ logerror(" VIA: CB2 written with %d!\n", state);
+}
+
+WRITE_LINE_MEMBER(lwriter_state::via_int_w)
+{
+ logerror(" VIA: INT output set to %d!\n", state);
+ //TODO: this is likely wrong, the VPA pin which controls whether autovector is enabled or not is controlled by PAL U8D, which is not dumped.
+ m_maincpu->set_input_line_and_vector(M68K_IRQ_1, (state ? ASSERT_LINE : CLEAR_LINE), M68K_INT_ACK_AUTOVECTOR);
+}
+
+/* scc stuff */
+/*
+WRITE_LINE_MEMBER(lwriter_state::scc_int)
+{
+ logerror(" SCC: INT output set to %d!\n", state);
+ //m_via->set_input_line(VIA_CA1, state ? ASSERT_LINE : CLEAR_LINE);
+ m_via->write_ca1(state);
+}*/
+
#define CPU_CLK (XTAL_22_3210MHz / 2) // Based on pictures form here: http://picclick.co.uk/Apple-Postscript-LaserWriter-IINT-Printer-640-4105-M6009-Mainboard-282160713108.html#&gid=1&pid=7
#define RXC_CLK ((CPU_CLK - (87 * 16 * 70)) / 3) // Tuned to get 9600 baud according to manual, needs rework based on real hardware
@@ -167,6 +361,9 @@ static MACHINE_CONFIG_START( lwriter, lwriter_state )
MCFG_Z80SCC_OUT_TXDB_CB(DEVWRITELINE("rs232b", rs232_port_device, write_txd))
MCFG_Z80SCC_OUT_DTRB_CB(DEVWRITELINE("rs232b", rs232_port_device, write_dtr))
MCFG_Z80SCC_OUT_RTSB_CB(DEVWRITELINE("rs232b", rs232_port_device, write_rts))
+ /* Interrupt */
+ MCFG_Z80SCC_OUT_INT_CB(DEVWRITELINE("via", via6522_device, write_ca1))
+ //MCFG_Z80SCC_OUT_INT_CB(WRITELINE(lwriter_state, scc_int))
MCFG_RS232_PORT_ADD ("rs232a", default_rs232_devices, "terminal")
MCFG_RS232_RXD_HANDLER (DEVWRITELINE ("scc", scc8530_device, rxa_w))
@@ -180,6 +377,14 @@ static MACHINE_CONFIG_START( lwriter, lwriter_state )
MCFG_DEVICE_ADD("tpi", TPI6525, 0)
#else
MCFG_DEVICE_ADD("via", VIA6522, 0)
+ MCFG_VIA6522_READPA_HANDLER(READ8(lwriter_state, via_pa_r))
+ MCFG_VIA6522_READPB_HANDLER(READ8(lwriter_state, via_pb_r))
+ MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(lwriter_state, via_pa_w))
+ MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(lwriter_state, via_pb_w))
+ MCFG_VIA6522_CB1_HANDLER(WRITELINE(lwriter_state, via_cb1_w))
+ MCFG_VIA6522_CA2_HANDLER(WRITELINE(lwriter_state, via_ca2_w))
+ MCFG_VIA6522_CB2_HANDLER(WRITELINE(lwriter_state, via_cb2_w))
+ MCFG_VIA6522_IRQ_HANDLER(WRITELINE(lwriter_state, via_int_w))
#endif
MACHINE_CONFIG_END
@@ -214,17 +419,20 @@ MACHINE_CONFIG_END
* - last three loops
*/
+
ROM_START(lwriter)
- ROM_REGION16_BE (0x1000000, "roms", 0)
-
- ROM_LOAD16_BYTE ("342-0545.l0", 0x000001, 0x20000, CRC (6431742d) SHA1 (040bd5b84b49b86f2b0fe9ece378bbc7a10a94ec))
- ROM_LOAD16_BYTE ("342-0546.h0", 0x000000, 0x20000, CRC (c592bfb7) SHA1 (b595ae225238f7fabd1566a3133ea6154e082e2d))
- ROM_LOAD16_BYTE ("342-0547.l1", 0x040001, 0x20000, CRC (205a5ea8) SHA1 (205fefbb5c67a07d57cb6184c69648321a34a8fe))
- ROM_LOAD16_BYTE ("342-0548.h1", 0x040000, 0x20000, CRC (f616e1c3) SHA1 (b9e2cd4d07990b2d1936be97b6e89ef21f06b462))
- ROM_LOAD16_BYTE ("342-0549.l2", 0x080001, 0x20000, CRC (0b0b051a) SHA1 (64a80085001570c3f99d9865031715bf49bd7698))
- ROM_LOAD16_BYTE ("342-0550.h2", 0x080000, 0x20000, CRC (82adcf85) SHA1 (e2ab728afdae802c0c67fc25c9ba278b9cb04e31))
- ROM_LOAD16_BYTE ("342-0551.l3", 0x0c0001, 0x20000, CRC (176b3346) SHA1 (eb8dfc7e44f2bc884097e51a47e2f10ee091c9e9))
- ROM_LOAD16_BYTE ("342-0552.h3", 0x0c0000, 0x20000, CRC (69b175c6) SHA1 (a84c82be1ec7e373bb097ee74b941920a3b091aa))
+ ROM_REGION16_BE( 0x200000, "rom", ROMREGION_ERASEFF )
+ ROM_LOAD16_BYTE("342-0545.l0", 0x000001, 0x20000, CRC (6431742d) SHA1 (040bd5b84b49b86f2b0fe9ece378bbc7a10a94ec)) // Label: "342-0545-A JAPAN // TC531000CP-F700 // (C) 87 APPLE 8940EAI // (C) 83-87 ADOBE V47.0 // (C) 81 LINOTYPE" TC531000 @L0
+ ROM_LOAD16_BYTE("342-0546.h0", 0x000000, 0x20000, CRC (c592bfb7) SHA1 (b595ae225238f7fabd1566a3133ea6154e082e2d)) // Label: "342-0546-A JAPAN // TC531000CP-F701 // (C) 87 APPLE 8940EAI // (C) 83-87 ADOBE V47.0 // (C) 81 LINOTYPE" TC531000 @H0
+ ROM_LOAD16_BYTE("342-0547.l1", 0x040001, 0x20000, CRC (205a5ea8) SHA1 (205fefbb5c67a07d57cb6184c69648321a34a8fe)) // Label: "342-0547-A JAPAN // TC531000CP-F702 // (C) 87 APPLE 8940EAI // (C) 83-87 ADOBE V47.0 // (C) 81 LINOTYPE" TC531000 @L1
+ ROM_LOAD16_BYTE("342-0548.h1", 0x040000, 0x20000, CRC (f616e1c3) SHA1 (b9e2cd4d07990b2d1936be97b6e89ef21f06b462)) // Label: "342-0548-A JAPAN // TC531000CP-F703 // (C) 87 APPLE 8940EAI // (C) 83-87 ADOBE V47.0 // (C) 81 LINOTYPE" TC531000 @H1
+ ROM_LOAD16_BYTE("342-0549.l2", 0x080001, 0x20000, CRC (0b0b051a) SHA1 (64a80085001570c3f99d9865031715bf49bd7698)) // Label: "342-0549-A JAPAN // TC531000CP-F704 // (C) 87 APPLE 8940EAI // (C) 83-87 ADOBE V47.0 // (C) 81 LINOTYPE" TC531000 @L2
+ ROM_LOAD16_BYTE("342-0550.h2", 0x080000, 0x20000, CRC (82adcf85) SHA1 (e2ab728afdae802c0c67fc25c9ba278b9cb04e31)) // Label: "342-0550-A JAPAN // TC531000CP-F705 // (C) 87 APPLE 8940EAI // (C) 83-87 ADOBE V47.0 // (C) 81 LINOTYPE" TC531000 @H2
+ ROM_LOAD16_BYTE("342-0551.l3", 0x0c0001, 0x20000, CRC (176b3346) SHA1 (eb8dfc7e44f2bc884097e51a47e2f10ee091c9e9)) // Label: "342-0551-A JAPAN // TC531000CP-F706 // (C) 87 APPLE 8940EAI // (C) 83-87 ADOBE V47.0 // (C) 81 LINOTYPE" TC531000 @L3
+ ROM_LOAD16_BYTE("342-0552.h3", 0x0c0000, 0x20000, CRC (69b175c6) SHA1 (a84c82be1ec7e373bb097ee74b941920a3b091aa)) // Label: "342-0552-A JAPAN // TC531000CP-F707 // (C) 87 APPLE 8940EAI // (C) 83-87 ADOBE V47.0 // (C) 81 LINOTYPE" TC531000 @H3
+ ROM_REGION( 0x200000, "dram", ROMREGION_ERASEFF )
+ ROM_REGION( 0x1000, "sram", ROMREGION_ERASEFF )
+
ROM_END
/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT, COMPANY, FULLNAME, FLAGS */
diff --git a/src/mame/drivers/m6805evs.cpp b/src/mame/drivers/m6805evs.cpp
index bec8b22e84b..f42260193ce 100644
--- a/src/mame/drivers/m6805evs.cpp
+++ b/src/mame/drivers/m6805evs.cpp
@@ -6,28 +6,63 @@ Motorola M68HC05EVS evaluation system
Chips:
Main board: XC68HC26P, R65C52P2, MS62256l-70PC, MS6264L-70PC, eprom. Xtal = 3.6864MHz
-Emulator board: MC68C705P9CP, undumped 28-pin prom. Xtal = 4MHz
+Emulator board: MC68HC705P9CP, undumped 28-pin prom. Xtal = 4MHz
R65C52 = Dual ACIA with inbuilt baud rate divider, uses 8 addresses, uses the 3.6864MHz crystal
XC68HC26P = PPI (3 ports), uses 8 addresses.
2014-01-12 Skeleton driver
-The rom is larger than the available address space, but not all of it is programmed. The code
-ranges are 800-18FF,1FF0-1FFF. There must be a banking scheme in use.
+Memory map:
+0000, 0000 PORTA Port A data register
+0001, 0001 PORTB Port B data register
+0002, 0002 PORTC Port C data register
+0003, 0003 PORTD Port D data register
+0004, 0004 DDRA Data direction register A
+0005, 0005 DDRB Data direction register B
+0006, 0006 DDRC Data direction register C
+0007, 0007 DDRD Data direction register D
+0008, 0009 unimplemented
+000A, 000A SCR SIOP control register
+000B, 000B SSR SIOP status register
+0009, 0009 SDR SIOP data register
+000D, 0011 unimplemented
+0012, 0012 TCR Timer control register
+0013, 0013 TDR Timer data register
+0014, 0014 ICRH Input capture register high
+0015, 0015 ICRL Input capture register low
+0016, 0016 OCRH Output compare register high
+0017, 0017 OCRL Output compare register low
+0018, 0018 TRH Timer register high
+0019, 0019 TRL Timer register low
+001A, 001A ATRH Alternate timer register high
+001B, 001B ATRL Alternate timer register low
+001C, 001C EPROG EPROM programming register
+001D, 001D ADDR ADC data register
+001E, 001E ADSCR ADC status/control register
+001F, 001F reserved
+0020, 004F Page zero user EPROM
+0050, 007F unimplemented
+0080, 00FF RAM
+0100, 08FF User EPROM
+0900, 0900 MOR Mask option register
+0901, 1EFF unimplemented
+1F00, 1FEF Bootloader ROM
+1FF1, 1FF7 reserved
+1FF8, 1FF9 Timer interrupt vector
+1FFA, 1FFB External interrupt vector
+1FFC, 1FFD Software interrupt vector
+1FFE, 1FFF Reset vector
-Memory map guess
-000-07F Stack (and user ram?)
-080-0FF RAM (or devices?)
-100-FFF ROM
ToDo:
+- Add CMOS family support to M6085 CPU core (different timings, different peripherals)
- Everything
******************************************************************************************************/
#include "emu.h"
-#include "cpu/m6805/m68705.h"
+#include "cpu/m6805/m6805.h"
class m6805evs_state : public driver_device
@@ -45,10 +80,15 @@ private:
static ADDRESS_MAP_START( m6805evs_mem, AS_PROGRAM, 8, m6805evs_state )
- AM_RANGE(0x0000, 0x00ff) AM_RAM
- AM_RANGE(0x0100, 0x07ff) AM_ROM AM_REGION("roms", 0x1100)
- AM_RANGE(0x0800, 0x0fef) AM_ROM AM_REGION("roms", 0x0800)
- AM_RANGE(0x0ff0, 0x0fff) AM_ROM AM_REGION("roms", 0x1ff0)
+ ADDRESS_MAP_GLOBAL_MASK(0x1fff)
+ ADDRESS_MAP_UNMAP_HIGH
+
+ // AM_RANGE(0x0000, 0x001f) I/O registers live here
+ AM_RANGE(0x0020, 0x004f) AM_ROM AM_REGION("eprom", 0x0020)
+ AM_RANGE(0x0080, 0x00ff) AM_RAM
+ AM_RANGE(0x0100, 0x0900) AM_ROM AM_REGION("eprom", 0x0100)
+ // AM_RANGE(0x1f00, 0x1fef) bootloader ROM lives here
+ AM_RANGE(0x1ff8, 0x1fff) AM_ROM AM_REGION("eprom", 0x1ff0)
ADDRESS_MAP_END
static INPUT_PORTS_START( m6805evs )
@@ -60,12 +100,12 @@ void m6805evs_state::machine_reset()
static MACHINE_CONFIG_START( m6805evs, m6805evs_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", M68705, XTAL_4MHz)
+ MCFG_CPU_ADD("maincpu", M6805, XTAL_4MHz)
MCFG_CPU_PROGRAM_MAP(m6805evs_mem)
MACHINE_CONFIG_END
ROM_START(m6805evs)
- ROM_REGION(0x2000, "roms", 0)
+ ROM_REGION(0x2000, "eprom", 0)
ROM_LOAD( "evsbug12.bin", 0x0000, 0x2000, CRC(8b581aef) SHA1(eacf425cc8a042085ccc4097cc61570b633b1e38) )
ROM_END
diff --git a/src/mame/drivers/marineb.cpp b/src/mame/drivers/marineb.cpp
index d01ce880e39..f6b2133a475 100644
--- a/src/mame/drivers/marineb.cpp
+++ b/src/mame/drivers/marineb.cpp
@@ -94,8 +94,8 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( wanted_io_map, AS_IO, 8, marineb_state )
ADDRESS_MAP_GLOBAL_MASK(0xff)
- AM_RANGE(0x00, 0x01) AM_DEVWRITE("ay1", ay8910_device, address_data_w)
- AM_RANGE(0x02, 0x03) AM_DEVWRITE("ay2", ay8910_device, address_data_w)
+ AM_RANGE(0x00, 0x01) AM_DEVWRITE("ay1", ay8912_device, address_data_w)
+ AM_RANGE(0x02, 0x03) AM_DEVWRITE("ay2", ay8912_device, address_data_w)
ADDRESS_MAP_END
@@ -605,11 +605,11 @@ static MACHINE_CONFIG_DERIVED( wanted, marineb )
MCFG_SCREEN_MODIFY("screen")
MCFG_SCREEN_UPDATE_DRIVER(marineb_state, screen_update_springer)
- /* sound hardware */
- MCFG_SOUND_REPLACE("ay1", AY8910, 1500000)
+ // sound hardware (PSG type verified only for bcruzm12)
+ MCFG_SOUND_REPLACE("ay1", AY8912, 1500000)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
- MCFG_SOUND_ADD("ay2", AY8910, 1500000)
+ MCFG_SOUND_ADD("ay2", AY8912, 1500000)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
MACHINE_CONFIG_END
@@ -807,6 +807,9 @@ All roms type 2764
Both proms type MB7052 (compatible to 82s129)
RAM: 1 x 8416, 1 x AM9122, 2 x D2125, 4 x M5L2114
+The topmost row is entirely unpopulated. This includes a space (at 19D) for
+a MC68705P3.
+
PCB Layout:
NECD780C D-84_4 D-84_5 D-84_6 D-84_7
@@ -833,8 +836,8 @@ ROM_START( bcruzm12 )
ROM_LOAD( "d-84_4.17ef", 0x2000, 0x2000, CRC(fe186459) SHA1(3b0ee1fe98c835271f5b67de5ca0507827e25d71) )
ROM_REGION( 0x4000, "gfx2", 0 )
- ROM_LOAD( "d-84_7.17h", 0x0000, 0x2000, CRC(a5be90ef) SHA1(6037d924296ba62999aafe665396fef142d73df2) )
- ROM_LOAD( "d-84_6.17fh", 0x2000, 0x2000, CRC(1337dc01) SHA1(c55bfc6dd15a499dd71da0acc5016035a7c51f16) )
+ ROM_LOAD( "d-84_6.17fh", 0x0000, 0x2000, CRC(1337dc01) SHA1(c55bfc6dd15a499dd71da0acc5016035a7c51f16) )
+ ROM_LOAD( "d-84_7.17h", 0x2000, 0x2000, CRC(a5be90ef) SHA1(6037d924296ba62999aafe665396fef142d73df2) )
ROM_REGION( 0x0200, "proms", 0 )
ROM_LOAD( "bcm12col.7k", 0x0000, 0x0100, CRC(bf4f2671) SHA1(dde6da568ecf0121910f4b507c83fe6230b07c8d) ) /* palette low 4 bits */
diff --git a/src/mame/drivers/maxaflex.cpp b/src/mame/drivers/maxaflex.cpp
index a5760a9e949..aa86318b42c 100644
--- a/src/mame/drivers/maxaflex.cpp
+++ b/src/mame/drivers/maxaflex.cpp
@@ -13,12 +13,16 @@
******************************************************************************/
#include "emu.h"
+#include "includes/atari400.h"
+
#include "cpu/m6502/m6502.h"
#include "cpu/m6805/m68705.h"
-#include "includes/atari400.h"
+
+#include "machine/6821pia.h"
+
#include "sound/speaker.h"
#include "sound/pokey.h"
-#include "machine/6821pia.h"
+
#include "video/gtia.h"
#include "maxaflex.lh"
@@ -28,54 +32,37 @@ class maxaflex_state : public atari_common_state
{
public:
maxaflex_state(const machine_config &mconfig, device_type type, const char *tag)
- : atari_common_state(mconfig, type, tag),
- m_mcu(*this, "mcu"),
- m_speaker(*this, "speaker"),
- m_region_maincpu(*this, "maincpu"),
- m_dsw(*this, "dsw"),
- m_coin(*this, "coin"),
- m_console(*this, "console"),
- m_joy01(*this, "djoy_0_1"),
- m_joy23(*this, "djoy_2_3")
- { }
-
- uint8_t m_portA_in;
- uint8_t m_portA_out;
- uint8_t m_ddrA;
- uint8_t m_portB_in;
+ : atari_common_state(mconfig, type, tag)
+ , m_mcu(*this, "mcu")
+ , m_speaker(*this, "speaker")
+ , m_region_maincpu(*this, "maincpu")
+ , m_dsw(*this, "dsw")
+ , m_coin(*this, "coin")
+ , m_console(*this, "console")
+ , m_joy01(*this, "djoy_0_1")
+ , m_joy23(*this, "djoy_2_3")
+ {
+ }
+
uint8_t m_portB_out;
- uint8_t m_ddrB;
- uint8_t m_portC_in;
uint8_t m_portC_out;
- uint8_t m_ddrC;
- uint8_t m_tdr;
- uint8_t m_tcr;
- timer_device *m_mcu_timer;
- void mmu(uint8_t new_mmu);
DECLARE_READ8_MEMBER(mcu_portA_r);
DECLARE_WRITE8_MEMBER(mcu_portA_w);
- DECLARE_READ8_MEMBER(mcu_portB_r);
DECLARE_WRITE8_MEMBER(mcu_portB_w);
- DECLARE_READ8_MEMBER(mcu_portC_r);
DECLARE_WRITE8_MEMBER(mcu_portC_w);
- DECLARE_READ8_MEMBER(mcu_ddr_r);
- DECLARE_WRITE8_MEMBER(mcu_portA_ddr_w);
- DECLARE_WRITE8_MEMBER(mcu_portB_ddr_w);
- DECLARE_WRITE8_MEMBER(mcu_portC_ddr_w);
- DECLARE_READ8_MEMBER(mcu_tdr_r);
- DECLARE_WRITE8_MEMBER(mcu_tdr_w);
- DECLARE_READ8_MEMBER(mcu_tcr_r);
- DECLARE_WRITE8_MEMBER(mcu_tcr_w);
DECLARE_INPUT_CHANGED_MEMBER(coin_inserted);
DECLARE_READ8_MEMBER(pia_pa_r);
DECLARE_READ8_MEMBER(pia_pb_r);
WRITE8_MEMBER(pia_pb_w) { mmu(data); }
WRITE_LINE_MEMBER(pia_cb2_w) { } // This is used by Floppy drive on Atari 8bits Home Computers
TIMER_DEVICE_CALLBACK_MEMBER(mf_interrupt);
- TIMER_DEVICE_CALLBACK_MEMBER(mcu_timer_proc);
- int atari_input_disabled();
+
+protected:
virtual void machine_reset() override;
- //required_device<cpu_device> m_maincpu; // maincpu is already contained in atari_common_state
+
+ bool atari_input_disabled() const { return !BIT(m_portB_out, 7); }
+ void mmu(uint8_t new_mmu);
+
required_device<cpu_device> m_mcu;
required_device<speaker_sound_device> m_speaker;
required_region_ptr<uint8_t> m_region_maincpu;
@@ -120,14 +107,16 @@ void maxaflex_state::mmu(uint8_t new_mmu)
READ8_MEMBER(maxaflex_state::mcu_portA_r)
{
- m_portA_in = m_dsw->read() | (m_coin->read() << 4) | (m_console->read() << 5);
- return (m_portA_in & ~m_ddrA) | (m_portA_out & m_ddrA);
+ return
+ ((m_dsw->read() << 0) & 0x0f) |
+ ((m_coin->read() << 4) & 0x10) |
+ ((m_console->read() << 5) & 0x20) |
+ 0xc0;
}
WRITE8_MEMBER(maxaflex_state::mcu_portA_w)
{
- m_portA_out = data;
- m_speaker->level_w(data >> 7);
+ m_speaker->level_w(BIT(data, 7));
}
/* Port B:
@@ -141,34 +130,29 @@ WRITE8_MEMBER(maxaflex_state::mcu_portA_w)
7 (out) TOFF - enables/disables user controls
*/
-READ8_MEMBER(maxaflex_state::mcu_portB_r)
-{
- return (m_portB_in & ~m_ddrB) | (m_portB_out & m_ddrB);
-}
-
WRITE8_MEMBER(maxaflex_state::mcu_portB_w)
{
- uint8_t diff = data ^ m_portB_out;
+ const uint8_t diff = data ^ m_portB_out;
m_portB_out = data;
/* clear coin interrupt */
- if (data & 0x04)
- m_mcu->set_input_line(M6805_IRQ_LINE, CLEAR_LINE );
-
- /* AUDMUTE */
- machine().sound().system_enable((data >> 5) & 1);
+ if (BIT(data, 2))
+ m_mcu->set_input_line(M6805_IRQ_LINE, CLEAR_LINE);
/* RES600 */
- if (diff & 0x10)
- m_maincpu->set_input_line(INPUT_LINE_RESET, (data & 0x10) ? CLEAR_LINE : ASSERT_LINE);
+ if (BIT(diff, 4))
+ m_maincpu->set_input_line(INPUT_LINE_RESET, BIT(data, 4) ? CLEAR_LINE : ASSERT_LINE);
+
+ /* AUDMUTE */
+ machine().sound().system_enable(BIT(data, 5));
/* latch for lamps */
- if ((diff & 0x40) && !(data & 0x40))
+ if (BIT(diff, 6) && !BIT(data, 6))
{
- output().set_lamp_value(0, (m_portC_out >> 0) & 1);
- output().set_lamp_value(1, (m_portC_out >> 1) & 1);
- output().set_lamp_value(2, (m_portC_out >> 2) & 1);
- output().set_lamp_value(3, (m_portC_out >> 3) & 1);
+ output().set_lamp_value(0, BIT(m_portC_out, 0));
+ output().set_lamp_value(1, BIT(m_portC_out, 1));
+ output().set_lamp_value(2, BIT(m_portC_out, 2));
+ output().set_lamp_value(3, BIT(m_portC_out, 3));
}
}
@@ -178,117 +162,28 @@ WRITE8_MEMBER(maxaflex_state::mcu_portB_w)
2 (out) lamp START
3 (out) lamp OVER */
-READ8_MEMBER(maxaflex_state::mcu_portC_r)
-{
- return (m_portC_in & ~m_ddrC) | (m_portC_out & m_ddrC);
-}
-
WRITE8_MEMBER(maxaflex_state::mcu_portC_w)
{
/* uses a 7447A, which is equivalent to an LS47/48 */
- static const uint8_t ls48_map[16] =
- { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0x58,0x4c,0x62,0x69,0x78,0x00 };
+ constexpr static uint8_t ls48_map[16] =
+ { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67, 0x58, 0x4c, 0x62, 0x69, 0x78, 0x00 };
m_portC_out = data & 0x0f;
/* displays */
- switch( m_portB_out & 0x3 )
+ switch (m_portB_out & 0x03)
{
- case 0x0: output().set_digit_value(0, ls48_map[m_portC_out]); break;
- case 0x1: output().set_digit_value(1, ls48_map[m_portC_out]); break;
- case 0x2: output().set_digit_value(2, ls48_map[m_portC_out]); break;
- case 0x3: break;
- }
-}
-
-READ8_MEMBER(maxaflex_state::mcu_ddr_r)
-{
- return 0xff;
-}
-
-WRITE8_MEMBER(maxaflex_state::mcu_portA_ddr_w)
-{
- m_ddrA = data;
-}
-
-WRITE8_MEMBER(maxaflex_state::mcu_portB_ddr_w)
-{
- m_ddrB = data;
-}
-
-WRITE8_MEMBER(maxaflex_state::mcu_portC_ddr_w)
-{
- m_ddrC = data;
-}
-
-TIMER_DEVICE_CALLBACK_MEMBER(maxaflex_state::mcu_timer_proc)
-{
- if ( --m_tdr == 0x00 )
- {
- if ( (m_tcr & 0x40) == 0 )
- {
- //timer interrupt!
- generic_pulse_irq_line(*m_mcu, M68705_INT_TIMER, 1);
- }
- }
-}
-
-/* Timer Data Reg */
-READ8_MEMBER(maxaflex_state::mcu_tdr_r)
-{
- return m_tdr;
-}
-
-WRITE8_MEMBER(maxaflex_state::mcu_tdr_w)
-{
- m_tdr = data;
-}
-
-/* Timer control reg */
-READ8_MEMBER(maxaflex_state::mcu_tcr_r)
-{
- return m_tcr & ~0x08;
-}
-
-WRITE8_MEMBER(maxaflex_state::mcu_tcr_w)
-{
- m_tcr = data;
- if ( (m_tcr & 0x40) == 0 )
- {
- int divider;
- attotime period;
-
- if ( !(m_tcr & 0x20) )
- {
- /* internal clock / 4*/
- divider = 4;
- }
- else
- {
- /* external clock */
- divider = 1;
- }
-
- if ( m_tcr & 0x07 )
- {
- /* use prescaler */
- divider = divider * (1 << (m_tcr & 0x7));
- }
-
- period = attotime::from_hz(3579545) * divider;
- m_mcu_timer->adjust(period, 0, period);
+ case 0x0: output().set_digit_value(0, ls48_map[m_portC_out]); break;
+ case 0x1: output().set_digit_value(1, ls48_map[m_portC_out]); break;
+ case 0x2: output().set_digit_value(2, ls48_map[m_portC_out]); break;
+ case 0x3: break;
}
}
INPUT_CHANGED_MEMBER(maxaflex_state::coin_inserted)
{
if (!newval)
- m_mcu->set_input_line(M6805_IRQ_LINE, HOLD_LINE );
-}
-
-int maxaflex_state::atari_input_disabled()
-{
- return (m_portB_out & 0x80) == 0x00;
+ m_mcu->set_input_line(M6805_IRQ_LINE, ASSERT_LINE);
}
@@ -307,20 +202,6 @@ static ADDRESS_MAP_START(a600xl_mem, AS_PROGRAM, 8, maxaflex_state )
AM_RANGE(0xd800, 0xffff) AM_ROM /* OS */
ADDRESS_MAP_END
-static ADDRESS_MAP_START( mcu_mem, AS_PROGRAM, 8, maxaflex_state )
- ADDRESS_MAP_GLOBAL_MASK(0x7ff)
- AM_RANGE(0x0000, 0x0000) AM_READ(mcu_portA_r) AM_WRITE(mcu_portA_w)
- AM_RANGE(0x0001, 0x0001) AM_READ(mcu_portB_r) AM_WRITE(mcu_portB_w)
- AM_RANGE(0x0002, 0x0002) AM_READ(mcu_portC_r) AM_WRITE(mcu_portC_w)
- AM_RANGE(0x0004, 0x0004) AM_READ(mcu_ddr_r) AM_WRITE(mcu_portA_ddr_w)
- AM_RANGE(0x0005, 0x0005) AM_READ(mcu_ddr_r) AM_WRITE(mcu_portB_ddr_w)
- AM_RANGE(0x0006, 0x0006) AM_READ(mcu_ddr_r) AM_WRITE(mcu_portC_ddr_w)
- AM_RANGE(0x0008, 0x0008) AM_READ(mcu_tdr_r) AM_WRITE(mcu_tdr_w)
- AM_RANGE(0x0009, 0x0009) AM_READ(mcu_tcr_r) AM_WRITE(mcu_tcr_w)
- AM_RANGE(0x0010, 0x007f) AM_RAM
- AM_RANGE(0x0080, 0x07ff) AM_ROM
-ADDRESS_MAP_END
-
static INPUT_PORTS_START( a600xl )
@@ -363,7 +244,7 @@ static INPUT_PORTS_START( a600xl )
/* Max-A-Flex specific ports */
PORT_START("coin")
- PORT_BIT(0x1, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, maxaflex_state,coin_inserted, 0)
+ PORT_BIT(0x1, IP_ACTIVE_LOW, IPT_COIN1) PORT_CHANGED_MEMBER(DEVICE_SELF, maxaflex_state, coin_inserted, 0)
PORT_START("dsw")
PORT_DIPNAME(0xf, 0x9, "Coin/Time" )
@@ -404,11 +285,8 @@ void maxaflex_state::machine_reset()
pokey->write(15,0);
// Supervisor board reset
- m_portA_in = m_portA_out = m_ddrA = 0;
- m_portB_in = m_portB_out = m_ddrB = 0;
- m_portC_in = m_portC_out = m_ddrC = 0;
- m_tdr = m_tcr = 0;
- m_mcu_timer = machine().device<timer_device>("mcu_timer");
+ m_portB_out = 0xff;
+ m_portC_out = 0xff;
output().set_lamp_value(0, 0);
output().set_lamp_value(1, 0);
@@ -430,8 +308,11 @@ static MACHINE_CONFIG_START( maxaflex, maxaflex_state )
MCFG_CPU_PROGRAM_MAP(a600xl_mem)
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", maxaflex_state, mf_interrupt, "screen", 0, 1)
- MCFG_CPU_ADD("mcu", M68705, 3579545)
- MCFG_CPU_PROGRAM_MAP(mcu_mem)
+ MCFG_CPU_ADD("mcu", M68705P3, 3579545)
+ MCFG_M68705_PORTA_R_CB(READ8(maxaflex_state, mcu_portA_r))
+ MCFG_M68705_PORTA_W_CB(WRITE8(maxaflex_state, mcu_portA_w))
+ MCFG_M68705_PORTB_W_CB(WRITE8(maxaflex_state, mcu_portB_w))
+ MCFG_M68705_PORTC_W_CB(WRITE8(maxaflex_state, mcu_portC_w))
MCFG_DEVICE_ADD("gtia", ATARI_GTIA, 0)
MCFG_GTIA_READ_CB(IOPORT("console"))
@@ -445,8 +326,6 @@ static MACHINE_CONFIG_START( maxaflex, maxaflex_state )
MCFG_PIA_WRITEPB_HANDLER(WRITE8(maxaflex_state, pia_pb_w))
MCFG_PIA_CB2_HANDLER(WRITELINE(maxaflex_state, pia_cb2_w))
- MCFG_TIMER_DRIVER_ADD("mcu_timer", maxaflex_state, mcu_timer_proc)
-
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
@@ -536,7 +415,7 @@ ROM_END
GAME( 1984, maxaflex, 0, maxaflex, a600xl, driver_device, 0, ROT0, "Exidy", "Max-A-Flex", MACHINE_IS_BIOS_ROOT )
-GAME( 1982, mf_achas, maxaflex, maxaflex, a600xl, driver_device, 0, ROT0, "Exidy / First Star Software", "Astro Chase (Max-A-Flex)", 0 )
-GAME( 1983, mf_brist, maxaflex, maxaflex, a600xl, driver_device, 0, ROT0, "Exidy / First Star Software", "Bristles (Max-A-Flex)", 0 )
-GAME( 1983, mf_flip, maxaflex, maxaflex, a600xl, driver_device, 0, ROT0, "Exidy / First Star Software", "Flip & Flop (Max-A-Flex)", 0 )
+GAME( 1982, mf_achas, maxaflex, maxaflex, a600xl, driver_device, 0, ROT0, "Exidy / First Star Software", "Astro Chase (Max-A-Flex)", 0 )
+GAME( 1983, mf_brist, maxaflex, maxaflex, a600xl, driver_device, 0, ROT0, "Exidy / First Star Software", "Bristles (Max-A-Flex)", 0 )
+GAME( 1983, mf_flip, maxaflex, maxaflex, a600xl, driver_device, 0, ROT0, "Exidy / First Star Software", "Flip & Flop (Max-A-Flex)", 0 )
GAME( 1984, mf_bdash, maxaflex, maxaflex, a600xl, driver_device, 0, ROT0, "Exidy / First Star Software", "Boulder Dash (Max-A-Flex)", 0 )
diff --git a/src/mame/drivers/metro.cpp b/src/mame/drivers/metro.cpp
index 94f2b2985d4..0c4f68a93a0 100644
--- a/src/mame/drivers/metro.cpp
+++ b/src/mame/drivers/metro.cpp
@@ -94,7 +94,34 @@ Notes:
- Sprite zoom in Mouja at the end of a match looks wrong, but it's been verified
to be the same on the original board
- vmetal: has Sega and Taito logos in the roms ?!
+- vmetal: Many samples in the ADPCM ROM are actually not used.
+ Snd Offset Writes Sample Range
+ 0000 0004 0002 0006 000a 0008 000c
+ -- ---------------------------------- -------------
+ 00 006e 0001 00ab 003c 0002 003a 003a 01ab6e-023a3c
+ 01 003d 0002 003a 001d 0002 007e 007e 023a3d-027e1d
+ 02 00e2 0003 0005 002e 0003 00f3 00f3 0305e2-03f32e
+ 03 000a 0005 001e 00f6 0005 00ec 00ec 051e0a-05ecf6
+ 04 00f7 0005 00ec 008d 0006 0060 0060 05ecf7-06608d
+ 05 0016 0008 002e 0014 0009 0019 0019 082e16-091914
+ 06 0015 0009 0019 0094 000b 0015 0015 091915-0b1594
+ 07 0010 000d 0012 00bf 000d 0035 0035 0d1210-0d35bf
+ 08 00ce 000e 002f 0074 000f 0032 0032 0e2fce-0f3274
+ 09 0000 0000 0000 003a 0000 007d 007d 000000-007d3a
+ 0a 0077 0000 00fa 008d 0001 00b6 00b6 00fa77-01b68d
+ 0b 008e 0001 00b6 00b3 0002 0021 0021 01b68e-0221b3
+ 0c 0062 0002 00f7 0038 0003 00de 00de 02f762-03de38
+ 0d 00b9 0005 00ab 00ef 0006 0016 0016 05abb9-0616ef
+ 0e 00dd 0007 0058 00db 0008 001a 001a 0758dd-081adb
+ 0f 00dc 0008 001a 002e 0008 008a 008a 081adc-088a2e
+ 10 00db 0009 00d7 00ff 000a 0046 0046 09d7db-0a46ff
+ 11 0077 000c 0003 006d 000c 0080 0080 0c0377-0c806d
+ 12 006e 000c 0080 006c 000d 0002 0002 0c806e-0d026c
+ 13 006d 000d 0002 002b 000d 0041 0041 0d026d-0d412b
+ 14 002c 000d 0041 002a 000d 00be 00be 0d412c-0dbe2a
+ 15 002b 000d 00be 0029 000e 0083 0083 0dbe2b-0e8329
+ 16 002a 000e 0083 00ee 000f 0069 0069 0e832a-0f69ee
driver modified by Hau
***************************************************************************/
@@ -1897,40 +1924,9 @@ WRITE8_MEMBER(metro_state::vmetal_control_w)
logerror("%s: Writing unknown bits %04x to $200000\n",machine().describe_context(),data);
}
-WRITE8_MEMBER(metro_state::vmetal_es8712_w)
+WRITE8_MEMBER(metro_state::vmetal_se_control_w)
{
- /* Many samples in the ADPCM ROM are actually not used.
-
- Snd Offset Writes Sample Range
- 0000 0004 0002 0006 000a 0008 000c
- -- ---------------------------------- -------------
- 00 006e 0001 00ab 003c 0002 003a 003a 01ab6e-023a3c
- 01 003d 0002 003a 001d 0002 007e 007e 023a3d-027e1d
- 02 00e2 0003 0005 002e 0003 00f3 00f3 0305e2-03f32e
- 03 000a 0005 001e 00f6 0005 00ec 00ec 051e0a-05ecf6
- 04 00f7 0005 00ec 008d 0006 0060 0060 05ecf7-06608d
- 05 0016 0008 002e 0014 0009 0019 0019 082e16-091914
- 06 0015 0009 0019 0094 000b 0015 0015 091915-0b1594
- 07 0010 000d 0012 00bf 000d 0035 0035 0d1210-0d35bf
- 08 00ce 000e 002f 0074 000f 0032 0032 0e2fce-0f3274
- 09 0000 0000 0000 003a 0000 007d 007d 000000-007d3a
- 0a 0077 0000 00fa 008d 0001 00b6 00b6 00fa77-01b68d
- 0b 008e 0001 00b6 00b3 0002 0021 0021 01b68e-0221b3
- 0c 0062 0002 00f7 0038 0003 00de 00de 02f762-03de38
- 0d 00b9 0005 00ab 00ef 0006 0016 0016 05abb9-0616ef
- 0e 00dd 0007 0058 00db 0008 001a 001a 0758dd-081adb
- 0f 00dc 0008 001a 002e 0008 008a 008a 081adc-088a2e
- 10 00db 0009 00d7 00ff 000a 0046 0046 09d7db-0a46ff
- 11 0077 000c 0003 006d 000c 0080 0080 0c0377-0c806d
- 12 006e 000c 0080 006c 000d 0002 0002 0c806e-0d026c
- 13 006d 000d 0002 002b 000d 0041 0041 0d026d-0d412b
- 14 002c 000d 0041 002a 000d 00be 00be 0d412c-0dbe2a
- 15 002b 000d 00be 0029 000e 0083 0083 0dbe2b-0e8329
- 16 002a 000e 0083 00ee 000f 0069 0069 0e832a-0f69ee
- */
-
- m_essnd->es8712_w(space, offset, data);
- logerror("%s: Writing %04x to ES8712 offset %02x\n", machine().describe_context(), data, offset);
+ logerror("%s: Writing %02x to $500000\n", machine().describe_context(), data);
}
static ADDRESS_MAP_START( vmetal_map, AS_PROGRAM, 16, metro_state )
@@ -1958,7 +1954,8 @@ static ADDRESS_MAP_START( vmetal_map, AS_PROGRAM, 16, metro_state )
AM_RANGE(0x300000, 0x31ffff) AM_READ(balcube_dsw_r) // DSW x 3
AM_RANGE(0x400000, 0x400001) AM_DEVREADWRITE8("oki", okim6295_device, read, write, 0x00ff )
AM_RANGE(0x400002, 0x400003) AM_DEVWRITE8("oki", okim6295_device, write, 0x00ff)
- AM_RANGE(0x500000, 0x50000d) AM_WRITE8(vmetal_es8712_w, 0x00ff)
+ AM_RANGE(0x500000, 0x500001) AM_WRITE8(vmetal_se_control_w, 0xff00)
+ AM_RANGE(0x500000, 0x50000d) AM_DEVWRITE8("essnd", es8712_device, write, 0x00ff)
AM_RANGE(0xf00000, 0xf0ffff) AM_RAM AM_MIRROR(0x0f0000) // RAM (mirrored)
ADDRESS_MAP_END
diff --git a/src/mame/drivers/micro20.cpp b/src/mame/drivers/micro20.cpp
index 8365956a3c5..8f4f9b7f7f5 100644
--- a/src/mame/drivers/micro20.cpp
+++ b/src/mame/drivers/micro20.cpp
@@ -55,7 +55,7 @@ public:
DECLARE_WRITE_LINE_MEMBER(h4_w);
DECLARE_WRITE8_MEMBER(portb_w);
DECLARE_WRITE8_MEMBER(portc_w);
-
+
DECLARE_WRITE_LINE_MEMBER(timerirq_w)
{
m_maincpu->set_input_line(M68K_IRQ_4, state);
diff --git a/src/mame/drivers/microvsn.cpp b/src/mame/drivers/microvsn.cpp
index 038ecbeba7f..be32aecb1a1 100644
--- a/src/mame/drivers/microvsn.cpp
+++ b/src/mame/drivers/microvsn.cpp
@@ -481,7 +481,7 @@ WRITE16_MEMBER( microvision_state::tms1100_write_r )
}
-static const uint16_t microvision_output_pla_0[0x20] =
+static const u16 microvision_output_pla_0[0x20] =
{
/* O output PLA configuration currently unknown */
0x00, 0x08, 0x04, 0x0C, 0x02, 0x0A, 0x06, 0x0E,
@@ -491,7 +491,7 @@ static const uint16_t microvision_output_pla_0[0x20] =
};
-static const uint16_t microvision_output_pla_1[0x20] =
+static const u16 microvision_output_pla_1[0x20] =
{
/* O output PLA configuration currently unknown */
/* Reversed bit order */
diff --git a/src/mame/drivers/miniforce.cpp b/src/mame/drivers/miniforce.cpp
index 7b9d2a50274..141276284a8 100644
--- a/src/mame/drivers/miniforce.cpp
+++ b/src/mame/drivers/miniforce.cpp
@@ -97,6 +97,7 @@
*/
#include "emu.h"
#include "bus/vme/vme.h"
+#include "bus/vme/vme_fccpu20.h"
#include "bus/vme/vme_fcisio.h"
#include "bus/vme/vme_fcscsi.h"
#include "machine/clock.h"
@@ -138,11 +139,11 @@ miniforce_state(const machine_config &mconfig, device_type type, const char *tag
static ADDRESS_MAP_START (miniforce_mem, AS_PROGRAM, 32, miniforce_state)
ADDRESS_MAP_UNMAP_HIGH
/* The ROMs contains an OS9 bootloader. It is position independent but reset vector suggests that it sits flat on adress 0 (zero) */
-// AM_RANGE (0x000000, 0x003fff) AM_ROM AM_REGION("roms", 0x000000) /* System EPROM Area 16Kb OS9 DEBUG - not verified */
-// AM_RANGE (0x004000, 0x01ffff) AM_ROM AM_REGION("roms", 0x004000)/* System EPROM Area 112Kb for System ROM - not verified */
-// AM_RANGE (0x020000, 0x03ffff) AM_RAM /* Not verified */
-// AM_RANGE (0x100000, 0xfeffff) AM_READWRITE(vme_a24_r, vme_a24_w) /* VMEbus Rev B addresses (24 bits) - not verified */
-// AM_RANGE (0xff0000, 0xffffff) AM_READWRITE(vme_a16_r, vme_a16_w) /* VMEbus Rev B addresses (16 bits) - not verified */
+// AM_RANGE (0x000000, 0x003fff) AM_ROM AM_REGION("roms", 0x000000) /* System EPROM Area 16Kb OS9 DEBUG - not verified */
+// AM_RANGE (0x004000, 0x01ffff) AM_ROM AM_REGION("roms", 0x004000)/* System EPROM Area 112Kb for System ROM - not verified */
+// AM_RANGE (0x020000, 0x03ffff) AM_RAM /* Not verified */
+// AM_RANGE (0x100000, 0xfeffff) AM_READWRITE(vme_a24_r, vme_a24_w) /* VMEbus Rev B addresses (24 bits) - not verified */
+// AM_RANGE (0xff0000, 0xffffff) AM_READWRITE(vme_a16_r, vme_a16_w) /* VMEbus Rev B addresses (16 bits) - not verified */
ADDRESS_MAP_END
#endif
@@ -163,17 +164,18 @@ static INPUT_PORTS_START (miniforce)
INPUT_PORTS_END
static SLOT_INTERFACE_START(miniforce_vme_cards)
+ SLOT_INTERFACE("fccpu20", VME_FCCPU20)
SLOT_INTERFACE("fcisio", VME_FCISIO1)
SLOT_INTERFACE("fcscsi", VME_FCSCSI1)
-SLOT_INTERFACE_END
+SLOT_INTERFACE_END
/*
* Machine configuration
*/
MACHINE_CONFIG_START (miniforce, miniforce_state)
-// MCFG_CPU_PROGRAM_MAP (miniforce_mem)
+// MCFG_CPU_PROGRAM_MAP (miniforce_mem)
MCFG_VME_DEVICE_ADD("vme")
- MCFG_VME_SLOT_ADD ("vme", "slot1", miniforce_vme_cards, nullptr)
+ MCFG_VME_SLOT_ADD ("vme", "slot1", miniforce_vme_cards, "fccpu20")
MCFG_VME_SLOT_ADD ("vme", "slot2", miniforce_vme_cards, nullptr)
MCFG_VME_SLOT_ADD ("vme", "slot3", miniforce_vme_cards, nullptr)
MCFG_VME_SLOT_ADD ("vme", "slot4", miniforce_vme_cards, nullptr)
diff --git a/src/mame/drivers/missile.cpp b/src/mame/drivers/missile.cpp
index b0268101d15..64abc50e377 100644
--- a/src/mame/drivers/missile.cpp
+++ b/src/mame/drivers/missile.cpp
@@ -353,7 +353,7 @@ Super Missile Attack Board Layout
#include "cpu/m6502/m6502.h"
#include "machine/watchdog.h"
#include "sound/pokey.h"
-
+#include "sound/ay8910.h"
class missile_state : public driver_device
{
@@ -379,7 +379,7 @@ public:
required_device<m6502_device> m_maincpu;
required_shared_ptr<uint8_t> m_videoram;
required_device<watchdog_timer_device> m_watchdog;
- required_device<pokey_device> m_pokey;
+ optional_device<pokey_device> m_pokey;
required_ioport m_in0;
required_ioport m_in1;
required_ioport m_r10;
@@ -402,6 +402,8 @@ public:
DECLARE_WRITE8_MEMBER(missile_w);
DECLARE_READ8_MEMBER(missile_r);
+ DECLARE_WRITE8_MEMBER(bootleg_w);
+ DECLARE_READ8_MEMBER(bootleg_r);
DECLARE_CUSTOM_INPUT_MEMBER(get_vblank);
DECLARE_DRIVER_INIT(missilem);
DECLARE_DRIVER_INIT(suprmatk);
@@ -705,8 +707,6 @@ uint32_t missile_state::screen_update_missile(screen_device &screen, bitmap_ind1
WRITE8_MEMBER(missile_state::missile_w)
{
- uint8_t *videoram = m_videoram;
-
/* if this is a MADSEL cycle, write to video RAM */
if (get_madsel())
{
@@ -719,12 +719,13 @@ WRITE8_MEMBER(missile_state::missile_w)
/* RAM */
if (offset < 0x4000)
- videoram[offset] = data;
+ m_videoram[offset] = data;
/* POKEY */
else if (offset < 0x4800)
{
- m_pokey->write(m_maincpu->space(), offset, data, 0xff);
+ if (m_pokey.found())
+ m_pokey->write(space, offset, data, 0xff);
}
/* OUT0 */
@@ -738,7 +739,7 @@ WRITE8_MEMBER(missile_state::missile_w)
output().set_led_value(0, ~data & 0x02);
m_ctrld = data & 1;
}
-
+
/* color RAM */
else if (offset >= 0x4b00 && offset < 0x4c00)
m_palette->set_pen_color(offset & 7, pal1bit(~data >> 3), pal1bit(~data >> 2), pal1bit(~data >> 1));
@@ -765,7 +766,6 @@ WRITE8_MEMBER(missile_state::missile_w)
READ8_MEMBER(missile_state::missile_r)
{
- uint8_t *videoram = m_videoram;
uint8_t result = 0xff;
/* if this is a MADSEL cycle, read from video RAM */
@@ -777,7 +777,7 @@ READ8_MEMBER(missile_state::missile_r)
/* RAM */
if (offset < 0x4000)
- result = videoram[offset];
+ result = m_videoram[offset];
/* ROM */
else if (offset >= 0x5000)
@@ -785,7 +785,10 @@ READ8_MEMBER(missile_state::missile_r)
/* POKEY */
else if (offset < 0x4800)
- result = m_pokey->read(m_maincpu->space(), offset & 0x0f, 0xff);
+ {
+ if (m_pokey.found())
+ result = m_pokey->read(space, offset & 0x0f, 0xff);
+ }
/* IN0 */
else if (offset < 0x4900)
@@ -822,6 +825,112 @@ READ8_MEMBER(missile_state::missile_r)
}
+WRITE8_MEMBER(missile_state::bootleg_w)
+{
+ /* if this is a MADSEL cycle, write to video RAM */
+ if (get_madsel())
+ {
+ write_vram(space, offset, data);
+ return;
+ }
+
+ /* otherwise, strip A15 and handle manually */
+ offset &= 0x7fff;
+
+ /* RAM */
+ if (offset < 0x4000)
+ m_videoram[offset] = data;
+
+ /* OUT0 */
+ else if (offset >= 0x4800 && offset < 0x4900)
+ {
+ m_flipscreen = ~data & 0x40;
+ machine().bookkeeping().coin_counter_w(0, data & 0x20);
+ machine().bookkeeping().coin_counter_w(1, data & 0x10);
+ machine().bookkeeping().coin_counter_w(2, data & 0x08);
+ output().set_led_value(1, ~data & 0x04);
+ output().set_led_value(0, ~data & 0x02);
+ m_ctrld = data & 1;
+ }
+
+ /* watchdog */
+ else if (offset >= 0x4900 && offset < 0x4a00)
+ m_watchdog->watchdog_reset();
+
+ /* color RAM */
+ else if (offset >= 0x4b00 && offset < 0x4c00)
+ m_palette->set_pen_color(offset & 7, pal1bit(~data >> 3), pal1bit(~data >> 2), pal1bit(~data >> 1));
+
+ /* interrupt ack */
+ else if (offset >= 0x4d00 && offset < 0x4e00)
+ {
+ if (m_irq_state)
+ {
+ m_maincpu->set_input_line(0, CLEAR_LINE);
+ m_irq_state = 0;
+ }
+ }
+
+ /* anything else */
+ else
+ logerror("%04X:Unknown write to %04X = %02X\n", space.device().safe_pc(), offset, data);
+}
+
+
+READ8_MEMBER(missile_state::bootleg_r)
+{
+ uint8_t result = 0xff;
+
+ /* if this is a MADSEL cycle, read from video RAM */
+ if (get_madsel())
+ return read_vram(space, offset);
+
+ /* otherwise, strip A15 and handle manually */
+ offset &= 0x7fff;
+
+ /* RAM */
+ if (offset < 0x4000)
+ result = m_videoram[offset];
+
+ /* ROM */
+ else if (offset >= 0x5000)
+ result = m_mainrom[offset];
+
+ /* IN0 */
+ else if (offset >= 0x4800 && offset < 0x4900) // doesn't seem ok
+ {
+ if (m_ctrld) /* trackball */
+ {
+ if (!m_flipscreen)
+ result = ((m_track0_y->read() << 4) & 0xf0) | (m_track0_x->read() & 0x0f);
+ else
+ result = ((m_track1_y->read() << 4) & 0xf0) | (m_track1_x->read() & 0x0f);
+ }
+ else /* buttons */
+ result = m_in0->read();
+ }
+
+ /* IN1 */
+ else if (offset >= 0x4900 && offset < 0x4a00) // seems ok
+ result = m_in1->read();
+
+ /* IN2 */
+ else if (offset >= 0x4b00 && offset < 0x4c00) // seems ok
+ result = m_r10->read();
+
+
+ /* anything else */
+ else
+ logerror("%04X:Unknown read from %04X\n", space.device().safe_pc(), offset);
+
+
+ /* update the MADSEL state */
+ if (!m_irq_state && ((result & 0x1f) == 0x01) && m_maincpu->get_sync())
+ m_madsel_lastcycles = m_maincpu->total_cycles();
+
+ return result;
+}
+
/*************************************
*
@@ -834,7 +943,10 @@ static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, missile_state )
AM_RANGE(0x0000, 0xffff) AM_READWRITE(missile_r, missile_w) AM_SHARE("videoram")
ADDRESS_MAP_END
-
+/* adjusted from the above to get the bootlegs to boot */
+static ADDRESS_MAP_START( bootleg_main_map, AS_PROGRAM, 8, missile_state )
+ AM_RANGE(0x0000, 0xffff) AM_READWRITE(bootleg_r, bootleg_w) AM_SHARE("videoram")
+ADDRESS_MAP_END
/*************************************
*
@@ -924,6 +1036,14 @@ static INPUT_PORTS_START( missile )
INPUT_PORTS_END
+static INPUT_PORTS_START( missileb )
+
+ PORT_INCLUDE(missile)
+
+ PORT_MODIFY("IN1")
+ PORT_SERVICE( 0x40, IP_ACTIVE_HIGH )
+INPUT_PORTS_END
+
static INPUT_PORTS_START( suprmatk )
PORT_START("IN0") /* IN0 */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_COCKTAIL
@@ -1039,6 +1159,20 @@ static MACHINE_CONFIG_START( missile, missile_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MACHINE_CONFIG_END
+static MACHINE_CONFIG_DERIVED( missilea, missile )
+
+ MCFG_DEVICE_REMOVE("pokey")
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_DERIVED( missileb, missilea )
+
+ MCFG_CPU_MODIFY("maincpu")
+ MCFG_CPU_PROGRAM_MAP(bootleg_main_map)
+
+ MCFG_SOUND_ADD("ay8912", AY8912, MASTER_CLOCK/8)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.75)
+
+MACHINE_CONFIG_END
/*************************************
@@ -1088,7 +1222,6 @@ ROM_START( missile1 )
ROM_LOAD( "035826-01.l6", 0x0000, 0x0020, CRC(86a22140) SHA1(2beebf7855e29849ada1823eae031fc98220bc43) )
ROM_END
-
ROM_START( suprmatk )
ROM_REGION( 0x9000, "maincpu", 0 ) /* ROM's located on the enhancement board */
ROM_LOAD( "035820-02.c1", 0x5000, 0x0800, CRC(7a62ce6a) SHA1(9a39978138dc28fdefe193bfae1b226391e471db) )
@@ -1200,7 +1333,47 @@ ROM_START( mcombats ) /* bootleg (Sidam) @ $ */
ROM_LOAD( "mmi6331.6f", 0x0000, 0x0020, CRC(86a22140) SHA1(2beebf7855e29849ada1823eae031fc98220bc43) )
ROM_END
+/*
+CPUs
+QTY Type clock position function
+1x 6502 2B 8-bit Microprocessor - main
+1x LM380 12B Audio Amplifier - sound
+1x oscillator 10.000 6C
+
+ROMs
+QTY Type position status
+2x F2708 10C, 10E dumped
+6x MCM2716C 1-6 dumped
+1x DM74S288N 6L dumped
+
+RAMs
+QTY Type position
+8x TMS4116 4F,4H,4J,4K,4L,4M,4N,4P
+1x 74S189N 7L
+
+Others
+
+1x 22x2 edge connector
+1x trimmer (volume)(12E)
+2x 8x2 switches DIP(8R,10R)
+*/
+ROM_START( missilea )
+ ROM_REGION( 0x8000, "maincpu", 0 )
+ ROM_LOAD( "1.1h", 0x5000, 0x0800, CRC(49d66ca1) SHA1(59e20a048ac76aff5843dc8253fe61cdb65f94fb) )
+ ROM_LOAD( "2.1j", 0x5800, 0x0800, CRC(8008918d) SHA1(a72ce8997ba66c0f51d94e4f2cb3cf2734612ac9) )
+ ROM_LOAD( "3.1k", 0x6000, 0x0800, CRC(b87c02f7) SHA1(748fa3aa2e7314407ded0d6c0fc24f9015c66c28) )
+ ROM_LOAD( "4.1l", 0x6800, 0x0800, CRC(33bc6f47) SHA1(5753fbfbcd65a4863f877cd3a07400bd61ffb8ce) )
+ ROM_LOAD( "5.1n", 0x7000, 0x0800, CRC(df8c58f4) SHA1(44a0cdb0e5222e14e3e91547c35e73b2cf2df174) )
+ ROM_LOAD( "6.1r", 0x7800, 0x0800, CRC(96a21c1f) SHA1(6e43ce8d53aa6d38cef920e7fa2e0683ce42cdb4) )
+
+ ROM_REGION( 0x800, "unknown", 0 )
+ ROM_LOAD( "2708.10c", 0x0000, 0x0400, CRC(9f6978c4) SHA1(34b356fddd86b8b73ee1415b3ad6b00dc4be60e2) )
+ ROM_LOAD( "2708.10e", 0x0400, 0x0400, CRC(90eb28c8) SHA1(c82bc0a00d9e54004b0210f95343c8d7dc1f2050) )
+
+ ROM_REGION( 0x0020, "proms", 0 )
+ ROM_LOAD( "dm74s288n.6l", 0x0000, 0x0020, CRC(86a22140) SHA1(2beebf7855e29849ada1823eae031fc98220bc43) )
+ROM_END
/*************************************
@@ -1316,8 +1489,11 @@ GAME( 1980, missile1, missile, missile, missile, driver_device, 0, ROT0,
GAME( 1981, suprmatk, missile, missile, suprmatk, missile_state, suprmatk, ROT0, "Atari / General Computer Corporation", "Super Missile Attack (for rev 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1981, suprmatkd,missile, missile, suprmatk, driver_device, 0, ROT0, "Atari / General Computer Corporation", "Super Missile Attack (not encrypted)", MACHINE_SUPPORTS_SAVE )
-/* the bootlegs are on different hardware and don't work */
-GAME( 1980, mcombat, missile, missile, missile, driver_device, 0, ROT0, "bootleg (Videotron)", "Missile Combat (Videotron bootleg, set 1)", MACHINE_NOT_WORKING )
-GAME( 1980, mcombata, missile, missile, missile, driver_device, 0, ROT0, "bootleg (Videotron)", "Missile Combat (Videotron bootleg, set 2)", MACHINE_NOT_WORKING )
-GAME( 1980, mcombats, missile, missile, missile, driver_device, 0, ROT0, "bootleg (Sidam)", "Missile Combat (Sidam bootleg)", MACHINE_NOT_WORKING )
-GAME( 2005, missilem, missile, missile, missile, missile_state, missilem, ROT0, "hack (Braze Technologies)", "Missile Command Multigame", MACHINE_NOT_WORKING )
+/* the following bootleg has extremely similar program ROMs to missile1, but has different unknown sound hardware and 2 more ROMs */
+GAME( 1981, missilea, missile, missilea, missile, driver_device, 0, ROT0, "bootleg (Ugames)", "Missile Attack", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE )
+
+/* the following bootlegs are on different hardware and don't work */
+GAME( 1980, mcombat, missile, missileb, missileb, driver_device, 0, ROT0, "bootleg (Videotron)", "Missile Combat (Videotron bootleg, set 1)", MACHINE_NOT_WORKING )
+GAME( 1980, mcombata, missile, missileb, missileb, driver_device, 0, ROT0, "bootleg (Videotron)", "Missile Combat (Videotron bootleg, set 2)", MACHINE_NOT_WORKING )
+GAME( 1980, mcombats, missile, missileb, missileb, driver_device, 0, ROT0, "bootleg (Sidam)", "Missile Combat (Sidam bootleg)", MACHINE_NOT_WORKING )
+GAME( 2005, missilem, missile, missilea, missileb, missile_state, missilem, ROT0, "hack (Braze Technologies)", "Missile Command Multigame", MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/mmodular.cpp b/src/mame/drivers/mmodular.cpp
index 15450bad8a8..0c9a576d708 100644
--- a/src/mame/drivers/mmodular.cpp
+++ b/src/mame/drivers/mmodular.cpp
@@ -27,10 +27,6 @@
Academy 65C02 4.9152mhz
Monte Carlo IV, Mega IV and any others not listed above have correct ROM/RAM and maybe LCD, not much else for now
- Novag boards: (should go in different .c eventually)
- Super Forte and Super Expert are the same, except one is touch board, other is magnetic.
- The Diablo 68000 is Super Expert board but 68K based
-
Notes by Cowering (2011)
TODO: add Bavaria sensor support (unknown1,2,3 handlers in current driver)
@@ -105,8 +101,6 @@ static uint8_t montecivtopnew = 0, montecivbotnew = 0;
//Mephisto Mega IV latch
uint8_t latch2400 = 0;
-uint8_t diablo68_3c0000 = 0;
-
INPUT_PORTS_EXTERN( chessboard );
@@ -133,10 +127,6 @@ public:
DECLARE_WRITE8_MEMBER(write_polgar_IO);
DECLARE_WRITE8_MEMBER(write_LCD_polgar);
DECLARE_WRITE8_MEMBER(write_LCD_academy);
-// DECLARE_WRITE16_MEMBER(diablo68_aciawrite);
-// DECLARE_READ16_MEMBER(diablo68_aciaread);
- DECLARE_WRITE16_MEMBER(diablo68_reg_select);
- DECLARE_WRITE16_MEMBER(diablo68_write_LCD);
DECLARE_WRITE8_MEMBER(milano_write_LED);
DECLARE_WRITE8_MEMBER(megaiv_write_LED);
DECLARE_WRITE8_MEMBER(academy_write_LED);
@@ -178,7 +168,6 @@ public:
DECLARE_MACHINE_START(van32);
DECLARE_MACHINE_RESET(van16);
DECLARE_MACHINE_RESET(monteciv);
- DECLARE_MACHINE_START(diablo68);
DECLARE_MACHINE_START(van16);
DECLARE_MACHINE_RESET(academy);
DECLARE_PALETTE_INIT(chess_lcd);
@@ -266,60 +255,6 @@ WRITE8_MEMBER(polgar_state::write_LCD_academy)
m_lcdc->write(space, offset & 1, data);
}
-// AM_RANGE( 0x3a0000,0x3a0000 ) AM_READ(diablo68_write_LCD)
-// AM_RANGE( 0x3c0000,0x3c0000 ) AM_READ(diablo68_reg_select)
-
-/*WRITE16_MEMBER(polgar_state::diablo68_aciawrite)
-{
-// device_t *acia = machine().device("acia65c51");
-// acia_6551_w(acia, offset & 0x03, data >> 8);
-// printf("ACIA write data %04x offset %02x\n",data,offset);
- logerror("ACIA write data %04x offset %02x\n",data,offset);
-}
-
-READ16_MEMBER(polgar_state::diablo68_aciaread)
-{
-// device_t *acia = machine().device("acia65c51");
- uint16_t result;
-// result = acia_6551_r(acia, offset & 0x03);
-// logerror("ACIA read offset %02x\n",offset);
-// printf("ACIA read offset %02x\n",offset);
-
- result <<= 8;
-
- return result;
-}
-*/
-
-WRITE16_MEMBER(polgar_state::diablo68_reg_select)
-{
- diablo68_3c0000 = data >> 8;
- //printf("3c0000 = %04x\n",data>>8);
- logerror("3c0000 = %04x\n",data>>8);
-
-}
-
-
-WRITE16_MEMBER(polgar_state::diablo68_write_LCD)
-{
- data >>= 8;
- if (!(diablo68_3c0000 & 0x02)) {
- if (BIT(data,7)) {
- if ((data & 0x7f) >= 0x40) data -= 56; // adjust for 16x1 display as 2 sets of 8
- }
- m_lcdc->control_write(space, 0, data);
-// logerror("Control %02x\n", data);
-// printf("Control %02x\n", data);
- } else {
- m_lcdc->data_write(space, 0, data);
-// printf("LCDdata %04x [%c]\n", data,data);
-// logerror("LCDdata %04x [%c]\n", data,data);
- }
-
- //logerror("LCD Status Data = %d\n",data);
-
-}
-
WRITE8_MEMBER(polgar_state::milano_write_LED)
{
uint8_t LED_offset = 100;
@@ -923,11 +858,6 @@ MACHINE_START_MEMBER(polgar_state,polgar)
common_chess_start();
}
-MACHINE_START_MEMBER(polgar_state,diablo68)
-{
- common_chess_start();
-}
-
MACHINE_START_MEMBER(polgar_state,van16)
{
}
@@ -1166,19 +1096,6 @@ static ADDRESS_MAP_START(megaiv_mem , AS_PROGRAM, 8, polgar_state )
AM_RANGE( 0x8000, 0xffff ) AM_ROM
ADDRESS_MAP_END
-static ADDRESS_MAP_START(diablo68_mem , AS_PROGRAM, 16, polgar_state )
- AM_RANGE( 0x00000000, 0x0000ffff ) AM_ROM // OS
-// AM_RANGE( 0x00200000, 0x0020ffff ) AM_ROM AM_REGION("maincpu", 0)
- AM_RANGE( 0x00ff0000, 0x00ff7fff ) AM_ROM AM_REGION("maincpu",10000) // Opening Book
-// AM_RANGE( 0x00300000, 0x00300007 ) AM_READ(diablo68_aciaread)
-// AM_RANGE( 0x00300000, 0x00300007 ) AM_READ(diablo68_aciawrite)
-// AM_RANGE( 0x00300002, 0x00300003 ) AM_READ(diablo68_flags)
- AM_RANGE( 0x003a0000, 0x003a0001 ) AM_WRITE(diablo68_write_LCD)
- AM_RANGE( 0x003c0000, 0x003c0001 ) AM_WRITE(diablo68_reg_select)
- AM_RANGE( 0x00280000, 0x0028ffff ) AM_RAM // hash tables
- AM_RANGE( 0x00ff8000, 0x00ffffff ) AM_RAM
-ADDRESS_MAP_END
-
/* Input ports */
@@ -1205,39 +1122,6 @@ static INPUT_PORTS_START( polgar )
INPUT_PORTS_END
-static INPUT_PORTS_START( sfortea )
- PORT_START("BUTTONS_SFOR1")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ENT") PORT_CODE(KEYCODE_1)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("CL") PORT_CODE(KEYCODE_2)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("UP") PORT_CODE(KEYCODE_3)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("DOWN") PORT_CODE(KEYCODE_4)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("LEFT") PORT_CODE(KEYCODE_5)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RIGHT") PORT_CODE(KEYCODE_6)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RST1") PORT_CODE(KEYCODE_7)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RST2") PORT_CODE(KEYCODE_8)
-
- PORT_START("BUTTONS_SFOR2")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ENT") PORT_CODE(KEYCODE_F1)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("CL") PORT_CODE(KEYCODE_F2)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("UP") PORT_CODE(KEYCODE_F3)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("DOWN") PORT_CODE(KEYCODE_F4)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("LEFT") PORT_CODE(KEYCODE_F5)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RIGHT") PORT_CODE(KEYCODE_F6)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RST1") PORT_CODE(KEYCODE_F7)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RST2") PORT_CODE(KEYCODE_F8)
-
-/* PORT_START("BUTTONS_SFOR3")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ENT") PORT_CODE(KEYCODE_1)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("CL") PORT_CODE(KEYCODE_2)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("UP") PORT_CODE(KEYCODE_3)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("DOWN") PORT_CODE(KEYCODE_4)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("LEFT") PORT_CODE(KEYCODE_5)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RIGHT") PORT_CODE(KEYCODE_6)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RST1") PORT_CODE(KEYCODE_7)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RST2") PORT_CODE(KEYCODE_8)
-*/
-INPUT_PORTS_END
-
static INPUT_PORTS_START( academy )
PORT_START("BUTTONS_ACAD")
PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(" Trn") PORT_CODE(KEYCODE_F1)
@@ -1457,22 +1341,6 @@ static MACHINE_CONFIG_DERIVED( megaiv, monteciv )
MCFG_CPU_PROGRAM_MAP(megaiv_mem)
MACHINE_CONFIG_END
-static MACHINE_CONFIG_START( diablo68, polgar_state )
- MCFG_CPU_ADD("maincpu", M68000, XTAL_16MHz)
- MCFG_CPU_PROGRAM_MAP(diablo68_mem)
- MCFG_MACHINE_START_OVERRIDE(polgar_state,diablo68)
- MCFG_FRAGMENT_ADD( chess_common )
-
- /* acia */
-// MCFG_MOS6551_ADD("acia65c51", XTAL_1_8432MHz, nullptr)
-
- MCFG_TIMER_DRIVER_ADD_PERIODIC("int_timer", polgar_state, timer_update_irq2, attotime::from_hz(60))
- MCFG_TIMER_START_DELAY(attotime::from_hz(30))
- //MCFG_TIMER_DRIVER_ADD_PERIODIC("artwork_timer", polgar_state, mboard_update_artwork, attotime::from_hz(120))
-
-
-MACHINE_CONFIG_END
-
static MACHINE_CONFIG_START( van16, polgar_state )
MCFG_CPU_ADD("maincpu", M68000, XTAL_12MHz)
MCFG_CPU_PROGRAM_MAP(van16_mem)
@@ -1589,13 +1457,6 @@ ROM_START(monteciv)
ROM_END
-ROM_START( diablo68 )
- ROM_REGION16_BE( 0x20000, "maincpu", 0 )
- ROM_LOAD16_BYTE("evenurom.bin", 0x00000, 0x8000,CRC(03477746) SHA1(8bffcb159a61e59bfc45411e319aea6501ebe2f9))
- ROM_LOAD16_BYTE("oddlrom.bin", 0x00001, 0x8000,CRC(e182dbdd) SHA1(24dacbef2173fa737636e4729ff22ec1e6623ca5))
- ROM_LOAD16_BYTE("book.bin", 0x10000, 0x8000,CRC(553a5c8c) SHA1(ccb5460ff10766a5ca8008ae2cffcff794318108))
-ROM_END
-
ROM_START( van16 )
ROM_REGION16_BE( 0x40000, "maincpu", 0 )
ROM_LOAD16_BYTE("va16even.bin", 0x00000, 0x20000,CRC(E87602D5) SHA1(90CB2767B4AE9E1B265951EB2569B9956B9F7F44))
@@ -1655,7 +1516,6 @@ DRIVER_INIT_MEMBER(polgar_state,polgar)
CONS( 1990, lyon16, van16, 0, alm16, van16, driver_device, 0, "Hegener & Glaser Muenchen", "Mephisto Lyon 68000", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK | MACHINE_CLICKABLE_ARTWORK )
CONS( 1990, lyon32, van16, 0, alm32, van32, driver_device, 0, "Hegener & Glaser Muenchen", "Mephisto Lyon 68020", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK | MACHINE_CLICKABLE_ARTWORK )
CONS( 1990, monteciv, 0, 0, monteciv, monteciv, driver_device, 0, "Hegener & Glaser", "Mephisto Monte Carlo IV LE Schachcomputer", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK | MACHINE_CLICKABLE_ARTWORK )
- CONS( 1991, diablo68, 0, 0, diablo68, sfortea, driver_device, 0, "Novag", "Novag Diablo 68000 Chess Computer", MACHINE_NO_SOUND|MACHINE_NOT_WORKING | MACHINE_CLICKABLE_ARTWORK )
CONS( 1991, van16, 0, 0, van16, van16, driver_device, 0, "Hegener & Glaser Muenchen", "Mephisto Vancouver 68000", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK | MACHINE_CLICKABLE_ARTWORK )
CONS( 1991, van32, van16, 0, van32, van32, driver_device, 0, "Hegener & Glaser Muenchen", "Mephisto Vancouver 68020", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK | MACHINE_CLICKABLE_ARTWORK )
CONS( 1993, gen32, van16, 0, gen32, gen32, driver_device, 0, "Hegener & Glaser Muenchen", "Mephisto Genius030 V4.00", MACHINE_NOT_WORKING|MACHINE_REQUIRES_ARTWORK | MACHINE_CLICKABLE_ARTWORK )
diff --git a/src/mame/drivers/model2.cpp b/src/mame/drivers/model2.cpp
index 5be07f60c5d..39cae4f09b1 100644
--- a/src/mame/drivers/model2.cpp
+++ b/src/mame/drivers/model2.cpp
@@ -4830,7 +4830,7 @@ ROM_START( overrev ) /* Over Rev Revision A, Model 2C */
ROM_LOAD( "mpr-20004.34", 0x400000, 0x400000, CRC(0b9c5410) SHA1(e5bb30702fc853ccc03316be07a334269d3ebb4a) )
ROM_END
-ROM_START( overrevb ) /* Over Rev Revision B, Model 2B, rom board stickered as 836-13275 */
+ROM_START( overrevb ) /* Over Rev Revision B, Model 2B, Sega Game ID# 836-13274, ROM board ID# 836-13275 */
ROM_REGION( 0x200000, "maincpu", 0 ) // i960 program
ROM_LOAD32_WORD( "epr-19992b.15", 0x000000, 0x080000, CRC(6d3e78d5) SHA1(40d18ee284ea2e038f7e3d04db56e793ab3e3dd5) ) /* sum16 492A printed on label */
ROM_LOAD32_WORD( "epr-19993b.16", 0x000002, 0x080000, CRC(765dc9ce) SHA1(a718c32ca27ec1fb5ed2d7d3797ea7e906510a04) ) /* sum16 B955 printed on label */
diff --git a/src/mame/drivers/mquake.cpp b/src/mame/drivers/mquake.cpp
index 4f6c20ce618..064e66bd19d 100644
--- a/src/mame/drivers/mquake.cpp
+++ b/src/mame/drivers/mquake.cpp
@@ -326,11 +326,13 @@ static MACHINE_CONFIG_START( mquake, mquake_state )
/* sound hardware */
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
- MCFG_SOUND_ADD("amiga", AMIGA, amiga_state::CLK_C1_NTSC)
+ MCFG_SOUND_ADD("amiga", PAULA_8364, amiga_state::CLK_C1_NTSC)
MCFG_SOUND_ROUTE(0, "lspeaker", 0.50)
MCFG_SOUND_ROUTE(1, "rspeaker", 0.50)
MCFG_SOUND_ROUTE(2, "rspeaker", 0.50)
MCFG_SOUND_ROUTE(3, "lspeaker", 0.50)
+ MCFG_PAULA_MEM_READ_CB(READ16(amiga_state, chip_ram_r))
+ MCFG_PAULA_INT_CB(WRITELINE(amiga_state, paula_int_w))
MCFG_ES5503_ADD("es5503", amiga_state::CLK_7M_NTSC) /* ES5503 is likely mono due to channel strobe used as bank select */
MCFG_ES5503_OUTPUT_CHANNELS(1)
diff --git a/src/mame/drivers/mvme147.cpp b/src/mame/drivers/mvme147.cpp
index 9f3568104b2..b8ad2aa3e7b 100644
--- a/src/mame/drivers/mvme147.cpp
+++ b/src/mame/drivers/mvme147.cpp
@@ -385,19 +385,19 @@ READ8_MEMBER (mvme147_state::pcc8_r){
LOG("Call to %s[%04x] ", FUNCNAME, offset);
switch(offset + P8BASE)
{
- case P8_TIMER1_INT_CNTL : LOG(" -> %02x - Timer 1 Interrupt Control - not implemented\n", ret); break;
- case P8_TIMER1_CNTL : LOG(" -> %02x - Timer 1 Control - not implemented\n", ret); break;
- case P8_TIMER2_INT_CNTL : LOG(" -> %02x - Timer 2 Interrupt Control - not implemented\n", ret); break;
- case P8_TIMER2_CNTL : LOG(" -> %02x - Timer 2 Control - not implemented\n", ret); break;
- case P8_ACFAIL_INT_CNTL : LOG(" -> %02x - AC Fail Interrupt Control Register - not implemented\n", ret); break;
- case P8_WDOG_TIMER_CNTL : LOG(" -> %02x - Watchdog Timer Control Register - not implemented\n", ret); break;
- case P8_PRINTER_INT_CNTL : LOG(" -> %02x - Printer Interrupt Control Register - not implemented\n", ret); break;
- case P8_PRINTER_CNTL : LOG(" -> %02x - Printer Control Register - not implemented\n", ret); break;
- case P8_DMA_INT_CNTL : LOG(" -> %02x - DMA Interrupt Control Register - not implemented\n", ret); break;
- case P8_DMA_CNTL_STAT : LOG(" -> %02x - DMA Control and Status Register - not implemented\n", ret); break;
- case P8_BUSERR_CNTL : LOG(" -> %02x - Bus Error Interrupt Control Register - not implemented\n", ret); break;
- case P8_DMA_STATUS : LOG(" -> %02x - DMA Status Register - not implemented\n", ret); break;
- case P8_ABORT_INT_CNTL : LOG(" -> %02x - Abort Interrupt Control Register - not fully implemented\n", ret);
+ case P8_TIMER1_INT_CNTL : LOG(" -> %02x - Timer 1 Interrupt Control - not implemented\n", ret); break;
+ case P8_TIMER1_CNTL : LOG(" -> %02x - Timer 1 Control - not implemented\n", ret); break;
+ case P8_TIMER2_INT_CNTL : LOG(" -> %02x - Timer 2 Interrupt Control - not implemented\n", ret); break;
+ case P8_TIMER2_CNTL : LOG(" -> %02x - Timer 2 Control - not implemented\n", ret); break;
+ case P8_ACFAIL_INT_CNTL : LOG(" -> %02x - AC Fail Interrupt Control Register - not implemented\n", ret); break;
+ case P8_WDOG_TIMER_CNTL : LOG(" -> %02x - Watchdog Timer Control Register - not implemented\n", ret); break;
+ case P8_PRINTER_INT_CNTL : LOG(" -> %02x - Printer Interrupt Control Register - not implemented\n", ret); break;
+ case P8_PRINTER_CNTL : LOG(" -> %02x - Printer Control Register - not implemented\n", ret); break;
+ case P8_DMA_INT_CNTL : LOG(" -> %02x - DMA Interrupt Control Register - not implemented\n", ret); break;
+ case P8_DMA_CNTL_STAT : LOG(" -> %02x - DMA Control and Status Register - not implemented\n", ret); break;
+ case P8_BUSERR_CNTL : LOG(" -> %02x - Bus Error Interrupt Control Register - not implemented\n", ret); break;
+ case P8_DMA_STATUS : LOG(" -> %02x - DMA Status Register - not implemented\n", ret); break;
+ case P8_ABORT_INT_CNTL : LOG(" -> %02x - Abort Interrupt Control Register - not fully implemented\n", ret);
/* Bit 3 When this bit is high, the interrupt is enabled. The interrupt is disabled when this bit is low. This bit is cleared by reset.
Bit 6 This bit indicates the current state of the ABORT switch. When this bit is low, the ABORT switch is not pressed. When this bit is
high, the ABORT switch is pressed.
@@ -415,9 +415,9 @@ READ8_MEMBER (mvme147_state::pcc8_r){
break;
case P8_SCSI_INT_CNTL : LOG(" -> %02x - SCSI Port Interrupt Control Register - not implemented\n", ret); break;
case P8_SLAVE_BASE_ADDR : LOG(" -> %02x - Slave Base Address Register - not implemented\n", ret); break;
- case P8_SWI_1_CNTL : LOG(" -> %02x - Software Interrupt 1 Control Register - not implemented\n", ret); break;
+ case P8_SWI_1_CNTL : LOG(" -> %02x - Software Interrupt 1 Control Register - not implemented\n", ret); break;
case P8_INT_VECT_BASE : LOG(" -> %02x - Interrupt Vector Base - not implemented\n", ret); break;
- case P8_SWI_2_CNTL : LOG(" -> %02x - Software Interrupt 2 Control Register - not implemented\n", ret); break;
+ case P8_SWI_2_CNTL : LOG(" -> %02x - Software Interrupt 2 Control Register - not implemented\n", ret); break;
case P8_REVISION_LEVEL : LOG(" -> %02x - PCC Revision Level Register - not implemented\n", ret); break;
case P8_PRINTER_STATUS : LOG(" -> %02x - Printer Status Register - not implemented\n", ret); break;
default:
@@ -431,17 +431,17 @@ WRITE8_MEMBER (mvme147_state::pcc8_w){
switch(offset + P8BASE)
{
case P8_TIMER1_INT_CNTL : LOG("Timer 1 Interrupt Control - not implemented\n"); break;
- case P8_TIMER1_CNTL : LOG("Timer 1 Control - not implemented\n"); break;
+ case P8_TIMER1_CNTL : LOG("Timer 1 Control - not implemented\n"); break;
case P8_TIMER2_INT_CNTL : LOG("Timer 2 Interrupt Control - not implemented\n"); break;
- case P8_TIMER2_CNTL : LOG("Timer 2 Control - not implemented\n"); break;
+ case P8_TIMER2_CNTL : LOG("Timer 2 Control - not implemented\n"); break;
case P8_ACFAIL_INT_CNTL : LOG("AC Fail Interrupt Control Register - not implemented\n"); break;
case P8_WDOG_TIMER_CNTL : LOG("Watchdog Timer Control Register - not implemented\n"); break;
case P8_PRINTER_INT_CNTL: LOG("Printer Interrupt Control Register - not implemented\n"); break;
case P8_PRINTER_CNTL : LOG("Printer Control Register - not implemented\n"); break;
case P8_DMA_INT_CNTL : LOG("DMA Interrupt Control Register - not implemented\n"); break;
case P8_DMA_CNTL_STAT : LOG("DMA Control and Status Register - not implemented\n"); break;
- case P8_BUSERR_CNTL : LOG("Bus Error Interrupt Control Register - not implemented\n"); break;
- case P8_DMA_STATUS : LOG("DMA Status Register - not implemented\n"); break;
+ case P8_BUSERR_CNTL : LOG("Bus Error Interrupt Control Register - not implemented\n"); break;
+ case P8_DMA_STATUS : LOG("DMA Status Register - not implemented\n"); break;
case P8_ABORT_INT_CNTL : LOG("Abort Interrupt Control Register - not implemented\n"); break;
case P8_TABADD_FC_CNTL : LOG("Table Address Function Code Register - not implemented\n"); break;
case P8_SERIAL_INT_CNTL : LOG("Serial Port Interrupt Control Register - not implemented\n"); break;
@@ -472,9 +472,9 @@ WRITE8_MEMBER (mvme147_state::pcc8_w){
break;
case P8_SCSI_INT_CNTL : LOG("SCSI Port Interrupt Control Register - not implemented\n"); break;
case P8_SLAVE_BASE_ADDR : LOG("Slave Base Address Register - not implemented\n"); break;
- case P8_SWI_1_CNTL : LOG("Software Interrupt 1 Control Register - not implemented\n"); break;
+ case P8_SWI_1_CNTL : LOG("Software Interrupt 1 Control Register - not implemented\n"); break;
case P8_INT_VECT_BASE : LOG("Interrupt Vector Base - not implemented\n"); break;
- case P8_SWI_2_CNTL : LOG("Software Interrupt 2 Control Register - not implemented\n"); break;
+ case P8_SWI_2_CNTL : LOG("Software Interrupt 2 Control Register - not implemented\n"); break;
case P8_REVISION_LEVEL : LOG("PCC Revision Level Register - not implemented\n"); break;
case P8_PRINTER_DATA : LOG("Printer Data Register - not implemented\n"); break;
default:
@@ -579,7 +579,7 @@ READ8_MEMBER (mvme147_state::vmechip_r){
case VC_INT_HNDL_MASK : LOG(" -> %02x - Interrupt Handler Mask Register - not implemented\n", ret); break;
case VC_UTIL_INT_MASK : LOG(" -> %02x - Utility Interrupt Mask Register - not implemented\n", ret); break;
case VC_UTIL_INT_VECT : LOG(" -> %02x - Utility Interrupt Vector Register - not implemented\n", ret); break;
- case VC_INT_REQUEST : LOG(" -> %02x - Interrupt Request Register - not implemented\n", ret); break;
+ case VC_INT_REQUEST : LOG(" -> %02x - Interrupt Request Register - not implemented\n", ret); break;
case VC_VMEBUS_STAT_ID : LOG(" -> %02x - VMEbus Status/ID Register - not implemented\n", ret); break;
case VC_BUS_ERR_STATUS : LOG(" -> %02x - Bus Error Status Register - not implemented\n", ret); break;
case VC_GCSR_BASE_ADR : LOG(" -> %02x - GCSR Base Address Configuration Register - not implemented\n", ret); break;
@@ -598,15 +598,15 @@ WRITE8_MEMBER (mvme147_state::vmechip_w){
m_vc_cntl_conf = data & 0xff;
break;
case VC_VMEBUS_REQ_CONF : LOG("VMEbus Requester Configuration Register - not implemented\n"); break;
- case VC_MASTER_CONF : LOG("Master Configuration Register - not implemented\n"); break;
- case VC_SLAVE_CONF : LOG("Slave Configuration Register - not implemented\n"); break;
- case VC_TIMER_CONF : LOG("Timer Configuration Register - not implemented\n"); break;
+ case VC_MASTER_CONF : LOG("Master Configuration Register - not implemented\n"); break;
+ case VC_SLAVE_CONF : LOG("Slave Configuration Register - not implemented\n"); break;
+ case VC_TIMER_CONF : LOG("Timer Configuration Register - not implemented\n"); break;
case VC_SLAVE_ADR_MOD : LOG("Slave Address Modifier Register - not implemented\n"); break;
case VC_MASTER_ADR_MOD : LOG("Master Address Modifier Register - not implemented\n"); break;
case VC_INT_HNDL_MASK : LOG("Interrupt Handler Mask Register - not implemented\n"); break;
case VC_UTIL_INT_MASK : LOG("Utility Interrupt Mask Register - not implemented\n"); break;
case VC_UTIL_INT_VECT : LOG("Utility Interrupt Vector Register - not implemented\n"); break;
- case VC_INT_REQUEST : LOG("Interrupt Request Register - not implemented\n"); break;
+ case VC_INT_REQUEST : LOG("Interrupt Request Register - not implemented\n"); break;
case VC_VMEBUS_STAT_ID : LOG("VMEbus Status/ID Register - not implemented\n"); break;
case VC_BUS_ERR_STATUS : LOG("Bus Error Status Register - not implemented\n"); break;
case VC_GCSR_BASE_ADR : LOG("GCSR Base Address Configuration Register - not implemented\n"); break;
@@ -639,7 +639,7 @@ WRITE16_MEMBER (mvme147_state::vme_a16_w){
static SLOT_INTERFACE_START(mvme147_vme_cards)
SLOT_INTERFACE("mvme350", VME_MVME350)
-SLOT_INTERFACE_END
+SLOT_INTERFACE_END
/*
* Machine configuration
diff --git a/src/mame/drivers/mzr8105.cpp b/src/mame/drivers/mzr8105.cpp
index 3eeb35ca1e9..38beb8b2c03 100644
--- a/src/mame/drivers/mzr8105.cpp
+++ b/src/mame/drivers/mzr8105.cpp
@@ -188,8 +188,8 @@ static ADDRESS_MAP_START (mzr8105_mem, AS_PROGRAM, 16, mzr8105_state)
AM_RANGE (0x000000, 0x003fff) AM_ROM AM_REGION("roms", 0x000000) /* System EPROM Area 16Kb OS9 DEBUG - not verified */
AM_RANGE (0x004000, 0x01ffff) AM_ROM AM_REGION("roms", 0x004000)/* System EPROM Area 112Kb for System ROM - not verified */
AM_RANGE (0x020000, 0x03ffff) AM_RAM /* Not verified */
-// AM_RANGE (0x100000, 0xfeffff) AM_READWRITE(vme_a24_r, vme_a24_w) /* VMEbus Rev B addresses (24 bits) - not verified */
-// AM_RANGE (0xff0000, 0xffffff) AM_READWRITE(vme_a16_r, vme_a16_w) /* VMEbus Rev B addresses (16 bits) - not verified */
+// AM_RANGE (0x100000, 0xfeffff) AM_READWRITE(vme_a24_r, vme_a24_w) /* VMEbus Rev B addresses (24 bits) - not verified */
+// AM_RANGE (0xff0000, 0xffffff) AM_READWRITE(vme_a16_r, vme_a16_w) /* VMEbus Rev B addresses (16 bits) - not verified */
ADDRESS_MAP_END
/* Input ports */
@@ -198,7 +198,7 @@ INPUT_PORTS_END
static SLOT_INTERFACE_START(mzr8105_vme_cards)
SLOT_INTERFACE("mzr8300", VME_MZR8300)
-SLOT_INTERFACE_END
+SLOT_INTERFACE_END
/*
* Machine configuration
diff --git a/src/mame/drivers/namcos2.cpp b/src/mame/drivers/namcos2.cpp
index 5184630ca12..84044e5c1a0 100644
--- a/src/mame/drivers/namcos2.cpp
+++ b/src/mame/drivers/namcos2.cpp
@@ -1701,7 +1701,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(namcos2_state::screen_scanline)
m_master_intc->vblank_irq_trigger();
m_slave_intc->vblank_irq_trigger();
}
-
+
if(scanline == cur_posirq)
{
m_master_intc->pos_irq_trigger();
@@ -1736,7 +1736,7 @@ static MACHINE_CONFIG_START( default, namcos2_state )
MCFG_FRAGMENT_ADD(configure_c148_standard)
MCFG_NAMCO_C139_ADD("sci")
-
+
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE( (49152000.0 / 8) / (384 * 264) )
MCFG_SCREEN_SIZE(384, 264)
diff --git a/src/mame/drivers/namcos21.cpp b/src/mame/drivers/namcos21.cpp
index 1e99e5b9ee3..808cbb501b0 100644
--- a/src/mame/drivers/namcos21.cpp
+++ b/src/mame/drivers/namcos21.cpp
@@ -1476,7 +1476,7 @@ static ADDRESS_MAP_START( winrun_master_map, AS_PROGRAM, 16, namcos21_state )
AM_RANGE(0x800000, 0x87ffff) AM_ROM AM_REGION("data", 0)
AM_RANGE(0x900000, 0x90ffff) AM_RAM AM_SHARE("sharedram")
AM_RANGE(0xa00000, 0xa00fff) AM_READWRITE(namcos2_68k_dualportram_word_r,namcos2_68k_dualportram_word_w)
- AM_RANGE(0xb00000, 0xb03fff) AM_DEVREADWRITE("sci", namco_c139_device, ram_r, ram_w)
+ AM_RANGE(0xb00000, 0xb03fff) AM_DEVREADWRITE("sci", namco_c139_device, ram_r, ram_w)
AM_RANGE(0xb80000, 0xb8000f) AM_DEVICE("sci", namco_c139_device, regs_map)
ADDRESS_MAP_END
@@ -1488,7 +1488,7 @@ static ADDRESS_MAP_START( winrun_slave_map, AS_PROGRAM, 16, namcos21_state )
AM_RANGE(0x800000, 0x87ffff) AM_ROM AM_REGION("data", 0)
AM_RANGE(0x900000, 0x90ffff) AM_RAM AM_SHARE("sharedram")
AM_RANGE(0xa00000, 0xa00fff) AM_READWRITE(namcos2_68k_dualportram_word_r,namcos2_68k_dualportram_word_w)
- AM_RANGE(0xb00000, 0xb03fff) AM_DEVREADWRITE("sci", namco_c139_device, ram_r, ram_w)
+ AM_RANGE(0xb00000, 0xb03fff) AM_DEVREADWRITE("sci", namco_c139_device, ram_r, ram_w)
AM_RANGE(0xb80000, 0xb8000f) AM_DEVICE("sci", namco_c139_device, regs_map)
ADDRESS_MAP_END
@@ -1568,10 +1568,10 @@ static ADDRESS_MAP_START( driveyes_common_map, AS_PROGRAM, 16, namcos21_state )
AM_RANGE(0x800000, 0x8fffff) AM_ROM AM_REGION("data", 0)
AM_RANGE(0x900000, 0x90ffff) AM_RAM AM_SHARE("sharedram")
AM_RANGE(0xa00000, 0xa00fff) AM_READWRITE(namcos2_68k_dualportram_word_r,namcos2_68k_dualportram_word_w)
- AM_RANGE(0xb00000, 0xb03fff) AM_DEVREADWRITE("sci", namco_c139_device, ram_r, ram_w)
+ AM_RANGE(0xb00000, 0xb03fff) AM_DEVREADWRITE("sci", namco_c139_device, ram_r, ram_w)
AM_RANGE(0xb80000, 0xb8000f) AM_DEVICE("sci", namco_c139_device, regs_map)
ADDRESS_MAP_END
-
+
static ADDRESS_MAP_START( driveyes_master_map, AS_PROGRAM, 16, namcos21_state )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x100000, 0x10ffff) AM_RAM /* private work RAM */
@@ -1716,7 +1716,7 @@ INPUT_PORTS_END
static INPUT_PORTS_START( winrungp )
PORT_INCLUDE(winrun)
-
+
PORT_MODIFY("DSW")
PORT_DIPNAME( 0x20, 0x00, "PCM ROM")
PORT_DIPSETTING( 0x20, "2M" )
@@ -1733,7 +1733,7 @@ static INPUT_PORTS_START( driveyes )
PORT_MODIFY("DIAL0")
PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER("gearbox", namcoio_gearbox_device, in_r, nullptr )
PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
-
+
PORT_MODIFY("PORTH") /* 63B05Z0 - PORT H */
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
@@ -1850,8 +1850,8 @@ MACHINE_START_MEMBER(namcos21_state,namcos21)
TIMER_DEVICE_CALLBACK_MEMBER(namcos21_state::screen_scanline)
{
int scanline = param;
-// int cur_posirq = get_posirq_scanline()*2;
-
+// int cur_posirq = get_posirq_scanline()*2;
+
if(scanline == 240*2)
{
m_master_intc->vblank_irq_trigger();
@@ -1859,7 +1859,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(namcos21_state::screen_scanline)
if(m_gpu_intc)
m_gpu_intc->vblank_irq_trigger();
}
-
+
if(m_gpu_intc != nullptr)
{
if(scanline == (0xff-m_gpu_intc->get_posirq_line())*2)
diff --git a/src/mame/drivers/naomi.cpp b/src/mame/drivers/naomi.cpp
index 435748e73be..493626a3926 100644
--- a/src/mame/drivers/naomi.cpp
+++ b/src/mame/drivers/naomi.cpp
@@ -1,5 +1,5 @@
// license:LGPL-2.1+
-// copyright-holders:Angelo Salese, Olivier Galibert, David Haywood, Samuele Zannoli, R. Belmont, ElSemi
+// copyright-holders: Samuele Zannoli, R. Belmont, ElSemi, David Haywood, Angelo Salese, Olivier Galibert, MetalliC
/*
Sega Naomi / Naomi 2 / Atomiswave
@@ -22,28 +22,6 @@
Sega Naomi is Dreamcast based Arcade hardware.
-Compatibility list (as per 26-jun-2013)
-- sfz3ugd: currently dies at disclaimer screen (regression);
-- sprtjam: garbage on initial attract mode screen (regression).
-- puyofev: hangs after pressing start (bp 0C03F490, similar if not same snippet as Tetris 4d on DC).
-- vtennisg: crashes after stage screen.
-
-(25-mar-2015)
-- sl2007:
-0C04697A: MOV.L @($28,R14),R0 ;8c167734
-0C04697C: TST R0,R0
-0C04697E: BT $0C046998
-0C046980: BRA $0C046990
-0C04698E: BT $0C046998
-0C046990: MOV.L @($28,R14),R3
-0C046992: MOV #$FD,R5
-0C046994: JSR R3
-0C046608: NOP
-0C04660A: BRA $0C04660A ;tight loops there, NOP-ing this opcode makes to go further, perhaps not supposed to go here in the first place?
-0C046608: NOP
-
-(24-jun-2016)
-- shangril: swapped mahjong inputs (M -> N, C -> B etc.)
TODO (general):
- all games that uses YUV just updates one frame then dies, why?
@@ -83,16 +61,33 @@ TODO (game-specific):
- Giant Gram 2: no VMU emulation;
- Gun Survivor 2: crashes during game loading;
- Lupin the Shooting: "com. error between Naomi BD and i/o BD" after some secs. of gameplay;
- - Monkey Ball: dies when attempts to load the gameplay;
+ - marstv: temporary lock ups during anchor talking (does same in Demul);
+ - marstv: missing graphics at stage select, renderer fault or something else?
+ - monkeyba: CPU jumps to la la land when attempts to load a stage (bp c09e950, uses FPU opcodes for calculating the return address?);
- Oinori-Daimyoujin Matsuri: reports "B. RAM error" in test mode, inputs doesn't seem to work after that point;
- OutTrigger: crashes on naomibd_r();
+ - puyofev: hangs after pressing start (bp 0C03F490, similar if not same snippet as Tetris 4d on DC).
- Ringout 4x4: needs cabinet set to 4p, moans about not having two jamma i/o boards;
- Super Major League '99: attract mode/gameplay bogusly have stop-motions from time to time;
+ - sfz3ugd: currently dies at disclaimer screen (regression);
+ - shangril: swapped mahjong inputs (M -> N, C -> B etc.);
+ - sprtjam: garbage on initial attract mode screen (regression).
- The House of the Dead 2: game uses an earlier PVR so it has extra gfx issues;
- The Typing of the Dead: missing keyboard inputs, doesn't enter into attract/test mode anymore (JVS issue);
- - Virtua Tennis: dies when accessing the gameplay or the attract mode (PVR or SH-4 bug, most likely);
+ - vtennisg: crashes after stage screen or the attract mode (PVR or SH-4 bug, most likely);
- World Kicks (both sets): "NAOMIM2: unhandled board write a0800600, 0000" after Naomi logo
- (more will come up soon ...)
+ - sl2007:
+ 0C04697A: MOV.L @($28,R14),R0 ;8c167734
+ 0C04697C: TST R0,R0
+ 0C04697E: BT $0C046998
+ 0C046980: BRA $0C046990
+ 0C04698E: BT $0C046998
+ 0C046990: MOV.L @($28,R14),R3
+ 0C046992: MOV #$FD,R5
+ 0C046994: JSR R3
+ 0C046608: NOP
+ 0C04660A: BRA $0C04660A ;tight loops there, NOP-ing this opcode makes to go further, perhaps not supposed to go here in the first place?
+ 0C046608: NOP
---------------------------------------------------------------------------------------------------------------------------------------------------
Guru's Readmes
@@ -312,7 +307,7 @@ Notes:
JP1 - JUMPER unknown function
JP3 - JUMPER unknown function
JP3 - JUMPER unknown function
- JP4 - JUMPER unknown function
+ JP4 - JUMPER master (1-2) / slave (2-3) switch, then slave data accessed at +0x10000000 at cart address space
IC1S-IC21S - FlashROM (SOP56), either 32Mb or 64Mb. Not all positions are populated
IC22 - EPROM (DIP42), either 27C160 or 27C322
IC37 - FlashROM (SOIC8) Xicor X76F100 Secure SerialFlash
@@ -336,7 +331,8 @@ House of the Dead 2 (prototype) no cart A1E2 21 (64Mb) pre
Inu No Osanpo / Dog Walking (Rev A) 840-0073C 22294A 16 (64Mb) present 315-6206 317-0316-JPN requires 837-13844 JVS IO with DIPSW 1 ON
Samba de Amigo (prototype) no cart * 21*(64Mb) present 315-6206 317-0270-COM * only first 14 flash roms contain game data, instead of EPROM have tiny PCB with 2 flashroms on it
Soul Surfer (Rev A) 840-0095C 23838C 21 (64Mb) present 315-6206 not present
-Star Horse (server) 840-0055C 23626 17 (64Mb) present 315-6206 not present requires 837-13785 ARCNET&IO BD
+Star Horse (live and backup) 840-0055B 23626 17 (64Mb) present 315-6206 not present requires 837-13785 ARCNET&IO BD
+Horse Data 840-0034B - 2 (64Mb) present 315-6206 not present not contain game data, used in stack with 840-0121(sound&backup) ROM board as game backup data storage, have JP3 and JP4 in position 2-3
The King of Route 66 (Rev A) 840-0087C 23819A 20 (64Mb) present 315-6206 not present content is the same as regular 171-8132A cart
The Maze of the Kings (prototype) no cart * 21 (64Mb) present 315-6206 FRI * flash-PCB, not dumped but known to exist
Tokyo Bus Guide (Rev A) 840-0045C 23468A 18 (64Mb) present 315-6206 317-0290-COM requires 837-13844 JVS IO
@@ -597,11 +593,15 @@ Giga Wing 2 841-0014C 22270 5 (128Mb) 3
Mobile Suit Gundam: Federation Vs. Zeon 841-0017C 23638 10 (128Mb) 315-6319A 315-6213 317-5070-COM not present
Moero! Justice Gakuen / Project Justice (Rev A) 841-0015C 23548A 11 (128Mb) 315-6319A 315-6213 317-5065-COM present
MushiKing - The King Of Beetle 2K5 1ST 840-0158C 24286 7 (128Mb) 315-6319A 315-6213 not present not present requires 610-0669 barcode reader
-Oinori-daimyoujin Matsuri 840-0126C 24053 5 (128Mb) 315-6319A 315-6213 not present not present requires 837-14274 "G2 EXPANSION BD" (similar to hopper 837-14381 but with ARC NET chip)
+Oinori-daimyoujin Matsuri 840-0126B 24053 5 (128Mb) 315-6319A 315-6213 not present not present requires 837-14274 "G2 EXPANSION BD" (similar to hopper 837-14381 but with ARC NET chip)
Samba de Amigo Ver. 2000 840-0047C 23600 11 (128Mb) 315-6319A 315-6213 317-0295-COM ?
-Star Horse (big screens) 840-0054C 23625 4 (128Mb) 315-6319 315-6213 not present present requires 837-13785 ARCNET&IO BD
+Star Horse (main screens) 840-0054C 23625 4 (128Mb) 315-6319 315-6213 not present present requires 837-13785 ARCNET&IO BD
Star Horse (satellite) 840-0056C 23627 6 (128Mb)* 315-6319 315-6213 not present present * +1 (64Mb), requires 837-13785 ARCNET&IO BD
-Star Horse Progress (satellite) (Rev A) 840-0123C 24122A 7 (128Mb) 315-6319A 315-6213 not present not present requires 837-13785 ARCNET&IO BD
+Star Horse 2001 (satellite) (Rev B) 840-0078B 23739B 7 (128Mb) 315-6319 315-6213 not present present requires 837-13785 ARCNET&IO BD
+Star Horse Progress (main screen, Rev B) 840-0120B 24087B 6 (128Mb) 315-6319A 315-6213 not present not present requires 837-13785 ARCNET&IO BD
+Star Horse Progress (sound & backup, Rev A) 840-0121B 24097A 6 (128Mb) 315-6319A 315-6213 not present not present requires 837-13785 ARCNET&IO BD
+Star Horse Progress (live, Rev A) 840-0122B 24107A 11 (128Mb) 315-6319A 315-6213 not present not present requires 837-13785 ARCNET&IO BD
+Star Horse Progress (satellite, Rev A) 840-0123B 24122A 7 (128Mb) 315-6319A 315-6213 not present not present requires 837-13785 ARCNET&IO BD
The King of Route 66 (Rev A) 840-0087C 23819A 10 (128Mb) 315-6319A 315-6213 not present present
Virtua Fighter 4 840-0080C 23785 11 (128Mb) ? ? 317-0324-COM ?
Virtua Striker 3 840-0061C 23663 11 (128Mb) 315-6319A 315-6213 317-0310-COM ?
@@ -716,7 +716,7 @@ Notes:
/Shin Nihon Prowrestling Toukon /FL0 & FL1 have pin55 raised from PCB.
\Retsuden 4 Arcade Edition (Japan, Ver.A) F2X 25349801 2 (64Mb) 15 (128Mb) not present NAODEC2A NAODEC1B 317-5040-COM TRF1 \They are connected together and go to pin89 on 2K.
World Kicks PCB (Japan, WKC1 Ver.A) F2 25509801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1B 317-5040-COM WKC1 uses Namco V226 JVS I/O (not dumped)
-World Kicks (Japan, WK1 Ver.A) F2 25209801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1A 317-5040-COM WK1 not dumped, FL1.2D sums E8F1 B057
+World Kicks (Japan, WK1 Ver.A) F2 25209801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1A 317-5040-COM WK1
World Kicks (Asia, WK2 Ver.A) F2 25209801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1A 317-5040-COM WK2
World Kicks (US, WK3 Ver.A) F2 25209801 2 (64Mb) 9 (128Mb) not present NAODEC2A NAODEC1A 317-5040-COM WK3
@@ -1574,27 +1574,30 @@ Premier Eleven
#define CPU_CLOCK (200000000)
-READ64_MEMBER(naomi_state::naomi_arm_r )
+READ64_MEMBER(naomi_state::naomi_unknown1_r )
{
- return *(reinterpret_cast<uint64_t *>(dc_sound_ram.target())+offset);
+ if ((offset * 8) == 0xc0) // trick so that it does not "wait for multiboard sync"
+ return -1;
+ return 0;
}
-WRITE64_MEMBER(naomi_state::naomi_arm_w )
+WRITE64_MEMBER(naomi_state::naomi_unknown1_w )
{
- COMBINE_DATA(reinterpret_cast<uint64_t *>(dc_sound_ram.target()) + offset);
}
-READ64_MEMBER(naomi_state::naomi_unknown1_r )
+// TODO: was using same handler as Naomi, tbd
+READ64_MEMBER(atomiswave_state::aw_unknown1_r )
{
if ((offset * 8) == 0xc0) // trick so that it does not "wait for multiboard sync"
return -1;
return 0;
}
-WRITE64_MEMBER(naomi_state::naomi_unknown1_w )
+WRITE64_MEMBER(atomiswave_state::aw_unknown1_w )
{
}
+
/*
* Non-volatile memories
*/
@@ -1691,7 +1694,7 @@ static ADDRESS_MAP_START( naomi_map, AS_PROGRAM, 64, naomi_state )
AM_RANGE(0x00600000, 0x006007ff) AM_MIRROR(0x02000000) AM_READWRITE(dc_modem_r, dc_modem_w )
AM_RANGE(0x00700000, 0x00707fff) AM_MIRROR(0x02000000) AM_READWRITE32(dc_aica_reg_r, dc_aica_reg_w, 0xffffffffffffffffU)
AM_RANGE(0x00710000, 0x0071000f) AM_MIRROR(0x02000000) AM_DEVREADWRITE16("aicartc", aicartc_device, read, write, 0x0000ffff0000ffffU )
- AM_RANGE(0x00800000, 0x00ffffff) AM_MIRROR(0x02000000) AM_READWRITE(naomi_arm_r, naomi_arm_w ) // sound RAM (8 MB)
+ AM_RANGE(0x00800000, 0x00ffffff) AM_MIRROR(0x02000000) AM_READWRITE(sh4_soundram_r, sh4_soundram_w ) // sound RAM (8 MB)
/* External Device */
AM_RANGE(0x01010098, 0x0101009f) AM_MIRROR(0x02000000) AM_RAM // Naomi 2 BIOS tests this, needs to read back as written
@@ -1728,7 +1731,14 @@ ADDRESS_MAP_END
* Naomi 2 address map
*/
-static ADDRESS_MAP_START( naomi2_map, AS_PROGRAM, 64, naomi_state )
+// example hookup for accessing both PVRs, to be extended to everything else.
+WRITE32_MEMBER(naomi2_state::both_pvr2_ta_w)
+{
+ space.write_dword(0x005f8000|offset*4,data,mem_mask);
+ space.write_dword(0x025f8000|offset*4,data,mem_mask);
+}
+
+static ADDRESS_MAP_START( naomi2_map, AS_PROGRAM, 64, naomi2_state )
/* Area 0 */
AM_RANGE(0x00000000, 0x001fffff) AM_MIRROR(0xa2000000) AM_ROM AM_REGION("maincpu", 0) // BIOS
@@ -1738,20 +1748,22 @@ static ADDRESS_MAP_START( naomi2_map, AS_PROGRAM, 64, naomi_state )
AM_RANGE(0x005f7000, 0x005f70ff) AM_MIRROR(0x02000000) AM_DEVICE16( "rom_board", naomi_board, submap, 0x0000ffff0000ffffU )
AM_RANGE(0x005f7400, 0x005f74ff) AM_MIRROR(0x02000000) AM_DEVICE32( "rom_board", naomi_g1_device, amap, 0xffffffffffffffffU )
AM_RANGE(0x005f7800, 0x005f78ff) AM_MIRROR(0x02000000) AM_READWRITE(dc_g2_ctrl_r, dc_g2_ctrl_w )
- AM_RANGE(0x005f7c00, 0x005f7cff) AM_MIRROR(0x02000000) AM_DEVICE32("powervr2", powervr2_device, pd_dma_map, 0xffffffffffffffffU)
- AM_RANGE(0x005f8000, 0x005f9fff) AM_MIRROR(0x02000000) AM_DEVICE32("powervr2", powervr2_device, ta_map, 0xffffffffffffffffU)
+ AM_RANGE(0x005f7c00, 0x005f7cff) AM_DEVICE32("powervr2", powervr2_device, pd_dma_map, 0xffffffffffffffffU)
+ AM_RANGE(0x005f8000, 0x005f9fff) AM_DEVICE32("powervr2", powervr2_device, ta_map, 0xffffffffffffffffU)
AM_RANGE(0x00600000, 0x006007ff) AM_MIRROR(0x02000000) AM_READWRITE(dc_modem_r, dc_modem_w )
AM_RANGE(0x00700000, 0x00707fff) AM_MIRROR(0x02000000) AM_READWRITE32(dc_aica_reg_r, dc_aica_reg_w, 0xffffffffffffffffU)
AM_RANGE(0x00710000, 0x0071000f) AM_MIRROR(0x02000000) AM_DEVREADWRITE16("aicartc", aicartc_device, read, write, 0x0000ffff0000ffffU )
- AM_RANGE(0x00800000, 0x00ffffff) AM_MIRROR(0x02000000) AM_READWRITE(naomi_arm_r, naomi_arm_w ) // sound RAM (8 MB)
+ AM_RANGE(0x00800000, 0x00ffffff) AM_MIRROR(0x02000000) AM_READWRITE(sh4_soundram_r, sh4_soundram_w ) // sound RAM (8 MB)
/* External Device */
AM_RANGE(0x01010098, 0x0101009f) AM_MIRROR(0x02000000) AM_RAM // Naomi 2 BIOS tests this, needs to read back as written
AM_RANGE(0x0103ff00, 0x0103ffff) AM_MIRROR(0x02000000) AM_READWRITE(naomi_unknown1_r, naomi_unknown1_w ) // bios uses it, actual start and end addresses not known
+ AM_RANGE(0x025f7c00, 0x025f7cff) AM_DEVICE32("powervr2_slave", powervr2_device, pd_dma_map, 0xffffffffffffffffU)
+ AM_RANGE(0x025f8000, 0x025f9fff) AM_DEVICE32("powervr2_slave", powervr2_device, ta_map, 0xffffffffffffffffU)
// AM_RANGE(0x025f6800, 0x025f69ff) AM_READWRITE(dc_sysctrl_r, dc_sysctrl_w ) // second PVR DMA!
// AM_RANGE(0x025f7c00, 0x025f7cff) AM_DEVREADWRITE32("powervr2", powervr2_device, pvr_ctrl_r, pvr_ctrl_w, 0xffffffffffffffffU)
- AM_RANGE(0x005f8000, 0x005f9fff) AM_MIRROR(0x02000000) AM_DEVICE32("powervr2", powervr2_device, ta_map, 0xffffffffffffffffU)
+// AM_RANGE(0x005f8000, 0x005f9fff) AM_MIRROR(0x02000000) AM_DEVICE32("powervr2", powervr2_device, ta_map, 0xffffffffffffffffU)
/* Area 1 */
AM_RANGE(0x04000000, 0x04ffffff) AM_RAM AM_SHARE("dc_texture_ram") // texture memory 64 bit access
@@ -1760,8 +1772,8 @@ static ADDRESS_MAP_START( naomi2_map, AS_PROGRAM, 64, naomi_state )
AM_RANGE(0x07000000, 0x07ffffff) AM_RAM AM_SHARE("frameram2")// 32 bit access 2nd PVR RAM
/* Area 2*/
- AM_RANGE(0x085f6800, 0x085f69ff) AM_WRITE(dc_sysctrl_w ) // writes to BOTH PVRs
- AM_RANGE(0x085f8000, 0x805f9fff) AM_DEVICE32("powervr2", powervr2_device, ta_map, 0xffffffffffffffffU)
+ AM_RANGE(0x085f6800, 0x085f69ff) AM_WRITE(dc_sysctrl_w ) // TODO: writes to BOTH PVRs
+ AM_RANGE(0x085f8000, 0x085f9fff) AM_WRITE32(both_pvr2_ta_w, 0xffffffffffffffffU)
AM_RANGE(0x08800000, 0x088000ff) AM_DEVREADWRITE32("powervr2", powervr2_device, elan_regs_r, elan_regs_w, 0xffffffffffffffffU) // T&L chip registers
// AM_RANGE(0x09000000, 0x09??????) T&L command processing
AM_RANGE(0x0a000000, 0x0bffffff) AM_RAM AM_SHARE("elan_ram") // T&L chip RAM
@@ -1795,13 +1807,13 @@ ADDRESS_MAP_END
* Atomiswave address map, almost identical to Dreamcast
*/
-READ64_MEMBER(naomi_state::aw_flash_r )
+READ64_MEMBER(atomiswave_state::aw_flash_r )
{
return (uint64_t)m_awflash->read(offset*8) | (uint64_t)m_awflash->read((offset*8)+1)<<8 | (uint64_t)m_awflash->read((offset*8)+2)<<16 | (uint64_t)m_awflash->read((offset*8)+3)<<24 |
(uint64_t)m_awflash->read((offset*8)+4)<<32 | (uint64_t)m_awflash->read((offset*8)+5)<<40 | (uint64_t)m_awflash->read((offset*8)+6)<<48 | (uint64_t)m_awflash->read((offset*8)+7)<<56;
}
-WRITE64_MEMBER(naomi_state::aw_flash_w )
+WRITE64_MEMBER(atomiswave_state::aw_flash_w )
{
int i;
uint32_t addr = offset * 8;
@@ -1820,7 +1832,8 @@ WRITE64_MEMBER(naomi_state::aw_flash_w )
m_awflash->write(addr, data);
}
-inline int naomi_state::decode_reg32_64(uint32_t offset, uint64_t mem_mask, uint64_t *shift)
+// TODO: don't we have a common function for this?
+inline int atomiswave_state::decode_reg32_64(uint32_t offset, uint64_t mem_mask, uint64_t *shift)
{
int reg = offset * 2;
@@ -1842,7 +1855,7 @@ inline int naomi_state::decode_reg32_64(uint32_t offset, uint64_t mem_mask, uint
return reg;
}
-READ64_MEMBER(naomi_state::aw_modem_r )
+READ64_MEMBER(atomiswave_state::aw_modem_r )
{
int reg;
uint64_t shift;
@@ -1868,7 +1881,7 @@ READ64_MEMBER(naomi_state::aw_modem_r )
return 0;
}
-WRITE64_MEMBER(naomi_state::aw_modem_w )
+WRITE64_MEMBER(atomiswave_state::aw_modem_w )
{
int reg;
uint64_t shift;
@@ -1900,7 +1913,7 @@ WRITE64_MEMBER(naomi_state::aw_modem_w )
osd_printf_verbose("%s",string_format("MODEM: [%08x=%x] write %I64x to %x, mask %I64x\n", 0x600000+reg*4, dat, data, offset, mem_mask).c_str());
}
-static ADDRESS_MAP_START( aw_map, AS_PROGRAM, 64, naomi_state )
+static ADDRESS_MAP_START( aw_map, AS_PROGRAM, 64, atomiswave_state )
/* Area 0 */
AM_RANGE(0x00000000, 0x0001ffff) AM_READWRITE(aw_flash_r, aw_flash_w ) AM_REGION("awflash", 0)
AM_RANGE(0xa0000000, 0xa001ffff) AM_READWRITE(aw_flash_r, aw_flash_w ) AM_REGION("awflash", 0)
@@ -1916,10 +1929,10 @@ static ADDRESS_MAP_START( aw_map, AS_PROGRAM, 64, naomi_state )
AM_RANGE(0x00600000, 0x006007ff) AM_READWRITE(aw_modem_r, aw_modem_w )
AM_RANGE(0x00700000, 0x00707fff) AM_READWRITE32(dc_aica_reg_r, dc_aica_reg_w, 0xffffffffffffffffU)
AM_RANGE(0x00710000, 0x0071000f) AM_MIRROR(0x02000000) AM_DEVREADWRITE16("aicartc", aicartc_device, read, write, 0x0000ffff0000ffffU )
- AM_RANGE(0x00800000, 0x00ffffff) AM_READWRITE(naomi_arm_r, naomi_arm_w ) // sound RAM (8 MB)
+ AM_RANGE(0x00800000, 0x00ffffff) AM_READWRITE(sh4_soundram_r, sh4_soundram_w ) // sound RAM (8 MB)
- AM_RANGE(0x0103ff00, 0x0103ffff) AM_READWRITE(naomi_unknown1_r, naomi_unknown1_w ) // bios uses it, actual start and end addresses not known
+ AM_RANGE(0x0103ff00, 0x0103ffff) AM_READWRITE(aw_unknown1_r, aw_unknown1_w ) // ???
/* Area 1 - half the texture memory, like dreamcast, not naomi */
AM_RANGE(0x04000000, 0x047fffff) AM_RAM AM_MIRROR(0x00800000) AM_SHARE("dc_texture_ram") // texture memory 64 bit access
@@ -1955,25 +1968,11 @@ static ADDRESS_MAP_START( aw_map, AS_PROGRAM, 64, naomi_state )
//AM_RANGE(0x1c000000, 0x1fffffff) AM_NOP // SH4 Internal
ADDRESS_MAP_END
-/*
- * Aica
- */
-WRITE_LINE_MEMBER(naomi_state::aica_irq)
-{
- m_soundcpu->set_input_line(ARM7_FIRQ_LINE, state ? ASSERT_LINE : CLEAR_LINE);
-}
-
-WRITE_LINE_MEMBER(naomi_state::sh4_aica_irq)
-{
- if(state)
- dc_sysctrl_regs[SB_ISTEXT] |= IST_EXT_AICA;
- else
- dc_sysctrl_regs[SB_ISTEXT] &= ~IST_EXT_AICA;
-
- dc_update_interrupt_status();
-}
+static ADDRESS_MAP_START( aw_port, AS_IO, 64, atomiswave_state )
+// ???
+ADDRESS_MAP_END
-static ADDRESS_MAP_START( dc_audio_map, AS_PROGRAM, 32, naomi_state )
+static ADDRESS_MAP_START( dc_audio_map, AS_PROGRAM, 32, dc_state )
ADDRESS_MAP_UNMAP_HIGH
AM_RANGE(0x00000000, 0x007fffff) AM_RAM AM_SHARE("dc_sound_ram") /* shared with SH-4 */
AM_RANGE(0x00800000, 0x00807fff) AM_READWRITE(dc_arm_aica_r, dc_arm_aica_w)
@@ -1985,12 +1984,17 @@ ADDRESS_MAP_END
INPUT_PORTS_START( naomi_debug )
PORT_START("MAMEDEBUG")
- PORT_DIPNAME( 0x01, 0x00, "Bilinear Filtering" )
- PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x01, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x00, "Disable Render Calls" )
- PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x02, DEF_STR( On ) )
+ PORT_CONFNAME( 0x01, 0x00, "Bilinear Filtering" )
+ PORT_CONFSETTING( 0x00, DEF_STR( No ) )
+ PORT_CONFSETTING( 0x01, DEF_STR( Yes ) )
+ PORT_CONFNAME( 0x02, 0x00, "Disable Render Calls" )
+ PORT_CONFSETTING( 0x00, DEF_STR( No ) )
+ PORT_CONFSETTING( 0x02, DEF_STR( Yes ) )
+ PORT_CONFNAME( 0x0c, 0x00, "Master CPU Clock Rate (Cheat)") PORT_CHANGED_MEMBER(DEVICE_SELF, dc_state, mastercpu_cheat_r, nullptr)
+ PORT_CONFSETTING( 0x00, "100%" )
+ PORT_CONFSETTING( 0x04, "50%" )
+ PORT_CONFSETTING( 0x08, "25%" )
+ PORT_CONFSETTING( 0x0c, "12.5%" )
INPUT_PORTS_END
static INPUT_PORTS_START( naomi_mie )
@@ -2081,6 +2085,27 @@ static INPUT_PORTS_START( naomi )
PORT_BIT( 0x07ff, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END
+static INPUT_PORTS_START( marstv )
+ PORT_INCLUDE( naomi )
+
+ PORT_MODIFY("P1")
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_START1 ) PORT_PLAYER(1) PORT_NAME("P1 Start")
+ PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME(u8"P1 Red Large Button \u5927")
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME(u8"P1 Yellow Medium Button \u4E2D")
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME(u8"P1 Blue Small Button \u5C0F")
+ PORT_BIT( 0x53ff, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_MODIFY("P2")
+ PORT_BIT( 0x8000, IP_ACTIVE_HIGH, IPT_START2 ) PORT_PLAYER(2) PORT_NAME("P2 Start")
+ PORT_BIT( 0x2000, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_NAME(u8"P2 Red Large Button \u5927")
+ PORT_BIT( 0x0800, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_NAME(u8"P2 Yellow Medium Button \u4E2D")
+ PORT_BIT( 0x0400, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME(u8"P2 Blue Small Button \u5C0F")
+ PORT_BIT( 0x53ff, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ // TODO: Player 3
+INPUT_PORTS_END
+
+
static INPUT_PORTS_START( hotd2 )
PORT_INCLUDE( naomi_mie )
PORT_INCLUDE( naomi_debug )
@@ -2555,6 +2580,7 @@ static INPUT_PORTS_START( aw2c )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1)
+
PORT_START("P1.1")
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_SERVICE_NO_TOGGLE( 0x40, IP_ACTIVE_LOW )
@@ -2574,6 +2600,7 @@ static INPUT_PORTS_START( aw2c )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+
PORT_START("P2.1")
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
@@ -2641,7 +2668,8 @@ MACHINE_RESET_MEMBER(naomi_state,naomi)
* Common for Naomi 1, Naomi GD-Rom, Naomi 2, Atomiswave ...
*/
-MACHINE_CONFIG_START( naomi_aw_base, naomi_state )
+ // TODO: merge with Dreamcast base machine
+ MACHINE_CONFIG_START( naomi_aw_base, dc_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", SH4LE, CPU_CLOCK) // SH4!!!
MCFG_SH4_MD0(1)
@@ -2663,11 +2691,6 @@ MACHINE_CONFIG_START( naomi_aw_base, naomi_state )
MCFG_MAPLE_DC_ADD( "maple_dc", "maincpu", dc_maple_irq )
- MCFG_MACHINE_RESET_OVERRIDE(naomi_state,naomi)
-
- MCFG_EEPROM_SERIAL_93C46_ADD("main_eeprom")
- MCFG_EEPROM_SERIAL_DEFAULT_VALUE(0)
-
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_RAW_PARAMS(13458568*2, 820, 0, 640, 532, 0, 480) /* TODO: where pclk actually comes? */
@@ -2678,8 +2701,8 @@ MACHINE_CONFIG_START( naomi_aw_base, naomi_state )
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
MCFG_SOUND_ADD("aica", AICA, 0)
MCFG_AICA_MASTER
- MCFG_AICA_IRQ_CB(WRITELINE(naomi_state, aica_irq))
- MCFG_AICA_MAIN_IRQ_CB(WRITELINE(naomi_state, sh4_aica_irq))
+ MCFG_AICA_IRQ_CB(WRITELINE(dc_state, aica_irq))
+ MCFG_AICA_MAIN_IRQ_CB(WRITELINE(dc_state, sh4_aica_irq))
MCFG_SOUND_ROUTE(0, "lspeaker", 2.0)
MCFG_SOUND_ROUTE(1, "rspeaker", 2.0)
@@ -2687,13 +2710,19 @@ MACHINE_CONFIG_START( naomi_aw_base, naomi_state )
MCFG_AICARTC_ADD("aicartc", XTAL_32_768kHz )
MACHINE_CONFIG_END
-static MACHINE_CONFIG_DERIVED( naomi_base, naomi_aw_base )
+static MACHINE_CONFIG_START( naomi_base, naomi_state )
+ MCFG_FRAGMENT_ADD( naomi_aw_base )
+
+ MCFG_EEPROM_SERIAL_93C46_ADD("main_eeprom")
+ MCFG_EEPROM_SERIAL_DEFAULT_VALUE(0)
+
MCFG_MIE_ADD("mie", XTAL_32MHz/2, "maple_dc", 0, nullptr, nullptr, nullptr, ":MIE.3", nullptr, ":MIE.5", nullptr, nullptr) // Actual frequency unknown, most likely 1/2 of 32MHz XTAL or even 2/3 (yes, 21MHz Z80 core)
MCFG_SEGA_837_13551_DEVICE_ADD("837_13551", "mie", ":TILT", ":P1", ":P2", ":A0", ":A1", ":A2", ":A3", ":A4", ":A5", ":A6", ":A7", ":OUTPUT")
MCFG_EEPROM_SERIAL_93C46_8BIT_ADD("mie_eeprom")
MCFG_X76F100_ADD("naomibd_eeprom")
MCFG_M3COMM_ADD("comm_board")
+ MCFG_MACHINE_RESET_OVERRIDE(naomi_state,naomi)
MACHINE_CONFIG_END
/*
@@ -2749,7 +2778,16 @@ MACHINE_CONFIG_END
* Naomi 2 GD-Rom
*/
-static MACHINE_CONFIG_DERIVED( naomi2gd, naomigd )
+static MACHINE_CONFIG_START( naomi2_base, naomi2_state )
+ MCFG_POWERVR2_ADD("powervr2_slave", WRITE8(dc_state, pvr_irq))
+
+ // TODO: ELAN device
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_START( naomi2gd, naomi2_state )
+ MCFG_FRAGMENT_ADD( naomigd )
+ MCFG_FRAGMENT_ADD( naomi2_base )
+
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_PROGRAM_MAP(naomi2_map)
MACHINE_CONFIG_END
@@ -2758,7 +2796,10 @@ MACHINE_CONFIG_END
* Naomi 2, M1 sub-board
*/
-static MACHINE_CONFIG_DERIVED( naomi2m1, naomim1 )
+static MACHINE_CONFIG_START( naomi2m1, naomi2_state )
+ MCFG_FRAGMENT_ADD( naomim1 )
+ MCFG_FRAGMENT_ADD( naomi2_base )
+
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_PROGRAM_MAP(naomi2_map)
MACHINE_CONFIG_END
@@ -2767,7 +2808,10 @@ MACHINE_CONFIG_END
* Naomi 2, M2/3 sub-board
*/
-static MACHINE_CONFIG_DERIVED( naomi2m2, naomim2 )
+static MACHINE_CONFIG_START( naomi2m2, naomi2_state )
+ MCFG_FRAGMENT_ADD( naomim2 )
+ MCFG_FRAGMENT_ADD( naomi2_base )
+
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_PROGRAM_MAP(naomi2_map)
MACHINE_CONFIG_END
@@ -2776,15 +2820,24 @@ MACHINE_CONFIG_END
* Atomiswave
*/
-static MACHINE_CONFIG_DERIVED( aw_base, naomi_aw_base )
+static MACHINE_CONFIG_START( aw_base, atomiswave_state )
+ MCFG_FRAGMENT_ADD( naomi_aw_base )
+
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_PROGRAM_MAP(aw_map)
+ MCFG_CPU_IO_MAP(aw_port)
MCFG_MACRONIX_29L001MC_ADD("awflash")
MCFG_AW_ROM_BOARD_ADD("rom_board", "rom_key", WRITE8(dc_state, g1_irq))
+
+ //MCFG_CPU_MODIFY("soundcpu")
+ //MCFG_CPU_PROGRAM_MAP(aw_sound_map)
+
+ MCFG_MACHINE_RESET_OVERRIDE(dc_state,dc_console)
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( aw1c, aw_base )
MCFG_DC_CONTROLLER_ADD("dcctrl0", "maple_dc", 0, ":P1.0", ":P1.1", ":P1.A0", ":P1.A1", ":P1.A2", ":P1.A3", ":P1.A4", ":P1.A5")
+ // TODO: isn't it supposed to be just one controller?
MCFG_DC_CONTROLLER_ADD("dcctrl1", "maple_dc", 1, ":P2.0", ":P2.1", ":P2.A0", ":P2.A1", ":P2.A2", ":P2.A3", ":P2.A4", ":P2.A5")
MACHINE_CONFIG_END
@@ -5408,20 +5461,20 @@ ROM_START( sambap )
ROM_REGION( 0x7800000, "rom_board", ROMREGION_ERASEFF)
ROM_LOAD( "sambaproto.ic22",0x000000, 0x0400000, CRC(ca069449) SHA1(03c2498664df187a98b335f1757979ebcf45c591) )
- ROM_LOAD("ic1s", 0x00800000, 0x00800000, CRC(992a8390) SHA1(5842aaf0c9ed25f58429cae71f90d8e3e41a3efd) )
- ROM_LOAD("ic2s", 0x01000000, 0x00800000, CRC(330f9185) SHA1(dd2ee044a62179160cd69799ce3727e7cb401da8) )
- ROM_LOAD("ic3s", 0x01800000, 0x00800000, CRC(719ae0f9) SHA1(f08d1764f19023d510be5e02183eef18a9294a99) )
- ROM_LOAD("ic4s", 0x02000000, 0x00800000, CRC(941b8208) SHA1(4409d4d83546c57e7c046de2e8a1b25f40acb246) )
- ROM_LOAD("ic5s", 0x02800000, 0x00800000, CRC(6d12335e) SHA1(9d58040182d7f185733a3aebc833e98d2daec3a5) )
- ROM_LOAD("ic6s", 0x03000000, 0x00800000, CRC(197540ed) SHA1(b993344b4091c86bc823d6e73814baeab01b9c43) )
- ROM_LOAD("ic7s", 0x03800000, 0x00800000, CRC(2e0912ba) SHA1(fe010f41f7498a417d143b95617d1cbc8d5c5ec7) )
- ROM_LOAD("ic8s", 0x04000000, 0x00800000, CRC(10f6b6a2) SHA1(d73fef5edac937b8d294781bbd6197fd8185c589) )
- ROM_LOAD("ic9s", 0x04800000, 0x00800000, CRC(2b57ce5f) SHA1(0fcf78b3497b918dc1fbc62ffdd2863489eea3ab) )
- ROM_LOAD("ic10s", 0x05000000, 0x00800000, CRC(7d61643c) SHA1(e48023ec78143e85bdf4605deaba3f355601a856) )
- ROM_LOAD("ic11s", 0x05800000, 0x00800000, CRC(ca391126) SHA1(a3324b865c134ba9ec3ef33cd158107b55b8bd2e) )
- ROM_LOAD("ic12s", 0x06000000, 0x00800000, CRC(f028ae87) SHA1(ff868e33d8765c076d687af416a8d658169af2fb) )
- ROM_LOAD("ic13s", 0x06800000, 0x00800000, CRC(37a15a54) SHA1(11c247caf0cd0ed098d408d273affab87d794169) )
- ROM_LOAD("ic14s", 0x07000000, 0x00800000, CRC(e0730a2b) SHA1(79ac165cf8d8095ff1661e86d03ad6fd04d2d63c) )
+ ROM_LOAD("rom1.ic1s", 0x00800000, 0x00800000, CRC(992a8390) SHA1(5842aaf0c9ed25f58429cae71f90d8e3e41a3efd) )
+ ROM_LOAD("rom2.ic2s", 0x01000000, 0x00800000, CRC(330f9185) SHA1(dd2ee044a62179160cd69799ce3727e7cb401da8) )
+ ROM_LOAD("rom3.ic3s", 0x01800000, 0x00800000, CRC(719ae0f9) SHA1(f08d1764f19023d510be5e02183eef18a9294a99) )
+ ROM_LOAD("rom4.ic4s", 0x02000000, 0x00800000, CRC(941b8208) SHA1(4409d4d83546c57e7c046de2e8a1b25f40acb246) )
+ ROM_LOAD("rom5.ic5s", 0x02800000, 0x00800000, CRC(6d12335e) SHA1(9d58040182d7f185733a3aebc833e98d2daec3a5) )
+ ROM_LOAD("rom6.ic6s", 0x03000000, 0x00800000, CRC(197540ed) SHA1(b993344b4091c86bc823d6e73814baeab01b9c43) )
+ ROM_LOAD("rom7.ic7s", 0x03800000, 0x00800000, CRC(2e0912ba) SHA1(fe010f41f7498a417d143b95617d1cbc8d5c5ec7) )
+ ROM_LOAD("rom8.ic8s", 0x04000000, 0x00800000, CRC(10f6b6a2) SHA1(d73fef5edac937b8d294781bbd6197fd8185c589) )
+ ROM_LOAD("rom9.ic9s", 0x04800000, 0x00800000, CRC(2b57ce5f) SHA1(0fcf78b3497b918dc1fbc62ffdd2863489eea3ab) )
+ ROM_LOAD("rom10.ic10s", 0x05000000, 0x00800000, CRC(7d61643c) SHA1(e48023ec78143e85bdf4605deaba3f355601a856) )
+ ROM_LOAD("rom11.ic11s", 0x05800000, 0x00800000, CRC(ca391126) SHA1(a3324b865c134ba9ec3ef33cd158107b55b8bd2e) )
+ ROM_LOAD("rom12.ic12s", 0x06000000, 0x00800000, CRC(f028ae87) SHA1(ff868e33d8765c076d687af416a8d658169af2fb) )
+ ROM_LOAD("rom13.ic13s", 0x06800000, 0x00800000, CRC(37a15a54) SHA1(11c247caf0cd0ed098d408d273affab87d794169) )
+ ROM_LOAD("rom14.ic14s", 0x07000000, 0x00800000, CRC(e0730a2b) SHA1(79ac165cf8d8095ff1661e86d03ad6fd04d2d63c) )
ROM_REGION(0x84, "some_eeprom", 0)
ROM_LOAD( "sflash.ic37", 0x000000, 0x000084, CRC(69d54cc4) SHA1(e036b8537390b9941dbfcb8d3b42ded68c8e9d29) )
@@ -6131,21 +6184,6 @@ ROM_START( rhytngk )
ROM_PARAMETER( ":rom_board:id", "5504" )
ROM_END
-// this is satellite unit of the main game, server/control and lagre screen units required and need to be dumped
-ROM_START( starhrpr )
- NAOMI_BIOS
- NAOMI_DEFAULT_EEPROM
-
- ROM_REGION( 0x8000000, "rom_board", ROMREGION_ERASEFF)
- ROM_LOAD( "fpr-24489.ic8", 0x00000000, 0x4000000, CRC(156797a4) SHA1(b20da57726974c5d772885fe809c4bbf89012db6) )
- ROM_LOAD( "fpr-24790.ic9", 0x04000000, 0x4000000, CRC(b6c40348) SHA1(37b5b334c24536e5b2062c233423f0e3d338e1f2) )
-
- // PIC not populated
- ROM_REGION( 0x800, "pic_readout", ROMREGION_ERASE00 )
-
- ROM_PARAMETER( ":rom_board:id", "5502" )
-ROM_END
-
/*
SYSTEMID: NAOMI
@@ -6299,6 +6337,28 @@ ROM_START( gunsur2 )
ROM_PARAMETER( ":rom_board:segam2crypt:key", "000680d0" )
ROM_END
+ROM_START( wldkicksj )
+ NAOMI_BIOS
+ NAOMI_DEFAULT_EEPROM
+
+ ROM_REGION( 0xb000000, "rom_board", ROMREGION_ERASEFF)
+ ROM_LOAD( "wk1vera.2d", 0x0800000, 0x800000, CRC(eb4d7fe1) SHA1(14378c3f6926b7709902a3073ed4274c7ac5ead8) )
+ ROM_LOAD( "wk2vera.2c", 0x1000000, 0x800000, CRC(ad2577d5) SHA1(f7b6bab001c5f5cf0b33a70cd0dfdca8f7d25921) )
+
+ ROM_LOAD( "wk1ma2.4m", 0x2000000, 0x1000000, CRC(3b340dc0) SHA1(2412e41d5bd74d1233fb91f8ce2276a318bfc53d) )
+ ROM_LOAD( "wk1ma3.4l", 0x3000000, 0x1000000, CRC(263fbb16) SHA1(b5d3a3d085f9623d70030ca3c49afb84e25549e3) )
+ ROM_LOAD( "wk1ma4.4k", 0x4000000, 0x1000000, CRC(9697db68) SHA1(7926e2acff0519403afcba9bdb5f68de28b06c79) )
+ ROM_LOAD( "wk1ma5.4j", 0x5000000, 0x1000000, CRC(65017db3) SHA1(a66cd73cdfc9355df63da781a46aa832889f583a) )
+ ROM_LOAD( "wk1ma6.4h", 0x6000000, 0x1000000, CRC(902eea85) SHA1(aa7964eb85b468d4fe112f9f0faaf2fa3f1aa96b) )
+ ROM_LOAD( "wk1ma7.4f", 0x7000000, 0x1000000, CRC(90e917ed) SHA1(53d32ce0ae2b05fa55a95b8697927045d07f4e8a) )
+ ROM_LOAD( "wk1ma8.4e", 0x8000000, 0x1000000, CRC(1d227a05) SHA1(9f816bcdf0279785e0b37ab2f3c5eb5912114dd5) )
+ ROM_LOAD( "wk1ma9.4d", 0x9000000, 0x1000000, CRC(29635a54) SHA1(a3109d0f8f271e2183316846df2a6a819f6a9b20) )
+ ROM_LOAD( "wk1ma10.4c", 0xa000000, 0x1000000, CRC(e96f312c) SHA1(0a92640277111aef5c6e9dab4218a8ae2196ce61) )
+
+ // 25209801 2000 317-5040-COM Naomi
+ ROM_PARAMETER( ":rom_board:segam2crypt:key", "052e2901" )
+ROM_END
+
ROM_START( wldkicksa )
NAOMI_BIOS
NAOMI_DEFAULT_EEPROM
@@ -6343,7 +6403,7 @@ ROM_START( wldkicks )
ROM_PARAMETER( ":rom_board:segam2crypt:key", "052e2901" )
ROM_END
-ROM_START( wldkicksj )
+ROM_START( wldkickspj )
NAOMI_BIOS
NAOMI_DEFAULT_EEPROM
@@ -6700,22 +6760,22 @@ ROM_START( inunoos )
ROM_REGION( 0x8800000, "rom_board", ROMREGION_ERASEFF)
ROM_LOAD( "epr-22294a.ic22", 0x000000, 0x400000, CRC(bc3a1397) SHA1(73747f10ea034bd0fc952939c6c7576dab9640a6) )
- ROM_LOAD( "ic1s.bin", 0x0800000, 0x800000, CRC(0afec6d7) SHA1(fad13f7c205d048006b48c1f262f272a9d653630) )
- ROM_LOAD( "ic2s.bin", 0x1000000, 0x800000, CRC(80b4a397) SHA1(c7d41a48c327b8ae9fefb15149ad5341b86ff933) )
- ROM_LOAD( "ic3s.bin", 0x1800000, 0x800000, CRC(a58fde28) SHA1(db271690131f093a329a457aa234659cbdba4ad1) )
- ROM_LOAD( "ic4s.bin", 0x2000000, 0x800000, CRC(6fcc34f6) SHA1(28f4d69fdd4e151cf1d98303d5f7ac8ff6d4c141) )
- ROM_LOAD( "ic5s.bin", 0x2800000, 0x800000, CRC(d5582d3e) SHA1(b21eda63314983fff7b88d2ad6ddcd8a2ef20e32) )
- ROM_LOAD( "ic6s.bin", 0x3000000, 0x800000, CRC(24b9fa3b) SHA1(b85be6085c476c8683c6d9e9b72e6021385a376a) )
- ROM_LOAD( "ic7s.bin", 0x3800000, 0x800000, CRC(bb80e02a) SHA1(73e7fda34295eb3b67ac04e46206a3a399b7b88a) )
- ROM_LOAD( "ic8s.bin", 0x4000000, 0x800000, CRC(59e2e25b) SHA1(e32d59dca85f246781a411bd8d0bec8fabc3b26d) )
- ROM_LOAD( "ic9s.bin", 0x4800000, 0x800000, CRC(41eac8af) SHA1(594efd94ea053229f0c807591b4f38643f0995c2) )
- ROM_LOAD( "ic10s.bin", 0x5000000, 0x800000, CRC(811f6e65) SHA1(71448b91d2c68df119a767fc29692bbf115edb37) )
- ROM_LOAD( "ic11s.bin", 0x5800000, 0x800000, CRC(ad1375e8) SHA1(17eeaad1becbf0ad0d68e10457c0d3dac9f168da) )
- ROM_LOAD( "ic12s.bin", 0x6000000, 0x800000, CRC(7e7826c0) SHA1(6a13fb7471555732292ee8e4709ee191aee2528c) )
- ROM_LOAD( "ic13s.bin", 0x6800000, 0x800000, CRC(38a192da) SHA1(501c25190af153d1364a90762c7994ac797a498d) )
- ROM_LOAD( "ic14s.bin", 0x7000000, 0x800000, CRC(79ca1d44) SHA1(449509110a7e181e0e495fe3e1d21762b6e4ce08) )
- ROM_LOAD( "ic15s.bin", 0x7800000, 0x800000, CRC(b85e13ef) SHA1(974f6b8f24efe79d72ea9d7a2cfccf479704243d) )
- ROM_LOAD( "ic16s.bin", 0x8000000, 0x800000, CRC(b8493dbe) SHA1(b641417e1bda49341e7ff86340072d74e3330665) )
+ ROM_LOAD( "rom1.ic1s", 0x0800000, 0x800000, CRC(0afec6d7) SHA1(fad13f7c205d048006b48c1f262f272a9d653630) )
+ ROM_LOAD( "rom2.ic2s", 0x1000000, 0x800000, CRC(80b4a397) SHA1(c7d41a48c327b8ae9fefb15149ad5341b86ff933) )
+ ROM_LOAD( "rom3.ic3s", 0x1800000, 0x800000, CRC(a58fde28) SHA1(db271690131f093a329a457aa234659cbdba4ad1) )
+ ROM_LOAD( "rom4.ic4s", 0x2000000, 0x800000, CRC(6fcc34f6) SHA1(28f4d69fdd4e151cf1d98303d5f7ac8ff6d4c141) )
+ ROM_LOAD( "rom5.ic5s", 0x2800000, 0x800000, CRC(d5582d3e) SHA1(b21eda63314983fff7b88d2ad6ddcd8a2ef20e32) )
+ ROM_LOAD( "rom6.ic6s", 0x3000000, 0x800000, CRC(24b9fa3b) SHA1(b85be6085c476c8683c6d9e9b72e6021385a376a) )
+ ROM_LOAD( "rom7.ic7s", 0x3800000, 0x800000, CRC(bb80e02a) SHA1(73e7fda34295eb3b67ac04e46206a3a399b7b88a) )
+ ROM_LOAD( "rom8.ic8s", 0x4000000, 0x800000, CRC(59e2e25b) SHA1(e32d59dca85f246781a411bd8d0bec8fabc3b26d) )
+ ROM_LOAD( "rom9.ic9s", 0x4800000, 0x800000, CRC(41eac8af) SHA1(594efd94ea053229f0c807591b4f38643f0995c2) )
+ ROM_LOAD( "rom10.ic10s", 0x5000000, 0x800000, CRC(811f6e65) SHA1(71448b91d2c68df119a767fc29692bbf115edb37) )
+ ROM_LOAD( "rom11.ic11s", 0x5800000, 0x800000, CRC(ad1375e8) SHA1(17eeaad1becbf0ad0d68e10457c0d3dac9f168da) )
+ ROM_LOAD( "rom12.ic12s", 0x6000000, 0x800000, CRC(7e7826c0) SHA1(6a13fb7471555732292ee8e4709ee191aee2528c) )
+ ROM_LOAD( "rom13.ic13s", 0x6800000, 0x800000, CRC(38a192da) SHA1(501c25190af153d1364a90762c7994ac797a498d) )
+ ROM_LOAD( "rom14.ic14s", 0x7000000, 0x800000, CRC(79ca1d44) SHA1(449509110a7e181e0e495fe3e1d21762b6e4ce08) )
+ ROM_LOAD( "rom15.ic15s", 0x7800000, 0x800000, CRC(b85e13ef) SHA1(974f6b8f24efe79d72ea9d7a2cfccf479704243d) )
+ ROM_LOAD( "rom16.ic16s", 0x8000000, 0x800000, CRC(b8493dbe) SHA1(b641417e1bda49341e7ff86340072d74e3330665) )
// 840-0073 2001 317-0316-JPN Naomi
ROM_PARAMETER( ":rom_board:segam2crypt:key", "294bc3e3" )
@@ -6792,58 +6852,66 @@ ROM_START( derbyo2k )
ROM_PARAMETER( ":rom_board:segam2crypt:key", "-1") // 315-5881 not populated
ROM_END
-ROM_START( starhrse )
+
+/***** Star Horse *****/
+// complete game set, 3 unit types
+
+// Main Screens
+// ROM board ID# 840-0054B
+ROM_START( shorsem )
NAOMI_BIOS
NAOMI_DEFAULT_EEPROM
ROM_REGION( 0x4800000, "rom_board", ROMREGION_ERASEFF)
- ROM_LOAD( "epr-23625.ic22", 0x000000, 0x0400000, CRC(7300bc6c) SHA1(f0bfff190c9f02895cc1f98eb695f327c948fca3) )
+ ROM_LOAD( "epr-23625.ic22", 0x0000000, 0x0400000, CRC(7300bc6c) SHA1(f0bfff190c9f02895cc1f98eb695f327c948fca3) )
ROM_LOAD( "mpr-23231.ic1", 0x0800000, 0x1000000, CRC(e41ddc53) SHA1(f565d68d8ce4010a2181b0343fa49bfdc81ba4cf) )
ROM_LOAD( "mpr-23232.ic2", 0x1800000, 0x1000000, CRC(30f963a0) SHA1(dc56203ceae20f7a7354e505dd7f27cbce5c70e0) )
ROM_LOAD( "mpr-23233.ic3", 0x2800000, 0x1000000, CRC(d6451cab) SHA1(6508e27d0370b19df01150da7baf4875479c166a) )
ROM_LOAD( "mpr-23234.ic4", 0x3800000, 0x1000000, CRC(44044c14) SHA1(4934cb8d5f9b4085ffb5ddc711343f488aae4c4d) )
- // this dump can't be used as main_eeprom, because that's exactly 0x80 bytes
ROM_REGION(0x84, "some_eeprom", 0)
- ROM_LOAD( "sflash.bin", 0x000000, 0x000084, CRC(951684e4) SHA1(0beaf5827064252293223b946c04b8698e7207bb) )
+ ROM_LOAD( "sflash.ic46", 0x000000, 0x000084, CRC(951684e4) SHA1(0beaf5827064252293223b946c04b8698e7207bb) )
ROM_PARAMETER( ":rom_board:segam2crypt:key", "-1") // 315-5881 not populated
ROM_END
-ROM_START( starhrct )
+// Live and Backup - game logic and player's progress storage, likely there also was 2nd flash ROM board, 840-0034 or similar.
+// ROM board ID# 840-0055B
+ROM_START( shorsel )
NAOMI_BIOS
NAOMI_DEFAULT_EEPROM
ROM_REGION( 0x9800000, "rom_board", ROMREGION_ERASEFF)
ROM_LOAD( "epr-23626.ic22", 0x0000000, 0x200000, CRC(d5893a19) SHA1(861624ef3e5061b6ed9d6c4714e35fa508643b05) )
ROM_RELOAD( 0x0200000, 0x200000 )
- ROM_LOAD( "ic1s.bin", 0x0800000, 0x800000, CRC(e45ab26f) SHA1(1e40ae9778a026b0f4c3c9681cf5d08397b72c48) )
- ROM_LOAD( "ic2s.bin", 0x1000000, 0x800000, CRC(4d0e4e64) SHA1(4fe1c35f4cf34391eb1e4486bde92bd6104f05f2) )
- ROM_LOAD( "ic3s.bin", 0x1800000, 0x800000, CRC(a18c7ce7) SHA1(1e4fb63c0d8f901b077590ccc0af4bba3135f56c) )
- ROM_LOAD( "ic4s.bin", 0x2000000, 0x800000, CRC(82001b50) SHA1(d06e70d2ae4cf0635872663c5b6f1dbbd12897e0) )
- ROM_LOAD( "ic5s.bin", 0x2800000, 0x800000, CRC(5e4af8b2) SHA1(98598a0f5932cf79f54ff79cfa03632550dee373) )
- ROM_LOAD( "ic6s.bin", 0x3000000, 0x800000, CRC(2950c543) SHA1(041548e79afcadc1b0e3524432ed52320f395f3e) )
- ROM_LOAD( "ic7s.bin", 0x3800000, 0x800000, CRC(a2bb8ebb) SHA1(c5329cedf5f746c0d684d8dea301a0786909ea1d) )
- ROM_LOAD( "ic8s.bin", 0x4000000, 0x800000, CRC(fde9b537) SHA1(b186da26bef43b483fd32c486bb018dc631bf485) )
- ROM_LOAD( "ic9s.bin", 0x4800000, 0x800000, CRC(4db3e79a) SHA1(de2480792e7dfc01195000607be90fd4b29fdcc0) )
- ROM_LOAD( "ic10s.bin", 0x5000000, 0x800000, CRC(37167167) SHA1(e379d20bcda84e6aaa0b930dce95d97812cd45d6) )
- ROM_LOAD( "ic11s.bin", 0x5800000, 0x800000, CRC(927f1edb) SHA1(64f2f2f4546cc6b45ee78aeae68ce829cb57a124) )
- ROM_LOAD( "ic12s.bin", 0x6000000, 0x800000, CRC(05de610d) SHA1(715124a3e7a23589c4ca9f0dccd55a21f7d48123) )
- ROM_LOAD( "ic13s.bin", 0x6800000, 0x800000, CRC(17ed44c3) SHA1(ec34276006c3be7bd6d23c11314b0369a082e1ef) )
- ROM_LOAD( "ic14s.bin", 0x7000000, 0x800000, CRC(66d7e2a1) SHA1(69178d4995ac3c2d73d953544101d23da1812f65) )
- ROM_LOAD( "ic15s.bin", 0x7800000, 0x800000, CRC(0c701416) SHA1(6c9e882e2a00768f5e0a28d38a5695c65594d8dd) )
- ROM_LOAD( "ic16s.bin", 0x8000000, 0x800000, CRC(5d8e6e8d) SHA1(03045f3a9257632c325eba9752855b42355dff6c) )
- ROM_LOAD( "ic17s.bin", 0x8800000, 0x800000, CRC(b4c40606) SHA1(4f187dfe44bd89c90b6fa4b90f16222bc0a74d22) )
+ ROM_LOAD( "rom1.ic1s", 0x0800000, 0x800000, CRC(e45ab26f) SHA1(1e40ae9778a026b0f4c3c9681cf5d08397b72c48) )
+ ROM_LOAD( "rom2.ic2s", 0x1000000, 0x800000, CRC(4d0e4e64) SHA1(4fe1c35f4cf34391eb1e4486bde92bd6104f05f2) )
+ ROM_LOAD( "rom3.ic3s", 0x1800000, 0x800000, CRC(a18c7ce7) SHA1(1e4fb63c0d8f901b077590ccc0af4bba3135f56c) )
+ ROM_LOAD( "rom4.ic4s", 0x2000000, 0x800000, CRC(82001b50) SHA1(d06e70d2ae4cf0635872663c5b6f1dbbd12897e0) )
+ ROM_LOAD( "rom5.ic5s", 0x2800000, 0x800000, CRC(5e4af8b2) SHA1(98598a0f5932cf79f54ff79cfa03632550dee373) )
+ ROM_LOAD( "rom6.ic6s", 0x3000000, 0x800000, CRC(2950c543) SHA1(041548e79afcadc1b0e3524432ed52320f395f3e) )
+ ROM_LOAD( "rom7.ic7s", 0x3800000, 0x800000, CRC(a2bb8ebb) SHA1(c5329cedf5f746c0d684d8dea301a0786909ea1d) )
+ ROM_LOAD( "rom8.ic8s", 0x4000000, 0x800000, CRC(fde9b537) SHA1(b186da26bef43b483fd32c486bb018dc631bf485) )
+ ROM_LOAD( "rom9.ic9s", 0x4800000, 0x800000, CRC(4db3e79a) SHA1(de2480792e7dfc01195000607be90fd4b29fdcc0) )
+ ROM_LOAD( "rom10.ic10s", 0x5000000, 0x800000, CRC(37167167) SHA1(e379d20bcda84e6aaa0b930dce95d97812cd45d6) )
+ ROM_LOAD( "rom11.ic11s", 0x5800000, 0x800000, CRC(927f1edb) SHA1(64f2f2f4546cc6b45ee78aeae68ce829cb57a124) )
+ ROM_LOAD( "rom12.ic12s", 0x6000000, 0x800000, CRC(05de610d) SHA1(715124a3e7a23589c4ca9f0dccd55a21f7d48123) )
+ ROM_LOAD( "rom13.ic13s", 0x6800000, 0x800000, CRC(17ed44c3) SHA1(ec34276006c3be7bd6d23c11314b0369a082e1ef) )
+ ROM_LOAD( "rom14.ic14s", 0x7000000, 0x800000, CRC(66d7e2a1) SHA1(69178d4995ac3c2d73d953544101d23da1812f65) )
+ ROM_LOAD( "rom15.ic15s", 0x7800000, 0x800000, CRC(0c701416) SHA1(6c9e882e2a00768f5e0a28d38a5695c65594d8dd) )
+ ROM_LOAD( "rom16.ic16s", 0x8000000, 0x800000, CRC(5d8e6e8d) SHA1(03045f3a9257632c325eba9752855b42355dff6c) )
+ ROM_LOAD( "rom17.ic17s", 0x8800000, 0x800000, CRC(b4c40606) SHA1(4f187dfe44bd89c90b6fa4b90f16222bc0a74d22) )
// .18s chip is not present but is tested for an FF fill (pull-up resistors on the PCB's data bus presumably accomplish this)
- // this dump can't be used as main_eeprom, because that's exactly 0x80 bytes
ROM_REGION(0x84, "some_eeprom", 0)
- ROM_LOAD( "sflash.bin", 0x000000, 0x000084, CRC(1557297e) SHA1(41e8a7a8eaf5076b124d378afdf97e328d100e72) )
+ ROM_LOAD( "sflash.ic37", 0x000000, 0x000084, CRC(1557297e) SHA1(41e8a7a8eaf5076b124d378afdf97e328d100e72) )
ROM_PARAMETER( ":rom_board:segam2crypt:key", "-1") // 315-5881 not populated
ROM_END
-ROM_START( starhrcl )
+// Satellite
+// ROM board ID# 840-0056B
+ROM_START( shorse )
NAOMI_BIOS
NAOMI_DEFAULT_EEPROM
@@ -6857,15 +6925,124 @@ ROM_START( starhrcl )
ROM_LOAD( "mpr-23280.ic6", 0x5800000, 0x1000000, CRC(b1c8daa2) SHA1(a05fb374156ea013e35502abccc92f5117c39daa) )
ROM_LOAD( "mpr-23281.ic7", 0x6800000, 0x0800000, CRC(c0378369) SHA1(c728a181eddb01b9f8574669d4550baed559a5a4) )
- // this dump can't be used as main_eeprom, because that's exactly 0x80 bytes
ROM_REGION(0x84, "some_eeprom", 0)
- ROM_LOAD( "sflash.bin", 0x000000, 0x000084, CRC(4929e940) SHA1(f8c4277ca0ae5e36b2eed033cc731b8fc4fccafc) )
+ ROM_LOAD( "sflash.ic46", 0x000000, 0x000084, CRC(4929e940) SHA1(f8c4277ca0ae5e36b2eed033cc731b8fc4fccafc) )
ROM_PARAMETER( ":rom_board:segam2crypt:key", "-1") // 315-5881 not populated
ROM_END
-// this is satellite unit of the main game, server/control and lagre screen units required and need to be dumped
-ROM_START( starhrsp )
+
+/***** Star Horse 2001 *****/
+// currently we have only Satellite unit ROM board dumped, server/control and large screen units is missing.
+// ID# 837-14114-01-91
+// ROM board ID# 840-0078B REV.B
+ROM_START( shors2k1 )
+ NAOMI_BIOS
+ NAOMI_DEFAULT_EEPROM
+
+ ROM_REGION( 0x7800000, "rom_board", ROMREGION_ERASEFF)
+ ROM_LOAD("epr-23739b.ic22", 0x00000000, 0x00400000, CRC(2d19b6a2) SHA1(1cf0294a32a870b34164786db9df29dd23cf790a) )
+ ROM_LOAD("mpr-23740.ic1", 0x00800000, 0x01000000, CRC(e84f8611) SHA1(4b6f174cac37b6c50d2151e25bba52c87ac738fe) )
+ ROM_LOAD("mpr-23741.ic2", 0x01800000, 0x01000000, CRC(5fd84c54) SHA1(2913a1d67674de2cc0165ec0e7556288ca2ea6c6) )
+ ROM_LOAD("mpr-23742.ic3", 0x02800000, 0x01000000, CRC(240e1779) SHA1(ac25c217e9772d16465f26d1ad7f514d745e9ec2) )
+ ROM_LOAD("mpr-23743.ic4", 0x03800000, 0x01000000, CRC(d9dc0a12) SHA1(d374a09d6e7a94075720b137879e64daca197ef8) )
+ ROM_LOAD("mpr-23744.ic5", 0x04800000, 0x01000000, CRC(95759982) SHA1(e09c20d1acad55f8cfb38dfec7c55ec97165190c) )
+ ROM_LOAD("mpr-23745.ic6", 0x05800000, 0x01000000, CRC(0eda5807) SHA1(589aac6262dc4168793fd41bb88760123408328f) )
+ ROM_LOAD("mpr-23746.ic7", 0x06800000, 0x01000000, CRC(955bb184) SHA1(05436d4eed330bc0b71897650d9df601453cde6f) )
+
+ ROM_REGION(0x84, "some_eeprom", 0)
+ ROM_LOAD( "sflash.ic46", 0x000000, 0x000084, CRC(bfce576f) SHA1(c3aa638c280a12df71a09c55adc2b87c37cf4f90) )
+
+ ROM_PARAMETER( ":rom_board:segam2crypt:key", "-1") // 315-5881 not populated
+ROM_END
+
+
+/***** Star Horse 2002 *****/
+// nothing dumped
+
+
+/***** Star Horse Progress *****/
+// complete game set, this game setup have 4 following unit types and 5 different ROM boards.
+
+// Main Screens, ID# 837-14373-01 and 837-14374-01
+// ROM board ID# 840-0120B REV.B
+ROM_START( shorsepm )
+ NAOMI_BIOS
+ NAOMI_DEFAULT_EEPROM
+
+ ROM_REGION( 0x6800000, "rom_board", ROMREGION_ERASEFF)
+ ROM_LOAD("epr-24087b.ic22", 0x00000000, 0x00400000, CRC(9388f109) SHA1(b441bacd1af14ba0488c0f25fd6e6657b1de0cf6) )
+ ROM_LOAD("mpr-24088.ic1", 0x00800000, 0x01000000, CRC(386d9a06) SHA1(c923be8a60a15bc7a747aa4a3c0ed66cc00aae79) )
+ ROM_LOAD("mpr-24089.ic2", 0x01800000, 0x01000000, CRC(404e231b) SHA1(fa6f4c9a8463c3216468330a819efe8ecf31e278) )
+ ROM_LOAD("mpr-24090.ic3", 0x02800000, 0x01000000, CRC(48fb173d) SHA1(e5de093c96b6aebafe6ec8f36bad5a033590ad34) )
+ ROM_LOAD("mpr-24091.ic4", 0x03800000, 0x01000000, CRC(7c92174c) SHA1(8e53f31a2a9e088caf46344e6850dfbb2b9cc638) )
+ ROM_LOAD("mpr-24092.ic5", 0x04800000, 0x01000000, CRC(d32299a6) SHA1(e9bf05f9e8691d0ee4fb15346958b5bea738da30) )
+ ROM_LOAD("mpr-24093.ic6", 0x05800000, 0x01000000, CRC(6491dd68) SHA1(8777ceae12d8267bd9867385d0dc1facc6dac66c) )
+
+ ROM_PARAMETER( ":rom_board:segam2crypt:key", "-1") // 315-5881 not populated
+ROM_END
+
+// Sound & Backup, ID# 837-14375-01, have 2 stacked ROM boards
+// ROM board ID# 840-0121B REV.A
+ROM_START( shorseps )
+ NAOMI_BIOS
+ NAOMI_DEFAULT_EEPROM
+
+ ROM_REGION( 0x6800000, "rom_board", ROMREGION_ERASEFF)
+ ROM_LOAD("epr-24097a.ic22", 0x00000000, 0x00400000, CRC(ec61a9e8) SHA1(a418be12eeaa4a9c43d1c5dc87ecb5c48857a436) )
+ ROM_LOAD("mpr-24098.ic1", 0x00800000, 0x01000000, CRC(c55b45be) SHA1(3dd42a8e21323026742ae764f0a22d96475b55e0) )
+ ROM_LOAD("mpr-24099.ic2", 0x01800000, 0x01000000, CRC(e3f0f02e) SHA1(66bcbc251b43688bdc0000a1a9fd463d01ee4e04) )
+ ROM_LOAD("mpr-24100.ic3", 0x02800000, 0x01000000, CRC(a5f3cbe9) SHA1(a290d0b1c2c249cbc0473357bde73e4187c96c0d) )
+ ROM_LOAD("mpr-24101.ic4", 0x03800000, 0x01000000, CRC(daaf9531) SHA1(5a9651c69d3dd6367cf7f92546ffbb4be65635de) )
+ ROM_LOAD("mpr-24102.ic5", 0x04800000, 0x01000000, CRC(55121ff3) SHA1(c5bc7839b8f9c93a2e600589ce5e158742afda0e) )
+ ROM_LOAD("mpr-24103.ic6", 0x05800000, 0x01000000, CRC(bfbc3569) SHA1(c8ba7df05d675a15b3eb7c941e9ba231a30e746a) )
+
+ ROM_PARAMETER( ":rom_board:segam2crypt:key", "-1") // 315-5881 not populated
+ROM_END
+
+// HORSE DATA
+// ROM board ID# 840-0034B
+// flash ROM board, used to store backup data, probably players saves, mostly empty
+ROM_START( shorsepb )
+ NAOMI_BIOS
+ NAOMI_DEFAULT_EEPROM
+
+ ROM_REGION( 0x1800000, "rom_board", ROMREGION_ERASEFF)
+ ROM_LOAD("rom1.ic1s", 0x00800000, 0x00800000, CRC(d1305180) SHA1(07078484ba938af9c1124521e90b1b4540c63fbd) )
+ ROM_LOAD("rom2.ic2s", 0x01000000, 0x00800000, CRC(cfb9881d) SHA1(97632db5a99e15fd9256db195bf6ae60f848df74) )
+
+ ROM_REGION(0x84, "some_eeprom", 0)
+ ROM_LOAD( "sflash.ic37", 0x000000, 0x000084, CRC(fe8f8f5c) SHA1(839461ab736e0228dec7e2512e1692d6ecc4e664) )
+
+ ROM_PARAMETER( ":rom_board:segam2crypt:key", "-1") // 315-5881 not populated
+ROM_END
+
+// Live (game logic server), ID# 837-14376-01
+// ROM board ID# 840-0122B
+ROM_START( shorsepl )
+ NAOMI_BIOS
+ NAOMI_DEFAULT_EEPROM
+
+ ROM_REGION( 0xb800000, "rom_board", ROMREGION_ERASEFF)
+ ROM_LOAD("epr-24107a.ic22", 0x00000000, 0x00400000, CRC(8df0f545) SHA1(b89c0d4bf1d5e95176251b6ea42b1d9f885d14bf) )
+ ROM_LOAD("mpr-24108.ic1", 0x00800000, 0x01000000, CRC(e8e9c09c) SHA1(5e3d938fa5958c40c59511eef1f2607af7768cc9) )
+ ROM_LOAD("mpr-24109.ic2", 0x01800000, 0x01000000, CRC(a5c103d0) SHA1(8f138146a95553c725298c179776ee312beda6d0) )
+ ROM_LOAD("mpr-24110.ic3", 0x02800000, 0x01000000, CRC(58a5a8c2) SHA1(913d9e5f00a657e407855f00bf6db0af621ae2ca) )
+ ROM_LOAD("mpr-24111.ic4", 0x03800000, 0x01000000, CRC(dcb17013) SHA1(f5523089f0844d43c1bab2044b5de241455e7526) )
+ ROM_LOAD("mpr-24112.ic5", 0x04800000, 0x01000000, CRC(711e656b) SHA1(ef3dc54c92a3347da3c5ca697f2ad550906bd44b) )
+ ROM_LOAD("mpr-24113.ic6", 0x05800000, 0x01000000, CRC(d6c7d611) SHA1(48955388e86a9f5aa44319501fd339cc662d5647) )
+ ROM_LOAD("mpr-24114.ic7", 0x06800000, 0x01000000, CRC(cb1846b7) SHA1(49d0e51921c2c48b07290cd344b5df73df6d333e) )
+ ROM_LOAD("mpr-24115.ic8", 0x07800000, 0x01000000, CRC(73c5168d) SHA1(d999b8d2c3b554ca4c256c1da2a5ad3741a6b3fd) )
+ ROM_LOAD("mpr-24116.ic9", 0x08800000, 0x01000000, CRC(e074c41a) SHA1(77d8c5a98bd42d199e8e5a5e53b40fe3a1d5a349) )
+ ROM_LOAD("mpr-24117.ic10", 0x09800000, 0x01000000, CRC(d6d33ab2) SHA1(1f4c182ac9eebe7b3d0a14f8984f59ffd6979ac0) )
+ ROM_LOAD("mpr-24118.ic11", 0x0a800000, 0x01000000, CRC(99b64022) SHA1(e324f8f042dac1849692a05d8d7aa71d80c36ff3) )
+
+ ROM_PARAMETER( ":rom_board:segam2crypt:key", "-1") // 315-5881 not populated
+ROM_END
+
+// Satellite, ID# 837-14377-01
+// ROM board ID# 840-0123B REV.A
+ROM_START( shorsep )
NAOMI_BIOS
NAOMI_DEFAULT_EEPROM
@@ -6882,6 +7059,24 @@ ROM_START( starhrsp )
ROM_PARAMETER( ":rom_board:segam2crypt:key", "-1") // 315-5881 not populated
ROM_END
+
+/***** Star Horse Progress Returns *****/
+// currently we have only Satellite unit ROM board dumped, server/control and large screen units is missing.
+// ROM board ID# 840-0186B
+ROM_START( shorsepr )
+ NAOMI_BIOS
+ NAOMI_DEFAULT_EEPROM
+
+ ROM_REGION( 0x8000000, "rom_board", ROMREGION_ERASEFF)
+ ROM_LOAD( "fpr-24489.ic8", 0x00000000, 0x4000000, CRC(156797a4) SHA1(b20da57726974c5d772885fe809c4bbf89012db6) )
+ ROM_LOAD( "fpr-24490.ic9", 0x04000000, 0x4000000, CRC(b6c40348) SHA1(37b5b334c24536e5b2062c233423f0e3d338e1f2) )
+
+ // PIC not populated
+ ROM_REGION( 0x800, "pic_readout", ROMREGION_ERASE00 )
+
+ ROM_PARAMETER( ":rom_board:id", "5502" )
+ROM_END
+
/* prototype cartridges for games released on GD-ROM */
ROM_START( puyofevp )
@@ -6914,7 +7109,6 @@ ROM_START( puyofevp )
ROM_COPY( "rom_board", 0x01000000, 0x400000, 0xc00000 )
- // this dump can't be used as main_eeprom, because that's exactly 0x80 bytes
ROM_REGION(0x84, "some_eeprom", 0)
ROM_LOAD( "sflash.bin", 0x000000, 0x000084, CRC(17150bc9) SHA1(c3af7d91e12141938d2b9e67eb9f5ff961cd09ff) )
@@ -8237,29 +8431,29 @@ ROM_START( soulsurf )
NAOMI_DEFAULT_EEPROM
ROM_REGION( 0xb000000, "rom_board", ROMREGION_ERASEFF)
- // Cart has a Sega factory EPROM sticker stating "EPR-23838C" and a Sega factory sticker stating "Rev. A". Seriously.
+ // Cart has a Sega factory EPROM sticker stating "EPR-23838C" and a Sega factory sticker on cart case stating "Rev. A".
ROM_LOAD( "epr-23838c.ic22", 0x000000, 0x400000, CRC(5e5fb00f) SHA1(c5e81ebead9072cc08f09d1715d609cb0f7631ba) )
- ROM_LOAD( "ic1s.bin", 0x0800000, 0x800000, CRC(4f12f789) SHA1(7b79b687fc61e2e981b9e5e8e0939c4ad24a98f0) )
- ROM_LOAD( "ic2s.bin", 0x1000000, 0x800000, CRC(a255d41a) SHA1(3e932527eb68edf3e8538c1ad264a1c599f6a9d5) )
- ROM_LOAD( "ic3s.bin", 0x1800000, 0x800000, CRC(0f8d6577) SHA1(afaf440e667bacc941c0a5418a0e3b0f2bb725b7) )
- ROM_LOAD( "ic4s.bin", 0x2000000, 0x800000, CRC(bdf25bd0) SHA1(f79b1fdba9c48969c49617c43c1919637adb13ba) )
- ROM_LOAD( "ic5s.bin", 0x2800000, 0x800000, CRC(a74b3bb4) SHA1(0ce7cef849061a9af7a61d69dc633f6971a3a63d) )
- ROM_LOAD( "ic6s.bin", 0x3000000, 0x800000, CRC(3cd1f5d5) SHA1(77573c3a60af64e6e6a0eb85d5b8176ed98b0723) )
- ROM_LOAD( "ic7s.bin", 0x3800000, 0x800000, CRC(00d240f5) SHA1(43010fc596f2cdffdff35a6122f2ab02a5251bc0) )
- ROM_LOAD( "ic8s.bin", 0x4000000, 0x800000, CRC(d4907fa1) SHA1(79b1c771819f6e4baa048010bfb940a45370eba2) )
- ROM_LOAD( "ic9s.bin", 0x4800000, 0x800000, CRC(6327d49e) SHA1(a10e3c27f70dbf18e63cf51962b6a79a52eba26c) )
- ROM_LOAD( "ic10s.bin", 0x5000000, 0x800000, CRC(7975dc80) SHA1(81bda50968f0153a0c4432d8d81e817c1e82e5b2) )
- ROM_LOAD( "ic11s.bin", 0x5800000, 0x800000, CRC(a242f682) SHA1(435ea5bb1b3667f9ef3d7de081b15f4e8e6a0d01) )
- ROM_LOAD( "ic12s.bin", 0x6000000, 0x800000, CRC(45fa259e) SHA1(8d7e708e7a2cbc2d60b68715dd79bac28d894d4c) )
- ROM_LOAD( "ic13s.bin", 0x6800000, 0x800000, CRC(e9578063) SHA1(618f66d01f6bdacbf2a3242774a316b130594e02) )
- ROM_LOAD( "ic14s.bin", 0x7000000, 0x800000, CRC(2edc1311) SHA1(bceb54dd29012580e2e6f15f16c6b31195010153) )
- ROM_LOAD( "ic15s.bin", 0x7800000, 0x800000, CRC(416db320) SHA1(34536716a35260d9457703704bb9174fb1616d60) )
- ROM_LOAD( "ic16s.bin", 0x8000000, 0x800000, CRC(2530cc04) SHA1(6425c031e5a129a3c9451bc694b5da8553f154c2) )
- ROM_LOAD( "ic17s.bin", 0x8800000, 0x800000, CRC(9e6afcc2) SHA1(4fb69d834ea12c82e897af47a22dcc47f3c83768) )
- ROM_LOAD( "ic18s.bin", 0x9000000, 0x800000, CRC(854ed5e5) SHA1(e445599f6a9e9d05c279259307edc08bce5d6d1f) )
- ROM_LOAD( "ic19s.bin", 0x9800000, 0x800000, CRC(4f8ec86a) SHA1(406ab9eeccd99fa5515d4a2c229c8db1a5cb8f83) )
- ROM_LOAD( "ic20s.bin", 0xa000000, 0x800000, CRC(c90b960d) SHA1(66e9f09d1f7f6a991371574a2e095c0e22fb7031) )
- ROM_LOAD( "ic21s.bin", 0xa800000, 0x800000, CRC(1477c064) SHA1(87fb8d8a91d6bed70b246a8df88fa77fbf3db443) )
+ ROM_LOAD( "rom1.ic1s", 0x0800000, 0x800000, CRC(4f12f789) SHA1(7b79b687fc61e2e981b9e5e8e0939c4ad24a98f0) )
+ ROM_LOAD( "rom2.ic2s", 0x1000000, 0x800000, CRC(a255d41a) SHA1(3e932527eb68edf3e8538c1ad264a1c599f6a9d5) )
+ ROM_LOAD( "rom3.ic3s", 0x1800000, 0x800000, CRC(0f8d6577) SHA1(afaf440e667bacc941c0a5418a0e3b0f2bb725b7) )
+ ROM_LOAD( "rom4.ic4s", 0x2000000, 0x800000, CRC(bdf25bd0) SHA1(f79b1fdba9c48969c49617c43c1919637adb13ba) )
+ ROM_LOAD( "rom5.ic5s", 0x2800000, 0x800000, CRC(a74b3bb4) SHA1(0ce7cef849061a9af7a61d69dc633f6971a3a63d) )
+ ROM_LOAD( "rom6.ic6s", 0x3000000, 0x800000, CRC(3cd1f5d5) SHA1(77573c3a60af64e6e6a0eb85d5b8176ed98b0723) )
+ ROM_LOAD( "rom7.ic7s", 0x3800000, 0x800000, CRC(00d240f5) SHA1(43010fc596f2cdffdff35a6122f2ab02a5251bc0) )
+ ROM_LOAD( "rom8.ic8s", 0x4000000, 0x800000, CRC(d4907fa1) SHA1(79b1c771819f6e4baa048010bfb940a45370eba2) )
+ ROM_LOAD( "rom9.ic9s", 0x4800000, 0x800000, CRC(6327d49e) SHA1(a10e3c27f70dbf18e63cf51962b6a79a52eba26c) )
+ ROM_LOAD( "rom10.ic10s", 0x5000000, 0x800000, CRC(7975dc80) SHA1(81bda50968f0153a0c4432d8d81e817c1e82e5b2) )
+ ROM_LOAD( "rom11.ic11s", 0x5800000, 0x800000, CRC(a242f682) SHA1(435ea5bb1b3667f9ef3d7de081b15f4e8e6a0d01) )
+ ROM_LOAD( "rom12.ic12s", 0x6000000, 0x800000, CRC(45fa259e) SHA1(8d7e708e7a2cbc2d60b68715dd79bac28d894d4c) )
+ ROM_LOAD( "rom13.ic13s", 0x6800000, 0x800000, CRC(e9578063) SHA1(618f66d01f6bdacbf2a3242774a316b130594e02) )
+ ROM_LOAD( "rom14.ic14s", 0x7000000, 0x800000, CRC(2edc1311) SHA1(bceb54dd29012580e2e6f15f16c6b31195010153) )
+ ROM_LOAD( "rom15.ic15s", 0x7800000, 0x800000, CRC(416db320) SHA1(34536716a35260d9457703704bb9174fb1616d60) )
+ ROM_LOAD( "rom16.ic16s", 0x8000000, 0x800000, CRC(2530cc04) SHA1(6425c031e5a129a3c9451bc694b5da8553f154c2) )
+ ROM_LOAD( "rom17.ic17s", 0x8800000, 0x800000, CRC(9e6afcc2) SHA1(4fb69d834ea12c82e897af47a22dcc47f3c83768) )
+ ROM_LOAD( "rom18.ic18s", 0x9000000, 0x800000, CRC(854ed5e5) SHA1(e445599f6a9e9d05c279259307edc08bce5d6d1f) )
+ ROM_LOAD( "rom19.ic19s", 0x9800000, 0x800000, CRC(4f8ec86a) SHA1(406ab9eeccd99fa5515d4a2c229c8db1a5cb8f83) )
+ ROM_LOAD( "rom20.ic20s", 0xa000000, 0x800000, CRC(c90b960d) SHA1(66e9f09d1f7f6a991371574a2e095c0e22fb7031) )
+ ROM_LOAD( "rom21.ic21s", 0xa800000, 0x800000, CRC(1477c064) SHA1(87fb8d8a91d6bed70b246a8df88fa77fbf3db443) )
ROM_PARAMETER( ":rom_board:segam2crypt:key", "-1") // 315-5881 not populated
ROM_END
@@ -8304,10 +8498,11 @@ ROM_START( hopper )
ROM_REGION( 0xb000000, "rom_board", ROMREGION_ERASEFF)
ROM_LOAD( "epr-24083.ic11", 0x000000, 0x400000, CRC(2733e65a) SHA1(4a5d109d0531bebd8e8f585789adce98cac2ab93) )
- ROM_REGION( 0x40000, "flash", ROMREGION_ERASEFF)
+ // Xilinx Spartan XC2S50 configuration EEPROM dump
+ ROM_REGION( 0x40000, "fpga", ROMREGION_ERASEFF)
ROM_LOAD( "315-6358a.ic2", 0x000000, 0x020008, CRC(ef442e67) SHA1(70ac91e2ca1ff2dfba48d566e4de68bd8b82f282) )
- // this dump can't be used as main_eeprom, because that's exactly 0x80 bytes
+ // actual ROM board doesnt have X76F100 EEPROM, it seems simulated by Actel FPGA
ROM_REGION(0x84, "some_eeprom", 0)
ROM_LOAD( "sflash.bin", 0x000000, 0x000084, CRC(ddedf494) SHA1(f1529615711a9871051cd09c2a9b95c90d356874) )
@@ -8406,7 +8601,7 @@ ROM_START( clubkprz )
ROM_COPY( "rom_board", 0x1000000, 0x400000, 0xc00000 )
- // this dump can't be used as main_eeprom, because that's exactly 0x80 bytes
+ // actual ROM board doesnt have X76F100 EEPROM, it seems simulated by Actel FPGA
ROM_REGION(0x84, "some_eeprom", 0)
ROM_LOAD( "at25010.ic3s", 0x000000, 0x000084, CRC(0142d8be) SHA1(5922b6c47b12b19e1fa7bbe9aae391905038a7ff) )
@@ -8439,7 +8634,7 @@ ROM_START( clubkpzb )
ROM_COPY( "rom_board", 0x1000000, 0x400000, 0xc00000 )
- // this dump can't be used as main_eeprom, because that's exactly 0x80 bytes
+ // actual ROM board doesnt have X76F100 EEPROM, it seems simulated by Actel FPGA
ROM_REGION(0x84, "some_eeprom", 0)
ROM_LOAD( "sflash.bin", 0x000000, 0x000084, CRC(afff6471) SHA1(c1e1d349ff25191eba09cd7d7186fbe2c6565b81) )
@@ -8985,7 +9180,7 @@ ROM_END
// EN cartridges have this area empty (FF-filled), i.e. AW-NET features not used.
// JP cartridges have it filled with unique ID, which also means dumps of several JP cartridges will differ by this few bytes.
-DRIVER_INIT_MEMBER(naomi_state,atomiswave)
+DRIVER_INIT_MEMBER(atomiswave_state,atomiswave)
{
uint64_t *ROM = (uint64_t *)memregion("awflash")->base();
@@ -8995,7 +9190,7 @@ DRIVER_INIT_MEMBER(naomi_state,atomiswave)
aw_ctrl_type = 0;
}
-READ64_MEMBER(naomi_state::xtrmhnt2_hack_r)
+READ64_MEMBER(atomiswave_state::xtrmhnt2_hack_r)
{
// disable ALL.Net board check
if (space.device().safe_pc() == 0xc03cb30)
@@ -9010,10 +9205,10 @@ READ64_MEMBER(naomi_state::xtrmhnt2_hack_r)
return 0;
}
-DRIVER_INIT_MEMBER(naomi_state,xtrmhnt2)
+DRIVER_INIT_MEMBER(atomiswave_state,xtrmhnt2)
{
DRIVER_INIT_CALL(atomiswave);
- m_maincpu->space(AS_PROGRAM).install_read_handler(0x1000000, 0x100011f, read64_delegate(FUNC(naomi_state::xtrmhnt2_hack_r), this));
+ m_maincpu->space(AS_PROGRAM).install_read_handler(0x1000000, 0x100011f, read64_delegate(FUNC(atomiswave_state::xtrmhnt2_hack_r), this));
}
ROM_START( fotns )
@@ -9597,117 +9792,122 @@ ROM_END
/* GDROM */ GAME( 2001, naomigd, 0, naomi, naomi, naomi_state, naomi, ROT0, "Sega", "Naomi GD-ROM Bios", GAME_FLAGS|MACHINE_IS_BIOS_ROOT )
/* 834-xxxxx (Sega Naomi cart with game specific BIOS sets) */
-/* 13636-01 */ GAME( 1998, hotd2, hod2bios, naomim2, hotd2, naomi_state, hotd2, ROT0, "Sega", "House of the Dead 2 (USA)", GAME_FLAGS ) /* specific BIOS "hod2bios" needed */
-/* 13636 */ GAME( 1998, hotd2o, hotd2, naomim2, hotd2, naomi_state, hotd2, ROT0, "Sega", "House of the Dead 2", GAME_FLAGS ) /* specific BIOS "hod2bios" needed */
-/* none */ GAME( 1998, hotd2p, hotd2, naomim2, hotd2, naomi_state, hotd2, ROT0, "Sega", "House of the Dead 2 (prototype)", GAME_FLAGS ) /* specific BIOS "hod2bios" needed */
-/* 13842 */ GAME( 1999, f355, f355dlx, naomim2, naomi, driver_device, 0, ROT0, "Sega", "Ferrari F355 Challenge (deluxe, no link)", GAME_FLAGS ) /* specific BIOS "f355dlx" needed */
-/* 13950 */ GAME( 1999, f355twin, f355bios, naomim2, naomi, driver_device, 0, ROT0, "Sega", "Ferrari F355 Challenge (twin/deluxe)", GAME_FLAGS ) /* specific BIOS "f355bios" needed */
-/* none */ GAME( 2001, f355twn2, f355bios, naomim2, naomi, driver_device, 0, ROT0, "Sega", "Ferrari F355 Challenge 2 - International Course Edition (twin/deluxe)", GAME_FLAGS ) /* specific BIOS "f355bios" needed */
-/* ????? */ GAME( 1999, alpiltdx, airlbios, naomim2, naomi, driver_device, 0, ROT0, "Sega", "Airline Pilots (deluxe) (Rev B)", GAME_FLAGS ) /* specific BIOS "airlbios" needed */
+/* 13636-01 */ GAME( 1998, hotd2, hod2bios, naomim2, hotd2, naomi_state, hotd2, ROT0, "Sega", "House of the Dead 2 (USA)", GAME_FLAGS ) /* specific BIOS "hod2bios" needed */
+/* 13636 */ GAME( 1998, hotd2o, hotd2, naomim2, hotd2, naomi_state, hotd2, ROT0, "Sega", "House of the Dead 2", GAME_FLAGS ) /* specific BIOS "hod2bios" needed */
+/* none */ GAME( 1998, hotd2p, hotd2, naomim2, hotd2, naomi_state, hotd2, ROT0, "Sega", "House of the Dead 2 (prototype)", GAME_FLAGS ) /* specific BIOS "hod2bios" needed */
+/* 13842 */ GAME( 1999, f355, f355dlx, naomim2, naomi, driver_device, 0, ROT0, "Sega", "Ferrari F355 Challenge (deluxe, no link)", GAME_FLAGS ) /* specific BIOS "f355dlx" needed */
+/* 13950 */ GAME( 1999, f355twin, f355bios, naomim2, naomi, driver_device, 0, ROT0, "Sega", "Ferrari F355 Challenge (twin/deluxe)", GAME_FLAGS ) /* specific BIOS "f355bios" needed */
+/* none */ GAME( 2001, f355twn2, f355bios, naomim2, naomi, driver_device, 0, ROT0, "Sega", "Ferrari F355 Challenge 2 - International Course Edition (twin/deluxe)", GAME_FLAGS ) /* specific BIOS "f355bios" needed */
+/* ????? */ GAME( 1999, alpiltdx, airlbios, naomim2, naomi, driver_device, 0, ROT0, "Sega", "Airline Pilots (deluxe) (Rev B)", GAME_FLAGS ) /* specific BIOS "airlbios" needed */
/* 840-xxxxx (Sega Naomi cart games)*/
-/* 0001 */ GAME( 1998, dybbnao, naomi, naomim2, dybbnao, naomi_state, naomi, ROT0, "Sega", "Dynamite Baseball NAOMI (Japan)", GAME_FLAGS )
-/* 0002 */ GAME( 1999, crzytaxi, naomi, naomim2, crzytaxi,naomi_state, naomi, ROT0, "Sega", "Crazy Taxi", GAME_FLAGS )
-/* 0003 */ GAME( 1999, zombrvno, zombrvn, naomim2, zombrvn, naomi_state, naomi, ROT0, "Sega", "Zombie Revenge", GAME_FLAGS )
-/* 0003 */ GAME( 1999, zombrvn, naomi, naomim2, zombrvn, naomi_state, naomi, ROT0, "Sega", "Zombie Revenge (Rev A)", GAME_FLAGS )
-/* 0004 */ GAME( 1999, ringout, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Ring Out 4x4", GAME_FLAGS )
-/* 0005 */ GAME( 1999, alpilota, naomi, naomim2, alpilota,naomi_state, naomi, ROT0, "Sega", "Airline Pilots (Rev A)", GAME_FLAGS ) /* specific BIOS "airlbios" needed */
-/* 0007 */ GAME( 1999, ggram2, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Giant Gram: All Japan Pro Wrestling 2 (Japan)", GAME_FLAGS )
-/* 0008 */ GAME( 1999, tduno, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Touch de Uno! / Unou Nouryoku Check Machine (Japan)", GAME_FLAGS )
-/* 0010 */ GAME( 1999, vs2_2k, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Virtua Striker 2 Ver. 2000 (Rev C)", GAME_FLAGS )
-/* 0011 */ GAME( 1999, toyfight, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Toy Fighter", GAME_FLAGS )
-/* 0012 -01*/GAME( 1999, smlg99, naomi, naomim2, dybbnao, naomi_state, naomi, ROT0, "Sega", "World Series 99 / Super Major League 99", GAME_FLAGS )
-/* 0013 */ GAME( 1999, jambo, naomi, naomim2, jambo, naomi_state, naomi, ROT0, "Sega", "Jambo! Safari (Rev A)", GAME_FLAGS )
-/* 0015 */ GAME( 1999, vtennis, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Virtua Tennis / Power Smash", GAME_FLAGS )
-/* 0016 */ GAME( 1999, derbyoc, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Derby Owners Club (Japan, Rev B)", GAME_FLAGS )
-/* 0017 */ GAME( 1999, otrigger, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "OutTrigger", GAME_FLAGS )
-/* 0018 */ GAME( 1999, sgtetris, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Sega Tetris", GAME_FLAGS )
-/* 0019 */ GAME( 1999, dybb99, naomi, naomim2, dybbnao, naomi_state, naomi, ROT0, "Sega", "Dynamite Baseball '99 (Japan, Rev B)", GAME_FLAGS )
-/* 0020 */ GAME( 1999, samba, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Samba De Amigo (Rev B)", GAME_FLAGS )
-/* none */ GAME( 1999, sambap, samba, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Samba De Amigo (USA, prototype)", GAME_FLAGS )
-/* none */ GAME( 2000, virnbap, virnba, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Virtua NBA (prototype)", GAME_FLAGS )
-/* 0021 */ GAME( 2000, virnbao, virnba, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Virtua NBA", GAME_FLAGS )
-/* 0021-01*/GAME( 2000,virnba, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Virtua NBA (USA)", GAME_FLAGS )
-/* 0022 */ GAME( 2000, tduno2, naomi, naomim1, naomi, naomi_state, naomi, ROT0, "Sega", "Touch de Uno! 2 (Japan)", GAME_FLAGS )
-/* 0023 */ GAME( 2000, 18wheelr, naomi, naomim2, 18wheelr,naomi_state, naomi, ROT0, "Sega", "18 Wheeler (deluxe) (Rev A)", GAME_FLAGS )
-/* 0025 */ GAME( 1999, marstv, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Mars TV (Japan)", GAME_FLAGS )
-/* 0026 */ GAME( 2000, totdo, totd, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "The Typing of the Dead", GAME_FLAGS )
-/* 0026 */ GAME( 2000, totd, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "The Typing of the Dead (Rev A)", GAME_FLAGS )
-/* 0027 */ GAME( 2000, smarinef, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Sega Marine Fishing", GAME_FLAGS )
-/* 0028 */ GAME( 2000, vonot, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Virtual On Oratorio Tangram M.S.B.S. ver5.66 2000 Edition", GAME_FLAGS )
-/* 0030 */ GAME( 2000, qmegamis, naomi, naomim1, naomi, naomi_state, naomi, ROT0, "Sega", "Quiz Ah Megamisama", GAME_FLAGS )
-/* 0035 */ GAME( 2000, sstrkfgt, naomi, naomim2, sstrkfgt,naomi_state, naomi, ROT0, "Sega", "Sega Strike Fighter (Rev A)", GAME_FLAGS )
-/* 0035 */ GAME( 2000, sstrkfgta,sstrkfgt, naomim2, sstrkfgt,naomi_state, naomi, ROT0, "Sega", "Sega Strike Fighter (Rev A, no training mode)", GAME_FLAGS )
-/* 0036 */ GAME( 2000, 18wheels, 18wheelr, naomim2, 18wheelr,naomi_state, naomi, ROT0, "Sega", "18 Wheeler (standard)", GAME_FLAGS )
-/* 0037 */ GAME( 2000, 18wheelu, 18wheelr, naomim2, 18wheelr,naomi_state, naomi, ROT0, "Sega", "18 Wheeler (upright)", GAME_FLAGS )
-/* 0039 */ GAME( 2000, gram2000, naomi, naomim1, naomi, naomi_state, naomi, ROT0, "Sega", "Giant Gram 2000", GAME_FLAGS )
-/* 0040 */ GAME( 2000, wwfroyal, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "WWF Royal Rumble", GAME_FLAGS )
-/* 0041 */ GAME( 2000, slasho, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Slashout", GAME_FLAGS )
+/* 0001 */ GAME( 1998, dybbnao, naomi, naomim2, dybbnao, naomi_state, naomi, ROT0, "Sega", "Dynamite Baseball NAOMI (Japan)", GAME_FLAGS )
+/* 0002 */ GAME( 1999, crzytaxi, naomi, naomim2, crzytaxi,naomi_state, naomi, ROT0, "Sega", "Crazy Taxi", GAME_FLAGS )
+/* 0003 */ GAME( 1999, zombrvno, zombrvn, naomim2, zombrvn, naomi_state, naomi, ROT0, "Sega", "Zombie Revenge", GAME_FLAGS )
+/* 0003 */ GAME( 1999, zombrvn, naomi, naomim2, zombrvn, naomi_state, naomi, ROT0, "Sega", "Zombie Revenge (Rev A)", GAME_FLAGS )
+/* 0004 */ GAME( 1999, ringout, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Ring Out 4x4", GAME_FLAGS )
+/* 0005 */ GAME( 1999, alpilota, naomi, naomim2, alpilota,naomi_state, naomi, ROT0, "Sega", "Airline Pilots (Rev A)", GAME_FLAGS ) /* specific BIOS "airlbios" needed */
+/* 0007 */ GAME( 1999, ggram2, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Giant Gram: All Japan Pro Wrestling 2 (Japan)", GAME_FLAGS )
+/* 0008 */ GAME( 1999, tduno, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Touch de Uno! / Unou Nouryoku Check Machine (Japan)", GAME_FLAGS )
+/* 0010 */ GAME( 1999, vs2_2k, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Virtua Striker 2 Ver. 2000 (Rev C)", GAME_FLAGS )
+/* 0011 */ GAME( 1999, toyfight, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Toy Fighter", GAME_FLAGS )
+/* 0012 -01*/ GAME( 1999, smlg99, naomi, naomim2, dybbnao, naomi_state, naomi, ROT0, "Sega", "World Series 99 / Super Major League 99", GAME_FLAGS )
+/* 0013 */ GAME( 1999, jambo, naomi, naomim2, jambo, naomi_state, naomi, ROT0, "Sega", "Jambo! Safari (Rev A)", GAME_FLAGS )
+/* 0015 */ GAME( 1999, vtennis, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Virtua Tennis / Power Smash", GAME_FLAGS )
+/* 0016 */ GAME( 1999, derbyoc, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Derby Owners Club (Japan, Rev B)", GAME_FLAGS )
+/* 0017 */ GAME( 1999, otrigger, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "OutTrigger", GAME_FLAGS )
+/* 0018 */ GAME( 1999, sgtetris, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Sega Tetris", GAME_FLAGS )
+/* 0019 */ GAME( 1999, dybb99, naomi, naomim2, dybbnao, naomi_state, naomi, ROT0, "Sega", "Dynamite Baseball '99 (Japan, Rev B)", GAME_FLAGS )
+/* 0020 */ GAME( 1999, samba, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Samba De Amigo (Rev B)", GAME_FLAGS )
+/* none */ GAME( 1999, sambap, samba, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Samba De Amigo (USA, prototype)", GAME_FLAGS )
+/* none */ GAME( 2000, virnbap, virnba, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Virtua NBA (prototype)", GAME_FLAGS )
+/* 0021 */ GAME( 2000, virnbao, virnba, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Virtua NBA", GAME_FLAGS )
+/* 0021-01 */ GAME( 2000, virnba, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Virtua NBA (USA)", GAME_FLAGS )
+/* 0022 */ GAME( 2000, tduno2, naomi, naomim1, naomi, naomi_state, naomi, ROT0, "Sega", "Touch de Uno! 2 (Japan)", GAME_FLAGS )
+/* 0023 */ GAME( 2000, 18wheelr, naomi, naomim2, 18wheelr,naomi_state, naomi, ROT0, "Sega", "18 Wheeler (deluxe) (Rev A)", GAME_FLAGS )
+/* 0025 */ GAME( 1999, marstv, naomi, naomim2, marstv, naomi_state, naomi, ROT0, "Sega", "Mars TV (Japan)", GAME_FLAGS )
+/* 0026 */ GAME( 2000, totdo, totd, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "The Typing of the Dead", GAME_FLAGS )
+/* 0026 */ GAME( 2000, totd, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "The Typing of the Dead (Rev A)", GAME_FLAGS )
+/* 0027 */ GAME( 2000, smarinef, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Sega Marine Fishing", GAME_FLAGS )
+/* 0028 */ GAME( 2000, vonot, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Virtual On Oratorio Tangram M.S.B.S. ver5.66 2000 Edition", GAME_FLAGS )
+/* 0030 */ GAME( 2000, qmegamis, naomi, naomim1, naomi, naomi_state, naomi, ROT0, "Sega", "Quiz Ah Megamisama", GAME_FLAGS )
+/* 0034 */ GAME( 2000, shorsepb, shorsep, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Star Horse Progress (backup data)", GAME_FLAGS )
+/* 0035 */ GAME( 2000, sstrkfgt, naomi, naomim2, sstrkfgt,naomi_state, naomi, ROT0, "Sega", "Sega Strike Fighter (Rev A)", GAME_FLAGS )
+/* 0035 */ GAME( 2000, sstrkfgta, sstrkfgt, naomim2, sstrkfgt,naomi_state, naomi, ROT0, "Sega", "Sega Strike Fighter (Rev A, no training mode)", GAME_FLAGS )
+/* 0036 */ GAME( 2000, 18wheels, 18wheelr, naomim2, 18wheelr,naomi_state, naomi, ROT0, "Sega", "18 Wheeler (standard)", GAME_FLAGS )
+/* 0037 */ GAME( 2000, 18wheelu, 18wheelr, naomim2, 18wheelr,naomi_state, naomi, ROT0, "Sega", "18 Wheeler (upright)", GAME_FLAGS )
+/* 0039 */ GAME( 2000, gram2000, naomi, naomim1, naomi, naomi_state, naomi, ROT0, "Sega", "Giant Gram 2000", GAME_FLAGS )
+/* 0040 */ GAME( 2000, wwfroyal, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "WWF Royal Rumble", GAME_FLAGS )
+/* 0041 */ GAME( 2000, slasho, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Slashout", GAME_FLAGS )
// 0042 Ferrari F355 Challenge 2 - International Course Edition (twin/deluxe) - identical to f355twn2 listed above.
-/* 0043 */ GAME( 2000, crackndj, naomi, naomim2, crackndj,naomi_state, naomi, ROT0, "Sega", "Crackin' DJ", GAME_FLAGS )
-/* 0044 */ GAME( 2000, csmasho, csmash, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Cosmic Smash", GAME_FLAGS )
-/* 0044 */ GAME( 2000, csmash, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Cosmic Smash (Rev A)", GAME_FLAGS )
-/* 0045 */ GAME( 1999, tokyobus, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Fortyfive", "Tokyo Bus Guide (Japan, Rev A)", GAME_FLAGS )
-/* 0047 */ GAME( 2000, samba2k, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Samba de Amigo ver. 2000 (Japan)", GAME_FLAGS )
-/* 0048 */ GAME( 2001, alienfnt, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Alien Front (Rev T)", GAME_FLAGS )
-/* 0048 */ GAME( 2001, alienfnta,alienfnt, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Alien Front (Rev A)", GAME_FLAGS )
-/* 0052 */ GAME( 2000, derbyo2k, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Derby Owners Club 2000 Ver.2 (Japan, Rev A)", GAME_FLAGS )
-/* 0054 */ GAME( 2000, starhrse, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Star Horse (big screens)", GAME_FLAGS )
-/* 0055 */ GAME( 2000, starhrct, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Star Horse (server)", GAME_FLAGS )
-/* 0056 */ GAME( 2000, starhrcl, naomi, naomim2, naomi, naomi_state, naomi, ROT270,"Sega", "Star Horse (satellite)", GAME_FLAGS )
-/* 0064 */ GAME( 2001, wrungpo, wrungp, naomim2, naomi, naomi_state, naomi, ROT0, "CRI / Sega", "Wave Runner GP (USA, Rev A)", GAME_FLAGS )
-/* 0064 */ GAME( 2001, wrungp, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "CRI / Sega", "Wave Runner GP", GAME_FLAGS )
-/* 0068 */ GAME( 2001, crakndj2, naomi, naomim2, crackndj,naomi_state, naomi, ROT0, "Sega", "Crackin' DJ Part 2 (Japan)", GAME_FLAGS )
-/* 0073 */ GAME( 2001, inunoos, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Inu No Osanpo / Dog Walking (Japan, Export, Rev A)", GAME_FLAGS )
-/* 0083 */ GAME( 2001, derbyoc2, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Derby Owners Club II Ver.2.1 (Japan, Rev B)", GAME_FLAGS )
-/* 0084 */ GAME( 2001, vtenis2c, naomi, naomim1, naomi, naomi_state, naomi, ROT0, "Sega", "Virtua Tennis 2 / Power Smash 2 (Rev A)", GAME_FLAGS )
-/* 0088 */ GAME( 2001, drbyocwc, derbyocw, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Derby Owners Club World Edition (Rev C)", GAME_FLAGS )
-/* 0088 */ GAME( 2005, derbyocw, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Derby Owners Club World Edition EX (Rev D)", GAME_FLAGS )
-/* 0098 */ GAME( 2002, shootopl, naomi, naomim1, naomi, naomi_state, naomi, ROT0, "Sega", "Shootout Pool", GAME_FLAGS )
-/* 0123 */ GAME( 2003, starhrsp, naomi, naomim2, naomi, naomi_state, naomi, ROT270,"Sega", "Star Horse Progress (satellite) (Rev A)", GAME_FLAGS )
-/* 0126 */ GAME( 2003, oinori, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Oinori-daimyoujin Matsuri", GAME_FLAGS )
-/* 0128 */ GAME( 2003, shootpl, naomi, naomim1, naomi, naomi_state, naomi, ROT0, "Sega", "Shootout Pool The Medal / Shootout Pool Prize (Export, Japan, Rev A)", GAME_FLAGS )
-/* 0130 */ GAME( 2002, hopper, naomi, naomi, naomi, naomi_state, naomi, ROT0, "Sega", "SWP Hopper Board", GAME_FLAGS )
-/* 0136 */ GAME( 2004, shootplm, naomi, naomim1, naomi, naomi_state, naomi, ROT0, "Sega", "Shootout Pool The Medal Version B / Shootout Pool Prize Version B (Export, Japan)", GAME_FLAGS )
-/* 0140 */ GAME( 2004, kick4csh, naomi, naomim1, naomi, naomi_state, naomi, ROT0, "Sega", "Kick '4' Cash (Export)", GAME_FLAGS )
-/* 0150 */ GAME( 2003, mtkob2, naomi, naomim1, naomi, naomi_state, naomi, ROT0, "Sega", "Mushiking The King Of Beetle 2K3 2nd (World)", GAME_FLAGS ) // not for Japan
-/* 0158 */ GAME( 2005, mushi2k5, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Mushiking The King Of Beetle 2K5 1st (Japan)", GAME_FLAGS )
-/* 0164 */ GAME( 2005, mushi2eo, mushik2e, naomim4, naomi, naomi_state, naomi, ROT0, "Sega", "MushiKing II - The King Of Beetle II ENG (Ver. 1.001) (World)", GAME_FLAGS ) // not for Japan
-/* 0164 */ GAME( 2005, mushik2e, naomi, naomim4, naomi, naomi_state, naomi, ROT0, "Sega", "MushiKing II - The King Of Beetle II ENG (Ver. 2.001) (World)", GAME_FLAGS ) // not for Japan
-/* 0166 */ GAME( 2006, zunou, naomi, naomim4, naomi, naomi_state, naomi, ROT0, "Sega", "Touch De Zunou (Japan, Rev A)", GAME_FLAGS )
-/* 0170-01*/GAME( 2007,manicpnc, naomi, naomim4, naomi, naomi_state, naomi, ROT0, "Sega", "Manic Panic Ghosts! (USA, Export)", GAME_FLAGS )
-/* 0170 */ GAME( 2007, pokasuka, manicpnc, naomim4, naomi, naomi_state, naomi, ROT0, "Sega", "Pokasuka Ghost! (Japan)", GAME_FLAGS )
-/* 0175 */ GAME( 2007, asndynmt, naomi, naomim4, naomi, naomi_state, naomi, ROT0, "Sega", "Asian Dynamite / Dynamite Deka EX", GAME_FLAGS )
-/* 0177 */ GAME( 2007, rhytngk, naomi, naomim4, naomi, naomi_state, naomi, ROT0, "Sega / Nintendo - J.P ROOM", "Rhythm Tengoku (Japan)", GAME_FLAGS )
-/* 0186 */ GAME( 2009, starhrpr, naomi, naomim4, naomi, naomi_state, naomi, ROT270,"Sega", "Star Horse Progress Returns (satellite)", GAME_FLAGS )
+/* 0043 */ GAME( 2000, crackndj, naomi, naomim2, crackndj,naomi_state, naomi, ROT0, "Sega", "Crackin' DJ", GAME_FLAGS )
+/* 0044 */ GAME( 2000, csmasho, csmash, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Cosmic Smash", GAME_FLAGS )
+/* 0044 */ GAME( 2000, csmash, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Cosmic Smash (Rev A)", GAME_FLAGS )
+/* 0045 */ GAME( 1999, tokyobus, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Fortyfive", "Tokyo Bus Guide (Japan, Rev A)", GAME_FLAGS )
+/* 0047 */ GAME( 2000, samba2k, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Samba de Amigo ver. 2000 (Japan)", GAME_FLAGS )
+/* 0048 */ GAME( 2001, alienfnt, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Alien Front (Rev T)", GAME_FLAGS )
+/* 0048 */ GAME( 2001, alienfnta, alienfnt, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Alien Front (Rev A)", GAME_FLAGS )
+/* 0052 */ GAME( 2000, derbyo2k, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Derby Owners Club 2000 Ver.2 (Japan, Rev A)", GAME_FLAGS )
+/* 0054 */ GAME( 2000, shorsem, shorse, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Star Horse (main screens)", GAME_FLAGS )
+/* 0055 */ GAME( 2000, shorsel, shorse, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Star Horse (live and backup)", GAME_FLAGS )
+/* 0056 */ GAME( 2000, shorse, naomi, naomim2, naomi, naomi_state, naomi, ROT270,"Sega", "Star Horse (satellite)", GAME_FLAGS )
+/* 0064 */ GAME( 2001, wrungpo, wrungp, naomim2, naomi, naomi_state, naomi, ROT0, "CRI / Sega", "Wave Runner GP (USA, Rev A)", GAME_FLAGS )
+/* 0064 */ GAME( 2001, wrungp, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "CRI / Sega", "Wave Runner GP", GAME_FLAGS )
+/* 0068 */ GAME( 2001, crakndj2, naomi, naomim2, crackndj,naomi_state, naomi, ROT0, "Sega", "Crackin' DJ Part 2 (Japan)", GAME_FLAGS )
+/* 0073 */ GAME( 2001, inunoos, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Inu No Osanpo / Dog Walking (Japan, Export, Rev A)", GAME_FLAGS )
+/* 0078 */ GAME( 2002, shors2k1, naomi, naomim2, naomi, naomi_state, naomi, ROT270,"Sega", "Star Horse 2001 (satellite, Rev B)", GAME_FLAGS )
+/* 0083 */ GAME( 2001, derbyoc2, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Derby Owners Club II Ver.2.1 (Japan, Rev B)", GAME_FLAGS )
+/* 0084 */ GAME( 2001, vtenis2c, naomi, naomim1, naomi, naomi_state, naomi, ROT0, "Sega", "Virtua Tennis 2 / Power Smash 2 (Rev A)", GAME_FLAGS )
+/* 0088 */ GAME( 2001, drbyocwc, derbyocw, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Derby Owners Club World Edition (Rev C)", GAME_FLAGS )
+/* 0088 */ GAME( 2005, derbyocw, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Derby Owners Club World Edition EX (Rev D)", GAME_FLAGS )
+/* 0098 */ GAME( 2002, shootopl, naomi, naomim1, naomi, naomi_state, naomi, ROT0, "Sega", "Shootout Pool", GAME_FLAGS )
+/* 0120 */ GAME( 2003, shorsepm, shorsep, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Star Horse Progress (main screens, Rev B)", GAME_FLAGS )
+/* 0121 */ GAME( 2003, shorseps, shorsep, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Star Horse Progress (sound & backup, Rev A)", GAME_FLAGS )
+/* 0122 */ GAME( 2003, shorsepl, shorsep, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Star Horse Progress (live, Rev A)", GAME_FLAGS )
+/* 0123 */ GAME( 2003, shorsep, naomi, naomim2, naomi, naomi_state, naomi, ROT270,"Sega", "Star Horse Progress (satellite, Rev A)", GAME_FLAGS )
+/* 0126 */ GAME( 2003, oinori, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Oinori-daimyoujin Matsuri", GAME_FLAGS )
+/* 0128 */ GAME( 2003, shootpl, naomi, naomim1, naomi, naomi_state, naomi, ROT0, "Sega", "Shootout Pool The Medal / Shootout Pool Prize (Export, Japan, Rev A)", GAME_FLAGS )
+/* 0130 */ GAME( 2002, hopper, naomi, naomi, naomi, naomi_state, naomi, ROT0, "Sega", "SWP Hopper Board", GAME_FLAGS )
+/* 0136 */ GAME( 2004, shootplm, naomi, naomim1, naomi, naomi_state, naomi, ROT0, "Sega", "Shootout Pool The Medal Version B / Shootout Pool Prize Version B (Export, Japan)", GAME_FLAGS )
+/* 0140 */ GAME( 2004, kick4csh, naomi, naomim1, naomi, naomi_state, naomi, ROT0, "Sega", "Kick '4' Cash (Export)", GAME_FLAGS )
+/* 0150 */ GAME( 2003, mtkob2, naomi, naomim1, naomi, naomi_state, naomi, ROT0, "Sega", "Mushiking The King Of Beetle 2K3 2nd (World)", GAME_FLAGS ) // not for Japan
+/* 0158 */ GAME( 2005, mushi2k5, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Sega", "Mushiking The King Of Beetle 2K5 1st (Japan)", GAME_FLAGS )
+/* 0164 */ GAME( 2005, mushi2eo, mushik2e, naomim4, naomi, naomi_state, naomi, ROT0, "Sega", "MushiKing II - The King Of Beetle II ENG (Ver. 1.001) (World)", GAME_FLAGS ) // not for Japan
+/* 0164 */ GAME( 2005, mushik2e, naomi, naomim4, naomi, naomi_state, naomi, ROT0, "Sega", "MushiKing II - The King Of Beetle II ENG (Ver. 2.001) (World)", GAME_FLAGS ) // not for Japan
+/* 0166 */ GAME( 2006, zunou, naomi, naomim4, naomi, naomi_state, naomi, ROT0, "Sega", "Touch De Zunou (Japan, Rev A)", GAME_FLAGS )
+/* 0170-01 */ GAME( 2007, manicpnc, naomi, naomim4, naomi, naomi_state, naomi, ROT0, "Sega", "Manic Panic Ghosts! (USA, Export)", GAME_FLAGS )
+/* 0170 */ GAME( 2007, pokasuka, manicpnc, naomim4, naomi, naomi_state, naomi, ROT0, "Sega", "Pokasuka Ghost! (Japan)", GAME_FLAGS )
+/* 0175 */ GAME( 2007, asndynmt, naomi, naomim4, naomi, naomi_state, naomi, ROT0, "Sega", "Asian Dynamite / Dynamite Deka EX", GAME_FLAGS )
+/* 0177 */ GAME( 2007, rhytngk, naomi, naomim4, naomi, naomi_state, naomi, ROT0, "Sega / Nintendo - J.P ROOM", "Rhythm Tengoku (Japan)", GAME_FLAGS )
+/* 0186 */ GAME( 2009, shorsepr, naomi, naomim4, naomi, naomi_state, naomi, ROT270,"Sega", "Star Horse Progress Returns (satellite)", GAME_FLAGS )
// 00xx Mayjinsen (Formation Battle in May) - prototype, never released
/* Cartridge prototypes of games released on GD-ROM */
-GAME( 2003, puyofevp, naomi, naomim1, naomi, naomi_state, naomi, ROT0, "Sega", "Puyo Puyo Fever (prototype ver 0.01)", GAME_FLAGS )
+/* none */ GAME( 2003, puyofevp, naomi, naomim1, naomi, naomi_state, naomi, ROT0, "Sega", "Puyo Puyo Fever (prototype ver 0.01)", GAME_FLAGS )
/* 840-xxxxx (Sega Naomi 2 cart games) */
-/* 0046 */ GAME( 2001, wldrider, naomi2, naomi2m2, naomi, naomi_state, naomi2, ROT0, "Sega", "Wild Riders", GAME_FLAGS )
-/* 0061 */ GAME( 2001, vstrik3co,vstrik3c,naomi2m2, naomi, naomi_state, naomi2, ROT0, "Sega", "Virtua Striker 3 (World)", GAME_FLAGS ) // not for Japan
-/* 0061 */ GAME( 2001, vstrik3c, naomi2, naomi2m2, naomi, naomi_state, naomi2, ROT0, "Sega", "Virtua Striker 3 (World, Rev B)", GAME_FLAGS ) // not for Japan
-/* 0062 */ GAME( 2001, clubkrto, clubkrt, naomi2m2, naomi, naomi_state, naomi2, ROT0, "Sega", "Club Kart: European Session", GAME_FLAGS )
-/* 0062 */ GAME( 2001, clubkrtc, clubkrt, naomi2m2, naomi, naomi_state, naomi2, ROT0, "Sega", "Club Kart: European Session (Rev C)", GAME_FLAGS )
-/* 0062 */ GAME( 2001, clubkrt, naomi2, naomi2m2, naomi, naomi_state, naomi2, ROT0, "Sega", "Club Kart: European Session (Rev D)", GAME_FLAGS )
-/* 0080 */ GAME( 2002, vf4cart, naomi2, naomi2m2, naomi, naomi_state, naomi2, ROT0, "Sega", "Virtua Fighter 4 (World)", GAME_FLAGS ) // not for Japan
-/* 0087 */ GAME( 2002, kingrt66, naomi2, naomi2m2, naomi, naomi_state, naomi2, ROT0, "Sega", "The King of Route 66 (Rev A)", GAME_FLAGS )
-/* 0095 */ GAME( 2002, soulsurf, naomi2, naomi2m2, naomi, naomi_state, naomi2, ROT0, "Sega", "Soul Surfer (Rev A)", GAME_FLAGS )
-/* 0106 */ GAME( 2002, vf4evoct, naomi2, naomi2m1, naomi, naomi_state, naomi2, ROT0, "Sega", "Virtua Fighter 4 Evolution (World)", GAME_FLAGS ) // not for Japan
-/* 0129 */ GAME( 2003, clubkprz, naomi2, naomi2m1, naomi, naomi_state, naomi2, ROT0, "Sega", "Club Kart Prize (Export, Japan)", GAME_FLAGS )
-/* 0137 */ GAME( 2004, clubkpzb, naomi2, naomi2m1, naomi, naomi_state, naomi2, ROT0, "Sega", "Club Kart Prize Version B (Export, Japan)", GAME_FLAGS )
-/* 0139 */ GAME( 2003, clubk2k3, naomi2, naomi2m1, naomi, naomi_state, naomi2, ROT0, "Sega", "Club Kart: European Session (2003, Rev A)", GAME_FLAGS )
-/* none */ GAME( 2003, clubk2kp, clubk2k3,naomi2m2, naomi, naomi_state, naomi2, ROT0, "Sega", "Club Kart: European Session (2003, prototype)", GAME_FLAGS )
+/* 0046 */ GAME( 2001, wldrider, naomi2, naomi2m2, naomi, naomi2_state, naomi2, ROT0, "Sega", "Wild Riders", GAME_FLAGS )
+/* 0061 */ GAME( 2001, vstrik3co,vstrik3c,naomi2m2, naomi, naomi2_state, naomi2, ROT0, "Sega", "Virtua Striker 3 (World)", GAME_FLAGS ) // not for Japan
+/* 0061 */ GAME( 2001, vstrik3c, naomi2, naomi2m2, naomi, naomi2_state, naomi2, ROT0, "Sega", "Virtua Striker 3 (World, Rev B)", GAME_FLAGS ) // not for Japan
+/* 0062 */ GAME( 2001, clubkrto, clubkrt, naomi2m2, naomi, naomi2_state, naomi2, ROT0, "Sega", "Club Kart: European Session", GAME_FLAGS )
+/* 0062 */ GAME( 2001, clubkrtc, clubkrt, naomi2m2, naomi, naomi2_state, naomi2, ROT0, "Sega", "Club Kart: European Session (Rev C)", GAME_FLAGS )
+/* 0062 */ GAME( 2001, clubkrt, naomi2, naomi2m2, naomi, naomi2_state, naomi2, ROT0, "Sega", "Club Kart: European Session (Rev D)", GAME_FLAGS )
+/* 0080 */ GAME( 2002, vf4cart, naomi2, naomi2m2, naomi, naomi2_state, naomi2, ROT0, "Sega", "Virtua Fighter 4 (World)", GAME_FLAGS ) // not for Japan
+/* 0087 */ GAME( 2002, kingrt66, naomi2, naomi2m2, naomi, naomi2_state, naomi2, ROT0, "Sega", "The King of Route 66 (Rev A)", GAME_FLAGS )
+/* 0095 */ GAME( 2002, soulsurf, naomi2, naomi2m2, naomi, naomi2_state, naomi2, ROT0, "Sega", "Soul Surfer (Rev A)", GAME_FLAGS )
+/* 0106 */ GAME( 2002, vf4evoct, naomi2, naomi2m1, naomi, naomi2_state, naomi2, ROT0, "Sega", "Virtua Fighter 4 Evolution (World)", GAME_FLAGS ) // not for Japan
+/* 0129 */ GAME( 2003, clubkprz, naomi2, naomi2m1, naomi, naomi2_state, naomi2, ROT0, "Sega", "Club Kart Prize (Export, Japan)", GAME_FLAGS )
+/* 0137 */ GAME( 2004, clubkpzb, naomi2, naomi2m1, naomi, naomi2_state, naomi2, ROT0, "Sega", "Club Kart Prize Version B (Export, Japan)", GAME_FLAGS )
+/* 0139 */ GAME( 2003, clubk2k3, naomi2, naomi2m1, naomi, naomi2_state, naomi2, ROT0, "Sega", "Club Kart: European Session (2003, Rev A)", GAME_FLAGS )
+/* none */ GAME( 2003, clubk2kp, clubk2k3,naomi2m2, naomi, naomi2_state, naomi2, ROT0, "Sega", "Club Kart: European Session (2003, prototype)", GAME_FLAGS )
/* 841-xxxxx ("Licensed by Sega" Naomi cart games)*/
/* 0001 */ GAME( 1999, pstone, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Capcom", "Power Stone", GAME_FLAGS )
/* 0002 */ GAME( 1999, suchie3, naomi, naomim2, suchie3, naomi_state,naomi_mp,ROT0, "Jaleco", "Idol Janshi Suchie-Pai 3 (Japan)", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND )
-/* 0003 */ GAME( 1999, doa2a, doa2, naomim2, naomi, naomi_state, naomi, ROT0, "Tecmo", "Dead or Alive 2 (Rev A)", GAME_FLAGS )
-/* 0003-01 */ GAME( 1999, doa2, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Tecmo", "Dead or Alive 2", GAME_FLAGS )
-/* 0003 */ GAME( 2000, doa2m, doa2, naomim2, naomi, naomi_state, naomi, ROT0, "Tecmo", "Dead or Alive 2 Millennium", GAME_FLAGS )
-/* 0004 */ GAME( 1999, shangril, naomi, naomim2, naomi_mp,naomi_state,naomi_mp,ROT0, "Marvelous Ent.", "Dengen Tenshi Taisen Janshi Shangri-la", GAME_FLAGS ) // (Build 0728) version taken from service mode
+/* 0003 */ GAME( 1999, doa2a, doa2m, naomim2, naomi, naomi_state, naomi, ROT0, "Tecmo", "Dead or Alive 2 (Rev A)", GAME_FLAGS )
+/* 0003-01 */ GAME( 1999, doa2, doa2m, naomim2, naomi, naomi_state, naomi, ROT0, "Tecmo", "Dead or Alive 2", GAME_FLAGS )
+/* 0003 */ GAME( 2000, doa2m, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Tecmo", "Dead or Alive 2 Millennium", GAME_FLAGS )
+/* 0004 */ GAME( 1999, shangril, naomi, naomim2, naomi_mp,naomi_state,naomi_mp,ROT0, "Marvelous Ent.", "Dengen Tenshi Taisen Janshi Shangri-la", GAME_FLAGS ) // (Build 0728) version shown in service mode
/* 0005 */ GAME( 1999, spawn, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Todd Mc Farlane / Capcom","Spawn In the Demon's Hand (Rev B)", GAME_FLAGS )
/* 0006 */ GAME( 1999, puyoda, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Compile", "Puyo Puyo Da! (Japan)", GAME_FLAGS )
/* 0007-01 */ GAME( 2000, mvsc2u, mvsc2, naomim2, naomi, naomi_state, naomi, ROT0, "Capcom / Marvel", "Marvel Vs. Capcom 2 New Age of Heroes (USA, Rev A)", GAME_FLAGS)
@@ -9732,19 +9932,27 @@ GAME( 2003, puyofevp, naomi, naomim1, naomi, naomi_state, naomi, ROT0, "Sega", "
/* 0062 */ GAME( 2009, radirgyn, naomi, naomim4, naomi, naomi_state, naomi, ROT0, "Milestone/Lucky", "Radirgy Noa (Japan)", GAME_FLAGS )
/* HMG016007 */ GAME( 2001, hmgeo, naomi, naomim2, naomi, naomi_state, naomi, ROT0, "Capcom", "Heavy Metal Geomatrix (Rev B)", GAME_FLAGS )
-/* Cart games on Namco custom ROM board */
-/* 25209801 */ GAME( 2000, wldkicksa,wldkicks,naomim2,naomi, naomi_state, naomi, ROT0, "Namco", "World Kicks (Asia, WK2 Ver.A)", GAME_FLAGS )
-/* 25209801 */ GAME( 2000, wldkicks, naomi, naomim2,naomi, naomi_state, naomi, ROT0, "Namco", "World Kicks (US, WK3 Ver.A)", GAME_FLAGS )
-/* 25349801 */ GAME( 2000, toukon4, naomi, naomim2,naomi, naomi_state, naomi, ROT0, "Namco", "Shin Nihon Pro Wrestling Toukon Retsuden 4 Arcade Edition (Japan, TRF1 Ver.A)", GAME_FLAGS )
-/* 25469801 */ GAME( 2000, ninjasltj,ninjaslt,naomim2,naomi, naomi_state, naomi, ROT0, "Namco", "Ninja Assault (Japan, NJA1 Ver.A)", GAME_FLAGS )
-/* 25469801 */ GAME( 2000, ninjaslta,ninjaslt,naomim2,naomi, naomi_state, naomi, ROT0, "Namco", "Ninja Assault (Asia, NJA2 Ver.A)", GAME_FLAGS )
-/* 25469801 */ GAME( 2000, ninjasltu,ninjaslt,naomim2,naomi, naomi_state, naomi, ROT0, "Namco", "Ninja Assault (US, NJA3 Ver.A)", GAME_FLAGS )
-/* 25469801 */ GAME( 2000, ninjaslt, naomi, naomim2,naomi, naomi_state, naomi, ROT0, "Namco", "Ninja Assault (World, NJA4 Ver.A)", GAME_FLAGS )
-/* 25509801 */ GAME( 2000, wldkicksj,wldkicks,naomim2,naomi, naomi_state, naomi, ROT0, "Namco", "World Kicks PCB (Japan, WKC1 Ver.A)", GAME_FLAGS ) // "PCB" means upright version, uses analog button on control panel to kick the ball
-/* 25709801 */ GAME( 2001, gunsur2j, gunsur2, naomim2,naomi, naomi_state, naomi, ROT0, "Capcom / Namco", "Gun Survivor 2 Biohazard Code: Veronica (Japan, BHF1 Ver.E)", GAME_FLAGS )
-/* 25709801 */ GAME( 2001, gunsur2, naomi, naomim2,naomi, naomi_state, naomi, ROT0, "Capcom / Namco", "Gun Survivor 2 Biohazard Code: Veronica (Asia, BHF2 Ver.E)", GAME_FLAGS )
-/* 25869812 */ GAME( 2002, mazana, mazan, naomim2,naomi, naomi_state, naomi, ROT0, "Namco", "Mazan: Flash of the Blade (Asia, MAZ2 Ver.A)", GAME_FLAGS )
-/* 25869812 */ GAME( 2002, mazan, naomi, naomim2,naomi, naomi_state, naomi, ROT0, "Namco", "Mazan: Flash of the Blade (US, MAZ3 Ver.A)", GAME_FLAGS )
+/* Cart games on Namco custom ROM board
+ for game descriptions below NAMCO region codes decoded as such (same as in older NAMCO hardware):
+ 1 - Japan
+ 2 - Asia
+ 3 - USA
+ 4 - World
+ real meaning of 2 and 4 is not clear and seems not correct, 2 more looks like "World", 4 like "some other part of World", possible Europe
+*/
+/* 25209801 */ GAME( 2000, wldkicksj, wldkicks, naomim2,naomi, naomi_state, naomi, ROT0, "Namco", "World Kicks (Japan, WK1 Ver.A)", GAME_FLAGS )
+/* 25209801 */ GAME( 2000, wldkicksa, wldkicks, naomim2,naomi, naomi_state, naomi, ROT0, "Namco", "World Kicks (Asia, WK2 Ver.A)", GAME_FLAGS )
+/* 25209801 */ GAME( 2000, wldkicks, naomi, naomim2,naomi, naomi_state, naomi, ROT0, "Namco", "World Kicks (US, WK3 Ver.A)", GAME_FLAGS )
+/* 25349801 */ GAME( 2000, toukon4, naomi, naomim2,naomi, naomi_state, naomi, ROT0, "Namco", "Shin Nihon Pro Wrestling Toukon Retsuden 4 Arcade Edition (Japan, TRF1 Ver.A)", GAME_FLAGS )
+/* 25469801 */ GAME( 2000, ninjasltj, ninjaslt, naomim2,naomi, naomi_state, naomi, ROT0, "Namco", "Ninja Assault (Japan, NJA1 Ver.A)", GAME_FLAGS )
+/* 25469801 */ GAME( 2000, ninjaslta, ninjaslt, naomim2,naomi, naomi_state, naomi, ROT0, "Namco", "Ninja Assault (Asia, NJA2 Ver.A)", GAME_FLAGS )
+/* 25469801 */ GAME( 2000, ninjasltu, ninjaslt, naomim2,naomi, naomi_state, naomi, ROT0, "Namco", "Ninja Assault (US, NJA3 Ver.A)", GAME_FLAGS )
+/* 25469801 */ GAME( 2000, ninjaslt, naomi, naomim2,naomi, naomi_state, naomi, ROT0, "Namco", "Ninja Assault (World, NJA4 Ver.A)", GAME_FLAGS )
+/* 25509801 */ GAME( 2000, wldkickspj, wldkicks, naomim2,naomi, naomi_state, naomi, ROT0, "Namco", "World Kicks PCB (Japan, WKC1 Ver.A)", GAME_FLAGS ) // "PCB" means upright version, uses analog button on control panel to kick the ball
+/* 25709801 */ GAME( 2001, gunsur2j, gunsur2, naomim2,naomi, naomi_state, naomi, ROT0, "Capcom / Namco", "Gun Survivor 2 Biohazard Code: Veronica (Japan, BHF1 Ver.E)", GAME_FLAGS )
+/* 25709801 */ GAME( 2001, gunsur2, naomi, naomim2,naomi, naomi_state, naomi, ROT0, "Capcom / Namco", "Gun Survivor 2 Biohazard Code: Veronica (Asia, BHF2 Ver.E)", GAME_FLAGS )
+/* 25869812 */ GAME( 2002, mazana, mazan, naomim2,naomi, naomi_state, naomi, ROT0, "Namco", "Mazan: Flash of the Blade (Asia, MAZ2 Ver.A)", GAME_FLAGS )
+/* 25869812 */ GAME( 2002, mazan, naomi, naomim2,naomi, naomi_state, naomi, ROT0, "Namco", "Mazan: Flash of the Blade (US, MAZ3 Ver.A)", GAME_FLAGS )
/* GDS-xxxx (Sega GD-ROM games) */
/* 0001 */ GAME( 2000, confmiss, naomigd, naomigd, hotd2, naomi_state, naomigd, ROT0, "Sega", "Confidential Mission (GDS-0001)", GAME_FLAGS )
@@ -9754,19 +9962,19 @@ GAME( 2003, puyofevp, naomi, naomim1, naomi, naomi_state, naomi, ROT0, "Sega", "
/* 0003 */ GAME( 2000, sprtjam, naomigd, naomigd, naomi, naomi_state, naomigd, ROT0, "Sega", "Sports Jam (GDS-0003)", GAME_FLAGS )
/* 0004 */ GAME( 2000, slashout, naomigd, naomigd, naomi, naomi_state, naomigd, ROT0, "Sega", "Slashout (GDS-0004)", GAME_FLAGS )
/* 0005 */ GAME( 2001, spkrbtl, naomigd, naomigd, naomi, naomi_state, naomigd, ROT0, "Sega", "Spikers Battle (GDS-0005)", GAME_FLAGS )
-/* 0006 */ GAME( 2001, vstrik3, naomi2, naomi2gd, naomi, naomi_state, naomi2, ROT0, "Sega", "Virtua Striker 3 (GDS-0006)", GAME_FLAGS )
+/* 0006 */ GAME( 2001, vstrik3, naomi2, naomi2gd, naomi, naomi2_state, naomi2, ROT0, "Sega", "Virtua Striker 3 (GDS-0006)", GAME_FLAGS )
// 0007
/* 0008 */ GAME( 2001, monkeyba, naomigd, naomigd, monkeyba,naomi_state, naomigd, ROT0, "Sega", "Monkey Ball (GDS-0008)", GAME_FLAGS )
// 0009 Dynamic Golf / Virtua Golf (GDS-0009)
/* 0009A */ GAME( 2001, dygolf, naomigd, naomigd, naomi, naomi_state, naomigd, ROT0, "Sega", "Virtua Golf / Dynamic Golf (Rev A) (GDS-0009A)", GAME_FLAGS )
/* 0010 */ GAME( 2001, wsbbgd, naomigd, naomigd, dybbnao, naomi_state, naomigd, ROT0, "Sega", "World Series Baseball / Super Major League (GDS-0010)", GAME_FLAGS )
/* 0011 */ GAME( 1999, vtennisg, naomigd, naomigd, naomi, naomi_state, naomigd, ROT0, "Sega", "Virtua Tennis / Power Smash (GDS-0011)", GAME_FLAGS )
-/* 0012 */ GAME( 2001, vf4o, vf4, naomi2gd, naomi, naomi_state, naomi2, ROT0, "Sega", "Virtua Fighter 4 (GDS-0012)", GAME_FLAGS )
+/* 0012 */ GAME( 2001, vf4o, vf4, naomi2gd, naomi, naomi2_state, naomi2, ROT0, "Sega", "Virtua Fighter 4 (GDS-0012)", GAME_FLAGS )
// 0012A Virtua Fighter 4 (Rev A) (GDS-0012A)
-/* 0012B */ GAME( 2001, vf4b, vf4, naomi2gd, naomi, naomi_state, naomi2, ROT0, "Sega", "Virtua Fighter 4 (Rev B) (GDS-0012B)", GAME_FLAGS )
-/* 0012C */ GAME( 2001, vf4, naomi2, naomi2gd, naomi, naomi_state, naomi2, ROT0, "Sega", "Virtua Fighter 4 Version C (GDS-0012C)", GAME_FLAGS )
+/* 0012B */ GAME( 2001, vf4b, vf4, naomi2gd, naomi, naomi2_state, naomi2, ROT0, "Sega", "Virtua Fighter 4 (Rev B) (GDS-0012B)", GAME_FLAGS )
+/* 0012C */ GAME( 2001, vf4, naomi2, naomi2gd, naomi, naomi2_state, naomi2, ROT0, "Sega", "Virtua Fighter 4 Version C (GDS-0012C)", GAME_FLAGS )
/* 0013 */ GAME( 2001, shaktmsp, naomigd, naomigd, shaktamb, naomi_state, naomigd, ROT0, "Sega", "Shakatto Tambourine Motto Norinori Shinkyoku Tsuika (2K1 SPR) (GDS-0013)", GAME_FLAGS )
-/* 0014 */ GAME( 2001, beachspi, naomi2, naomi2gd, naomi, naomi_state, naomi2, ROT0, "Sega", "Beach Spikers (GDS-0014)", GAME_FLAGS )
+/* 0014 */ GAME( 2001, beachspi, naomi2, naomi2gd, naomi, naomi2_state, naomi2, ROT0, "Sega", "Beach Spikers (GDS-0014)", GAME_FLAGS )
// 0015 Virtua Tennis 2 / Power Smash 2 (GDS-0015)
/* 0015A */ GAME( 2001, vtennis2, naomigd, naomigd, naomi, naomi_state, naomigd, ROT0, "Sega", "Virtua Tennis 2 / Power Smash 2 (Rev A) (GDS-0015A)", GAME_FLAGS )
/* 0016 */ GAME( 2001, shaktamb, naomigd, naomigd, shaktamb, naomi_state, naomigd, ROT0, "Sega", "Shakatto Tambourine Cho Powerup Chu (2K1 AUT) (GDS-0016)", GAME_FLAGS )
@@ -9774,9 +9982,9 @@ GAME( 2003, puyofevp, naomi, naomim1, naomi, naomi_state, naomi, ROT0, "Sega", "
/* 0018 */ GAME( 2001, lupinsho, naomigd, naomigd, hotd2, naomi_state, naomigd, ROT0, "Sega / Eighting", "Lupin The Third - The Shooting (GDS-0018)", GAME_FLAGS )
// 0018A Lupin The Third - The Shooting (Rev A) (GDS-0018A)
/* 0019 */ GAME( 2002, vathlete, naomigd, naomigd, naomi, naomi_state, naomigd, ROT0, "Sega", "Virtua Athletics / Virtua Athlete (GDS-0019)", GAME_FLAGS )
-/* 0020 */ GAME( 2002, initdo, initd, naomi2gd, naomi, naomi_state, naomi2, ROT0, "Sega", "Initial D Arcade Stage (Japan) (GDS-0020)", GAME_FLAGS )
+/* 0020 */ GAME( 2002, initdo, initd, naomi2gd, naomi, naomi2_state, naomi2, ROT0, "Sega", "Initial D Arcade Stage (Japan) (GDS-0020)", GAME_FLAGS )
// 0020A Initial D Arcade Stage (Rev A) (GDS-0020A)
-/* 0020B */ GAME( 2002, initd, naomi2, naomi2gd, naomi, naomi_state, naomi2, ROT0, "Sega", "Initial D Arcade Stage (Rev B) (Japan) (GDS-0020B)", GAME_FLAGS )
+/* 0020B */ GAME( 2002, initd, naomi2, naomi2gd, naomi, naomi2_state, naomi2, ROT0, "Sega", "Initial D Arcade Stage (Rev B) (Japan) (GDS-0020B)", GAME_FLAGS )
// 0021 Lupin The Third - The Typing (GDS-0021)
/* 0021A */ GAME( 2002, luptype, naomigd, naomigd, naomi, naomi_state, naomigd, ROT0, "Sega", "Lupin The Third - The Typing (Rev A) (GDS-0021A)", GAME_FLAGS )
/* 0022 */ GAME( 2002, mok, naomigd, naomigd, hotd2, naomi_state, naomigd, ROT0, "Sega", "The Maze of the Kings (GDS-0022)", GAME_FLAGS )
@@ -9787,39 +9995,39 @@ GAME( 2003, puyofevp, naomi, naomim1, naomi, naomi_state, naomi, ROT0, "Sega", "
// 0023D Naomi DIMM Firmware Updater (Rev D) (GDS-0023D)
/* 0023E */ GAME( 2001, ngdup23e, naomigd, naomigd, naomi, naomi_state, naomigd, ROT0, "Sega", "Naomi DIMM Firmware Updater (3.17) (GDS-0023E)", GAME_FLAGS )
// 0024 Virtua Fighter 4 Evolution (GDS-0024)
-/* 0024A */ GAME( 2002, vf4evoa, vf4evo, naomi2gd, naomi, naomi_state, naomi2, ROT0, "Sega", "Virtua Fighter 4 Evolution (Japan) (GDS-0024A)", GAME_FLAGS )
-/* 0024B */ GAME( 2002, vf4evo, naomi2, naomi2gd, naomi, naomi_state, naomi2, ROT0, "Sega", "Virtua Fighter 4 Evolution (Version B) (Japan) (GDS-0024B)", GAME_FLAGS )
-/* 0025 */ GAME( 2002, initdexpo,initdexp,naomi2gd, naomi, naomi_state, naomi2, ROT0, "Sega", "Initial D Arcade Stage (Export) (GDS-0025)", GAME_FLAGS )
-/* 0025A */ GAME( 2002, initdexp, naomi2, naomi2gd, naomi, naomi_state, naomi2, ROT0, "Sega", "Initial D Arcade Stage (Export) (Rev A) (GDS-0025A)", GAME_FLAGS )
-/* 0026 */ GAME( 2002, initdv2jo,initdv2j,naomi2gd, naomi, naomi_state, naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Japan) (GDS-0026)", GAME_FLAGS )
+/* 0024A */ GAME( 2002, vf4evoa, vf4evo, naomi2gd, naomi, naomi2_state, naomi2, ROT0, "Sega", "Virtua Fighter 4 Evolution (Japan) (GDS-0024A)", GAME_FLAGS )
+/* 0024B */ GAME( 2002, vf4evo, naomi2, naomi2gd, naomi, naomi2_state, naomi2, ROT0, "Sega", "Virtua Fighter 4 Evolution (Version B) (Japan) (GDS-0024B)", GAME_FLAGS )
+/* 0025 */ GAME( 2002, initdexpo,initdexp,naomi2gd, naomi, naomi2_state, naomi2, ROT0, "Sega", "Initial D Arcade Stage (Export) (GDS-0025)", GAME_FLAGS )
+/* 0025A */ GAME( 2002, initdexp, naomi2, naomi2gd, naomi, naomi2_state, naomi2, ROT0, "Sega", "Initial D Arcade Stage (Export) (Rev A) (GDS-0025A)", GAME_FLAGS )
+/* 0026 */ GAME( 2002, initdv2jo,initdv2j,naomi2gd, naomi, naomi2_state, naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Japan) (GDS-0026)", GAME_FLAGS )
// 0026A Initial D Arcade Stage Ver. 2 (Japan) (Rev A) (GDS-0026A)
-/* 0026B */ GAME( 2003, initdv2j, naomi2, naomi2gd, naomi, naomi_state, naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Japan) (Rev B) (GDS-0026B)", GAME_FLAGS )
-/* 0027 */ GAME( 2003, initdv2e, initdv2j,naomi2gd, naomi, naomi_state, naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Export) (GDS-0027)", GAME_FLAGS )
+/* 0026B */ GAME( 2003, initdv2j, naomi2, naomi2gd, naomi, naomi2_state, naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Japan) (Rev B) (GDS-0026B)", GAME_FLAGS )
+/* 0027 */ GAME( 2003, initdv2e, initdv2j,naomi2gd, naomi, naomi2_state, naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 2 (Export) (GDS-0027)", GAME_FLAGS )
// 0028
// 0029 Club Kart for Cycraft (GDS-0029)
-/* 0029A */ GAME( 2003, clubkcyc, naomi2, naomi2gd, naomi, naomi_state, naomi2, ROT0, "Sega", "Club Kart for Cycraft (Rev A) (GDS-0029A)", GAME_FLAGS )
+/* 0029A */ GAME( 2003, clubkcyc, naomi2, naomi2gd, naomi, naomi2_state, naomi2, ROT0, "Sega", "Club Kart for Cycraft (Rev A) (GDS-0029A)", GAME_FLAGS )
// 0030
/* 0031 */ GAME( 2003, puyofev, naomigd, naomigd, naomi, naomi_state, naomigd, ROT0, "Sega", "Puyo Puyo Fever (Japan) (GDS-0031)", GAME_FLAGS )
// 0032 Initial D Arcade Stage Ver. 3 (Japan) (GDS-0032)
// 0032A Initial D Arcade Stage Ver. 3 (Japan) (Rev A) (GDS-0032A)
-/* 0032B */ GAME( 2004, initdv3jb,initdv3j,naomigd, naomi, naomi_state, naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 (Japan) (Rev B) (GDS-0032B)", GAME_FLAGS )
-/* 0032C */ GAME( 2004, initdv3j, naomi2, naomi2gd, naomi, naomi_state, naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 (Japan) (Rev C) (GDS-0032C)", GAME_FLAGS )
-/* 0033 */ GAME( 2004, initdv3e, naomi2, naomi2gd, naomi, naomi_state, naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 (Export) (GDS-0033)", GAME_FLAGS )
+/* 0032B */ GAME( 2004, initdv3jb,initdv3j,naomi2gd, naomi, naomi2_state, naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 (Japan) (Rev B) (GDS-0032B)", GAME_FLAGS )
+/* 0032C */ GAME( 2004, initdv3j, naomi2, naomi2gd, naomi, naomi2_state, naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 (Japan) (Rev C) (GDS-0032C)", GAME_FLAGS )
+/* 0033 */ GAME( 2004, initdv3e, naomi2, naomi2gd, naomi, naomi2_state, naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 (Export) (GDS-0033)", GAME_FLAGS )
// 0034
// 0035
// 0036 Virtua Fighter 4 Final Tuned (GDS-0036)
-/* 0036A */ GAME( 2004, vf4tuneda,vf4tuned,naomi2gd, naomi, naomi_state, naomi2, ROT0, "Sega", "Virtua Fighter 4 Final Tuned (GDS-0036A)", GAME_FLAGS )
+/* 0036A */ GAME( 2004, vf4tuneda,vf4tuned,naomi2gd, naomi, naomi2_state, naomi2, ROT0, "Sega", "Virtua Fighter 4 Final Tuned (GDS-0036A)", GAME_FLAGS )
// 0036B Virtua Fighter 4 Final Tuned (GDS-0036B)
// 0036C Virtua Fighter 4 Final Tuned (GDS-0036C)
-/* 0036D */ GAME( 2004, vf4tunedd,vf4tuned,naomi2gd, naomi, naomi_state, naomi2, ROT0, "Sega", "Virtua Fighter 4 Final Tuned (Ver. A) (GDS-0036D)", GAME_FLAGS )
+/* 0036D */ GAME( 2004, vf4tunedd,vf4tuned,naomi2gd, naomi, naomi2_state, naomi2, ROT0, "Sega", "Virtua Fighter 4 Final Tuned (Ver. A) (GDS-0036D)", GAME_FLAGS )
// 0036E Virtua Fighter 4 Final Tuned (GDS-0036E)
-/* 0036F */ GAME( 2004, vf4tuned, naomi2, naomi2gd, naomi, naomi_state, naomi2, ROT0, "Sega", "Virtua Fighter 4 Final Tuned (Ver. B) (GDS-0036F)", GAME_FLAGS )
+/* 0036F */ GAME( 2004, vf4tuned, naomi2, naomi2gd, naomi, naomi2_state, naomi2, ROT0, "Sega", "Virtua Fighter 4 Final Tuned (Ver. B) (GDS-0036F)", GAME_FLAGS )
// 0037 Dragon Treasure 2 (GDS-0037)
/* 0037A */ GAME( 2004, dragntr2, naomigd, naomigd, naomi, naomi_state, naomigd, ROT0, "Sega", "Dragon Treasure 2 (Rev A) (GDS-0037A)", GAME_FLAGS )
// 0038
// 0039 Initial D Arcade Stage Ver. 3 Cycraft Edition (GDS-0039)
-/* 0039A */ GAME( 2006, inidv3ca, inidv3cy,naomigd, naomi, naomi_state, naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 Cycraft Edition (Rev A) (GDS-0039A)", GAME_FLAGS )
-/* 0039B */ GAME( 2006, inidv3cy, naomi2, naomigd, naomi, naomi_state, naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 Cycraft Edition (Rev B) (GDS-0039B)", GAME_FLAGS )
+/* 0039A */ GAME( 2006, inidv3ca, inidv3cy,naomi2gd, naomi, naomi2_state, naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 Cycraft Edition (Rev A) (GDS-0039A)", GAME_FLAGS )
+/* 0039B */ GAME( 2006, inidv3cy, naomi2, naomi2gd, naomi, naomi2_state, naomi2, ROT0, "Sega", "Initial D Arcade Stage Ver. 3 Cycraft Edition (Rev B) (GDS-0039B)", GAME_FLAGS )
// 0040
// 0041 Dragon Treasure 3 (GDS-0041)
/* 0041A */ GAME( 2005, dragntr3, naomigd, naomigd, naomi, naomi_state, naomigd, ROT0, "Sega", "Dragon Treasure 3 (Rev A) (GDS-0041A)", GAME_FLAGS )
@@ -9911,36 +10119,36 @@ GAME( 2003, puyofevp, naomi, naomim1, naomi, naomi_state, naomi, ROT0, "Sega", "
/* Atomiswave */
-GAME( 2001, awbios, 0, aw2c, aw2c, naomi_state, atomiswave, ROT0, "Sammy", "Atomiswave Bios", GAME_FLAGS|MACHINE_IS_BIOS_ROOT )
-
-GAME( 2003, maxspeed, awbios, aw1c, aw1w, naomi_state, atomiswave, ROT0, "SIMS / Sammy", "Maximum Speed", GAME_FLAGS )
-GAME( 2003, sprtshot, awbios, aw2c, aw2c, naomi_state, atomiswave, ROT0, "Sammy USA", "Sports Shooting USA", GAME_FLAGS )
-GAME( 2003, ggx15, awbios, aw2c, aw2c, naomi_state, atomiswave, ROT0, "Arc System Works / Sammy", "Guilty Gear X ver. 1.5", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND|MACHINE_NOT_WORKING )
-GAME( 2003, demofist, awbios, aw2c, aw2c, naomi_state, atomiswave, ROT0, "Polygon Magic / Dimps", "Demolish Fist", GAME_FLAGS )
-GAME( 2003, dolphin, awbios, aw2c, aw2c, naomi_state, atomiswave, ROT0, "Sammy", "Dolphin Blue", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND|MACHINE_NOT_WORKING )
-GAME( 2003, kov7sprt, awbios, aw2c, aw2c, naomi_state, atomiswave, ROT0, "IGS / Sammy", "Knights of Valour - The Seven Spirits", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND|MACHINE_NOT_WORKING )
-GAME( 2003, ggisuka, awbios, aw2c, aw2c, naomi_state, atomiswave, ROT0, "Arc System Works / Sammy", "Guilty Gear Isuka", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND|MACHINE_NOT_WORKING )
-GAME( 2003, sushibar, awbios, aw2c, aw2c, naomi_state, atomiswave, ROT0, "Sammy", "Sushi Bar", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND )
-GAME( 2004, dirtypig, awbios, aw2c, aw2c, naomi_state, atomiswave, ROT0, "Sammy", "Dirty Pigskin Football", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND|MACHINE_NOT_WORKING )
-GAME( 2004, rumblef, awbios, aw2c, aw2c, naomi_state, atomiswave, ROT0, "Sammy / Dimps", "The Rumble Fish", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND|MACHINE_NOT_WORKING )
-GAME( 2004, rumblefp, rumblef, aw2c, aw2c, naomi_state, atomiswave, ROT0, "Sammy / Dimps", "The Rumble Fish (prototype)", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND|MACHINE_NOT_WORKING )
-GAME( 2004, rangrmsn, awbios, aw2c, aw1w, naomi_state, atomiswave, ROT0, "RIZ Inc./ Sammy", "Ranger Mission", GAME_FLAGS )
-GAME( 2004, salmankt, awbios, aw2c, aw2c, naomi_state, atomiswave, ROT0, "Yuki Enterprise / Sammy", "Net Select: Salaryman Kintaro", GAME_FLAGS )
-GAME( 2004, ftspeed, awbios, aw1c, aw1w, naomi_state, atomiswave, ROT0, "Sammy", "Faster Than Speed", GAME_FLAGS )
-GAME( 2005, vfurlong, awbios, aw2c, aw2c, naomi_state, atomiswave, ROT0, "Progress / Sammy", "Net Select Horse Racing: Victory Furlong", GAME_FLAGS )
-GAME( 2005, rumblef2, awbios, aw2c, aw2c, naomi_state, atomiswave, ROT0, "Sammy / Dimps", "The Rumble Fish 2", GAME_FLAGS )
-GAME( 2005, rumblf2p, rumblef2, aw2c, aw2c, naomi_state, atomiswave, ROT0, "Sammy / Dimps", "The Rumble Fish 2 (prototype)", GAME_FLAGS )
-GAME( 2005, anmlbskt, awbios, aw2c, aw2c, naomi_state, atomiswave, ROT270, "MOSS / Sammy", "Animal Basket", GAME_FLAGS )
-GAME( 2005, ngbc, awbios, aw2c, aw2c, naomi_state, atomiswave, ROT0, "Sammy / SNK Playmore", "NeoGeo Battle Coliseum", GAME_FLAGS )
-GAME( 2005, ngbcj, ngbc, aw2c, aw2c, naomi_state, atomiswave, ROT0, "Sammy / SNK Playmore", "NeoGeo Battle Coliseum (Japan)", GAME_FLAGS )
-GAME( 2005, samsptk, awbios, aw2c, aw2c, naomi_state, atomiswave, ROT0, "Sammy / SNK Playmore", "Samurai Spirits Tenkaichi Kenkakuden", GAME_FLAGS )
-GAME( 2005, kofxi, awbios, aw2c, aw2c, naomi_state, atomiswave, ROT0, "Sammy / SNK Playmore", "The King of Fighters XI", GAME_FLAGS )
-GAME( 2005, fotns, awbios, aw2c, aw2c, naomi_state, atomiswave, ROT0, "Arc System Works / Sega", "Fist Of The North Star", GAME_FLAGS )
-GAME( 2005, kofnw, awbios, aw2c, aw2c, naomi_state, atomiswave, ROT0, "Sammy / SNK Playmore", "The King of Fighters Neowave", GAME_FLAGS )
-GAME( 2005, kofnwj, kofnw, aw2c, aw2c, naomi_state, atomiswave, ROT0, "Sammy / SNK Playmore", "The King of Fighters Neowave (Japan)", GAME_FLAGS )
-GAME( 2005, xtrmhunt, awbios, aw2c, aw2c, naomi_state, atomiswave, ROT0, "Sammy", "Extreme Hunting", GAME_FLAGS )
-GAME( 2006, mslug6, awbios, aw2c, aw2c, naomi_state, atomiswave, ROT0, "Sega / SNK Playmore", "Metal Slug 6", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND|MACHINE_NOT_WORKING )
-GAME( 2006, xtrmhnt2, awbios, aw2c, aw2c, naomi_state, xtrmhnt2, ROT0, "Sega", "Extreme Hunting 2", GAME_FLAGS )
-GAME( 2008, claychal, awbios, aw2c, aw2c, naomi_state, atomiswave, ROT0, "Sega", "Sega Clay Challenge", GAME_FLAGS )
-GAME( 2009, basschalo, basschal, aw2c, aw2c, naomi_state, atomiswave, ROT0, "Sega", "Sega Bass Fishing Challenge", GAME_FLAGS )
-GAME( 2009, basschal, awbios, aw2c, aw2c, naomi_state, atomiswave, ROT0, "Sega", "Sega Bass Fishing Challenge Version A", GAME_FLAGS )
+GAME( 2001, awbios, 0, aw2c, aw2c, atomiswave_state, atomiswave, ROT0, "Sammy", "Atomiswave Bios", GAME_FLAGS|MACHINE_IS_BIOS_ROOT )
+
+GAME( 2003, maxspeed, awbios, aw1c, aw1w, atomiswave_state, atomiswave, ROT0, "SIMS / Sammy", "Maximum Speed", GAME_FLAGS )
+GAME( 2003, sprtshot, awbios, aw2c, aw2c, atomiswave_state, atomiswave, ROT0, "Sammy USA", "Sports Shooting USA", GAME_FLAGS )
+GAME( 2003, ggx15, awbios, aw2c, aw2c, atomiswave_state, atomiswave, ROT0, "Arc System Works / Sammy", "Guilty Gear X ver. 1.5", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND|MACHINE_NOT_WORKING )
+GAME( 2003, demofist, awbios, aw2c, aw2c, atomiswave_state, atomiswave, ROT0, "Polygon Magic / Dimps", "Demolish Fist", GAME_FLAGS )
+GAME( 2003, dolphin, awbios, aw2c, aw2c, atomiswave_state, atomiswave, ROT0, "Sammy", "Dolphin Blue", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND|MACHINE_NOT_WORKING )
+GAME( 2003, kov7sprt, awbios, aw2c, aw2c, atomiswave_state, atomiswave, ROT0, "IGS / Sammy", "Knights of Valour - The Seven Spirits", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND|MACHINE_NOT_WORKING )
+GAME( 2003, ggisuka, awbios, aw2c, aw2c, atomiswave_state, atomiswave, ROT0, "Arc System Works / Sammy", "Guilty Gear Isuka", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND|MACHINE_NOT_WORKING )
+GAME( 2003, sushibar, awbios, aw2c, aw2c, atomiswave_state, atomiswave, ROT0, "Sammy", "Sushi Bar", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND )
+GAME( 2004, dirtypig, awbios, aw2c, aw2c, atomiswave_state, atomiswave, ROT0, "Sammy", "Dirty Pigskin Football", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND|MACHINE_NOT_WORKING )
+GAME( 2004, rumblef, awbios, aw2c, aw2c, atomiswave_state, atomiswave, ROT0, "Sammy / Dimps", "The Rumble Fish", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND|MACHINE_NOT_WORKING )
+GAME( 2004, rumblefp, rumblef, aw2c, aw2c, atomiswave_state, atomiswave, ROT0, "Sammy / Dimps", "The Rumble Fish (prototype)", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND|MACHINE_NOT_WORKING )
+GAME( 2004, rangrmsn, awbios, aw2c, aw1w, atomiswave_state, atomiswave, ROT0, "RIZ Inc./ Sammy", "Ranger Mission", GAME_FLAGS )
+GAME( 2004, salmankt, awbios, aw2c, aw2c, atomiswave_state, atomiswave, ROT0, "Yuki Enterprise / Sammy", "Net Select: Salaryman Kintaro", GAME_FLAGS )
+GAME( 2004, ftspeed, awbios, aw1c, aw1w, atomiswave_state, atomiswave, ROT0, "Sammy", "Faster Than Speed", GAME_FLAGS )
+GAME( 2005, vfurlong, awbios, aw2c, aw2c, atomiswave_state, atomiswave, ROT0, "Progress / Sammy", "Net Select Horse Racing: Victory Furlong", GAME_FLAGS )
+GAME( 2005, rumblef2, awbios, aw2c, aw2c, atomiswave_state, atomiswave, ROT0, "Sammy / Dimps", "The Rumble Fish 2", GAME_FLAGS )
+GAME( 2005, rumblf2p, rumblef2, aw2c, aw2c, atomiswave_state, atomiswave, ROT0, "Sammy / Dimps", "The Rumble Fish 2 (prototype)", GAME_FLAGS )
+GAME( 2005, anmlbskt, awbios, aw2c, aw2c, atomiswave_state, atomiswave, ROT270, "MOSS / Sammy", "Animal Basket", GAME_FLAGS )
+GAME( 2005, ngbc, awbios, aw2c, aw2c, atomiswave_state, atomiswave, ROT0, "Sammy / SNK Playmore", "NeoGeo Battle Coliseum", GAME_FLAGS )
+GAME( 2005, ngbcj, ngbc, aw2c, aw2c, atomiswave_state, atomiswave, ROT0, "Sammy / SNK Playmore", "NeoGeo Battle Coliseum (Japan)", GAME_FLAGS )
+GAME( 2005, samsptk, awbios, aw2c, aw2c, atomiswave_state, atomiswave, ROT0, "Sammy / SNK Playmore", "Samurai Spirits Tenkaichi Kenkakuden", GAME_FLAGS )
+GAME( 2005, kofxi, awbios, aw2c, aw2c, atomiswave_state, atomiswave, ROT0, "Sammy / SNK Playmore", "The King of Fighters XI", GAME_FLAGS )
+GAME( 2005, fotns, awbios, aw2c, aw2c, atomiswave_state, atomiswave, ROT0, "Arc System Works / Sega", "Fist Of The North Star", GAME_FLAGS )
+GAME( 2005, kofnw, awbios, aw2c, aw2c, atomiswave_state, atomiswave, ROT0, "Sammy / SNK Playmore", "The King of Fighters Neowave", GAME_FLAGS )
+GAME( 2005, kofnwj, kofnw, aw2c, aw2c, atomiswave_state, atomiswave, ROT0, "Sammy / SNK Playmore", "The King of Fighters Neowave (Japan)", GAME_FLAGS )
+GAME( 2005, xtrmhunt, awbios, aw2c, aw2c, atomiswave_state, atomiswave, ROT0, "Sammy", "Extreme Hunting", GAME_FLAGS )
+GAME( 2006, mslug6, awbios, aw2c, aw2c, atomiswave_state, atomiswave, ROT0, "Sega / SNK Playmore", "Metal Slug 6", MACHINE_IMPERFECT_GRAPHICS|MACHINE_IMPERFECT_SOUND|MACHINE_NOT_WORKING )
+GAME( 2006, xtrmhnt2, awbios, aw2c, aw2c, atomiswave_state, xtrmhnt2, ROT0, "Sega", "Extreme Hunting 2", GAME_FLAGS )
+GAME( 2008, claychal, awbios, aw2c, aw2c, atomiswave_state, atomiswave, ROT0, "Sega", "Sega Clay Challenge", GAME_FLAGS )
+GAME( 2009, basschalo, basschal, aw2c, aw2c, atomiswave_state, atomiswave, ROT0, "Sega", "Sega Bass Fishing Challenge", GAME_FLAGS )
+GAME( 2009, basschal, awbios, aw2c, aw2c, atomiswave_state, atomiswave, ROT0, "Sega", "Sega Bass Fishing Challenge Version A", GAME_FLAGS )
diff --git a/src/mame/drivers/neodriv.hxx b/src/mame/drivers/neodriv.hxx
index e635e7e8640..3fddef2b430 100644
--- a/src/mame/drivers/neodriv.hxx
+++ b/src/mame/drivers/neodriv.hxx
@@ -1659,7 +1659,7 @@ ROM_START( roboarmy )
ROM_LOAD16_WORD_SWAP( "032-p1.p1", 0x000000, 0x080000, CRC(cd11cbd4) SHA1(23163e3da2f07e830a7f4a02aea1cb01a54ccbf3) ) /* TC534200 */
NEO_SFIX_128K( "032-s1.s1", CRC(ac0daa1b) SHA1(93bae4697dc403fce19422752a514326ccf66a91) ) /* TC531000 */
-
+
NEO_BIOS_AUDIO_128K( "032-m1.m1", CRC(35ec952d) SHA1(8aed30e26d7e2c70dbce5de752df416091066f7b) ) /* TC531001 */
ROM_REGION( 0x200000, "cslot1:ymsnd", 0 )
@@ -1676,7 +1676,7 @@ ROM_END
ROM_START( roboarma ) /* MVS AND AES VERSION*/
ROM_REGION( 0x100000, "cslot1:maincpu", ROMREGION_BE|ROMREGION_16BIT )
ROM_LOAD16_WORD_SWAP( "032-epr.p1", 0x000000, 0x080000, CRC(27c773cb) SHA1(597ca73f142b1129cc7780540bb9cfacd47bc6ce) ) /* D27C4000 */
- /* Found on legitimate Robo Army MVS and AES Carts. Debug code button which check control a sound test has been patched out because in a multislot situation that code could have been enabled
+ /* Found on legitimate Robo Army MVS and AES Carts. Debug code button which check control a sound test has been patched out because in a multislot situation that code could have been enabled
that would stop roboarmy from working, sending it into an infinite loop ; correct chip label unknown */
NEO_SFIX_128K( "032-s1.s1", CRC(ac0daa1b) SHA1(93bae4697dc403fce19422752a514326ccf66a91) ) /* TC531000 */
@@ -2828,7 +2828,7 @@ ROM_START( samsho2ka ) /* KOREAN VERSION */
ROM_LOAD16_WORD_SWAP( "063-p1-kan.p1", 0x100000, 0x100000, CRC(147cc6d7) SHA1(8e22305f41a0688786ff55437c25948e6c8fda58) )
ROM_CONTINUE( 0x000000, 0x100000 )
// Basically samsho2k without loading ep1 and ep2 over p1-kan ; The game has been confirmed to exist in this state
-
+
NEO_SFIX_128K( "063-s1-kan.s1", CRC(ff08f80b) SHA1(240c6a1c52edebb49cc99ea08484c6a2d61ebf84) )
NEO_BIOS_AUDIO_128K( "063-m1.m1", CRC(56675098) SHA1(90429fc40d056d480d0e2bbefbc691d9fa260fc4) ) /* TC531001 */
@@ -5893,7 +5893,41 @@ ROM_START( kof99e ) /* Original Version - Encrypted Code & GFX */
ROM_LOAD16_BYTE( "251-c8.c8", 0x3000001, 0x800000, CRC(8d921c68) SHA1(42acf1d27d52a8e3b6262eb7df50693c0b135565) ) /* Plane 2,3 */ /* TC5364205 */
ROM_END
-ROM_START( kof99k ) /* Original Version - Encrypted GFX */ /* KOREAN VERSION */
+ROM_START( kof99k ) /* Original Version - Encrypted Code & GFX */ /* KOREAN VERSION */
+ ROM_REGION( 0x900000, "cslot1:maincpu", ROMREGION_BE|ROMREGION_16BIT )
+ ROM_LOAD16_WORD_SWAP( "kb.neo-sma", 0x0c0000, 0x040000, CRC(9fccc688) SHA1(1a24d0fe7cabe7b346f538e099f1357bbf77bc89) ) /* stored in the custom chip */
+ ROM_LOAD16_WORD_SWAP( "151-pg1k.p1", 0x100000, 0x400000, CRC(ef259292) SHA1(e02f2d0c71eac74424507e4845991fbc12821045) ) /* mask rom TC5332205 */
+ ROM_LOAD16_WORD_SWAP( "151-pg2k.p2", 0x500000, 0x400000, CRC(f3898ec2) SHA1(c7fd230fbb97a9b171aeae8ff1a5cd39ba7fa9eb) ) /* mask rom TC5332205 */
+
+ ROM_Y_ZOOM
+
+ /* The Encrypted Boards do not have an s1 rom, data for it comes from the Cx ROMs */
+ ROM_REGION( 0x20000, "cslot1:fixed", 0 )
+ ROM_FILL( 0x000000, 0x20000, 0x000000 )
+ ROM_REGION( 0x20000, "fixedbios", 0 )
+ ROM_LOAD( "sfix.sfix", 0x000000, 0x20000, CRC(c2ea0cfd) SHA1(fd4a618cdcdbf849374f0a50dd8efe9dbab706c3) )
+
+ NEO_BIOS_AUDIO_128K( "251-m1.m1", CRC(5e74539c) SHA1(6f49a9343cbd026b2c6720ff3fa2e5b1f85e80da) ) /* TC531001 */
+
+ ROM_REGION( 0x0e00000, "cslot1:ymsnd", 0 )
+ ROM_LOAD( "251-v1.v1", 0x000000, 0x400000, CRC(ef2eecc8) SHA1(8ed13b9db92dba3124bc5ba66e3e275885ece24a) ) /* TC5332204 */
+ ROM_LOAD( "251-v2.v2", 0x400000, 0x400000, CRC(73e211ca) SHA1(0e60fa64cab6255d9721e2b4bc22e3de64c874c5) ) /* TC5332204 */
+ ROM_LOAD( "251-v3.v3", 0x800000, 0x400000, CRC(821901da) SHA1(c6d4975bfaa19a62ed59126cadf2578c0a5c257f) ) /* TC5332204 */
+ ROM_LOAD( "251-v4.v4", 0xc00000, 0x200000, CRC(b49e6178) SHA1(dde6f76e958841e8c99b693e13ced9aa9ef316dc) ) /* TC5316200 */
+
+ ROM_REGION( 0x4000000, "cslot1:sprites", 0 )
+ /* Encrypted */
+ ROM_LOAD16_BYTE( "251-c1.c1", 0x0000000, 0x800000, CRC(0f9e93fe) SHA1(c7d77f0833c6f526f632e4f2dce59e302f6b9a15) ) /* Plane 0,1 */ /* TC5364205 */
+ ROM_LOAD16_BYTE( "251-c2.c2", 0x0000001, 0x800000, CRC(e71e2ea3) SHA1(39c7a326fddbcca3b29c68cdc96aad4d62295c0f) ) /* Plane 2,3 */ /* TC5364205 */
+ ROM_LOAD16_BYTE( "251-c3.c3", 0x1000000, 0x800000, CRC(238755d2) SHA1(01125b5c7a28e350f091280b041954fd1ac7c98f) ) /* Plane 0,1 */ /* TC5364205 */
+ ROM_LOAD16_BYTE( "251-c4.c4", 0x1000001, 0x800000, CRC(438c8b22) SHA1(ffbc643f5b27dd00f2f95d4ef4c5f29ee814722b) ) /* Plane 2,3 */ /* TC5364205 */
+ ROM_LOAD16_BYTE( "251-c5.c5", 0x2000000, 0x800000, CRC(0b0abd0a) SHA1(d5ad324fe523bdc6f09209d236cc4932524a48f1) ) /* Plane 0,1 */ /* TC5364205 */
+ ROM_LOAD16_BYTE( "251-c6.c6", 0x2000001, 0x800000, CRC(65bbf281) SHA1(79ae174667a23dabcfe865b6cd6133c86098452e) ) /* Plane 2,3 */ /* TC5364205 */
+ ROM_LOAD16_BYTE( "251-c7.c7", 0x3000000, 0x800000, CRC(ff65f62e) SHA1(7cd335fede05b56e15db90ce407c1183a78da4e9) ) /* Plane 0,1 */ /* TC5364205 */
+ ROM_LOAD16_BYTE( "251-c8.c8", 0x3000001, 0x800000, CRC(8d921c68) SHA1(42acf1d27d52a8e3b6262eb7df50693c0b135565) ) /* Plane 2,3 */ /* TC5364205 */
+ROM_END
+
+ROM_START( kof99ka ) /* Original Version - Encrypted GFX */ /* KOREAN VERSION */
ROM_REGION( 0x500000, "cslot1:maincpu", ROMREGION_BE|ROMREGION_16BIT )
ROM_LOAD16_WORD_SWAP( "152-p1.p1", 0x000000, 0x100000, CRC(f2c7ddfa) SHA1(d592eecc53d442c55c2f26a6a721fdf2924d2a5b) ) /* TC538200 */
ROM_LOAD16_WORD_SWAP( "152-p2.sp2", 0x100000, 0x400000, CRC(274ef47a) SHA1(98654b68cc85c19d4a90b46f3110f551fa2e5357) ) /* TC5332205 */
@@ -8791,8 +8825,8 @@ GAME( 1993, fatfurspa, fatfursp, neobase, neogeo, neogeo_state, neogeo, R
GAME( 1995, savagere, neogeo, neobase, neogeo, neogeo_state, neogeo, ROT0, "SNK", "Savage Reign / Fu'un Mokushiroku - Kakutou Sousei", MACHINE_SUPPORTS_SAVE )
GAME( 1994, ssideki2, neogeo, neobase, neogeo, neogeo_state, neogeo, ROT0, "SNK", "Super Sidekicks 2 - The World Championship / Tokuten Ou 2 - Real Fight Football (NGM-061 ~ NGH-061)", MACHINE_SUPPORTS_SAVE )
GAME( 1994, samsho2, neogeo, neobase, neogeo, neogeo_state, neogeo, ROT0, "SNK", "Samurai Shodown II / Shin Samurai Spirits - Haohmaru Jigokuhen (NGM-063 ~ NGH-063)", MACHINE_SUPPORTS_SAVE )
-GAME( 1994, samsho2k, samsho2, neobase, neogeo, neogeo_state, neogeo, ROT0, "SNK", "Saulabi Spirits / Jin Saulabi Tu Hon (Korean release of Samurai Shodown II, set 1)", MACHINE_SUPPORTS_SAVE )
-GAME( 1994, samsho2ka, samsho2, neobase, neogeo, neogeo_state, neogeo, ROT0, "SNK", "Saulabi Spirits / Jin Saulabi Tu Hon (Korean release of Samurai Shodown II, set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1994, samsho2k, samsho2, neobase, neogeo, neogeo_state, neogeo, ROT0, "SNK", "Saulabi Spirits / Jin Saulabi Tu Hon (Korean release of Samurai Shodown II, set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1994, samsho2ka, samsho2, neobase, neogeo, neogeo_state, neogeo, ROT0, "SNK", "Saulabi Spirits / Jin Saulabi Tu Hon (Korean release of Samurai Shodown II, set 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1995, fatfury3, neogeo, neobase, neogeo, neogeo_state, neogeo, ROT0, "SNK", "Fatal Fury 3 - Road to the Final Victory / Garou Densetsu 3 - Haruka-naru Tatakai (NGM-069 ~ NGH-069)", MACHINE_SUPPORTS_SAVE )
GAME( 1995, ssideki3, neogeo, neobase, neogeo, neogeo_state, neogeo, ROT0, "SNK", "Super Sidekicks 3 - The Next Glory / Tokuten Ou 3 - Eikou e no Michi", MACHINE_SUPPORTS_SAVE )
GAME( 1995, kof95, neogeo, neobase, neogeo, neogeo_state, neogeo, ROT0, "SNK", "The King of Fighters '95 (NGM-084)", MACHINE_SUPPORTS_SAVE )
@@ -8832,8 +8866,8 @@ GAME( 1998, mslug2, neogeo, neobase, neogeo, neogeo_state, neogeo, R
GAME( 2015, mslug2t, mslug2, neobase, neogeo, neogeo_state, neogeo, ROT0, "hack (trap15)", "Metal Slug 2 Turbo (NGM-9410) (hack)", MACHINE_SUPPORTS_SAVE )
GAME( 1998, kof98, neogeo, kof98, neogeo, neogeo_state, neogeo, ROT0, "SNK", "The King of Fighters '98 - The Slugfest / King of Fighters '98 - Dream Match Never Ends (NGM-2420)", MACHINE_SUPPORTS_SAVE )
GAME( 1998, kof98a, kof98, kof98, neogeo, neogeo_state, neogeo, ROT0, "SNK", "The King of Fighters '98 - The Slugfest / King of Fighters '98 - Dream Match Never Ends (NGM-2420, alt board)", MACHINE_SUPPORTS_SAVE )
-GAME( 1998, kof98k, kof98, kof98, neogeo, neogeo_state, neogeo, ROT0, "SNK", "The King of Fighters '98 - The Slugfest / King of Fighters '98 - Dream Match Never Ends (Korean board)", MACHINE_SUPPORTS_SAVE )
-GAME( 1998, kof98ka, kof98, kof98, neogeo, neogeo_state, neogeo, ROT0, "SNK", "The King of Fighters '98 - The Slugfest / King of Fighters '98 - Dream Match Never Ends (Korean board 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1998, kof98k, kof98, kof98, neogeo, neogeo_state, neogeo, ROT0, "SNK", "The King of Fighters '98 - The Slugfest / King of Fighters '98 - Dream Match Never Ends (Korean board, set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1998, kof98ka, kof98, kof98, neogeo, neogeo_state, neogeo, ROT0, "SNK", "The King of Fighters '98 - The Slugfest / King of Fighters '98 - Dream Match Never Ends (Korean board, set 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1998, kof98h, kof98, neobase, neogeo, neogeo_state, neogeo, ROT0, "SNK", "The King of Fighters '98 - The Slugfest / King of Fighters '98 - Dream Match Never Ends (NGH-2420)", MACHINE_SUPPORTS_SAVE )
GAME( 1998, lastbld2, neogeo, neobase, neogeo, neogeo_state, neogeo, ROT0, "SNK", "The Last Blade 2 / Bakumatsu Roman - Dai Ni Maku Gekka no Kenshi (NGM-2430 ~ NGH-2430)", MACHINE_SUPPORTS_SAVE )
GAME( 1998, neocup98, neogeo, neobase, neogeo, neogeo_state, neogeo, ROT0, "SNK", "Neo-Geo Cup '98 - The Road to the Victory", MACHINE_SUPPORTS_SAVE )
@@ -8841,7 +8875,8 @@ GAME( 1999, mslugx, neogeo, mslugx, neogeo, neogeo_state, neogeo, R
GAME( 1999, kof99, neogeo, kof99, neogeo, neogeo_state, neogeo, ROT0, "SNK", "The King of Fighters '99 - Millennium Battle (NGM-2510)" , MACHINE_SUPPORTS_SAVE ) /* Encrypted Code & GFX */
GAME( 1999, kof99h, kof99, kof99, neogeo, neogeo_state, neogeo, ROT0, "SNK", "The King of Fighters '99 - Millennium Battle (NGH-2510)" , MACHINE_SUPPORTS_SAVE ) /* Encrypted Code & GFX, crashes going into attract demo */
GAME( 1999, kof99e, kof99, kof99, neogeo, neogeo_state, neogeo, ROT0, "SNK", "The King of Fighters '99 - Millennium Battle (earlier)" , MACHINE_SUPPORTS_SAVE ) /* Encrypted Code & GFX */
-GAME( 1999, kof99k, kof99, kof99k, neogeo, neogeo_state, neogeo, ROT0, "SNK", "The King of Fighters '99 - Millennium Battle (Korean release)" , MACHINE_SUPPORTS_SAVE ) /* Encrypted GFX */
+GAME( 1999, kof99k, kof99, kof99, neogeo, neogeo_state, neogeo, ROT0, "SNK", "The King of Fighters '99 - Millennium Battle (Korean release)" , MACHINE_SUPPORTS_SAVE ) /* Encrypted Code & GFX */
+GAME( 1999, kof99ka, kof99, kof99k, neogeo, neogeo_state, neogeo, ROT0, "SNK", "The King of Fighters '99 - Millennium Battle (Korean release, non-encrypted program)" , MACHINE_SUPPORTS_SAVE ) /* Encrypted GFX */
GAME( 1999, kof99p, kof99, neobase, neogeo, neogeo_state, neogeo, ROT0, "SNK", "The King of Fighters '99 - Millennium Battle (prototype)", MACHINE_SUPPORTS_SAVE )
GAME( 1999, garou, neogeo, garou, neogeo, neogeo_state, neogeo, ROT0, "SNK", "Garou - Mark of the Wolves (NGM-2530)" , MACHINE_SUPPORTS_SAVE ) /* Encrypted Code & GFX */
GAME( 1999, garouh, garou, garouh, neogeo, neogeo_state, neogeo, ROT0, "SNK", "Garou - Mark of the Wolves (NGM-2530 ~ NGH-2530)" , MACHINE_SUPPORTS_SAVE ) /* Encrypted Code & GFX */
diff --git a/src/mame/drivers/newbrain.cpp b/src/mame/drivers/newbrain.cpp
index 0e4ab95b11b..8c1fe03c27c 100644
--- a/src/mame/drivers/newbrain.cpp
+++ b/src/mame/drivers/newbrain.cpp
@@ -31,8 +31,8 @@
TODO:
- - COPINT @ 84Hz instead of 50Hz? (with clock 3240506 is 50Hz)
- - CLKINT arrives too late and COP reads the VFD data before CPU writes it
+ - COPINT @ 84Hz instead of 50Hz? (with clock 3240506 is 50Hz)
+ - CLKINT arrives too late and COP reads the VFD data before CPU writes it
- VFD does not receive data from main CPU
- bitmapped video
- accurate video timing
@@ -270,7 +270,7 @@ WRITE8_MEMBER( newbrain_state::enrg_w )
// clock enable
int clk = BIT(data, 0);
-
+
if (m_clk != clk) {
m_clk = clk;
check_interrupt();
@@ -497,7 +497,7 @@ WRITE8_MEMBER( newbrain_state::cop_d_w )
if (!m_cop_k6 && k6) {
m_403_d = m_y[m_405_q & 0x0f]->read() & 0x0f;
-
+
if (LOG_COP) logerror("%s %s keydata %01x\n", machine().time().as_string(), machine().describe_context(), m_403_d);
}
diff --git a/src/mame/drivers/nmk16.cpp b/src/mame/drivers/nmk16.cpp
index 50046220893..4a9ad0fbb4f 100644
--- a/src/mame/drivers/nmk16.cpp
+++ b/src/mame/drivers/nmk16.cpp
@@ -7016,6 +7016,59 @@ ROM_START( redhawki )
ROM_LOAD( "5", 0x00000, 0x40000, CRC(e911ce33) SHA1(a29c4dea98a22235122303325c63c15fadd3431d) )
ROM_END
+ROM_START( redhawkg ) // original Afega PCB with Delta Coin sticker
+ ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 Code */
+ ROM_LOAD16_BYTE( "2.bin", 0x000000, 0x002000, CRC(ccd459eb) SHA1(677b03f1e3973f0e1f09272d336c2dd9da8f843c) )
+ ROM_CONTINUE(0x20000,0x2000)
+ ROM_CONTINUE(0x10000,0x2000)
+ ROM_CONTINUE(0x30000,0x2000)
+ ROM_CONTINUE(0x04000,0x2000)
+ ROM_CONTINUE(0x24000,0x2000)
+ ROM_CONTINUE(0x14000,0x2000)
+ ROM_CONTINUE(0x34000,0x2000)
+ ROM_CONTINUE(0x08000,0x2000)
+ ROM_CONTINUE(0x28000,0x2000)
+ ROM_CONTINUE(0x18000,0x2000)
+ ROM_CONTINUE(0x38000,0x2000)
+ ROM_CONTINUE(0x0c000,0x2000)
+ ROM_CONTINUE(0x2c000,0x2000)
+ ROM_CONTINUE(0x1c000,0x2000)
+ ROM_CONTINUE(0x3c000,0x2000)
+
+ ROM_LOAD16_BYTE( "3.bin", 0x000001, 0x002000, CRC(483802fd) SHA1(4ec2b15bc89c12806dab78ae30f5fe24e26d46eb) )
+ ROM_CONTINUE(0x20001,0x2000)
+ ROM_CONTINUE(0x10001,0x2000)
+ ROM_CONTINUE(0x30001,0x2000)
+ ROM_CONTINUE(0x04001,0x2000)
+ ROM_CONTINUE(0x24001,0x2000)
+ ROM_CONTINUE(0x14001,0x2000)
+ ROM_CONTINUE(0x34001,0x2000)
+ ROM_CONTINUE(0x08001,0x2000)
+ ROM_CONTINUE(0x28001,0x2000)
+ ROM_CONTINUE(0x18001,0x2000)
+ ROM_CONTINUE(0x38001,0x2000)
+ ROM_CONTINUE(0x0c001,0x2000)
+ ROM_CONTINUE(0x2c001,0x2000)
+ ROM_CONTINUE(0x1c001,0x2000)
+ ROM_CONTINUE(0x3c001,0x2000)
+
+ ROM_REGION( 0x10000, "audiocpu", 0 ) /* Z80 Code */
+ ROM_LOAD( "1.bin", 0x00000, 0x10000, CRC(5d8cf28e) SHA1(2a440bf5136f95af137b6688e566a14e65be94b1) )
+
+ ROM_REGION( 0x100000, "sprites", 0 ) /* Sprites, 16x16x4 */
+ ROM_LOAD16_BYTE( "6.bin", 0x000001, 0x080000, CRC(710c9e3c) SHA1(0fcefffa5334554729d5c278bceb48ba66921361) )
+ ROM_LOAD16_BYTE( "7.bin", 0x000000, 0x080000, CRC(a28c8454) SHA1(c4e14d18c24de73da196230f8ea824300d53e64d) )
+
+ ROM_REGION( 0x080000, "bgtile", 0 ) /* Layer 0, 16x16x8 */
+ ROM_LOAD( "4.bin", 0x000000, 0x080000, CRC(aafb3cc4) SHA1(b5f6608c1e05470fdfb22e0a35a8a74974c4d3cf) )
+
+ ROM_REGION( 0x00100, "fgtile", ROMREGION_ERASEFF ) /* Layer 1, 8x8x4 */
+ // Unused
+
+ ROM_REGION( 0x40000, "oki1", 0 ) /* Samples */
+ ROM_LOAD( "5", 0x00000, 0x40000, CRC(e911ce33) SHA1(a29c4dea98a22235122303325c63c15fadd3431d) )
+ROM_END
+
ROM_START( redhawkb )
ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 Code */
ROM_LOAD16_BYTE( "rhb-1.bin", 0x000000, 0x020000, CRC(e733ea07) SHA1(b1ffeda633d5e701f0e97c79930a54d7b89a85c5) )
@@ -7951,6 +8004,7 @@ GAME( 1995, dolmen, 0, twinactn, dolmen, driver_device, 0, ROT
GAME( 1998, stagger1, 0, stagger1, stagger1, driver_device, 0, ROT270, "Afega", "Stagger I (Japan)", 0 )
GAME( 1997, redhawk, stagger1, stagger1, stagger1, nmk16_state, redhawk, ROT270, "Afega (New Vision Ent. license)", "Red Hawk (US)", 0 )
GAME( 1997, redhawki, stagger1, redhawki, stagger1, driver_device, 0, ROT0, "Afega (Hea Dong Corp license)", "Red Hawk (Italy)", 0 ) // bootleg? strange scroll regs
+GAME( 1997, redhawkg, stagger1, redhawki, stagger1, driver_device, 0, ROT0, "Afega", "Red Hawk (Greece)", 0 )
GAME( 1997, redhawke, stagger1, stagger1, stagger1, driver_device, 0, ROT270, "Afega (Excellent Co. license)", "Red Hawk (Excellent Co., Ltd)", 0 )
GAME( 1997, redhawkk, stagger1, stagger1, stagger1, driver_device, 0, ROT270, "Afega", "Red Hawk (Korea)", 0 )
GAME( 1997, redhawkb, stagger1, redhawkb, redhawkb, driver_device, 0, ROT0, "bootleg", "Red Hawk (bootleg)", 0 )
diff --git a/src/mame/drivers/novag6502.cpp b/src/mame/drivers/novag6502.cpp
index 2aff0a8543b..2d23998c0c8 100644
--- a/src/mame/drivers/novag6502.cpp
+++ b/src/mame/drivers/novag6502.cpp
@@ -13,7 +13,8 @@
TODO:
- cforteb emulation (was initially sforteba romset)
- verify supercon IRQ and beeper frequency
- - why is sforte H and 1 leds always on?
+ - sforte irq active time (21.5us is too long)
+ - sforte/sexpert led handling is correct?
- printer port
******************************************************************************
@@ -51,14 +52,12 @@ instead of magnet sensors.
******************************************************************************/
-#include "emu.h"
+#include "includes/novagbase.h"
#include "cpu/m6502/m6502.h"
#include "cpu/m6502/m65c02.h"
#include "bus/rs232/rs232.h"
#include "machine/mos6551.h"
#include "machine/nvram.h"
-#include "sound/beep.h"
-#include "video/hd44780.h"
// internal artwork
#include "novag_sexpert.lh" // clickable
@@ -66,55 +65,17 @@ instead of magnet sensors.
#include "novag_supercon.lh" // clickable
-class novag6502_state : public driver_device
+class novag6502_state : public novagbase_state
{
public:
novag6502_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_beeper(*this, "beeper"),
- m_lcd(*this, "hd44780"),
- m_inp_matrix(*this, "IN.%u", 0),
- m_display_wait(33),
- m_display_maxy(1),
- m_display_maxx(0)
+ : novagbase_state(mconfig, type, tag)
{ }
- // devices/pointers
- required_device<cpu_device> m_maincpu;
- optional_device<beep_device> m_beeper;
- optional_device<hd44780_device> m_lcd;
- optional_ioport_array<8> m_inp_matrix;
-
TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE); }
TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE); }
- // misc common
- uint16_t m_inp_mux; // multiplexed keypad mask
- uint16_t m_led_select;
- uint16_t m_led_data;
-
- uint16_t read_inputs(int columns);
-
- // display common
- int m_display_wait; // led/lamp off-delay in microseconds (default 33ms)
- int m_display_maxy; // display matrix number of rows
- int m_display_maxx; // display matrix number of columns (max 31 for now)
-
- uint32_t m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
- uint16_t m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
- uint32_t m_display_cache[0x20]; // (internal use)
- uint8_t m_display_decay[0x20][0x20]; // (internal use)
-
- uint8_t m_lcd_control;
-
- TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
- void display_update();
- void set_display_size(int maxx, int maxy);
- void set_display_segmask(uint32_t digits, uint32_t mask);
- void display_matrix(int maxx, int maxy, uint32_t setx, uint32_t sety, bool update = true);
-
- // Super Constellation
+ // Super Constellation
DECLARE_WRITE8_MEMBER(supercon_mux_w);
DECLARE_WRITE8_MEMBER(supercon_control_w);
DECLARE_READ8_MEMBER(supercon_input1_r);
@@ -127,8 +88,6 @@ public:
DECLARE_WRITE8_MEMBER(sexpert_lcd_data_w);
DECLARE_READ8_MEMBER(sexpert_input1_r);
DECLARE_READ8_MEMBER(sexpert_input2_r);
- DECLARE_PALETTE_INIT(sexpert);
- HD44780_PIXEL_UPDATE(sexpert_pixel_update);
DECLARE_MACHINE_RESET(sexpert);
DECLARE_DRIVER_INIT(sexpert);
DECLARE_INPUT_CHANGED_MEMBER(sexpert_cpu_freq);
@@ -137,16 +96,12 @@ public:
// Super Forte
DECLARE_WRITE8_MEMBER(sforte_lcd_control_w);
DECLARE_WRITE8_MEMBER(sforte_lcd_data_w);
-
-protected:
- virtual void machine_start() override;
- virtual void machine_reset() override;
};
// machine start/reset
-void novag6502_state::machine_start()
+void novagbase_state::machine_start()
{
// zerofill
memset(m_display_state, 0, sizeof(m_display_state));
@@ -175,7 +130,7 @@ void novag6502_state::machine_start()
save_item(NAME(m_lcd_control));
}
-void novag6502_state::machine_reset()
+void novagbase_state::machine_reset()
{
}
@@ -190,9 +145,9 @@ void novag6502_state::machine_reset()
// The device may strobe the outputs very fast, it is unnoticeable to the user.
// To prevent flickering here, we need to simulate a decay.
-void novag6502_state::display_update()
+void novagbase_state::display_update()
{
- uint32_t active_state[0x20];
+ u32 active_state[0x20];
for (int y = 0; y < m_display_maxy; y++)
{
@@ -205,7 +160,7 @@ void novag6502_state::display_update()
m_display_decay[y][x] = m_display_wait;
// determine active state
- uint32_t ds = (m_display_decay[y][x] != 0) ? 1 : 0;
+ u32 ds = (m_display_decay[y][x] != 0) ? 1 : 0;
active_state[y] |= (ds << x);
}
}
@@ -243,7 +198,7 @@ void novag6502_state::display_update()
memcpy(m_display_cache, active_state, sizeof(m_display_cache));
}
-TIMER_DEVICE_CALLBACK_MEMBER(novag6502_state::display_decay_tick)
+TIMER_DEVICE_CALLBACK_MEMBER(novagbase_state::display_decay_tick)
{
// slowly turn off unpowered segments
for (int y = 0; y < m_display_maxy; y++)
@@ -254,13 +209,13 @@ TIMER_DEVICE_CALLBACK_MEMBER(novag6502_state::display_decay_tick)
display_update();
}
-void novag6502_state::set_display_size(int maxx, int maxy)
+void novagbase_state::set_display_size(int maxx, int maxy)
{
m_display_maxx = maxx;
m_display_maxy = maxy;
}
-void novag6502_state::set_display_segmask(uint32_t digits, uint32_t mask)
+void novagbase_state::set_display_segmask(u32 digits, u32 mask)
{
// set a segment mask per selected digit, but leave unselected ones alone
for (int i = 0; i < 0x20; i++)
@@ -271,12 +226,12 @@ void novag6502_state::set_display_segmask(uint32_t digits, uint32_t mask)
}
}
-void novag6502_state::display_matrix(int maxx, int maxy, uint32_t setx, uint32_t sety, bool update)
+void novagbase_state::display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update)
{
set_display_size(maxx, maxy);
// update current state
- uint32_t mask = (1 << maxx) - 1;
+ u32 mask = (1 << maxx) - 1;
for (int y = 0; y < maxy; y++)
m_display_state[y] = (sety >> y & 1) ? ((setx & mask) | (1 << maxx)) : 0;
@@ -285,11 +240,34 @@ void novag6502_state::display_matrix(int maxx, int maxy, uint32_t setx, uint32_t
}
+// LCD
+
+PALETTE_INIT_MEMBER(novagbase_state, novag_lcd)
+{
+ palette.set_pen_color(0, rgb_t(138, 146, 148)); // background
+ palette.set_pen_color(1, rgb_t(92, 83, 88)); // lcd pixel on
+ palette.set_pen_color(2, rgb_t(131, 136, 139)); // lcd pixel off
+}
+
+HD44780_PIXEL_UPDATE(novagbase_state::novag_lcd_pixel_update)
+{
+ // char size is 5x8
+ if (x > 4 || y > 7)
+ return;
+
+ if (line < 2 && pos < 8)
+ {
+ // internal: (8+8)*1, external: 1*16
+ bitmap.pix16(1 + y, 1 + line*8*6 + pos*6 + x) = state ? 1 : 2;
+ }
+}
+
+
// generic input handlers
-uint16_t novag6502_state::read_inputs(int columns)
+u16 novagbase_state::read_inputs(int columns)
{
- uint16_t ret = 0;
+ u16 ret = 0;
// read selected input rows
for (int i = 0; i < columns; i++)
@@ -346,34 +324,14 @@ READ8_MEMBER(novag6502_state::supercon_input2_r)
Super Expert
******************************************************************************/
-// LCD
-
-PALETTE_INIT_MEMBER(novag6502_state, sexpert)
-{
- palette.set_pen_color(0, rgb_t(138, 146, 148)); // background
- palette.set_pen_color(1, rgb_t(92, 83, 88)); // lcd pixel on
- palette.set_pen_color(2, rgb_t(131, 136, 139)); // lcd pixel off
-}
-
-HD44780_PIXEL_UPDATE(novag6502_state::sexpert_pixel_update)
-{
- // char size is 5x8
- if (x > 4 || y > 7)
- return;
-
- if (line < 2 && pos < 8)
- {
- // internal: (8+8)*1, external: 1*16
- bitmap.pix16(1 + y, 1 + line*8*6 + pos*6 + x) = state ? 1 : 2;
- }
-}
+// TTL/generic
WRITE8_MEMBER(novag6502_state::sexpert_lcd_control_w)
{
// d0: HD44780 RS
// d1: HD44780 R/W
// d2: HD44780 E
- m_lcd_control = data;
+ m_lcd_control = data & 7;
}
WRITE8_MEMBER(novag6502_state::sexpert_lcd_data_w)
@@ -383,8 +341,6 @@ WRITE8_MEMBER(novag6502_state::sexpert_lcd_data_w)
m_lcd->write(space, m_lcd_control & 1, data);
}
-// TTL/generic
-
WRITE8_MEMBER(novag6502_state::sexpert_leds_w)
{
// d0-d7: chessboard leds
@@ -398,7 +354,7 @@ WRITE8_MEMBER(novag6502_state::sexpert_mux_w)
// d3: enable beeper
m_beeper->set_state(data >> 3 & 1);
-
+
// d4-d7: 74145 to input mux/led select
m_inp_mux = 1 << (data >> 4 & 0xf) & 0xff;
display_matrix(8, 8, m_led_data, m_inp_mux);
@@ -427,7 +383,7 @@ void novag6502_state::sexpert_set_cpu_freq()
MACHINE_RESET_MEMBER(novag6502_state, sexpert)
{
membank("bank1")->set_entry(0);
- novag6502_state::machine_reset();
+ novagbase_state::machine_reset();
}
DRIVER_INIT_MEMBER(novag6502_state, sexpert)
@@ -458,9 +414,10 @@ WRITE8_MEMBER(novag6502_state::sforte_lcd_data_w)
// if lcd is disabled, misc control
if (~m_lcd_control & 4)
{
- // d5,d6: led data
- display_matrix(2, 8, data >> 5 & 3, m_inp_mux);
-
+ // d5,d6: led data, but not both at same time?
+ if ((data & 0x60) != 0x60)
+ display_matrix(2, 8, data >> 5 & 3, m_inp_mux);
+
// d7: enable beeper
m_beeper->set_state(data >> 7 & 1);
}
@@ -804,7 +761,7 @@ static MACHINE_CONFIG_START( supercon, novag6502_state )
MCFG_NVRAM_ADD_1FILL("nvram")
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", novag6502_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", novagbase_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_novag_supercon)
/* sound hardware */
@@ -822,7 +779,7 @@ static MACHINE_CONFIG_START( cforte, novag6502_state )
//MCFG_NVRAM_ADD_1FILL("nvram")
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", novag6502_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", novagbase_state, display_decay_tick, attotime::from_msec(1))
//MCFG_DEFAULT_LAYOUT(layout_novag_cforte)
/* sound hardware */
@@ -849,7 +806,7 @@ static MACHINE_CONFIG_START( sexpert, novag6502_state )
MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, nullptr)
MCFG_RS232_RXD_HANDLER(DEVWRITELINE("acia", mos6551_device, write_rxd))
MCFG_RS232_DSR_HANDLER(DEVWRITELINE("acia", mos6551_device, write_dsr))
-
+
MCFG_NVRAM_ADD_1FILL("nvram")
MCFG_MACHINE_RESET_OVERRIDE(novag6502_state, sexpert)
@@ -863,13 +820,13 @@ static MACHINE_CONFIG_START( sexpert, novag6502_state )
MCFG_SCREEN_UPDATE_DEVICE("hd44780", hd44780_device, screen_update)
MCFG_SCREEN_PALETTE("palette")
MCFG_PALETTE_ADD("palette", 3)
- MCFG_PALETTE_INIT_OWNER(novag6502_state, sexpert)
+ MCFG_PALETTE_INIT_OWNER(novagbase_state, novag_lcd)
MCFG_HD44780_ADD("hd44780")
MCFG_HD44780_LCD_SIZE(2, 8)
- MCFG_HD44780_PIXEL_UPDATE_CB(novag6502_state, sexpert_pixel_update)
+ MCFG_HD44780_PIXEL_UPDATE_CB(novagbase_state, novag_lcd_pixel_update)
- MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", novag6502_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", novagbase_state, display_decay_tick, attotime::from_msec(1))
MCFG_DEFAULT_LAYOUT(layout_novag_sexpert)
/* sound hardware */
@@ -883,7 +840,9 @@ static MACHINE_CONFIG_DERIVED( sforte, sexpert )
/* basic machine hardware */
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_PROGRAM_MAP(sforte_map)
-
+ MCFG_TIMER_MODIFY("irq_on")
+ MCFG_TIMER_START_DELAY(attotime::from_hz(XTAL_32_768kHz/128) - attotime::from_usec(15)) // active for ?us
+
MCFG_DEFAULT_LAYOUT(layout_novag_sforte)
MACHINE_CONFIG_END
@@ -902,8 +861,8 @@ ROM_END
ROM_START( cforteb )
ROM_REGION( 0x18000, "maincpu", 0 )
- ROM_LOAD("forte_b_l.u3", 0x0000, 0x8000, CRC(e3d194a1) SHA1(80457580d7c57e07895fd14bfdaf14b30952afca) )
- ROM_LOAD("forte_b_h.u1", 0x8000, 0x8000, CRC(dd824be8) SHA1(cd8666b6b525887f9fc48a730b71ceabcf07f3b9) )
+ ROM_LOAD("forte_b_l.bin", 0x0000, 0x8000, CRC(e3d194a1) SHA1(80457580d7c57e07895fd14bfdaf14b30952afca) )
+ ROM_LOAD("forte_b_h.bin", 0x8000, 0x8000, CRC(dd824be8) SHA1(cd8666b6b525887f9fc48a730b71ceabcf07f3b9) )
ROM_END
diff --git a/src/mame/drivers/novag68k.cpp b/src/mame/drivers/novag68k.cpp
new file mode 100644
index 00000000000..7319344d262
--- /dev/null
+++ b/src/mame/drivers/novag68k.cpp
@@ -0,0 +1,316 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/******************************************************************************
+
+ Novag generic 68000 based chess computer driver
+
+ NOTE: MAME doesn't include a generalized implementation for boardpieces yet,
+ greatly affecting user playability of emulated electronic board games.
+ As workaround for the chess games, use an external chess GUI on the side,
+ such as Arena(in editmode).
+
+ TODO:
+ - verify irq/beeper timing
+ - RS232 port
+
+******************************************************************************
+
+Diablo 68000:
+- M68000 @ 16MHz, IRQ ~256Hz
+- 2*8KB RAM TC5565 battery-backed, 2*32KB hashtable RAM TC55257 3*32KB ROM
+- HD44780 LCD controller (16x1)
+- R65C51P2 ACIA @ 1.8432MHz, RS232
+- magnetic sensors, 8*8 chessboard leds
+
+******************************************************************************/
+
+#include "includes/novagbase.h"
+#include "cpu/m68000/m68000.h"
+#include "machine/mos6551.h"
+#include "machine/nvram.h"
+
+// internal artwork
+#include "novag_diablo68k.lh" // clickable
+
+
+class novag68k_state : public novagbase_state
+{
+public:
+ novag68k_state(const machine_config &mconfig, device_type type, const char *tag)
+ : novagbase_state(mconfig, type, tag)
+ { }
+
+ // Diablo 68000
+ DECLARE_WRITE8_MEMBER(diablo68k_control_w);
+ DECLARE_WRITE8_MEMBER(diablo68k_lcd_data_w);
+ DECLARE_WRITE8_MEMBER(diablo68k_leds_w);
+ DECLARE_READ8_MEMBER(diablo68k_input1_r);
+ DECLARE_READ8_MEMBER(diablo68k_input2_r);
+};
+
+
+
+// Devices, I/O
+
+/******************************************************************************
+ Diablo 68000
+******************************************************************************/
+
+// TTL
+
+WRITE8_MEMBER(novag68k_state::diablo68k_control_w)
+{
+ // d1: HD44780 RS
+ // other: ?
+ m_lcd_control = data & 7;
+
+ // d7: enable beeper
+ m_beeper->set_state(data >> 7 & 1);
+
+ // d4-d6: input mux, led select
+ m_inp_mux = 1 << (data >> 4 & 0x7) & 0xff;
+ display_matrix(8, 8, m_led_data, m_inp_mux);
+ m_led_data = 0; // ?
+}
+
+WRITE8_MEMBER(novag68k_state::diablo68k_lcd_data_w)
+{
+ // d0-d7: HD44780 data
+ m_lcd->write(space, m_lcd_control >> 1 & 1, data);
+}
+
+WRITE8_MEMBER(novag68k_state::diablo68k_leds_w)
+{
+ // d0-d7: chessboard leds
+ m_led_data = data;
+}
+
+READ8_MEMBER(novag68k_state::diablo68k_input1_r)
+{
+ // d0-d7: multiplexed inputs (chessboard squares)
+ return ~read_inputs(8) & 0xff;
+}
+
+READ8_MEMBER(novag68k_state::diablo68k_input2_r)
+{
+ // d0-d2: multiplexed inputs (side panel)
+ // other: ?
+ return ~read_inputs(8) >> 8 & 7;
+}
+
+
+
+/******************************************************************************
+ Address Maps
+******************************************************************************/
+
+// Diablo 68000
+
+static ADDRESS_MAP_START( diablo68k_map, AS_PROGRAM, 16, novag68k_state )
+ AM_RANGE(0x000000, 0x00ffff) AM_ROM
+ AM_RANGE(0x200000, 0x20ffff) AM_ROM AM_REGION("maincpu", 0x10000)
+ AM_RANGE(0x280000, 0x28ffff) AM_RAM
+ AM_RANGE(0x300000, 0x300007) AM_DEVREADWRITE8("acia", mos6551_device, read, write, 0xff00)
+ AM_RANGE(0x380000, 0x380001) AM_WRITE8(diablo68k_leds_w, 0xff00) AM_READNOP
+ AM_RANGE(0x3a0000, 0x3a0001) AM_WRITE8(diablo68k_lcd_data_w, 0xff00)
+ AM_RANGE(0x3c0000, 0x3c0001) AM_READWRITE8(diablo68k_input2_r, diablo68k_control_w, 0xff00)
+ AM_RANGE(0x3e0000, 0x3e0001) AM_READ8(diablo68k_input1_r, 0xff00)
+ AM_RANGE(0xff8000, 0xffbfff) AM_RAM AM_SHARE("nvram")
+ADDRESS_MAP_END
+
+
+
+/******************************************************************************
+ Input Ports
+******************************************************************************/
+
+static INPUT_PORTS_START( cb_magnets )
+ PORT_START("IN.0")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+
+ PORT_START("IN.1")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+
+ PORT_START("IN.2")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+
+ PORT_START("IN.3")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+
+ PORT_START("IN.4")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+
+ PORT_START("IN.5")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+
+ PORT_START("IN.6")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+
+ PORT_START("IN.7")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_TOGGLE PORT_NAME("Board Sensor")
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( diablo68k )
+ PORT_INCLUDE( cb_magnets )
+
+ PORT_MODIFY("IN.0")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_A) PORT_NAME("Go")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Q) PORT_NAME("Take Back / Analyze Games")
+ PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_1) PORT_NAME("->")
+
+ PORT_MODIFY("IN.1")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_S) PORT_NAME("Set Level")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_W) PORT_NAME("Flip Display / Time Control")
+ PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_2) PORT_NAME("<-")
+
+ PORT_MODIFY("IN.2")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_D) PORT_NAME("Hint / Next Best")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_E) PORT_NAME("Priority / Tournament Book / Pawn")
+ PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_3) PORT_NAME("Yes/Start / Start of Game")
+
+ PORT_MODIFY("IN.3")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_F) PORT_NAME("Trace Forward / AutoPlay")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_R) PORT_NAME("Pro-Op / Restore Game / Rook")
+ PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_4) PORT_NAME("No/End / End of Game")
+
+ PORT_MODIFY("IN.4")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_G) PORT_NAME("Clear Board / Delete Pro-Op")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_T) PORT_NAME("Best Move/Random / Review / Knight")
+ PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_5) PORT_NAME("Print Book / Store Game")
+
+ PORT_MODIFY("IN.5")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_H) PORT_NAME("Change Color")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_Y) PORT_NAME("Sound / Info / Bishop")
+ PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_6) PORT_NAME("Print Moves / Print Evaluations")
+
+ PORT_MODIFY("IN.6")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_J) PORT_NAME("Verify/Set Up / Pro-Op Book/Both Books")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_U) PORT_NAME("Solve Mate / Infinite / Queen")
+ PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_7) PORT_NAME("Print List / Acc. Time")
+
+ PORT_MODIFY("IN.7")
+ PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_K) PORT_NAME("New Game")
+ PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_I) PORT_NAME("Player/Player / Gambit Book / King")
+ PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_CODE(KEYCODE_8) PORT_NAME("Print Board / Interface")
+INPUT_PORTS_END
+
+
+
+/******************************************************************************
+ Machine Drivers
+******************************************************************************/
+
+static MACHINE_CONFIG_START( diablo68k, novag68k_state )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", M68000, XTAL_16MHz)
+ MCFG_CPU_PERIODIC_INT_DRIVER(novag68k_state, irq2_line_hold, 256) // guessed
+ MCFG_CPU_PROGRAM_MAP(diablo68k_map)
+
+ MCFG_DEVICE_ADD("acia", MOS6551, 0)
+ MCFG_MOS6551_XTAL(XTAL_1_8432MHz)
+
+ MCFG_NVRAM_ADD_0FILL("nvram")
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", LCD)
+ MCFG_SCREEN_REFRESH_RATE(60) // arbitrary
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
+ MCFG_SCREEN_SIZE(6*16+1, 10)
+ MCFG_SCREEN_VISIBLE_AREA(0, 6*16, 0, 10-1)
+ MCFG_SCREEN_UPDATE_DEVICE("hd44780", hd44780_device, screen_update)
+ MCFG_SCREEN_PALETTE("palette")
+ MCFG_PALETTE_ADD("palette", 3)
+ MCFG_PALETTE_INIT_OWNER(novagbase_state, novag_lcd)
+
+ MCFG_HD44780_ADD("hd44780")
+ MCFG_HD44780_LCD_SIZE(2, 8)
+ MCFG_HD44780_PIXEL_UPDATE_CB(novagbase_state, novag_lcd_pixel_update)
+
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", novagbase_state, display_decay_tick, attotime::from_msec(1))
+ MCFG_DEFAULT_LAYOUT(layout_novag_diablo68k)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("beeper", BEEP, 1024) // guessed
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+MACHINE_CONFIG_END
+
+
+
+/******************************************************************************
+ ROM Definitions
+******************************************************************************/
+
+ROM_START( diablo68 )
+ ROM_REGION16_BE( 0x20000, "maincpu", 0 )
+ ROM_LOAD16_BYTE("evenurom.bin", 0x00000, 0x8000, CRC(03477746) SHA1(8bffcb159a61e59bfc45411e319aea6501ebe2f9) )
+ ROM_LOAD16_BYTE("oddlrom.bin", 0x00001, 0x8000, CRC(e182dbdd) SHA1(24dacbef2173fa737636e4729ff22ec1e6623ca5) )
+ ROM_LOAD16_BYTE("book.bin", 0x10000, 0x8000, CRC(553a5c8c) SHA1(ccb5460ff10766a5ca8008ae2cffcff794318108) ) // no odd rom
+ROM_END
+
+
+
+/******************************************************************************
+ Drivers
+******************************************************************************/
+
+/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY, FULLNAME, FLAGS */
+CONS( 1991, diablo68, 0, 0, diablo68k, diablo68k, driver_device, 0, "Novag", "Diablo 68000", MACHINE_CLICKABLE_ARTWORK )
diff --git a/src/mame/drivers/osborne1.cpp b/src/mame/drivers/osborne1.cpp
index f94df70c8b5..99b68229b14 100644
--- a/src/mame/drivers/osborne1.cpp
+++ b/src/mame/drivers/osborne1.cpp
@@ -180,7 +180,7 @@ static INPUT_PORTS_START( osborne1 )
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_START("RESET")
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("RESET") PORT_CODE(KEYCODE_F12)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("RESET") PORT_CODE(KEYCODE_F12) PORT_CHANGED_MEMBER(DEVICE_SELF, osborne1_state, reset_key, 0)
PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED)
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
diff --git a/src/mame/drivers/pc.cpp b/src/mame/drivers/pc.cpp
index c89282b37da..098a030929f 100644
--- a/src/mame/drivers/pc.cpp
+++ b/src/mame/drivers/pc.cpp
@@ -38,12 +38,12 @@ Expansion: Expansion box, with 5 ISA slots and space for a 5.25" drive and a har
Bondwell BW230 (Pro28 series)
=============
Links: http://gallery.fdd5-25.net/details.php?image_id=3463&sessionid=1eaeb42abdf2758a020b16204a2a8e5a ; http://www.zonadepruebas.com/viewtopic.php?t=3696 ; ftp://ftp.whtech.com/emulators/mess/old/Complete%20MESS%20Geneve%20emulation/mess/sysinfo/bondwell.htm
-Info: Info is hard to come by. A BW230 is nowhere to be found, the links about the Pro28 series suggest an XT compatible built around a passive backplane and a slot CPU. This is confirmed by the old MESS info.
+Info: Info is hard to come by. A BW230 is nowhere to be found, the links about the Pro28 series suggest an XT compatible built around a passive backplane and a slot CPU. This is confirmed by the old MESS info.
Form Factor: Desktop
CPU: 8088 @ 4.77 MHz (MESS sysinfo: 3.75)/ 8 MHz
RAM: 512K / 640K
-Bus: at least 2x ISA: 1) CPU, RAM, Floppy controller
- 2) Graphics, Game, Parallel
+Bus: at least 2x ISA: 1) CPU, RAM, Floppy controller
+ 2) Graphics, Game, Parallel
Video: Hercules/CGA
Mass storage: 1x 5.25" 360K and 20/30MB Harddisk.
@@ -57,7 +57,7 @@ RAM: 512K / 640K
Bus: Proprietary expansion slot, carrying almost all ISA signals
Video: On board, MDA/Hercules/CGA
Mass storage: 1x 5.25" 360K
-On board ports: Floppy, floppy expansion (for Amiga A1010/1011 (720 KB, 3.5") or A1020 (360 KB, 5.25" drives), speaker (but no speaker fitted), mouse,
+On board ports: Floppy, floppy expansion (for Amiga A1010/1011 (720 KB, 3.5") or A1020 (360 KB, 5.25" drives), speaker (but no speaker fitted), mouse,
Options: 8087 FPU
Expansion: Expansion box: 2x ISA
@@ -78,8 +78,8 @@ Options: 8087 FPU
Zenith SuperSport
=======================
-Links: http://www.focushacks.com/zenith/myzenith.html , http://retro-computing.blogspot.de/2006/08/zds-supersport-laptop.html , http://www.minuszerodegrees.net/manuals/Zenith%20Data%20Systems/ZDS%20SupersPort%20-%20Service%20Manual.pdf
- http://www.minuszerodegrees.net/manuals/Zenith%20Data%20Systems/ZDS%20SupersPort%20-%20User%20and%20Technical%20Manual.pdf
+Links: http://www.focushacks.com/zenith/myzenith.html , http://retro-computing.blogspot.de/2006/08/zds-supersport-laptop.html , http://www.minuszerodegrees.net/manuals/Zenith%20Data%20Systems/ZDS%20SupersPort%20-%20Service%20Manual.pdf
+ http://www.minuszerodegrees.net/manuals/Zenith%20Data%20Systems/ZDS%20SupersPort%20-%20User%20and%20Technical%20Manual.pdf
Info: ZWL-184 to distinguish it from the later 80286 based models
Form Factor: Laptop
CPU: 80C88 @ 4.77 MHz or 8 MHz
@@ -99,9 +99,9 @@ Info: Multitech PC/700 mainboard
Form Factor: Desktop
CPU: 8088 @ 4.77MHz / 8 MHz
RAM: 640KB
-Bus: 6x ISA: 1) MDA/Hercules/CGA and parallel port
- 2) Floppy, RTC and serial port
- 3) (optional) MFM harddisk controller
+Bus: 6x ISA: 1) MDA/Hercules/CGA and parallel port
+ 2) Floppy, RTC and serial port
+ 3) (optional) MFM harddisk controller
Video: MDA/Hercules, exchangable via ISA-slot
Mass storage: 1x 5.25" 360K floppy and 1x 5.25" 360K floppy or MFM hard drive (10MB or 20MB)
On board ports: parallel, serial, beeper
@@ -111,18 +111,18 @@ Options: 8087 FPU
NCR PC4i
========
Links: http://www.minuszerodegrees.net/manuals/NCR/NCR%20PC4i%20-%20Technical%20Reference%20Manual%20-%20January%201986.pdf
-Info: The earlier PC4 is not quite IBM compatible, the "i" in PC4i indicates full IBM compatibility.
- The NCR Graphics card supports a special 640x400 video mode
+Info: The earlier PC4 is not quite IBM compatible, the "i" in PC4i indicates full IBM compatibility.
+ The NCR Graphics card supports a special 640x400 video mode
Form Factor: All-in-one desktop
CPU: 8088 @ 4.77 MHz
RAM: 256K, expandable to 640K
-Bus: 7x ISA: 1) (optional) RAM expansion board
- 2) empty
- 3) 32K Video/Graphics board (64K option)
- 4) (optional) Alpha board
- 5) empty
- 6) (optional) MFM harddisk controller
- 7) empty
+Bus: 7x ISA: 1) (optional) RAM expansion board
+ 2) empty
+ 3) 32K Video/Graphics board (64K option)
+ 4) (optional) Alpha board
+ 5) empty
+ 6) (optional) MFM harddisk controller
+ 7) empty
Video: K510: 4KB Alpha for internal monitor; K511: 32KB Graphics for internal monitor; K512: 32KB upgrade for K512; K140: 16KB Graphics for external monitor; K141: 4KB Alpha for external monitor
Display: Mono or color CRT 640x400 pixel
Mass storage: 1x 5.25" 360K floppy and 1x 5.25" 360K floppy or 10 MB harddisk
@@ -133,7 +133,7 @@ Options: 8087 FPU, K101 memory upgrade in 64K steps, 1.2MB floppy and controller
Olivetti M15
============
Links: http://www.1000bit.it/ad/bro/olivetti/olivettiM15.pdf , http://electrickery.xs4all.nl/comp/m15/ , http://electrickery.xs4all.nl/comp/m15/doc/M15_InstallationAndOperationsGuide.pdf
- http://www.museotecnologicamente.it/olivetti-m-15-1987/ , http://www.museotecnologicamente.it/wp-content/uploads/M15_Depliant_inglese.pdf
+ http://www.museotecnologicamente.it/olivetti-m-15-1987/ , http://www.museotecnologicamente.it/wp-content/uploads/M15_Depliant_inglese.pdf
Info: The info brochure has a picture of a working M15. This shows the LCD display with a green background and blue text/graphics.
Form Factor: Laptop
CPU: 80C88 @ 4.77 MHz
@@ -145,7 +145,7 @@ Mass storage: 2x 3.5" 720K drives
Ports: serial, parallel, ext. floppy, RTC
Expansion: External 5.25" 360K floppy drive
-
+
IBM5550
=======
Information can be found at http://homepage3.nifty.com/ibm5550/index-e.html
@@ -169,12 +169,12 @@ Options: Modem, color video output
Sanyo MBC-16
============
-Links:
+Links:
Info: In the MBC-16 I had, the graphics card had a Sanyo sticker on it, so I assume that was the original graphics card for the machine.
Form Factor: Desktop
CPU: 8088 @ 8MHz
RAM: 640KB
-Bus: 3x ISA: 1) ATI Graphics Solution SR https://sites.google.com/site/atiwonderseriesdatabase/
+Bus: 3x ISA: 1) ATI Graphics Solution SR https://sites.google.com/site/atiwonderseriesdatabase/
Video: MDA/CGA/Plantronics
Mass storage: 1 or 2 5.25" 360K floppies, MFM harddisk on hardcard or via seperate controller
On board ports: serial, parallel, floppy
@@ -211,7 +211,7 @@ Links: http://www.atari-computermuseum.de/pc1.htm , http://trelohra.blogspot.de/
Form Factor: Desktop
CPU: 8088 @ 4.77 MHz or 8 MHz
RAM: 640K
-Bus: 5x ISA: 1) Adaptec ACB-2072 RLL Controller Card
+Bus: 5x ISA: 1) Adaptec ACB-2072 RLL Controller Card
Video: On-board MDA/CGA/Hercules/EGA
Mass storage: 1x 5.25" 360K floppy + 30MB RLL harddisk
On board ports: floppy, parallel, serial, mouse, speaker
@@ -221,20 +221,20 @@ Options: 8087 FPU
Eagle 1600
==========
Links: https://archive.org/details/bitsavers_eagleCompu00Brochure_9975235 , http://www.vcfed.org/forum/showthread.php?49510-Eagle-Computer-model-list , http://bitsavers.trailing-edge.com/pdf/eagleComputer/1600/1600_Series_Training_Notes.pdf
-Info: Eagle 1620 - 8086/128K, 2 Quad density floppy drives, 4 Expansion slots available, ~1983, Eagle 1630 - 8086/128K, 1 Quad density floppy drive, 10MB HD, 3 Expansion Slots available (Same as 1620 with hard drive), ~1983Eagle 1640 - 8086/512K, 1 Quad density floppy drive, 32MB HD, 3 Expansion Slots available, ~1984
- The native floppy format is 780K, 2 sides, 80 tracks/side, 1024 bytes/sector, 5 sectors per track. Standard 360K disks can be read
- Holding "T" and resetting starts a system diagnostics test
+Info: Eagle 1620 - 8086/128K, 2 Quad density floppy drives, 4 Expansion slots available, ~1983, Eagle 1630 - 8086/128K, 1 Quad density floppy drive, 10MB HD, 3 Expansion Slots available (Same as 1620 with hard drive), ~1983Eagle 1640 - 8086/512K, 1 Quad density floppy drive, 32MB HD, 3 Expansion Slots available, ~1984
+ The native floppy format is 780K, 2 sides, 80 tracks/side, 1024 bytes/sector, 5 sectors per track. Standard 360K disks can be read
+ Holding "T" and resetting starts a system diagnostics test
Form Factor: Desktop
CPU: 8086 @ 8 MHz
RAM: 128K / 512K
-Bus: 8xISA: 1) SASI board, connects to a XEBEC Sl410 SASI => MFM bridge board
- 2) Floppy controller
- 3) empty
- 4) Video/graphics controller board
- 5) empty
- 6) empty
- 7) Serial board: 2x serial, one sync/async, one async only
- 8) Parallel board
+Bus: 8xISA: 1) SASI board, connects to a XEBEC Sl410 SASI => MFM bridge board
+ 2) Floppy controller
+ 3) empty
+ 4) Video/graphics controller board
+ 5) empty
+ 6) empty
+ 7) Serial board: 2x serial, one sync/async, one async only
+ 8) Parallel board
Video: 80x25 text mode, 720x352 pixel graphics mode
Mass storage: 1x 5.25" QD 780K floppy and 1x 5.25" QD 820K floppy or 10/30MB MFM harddisk
Options: 8087 FPU, EagleNet File server, EightPort serial card, High Resolution color board and video, Video Cassette Adapter board for 80MB backup on video cassette
@@ -245,9 +245,9 @@ Links: http://minuszerodegrees.net/manuals.htm#VTech , http://minuszerodegrees.n
Form Factor: Desktop
CPU: 8088 @ 4.77 MHz or 10 MHz
RAM: 512K / 640K, additionally 512K or 1M EMS on board
-Bus: 8xISA: 1) Monochrome graphics/color graphics card
- 2) Multi I/O Card (Floppy, 2x serial, parallel, game, RTC)
- 3) (optional) hard disk controller
+Bus: 8xISA: 1) Monochrome graphics/color graphics card
+ 2) Multi I/O Card (Floppy, 2x serial, parallel, game, RTC)
+ 3) (optional) hard disk controller
Video: MDA/CGA/Hercules
Mass storage: 2x 5.25" 360K floppies and 1 or 2 harddisks (20MB / 30MB / 40MB)
On board ports: speaker
@@ -259,9 +259,9 @@ Links: http://minuszerodegrees.net/manuals.htm#VTech , http://th99.classic-compu
Form Factor: Desktop
CPU: 8088 @ 4.77MHz or 10 MHz
RAM: 512K / 640K, additionally 512K or 1M EMS on board
-Bus: 8x ISA: 1) Monochrome graphics/color graphics card http://th99.classic-computing.de/src/v/U-Z/52547.htm , alternatively an EGA card
- 2) Multi I/O Card (Floppy, 2x serial, 1x parallel, game, RTC) http://th99.classic-computing.de/src/i/U-Z/52519.htm
- 3) (optional) hard disk controller
+Bus: 8x ISA: 1) Monochrome graphics/color graphics card http://th99.classic-computing.de/src/v/U-Z/52547.htm , alternatively an EGA card
+ 2) Multi I/O Card (Floppy, 2x serial, 1x parallel, game, RTC) http://th99.classic-computing.de/src/i/U-Z/52519.htm
+ 3) (optional) hard disk controller
Video: MDA/Hercules/CGA
Mass storage: 2x 5.25" 360K or 1x 5.25" 360K and 1x 3.5" 720K, additional harddisk optional
On board ports: speaker
@@ -433,7 +433,7 @@ static MACHINE_CONFIG_FRAGMENT( cfg_single_360K )
MCFG_SLOT_DEFAULT_OPTION("525dd")
MCFG_SLOT_FIXED(true)
MCFG_DEVICE_REMOVE("fdc:1")
-MACHINE_CONFIG_END
+MACHINE_CONFIG_END
//Data General One
@@ -547,12 +547,12 @@ static MACHINE_CONFIG_DERIVED ( ncrpc4i, pccga )
//MCFG_DEVICE_MODIFY("mb:isa")
MCFG_ISA8_SLOT_ADD("mb:isa", "isa6", pc_isa8_cards, nullptr, false)
MCFG_ISA8_SLOT_ADD("mb:isa", "isa7", pc_isa8_cards, nullptr, false)
-
+
MCFG_DEVICE_MODIFY(RAM_TAG)
MCFG_RAM_DEFAULT_SIZE("640K")
MCFG_RAM_EXTRA_OPTIONS("64K, 128K, 256K, 512K")
MACHINE_CONFIG_END
-
+
// Siemens Sicomp PC16-05
static DEVICE_INPUT_DEFAULTS_START( siemens )
@@ -844,7 +844,7 @@ ROM_START ( ataripc1 )
ROMX_LOAD( "award_atari_pc_bios_3.06.bin", 0x8000, 0x8000, CRC(256427ce) SHA1(999f6af64b79f88c1d3492f386d9bee08efb50e7), ROM_BIOS(1))
ROM_SYSTEM_BIOS( 1, "v3.08", "v3.08" )
ROMX_LOAD( "award_atari_pc_bios_3.08.bin", 0x8000, 0x8000, CRC(929a2443) SHA1(8e98f3c9180c55b1f5521727779c016083d27960), ROM_BIOS(2)) //same as on Atari PC3, also used on Atari PC2
-ROM_END
+ROM_END
ROM_START( ataripc3 )
ROM_REGION(0x10000,"bios", 0)
@@ -888,26 +888,26 @@ ROM_END
***************************************************************************/
-/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */
-COMP( 1984, dgone, ibm5150, 0, dgone, pccga, driver_device, 0, "Data General", "Data General/One" , MACHINE_NOT_WORKING)/* CGA, 2x 3.5" disk drives */
-COMP( 1985, bw230, ibm5150, 0, bondwell, bondwell, pc_state, bondwell, "Bondwell Holding", "BW230 (PRO28 Series)", 0 )
-COMP( 1984, compc1, ibm5150, 0, pccga, pccga, driver_device, 0, "Commodore Business Machines", "Commodore PC-1" , MACHINE_NOT_WORKING)
-COMP( 1987, pc10iii, ibm5150, 0, pccga, pccga, driver_device, 0, "Commodore Business Machines", "Commodore PC-10 III" , MACHINE_NOT_WORKING)
-COMP( 1992, iskr3104, ibm5150, 0, iskr3104, pccga, driver_device, 0, "Schetmash", "Iskra 3104", MACHINE_NOT_WORKING)
-COMP( 1989, mk88, ibm5150, 0, mk88, pccga, driver_device, 0, "<unknown>", "MK-88", MACHINE_NOT_WORKING)
-COMP( 1991, poisk2, ibm5150, 0, poisk2, pccga, driver_device, 0, "<unknown>", "Poisk-2", MACHINE_NOT_WORKING)
-COMP( 1990, mc1702, ibm5150, 0, pccga, pccga, driver_device, 0, "<unknown>", "Elektronika MC-1702", MACHINE_NOT_WORKING)
-COMP( 1987, zdsupers, ibm5150, 0, zenith, pccga, driver_device, 0, "Zenith Data Systems", "SuperSport", 0)
-COMP( 1985, sicpc1605, ibm5150, 0, siemens, pccga, driver_device, 0, "Siemens", "Sicomp PC16-05", MACHINE_NOT_WORKING)
-COMP( 1985, ncrpc4i, ibm5150, 0, ncrpc4i, pccga, driver_device, 0, "NCR", "PC4i", MACHINE_NOT_WORKING)
-COMP( 198?, olivm15, ibm5150, 0, m15, pccga, driver_device, 0, "Olivetti", "M15", 0)
-COMP( 1983, ibm5550, ibm5150, 0, ibm5550, pccga, driver_device, 0, "International Business Machines", "IBM 5550", MACHINE_NOT_WORKING)
-COMP( 1985, pc7000, ibm5150, 0, pccga, pccga, driver_device, 0, "Sharp", "PC-7000", MACHINE_NOT_WORKING)
-COMP( 1988, sx16, ibm5150, 0, pccga, pccga, driver_device, 0, "Sanyo", "SX-16", MACHINE_NOT_WORKING)
-COMP( 198?, mbc16, ibm5150, 0, pccga, pccga, driver_device, 0, "Sanyo", "MBC-16" , MACHINE_NOT_WORKING)
-COMP( 1987, ataripc1, ibm5150, 0, ataripc1, pccga, driver_device, 0, "Atari", "PC1" , 0)
-COMP( 1988, ataripc3, ibm5150, 0, pccga, pccga, driver_device, 0, "Atari", "PC3" , 0)
-COMP( 1989, ssam88s, ibm5150, 0, pccga, pccga, driver_device, 0, "Samsung", "Samtron 88S" , MACHINE_NOT_WORKING)
-COMP( 1983, eagle1600, ibm5150, 0, eagle1600, pccga, driver_device, 0, "Eagle", "1600" , MACHINE_NOT_WORKING)
-COMP( 1988, laser_turbo_xt, ibm5150, 0, laser_turbo_xt, 0, driver_device, 0, "VTech", "Laser Turbo XT" , 0)
-COMP( 1989, laser_xt3, ibm5150, 0, laser_xt3, 0, driver_device, 0, "VTech", "Laser XT/3" , 0)
+/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */
+COMP( 1984, dgone, ibm5150, 0, dgone, pccga, driver_device, 0, "Data General", "Data General/One" , MACHINE_NOT_WORKING)/* CGA, 2x 3.5" disk drives */
+COMP( 1985, bw230, ibm5150, 0, bondwell, bondwell, pc_state, bondwell, "Bondwell Holding", "BW230 (PRO28 Series)", 0 )
+COMP( 1984, compc1, ibm5150, 0, pccga, pccga, driver_device, 0, "Commodore Business Machines", "Commodore PC-1" , MACHINE_NOT_WORKING)
+COMP( 1987, pc10iii, ibm5150, 0, pccga, pccga, driver_device, 0, "Commodore Business Machines", "Commodore PC-10 III" , MACHINE_NOT_WORKING)
+COMP( 1992, iskr3104, ibm5150, 0, iskr3104, pccga, driver_device, 0, "Schetmash", "Iskra 3104", MACHINE_NOT_WORKING)
+COMP( 1989, mk88, ibm5150, 0, mk88, pccga, driver_device, 0, "<unknown>", "MK-88", MACHINE_NOT_WORKING)
+COMP( 1991, poisk2, ibm5150, 0, poisk2, pccga, driver_device, 0, "<unknown>", "Poisk-2", MACHINE_NOT_WORKING)
+COMP( 1990, mc1702, ibm5150, 0, pccga, pccga, driver_device, 0, "<unknown>", "Elektronika MC-1702", MACHINE_NOT_WORKING)
+COMP( 1987, zdsupers, ibm5150, 0, zenith, pccga, driver_device, 0, "Zenith Data Systems", "SuperSport", 0)
+COMP( 1985, sicpc1605, ibm5150, 0, siemens, pccga, driver_device, 0, "Siemens", "Sicomp PC16-05", MACHINE_NOT_WORKING)
+COMP( 1985, ncrpc4i, ibm5150, 0, ncrpc4i, pccga, driver_device, 0, "NCR", "PC4i", MACHINE_NOT_WORKING)
+COMP( 198?, olivm15, ibm5150, 0, m15, pccga, driver_device, 0, "Olivetti", "M15", 0)
+COMP( 1983, ibm5550, ibm5150, 0, ibm5550, pccga, driver_device, 0, "International Business Machines", "IBM 5550", MACHINE_NOT_WORKING)
+COMP( 1985, pc7000, ibm5150, 0, pccga, pccga, driver_device, 0, "Sharp", "PC-7000", MACHINE_NOT_WORKING)
+COMP( 1988, sx16, ibm5150, 0, pccga, pccga, driver_device, 0, "Sanyo", "SX-16", MACHINE_NOT_WORKING)
+COMP( 198?, mbc16, ibm5150, 0, pccga, pccga, driver_device, 0, "Sanyo", "MBC-16" , MACHINE_NOT_WORKING)
+COMP( 1987, ataripc1, ibm5150, 0, ataripc1, pccga, driver_device, 0, "Atari", "PC1" , 0)
+COMP( 1988, ataripc3, ibm5150, 0, pccga, pccga, driver_device, 0, "Atari", "PC3" , 0)
+COMP( 1989, ssam88s, ibm5150, 0, pccga, pccga, driver_device, 0, "Samsung", "Samtron 88S" , MACHINE_NOT_WORKING)
+COMP( 1983, eagle1600, ibm5150, 0, eagle1600, pccga, driver_device, 0, "Eagle", "1600" , MACHINE_NOT_WORKING)
+COMP( 1988, laser_turbo_xt, ibm5150, 0, laser_turbo_xt, 0, driver_device, 0, "VTech", "Laser Turbo XT" , 0)
+COMP( 1989, laser_xt3, ibm5150, 0, laser_xt3, 0, driver_device, 0, "VTech", "Laser XT/3" , 0)
diff --git a/src/mame/drivers/pc9801.cpp b/src/mame/drivers/pc9801.cpp
index da1f6bebdcc..3285b30972d 100644
--- a/src/mame/drivers/pc9801.cpp
+++ b/src/mame/drivers/pc9801.cpp
@@ -17,7 +17,8 @@
- some later SWs put "Invalid command byte 05" (Absolutely Mahjong on Epson logo)
- investigate on POR bit
- test 2dd more
-
+ - clean-ups/split into devices.
+
TODO (PC-9801RS):
- extra features;
- keyboard shift doesn't seem to disable properly;
@@ -43,7 +44,7 @@
- AD&D Champions of Krynn
- AI Shougi (asserts upon loading, 3'5 image?)
- Aki no Tsukasa no Fushigi no Kabe (works in PC-9801RS only)
- - alice
+ - alice
- Aoki Ookami no Shiroki Mejika - Gengis Khan
- Arcshu
- Arcus 2
@@ -61,54 +62,54 @@
* Bokosuka Wars
- Jangou 2: floppy fails to load after the title screen;
- - runners (size assert)
- - Sorcerian (2dd image)
- - Twilight Zone 3 (2dd image)
+ - runners (size assert)
+ - Sorcerian (2dd image)
+ - Twilight Zone 3 (2dd image)
List of per-game TODO:
- 4dboxing: inputs are unresponsive;
- - 4dboxing: crashes after user disk creation (regression);
- - agumixsl: non-interlace mode doesn't resize graphics, has rectangle selection bugs (note: needs GDC = 5 MHz to boot);
+ - 4dboxing: crashes after user disk creation (regression);
+ - agumixsl: non-interlace mode doesn't resize graphics, has rectangle selection bugs (note: needs GDC = 5 MHz to boot);
- agenesis: fails loading, attempting to read IDE RAM switch port;
- - alice: doesn't set bitmap interlace properly, can't do disk swaps via the File Manager;
- - applecl1: can't pass hands apparently;
- - arctic, fsmoon: Doesn't detect sound board (tied to 0x00ec ports);
+ - alice: doesn't set bitmap interlace properly, can't do disk swaps via the File Manager;
+ - applecl1: can't pass hands apparently;
+ - arctic, fsmoon: Doesn't detect sound board (tied to 0x00ec ports);
- atragon: HDD install disk swap doesn't work?
- - asokokof: black screen with BGM, executes invalid opcode (previous note "waits at 0x225f6");
+ - asokokof: black screen with BGM, executes invalid opcode (previous note "waits at 0x225f6");
- arquelph: beeps out at initial sound check, no voice samples, extra sound board tested;
- - bandkun: can't install to HDD, has unemulated sound boards in settings (Roland MT-32 & D-10/D-110, Kawai MSB-98, Korg M1, MIDI);
- - bishohzx: Soft House logo uses pseudo-ROZ effect (?), no title screen graphics?
- - bishotsu: beeps out before game (missing sound board?), doesn't draw some text?
-
+ - bandkun: can't install to HDD, has unemulated sound boards in settings (Roland MT-32 & D-10/D-110, Kawai MSB-98, Korg M1, MIDI);
+ - bishohzx: Soft House logo uses pseudo-ROZ effect (?), no title screen graphics?
+ - bishotsu: beeps out before game (missing sound board?), doesn't draw some text?
+
- deflektr: no sound, moans about a DIP-SW setting during loading, has timing issues (keyboard being too fast on PC-9801RS);
- - edge: has gfx glitch when intro scrolls to top-left;
- - edge: user disk creation is offset?
+ - edge: has gfx glitch when intro scrolls to top-left;
+ - edge: user disk creation is offset?
- idolsaga: Moans with a "(program) ended. remove the floppy disk and turn off the power."
- - karateka: no sound;
- - lovelyho: Doesn't show kanjis in PC-9801F version (tries to read them thru the 0xa9 port);
+ - karateka: no sound;
+ - lovelyho: Doesn't show kanjis in PC-9801F version (tries to read them thru the 0xa9 port);
- madoum1, madoum2, madoum3: doesn't display bitmap gfxs during gameplay;
- quarth: sound cuts off at title screen, doesn't work on 9801rs (bogus "corrupt .exe" detected);
- prinmak2, tim: cursor stays stuck when using mouse (works with keyboard);
- puyopuyo: beeps out when it's supposed to play samples, Not supposed to use ADPCM, is it a PIT issue?
- runners: wrong double height on the title screen;
- - rusty: black stripes when scrolling;
- - rusty: voice pitches are too slow (tested with -26 and -86);
+ - rusty: black stripes when scrolling;
+ - rusty: voice pitches are too slow (tested with -26 and -86);
- win211: EGC drawing issue (byte wide writes?)
- - win31: doesn't boot at
-
- per-game TODO (Dounjishi SW):
+ - win31: doesn't boot at
+
+ per-game TODO (Dounjishi SW):
- Absolutely Mahjong: Transitions are too fast.
-
+
per-game TODO (PC-9821):
- Battle Skin Panic: gfx bugs at the Gainax logo, it crashes after it;
- Policenauts: CD-ROM drive not found;
Notes:
- - annivers: GRPH (ALT) key cycles through different color schemes (normal, b&w, legacy);
+ - annivers: GRPH (ALT) key cycles through different color schemes (normal, b&w, legacy);
- Animahjong V3 makes advantage of the possibility of installing 2 sound boards, where SFX and BGMs are played on separate chips.
- Apple Club 1/2 needs data disks to load properly;
- Beast Lord: needs a titan.fnt, in MS-DOS
- - fhtag2: product key is 001J0283TA 100001
+ - fhtag2: product key is 001J0283TA 100001
- To deprotect BASIC modules set 0xcd7 in ram to 0
========================================================================================
@@ -542,6 +543,8 @@ public:
struct {
uint8_t pal_entry;
uint8_t r[0x100],g[0x100],b[0x100];
+ uint16_t read_bank;
+ uint16_t write_bank;
}m_analog256;
struct {
uint8_t mode;
@@ -592,6 +595,13 @@ public:
DECLARE_WRITE16_MEMBER(grcg_gvram_w);
DECLARE_READ16_MEMBER(grcg_gvram0_r);
DECLARE_WRITE16_MEMBER(grcg_gvram0_w);
+
+ DECLARE_READ16_MEMBER(pc9821_grcg_gvram_r);
+ DECLARE_WRITE16_MEMBER(pc9821_grcg_gvram_w);
+ DECLARE_READ16_MEMBER(pc9821_grcg_gvram0_r);
+ DECLARE_WRITE16_MEMBER(pc9821_grcg_gvram0_w);
+ uint16_t m_pc9821_256vram_bank;
+
DECLARE_READ16_MEMBER(upd7220_grcg_r);
DECLARE_WRITE16_MEMBER(upd7220_grcg_w);
void egc_blit_w(uint32_t offset, uint16_t data, uint16_t mem_mask);
@@ -742,7 +752,8 @@ public:
#define DISPLAY_REG 7
#define ANALOG_16_MODE 0
-#define ANALOG_256_MODE 0x10
+#define ANALOG_256_MODE (0x20 >> 1)
+#define GDC_IS_5MHz (0x84 >> 1)
void pc9801_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
@@ -2296,7 +2307,7 @@ READ16_MEMBER(pc9801_state::timestamp_r)
/* basically a read-back of various registers */
// bit 1: GDC clock select (port 0x6a, selects with 0x84 & bit 0)
-// bit 0:
+// bit 0: current setting
READ8_MEMBER(pc9801_state::ext2_video_ff_r)
{
uint8_t res;
@@ -2305,14 +2316,46 @@ READ8_MEMBER(pc9801_state::ext2_video_ff_r)
switch(m_ext2_ff)
{
+// case 0x00: ?
+// case 0x01: 200 line color / b&w mode (i/o 0x68 -> 0x02)
+// case 0x02: Odd-numbered raster mask (i/o 0x68 -> 0x08)
case 0x03: res = m_video_ff[DISPLAY_REG]; break; // display reg
+// case 0x04: palette mode (i/o 0x6a -> 0x00)
+// case 0x05: GDC sync mode (i/o 0x6a -> 0x40)
+// case 0x06: unknown (i/o 0x6a -> 0x44)
+// case 0x07: EGC compatibility mode (i/o 0x6a -> 0x04)
+// case 0x08: Protected mode f/f (i/o 0x6a -> 0x06)
+// case 0x09: GDC clock #0 (i/o 0x6a -> 0x82)
case 0x0a: res = m_ex_video_ff[ANALOG_256_MODE]; break; // 256 color mode
+// case 0x0b: VRAM access mode (i/o 0x6a -> 0x62)
+// case 0x0c: unknown
+// case 0x0d: VRAM boundary mode (i/o 0x6a -> 0x68)
+// case 0x0e: 65536 color GFX mode (i/o 0x6a -> 0x22)
+// case 0x0f: 65,536 color palette mode (i/o 0x6a -> 0x24)
+// case 0x10: unknown (i/o 0x6a -> 0x6a)
+// case 0x11: Reverse mode related (i/o 0x6a -> 0x26)
+// case 0x12: 256 color overscan color (i/o 0x6a -> 0x2c)
+// case 0x13: Reverse mode related (i/o 0x6a -> 0x28)
+// case 0x14: AGDC Drawing processor selection (i/o 0x6a -> 0x66)
+// case 0x15: unknown (i/o 0x6a -> 0x60)
+// case 0x16: unknown (i/o 0x6a -> 0xc2)
+// case 0x17: bitmap config direction (i/o 0x6a -> 0x6c)
+// case 0x18: High speed palette write (i/o 0x6a -> 0x2a)
+// case 0x19: unknown (i/o 0x6a -> 0x48)
+// case 0x1a: unknown (i/o 0x6a -> 0xc8)
+// case 0x1b: unknown (i/o 0x6a -> 0x2e)
+// case 0x1c: unknown (i/o 0x6a -> 0x6e)
+// case 0x1d: unknown (i/o 0x6a -> 0xc0)
+// case 0x1e: unknown (i/o 0x6a -> 0x80 or 0x46?)
+// case 0x1f: unknown (i/o 0x6a -> 0x08)
default:
if(m_ext2_ff < 0x20)
popmessage("PC-9821: read ext2 f/f with value %02x",m_ext2_ff);
break;
}
+ res|= (m_ex_video_ff[GDC_IS_5MHz] << 1);
+
return res;
}
@@ -2333,15 +2376,70 @@ WRITE8_MEMBER(pc9801_state::winram_w)
offset = (offset & 0x1ffff) | (m_pc9821_window_bank & 0xfe) * 0x10000;
}*/
+// TODO: analog 256 mode needs HW tests
+READ16_MEMBER(pc9801_state::pc9821_grcg_gvram_r)
+{
+ if(m_ex_video_ff[ANALOG_256_MODE])
+ {
+ return space.read_word(0xf00000|(offset*2)|((m_analog256.write_bank)*0x8000),mem_mask);
+ }
+
+ return grcg_gvram_r(space,offset,mem_mask);
+}
+
+WRITE16_MEMBER(pc9801_state::pc9821_grcg_gvram_w)
+{
+ if(m_ex_video_ff[ANALOG_256_MODE])
+ {
+ space.write_word(0xf00000|(offset*2)|(m_analog256.write_bank*0x8000),data,mem_mask);
+ return;
+ }
+
+ grcg_gvram_w(space,offset,data,mem_mask);
+}
+
+READ16_MEMBER(pc9801_state::pc9821_grcg_gvram0_r)
+{
+ if(m_ex_video_ff[ANALOG_256_MODE])
+ {
+ switch(offset*2)
+ {
+ case 4: return m_analog256.write_bank;
+// case 6: return m_analog256.read_bank;
+ }
+
+ //return 0;
+ }
+
+ return grcg_gvram0_r(space,offset,mem_mask);
+}
+
+WRITE16_MEMBER(pc9801_state::pc9821_grcg_gvram0_w)
+{
+ if(m_ex_video_ff[ANALOG_256_MODE])
+ {
+ //printf("%08x %08x\n",offset*2,data);
+ switch(offset*2)
+ {
+ case 4: COMBINE_DATA(&m_analog256.write_bank); break;
+// case 6: COMBINE_DATA(&m_analog256.read_bank); break;
+ }
+ //return;
+ }
+
+ grcg_gvram0_w(space,offset,data,mem_mask);
+}
+
+
static ADDRESS_MAP_START( pc9821_map, AS_PROGRAM, 32, pc9801_state )
//AM_RANGE(0x00080000, 0x0009ffff) AM_READWRITE8(winram_r, winram_w, 0xffffffff)
AM_RANGE(0x000a0000, 0x000a3fff) AM_READWRITE16(tvram_r, tvram_w, 0xffffffff)
AM_RANGE(0x000a4000, 0x000a4fff) AM_READWRITE8(pc9801rs_knjram_r, pc9801rs_knjram_w, 0xffffffff)
- AM_RANGE(0x000a8000, 0x000bffff) AM_READWRITE16(grcg_gvram_r, grcg_gvram_w, 0xffffffff)
+ AM_RANGE(0x000a8000, 0x000bffff) AM_READWRITE16(pc9821_grcg_gvram_r, pc9821_grcg_gvram_w, 0xffffffff)
AM_RANGE(0x000cc000, 0x000cdfff) AM_ROM AM_REGION("sound_bios",0) //sound BIOS
// AM_RANGE(0x000d8000, 0x000d9fff) AM_ROM AM_REGION("ide",0)
AM_RANGE(0x000da000, 0x000dbfff) AM_RAM // ide ram
- AM_RANGE(0x000e0000, 0x000e7fff) AM_READWRITE16(grcg_gvram0_r,grcg_gvram0_w, 0xffffffff)
+ AM_RANGE(0x000e0000, 0x000e7fff) AM_READWRITE16(pc9821_grcg_gvram0_r,pc9821_grcg_gvram0_w, 0xffffffff)
AM_RANGE(0x000e8000, 0x000fffff) AM_DEVICE16("ipl_bank", address_map_bank_device, amap16, 0xffffffff)
AM_RANGE(0x00f00000, 0x00f9ffff) AM_RAM AM_SHARE("ext_gvram")
AM_RANGE(0xffee8000, 0xffefffff) AM_DEVICE16("ipl_bank", address_map_bank_device, amap16, 0xffffffff)
diff --git a/src/mame/drivers/pcfx.cpp b/src/mame/drivers/pcfx.cpp
index 11a5e93e6e6..e04a460d90b 100644
--- a/src/mame/drivers/pcfx.cpp
+++ b/src/mame/drivers/pcfx.cpp
@@ -13,6 +13,7 @@
#include "cpu/v810/v810.h"
#include "video/huc6261.h"
#include "video/huc6270.h"
+#include "video/huc6271.h"
#include "video/huc6272.h"
struct pcfx_pad_t
@@ -93,7 +94,7 @@ static ADDRESS_MAP_START( pcfx_mem, AS_PROGRAM, 32, pcfx_state )
AM_RANGE( 0xE0000000, 0xE7FFFFFF ) AM_NOP /* BackUp RAM */
AM_RANGE( 0xE8000000, 0xE9FFFFFF ) AM_NOP /* Extended BackUp RAM */
AM_RANGE( 0xF8000000, 0xF8000007 ) AM_NOP /* PIO */
- AM_RANGE( 0xFFF00000, 0xFFFFFFFF ) AM_ROMBANK("bank1") /* ROM */
+ AM_RANGE( 0xFFF00000, 0xFFFFFFFF ) AM_ROM AM_REGION("ipl", 0) /* ROM */
ADDRESS_MAP_END
READ16_MEMBER( pcfx_state::pad_r )
@@ -164,7 +165,7 @@ WRITE16_MEMBER( pcfx_state::pad_w )
*/
if(data & 1 && (!(m_pad.ctrl[port_type] & 1)))
{
- timer_set(attotime::from_msec(1), TIMER_PAD_FUNC, port_type); // TODO: time
+ timer_set(attotime::from_usec(1000), TIMER_PAD_FUNC, port_type); // TODO: time
}
m_pad.ctrl[port_type] = data & 7;
@@ -181,7 +182,7 @@ WRITE16_MEMBER( pcfx_state::pad_w )
static ADDRESS_MAP_START( pcfx_io, AS_IO, 32, pcfx_state )
AM_RANGE( 0x00000000, 0x000000FF ) AM_READWRITE16(pad_r, pad_w, 0xffffffff) /* PAD */
AM_RANGE( 0x00000100, 0x000001FF ) AM_NOP /* HuC6230 */
- AM_RANGE( 0x00000200, 0x000002FF ) AM_NOP /* HuC6271 */
+ AM_RANGE( 0x00000200, 0x000002FF ) AM_DEVICE16( "huc6271", huc6271_device, regs, 0xffff ) /* HuC6271 */
AM_RANGE( 0x00000300, 0x000003FF ) AM_DEVREADWRITE16( "huc6261", huc6261_device, read, write, 0xffff ) /* HuC6261 */
AM_RANGE( 0x00000400, 0x000004FF ) AM_DEVREADWRITE8( "huc6270_a", huc6270_device, read, write, 0xffff ) /* HuC6270-A */
AM_RANGE( 0x00000500, 0x000005FF ) AM_DEVREADWRITE8( "huc6270_b", huc6270_device, read, write, 0xffff ) /* HuC6270-B */
@@ -197,95 +198,28 @@ ADDRESS_MAP_END
static INPUT_PORTS_START( pcfx )
/*
- xxxx ---- ---- ---- ID (0xf = 6 button pad, 0xe = tap, 0xd = ?)
+ xxxx ---- ---- ---- ID (0xf = 6 button pad, 0xe = multitap, 0xd = mouse, 0 = none)
*/
PORT_START("P1")
- PORT_BIT( 0xf0000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // ID
- PORT_DIPNAME( 0x01000000, 0x01000000, "1" )
- PORT_DIPSETTING( 0x01000000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00000000, DEF_STR( On ) )
- PORT_DIPNAME( 0x02000000, 0x02000000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x02000000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00000000, DEF_STR( On ) )
- PORT_DIPNAME( 0x04000000, 0x04000000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x04000000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00000000, DEF_STR( On ) )
- PORT_DIPNAME( 0x08000000, 0x08000000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x08000000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00000000, DEF_STR( On ) )
- PORT_DIPNAME( 0x010000, 0x010000, "2" )
- PORT_DIPSETTING( 0x010000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x000000, DEF_STR( On ) )
- PORT_DIPNAME( 0x020000, 0x020000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x020000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x000000, DEF_STR( On ) )
- PORT_DIPNAME( 0x040000, 0x040000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x040000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x000000, DEF_STR( On ) )
- PORT_DIPNAME( 0x080000, 0x080000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x080000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x000000, DEF_STR( On ) )
- PORT_DIPNAME( 0x100000, 0x100000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x100000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x000000, DEF_STR( On ) )
- PORT_DIPNAME( 0x200000, 0x200000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x200000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x000000, DEF_STR( On ) )
- PORT_DIPNAME( 0x400000, 0x400000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x400000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x000000, DEF_STR( On ) )
- PORT_DIPNAME( 0x800000, 0x800000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x800000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x000000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0100, 0x0100, "3" )
- PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) ) // *
- PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) // *
- PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_BIT( 0x00000080, IP_ACTIVE_LOW, IPT_START1 ) PORT_PLAYER(1) PORT_NAME("RUN button")
- PORT_DIPNAME( 0x01, 0x01, "4" )
- PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_BIT( 0xf0000000, IP_ACTIVE_LOW, IPT_UNKNOWN ) // ID pad
+ PORT_BIT( 0x00000001, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME("P1 Button I")
+ PORT_BIT( 0x00000002, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) PORT_NAME("P1 Button II")
+ PORT_BIT( 0x00000004, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1) PORT_NAME("P1 Button III")
+ PORT_BIT( 0x00000008, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1) PORT_NAME("P1 Button IV")
+ PORT_BIT( 0x00000010, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(1) PORT_NAME("P1 Button V")
+ PORT_BIT( 0x00000020, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(1) PORT_NAME("P1 Button VI")
+ PORT_BIT( 0x00000040, IP_ACTIVE_LOW, IPT_SELECT ) PORT_PLAYER(1) PORT_NAME("P1 Select Button")
+ PORT_BIT( 0x00000080, IP_ACTIVE_LOW, IPT_START1 ) PORT_PLAYER(1) PORT_NAME("P1 RUN Button")
+ PORT_BIT( 0x00000100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_NAME("P1 Up")
+ PORT_BIT( 0x00000200, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_NAME("P1 Right")
+ PORT_BIT( 0x00000400, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_NAME("P1 Down")
+ PORT_BIT( 0x00000800, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_NAME("P1 Left")
+ PORT_BIT( 0x00001000, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_PLAYER(1) PORT_NAME("P1 Switch 1")
+ PORT_BIT( 0x00004000, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_PLAYER(1) PORT_NAME("P1 Switch 2")
+ PORT_BIT( 0x0fffa000, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("P2")
- PORT_BIT( 0xf0000000, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0xf0000000, IP_ACTIVE_HIGH, IPT_UNKNOWN ) // ID unconnect
PORT_BIT( 0x0fffffff, IP_ACTIVE_LOW, IPT_UNKNOWN )
INPUT_PORTS_END
@@ -461,8 +395,6 @@ WRITE_LINE_MEMBER( pcfx_state::irq15_w )
void pcfx_state::machine_reset()
{
- membank( "bank1" )->set_base( memregion("user1")->base() );
-
m_irq_mask = 0xFF;
m_irq_pending = 0;
}
@@ -495,13 +427,18 @@ static MACHINE_CONFIG_START( pcfx, pcfx_state )
MCFG_DEVICE_ADD("huc6261", HUC6261, XTAL_21_4772MHz)
MCFG_HUC6261_VDC1("huc6270_a")
MCFG_HUC6261_VDC2("huc6270_b")
+ MCFG_HUC6261_KING("huc6272")
MCFG_HUC6272_ADD( "huc6272", XTAL_21_4772MHz )
+ MCFG_HUC6272_IRQ_CHANGED_CB(WRITELINE(pcfx_state, irq13_w))
+ MCFG_HUC6272_RAINBOW("huc6271")
+
+ MCFG_HUC6271_ADD( "huc6271", XTAL_21_4772MHz )
MACHINE_CONFIG_END
ROM_START( pcfx )
- ROM_REGION( 0x100000, "user1", 0 )
+ ROM_REGION( 0x100000, "ipl", 0 )
ROM_SYSTEM_BIOS( 0, "v100", "BIOS v1.00 - 2 Sep 1994" )
ROMX_LOAD( "pcfxbios.bin", 0x000000, 0x100000, CRC(76ffb97a) SHA1(1a77fd83e337f906aecab27a1604db064cf10074), ROM_BIOS(1) )
ROM_SYSTEM_BIOS( 1, "v101", "BIOS v1.01 - 5 Dec 1994" )
@@ -513,7 +450,7 @@ ROM_END
ROM_START( pcfxga )
- ROM_REGION( 0x100000, "user1", 0 )
+ ROM_REGION( 0x100000, "ipl", 0 )
ROM_LOAD( "pcfxga.rom", 0x000000, 0x100000, CRC(41c3776b) SHA1(a9372202a5db302064c994fcda9b24d29bb1b41c) )
ROM_REGION( 0x80000, "scsi_rom", ROMREGION_ERASEFF )
diff --git a/src/mame/drivers/peyper.cpp b/src/mame/drivers/peyper.cpp
index 79795c2c192..91f5fb46bf8 100644
--- a/src/mame/drivers/peyper.cpp
+++ b/src/mame/drivers/peyper.cpp
@@ -15,7 +15,7 @@
Nemesis (Peyper)
Odisea Paris-Dakar (Peyper)
Hang-On (Sonic)
- Ator (Videodens)
+ Ator (Video Dens)
Others not emulated (need roms):
Night Fever (Sonic)
@@ -834,7 +834,7 @@ ROM_START(wolfman)
ROM_END
/*-------------------------------------------------------------------
-/ Ator (198?)
+/ Ator (1985)
/-------------------------------------------------------------------*/
ROM_START(ator)
ROM_REGION(0x6000, "maincpu", 0)
@@ -869,5 +869,5 @@ GAME( 1987, wolfman, 0, peyper, wolfman, peyper_state, wolfman, ROT0
GAME( 1986, nemesisp, 0, peyper, wolfman, peyper_state, wolfman, ROT0, "Peyper", "Nemesis", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
GAME( 1987, odisea, 0, peyper, odisea, peyper_state, wolfman, ROT0, "Peyper", "Odisea Paris-Dakar", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
GAME( 1988, hangonp, 0, peyper, sonstwar, peyper_state, peyper, ROT0, "Sonic", "Hang-On (Sonic)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING ) // inputs to be checked
-GAME( 198?, ator, 0, peyper, sonstwar, peyper_state, peyper, ROT0, "Videodens", "Ator", MACHINE_MECHANICAL | MACHINE_NOT_WORKING ) // initial program ROM missing; no manual found
+GAME( 1985, ator, 0, peyper, sonstwar, peyper_state, peyper, ROT0, "Video Dens", "Ator", MACHINE_MECHANICAL | MACHINE_NOT_WORKING ) // initial program ROM missing; no manual found
GAME( 1994, lancelot, 0, peyper, sonstwar, driver_device,0, ROT0, "Peyper", "Sir Lancelot", MACHINE_IS_SKELETON_MECHANICAL) // different hardware (see top of file)
diff --git a/src/mame/drivers/pipeline.cpp b/src/mame/drivers/pipeline.cpp
index 76869986421..b7298c672b2 100644
--- a/src/mame/drivers/pipeline.cpp
+++ b/src/mame/drivers/pipeline.cpp
@@ -110,20 +110,20 @@ public:
TIMER_CALLBACK_MEMBER(protection_deferred_w);
protected:
- required_device<cpu_device> m_maincpu;
- required_device<m68705r_device> m_mcu;
- required_device<gfxdecode_device> m_gfxdecode;
- required_device<palette_device> m_palette;
+ required_device<cpu_device> m_maincpu;
+ required_device<m68705r_device> m_mcu;
+ required_device<gfxdecode_device> m_gfxdecode;
+ required_device<palette_device> m_palette;
- required_shared_ptr<u8> m_vram1;
- required_shared_ptr<u8> m_vram2;
+ required_shared_ptr<u8> m_vram1;
+ required_shared_ptr<u8> m_vram2;
tilemap_t *m_tilemap1;
tilemap_t *m_tilemap2;
- u8 m_vidctrl;
- std::unique_ptr<u8[]> m_palram;
- u8 m_fromMCU;
+ u8 m_vidctrl;
+ std::unique_ptr<u8[]> m_palram;
+ u8 m_fromMCU;
};
diff --git a/src/mame/drivers/pitnrun.cpp b/src/mame/drivers/pitnrun.cpp
index 0147a3716a2..80d20ddf5b9 100644
--- a/src/mame/drivers/pitnrun.cpp
+++ b/src/mame/drivers/pitnrun.cpp
@@ -66,22 +66,25 @@ K1000233A
*/
#include "emu.h"
-#include "cpu/z80/z80.h"
+#include "includes/pitnrun.h"
+
#include "cpu/m6805/m68705.h"
+#include "cpu/z80/z80.h"
+
#include "machine/gen_latch.h"
#include "machine/watchdog.h"
+
#include "sound/ay8910.h"
-#include "includes/pitnrun.h"
INTERRUPT_GEN_MEMBER(pitnrun_state::nmi_source)
{
- if(m_nmi) device.execute().set_input_line(INPUT_LINE_NMI, PULSE_LINE);
+ if (m_nmi) device.execute().set_input_line(INPUT_LINE_NMI, PULSE_LINE);
}
WRITE8_MEMBER(pitnrun_state::nmi_enable_w)
{
- m_nmi = data & 1;
+ m_nmi = data & 1;
}
WRITE8_MEMBER(pitnrun_state::hflip_w)
@@ -136,15 +139,6 @@ static ADDRESS_MAP_START( pitnrun_sound_io_map, AS_IO, 8, pitnrun_state )
AM_RANGE(0x98, 0x98) AM_WRITENOP
ADDRESS_MAP_END
-static ADDRESS_MAP_START( pitnrun_mcu_map, AS_PROGRAM, 8, pitnrun_state )
- ADDRESS_MAP_GLOBAL_MASK(0x7ff)
- AM_RANGE(0x0000, 0x0000) AM_READWRITE(m68705_portA_r,m68705_portA_w)
- AM_RANGE(0x0001, 0x0001) AM_READWRITE(m68705_portB_r,m68705_portB_w)
- AM_RANGE(0x0002, 0x0002) AM_READ(m68705_portC_r)
- AM_RANGE(0x0003, 0x007f) AM_RAM
- AM_RANGE(0x0080, 0x07ff) AM_ROM
-ADDRESS_MAP_END
-
static INPUT_PORTS_START( pitnrun )
PORT_START("SYSTEM")
@@ -231,8 +225,12 @@ static MACHINE_CONFIG_START( pitnrun, pitnrun_state )
MCFG_CPU_IO_MAP(pitnrun_sound_io_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", pitnrun_state, irq0_line_hold)
- MCFG_CPU_ADD("mcu", M68705,XTAL_18_432MHz/6) /* verified on pcb */
- MCFG_CPU_PROGRAM_MAP(pitnrun_mcu_map)
+ MCFG_CPU_ADD("mcu", M68705P5, XTAL_18_432MHz/6) /* verified on pcb */
+ MCFG_M68705_PORTA_R_CB(READ8(pitnrun_state, m68705_portA_r))
+ MCFG_M68705_PORTB_R_CB(READ8(pitnrun_state, m68705_portB_r))
+ MCFG_M68705_PORTC_R_CB(READ8(pitnrun_state, m68705_portC_r))
+ MCFG_M68705_PORTA_W_CB(WRITE8(pitnrun_state, m68705_portA_w))
+ MCFG_M68705_PORTB_W_CB(WRITE8(pitnrun_state, m68705_portB_w))
MCFG_WATCHDOG_ADD("watchdog")
diff --git a/src/mame/drivers/polepos.cpp b/src/mame/drivers/polepos.cpp
index b6952cf028d..e038e2db0df 100644
--- a/src/mame/drivers/polepos.cpp
+++ b/src/mame/drivers/polepos.cpp
@@ -343,9 +343,6 @@ WRITE16_MEMBER(polepos_state::polepos_z8002_nvi_enable_w)
space.device().execute().set_input_line(0, CLEAR_LINE);
}
-
-CUSTOM_INPUT_MEMBER(polepos_state::high_port_r){ return ioport((const char *)param)->read() >> 4; }
-CUSTOM_INPUT_MEMBER(polepos_state::low_port_r){ return ioport((const char *)param)->read() & 0x0f; }
CUSTOM_INPUT_MEMBER(polepos_state::auto_start_r)
{
return m_auto_start_mask;
@@ -491,17 +488,15 @@ ADDRESS_MAP_END
*********************************************************************/
static INPUT_PORTS_START( polepos )
- PORT_START("IN0L")
+ PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_NAME("Gear Change") PORT_CODE(KEYCODE_SPACE) POLEPOS_TOGGLE /* Gear */
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, polepos_state,auto_start_r, nullptr) // start 1, program controlled
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
-
- PORT_START("IN0H")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 )
- PORT_SERVICE( 0x08, IP_ACTIVE_LOW )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_SERVICE( 0x80, IP_ACTIVE_LOW )
PORT_START("DSWA")
PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2,3")
@@ -527,9 +522,6 @@ static INPUT_PORTS_START( polepos )
PORT_DIPSETTING( 0x80, "3" ) /* Manufacturer's recommended settings for Upright cabinet */
PORT_DIPSETTING( 0x00, "4" ) /* Manufacturer's recommended settings for Sit-Down cabinet */
- PORT_START("DSWA_HI")
- PORT_BIT( 0x0f, 0x00, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, polepos_state,high_port_r, "DSWA")
-
PORT_START("DSWB")
PORT_DIPNAME( 0x07, 0x03, "Extended Rank" ) PORT_DIPLOCATION("SW2:1,2,3")
PORT_DIPSETTING( 0x07, "A" )
@@ -556,9 +548,6 @@ static INPUT_PORTS_START( polepos )
PORT_DIPSETTING( 0x80, DEF_STR( Off ))
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_START("DSWB_HI")
- PORT_BIT( 0x0f, 0x00, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, polepos_state,high_port_r, "DSWB")
-
PORT_START("BRAKE")
PORT_BIT( 0xff, 0x00, IPT_PEDAL2 ) PORT_MINMAX(0,0x90) PORT_SENSITIVITY(100) PORT_KEYDELTA(16)
@@ -635,12 +624,6 @@ static INPUT_PORTS_START( topracern )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_SERVICE( 0x80, IP_ACTIVE_LOW )
- PORT_START("IN0L")
- PORT_BIT( 0x0f, 0x00, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, polepos_state,low_port_r, "IN0")
-
- PORT_START("IN0H")
- PORT_BIT( 0x0f, 0x00, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, polepos_state,high_port_r, "IN0")
-
PORT_START("DSWA")
PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_A ) )
PORT_DIPSETTING( 0x05, DEF_STR( 3C_1C ) )
@@ -665,9 +648,6 @@ static INPUT_PORTS_START( topracern )
PORT_DIPSETTING( 0x80, "3" )
PORT_DIPSETTING( 0x00, "4" )
- PORT_START("DSWA_HI")
- PORT_BIT( 0x0f, 0x00, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, polepos_state,high_port_r, "DSWA")
-
/* FIXME: these dips don't work and may not even exist on this bootleg */
PORT_START("DSWB")
PORT_DIPNAME( 0x07, 0x07, "Extended Rank" )
@@ -695,9 +675,6 @@ static INPUT_PORTS_START( topracern )
PORT_DIPSETTING( 0x80, DEF_STR( Off ))
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_START("DSWB_HI")
- PORT_BIT( 0x0f, 0x00, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, polepos_state,high_port_r, "DSWB")
-
PORT_START("BRAKE")
PORT_BIT( 0xff, 0x00, IPT_PEDAL2 ) PORT_MINMAX(0,0x90) PORT_SENSITIVITY(100) PORT_KEYDELTA(16)
@@ -772,6 +749,59 @@ static INPUT_PORTS_START( polepos2j )
INPUT_PORTS_END
+static INPUT_PORTS_START( polepos2bi )
+ PORT_INCLUDE( topracern )
+
+ PORT_MODIFY("DSWA")
+ PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SWA:1,3,5")
+ PORT_DIPSETTING( 0x05, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x07, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( 2C_3C ) )
+ PORT_DIPSETTING( 0x06, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 1C_6C ) )
+ PORT_DIPNAME( 0x18, 0x18, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SWA:7,2")
+ PORT_DIPSETTING( 0x10, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x18, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 2C_3C ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( 1C_2C ) )
+ PORT_DIPNAME( 0x20, 0x00, "Speed Unit" ) PORT_DIPLOCATION("SWA:4")
+ PORT_DIPSETTING( 0x20, "mph" )
+ PORT_DIPSETTING( 0x00, "km/h" )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SWA:6")
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ))
+ PORT_DIPSETTING( 0x40, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, "Speed" ) PORT_DIPLOCATION("SWA:8")
+ PORT_DIPSETTING( 0x80, "Average" )
+ PORT_DIPSETTING( 0x00, DEF_STR( High ) )
+
+ PORT_MODIFY("DSWB")
+ PORT_DIPNAME( 0x03, 0x01, "Extended Rank" ) PORT_DIPLOCATION("SWB:1,3")
+ PORT_DIPSETTING( 0x00, "A" )
+ PORT_DIPSETTING( 0x01, "B" )
+ PORT_DIPSETTING( 0x02, "C" )
+ PORT_DIPSETTING( 0x03, "D" )
+ PORT_DIPNAME( 0x0c, 0x04, "Practice Rank" ) PORT_DIPLOCATION("SWB:5,7")
+ PORT_DIPSETTING( 0x00, "A" )
+ PORT_DIPSETTING( 0x04, "B" )
+ PORT_DIPSETTING( 0x08, "C" )
+ PORT_DIPSETTING( 0x0c, "D" )
+ PORT_DIPNAME( 0x30, 0x10, "Goal" ) PORT_DIPLOCATION("SWB:2,4")
+ PORT_DIPSETTING( 0x00, "3" )
+ PORT_DIPSETTING( 0x10, "4" )
+ PORT_DIPSETTING( 0x20, "5" )
+ PORT_DIPSETTING( 0x30, "6" )
+ PORT_DIPNAME( 0x40, 0x00, DEF_STR( Game_Time ) ) PORT_DIPLOCATION("SWB:6")
+ PORT_DIPSETTING( 0x00, "90 secs." )
+ PORT_DIPSETTING( 0x40, "120 secs." )
+ PORT_DIPNAME( 0x80, 0x00, "Always On" ) PORT_DIPLOCATION("SWB:8")
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ))
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+INPUT_PORTS_END
+
+
/*********************************************************************
* Graphics layouts
@@ -845,10 +875,10 @@ static MACHINE_CONFIG_START( polepos, polepos_state )
MCFG_CPU_PROGRAM_MAP(z8002_map)
MCFG_NAMCO_51XX_ADD("51xx", MASTER_CLOCK/8/2) /* 1.536 MHz */
- MCFG_NAMCO_51XX_INPUT_0_CB(IOPORT("IN0L"))
- MCFG_NAMCO_51XX_INPUT_1_CB(IOPORT("IN0H"))
- MCFG_NAMCO_51XX_INPUT_2_CB(IOPORT("DSWB"))
- MCFG_NAMCO_51XX_INPUT_3_CB(IOPORT("DSWB_HI"))
+ MCFG_NAMCO_51XX_INPUT_0_CB(IOPORT("IN0")) MCFG_DEVCB_MASK(0x0f)
+ MCFG_NAMCO_51XX_INPUT_1_CB(IOPORT("IN0")) MCFG_DEVCB_RSHIFT(4)
+ MCFG_NAMCO_51XX_INPUT_2_CB(IOPORT("DSWB")) MCFG_DEVCB_MASK(0x0f)
+ MCFG_NAMCO_51XX_INPUT_3_CB(IOPORT("DSWB")) MCFG_DEVCB_RSHIFT(4)
MCFG_NAMCO_51XX_OUTPUT_0_CB(WRITE8(polepos_state,out_0))
MCFG_NAMCO_51XX_OUTPUT_1_CB(WRITE8(polepos_state,out_1))
@@ -862,8 +892,8 @@ static MACHINE_CONFIG_START( polepos, polepos_state )
MCFG_NAMCO_53XX_K_CB(READ8(polepos_state,namco_53xx_k_r))
MCFG_NAMCO_53XX_INPUT_0_CB(READ8(polepos_state,steering_changed_r))
MCFG_NAMCO_53XX_INPUT_1_CB(READ8(polepos_state,steering_delta_r))
- MCFG_NAMCO_53XX_INPUT_2_CB(IOPORT("DSWA"))
- MCFG_NAMCO_53XX_INPUT_3_CB(IOPORT("DSWA_HI"))
+ MCFG_NAMCO_53XX_INPUT_2_CB(IOPORT("DSWA")) MCFG_DEVCB_MASK(0x0f)
+ MCFG_NAMCO_53XX_INPUT_3_CB(IOPORT("DSWA")) MCFG_DEVCB_RSHIFT(4)
MCFG_NAMCO_54XX_ADD("54xx", MASTER_CLOCK/8/2) /* 1.536 MHz */
MCFG_NAMCO_54XX_DISCRETE("discrete")
@@ -942,8 +972,8 @@ static ADDRESS_MAP_START( topracern_io, AS_IO, 8, polepos_state )
// extra direct mapped inputs read
AM_RANGE(0x02, 0x02) AM_READ_PORT("STEER") AM_WRITENOP
AM_RANGE(0x03, 0x03) AM_READ_PORT("IN0") AM_DEVWRITE("dac", dac_byte_interface, write)
- AM_RANGE(0x04, 0x04) AM_READ_PORT("DSWA") AM_WRITENOP
- AM_RANGE(0x05, 0x05) AM_READ_PORT("DSWB") /* ??? */ AM_WRITE(bootleg_soundlatch_w)
+ AM_RANGE(0x04, 0x04) AM_READ_PORT("DSWA") AM_WRITENOP // explosion sound trigger
+ AM_RANGE(0x05, 0x05) AM_READ_PORT("DSWB") AM_WRITE(bootleg_soundlatch_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( sound_z80_bootleg_map, AS_PROGRAM, 8, polepos_state )
@@ -975,7 +1005,7 @@ static MACHINE_CONFIG_START( topracern, polepos_state )
/* doesn't exist on the bootleg, but required for now or the game only boots in test mode!
they probably simulate some of the logic */
MCFG_NAMCO_51XX_ADD("51xx", MASTER_CLOCK/8/2) /* 1.536 MHz */
- MCFG_NAMCO_51XX_INPUT_1_CB(IOPORT("IN0H"))
+ MCFG_NAMCO_51XX_INPUT_1_CB(IOPORT("IN0")) MCFG_DEVCB_RSHIFT(4)
MCFG_NAMCO_06XX_ADD("06xx", MASTER_CLOCK/8/64)
MCFG_NAMCO_06XX_MAINCPU("maincpu")
@@ -2208,6 +2238,39 @@ ROM_END
| 4 | | OFF | | ON | |
| 3 | | ON | | ON | |
'-------------------------------+-----+-----+-----+-----+-----------------------'
+
+
+ Pinouts / Edge Connectors....
+
+
+ 'A' board connector. 'B' board connector. 'C' board connector.
+ ---------------+--+------------------ ---------------+--+------------------ ---------------+--+------------------
+ Solder Side |PN| Components Side Solder Side |PN| Components Side Solder Side |PN| Components Side
+ ---------------+--+------------------ ---------------+--+------------------ ---------------+--+------------------
+ |01| GND GND |01| GND +5V |01| +5V
+ GEARS SWITCH |02| GND |02| +5V |02| +5V
+ 50 PTS COIN-IN |03| GND |03| |03|
+ |04| GND +5V |04| +5V |04|
+ 25 PTS COIN-IN |05| GND |05| COMMON ACCEL + BREAK (HI) |05|
+ +5V |06| +5V BRAKE POT |06| ACCEL POT |06|
+ +5V |07| +5V |07| COMMON ACCEL + BREAK (LO) |07| GND
+ +5V |08| +5V |08| GND |08| VIDEO GND
+ |09| AUDIO SIGNAL 4(***) |09| AUDIO SIGNAL 1(***) VIDEO SYNC |09| VIDEO BLUE
+ |10| AUDIO SIGNAL 3(***) |10| AUDIO SIGNAL 2(***) VIDEO GREEN |10| VIDEO RED
+ +12V |11| GND |11| GND |11|
+ WHEEL X SIGNAL |12| |12| |12|
+ WHEEL Z SIGNAL |13| |13| |13|
+ -5V |14| |14| |14|
+ AUDIO SIGNAL 1(*) |15| AMP AUDIO SIGNAL (**) |15| GND |15| GND
+ AUDIO SIGNAL 2(*) |16| AMP AUDIO SIGNAL (**) |16| GND |16| GND
+ AUDIO SIGNAL 3(*) |17| |17| GND |17| GND
+ AUDIO SIGNAL 4(*) |18| |18| GND |18| GND
+
+
+ (*) To 'B' connector.
+ (**) To 'D' connector.
+ (***) To 'A' connector.
+
*/
ROM_START( polepos2bs )
/* Z80 memory/ROM data */
@@ -2288,7 +2351,7 @@ ROM_START( polepos2bs )
ROM_REGION( 0x2000, "soundz80bl", 0 )
ROM_LOAD( "aboard-spi.11", 0x0000, 0x2000, CRC(47226cda) SHA1(03115ead04b11e7ef3ef08d32d4d61a56dc35190) ) /* redumped. the former one has bit6 stuck */
-// ROM_REGION( 0x2000, "pals", 0 )
+// ROM_REGION( 0x2000, "pals", 0 )
// ...not dumped yet...
ROM_END
@@ -2317,10 +2380,10 @@ GAME( 1982, poleposa2, polepos, polepos, poleposa, driver_device, 0,
GAME( 1984, topracer, polepos, polepos, polepos, driver_device, 0, ROT0, "bootleg", "Top Racer (with MB8841 + MB8842, 1984)", 0 ) // the NAMCO customs have been cloned on these bootlegs
GAME( 1983, topracera, polepos, polepos, polepos, driver_device, 0, ROT0, "bootleg", "Top Racer (with MB8841 + MB8842, 1983)", 0 ) // the only difference between them is the year displayed on the title screen
GAME( 1983, ppspeed, polepos, polepos, polepos, driver_device, 0, ROT0, "bootleg", "Speed Up (Spanish bootleg of Pole Position)", 0 ) // very close to topracer / topracera
-GAME( 1982, topracern, polepos, topracern, topracern, driver_device, 0, ROT0, "bootleg", "Top Racer (no MB8841 + MB8842)", MACHINE_IMPERFECT_SOUND ) // is there any explosion sound generator here?
+GAME( 1982, topracern, polepos, topracern, topracern, driver_device, 0, ROT0, "bootleg", "Top Racer (no MB8841 + MB8842)", MACHINE_IMPERFECT_SOUND ) // explosion sound generator missing
GAME( 1983, polepos2, 0, polepos, polepos2j, polepos_state, polepos2, ROT0, "Namco", "Pole Position II (Japan)", 0 )
GAME( 1983, polepos2a, polepos2, polepos, polepos2, polepos_state, polepos2, ROT0, "Namco (Atari license)", "Pole Position II (Atari)", 0 )
GAME( 1983, polepos2b, polepos2, polepos, polepos2, driver_device, 0, ROT0, "bootleg", "Pole Position II (bootleg)", 0 )
-GAME( 1984, polepos2bi, polepos2, polepos2bi, topracern, driver_device, 0, ROT0, "bootleg", "Gran Premio F1 (Italian bootleg of Pole Position II)", MACHINE_IMPERFECT_COLORS | MACHINE_IMPERFECT_SOUND )
-GAME( 1984, polepos2bs, polepos2, polepos2bi, topracern, driver_device, 0, ROT0, "BCN Internacional S.A.)", "Gran Premio F1 (Spanish bootleg of Pole Position II)", MACHINE_IMPERFECT_COLORS | MACHINE_IMPERFECT_SOUND )
+GAME( 1984, polepos2bi, polepos2, polepos2bi, polepos2bi,driver_device, 0, ROT0, "bootleg", "Gran Premio F1 (Italian bootleg of Pole Position II)", MACHINE_IMPERFECT_COLORS | MACHINE_IMPERFECT_SOUND )
+GAME( 1984, polepos2bs, polepos2, polepos2bi, polepos2bi,driver_device, 0, ROT0, "bootleg (BCN Internacional S.A.)", "Gran Premio F1 (Spanish bootleg of Pole Position II)", MACHINE_IMPERFECT_COLORS | MACHINE_IMPERFECT_SOUND )
diff --git a/src/mame/drivers/polyplay.cpp b/src/mame/drivers/polyplay.cpp
index 90d5c11b305..21b9b290775 100644
--- a/src/mame/drivers/polyplay.cpp
+++ b/src/mame/drivers/polyplay.cpp
@@ -23,10 +23,10 @@ TODO:
- get other rom versions and games
- document the light-organ related stuff
-
-NOTES:
- The hardware is based on the K1520 PC system, with video output coming through a standard Colormat TV.
-
+
+NOTES:
+ The hardware is based on the K1520 PC system, with video output coming through a standard Colormat TV.
+
There are at least two revisions:
- Revision 1 -
@@ -35,14 +35,14 @@ NOTES:
012-7100 ZRE CPU-Board K2521 (3KiB ROM, 1KiB RAM)
012-7040 PFS-1 ROM Board K3820 #1 - Games 1 to 4 (16KiB ROM)
012-7040 PFS-2 ROM Board K3820 #2 - Games 5 to 8 (16KiB ROM)
-
+
- Revision 2 -
2319-84-01 FAZ Graphics card (Color and Sound Logic)
2319-84-02 ABS Graphics card (1KiB ROM for Charset)
02 899-0101 ZRE-PP CPU-Board (56KiB ROM, 64KiB* RAM)
Basically revision 2 combines the ZRE, PFS-1 and PFS-2 onto a single board.
-
+
memory map:
- Revision 1 -
@@ -55,7 +55,7 @@ memory map:
Hirschjagd (1c00 - 27ff)
Hase und Wolf (2800 - 3fff)
Schmetterlingsfang (4000 - 4fff)
-
+
5000 - 8fff PFS-2 Schiessbude (5000 - 5fff)
Autorennen (6000 - 73ff)
opto-akust. Merkspiel (7400 - 7fff)
@@ -88,7 +88,7 @@ i/o ports:
80 - 83 ZRE-PP UB857D (Z80 CTC)
84 - 87 ZRE-PP UB855D (Z80 PIO)
?? - ?? ZRE-PP UB8560D (Z80 SIO)
-
+
read:
83 CTC COUNT 3 (IN1)
used as hardware random number generator
@@ -103,10 +103,10 @@ i/o ports:
bit 6 = bookkeeping (Summe Spiele)
bit 7 = coin sensor (+IRQ to make the game acknowledge it)
- 85 PIO PORT B
- bit 0-4 = light organ (unemulated :)) )
- bit 5-7 = sound parameter (unemulated, it's very difficult to
- figure out how those work)
+ 85 PIO PORT B
+ bit 0-2 = light organ
+ bit 3-4 = control panel (not connected)
+ bit 5-7 = sound parameter (not used on production units?)
86 PIO CTRL A
@@ -135,6 +135,7 @@ this.)
#include "cpu/z80/z80.h"
#include "cpu/z80/z80daisy.h"
#include "includes/polyplay.h"
+#include "polyplay.lh"
static const z80_daisy_config daisy_chain_zre[] =
{
@@ -151,6 +152,11 @@ static const z80_daisy_config daisy_chain_zrepp[] =
{ nullptr }
};
+INTERRUPT_GEN_MEMBER(polyplay_state::nmi_handler)
+{
+ m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
+}
+
/* I/O Port handling */
WRITE_LINE_MEMBER(polyplay_state::ctc_zc2_w)
{
@@ -176,14 +182,47 @@ READ8_MEMBER(polyplay_state::pio_portb_r)
WRITE8_MEMBER(polyplay_state::pio_portb_w)
{
- /* ZRE
-pio_portb_w: 78
- */
-
- /* ZRE-PP
-pio_portb_w: f8
- */
- osd_printf_verbose("pio_portb_w: %02x\n", data);
+ uint8_t lightState = data & 0x07;
+ //uint8_t soundState = data & 0xe0;
+
+ // there is a DS8205D attached to bit 0 and 1
+ switch (lightState)
+ {
+ case 0:
+ output().set_lamp_value(1, 1);
+ output().set_lamp_value(2, 0);
+ output().set_lamp_value(3, 0);
+ output().set_lamp_value(4, 0);
+ break;
+
+ case 1:
+ output().set_lamp_value(1, 0);
+ output().set_lamp_value(2, 1);
+ output().set_lamp_value(3, 0);
+ output().set_lamp_value(4, 0);
+ break;
+
+ case 2:
+ output().set_lamp_value(1, 0);
+ output().set_lamp_value(2, 0);
+ output().set_lamp_value(3, 1);
+ output().set_lamp_value(4, 0);
+ break;
+
+ case 3:
+ output().set_lamp_value(1, 0);
+ output().set_lamp_value(2, 0);
+ output().set_lamp_value(3, 0);
+ output().set_lamp_value(4, 1);
+ break;
+
+ default:
+ output().set_lamp_value(1, 0);
+ output().set_lamp_value(2, 0);
+ output().set_lamp_value(3, 0);
+ output().set_lamp_value(4, 0);
+ break;
+ }
}
INPUT_CHANGED_MEMBER(polyplay_state::input_changed)
@@ -203,11 +242,11 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( polyplay_mem_zrepp, AS_PROGRAM, 8, polyplay_state )
AM_RANGE(0x0000, 0xbfff) AM_ROM
-
+
AM_RANGE(0xc000, 0xcfff) AM_RAM
-
+
AM_RANGE(0xd000, 0xd7ff) AM_ROM AM_REGION("gfx1", 0)
-
+
AM_RANGE(0xea00, 0xebff) AM_RAM
AM_RANGE(0xec00, 0xf7ff) AM_RAM_WRITE(polyplay_characterram_w) AM_SHARE("characterram")
@@ -274,6 +313,7 @@ static MACHINE_CONFIG_START( polyplay_zre, polyplay_state )
MCFG_Z80_DAISY_CHAIN(daisy_chain_zre)
MCFG_CPU_PROGRAM_MAP(polyplay_mem_zre)
MCFG_CPU_IO_MAP(polyplay_io_zre)
+ MCFG_CPU_PERIODIC_INT_DRIVER(polyplay_state, nmi_handler, 100) /* A302 - zero cross detection from AC (50Hz) */
/* devices */
MCFG_DEVICE_ADD(Z80CTC_TAG, Z80CTC, POLYPLAY_MAIN_CLOCK / 4) /* UB857D */
@@ -281,14 +321,14 @@ static MACHINE_CONFIG_START( polyplay_zre, polyplay_state )
MCFG_Z80CTC_ZC0_CB(WRITELINE(polyplay_state, ctc_zc0_w))
MCFG_Z80CTC_ZC1_CB(WRITELINE(polyplay_state, ctc_zc1_w))
//MCFG_Z80CTC_ZC2_CB(WRITELINE(polyplay_state, ctc_zc2_w))
-
+
MCFG_DEVICE_ADD(Z80PIO_TAG, Z80PIO, POLYPLAY_MAIN_CLOCK / 4) /* UB855D */
MCFG_Z80PIO_OUT_INT_CB(INPUTLINE(Z80CPU_TAG, INPUT_LINE_IRQ0))
MCFG_Z80PIO_IN_PA_CB(READ8(polyplay_state, pio_porta_r))
MCFG_Z80PIO_OUT_PA_CB(WRITE8(polyplay_state, pio_porta_w))
MCFG_Z80PIO_IN_PB_CB(READ8(polyplay_state, pio_portb_r))
MCFG_Z80PIO_OUT_PB_CB(WRITE8(polyplay_state, pio_portb_w))
-
+
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(50)
@@ -369,8 +409,20 @@ ROM_END
ROM_START( polyplay2 )
ROM_REGION( 0x10000, Z80CPU_TAG, 0 )
+ ROM_LOAD( "2_1.ROM", 0x0000, 0x2000, CRC(d728ca42) SHA1(7359a59ba7f205b3ac95c8a0946093f24bdaa4da) )
+ ROM_LOAD( "2_2.ROM", 0x2000, 0x2000, CRC(52316236) SHA1(88c159621d40953240c5d2f1d6dcebb8f5e1ee81) )
+ ROM_LOAD( "2_3.ROM", 0x4000, 0x2000, CRC(e199d303) SHA1(fea2c3c659222553f36b3e922c6ac017f7111025) )
+ ROM_LOAD( "2_4.ROM", 0x6000, 0x2000, CRC(1324c2e2) SHA1(c0102d5abbb2f4dbb5b8dff5ad515bc3f2af9166) )
+ ROM_LOAD( "2_5.ROM", 0x8000, 0x2000, CRC(2e959fe9) SHA1(1f0a80bb26d0ae332d4a4313ec22ab7eefcf1e34) )
+ ROM_LOAD( "2_6.ROM", 0xA000, 0x2000, CRC(85774542) SHA1(420349a0d812bc0052a77cbc6c5ab84262e58b32) )
+
+ ROM_REGION( 0x800, "gfx1", 0 )
+ ROM_LOAD( "1_1.bin", 0x0000, 0x0800, CRC(4f028af9) SHA1(319537234069b43cfffafe567cc599ae05f24e23) )
+ROM_END
+
+ROM_START( polyplay2c )
+ ROM_REGION( 0x10000, Z80CPU_TAG, 0 )
ROM_LOAD( "2_1.bin", 0x0000, 0x2000, CRC(bf22f44f) SHA1(dd412b45f49ceffe336d905043c7af2447c577a0) )
-
ROM_LOAD( "2_2.bin", 0x2000, 0x2000, CRC(e54b8be8) SHA1(23037102eab60fd03c349ad154b2498139e84dd4) )
ROM_LOAD( "2_3.bin", 0x4000, 0x2000, CRC(ac43ec6b) SHA1(1662e10d80d47c1e3c54d4ef232c0d671fecce96) )
ROM_LOAD( "2_4.bin", 0x6000, 0x2000, CRC(703f3d46) SHA1(5ab571cb63ffdbce86b6e452988402e5c1098009) )
@@ -381,5 +433,6 @@ ROM_START( polyplay2 )
ROM_END
/* game driver */
-GAME( 1986, polyplay, 0, polyplay_zre, polyplay, driver_device, 0, ROT0, "VEB Polytechnik Karl-Marx-Stadt", "Poly-Play (ZRE)", 0 )
-GAME( 1989, polyplay2, 0, polyplay_zrepp, polyplay, driver_device, 0, ROT0, "VEB Polytechnik Karl-Marx-Stadt", "Poly-Play (ZRE-PP - Czech)", 0 )
+GAMEL( 1986, polyplay, 0, polyplay_zre, polyplay, driver_device, 0, ROT0, "VEB Polytechnik Karl-Marx-Stadt", "Poly-Play (ZRE)", 0, layout_polyplay )
+GAMEL( 1989, polyplay2, 0, polyplay_zrepp, polyplay, driver_device, 0, ROT0, "VEB Polytechnik Karl-Marx-Stadt", "Poly-Play (ZRE-PP)", 0, layout_polyplay )
+GAMEL( 1989, polyplay2c, polyplay2, polyplay_zrepp, polyplay, driver_device, 0, ROT0, "VEB Polytechnik Karl-Marx-Stadt", "Poly-Play (ZRE-PP - Czech)", 0, layout_polyplay )
diff --git a/src/mame/drivers/pse.cpp b/src/mame/drivers/pse.cpp
index 830c9493e18..0f9edfa6000 100644
--- a/src/mame/drivers/pse.cpp
+++ b/src/mame/drivers/pse.cpp
@@ -124,24 +124,24 @@ ROM_START( bazooka )
ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 )
ROM_REGION( 0x0840, "roms", ROMREGION_ERASE00 )
- ROM_LOAD( "bd2.k1", 0x0000, 0x0200, CRC(c9e9ed15) SHA1(624bbc10942a386040aef161b96d64021a842c9f) ) // 6341-1 - gfx: tank, truck, jeep motorcycle
- ROM_LOAD( "bd2.k4", 0x0200, 0x0200, CRC(c5a74df9) SHA1(2846a039e9bf372f3aa0b88ed89f9029eb7f797c) ) // 6341-1 - gfx: ambulance, stretcher, explosion
- ROM_LOAD( "bd1.d2", 0x0400, 0x0200, CRC(4fc10886) SHA1(b1c6f890994ba2182a4e7fc17582d6797dbd6ce9) ) // 6341-1 or 82s115
- ROM_LOAD( "bd1.e2", 0x0600, 0x0200, CRC(00179936) SHA1(e5417b8d3814dafe1278179b307a1b563a378cbe) ) // 6341-1 or 82s115
- ROM_LOAD( "bd2.e6", 0x0800, 0x0020, CRC(14b84564) SHA1(69cdd14e23094678c4b280f60cec963609181b00) ) // 82123
- ROM_LOAD( "bd2.e7", 0x0820, 0x0020, CRC(1bfb073f) SHA1(f6b26dcece71b2cf2ed4a537434edbe31cb10399) ) // 82123
+ ROM_LOAD( "bd2.k1", 0x0000, 0x0200, CRC(c9e9ed15) SHA1(624bbc10942a386040aef161b96d64021a842c9f) ) // 6341-1 - gfx: tank, truck, jeep motorcycle
+ ROM_LOAD( "bd2.k4", 0x0200, 0x0200, CRC(c5a74df9) SHA1(2846a039e9bf372f3aa0b88ed89f9029eb7f797c) ) // 6341-1 - gfx: ambulance, stretcher, explosion
+ ROM_LOAD( "bd1.d2", 0x0400, 0x0200, CRC(4fc10886) SHA1(b1c6f890994ba2182a4e7fc17582d6797dbd6ce9) ) // 6341-1 or 82s115
+ ROM_LOAD( "bd1.e2", 0x0600, 0x0200, CRC(00179936) SHA1(e5417b8d3814dafe1278179b307a1b563a378cbe) ) // 6341-1 or 82s115
+ ROM_LOAD( "bd2.e6", 0x0800, 0x0020, CRC(14b84564) SHA1(69cdd14e23094678c4b280f60cec963609181b00) ) // 82123
+ ROM_LOAD( "bd2.e7", 0x0820, 0x0020, CRC(1bfb073f) SHA1(f6b26dcece71b2cf2ed4a537434edbe31cb10399) ) // 82123
ROM_END
ROM_START( bazookabr )
ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASE00 )
ROM_REGION( 0x0840, "roms", ROMREGION_ERASE00 )
- ROM_LOAD( "1", 0x0000, 0x0200, CRC(edc34cb0) SHA1(f76a81833b015784e55b33189e9058cd24922f9b) )
- ROM_LOAD( "2", 0x0200, 0x0200, CRC(3e78e4c2) SHA1(814509eb773bfa87f1df933214f079e7dd2a8fa2) )
- ROM_LOAD( "3", 0x0400, 0x0200, CRC(4fc10886) SHA1(b1c6f890994ba2182a4e7fc17582d6797dbd6ce9) )
- ROM_LOAD( "4", 0x0600, 0x0200, CRC(00179936) SHA1(e5417b8d3814dafe1278179b307a1b563a378cbe) )
- ROM_LOAD( "bd2.e6", 0x0800, 0x0020, BAD_DUMP CRC(14b84564) SHA1(69cdd14e23094678c4b280f60cec963609181b00) ) // not dumped, taken from PSE set
- ROM_LOAD( "bd2.e7", 0x0820, 0x0020, BAD_DUMP CRC(1bfb073f) SHA1(f6b26dcece71b2cf2ed4a537434edbe31cb10399) ) // not dumped, taken from PSE set
+ ROM_LOAD( "bk01.1l", 0x0000, 0x0200, CRC(edc34cb0) SHA1(f76a81833b015784e55b33189e9058cd24922f9b) ) // 74S473
+ ROM_LOAD( "bk02.4l", 0x0200, 0x0200, CRC(3e78e4c2) SHA1(814509eb773bfa87f1df933214f079e7dd2a8fa2) ) // 74S473
+ ROM_LOAD( "bk03.8j", 0x0400, 0x0200, CRC(4fc10886) SHA1(b1c6f890994ba2182a4e7fc17582d6797dbd6ce9) ) // 74S473
+ ROM_LOAD( "bk04.8h", 0x0600, 0x0200, CRC(00179936) SHA1(e5417b8d3814dafe1278179b307a1b563a378cbe) ) // 74S473
+ ROM_LOAD( "bk05.6c", 0x0800, 0x0020, CRC(4193d32e) SHA1(d9e3392a8681198e110cfcd68ef20ae3dc366527) ) // 82S123 or 6331-1J
+ ROM_LOAD( "bk06.6d", 0x0820, 0x0020, CRC(1bfb073f) SHA1(f6b26dcece71b2cf2ed4a537434edbe31cb10399) ) // 82S123 or 6331-1J
ROM_END
ROM_START( dpatrol )
diff --git a/src/mame/drivers/qix.cpp b/src/mame/drivers/qix.cpp
index f0caba1b9f2..494878f171e 100644
--- a/src/mame/drivers/qix.cpp
+++ b/src/mame/drivers/qix.cpp
@@ -296,10 +296,10 @@ ADDRESS_MAP_END
*************************************/
#define COIN_PORT \
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Test Advance") PORT_CODE(KEYCODE_F1) \
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Test Next line") PORT_CODE(KEYCODE_F2) \
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Test Slew Up") PORT_CODE(KEYCODE_F5) \
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Test Slew Down") PORT_CODE(KEYCODE_F6) \
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Test Advance") \
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_SERVICE2 ) PORT_NAME("Test Next line") \
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_SERVICE3 ) PORT_NAME("Test Slew Up") \
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_SERVICE4 ) PORT_NAME("Test Slew Down") \
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 ) \
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 ) \
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN3 ) \
diff --git a/src/mame/drivers/rainbow.cpp b/src/mame/drivers/rainbow.cpp
index fc1e39320ad..6ec195e768d 100644
--- a/src/mame/drivers/rainbow.cpp
+++ b/src/mame/drivers/rainbow.cpp
@@ -44,7 +44,7 @@ NB.: a single hard disk (5 - 67 MB, 512 byte sectors) may be attached before sta
until shutdown. "Hot swapping" wasn't possible on the original system (our GUI just doesn't forbid it).
To create a DEC RD50/ST506 compatible image (153 cylinders, 4 heads, 16 sectors, standard 512 byte sectors) enter
->chdman64 createhd - c none - chs 153, 4, 16 - ss 512 - o RD50_ST506.chd
+>chdman createhd -c none -chs 153,4,16 -ss 512 -o RD50_ST506.chd
NOTE: use -c none parameter for no compression. No more than 8 heads or 1024 cylinders.
Some BUGS remain: BIOS autoboot doesnt work at all. It is not possible to boot from a properly formatted
@@ -56,34 +56,32 @@ handled wrongly, so shared mem. just below $8000 is tainted by Z80 stack data. A
Occassionally, ERROR 13 -keyboard stuck- appears (for reasons yet unknown).
-CORVUS HARD DISK (CP/M 1.x only)
---------------------------------
-In theory, it should be possible to use up to 4 Corvus Disks with up to 20 MB each.
-MS DOS 2.x and CP/M 2.0 were once supported, but are untested (in part because no drivers have survived).
+CORVUS HARD DISK
+----------------
+Up to 4 Corvus Disks with up to 20 MB each can be emulated (to be mounted as hard disks 2 - 5).
+MS DOS 2.x and CP/M v2.x were once supported, but are untested (in part because no binary drivers have survived).
To get a Corvus 11 drive up and running under CP/M 1.x, you'll need drcdutil.td0 from Donald Maslin's Archive.
First, create a 11 MB hard disk:
>Chdman createhd -c none -chs 306,4,20 -ss 512 -o CORVUS11.chd
-(worked for me, definitive CHS parameters for Corvus B/H drives are hard to come by)
-
-HINT: hard disk 1 is linked to DEC's controller. So it is vital that CORVUS11.chd is mounted as hard disk 2 in emulation!
-
-Then make a copy of your CP/M 86-80 V1.x boot disk. This copy will be patched to make the Corvus hard drive usable!
+[ -chs 306,2,20 for the 6 MB model and -chs 306,6,20 for the 20 MB type ]
+Then make a copy of your CP/M 86-80 V1.x boot disk. This copy must be patched to make the Corvus hard drive usable!
With 'drcdutil.td0' mounted in A: and a write enabled (non TeleDisk) image of CPM 1.x in B: type:
b:>SUBMIT A:hinstall
-This should replace the following CP/M files on B:
+This replaces the following CP/M files on B:
B:Z80CCP.SYS <- A:HZ80CCP.SYS
B:Z80.SYS <- A:HZ80.SYS
B:PRMTVPV.SYS <- A:HPRMTVPV.SYS
-Due to a typo in HINSTALL.SUB, the last PIP must be executed manually:
+Due to a missing drive specification in HINSTALL.SUB, the last PIP must be invoked manually:
b:>PIP B:PRMTVPVT.SYS=A:HPRMTVPV.SYS[V]
-Finally, boot from the newly patched CP/M disk and invoke CLINK2TN (command must be invoked after each cold boot).
-CLINK2TN has hard coded params valid for a Corvus 11 MB hard disk only. It needs a patched CP/M 1.x and will not run on CP/M 2.
+Finally, boot from the newly patched CP/M disk and type CLINK2TN (a step necessary after each cold boot).
+CLINK2TN can only be used together with a Corvus 11 MB hard disk. It needs a patched CP/M 1.x disk and won't run on CP/M 2.x.
+[ use CLINK2FV for the 6 MB model and CLINK2TW for the 20 MB type ]
Two steps are needed to initialize the new disk:
Step 1: invoke PUTGET, then press "f". Enter "Drive no: 1", "HEX BYTE? e5", "Starting disc address? 2320", "Number of Sectors? 64"
@@ -91,7 +89,7 @@ Step 2: invoke PUTGET, then press "f". Enter "Drive no: 1", "HEX BYTE? e5", "Sta
Done.
Required steps vary with 5 and 20 MB models (look into the *.DOC files in DRCDUTIL.TD0 / CLINK86.A86 / DRIVEL.COM).
-Parameters for initialization can be taken from Chapter 2 of the Disk System Installion Guide for TRS-80 II (uses same type H drives).
+Parameters for initialization can be taken from Chapter 2 of the Disk System Installion Guide for TRS-80 II (same type H drives).
COLOR EMULATION (NEC 7220 + extra hardware)
@@ -112,7 +110,7 @@ COLOR EMULATION (NEC 7220 + extra hardware)
THE DEC 'R-M-B' COLOR CABLE VS. THE UNOFFICIAL 'R-G-B' MODE (A BIT OF HISTORY)
The standard DEC "color cable" connected the green gun of a VR241 to the mono output of the Rainbow
(DIP setting COLOR_MONITOR).
-
+
An unofficial DIY cable enabled R-G-B graphics + seperate text (emulated by DIP setting DUAL MONITOR).
As DEC decided not to endorse R-G-B, many commercial programs show incorrect colors.
A patch from one of the archives corrects the GWBASIC palette problem when using 2 monitors [Bavarese].
@@ -457,7 +455,7 @@ W17 pulls J1 serial port pin 1 to GND when set (chassis to logical GND).
#include "imagedev/harddriv.h"
#include "machine/wd2010.h"
-#include "machine/corvushd.h"
+#include "machine/corvushd.h"
#include "machine/z80dart.h"
#include "bus/rs232/rs232.h"
@@ -490,8 +488,8 @@ public:
m_inp2(*this, "W14"),
m_inp3(*this, "W15"),
m_inp4(*this, "W18"),
- m_inp5(*this, "DEC HARD DISK"), // DO NOT CHANGE ORDER
- m_inp6(*this, "CORVUS HARD DISKS"), // DO NOT CHANGE ORDER
+ m_inp5(*this, "DEC HARD DISK"), // DO NOT CHANGE ORDER
+ m_inp6(*this, "CORVUS HARD DISKS"), // DO NOT CHANGE ORDER
m_inp7(*this, "GRAPHICS OPTION"), // DO NOT CHANGE ORDER
m_inp8(*this, "MEMORY PRESENT"), // DO NOT CHANGE ORDER
m_inp9(*this, "MONO MONITOR TYPE"),
@@ -507,7 +505,7 @@ public:
m_fdc(*this, FD1793_TAG),
m_hdc(*this, "hdc"),
- m_corvus_hdc(*this, "corvus"),
+ m_corvus_hdc(*this, "corvus"),
m_mpsc(*this, "upd7201"),
m_dbrg_A(*this, "com8116_a"),
@@ -662,7 +660,7 @@ private:
required_device<fd1793_t> m_fdc;
optional_device<wd2010_device> m_hdc;
- required_device<corvus_hdc_t> m_corvus_hdc;
+ required_device<corvus_hdc_t> m_corvus_hdc;
required_device<upd7201_device> m_mpsc;
required_device<com8116_device> m_dbrg_A;
@@ -956,7 +954,7 @@ AM_RANGE(0x11, 0x11) AM_DEVREADWRITE("kbdser", i8251_device, status_r, control_w
// See boot rom @1EA6: 0x27 (<- RESET EXTENDED COMM OPTION )
// Corvus B/H harddisk controller (incompatible with EXT.COMM OPTION):
-AM_RANGE(0x20, 0x20) AM_DEVREADWRITE("corvus", corvus_hdc_t, read, write)
+AM_RANGE(0x20, 0x20) AM_DEVREADWRITE("corvus", corvus_hdc_t, read, write)
AM_RANGE(0x21, 0x21) AM_READ(corvus_status_r)
// ===========================================================
@@ -1076,7 +1074,7 @@ PORT_DIPNAME(0x01, 0x00, "DEC HARD DISK") PORT_TOGGLE
PORT_DIPSETTING(0x00, DEF_STR(Off))
PORT_DIPSETTING(0x01, DEF_STR(On))
-PORT_START("CORVUS HARD DISKS")
+PORT_START("CORVUS HARD DISKS")
PORT_DIPNAME(0x01, 0x00, "CORVUS HARD DISKS") PORT_TOGGLE
PORT_DIPSETTING(0x00, DEF_STR(Off))
PORT_DIPSETTING(0x01, DEF_STR(On))
@@ -1231,7 +1229,7 @@ void rainbow_state::machine_reset()
}
if (m_inp6->read() == 0x00) // Unmap port if Corvus not present
- io.unmap_readwrite(0x20, 0x20);
+ io.unmap_readwrite(0x20, 0x20);
// *********** FLOPPY DISK CONTROLLER [ NOT OPTIONAL ]
m_unit = INVALID_DRIVE;
@@ -2150,7 +2148,7 @@ READ8_MEMBER(rainbow_state::system_parameter_r)
BIOS uses a seperate IRQ vector for RAM board detection (at least on a 100-B).
*/
return (((m_inp5->read() == 1) ? 0 : 1) |
- ((m_inp7->read() == 1) ? 0 : 4) | // Floppy is always present (bit 1 zero)
+ ((m_inp7->read() == 1) ? 0 : 4) | // Floppy is always present (bit 1 zero)
#ifdef OLD_RAM_BOARD_PRESENT
((m_inp8->read() > MOTHERBOARD_RAM) ? 0 : 8) |
#else
@@ -3290,7 +3288,7 @@ MCFG_WD2010_IN_INDEX_CB(VCC) // "
MCFG_HARDDISK_ADD("decharddisk1")
/// ******************************** / HARD DISK CONTROLLER ****************************************
-MCFG_DEVICE_ADD("corvus", CORVUS_HDC, 0)
+MCFG_DEVICE_ADD("corvus", CORVUS_HDC, 0)
MCFG_HARDDISK_ADD("harddisk1")
MCFG_HARDDISK_INTERFACE("corvus_hdd")
MCFG_HARDDISK_ADD("harddisk2")
diff --git a/src/mame/drivers/retofinv.cpp b/src/mame/drivers/retofinv.cpp
index ce56ec15ff2..eefdd9f1dfc 100644
--- a/src/mame/drivers/retofinv.cpp
+++ b/src/mame/drivers/retofinv.cpp
@@ -6,7 +6,16 @@ Return of the Invaders
driver by Jarek Parchanski, Andrea Mazzoleni
-the game was developed by UPL for Taito.
+UPL is said to have developed Return of the Invaders for Taito, but some digging
+in the ROMs reveals the following strings:
+
+ Programed by NAKAKUMA AKIRA
+ V 1.0 (85.3.15)
+
+ NOBUO KODERA
+ AKIRA NAKAKUMA
+ HIKARU KASAHARA
+ COMIX LTD. 1985.
Notes:
- I derived the ROM names from the board diagram in the manual. There might
@@ -31,11 +40,11 @@ Notes:
***************************************************************************/
#include "emu.h"
+#include "includes/retofinv.h"
+
#include "cpu/z80/z80.h"
-#include "cpu/m6805/m68705.h"
#include "machine/watchdog.h"
#include "sound/sn76496.h"
-#include "includes/retofinv.h"
void retofinv_state::machine_start()
@@ -43,23 +52,6 @@ void retofinv_state::machine_start()
save_item(NAME(m_main_irq_mask));
save_item(NAME(m_sub_irq_mask));
save_item(NAME(m_cpu2_m6000));
-
- if (m_68705 != nullptr) // only for the parent (with MCU)
- {
- save_item(NAME(m_from_main));
- save_item(NAME(m_from_mcu));
- save_item(NAME(m_mcu_sent));
- save_item(NAME(m_main_sent));
- save_item(NAME(m_portA_in));
- save_item(NAME(m_portA_out));
- save_item(NAME(m_ddrA));
- save_item(NAME(m_portB_in));
- save_item(NAME(m_portB_out));
- save_item(NAME(m_ddrB));
- save_item(NAME(m_portC_in));
- save_item(NAME(m_portC_out));
- save_item(NAME(m_ddrC));
- }
}
WRITE8_MEMBER(retofinv_state::cpu1_reset_w)
@@ -74,9 +66,7 @@ WRITE8_MEMBER(retofinv_state::cpu2_reset_w)
WRITE8_MEMBER(retofinv_state::mcu_reset_w)
{
- /* the bootlegs don't have a MCU, so make sure it's there before trying to reset it */
- if (m_68705 != nullptr)
- m_68705->set_input_line(INPUT_LINE_RESET, data ? CLEAR_LINE : ASSERT_LINE);
+ m_68705->reset_w(data ? CLEAR_LINE : ASSERT_LINE);
}
WRITE8_MEMBER(retofinv_state::cpu2_m6000_w)
@@ -91,8 +81,8 @@ READ8_MEMBER(retofinv_state::cpu0_mf800_r)
WRITE8_MEMBER(retofinv_state::soundcommand_w)
{
- m_soundlatch->write(space, 0, data);
- m_audiocpu->set_input_line(0, HOLD_LINE);
+ m_soundlatch->write(space, 0, data);
+ m_audiocpu->set_input_line(0, HOLD_LINE);
}
WRITE8_MEMBER(retofinv_state::irq0_ack_w)
@@ -119,8 +109,17 @@ WRITE8_MEMBER(retofinv_state::coinlockout_w)
machine().bookkeeping().coin_lockout_w(0,~data & 1);
}
+READ8_MEMBER(retofinv_state::mcu_status_r)
+{
+ /* bit 4 = when 1, mcu is ready to receive data from main cpu */
+ /* bit 5 = when 1, mcu has sent data to the main cpu */
+ return
+ ((CLEAR_LINE == m_68705->host_semaphore_r()) ? 0x10 : 0x00) |
+ ((CLEAR_LINE != m_68705->mcu_semaphore_r()) ? 0x20 : 0x00);
+}
-static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, retofinv_state )
+
+static ADDRESS_MAP_START( bootleg_map, AS_PROGRAM, 8, retofinv_state )
AM_RANGE(0x0000, 0x5fff) AM_ROM
AM_RANGE(0x7fff, 0x7fff) AM_WRITE(coincounter_w)
AM_RANGE(0x7b00, 0x7bff) AM_ROM /* space for diagnostic ROM? The code looks */
@@ -132,7 +131,6 @@ static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, retofinv_state )
AM_RANGE(0xc000, 0xc000) AM_READ_PORT("P1")
AM_RANGE(0xc001, 0xc001) AM_READ_PORT("P2")
AM_RANGE(0xc002, 0xc002) AM_READNOP /* bit 7 must be 0, otherwise game resets */
- AM_RANGE(0xc003, 0xc003) AM_READ(mcu_status_r)
AM_RANGE(0xc004, 0xc004) AM_READ_PORT("SYSTEM")
AM_RANGE(0xc005, 0xc005) AM_READ_PORT("DSW1")
AM_RANGE(0xc006, 0xc006) AM_READ_PORT("DSW2")
@@ -140,16 +138,21 @@ static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, retofinv_state )
AM_RANGE(0xc800, 0xc800) AM_WRITE(irq0_ack_w)
AM_RANGE(0xc801, 0xc801) AM_WRITE(coinlockout_w)
AM_RANGE(0xc802, 0xc802) AM_WRITE(cpu2_reset_w)
- AM_RANGE(0xc803, 0xc803) AM_WRITE(mcu_reset_w)
// AM_RANGE(0xc804, 0xc804) AM_WRITE(irq1_ack_w) // presumably (meaning memory map is shared with cpu 1)
AM_RANGE(0xc805, 0xc805) AM_WRITE(cpu1_reset_w)
AM_RANGE(0xd000, 0xd000) AM_DEVWRITE("watchdog", watchdog_timer_device, reset_w)
AM_RANGE(0xd800, 0xd800) AM_WRITE(soundcommand_w)
- AM_RANGE(0xe000, 0xe000) AM_READ(mcu_r)
- AM_RANGE(0xe800, 0xe800) AM_WRITE(mcu_w)
AM_RANGE(0xf800, 0xf800) AM_READ(cpu0_mf800_r)
ADDRESS_MAP_END
+static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, retofinv_state )
+ AM_IMPORT_FROM(bootleg_map)
+ AM_RANGE(0xc003, 0xc003) AM_READ(mcu_status_r)
+ AM_RANGE(0xc803, 0xc803) AM_WRITE(mcu_reset_w)
+ AM_RANGE(0xe000, 0xe000) AM_DEVREAD("68705", taito68705_mcu_device, data_r)
+ AM_RANGE(0xe800, 0xe800) AM_DEVWRITE("68705", taito68705_mcu_device, data_w)
+ADDRESS_MAP_END
+
static ADDRESS_MAP_START( sub_map, AS_PROGRAM, 8, retofinv_state )
AM_RANGE(0x0000, 0x1fff) AM_ROM
AM_RANGE(0x8000, 0x87ff) AM_RAM_WRITE(fg_videoram_w) AM_SHARE("fg_videoram")
@@ -168,18 +171,6 @@ static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8, retofinv_state )
AM_RANGE(0xe000, 0xffff) AM_ROM /* space for diagnostic ROM */
ADDRESS_MAP_END
-static ADDRESS_MAP_START( mcu_map, AS_PROGRAM, 8, retofinv_state )
- ADDRESS_MAP_GLOBAL_MASK(0x7ff)
- AM_RANGE(0x0000, 0x0000) AM_READWRITE(mcu_portA_r, mcu_portA_w)
- AM_RANGE(0x0001, 0x0001) AM_READWRITE(mcu_portB_r, mcu_portB_w)
- AM_RANGE(0x0002, 0x0002) AM_READWRITE(mcu_portC_r, mcu_portC_w)
- AM_RANGE(0x0004, 0x0004) AM_WRITE(mcu_ddrA_w)
- AM_RANGE(0x0005, 0x0005) AM_WRITE(mcu_ddrB_w)
- AM_RANGE(0x0006, 0x0006) AM_WRITE(mcu_ddrC_w)
- AM_RANGE(0x0010, 0x007f) AM_RAM
- AM_RANGE(0x0080, 0x07ff) AM_ROM
-ADDRESS_MAP_END
-
static INPUT_PORTS_START( retofinv )
@@ -382,8 +373,7 @@ static MACHINE_CONFIG_START( retofinv, retofinv_state )
MCFG_CPU_PROGRAM_MAP(sound_map)
MCFG_CPU_PERIODIC_INT_DRIVER(retofinv_state, nmi_line_pulse, 2*60)
- MCFG_CPU_ADD("68705", M68705,18432000/6) /* 3.072 MHz? */
- MCFG_CPU_PROGRAM_MAP(mcu_map)
+ MCFG_CPU_ADD("68705", TAITO68705_MCU, 18432000/6) /* 3.072 MHz? */
MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* 100 CPU slices per frame - enough for the sound CPU to read all commands */
@@ -418,8 +408,10 @@ MACHINE_CONFIG_END
/* bootleg has no mcu */
static MACHINE_CONFIG_DERIVED( retofinb, retofinv )
- MCFG_DEVICE_REMOVE("68705")
+ MCFG_CPU_MODIFY("maincpu")
+ MCFG_CPU_PROGRAM_MAP(bootleg_map)
+ MCFG_DEVICE_REMOVE("68705")
MACHINE_CONFIG_END
@@ -441,7 +433,7 @@ ROM_START( retofinv )
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "a37-05.17", 0x0000, 0x2000, CRC(9025abea) SHA1(2f03e8572f23624d7cd1215a55109e97fd66e271) )
- ROM_REGION( 0x0800, "68705", 0 ) /* 8k for the microcontroller */
+ ROM_REGION( 0x0800, "68705:mcu", 0 ) /* 2k for the microcontroller */
/* the only available dump is from a bootleg board, and is not the real thing (see notes at top of driver) */
ROM_LOAD( "a37-09.37", 0x00000, 0x0800, BAD_DUMP CRC(79bd6ded) SHA1(4967e95b4461c1bfb4e933d1804677799014f77b) )
diff --git a/src/mame/drivers/rm380z.cpp b/src/mame/drivers/rm380z.cpp
index 4ff3e935878..61528ba1065 100644
--- a/src/mame/drivers/rm380z.cpp
+++ b/src/mame/drivers/rm380z.cpp
@@ -245,7 +245,7 @@ static MACHINE_CONFIG_START( rm380z, rm380z_state )
/* cassette */
MCFG_CASSETTE_ADD( "cassette" )
-// MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
+// MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_ENABLED)
//m_cassette->change_state((BIT(data,x)) ? CASSETTE_MOTOR_DISABLED : CASSETTE_MOTOR_ENABLED, CASSETTE_MASK_MOTOR);
@@ -272,19 +272,19 @@ static MACHINE_CONFIG_START( rm480z, rm380z_state )
MCFG_MACHINE_RESET_OVERRIDE(rm380z_state, rm480z)
/* video hardware */
-// MCFG_SCREEN_ADD("screen", RASTER)
-// MCFG_SCREEN_REFRESH_RATE(50)
-// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
-// MCFG_SCREEN_SIZE((RM380Z_SCREENCOLS*(RM380Z_CHDIMX+1)), (RM380Z_SCREENROWS*(RM380Z_CHDIMY+1)))
-// MCFG_SCREEN_VISIBLE_AREA(0, (RM380Z_SCREENCOLS*(RM380Z_CHDIMX+1))-1, 0, (RM380Z_SCREENROWS*(RM380Z_CHDIMY+1))-1)
-// MCFG_SCREEN_UPDATE_DRIVER(rm380z_state, screen_update_rm480z)
-// MCFG_SCREEN_PALETTE("palette")
+// MCFG_SCREEN_ADD("screen", RASTER)
+// MCFG_SCREEN_REFRESH_RATE(50)
+// MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+// MCFG_SCREEN_SIZE((RM380Z_SCREENCOLS*(RM380Z_CHDIMX+1)), (RM380Z_SCREENROWS*(RM380Z_CHDIMY+1)))
+// MCFG_SCREEN_VISIBLE_AREA(0, (RM380Z_SCREENCOLS*(RM380Z_CHDIMX+1))-1, 0, (RM380Z_SCREENROWS*(RM380Z_CHDIMY+1))-1)
+// MCFG_SCREEN_UPDATE_DRIVER(rm380z_state, screen_update_rm480z)
+// MCFG_SCREEN_PALETTE("palette")
-// MCFG_PALETTE_ADD_MONOCHROME("palette")
+// MCFG_PALETTE_ADD_MONOCHROME("palette")
/* keyboard */
-// MCFG_DEVICE_ADD("keyboard", GENERIC_KEYBOARD, 0)
-// MCFG_GENERIC_KEYBOARD_CB(WRITE8(rm380z_state, keyboard_put))
+// MCFG_DEVICE_ADD("keyboard", GENERIC_KEYBOARD, 0)
+// MCFG_GENERIC_KEYBOARD_CB(WRITE8(rm380z_state, keyboard_put))
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/s11c.cpp b/src/mame/drivers/s11c.cpp
index 8a60990ca51..b0dab8dd151 100644
--- a/src/mame/drivers/s11c.cpp
+++ b/src/mame/drivers/s11c.cpp
@@ -478,6 +478,36 @@ ROM_START(rollr_g3)
ROM_LOAD("rolr_u20.l3", 0x30000, 0x10000, CRC(77f89aff) SHA1(dcd9fe233f33ef8f97cdeaaa365532e485a28944))
ROM_END
+ROM_START(rollr_f2)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("rolr-u26.lf2", 0x4000, 0x4000, CRC(a33a3a39) SHA1(fa67cede5fe9f86ce8772e49dba8d929d2b53ecb))
+ ROM_LOAD("rolr_u27.l2", 0x8000, 0x8000, CRC(f3bac2b8) SHA1(9f0ff32ea83e43097de42065909137a362b29d49))
+ ROM_REGION(0x50000, "bgcpu", ROMREGION_ERASEFF)
+ ROM_LOAD("rolr_u4.l3", 0x10000, 0x10000, CRC(d366c705) SHA1(76018305b5040b2e5d8c45cc81a18f13e1a8f8da))
+ ROM_LOAD("rolr_u19.l3", 0x20000, 0x10000, CRC(45a89e55) SHA1(3aff897514d242c83a8e7575d430d594a873736e))
+ ROM_LOAD("rolr_u20.l3", 0x30000, 0x10000, CRC(77f89aff) SHA1(dcd9fe233f33ef8f97cdeaaa365532e485a28944))
+ROM_END
+
+ROM_START(rollr_f3)
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("rolr-u26.lf3", 0x4000, 0x4000, CRC(0c54de2a) SHA1(764a0986bb1966ddfd547ee6380debaaa1ea3769))
+ ROM_LOAD("rolr_u27.l2", 0x8000, 0x8000, CRC(f3bac2b8) SHA1(9f0ff32ea83e43097de42065909137a362b29d49))
+ ROM_REGION(0x50000, "bgcpu", ROMREGION_ERASEFF)
+ ROM_LOAD("rolr_u4.l3", 0x10000, 0x10000, CRC(d366c705) SHA1(76018305b5040b2e5d8c45cc81a18f13e1a8f8da))
+ ROM_LOAD("rolr_u19.l3", 0x20000, 0x10000, CRC(45a89e55) SHA1(3aff897514d242c83a8e7575d430d594a873736e))
+ ROM_LOAD("rolr_u20.l3", 0x30000, 0x10000, CRC(77f89aff) SHA1(dcd9fe233f33ef8f97cdeaaa365532e485a28944))
+ROM_END
+
+ROM_START(rollr_d2) // American Drops 2 - sample/prototype with 8 drop targets
+ ROM_REGION(0x10000, "maincpu", 0)
+ ROM_LOAD("rolr-u26.ad2", 0x4000, 0x4000, CRC(913574ac) SHA1(52e2b398d087e998ba5c16a623c7d1a02b99ca55))
+ ROM_LOAD("rolr_u27.ad2", 0x8000, 0x8000, CRC(92d2172f) SHA1(73f15d338f2680ee2dd961e9e4d4ea97e9328b6e))
+ ROM_REGION(0x50000, "bgcpu", ROMREGION_ERASEFF)
+ ROM_LOAD("rolr_u4.l3", 0x10000, 0x10000, CRC(d366c705) SHA1(76018305b5040b2e5d8c45cc81a18f13e1a8f8da))
+ ROM_LOAD("rolr_u19.l3", 0x20000, 0x10000, CRC(45a89e55) SHA1(3aff897514d242c83a8e7575d430d594a873736e))
+ ROM_LOAD("rolr_u20.l3", 0x30000, 0x10000, CRC(77f89aff) SHA1(dcd9fe233f33ef8f97cdeaaa365532e485a28944))
+ROM_END
+
/*--------------------
/ The Bally Game Show 4/90
/--------------------*/
@@ -544,6 +574,9 @@ GAME(1991, rollr_e1, rollr_l2, s11c, s11c, s11c_state, s11c, ROT0,
GAME(1991, rollr_p2, rollr_l2, s11c, s11c, s11c_state, s11c, ROT0, "Williams", "Rollergames (PA-2 / PA-1 Sound)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1990, rollr_l3, rollr_l2, s11c, s11c, s11c_state, s11c, ROT0, "Williams", "Rollergames (LU-3) Europe", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1990, rollr_g3, rollr_l2, s11c, s11c, s11c_state, s11c, ROT0, "Williams", "Rollergames (LG-3) Germany", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1991, rollr_f2, rollr_l2, s11c, s11c, s11c_state, s11c, ROT0, "Williams", "Rollergames (LF-2) French", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1990, rollr_f3, rollr_l2, s11c, s11c, s11c_state, s11c, ROT0, "Williams", "Rollergames (LF-3) French", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1990, rollr_d2, rollr_l2, s11c, s11c, s11c_state, s11c, ROT0, "Williams", "Rollergames (AD-2) Prototype", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1990, gs_l3, gs_l4, s11c, s11c, s11c_state, s11c, ROT0, "Bally", "The Bally Game Show (L-3)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1990, gs_l4, 0, s11c, s11c, s11c_state, s11c, ROT0, "Bally", "The Bally Game Show (L-4)", MACHINE_IS_SKELETON_MECHANICAL)
GAME(1990, strax_p7, 0, s11c, s11c, s11c_state, s11c, ROT0, "Williams", "Star Trax (domestic prototype)", MACHINE_IS_SKELETON_MECHANICAL)
diff --git a/src/mame/drivers/sdk85.cpp b/src/mame/drivers/sdk85.cpp
index aa64dbb4e42..7a899e067c1 100644
--- a/src/mame/drivers/sdk85.cpp
+++ b/src/mame/drivers/sdk85.cpp
@@ -1,6 +1,6 @@
// license:BSD-3-Clause
// copyright-holders:Miodrag Milanovic, Robbbert
-/***************************************************************************
+/**************************************************************************************************************************************
Intel SDK-85
@@ -20,7 +20,19 @@ then press NEXT to increment the address.
ToDo:
- Artwork
-****************************************************************************/
+
+Notes on Mastermind bios.
+Original author: Paolo Forlani
+Ported to SDK85 by: Stefano Bodrato
+
+Game instructions (from Stefano):
+Start up, press 0 to begin. Game shows ----. You need to guess a number between 0000 and 9999.
+Enter your guess, "computer" will answer showing on left with the number of found digits.
+On the right you'll get a "clue", slightly different than on the standard game (making it a bit more tricky and more intriguing).
+Once you find the number, you'll see it flashing. Press the 2 key and you'll get your score (number of attempts before guessing).
+Press 0 to restart.
+
+*************************************************************************************************************************************/
#include "emu.h"
#include "cpu/i8085/i8085.h"
@@ -32,14 +44,19 @@ class sdk85_state : public driver_device
{
public:
sdk85_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag) ,
- m_maincpu(*this, "maincpu") { }
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_keyboard(*this, "X%u", 0)
+ { }
DECLARE_WRITE8_MEMBER(scanlines_w);
DECLARE_WRITE8_MEMBER(digit_w);
DECLARE_READ8_MEMBER(kbd_r);
- uint8_t m_digit;
+
+private:
+ u8 m_digit;
required_device<cpu_device> m_maincpu;
+ required_ioport_array<3> m_keyboard;
};
static ADDRESS_MAP_START(sdk85_mem, AS_PROGRAM, 8, sdk85_state)
@@ -80,12 +97,12 @@ static INPUT_PORTS_START( sdk85 )
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) PORT_CHAR('F')
PORT_START("X2")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("EXEC") PORT_CODE(KEYCODE_Q)
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("NEXT") PORT_CODE(KEYCODE_UP)
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("GO") PORT_CODE(KEYCODE_R)
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SUBST") PORT_CODE(KEYCODE_T)
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("EXAM") PORT_CODE(KEYCODE_Y)
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SINGLE") PORT_CODE(KEYCODE_U)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("EXEC") PORT_CODE(KEYCODE_Q) PORT_CHAR('Q')
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("NEXT") PORT_CODE(KEYCODE_UP) PORT_CHAR('^')
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("GO") PORT_CODE(KEYCODE_R) PORT_CHAR('R')
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SUBST") PORT_CODE(KEYCODE_T) PORT_CHAR('T')
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("EXAM") PORT_CODE(KEYCODE_Y) PORT_CHAR('Y')
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SINGLE") PORT_CODE(KEYCODE_U) PORT_CHAR('U')
PORT_BIT(0xC0, IP_ACTIVE_LOW, IPT_UNUSED)
INPUT_PORTS_END
@@ -103,14 +120,7 @@ WRITE8_MEMBER( sdk85_state::digit_w )
READ8_MEMBER( sdk85_state::kbd_r )
{
- uint8_t data = 0xff;
-
- if (m_digit < 3)
- {
- char kbdrow[6];
- sprintf(kbdrow,"X%X",m_digit);
- data = ioport(kbdrow)->read();
- }
+ u8 data = (m_digit < 3) ? m_keyboard[m_digit]->read() : 0xff;
return data;
}
@@ -136,7 +146,10 @@ MACHINE_CONFIG_END
/* ROM definition */
ROM_START( sdk85 )
ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
- ROM_LOAD( "sdk85.a14", 0x0000, 0x0800, CRC(9d5a983f) SHA1(54e218560fbec009ac3de5cfb64b920241ef2eeb))
+ ROM_SYSTEM_BIOS(0, "default", "Default")
+ ROMX_LOAD( "sdk85.a14", 0x0000, 0x0800, CRC(9d5a983f) SHA1(54e218560fbec009ac3de5cfb64b920241ef2eeb), ROM_BIOS(1) )
+ ROM_SYSTEM_BIOS(1, "mastermind", "Mastermind")
+ ROMX_LOAD( "mastermind.a14", 0x0000, 0x0800, CRC(36b694ae) SHA1(4d8a5ae5d10e8f72a6e349c7eeaf1aa00c4e45e1), ROM_BIOS(2) )
ROM_END
/* Driver */
diff --git a/src/mame/drivers/segae.cpp b/src/mame/drivers/segae.cpp
index 1fe88f41c31..b8770aaf79b 100644
--- a/src/mame/drivers/segae.cpp
+++ b/src/mame/drivers/segae.cpp
@@ -956,15 +956,16 @@ ROM_START( fantzn2 )
ROM_LOAD( "317-0057.key", 0x0000, 0x2000, CRC(ee43d0f0) SHA1(72cb75a4d8352fe372db12046a59ea044360d5c3) )
ROM_END
+// Game ID# 833-6407-01 OPA OPA
ROM_START( opaopa )
ROM_REGION( 0x50000, "maincpu", 0 )
- ROM_LOAD( "epr11224.ic7", 0x00000, 0x08000, CRC(024b1244) SHA1(59a522ac3d98982cc4ddb1c81f9584d3da453649) ) /* encrypted */
+ ROM_LOAD( "epr-11054.ic7", 0x00000, 0x08000, CRC(024b1244) SHA1(59a522ac3d98982cc4ddb1c81f9584d3da453649) ) /* encrypted */
/* The following are 8 0x4000 banks that get mapped to reads from 0x8000 - 0xbfff */
- ROM_LOAD( "epr11223.ic5", 0x10000, 0x08000, CRC(6bc41d6e) SHA1(8997a4ac2a9704f1400d0ec16b259ee496a7efef) ) /* encrypted */
- ROM_LOAD( "epr11222.ic4", 0x18000, 0x08000, CRC(395c1d0a) SHA1(1594bad13e78c5fad4db644cd85a6bac1eaddbad) ) /* encrypted */
- ROM_LOAD( "epr11221.ic3", 0x20000, 0x08000, CRC(4ca132a2) SHA1(cb4e4c01b6ab070eef37c0603190caafe6236ccd) ) /* encrypted */
- ROM_LOAD( "epr11220.ic2", 0x28000, 0x08000, CRC(a165e2ef) SHA1(498ff4c5d3a2658567393378c56be6ed86ac0384) ) /* encrypted */
+ ROM_LOAD( "epr-11053.ic5", 0x10000, 0x08000, CRC(6bc41d6e) SHA1(8997a4ac2a9704f1400d0ec16b259ee496a7efef) ) /* encrypted */
+ ROM_LOAD( "epr-11052.ic4", 0x18000, 0x08000, CRC(395c1d0a) SHA1(1594bad13e78c5fad4db644cd85a6bac1eaddbad) ) /* encrypted */
+ ROM_LOAD( "epr-11051.ic3", 0x20000, 0x08000, CRC(4ca132a2) SHA1(cb4e4c01b6ab070eef37c0603190caafe6236ccd) ) /* encrypted */
+ ROM_LOAD( "epr-11050.ic2", 0x28000, 0x08000, CRC(a165e2ef) SHA1(498ff4c5d3a2658567393378c56be6ed86ac0384) ) /* encrypted */
ROM_REGION( 0x2000, "key", 0 ) /* MC8123 key */
ROM_LOAD( "317-0042.key", 0x0000, 0x2000, CRC(d6312538) SHA1(494ac7f080775c21dc7d369e6ea78f3299e6975a) )
diff --git a/src/mame/drivers/segasp.cpp b/src/mame/drivers/segasp.cpp
index 761cd8fa34e..00d72f509a2 100644
--- a/src/mame/drivers/segasp.cpp
+++ b/src/mame/drivers/segasp.cpp
@@ -190,7 +190,7 @@ static ADDRESS_MAP_START( segasp_map, AS_PROGRAM, 64, segasp_state )
AM_RANGE(0x00700000, 0x00707fff) AM_MIRROR(0x02000000) AM_READWRITE32(dc_aica_reg_r, dc_aica_reg_w, 0xffffffffffffffffU)
AM_RANGE(0x00710000, 0x0071000f) AM_MIRROR(0x02000000) AM_DEVREADWRITE16("aicartc", aicartc_device, read, write, 0x0000ffff0000ffffU )
- AM_RANGE(0x00800000, 0x00ffffff) AM_MIRROR(0x02000000) AM_READWRITE(naomi_arm_r, naomi_arm_w ) // sound RAM (8 MB)
+ AM_RANGE(0x00800000, 0x00ffffff) AM_MIRROR(0x02000000) AM_READWRITE(sh4_soundram_r, sh4_soundram_w) // sound RAM (8 MB)
/* External Device */
AM_RANGE(0x01000000, 0x0100ffff) AM_RAM // banked access to ROM/NET board address space, mainly backup SRAM and ATA
@@ -298,6 +298,7 @@ static MACHINE_CONFIG_DERIVED_CLASS( segasp, naomi_aw_base, segasp_state )
MCFG_CPU_PROGRAM_MAP(segasp_map)
MCFG_CPU_IO_MAP(onchip_port)
+ MCFG_EEPROM_SERIAL_93C46_ADD("main_eeprom")
MCFG_EEPROM_SERIAL_93C46_ADD("sp_eeprom")
// todo, not exactly NaomiM4 (see notes at top of driver) use custom board type here instead
diff --git a/src/mame/drivers/slapfght.cpp b/src/mame/drivers/slapfght.cpp
index ef1702a5bc9..276f9592ce5 100644
--- a/src/mame/drivers/slapfght.cpp
+++ b/src/mame/drivers/slapfght.cpp
@@ -785,7 +785,7 @@ void slapfght_state::machine_reset()
MACHINE_RESET_MEMBER(slapfght_state,getstar)
{
// don't boot the mcu since we don't have a dump yet
-// m_mcu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
+// m_mcu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
machine_reset();
}
diff --git a/src/mame/drivers/stadhero.cpp b/src/mame/drivers/stadhero.cpp
index 61d04c0fc2d..0b96752214f 100644
--- a/src/mame/drivers/stadhero.cpp
+++ b/src/mame/drivers/stadhero.cpp
@@ -6,8 +6,6 @@
Emulation by Bryan McPhail, mish@tendril.co.uk
- Are the colours correct on the scoreboard screen? they look strange
-
=== PCB Info ===
The OSC on the CPU board(DE-0303-3) is 20MHz
@@ -263,8 +261,8 @@ ROM_START( stadhero )
ROM_LOAD( "ef09.4j", 0x10000, 0x08000, CRC(2ade874d) SHA1(5c884535214438a4ea79fd262700a346bc12ad81) )
ROM_REGION( 0x30000, "gfx2", 0 )
- ROM_LOAD( "ef10.11j", 0x00000, 0x10000, CRC(dca3d599) SHA1(2b97a70065f3065e7fbb54fb53cb120d9e5013b3) ) /* tiles */
- ROM_LOAD( "ef11.13j", 0x10000, 0x10000, CRC(af563e96) SHA1(c88eaff4a1ea133d708f4511bb1dbc99ef066eed) )
+ ROM_LOAD( "ef11.13j", 0x00000, 0x10000, CRC(af563e96) SHA1(c88eaff4a1ea133d708f4511bb1dbc99ef066eed) ) /* tiles */
+ ROM_LOAD( "ef10.11j", 0x10000, 0x10000, CRC(dca3d599) SHA1(2b97a70065f3065e7fbb54fb53cb120d9e5013b3) )
ROM_LOAD( "ef12.14j", 0x20000, 0x10000, CRC(9a1bf51c) SHA1(e733c193b305496878551fc6eefc21587ba75c82) )
ROM_REGION( 0x80000, "gfx3", 0 )
diff --git a/src/mame/drivers/starwars.cpp b/src/mame/drivers/starwars.cpp
index d3efae464cc..59320b60504 100644
--- a/src/mame/drivers/starwars.cpp
+++ b/src/mame/drivers/starwars.cpp
@@ -204,7 +204,7 @@ static INPUT_PORTS_START( starwars )
PORT_START("IN1")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Diagnostic Step") PORT_CODE(KEYCODE_F1)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE2 ) PORT_NAME("Diagnostic Step")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON3 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 )
diff --git a/src/mame/drivers/stfight.cpp b/src/mame/drivers/stfight.cpp
index 6b0e86508b3..2f6586d9bcd 100644
--- a/src/mame/drivers/stfight.cpp
+++ b/src/mame/drivers/stfight.cpp
@@ -1055,13 +1055,13 @@ ROM_END
// Note: Marked MACHINE_IMPERFECT_SOUND due to YM2203 clock issue
-GAME( 1986, empcity, 0, stfight, stfight, stfight_state, empcity, ROT0, "Seibu Kaihatsu", "Empire City: 1931 (bootleg?)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1986, empcityu, empcity, stfight, stfight, stfight_state, stfight, ROT0, "Seibu Kaihatsu (Taito / Romstar license)", "Empire City: 1931 (US)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // different title logo
-GAME( 1986, empcityj, empcity, stfight, stfight, stfight_state, stfight, ROT0, "Seibu Kaihatsu (Taito license)", "Empire City: 1931 (Japan)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1986, empcityi, empcity, stfight, stfight, stfight_state, stfight, ROT0, "Seibu Kaihatsu (Eurobed license)", "Empire City: 1931 (Italy)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1986, stfight, empcity, stfight, stfight, stfight_state, stfight, ROT0, "Seibu Kaihatsu (Tuning license)", "Street Fight (Germany)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1986, stfighta, empcity, stfight, stfight, stfight_state, stfight, ROT0, "Seibu Kaihatsu", "Street Fight (bootleg?)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-GAME( 1986, stfightgb,empcity, stfight, stfight, stfight_state, stfight, ROT0, "Seibu Kaihatsu (Tuning license)", "Street Fight (Germany - Benelux)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
-
-/* Cross Shooter uses the same base board, but different video board */
-GAME( 1987, cshootert, airraid, cshooter, cshooter, stfight_state, cshooter, ROT270, "Seibu Kaihatsu (Taito license)", "Cross Shooter (2 PCB Stack)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1986, empcity, 0, stfight, stfight, stfight_state, empcity, ROT0, "Seibu Kaihatsu", "Empire City: 1931 (bootleg?)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1986, empcityu, empcity, stfight, stfight, stfight_state, stfight, ROT0, "Seibu Kaihatsu (Taito / Romstar license)", "Empire City: 1931 (US)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE ) // different title logo
+GAME( 1986, empcityj, empcity, stfight, stfight, stfight_state, stfight, ROT0, "Seibu Kaihatsu (Taito license)", "Empire City: 1931 (Japan)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1986, empcityi, empcity, stfight, stfight, stfight_state, stfight, ROT0, "Seibu Kaihatsu (Eurobed license)", "Empire City: 1931 (Italy)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1986, stfight, empcity, stfight, stfight, stfight_state, stfight, ROT0, "Seibu Kaihatsu (Tuning license)", "Street Fight (Germany)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1986, stfighta, empcity, stfight, stfight, stfight_state, stfight, ROT0, "Seibu Kaihatsu", "Street Fight (bootleg?)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1986, stfightgb,empcity, stfight, stfight, stfight_state, stfight, ROT0, "Seibu Kaihatsu (Tuning license)", "Street Fight (Germany - Benelux)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+
+// Cross Shooter uses the same base board, but different video board
+GAME( 1987, cshootert,airraid, cshooter, cshooter, stfight_state, cshooter, ROT270, "Seibu Kaihatsu (Taito license)", "Cross Shooter (2 PCB Stack)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/stlforce.cpp b/src/mame/drivers/stlforce.cpp
index 5dd6e2ae888..196684e83f1 100644
--- a/src/mame/drivers/stlforce.cpp
+++ b/src/mame/drivers/stlforce.cpp
@@ -210,7 +210,7 @@ static MACHINE_CONFIG_START( stlforce, stlforce_state )
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
- MCFG_OKIM6295_ADD("oki", 937500 , OKIM6295_PIN7_HIGH)
+ MCFG_OKIM6295_ADD("oki", XTAL_32MHz/32 , OKIM6295_PIN7_HIGH)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/stv.cpp b/src/mame/drivers/stv.cpp
index 30dd4ec6e68..9abc3fe9b6c 100644
--- a/src/mame/drivers/stv.cpp
+++ b/src/mame/drivers/stv.cpp
@@ -2540,7 +2540,25 @@ ROM_START( znpwfv )
STV_BIOS
ROM_REGION32_BE( 0x3000000, "cart", ROMREGION_ERASE00 ) /* SH2 code */
- ROM_LOAD16_BYTE( "epr20398.13", 0x0000001, 0x0100000, CRC(3fb56a0b) SHA1(13c2fa2d94b106d39e46f71d15fbce3607a5965a) ) // bad
+ ROM_LOAD16_BYTE( "epr20398.13", 0x0000001, 0x0100000, CRC(3fb56a0b) SHA1(13c2fa2d94b106d39e46f71d15fbce3607a5965a) ) // good
+ ROM_RELOAD_PLAIN( 0x0200000, 0x0100000)
+ ROM_RELOAD_PLAIN( 0x0300000, 0x0100000)
+ ROM_LOAD16_WORD_SWAP( "mpr20400.2", 0x0400000, 0x0400000, CRC(1edfbe05) SHA1(b0edd3f3d57408101ae6eb0aec742afbb4d289ca) ) // good
+ ROM_LOAD16_WORD_SWAP( "mpr20401.3", 0x0800000, 0x0400000, CRC(99e98937) SHA1(e1b4d12a0b4d0fe97a62fcc085e19cce77657c99) ) // good
+ ROM_LOAD16_WORD_SWAP( "mpr20402.4", 0x0c00000, 0x0400000, CRC(4572aa60) SHA1(8b2d76ea8c6e2f472c6ee7c9b6ad6e80e6a1a85a) ) // good
+ ROM_LOAD16_WORD_SWAP( "mpr20403.5", 0x1000000, 0x0400000, CRC(26a8e13e) SHA1(07f5564b704598e3c3580d3d620ecc4f14549dbd) ) // good
+ ROM_LOAD16_WORD_SWAP( "mpr20404.6", 0x1400000, 0x0400000, CRC(0b70275d) SHA1(47b8672e19c698dc948760f7091f4c6280e728d0) ) // good
+ ROM_LOAD16_WORD_SWAP( "mpr20399.1", 0x1800000, 0x0400000, CRC(c178a96e) SHA1(65f4aa05187d48ba8ad4fe75ff6ffe1f8524831d) ) // good
+ ROM_LOAD16_WORD_SWAP( "mpr20405.8", 0x1c00000, 0x0400000, CRC(f53337b7) SHA1(09a21f81016ee54f10554ae1f790415d7436afe0) ) // good
+ ROM_LOAD16_WORD_SWAP( "mpr20406.9", 0x2000000, 0x0400000, CRC(b677c175) SHA1(d0de7b5a29928036df0bdfced5a8021c0999eb26) ) // good
+ ROM_LOAD16_WORD_SWAP( "mpr20407.10", 0x2400000, 0x0400000, CRC(58356050) SHA1(f8fb5a14f4ec516093c785891b05d55ae345754e) ) // good
+ROM_END
+
+ROM_START( znpwfvt )
+ STV_BIOS
+
+ ROM_REGION32_BE( 0x3000000, "cart", ROMREGION_ERASE00 ) /* SH2 code */
+ ROM_LOAD16_BYTE( "epr20408.13", 0x0000001, 0x0100000, CRC(1d62fcf6) SHA1(3651261aa755da27b11462f2705311b7c639a687) ) // good
ROM_RELOAD_PLAIN( 0x0200000, 0x0100000)
ROM_RELOAD_PLAIN( 0x0300000, 0x0100000)
ROM_LOAD16_WORD_SWAP( "mpr20400.2", 0x0400000, 0x0400000, CRC(1edfbe05) SHA1(b0edd3f3d57408101ae6eb0aec742afbb4d289ca) ) // good
@@ -3424,6 +3442,7 @@ GAME( 1996, vfkids, stvbios, stv, stv, stv_state, stv, ROT
GAME( 1997, vmahjong, stvbios, stv, vmahjong, stv_state, stvmp, ROT0, "Micronet", "Virtual Mahjong (J 961214 V1.000)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
GAME( 1997, winterht, stvbios, stv, stv, stv_state, winterht, ROT0, "Sega", "Winter Heat (JUET 971012 V1.000)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
GAME( 1997, znpwfv, stvbios, stv, stv, stv_state, znpwfv, ROT0, "Sega", "Zen Nippon Pro-Wrestling Featuring Virtua (J 971123 V1.000)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1997, znpwfvt, znpwfv, stv, stv, stv_state, znpwfv, ROT0, "Sega", "Zen Nippon Pro-Wrestling Featuring Virtua (T 971123 V1.000)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
/* Unemulated printer / camera devices */
// USA sets
@@ -3450,7 +3469,7 @@ GAME( 1998, prc298sp, stvbios, stv, stv, stv_state, stv, ROT0
GAME( 1998, prc298su, stvbios, stv, stv, stv_state, stv, ROT0, "Atlus", "Print Club 2 '98 Summer Ver (J 980603 V1.100)", MACHINE_NOT_WORKING ) //
GAME( 1998, prc298au, stvbios, stv, stv, stv_state, stv, ROT0, "Atlus", "Print Club 2 '98 Autumn Ver (J 980827 V1.000)", MACHINE_NOT_WORKING )
GAME( 2000, prc2ksu, stvbios, stv, stv, stv_state, stv, ROT0, "Atlus", "Print Club 2 2000 Summer (J 000509 V1.000) ", MACHINE_NOT_WORKING ) // internal string 2000_SUMMER
-
+
GAME( 1999, pclubor, stvbios, stv, stv, stv_state, stv, ROT0, "Atlus", "Print Club Goukakenran (J 991104 V1.000)", MACHINE_NOT_WORKING )
GAME( 1999, pclubol, stvbios, stv, stv, stv_state, stv, ROT0, "Atlus", "Print Club Olive (J 980717 V1.000)", MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/suprnova.cpp b/src/mame/drivers/suprnova.cpp
index ba70e1ef641..34a3e480ce2 100644
--- a/src/mame/drivers/suprnova.cpp
+++ b/src/mame/drivers/suprnova.cpp
@@ -1272,7 +1272,33 @@ ROM_START( galpanisk )
ROM_LOAD( "gps30000.u4", 0x000000, 0x400000, CRC(9e4da8e3) SHA1(6506d9300a442883357003a05fd2c78d364c35bb) )
ROM_END
-ROM_START( galpans2 )
+ROM_START( galpans2 ) //only the 2 program ROMs were dumped, but mask ROMs are supposed to match.
+ SKNS_EUROPE
+
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_LOAD16_BYTE( "GPS2E_U6__Ver.3.u6", 0x000000, 0x100000, CRC(72fff5d1) SHA1(57001e04c469281a82a2956c6bc33502d5a3b882) )
+ ROM_LOAD16_BYTE( "GPS2E_U4__Ver.3.u4", 0x000001, 0x100000, CRC(95061601) SHA1(f98f1af9877b097e97acc5a3844ef9c523a92843) )
+
+ ROM_REGION( 0x1000000, "gfx1", 0 )
+ ROM_LOAD( "gs210000.u21", 0x000000, 0x400000, CRC(294b2f14) SHA1(90cbd0acdaa2d89d208c28aae33ab57c03624089) )
+ ROM_LOAD( "gs210100.u20", 0x400000, 0x400000, CRC(f75c5a9a) SHA1(3919643cee6c88185a1aa3c58c5bc80599bf734e) )
+ ROM_LOAD( "gs210200.u8", 0x800000, 0x400000, CRC(25b4f56b) SHA1(f9a33d5ed54a04ecece3035e75508d191bbe74b1) )
+ ROM_LOAD( "gs210300.u32", 0xc00000, 0x400000, CRC(db6d4424) SHA1(0a88dafd0ee2490ff2ef39ce8eb1931c41bdda42) )
+
+ ROM_REGION( 0x800000, "gfx2", 0 )
+ ROM_LOAD( "gs220000.u17", 0x000000, 0x400000, CRC(5caae1c0) SHA1(8f77e4cf018d7290b2d804cbff9fccf0bf4d2404) )
+ ROM_LOAD( "gs220100.u9", 0x400000, 0x400000, CRC(8d51f197) SHA1(19d2afab823ea179918e7bcbf4df2283e77570f0) )
+
+ ROM_REGION( 0x800000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
+ /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
+ /* 0x040000 - 0x3fffff empty? */
+ ROM_LOAD( "gs221000.u3", 0x400000, 0x400000, CRC(58800a18) SHA1(5e6d55ecd12275662d6f59559e137b759f23fff6) )
+
+ ROM_REGION( 0x400000, "ymz", 0 ) /* Samples */
+ ROM_LOAD( "gs230000.u1", 0x000000, 0x400000, CRC(0348e8e1) SHA1(8a21c7e5cea0bc08a2595213d689c58c0251fdb5) )
+ROM_END
+
+ROM_START( galpans2j )
SKNS_JAPAN
ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
@@ -1761,6 +1787,28 @@ ROM_START( ryourano )
ROM_END
ROM_START( vblokbrk )
+ SKNS_EUROPE
+
+ ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
+ ROM_LOAD16_BYTE( "sk000e2-e.u10", 0x000000, 0x080000, CRC(5a278f10) SHA1(6f1be0657da76144b0feeed672d92a85091289b6) ) /* labeled SK000e2/E */
+ ROM_LOAD16_BYTE( "sk000e-o.u8", 0x000001, 0x080000, CRC(aecf0647) SHA1(4752e5012bae8e7af3972b455b4346499ec2b49c) ) /* labeled SK000e/O */
+
+ ROM_REGION( 0x0400000, "gfx1", 0 )
+ ROM_LOAD( "sk-100-00.u24", 0x000000, 0x200000, CRC(151dd88a) SHA1(87bb1039a9883f721a315760eb2c4abe4a94046f) )
+ ROM_LOAD( "sk-101.u20", 0x200000, 0x100000, CRC(779cce23) SHA1(70147b36d982524ba9921823e481ce8fbb5daa26) )
+
+ ROM_REGION( 0x200000, "gfx2", 0 )
+ ROM_LOAD( "sk-200-00.u16", 0x000000, 0x200000, CRC(2e297c61) SHA1(4071b945a1294fbc3d18fab1f144bf09af4349e8) )
+
+ ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
+ /* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
+ /* 0x040000 - 0x3fffff empty? */
+
+ ROM_REGION( 0x200000, "ymz", 0 ) /* Samples */
+ ROM_LOAD( "sk-300-00.u4", 0x000000, 0x200000, CRC(e6535c05) SHA1(8895b7c326e0261691cb184887ac1ca637302460) )
+ROM_END
+
+ROM_START( vblokbrka )
SKNS_ASIA
ROM_REGION32_BE( 0x200000, "user1", 0 ) /* SH-2 Code mapped at 0x04000000 */
@@ -1768,18 +1816,18 @@ ROM_START( vblokbrk )
ROM_LOAD16_BYTE( "sk01a.u8", 0x000001, 0x080000, CRC(461e0197) SHA1(003573a4abdbecc6dd234a13c61ef07a25d980e2) )
ROM_REGION( 0x0400000, "gfx1", 0 )
- ROM_LOAD( "sk100-00.u24", 0x000000, 0x200000, CRC(151dd88a) SHA1(87bb1039a9883f721a315760eb2c4abe4a94046f) )
- ROM_LOAD( "sk-101.u20", 0x200000, 0x100000, CRC(779cce23) SHA1(70147b36d982524ba9921823e481ce8fbb5daa26) )
+ ROM_LOAD( "sk-100-00.u24", 0x000000, 0x200000, CRC(151dd88a) SHA1(87bb1039a9883f721a315760eb2c4abe4a94046f) )
+ ROM_LOAD( "sk-101.u20", 0x200000, 0x100000, CRC(779cce23) SHA1(70147b36d982524ba9921823e481ce8fbb5daa26) )
ROM_REGION( 0x200000, "gfx2", 0 )
- ROM_LOAD( "sk200-00.u16", 0x000000, 0x200000, CRC(2e297c61) SHA1(4071b945a1294fbc3d18fab1f144bf09af4349e8) )
+ ROM_LOAD( "sk-200-00.u16", 0x000000, 0x200000, CRC(2e297c61) SHA1(4071b945a1294fbc3d18fab1f144bf09af4349e8) )
ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
/* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
/* 0x040000 - 0x3fffff empty? */
ROM_REGION( 0x200000, "ymz", 0 ) /* Samples */
- ROM_LOAD( "sk300-00.u4", 0x000000, 0x200000, CRC(e6535c05) SHA1(8895b7c326e0261691cb184887ac1ca637302460) )
+ ROM_LOAD( "sk-300-00.u4", 0x000000, 0x200000, CRC(e6535c05) SHA1(8895b7c326e0261691cb184887ac1ca637302460) )
ROM_END
ROM_START( sarukani )
@@ -1790,18 +1838,18 @@ ROM_START( sarukani )
ROM_LOAD16_BYTE( "sk1j1.u8", 0x000001, 0x080000, CRC(3b6aa343) SHA1(a969b20b1170d82351024cab9e37f2fbfd01ddeb) )
ROM_REGION( 0x0400000, "gfx1", 0 )
- ROM_LOAD( "sk100-00.u24", 0x000000, 0x200000, CRC(151dd88a) SHA1(87bb1039a9883f721a315760eb2c4abe4a94046f) )
- ROM_LOAD( "sk-101.u20", 0x200000, 0x100000, CRC(779cce23) SHA1(70147b36d982524ba9921823e481ce8fbb5daa26) )
+ ROM_LOAD( "sk-100-00.u24", 0x000000, 0x200000, CRC(151dd88a) SHA1(87bb1039a9883f721a315760eb2c4abe4a94046f) )
+ ROM_LOAD( "sk-101.u20", 0x200000, 0x100000, CRC(779cce23) SHA1(70147b36d982524ba9921823e481ce8fbb5daa26) )
ROM_REGION( 0x200000, "gfx2", 0 )
- ROM_LOAD( "sk200-00.u16", 0x000000, 0x200000, CRC(2e297c61) SHA1(4071b945a1294fbc3d18fab1f144bf09af4349e8) )
+ ROM_LOAD( "sk-200-00.u16", 0x000000, 0x200000, CRC(2e297c61) SHA1(4071b945a1294fbc3d18fab1f144bf09af4349e8) )
ROM_REGION( 0x400000, "gfx3", ROMREGION_ERASE00 ) /* Tiles Plane B */
/* First 0x040000 bytes (0x03ff Tiles) are RAM Based Tiles */
/* 0x040000 - 0x3fffff empty? */
ROM_REGION( 0x200000, "ymz", 0 ) /* Samples */
- ROM_LOAD( "sk300-00.u4", 0x000000, 0x200000, CRC(e6535c05) SHA1(8895b7c326e0261691cb184887ac1ca637302460) )
+ ROM_LOAD( "sk-300-00.u4", 0x000000, 0x200000, CRC(e6535c05) SHA1(8895b7c326e0261691cb184887ac1ca637302460) )
ROM_END
@@ -1825,7 +1873,8 @@ GAME( 1997, jjparad2, skns, sknsj, skns_1p, skns_state, jjparad2, ROT0,
GAME( 1997, sengekis, skns, sknsa, skns, skns_state, sengekis, ROT90, "Kaneko / Warashi", "Sengeki Striker (Asia)", MACHINE_IMPERFECT_GRAPHICS )
GAME( 1997, sengekisj, sengekis, sknsj, skns, skns_state, sengekij, ROT90, "Kaneko / Warashi", "Sengeki Striker (Japan)", MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1997, vblokbrk, skns, sknsa, vblokbrk, skns_state, sarukani, ROT0, "Kaneko / Mediaworks", "VS Block Breaker (Asia)", MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1997, vblokbrk, skns, sknse, vblokbrk, skns_state, sarukani, ROT0, "Kaneko / Mediaworks", "VS Block Breaker (Europe)", MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1997, vblokbrka, vblokbrk, sknsa, vblokbrk, skns_state, sarukani, ROT0, "Kaneko / Mediaworks", "VS Block Breaker (Asia)", MACHINE_IMPERFECT_GRAPHICS )
GAME( 1997, sarukani, vblokbrk, sknsj, vblokbrk, skns_state, sarukani, ROT0, "Kaneko / Mediaworks", "Saru-Kani-Hamu-Zou (Japan)", MACHINE_IMPERFECT_GRAPHICS )
GAME( 1998, cyvern, skns, sknsu, cyvern, skns_state, cyvern, ROT90, "Kaneko", "Cyvern (US)", MACHINE_IMPERFECT_GRAPHICS )
@@ -1841,7 +1890,8 @@ GAME( 1998, puzzloopu, puzzloop, sknsu, puzzloop, skns_state, puzzloopu, ROT0,
GAME( 1998, ryouran , skns, sknsj, skns_1p, skns_state, ryouran, ROT0, "Electro Design", "VS Mahjong Otome Ryouran (set 1)", MACHINE_IMPERFECT_GRAPHICS )
GAME( 1998, ryourano, ryouran, sknsj, skns_1p, skns_state, ryouran, ROT0, "Electro Design", "VS Mahjong Otome Ryouran (set 2)", MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1999, galpans2, skns, sknsj, galpanis, skns_state, galpans2, ROT0, "Kaneko", "Gals Panic S2 (Japan)", MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1999, galpans2, skns, sknse, galpanis, skns_state, galpans2, ROT0, "Kaneko", "Gals Panic S2 (Europe)", MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1999, galpans2j, galpans2, sknsj, galpanis, skns_state, galpans2, ROT0, "Kaneko", "Gals Panic S2 (Japan)", MACHINE_IMPERFECT_GRAPHICS )
GAME( 1999, galpans2a, galpans2, sknsa, galpanis, skns_state, galpans2, ROT0, "Kaneko", "Gals Panic S2 (Asia)", MACHINE_IMPERFECT_GRAPHICS )
GAME( 1999, galpansu, galpans2, sknsk, galpanis, skns_state, galpans2, ROT0, "Kaneko", "Gals Panic SU (Korea)", MACHINE_IMPERFECT_GRAPHICS ) // official or hack?
diff --git a/src/mame/drivers/taito_f3.cpp b/src/mame/drivers/taito_f3.cpp
index e3cecd934c1..0606a1e194f 100644
--- a/src/mame/drivers/taito_f3.cpp
+++ b/src/mame/drivers/taito_f3.cpp
@@ -4208,11 +4208,11 @@ GAME( 1994, hthero94, intcup94, f3_224a, f3, taito_f3_state, intcup94, ROT0, "
GAME( 1994, kaiserkn, 0, f3_224a, kn, taito_f3_state, kaiserkn, ROT0, "Taito Corporation Japan", "Kaiser Knuckle (Ver 2.1O 1994/07/29)", 0 )
GAME( 1994, kaiserknj,kaiserkn, f3_224a, kn, taito_f3_state, kaiserkn, ROT0, "Taito Corporation", "Kaiser Knuckle (Ver 2.1J 1994/07/29)", 0 )
GAME( 1994, gblchmp, kaiserkn, f3_224a, kn, taito_f3_state, kaiserkn, ROT0, "Taito America Corporation", "Global Champion (Ver 2.1A 1994/07/29)", 0 )
-GAME( 1994, dankuga, kaiserkn, f3_224a, kn, taito_f3_state, kaiserkn, ROT0, "Taito Corporation", "Dan-Ku-Ga (Ver 0.0J 1994/12/13, prototype)", 0 )
+GAME( 1994, dankuga, 0, f3_224a, kn, taito_f3_state, kaiserkn, ROT0, "Taito Corporation", "Dan-Ku-Ga (Ver 0.0J 1994/12/13, prototype)", 0 )
GAME( 1994, dariusg, 0, f3, f3, taito_f3_state, dariusg, ROT0, "Taito Corporation Japan", "Darius Gaiden - Silver Hawk (Ver 2.5O 1994/09/19)", 0 )
GAME( 1994, dariusgj, dariusg, f3, f3, taito_f3_state, dariusg, ROT0, "Taito Corporation", "Darius Gaiden - Silver Hawk (Ver 2.5J 1994/09/19)", 0 )
GAME( 1994, dariusgu, dariusg, f3, f3, taito_f3_state, dariusg, ROT0, "Taito America Corporation", "Darius Gaiden - Silver Hawk (Ver 2.5A 1994/09/19)", 0 )
-GAME( 1994, dariusgx, dariusg, f3, f3, taito_f3_state, dariusg, ROT0, "Taito Corporation", "Darius Gaiden - Silver Hawk Extra Version (Ver 2.7J 1995/03/06) (Official Hack)", 0 )
+GAME( 1994, dariusgx, 0, f3, f3, taito_f3_state, dariusg, ROT0, "Taito Corporation", "Darius Gaiden - Silver Hawk Extra Version (Ver 2.7J 1995/03/06) (Official Hack)", 0 )
GAME( 1994, bublbob2, 0, f3_224a, f3, taito_f3_state, bubsymph, ROT0, "Taito Corporation Japan", "Bubble Bobble II (Ver 2.6O 1994/12/16)", 0 )
GAME( 1994, bublbob2o,bublbob2, f3_224a, f3, taito_f3_state, bubsymph, ROT0, "Taito Corporation Japan", "Bubble Bobble II (Ver 2.5O 1994/10/05)", 0 )
GAME( 1994, bublbob2p,bublbob2, f3_224a, f3, taito_f3_state, bubsymph, ROT0, "Taito Corporation Japan", "Bubble Bobble II (Ver 0.0J 1993/12/13, prototype)", 0 )
diff --git a/src/mame/drivers/taito_l.cpp b/src/mame/drivers/taito_l.cpp
index e2366c02cb0..268e222bdc3 100644
--- a/src/mame/drivers/taito_l.cpp
+++ b/src/mame/drivers/taito_l.cpp
@@ -1881,7 +1881,7 @@ static MACHINE_CONFIG_DERIVED( puzznic, plotting )
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_PROGRAM_MAP(puzznic_map)
- MCFG_DEVICE_ADD("mcu", ARKANOID_68705P3, XTAL_13_33056MHz / 4) /* clock is complete guess */
+ MCFG_DEVICE_ADD("mcu", ARKANOID_68705P3, XTAL_3MHz)
MCFG_MACHINE_RESET_OVERRIDE(taitol_1cpu_state, puzznic)
MACHINE_CONFIG_END
@@ -2291,7 +2291,7 @@ ROM_START( puzznic )
ROM_LOAD( "c20-09.ic11", 0x00000, 0x20000, CRC(156d6de1) SHA1(c247936b62ef354851c9bace76a7a0aa14194d5f) )
ROM_REGION( 0x0800, "mcu:mcu", 0 ) /* 2k for the microcontroller */
- ROM_LOAD( "mc68705p3.ic4", 0x0000, 0x0800, CRC(085f68b4) SHA1(2dbc7e2c015220dc59ee1f1208540744e5b9b7cc) )
+ ROM_LOAD( "c20-01.ic4", 0x0000, 0x0800, CRC(085f68b4) SHA1(2dbc7e2c015220dc59ee1f1208540744e5b9b7cc) )
ROM_REGION( 0x20000, "gfx1", 0 )
ROM_LOAD16_BYTE( "c20-07.ic10", 0x00000, 0x10000, CRC(be12749a) SHA1(c67d1a434486843a6776d89e905362b7db595d8d) )
@@ -2301,12 +2301,27 @@ ROM_START( puzznic )
ROM_LOAD( "mmipal20l8.ic3", 0x0000, 0x0800, NO_DUMP )
ROM_END
+ROM_START( puzznicu )
+ ROM_REGION( 0x20000, "maincpu", 0 )
+ ROM_LOAD( "c20-10.ic11", 0x00000, 0x20000, CRC(3522d2e5) SHA1(2428663d1d71f2920c69cd2cd907f0750c22af77) )
+
+ ROM_REGION( 0x0800, "mcu:mcu", 0 ) /* 2k for the microcontroller */
+ ROM_LOAD( "c20-01.ic4", 0x0000, 0x0800, CRC(085f68b4) SHA1(2dbc7e2c015220dc59ee1f1208540744e5b9b7cc) )
+
+ ROM_REGION( 0x40000, "gfx1", 0 )
+ ROM_LOAD16_BYTE( "c20-03.ic10", 0x00000, 0x20000, CRC(4264056c) SHA1(d2d8a170ae0f361093a5384935238605a59e5938) )
+ ROM_LOAD16_BYTE( "c20-02.ic9", 0x00001, 0x20000, CRC(3c115f8b) SHA1(8d518be01b7c4d6d993d5d9b62aab719a5c8baca) )
+
+ ROM_REGION( 0x0800, "pals", 0 )
+ ROM_LOAD( "mmipal20l8.ic3", 0x0000, 0x0800, NO_DUMP )
+ROM_END
+
ROM_START( puzznicj )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_LOAD( "c20-04.ic11", 0x00000, 0x20000, CRC(a4150b6c) SHA1(27719b8993735532cd59f4ed5693ff3143ee2336) )
ROM_REGION( 0x0800, "mcu:mcu", 0 ) /* 2k for the microcontroller */
- ROM_LOAD( "mc68705p3.ic4", 0x0000, 0x0800, CRC(085f68b4) SHA1(2dbc7e2c015220dc59ee1f1208540744e5b9b7cc) )
+ ROM_LOAD( "c20-01.ic4", 0x0000, 0x0800, CRC(085f68b4) SHA1(2dbc7e2c015220dc59ee1f1208540744e5b9b7cc) )
ROM_REGION( 0x40000, "gfx1", 0 )
ROM_LOAD16_BYTE( "c20-03.ic10", 0x00000, 0x20000, CRC(4264056c) SHA1(d2d8a170ae0f361093a5384935238605a59e5938) )
@@ -2555,6 +2570,7 @@ GAME( 1989, plottingu, plotting, plotting, plottingu, driver_device, 0,
GAME( 1989, flipull, plotting, plotting, plotting, driver_device, 0, ROT0, "Taito Corporation", "Flipull (Japan)", 0 )
GAME( 1989, puzznic, 0, puzznic, puzznic, driver_device, 0, ROT0, "Taito Corporation Japan", "Puzznic (World)", 0 )
+GAME( 1989, puzznicu, puzznic, puzznic, puzznic, driver_device, 0, ROT0, "Taito America Corporation", "Puzznic (US)", 0 )
GAME( 1989, puzznicj, puzznic, puzznic, puzznic, driver_device, 0, ROT0, "Taito Corporation", "Puzznic (Japan)", 0 )
GAME( 1989, puzznici, puzznic, puzznici, puzznic, driver_device, 0, ROT0, "bootleg", "Puzznic (Italian bootleg)", 0 )
GAME( 1989, puzznicb, puzznic, puzznici, puzznic, driver_device, 0, ROT0, "bootleg", "Puzznic (bootleg, set 1)", 0 )
diff --git a/src/mame/drivers/taitosj.cpp b/src/mame/drivers/taitosj.cpp
index a61b3187e1b..1e3d6578a6a 100644
--- a/src/mame/drivers/taitosj.cpp
+++ b/src/mame/drivers/taitosj.cpp
@@ -557,7 +557,7 @@ static INPUT_PORTS_START( spacecr )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_NAME("P1 Continue")
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
@@ -567,7 +567,7 @@ static INPUT_PORTS_START( spacecr )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_COCKTAIL
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Continue")
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
diff --git a/src/mame/drivers/tb303.cpp b/src/mame/drivers/tb303.cpp
index f76c39e5dc0..c15c61e1dab 100644
--- a/src/mame/drivers/tb303.cpp
+++ b/src/mame/drivers/tb303.cpp
@@ -26,8 +26,8 @@ public:
: hh_ucom4_state(mconfig, type, tag)
{ }
- uint8_t m_ram[0xc00];
- uint16_t m_ram_address;
+ u8 m_ram[0xc00];
+ u16 m_ram_address;
bool m_ram_ce;
bool m_ram_we;
@@ -67,7 +67,7 @@ void tb303_state::refresh_ram()
// MCU E2,E3 goes through a 4556 IC(pin 14,13) to one of uPD444 _CE:
// _Q0: N/C, _Q1: IC-5, _Q2: IC-3, _Q3: IC-4
m_ram_ce = true;
- uint8_t hi = 0;
+ u8 hi = 0;
switch (m_port[NEC_UCOM4_PORTE] >> 2 & 3)
{
case 0: m_ram_ce = false; break;
diff --git a/src/mame/drivers/tempest.cpp b/src/mame/drivers/tempest.cpp
index ed90b761427..52aa2e411b1 100644
--- a/src/mame/drivers/tempest.cpp
+++ b/src/mame/drivers/tempest.cpp
@@ -477,7 +477,7 @@ static INPUT_PORTS_START( tempest )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_TILT )
PORT_SERVICE( 0x10, IP_ACTIVE_LOW )
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME("Diagnostic Step") PORT_CODE(KEYCODE_F1)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_NAME("Diagnostic Step")
/* bit 6 is the VG HALT bit. We set it to "low" */
/* per default (busy vector processor). */
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER("avg", avg_tempest_device, done_r, nullptr)
diff --git a/src/mame/drivers/thayers.cpp b/src/mame/drivers/thayers.cpp
index 3b978e2d41f..5a6653b750a 100644
--- a/src/mame/drivers/thayers.cpp
+++ b/src/mame/drivers/thayers.cpp
@@ -19,6 +19,7 @@
#include "cpu/cop400/cop400.h"
#include "thayers.lh"
+#define LOG 0
struct ssi263_t
{
@@ -56,6 +57,9 @@ public:
uint8_t m_laserdisc_data;
int m_rx_bit;
int m_keylatch;
+ uint8_t m_keydata;
+ bool m_kbdata;
+ bool m_kbclk;
uint8_t m_cop_data_latch;
int m_cop_data_latch_enable;
uint8_t m_cop_l;
@@ -78,8 +82,8 @@ public:
DECLARE_READ8_MEMBER(cop_g_r);
DECLARE_WRITE8_MEMBER(control_w);
DECLARE_WRITE8_MEMBER(cop_g_w);
- DECLARE_READ_LINE_MEMBER(cop_si_r);
- DECLARE_WRITE_LINE_MEMBER(cop_so_w);
+ DECLARE_READ_LINE_MEMBER(kbdata_r);
+ DECLARE_WRITE_LINE_MEMBER(kbclk_w);
DECLARE_WRITE8_MEMBER(control2_w);
DECLARE_READ8_MEMBER(dsw_b_r);
DECLARE_READ8_MEMBER(laserdsc_data_r);
@@ -125,7 +129,7 @@ void thayers_state::check_interrupt()
{
if (!m_timer_int || !m_data_rdy_int || !m_ssi_data_request)
{
- m_maincpu->set_input_line(INPUT_LINE_IRQ0, HOLD_LINE);
+ m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE);
}
else
{
@@ -137,7 +141,7 @@ WRITE8_MEMBER(thayers_state::intrq_w)
{
// T = 1.1 * R30 * C53 = 1.1 * 750K * 0.01uF = 8.25 ms
- m_maincpu->set_input_line(INPUT_LINE_IRQ0, HOLD_LINE);
+ m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE);
timer_set(attotime::from_usec(8250), TIMER_INTRQ_TICK);
}
@@ -159,11 +163,13 @@ READ8_MEMBER(thayers_state::irqstate_r)
*/
- return (m_data_rdy_int << 5) | (m_timer_int << 4) | 0x08 | (m_ssi_data_request << 2);
+ return m_cart_present << 6 | (m_data_rdy_int << 5) | (m_timer_int << 4) | 0x08 | (m_ssi_data_request << 2);
}
WRITE8_MEMBER(thayers_state::timer_int_ack_w)
{
+ if (LOG) logerror("%s %s TIMER INT ACK\n", machine().time().as_string(), machine().describe_context());
+
m_timer_int = 1;
check_interrupt();
@@ -171,6 +177,8 @@ WRITE8_MEMBER(thayers_state::timer_int_ack_w)
WRITE8_MEMBER(thayers_state::data_rdy_int_ack_w)
{
+ if (LOG) logerror("%s %s DATA RDY INT ACK\n", machine().time().as_string(), machine().describe_context());
+
m_data_rdy_int = 1;
check_interrupt();
@@ -191,11 +199,13 @@ WRITE8_MEMBER(thayers_state::cop_d_w)
if (!BIT(data, 0))
{
+ if (LOG) logerror("%s %s TIMER INT\n", machine().time().as_string(), machine().describe_context());
m_timer_int = 0;
}
if (!BIT(data, 1))
{
+ if (LOG) logerror("%s %s DATA RDY INT\n", machine().time().as_string(), machine().describe_context());
m_data_rdy_int = 0;
}
@@ -219,6 +229,7 @@ READ8_MEMBER(thayers_state::cop_data_r)
WRITE8_MEMBER(thayers_state::cop_data_w)
{
m_cop_data_latch = data;
+ if (LOG) logerror("COP DATA %02x\n", m_cop_data_latch);
}
READ8_MEMBER(thayers_state::cop_l_r)
@@ -236,6 +247,7 @@ READ8_MEMBER(thayers_state::cop_l_r)
WRITE8_MEMBER(thayers_state::cop_l_w)
{
m_cop_l = data;
+ if (LOG) logerror("COP L %02x\n", m_cop_l);
}
READ8_MEMBER(thayers_state::cop_g_r)
@@ -272,6 +284,7 @@ WRITE8_MEMBER(thayers_state::control_w)
*/
m_cop_cmd_latch = (data >> 5) & 0x07;
+ if (LOG) logerror("COP G0..2 %u\n", m_cop_cmd_latch);
}
WRITE8_MEMBER(thayers_state::cop_g_w)
@@ -288,63 +301,66 @@ WRITE8_MEMBER(thayers_state::cop_g_w)
*/
m_cop_data_latch_enable = BIT(data, 3);
+ if (LOG) logerror("U17 enable %u\n", m_cop_data_latch_enable);
}
/* Keyboard */
-READ_LINE_MEMBER(thayers_state::cop_si_r)
+READ_LINE_MEMBER(thayers_state::kbdata_r)
{
- /* keyboard data */
-
- /*
-
- Serial communications format
-
- 1, 1, 0, 1, Q8, P0, P1, P2, P3, 0
-
- */
-
- switch (m_rx_bit)
- {
- case 0:
- case 1:
- case 3:
- return 1;
-
- case 4:
- return (m_keylatch == 9);
-
- case 5:
- case 6:
- case 7:
- case 8:
- return BIT(m_row[m_keylatch]->read(), m_rx_bit - 5);
-
- default:
- return 0;
- }
+ if (LOG) logerror("%s KBDATA %u BIT %u\n",machine().time().as_string(),m_kbdata,m_rx_bit);
+ return m_kbdata;
}
-WRITE_LINE_MEMBER(thayers_state::cop_so_w)
+WRITE_LINE_MEMBER(thayers_state::kbclk_w)
{
- /* keyboard clock */
+ if (m_kbclk != state) {
+ if (LOG) logerror("%s %s KBCLK %u\n", machine().time().as_string(), machine().describe_context(),state);
+ }
- if (state)
- {
+ if (!m_kbclk && state) {
m_rx_bit++;
- if (m_rx_bit == 10)
+ // 1, 1, 0, 1, Q9, P3, P2, P1, P0, 0
+ switch (m_rx_bit)
{
+ case 0: case 1: case 3:
+ m_kbdata = 1;
+ break;
+
+ case 2: case 9:
+ m_kbdata = 0;
+ break;
+
+ case 10:
m_rx_bit = 0;
+ m_kbdata = 1;
m_keylatch++;
- if (m_keylatch == 10)
- {
+ if (m_keylatch == 10) {
m_keylatch = 0;
}
+
+ m_keydata = m_row[m_keylatch]->read();
+
+ if (LOG) logerror("keylatch %u\n",m_keylatch);
+ break;
+
+ case 4:
+ m_kbdata = (m_keylatch == 9);
+ break;
+
+ default:
+ m_kbdata = BIT(m_keydata, 3);
+ m_keydata <<= 1;
+
+ if (LOG) logerror("keydata %02x shift\n",m_keydata);
+ break;
}
}
+
+ m_kbclk = state;
}
/* I/O Board */
@@ -477,13 +493,11 @@ WRITE8_MEMBER(thayers_state::den2_w)
#define SSI263_CLOCK (XTAL_4MHz/2)
-#if 0
static const char SSI263_PHONEMES[0x40][5] =
{
"PA", "E", "E1", "Y", "YI", "AY", "IE", "I", "A", "AI", "EH", "EH1", "AE", "AE1", "AH", "AH1", "W", "O", "OU", "OO", "IU", "IU1", "U", "U1", "UH", "UH1", "UH2", "UH3", "ER", "R", "R1", "R2",
"L", "L1", "LF", "W", "B", "D", "KV", "P", "T", "K", "HV", "HVC", "HF", "HFC", "HN", "Z", "S", "J", "SCH", "V", "F", "THV", "TH", "M", "N", "NG", ":A", ":OH", ":U", ":UH", "E2", "LB"
};
-#endif
WRITE8_MEMBER(thayers_state::ssi263_register_w)
{
@@ -520,6 +534,7 @@ WRITE8_MEMBER(thayers_state::ssi263_register_w)
//logerror("SSI263 Phoneme Duration: %u\n", ssi263.dr);
//logerror("SSI263 Phoneme: %02x %s\n", ssi263.p, SSI263_PHONEMES[ssi263.p]);
+ if (LOG && ssi263.p) printf("%s ", SSI263_PHONEMES[ssi263.p]);
}
break;
@@ -677,64 +692,64 @@ static INPUT_PORTS_START( thayers )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, thayers_state,laserdisc_ready_r, nullptr)
PORT_START("ROW.0")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "2" ) PORT_CODE( KEYCODE_F2 )
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "1 - Clear" ) PORT_CODE( KEYCODE_BACKSPACE )
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "Q" ) PORT_CODE( KEYCODE_Q )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( DEF_STR( Yes ) ) PORT_CODE( KEYCODE_0_PAD )
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("1 YES") PORT_CODE(KEYCODE_1)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F1 CLEAR") PORT_CODE(KEYCODE_F1) PORT_CODE(KEYCODE_BACKSPACE)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2)
PORT_START("ROW.1")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "Z - Spell of Release" ) PORT_CODE( KEYCODE_Z )
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "A" ) PORT_CODE( KEYCODE_A )
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "W - Amulet" ) PORT_CODE( KEYCODE_W )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "Items" ) PORT_CODE( KEYCODE_1_PAD )
-
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("2 ITEMS") PORT_CODE(KEYCODE_2)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("W AMULET") PORT_CODE(KEYCODE_W)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Z SPELL OF RELEASE") PORT_CODE(KEYCODE_Z)
+
PORT_START("ROW.2")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "X - Scepter" ) PORT_CODE( KEYCODE_X )
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "S - Dagger" ) PORT_CODE( KEYCODE_S )
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "E - Black Mace" ) PORT_CODE( KEYCODE_E )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "Drop Item" ) PORT_CODE( KEYCODE_2_PAD )
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("3 DROP ITEM") PORT_CODE(KEYCODE_3)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("E BLACK MACE") PORT_CODE(KEYCODE_E)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("S DAGGER") PORT_CODE(KEYCODE_S)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("X SCEPTER") PORT_CODE(KEYCODE_X)
PORT_START("ROW.3")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "C - Spell of Seeing" ) PORT_CODE( KEYCODE_C )
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "D - Great Circlet" ) PORT_CODE( KEYCODE_D )
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "R - Blood Sword" ) PORT_CODE( KEYCODE_R )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "Give Score" ) PORT_CODE( KEYCODE_3_PAD )
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("4 GIVE SCORE") PORT_CODE(KEYCODE_4)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("R BLOOD SWORD") PORT_CODE(KEYCODE_R)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("D GREAT CIRCLET") PORT_CODE(KEYCODE_D)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("C SPELL OF SEEING") PORT_CODE(KEYCODE_C)
PORT_START("ROW.4")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "V - Shield" ) PORT_CODE( KEYCODE_V )
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "F - Hunting Horn" ) PORT_CODE( KEYCODE_F )
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "T - Chalice" ) PORT_CODE( KEYCODE_T )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "Replay" ) PORT_CODE( KEYCODE_4_PAD )
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("5 REPLAY") PORT_CODE(KEYCODE_5)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("T CHALICE") PORT_CODE(KEYCODE_T)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F HUNTING HORN") PORT_CODE(KEYCODE_F)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("V SHIELD") PORT_CODE(KEYCODE_V)
PORT_START("ROW.5")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "B - Silver Wheat" ) PORT_CODE( KEYCODE_B )
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "G - Long Bow" ) PORT_CODE( KEYCODE_G )
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "Y - Coins" ) PORT_CODE( KEYCODE_Y )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "Combine Action" ) PORT_CODE( KEYCODE_6_PAD )
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("6 COMBINE ACTION") PORT_CODE(KEYCODE_6)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Y COINS") PORT_CODE(KEYCODE_Y)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("G LONG BOW") PORT_CODE(KEYCODE_G)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("B SILVER WHEAT") PORT_CODE(KEYCODE_B)
PORT_START("ROW.6")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "N - Staff" ) PORT_CODE( KEYCODE_N )
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "H - Medallion" ) PORT_CODE( KEYCODE_H )
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "U - Cold Fire" ) PORT_CODE( KEYCODE_U )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "Save Game" ) PORT_CODE( KEYCODE_7_PAD )
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("7 SAVE GAME") PORT_CODE(KEYCODE_7)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("U COLD FIRE") PORT_CODE(KEYCODE_U)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("H MEDALLION") PORT_CODE(KEYCODE_H)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("N STAFF") PORT_CODE(KEYCODE_N)
PORT_START("ROW.7")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "M - Spell of Understanding" ) PORT_CODE( KEYCODE_M )
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "J - Onyx Seal" ) PORT_CODE( KEYCODE_J )
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "I - Crown" ) PORT_CODE( KEYCODE_I )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "Update" ) PORT_CODE( KEYCODE_8_PAD )
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("8 UPDATE") PORT_CODE(KEYCODE_8)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("I CROWN") PORT_CODE(KEYCODE_I)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("J ONYX SEAL") PORT_CODE(KEYCODE_J)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("M SPELL OF UNDERSTANDING") PORT_CODE(KEYCODE_M)
PORT_START("ROW.8")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "3 - Enter" ) PORT_CODE( KEYCODE_ENTER )
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "K - Orb of Quoid" ) PORT_CODE( KEYCODE_K )
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "O - Crystal" ) PORT_CODE( KEYCODE_O )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "Hint" ) PORT_CODE( KEYCODE_9_PAD )
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("9 HINT") PORT_CODE(KEYCODE_9)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("O CRYSTAL") PORT_CODE(KEYCODE_O)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("K ORB OF QUOID") PORT_CODE(KEYCODE_K)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F4 SPACE") PORT_CODE(KEYCODE_F4) PORT_CODE(KEYCODE_SPACE)
PORT_START("ROW.9")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "4 - Space" ) PORT_CODE( KEYCODE_SPACE )
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "L" ) PORT_CODE( KEYCODE_L )
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( "P" ) PORT_CODE( KEYCODE_P )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME( DEF_STR( No ) ) PORT_CODE( KEYCODE_0_PAD )
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("0 NO") PORT_CODE(KEYCODE_0)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("F3 ENTER") PORT_CODE(KEYCODE_F3) PORT_CODE(KEYCODE_ENTER)
INPUT_PORTS_END
/* Machine Initialization */
@@ -749,7 +764,9 @@ void thayers_state::machine_reset()
m_laserdisc_data = 0;
m_rx_bit = 0;
+ m_kbdata = 1;
m_keylatch = 0;
+ m_keydata = m_row[m_keylatch]->read();
m_cop_data_latch = 0;
m_cop_data_latch_enable = 0;
@@ -762,9 +779,6 @@ void thayers_state::machine_reset()
m_cart_present = 0;
m_pr7820_enter = 0;
-
-// newtype = (ioport("DSWB")->read() & 0x18) ? LASERDISC_TYPE_PIONEER_LDV1000 : LASERDISC_TYPE_PIONEER_PR7820;
-// laserdisc_set_type(m_laserdisc, newtype);
}
/* Machine Driver */
@@ -783,8 +797,8 @@ static MACHINE_CONFIG_START( thayers, thayers_state )
MCFG_COP400_READ_G_CB(READ8(thayers_state, cop_g_r))
MCFG_COP400_WRITE_G_CB(WRITE8(thayers_state, cop_g_w))
MCFG_COP400_WRITE_D_CB(WRITE8(thayers_state, cop_d_w))
- MCFG_COP400_READ_SI_CB(READLINE(thayers_state, cop_si_r))
- MCFG_COP400_WRITE_SO_CB(WRITELINE(thayers_state, cop_so_w))
+ MCFG_COP400_READ_SI_CB(READLINE(thayers_state, kbdata_r))
+ MCFG_COP400_WRITE_SO_CB(WRITELINE(thayers_state, kbclk_w))
MCFG_LASERDISC_PR7820_ADD("laserdisc")
diff --git a/src/mame/drivers/ti74.cpp b/src/mame/drivers/ti74.cpp
index 3307a0d3473..7ae4ab0b623 100644
--- a/src/mame/drivers/ti74.cpp
+++ b/src/mame/drivers/ti74.cpp
@@ -97,10 +97,10 @@ public:
required_ioport_array<8> m_key_matrix;
required_ioport m_battery_inp;
- uint8_t m_key_select;
- uint8_t m_power;
+ u8 m_key_select;
+ u8 m_power;
- void update_lcd_indicator(uint8_t y, uint8_t x, int state);
+ void update_lcd_indicator(u8 y, u8 x, int state);
void update_battery_status(int state);
DECLARE_READ8_MEMBER(keyboard_r);
@@ -126,7 +126,7 @@ public:
DEVICE_IMAGE_LOAD_MEMBER(ti74_state, ti74_cartridge)
{
- uint32_t size = m_cart->common_get_size("rom");
+ u32 size = m_cart->common_get_size("rom");
// max size is 32KB
if (size > 0x8000)
@@ -156,7 +156,7 @@ PALETTE_INIT_MEMBER(ti74_state, ti74)
palette.set_pen_color(2, rgb_t(131, 136, 139)); // lcd pixel off
}
-void ti74_state::update_lcd_indicator(uint8_t y, uint8_t x, int state)
+void ti74_state::update_lcd_indicator(u8 y, u8 x, int state)
{
// TI-74 ref._________________...
// output# |10 11 12 13 14 2 3 4
@@ -229,7 +229,7 @@ HD44780_PIXEL_UPDATE(ti74_state::ti95_pixel_update)
READ8_MEMBER(ti74_state::keyboard_r)
{
- uint8_t ret = 0;
+ u8 ret = 0;
// read selected keyboard rows
for (int i = 0; i < 8; i++)
@@ -266,7 +266,7 @@ static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, ti74_state )
ADDRESS_MAP_UNMAP_HIGH
AM_RANGE(0x1000, 0x1001) AM_DEVREADWRITE("hd44780", hd44780_device, read, write)
AM_RANGE(0x2000, 0x3fff) AM_RAM AM_SHARE("sysram.ic3")
- //AM_RANGE(0x4000, 0xbfff) // mapped by the cartslot
+ //AM_RANGE(0x4000, 0xbfff) // mapped by the cartslot
AM_RANGE(0xc000, 0xdfff) AM_ROMBANK("sysbank")
ADDRESS_MAP_END
diff --git a/src/mame/drivers/ticalc1x.cpp b/src/mame/drivers/ticalc1x.cpp
index 5a56e557238..2eec28f1d22 100644
--- a/src/mame/drivers/ticalc1x.cpp
+++ b/src/mame/drivers/ticalc1x.cpp
@@ -76,11 +76,11 @@ void cmulti8_state::prepare_display()
set_display_segmask(0xfffff, 0xff);
// M-digit is on in memory mode, upper row is off in single mode
- uint32_t m = (m_inp_matrix[10]->read() & 0x10) ? 0x100000 : 0;
- uint32_t mask = (m_inp_matrix[10]->read() & 0x20) ? 0xfffff : 0xffc00;
+ u32 m = (m_inp_matrix[10]->read() & 0x10) ? 0x100000 : 0;
+ u32 mask = (m_inp_matrix[10]->read() & 0x20) ? 0xfffff : 0xffc00;
// R10 selects display row
- uint32_t sel = (m_r & 0x400) ? (m_r & 0x3ff) : (m_r << 10 & 0xffc00);
+ u32 sel = (m_r & 0x400) ? (m_r & 0x3ff) : (m_r << 10 & 0xffc00);
display_matrix(8, 21, m_o, (sel & mask) | m);
}
@@ -865,8 +865,8 @@ public:
WRITE16_MEMBER(lilprof78_state::write_r)
{
// update leds state
- uint8_t seg = BITSWAP8(m_o,7,4,3,2,1,0,6,5) & 0x7f;
- uint16_t r = (data & 7) | (data << 1 & 0x1f0);
+ u8 seg = BITSWAP8(m_o,7,4,3,2,1,0,6,5) & 0x7f;
+ u16 r = (data & 7) | (data << 1 & 0x1f0);
set_display_segmask(0x1ff, 0x7f);
display_matrix(7, 9, seg, r, false);
diff --git a/src/mame/drivers/tigeroad.cpp b/src/mame/drivers/tigeroad.cpp
index ae4d234dfac..25164f91ad0 100644
--- a/src/mame/drivers/tigeroad.cpp
+++ b/src/mame/drivers/tigeroad.cpp
@@ -84,9 +84,18 @@ static ADDRESS_MAP_START( main_map, AS_PROGRAM, 16, tigeroad_state )
AM_RANGE(0xffc000, 0xffffff) AM_RAM AM_SHARE("ram16")
ADDRESS_MAP_END
-static ADDRESS_MAP_START( bballs_map, AS_PROGRAM, 16, tigeroad_state )
+static ADDRESS_MAP_START( pushman_map, AS_PROGRAM, 16, pushman_state )
+ AM_IMPORT_FROM(main_map)
+
+ AM_RANGE(0x060000, 0x060007) AM_READ(mcu_comm_r)
+ AM_RANGE(0x060000, 0x060003) AM_WRITE(pushman_mcu_comm_w)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( bballs_map, AS_PROGRAM, 16, pushman_state )
ADDRESS_MAP_GLOBAL_MASK(0xfffff)
AM_RANGE(0x00000, 0x3ffff) AM_ROM
+ AM_RANGE(0x60000, 0x60007) AM_READ(mcu_comm_r)
+ AM_RANGE(0x60000, 0x60001) AM_WRITE(bballs_mcu_comm_w)
// are these mirror addresses or does this PCB have a different addressing?
AM_RANGE(0xe0800, 0xe17ff) AM_RAM AM_SHARE("spriteram")
AM_RANGE(0xe4000, 0xe4001) AM_READ_PORT("P1_P2") AM_WRITE(tigeroad_videoctrl_w)
@@ -125,13 +134,6 @@ static ADDRESS_MAP_START( sample_port_map, AS_IO, 8, tigeroad_state )
AM_RANGE(0x01, 0x01) AM_WRITE(msm5205_w)
ADDRESS_MAP_END
-/* Pushman ONLY */
-static ADDRESS_MAP_START( mcu_map, AS_PROGRAM, 8, tigeroad_state )
- AM_RANGE(0x0000, 0x0007) AM_READWRITE(pushman_68000_r, pushman_68000_w)
- AM_RANGE(0x0010, 0x007f) AM_RAM
- AM_RANGE(0x0080, 0x0fff) AM_ROM
-ADDRESS_MAP_END
-
/* Pushman / Bouncing Balls */
static ADDRESS_MAP_START( comad_sound_map, AS_PROGRAM, 8, tigeroad_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM
@@ -570,25 +572,6 @@ static GFXDECODE_START( tigeroad )
GFXDECODE_ENTRY( "sprites", 0, sprite_layout, 0x200, 16 )
GFXDECODE_END
-void tigeroad_state::machine_start()
-{
- save_item(NAME(m_control));
- save_item(NAME(m_shared_ram));
- save_item(NAME(m_latch));
- save_item(NAME(m_new_latch));
-}
-
-MACHINE_RESET_MEMBER(tigeroad_state,pushman)
-{
- // todo, move to an MCU sim reset function in machine/tigeroad.c
- m_latch = 0;
- m_new_latch = 0;
- m_control[0] = 0;
- m_control[1] = 0;
-
- memset(m_shared_ram, 0, ARRAY_LENGTH(m_shared_ram));
-}
-
static MACHINE_CONFIG_START( tigeroad, tigeroad_state )
/* basic machine hardware */
@@ -699,25 +682,31 @@ static MACHINE_CONFIG_START( f1dream_comad, tigeroad_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)
MACHINE_CONFIG_END
-static MACHINE_CONFIG_DERIVED( pushman, f1dream_comad )
- MCFG_CPU_ADD("mcu", M68705, 4000000) /* No idea */
- MCFG_CPU_PROGRAM_MAP(mcu_map)
- MCFG_MACHINE_RESET_OVERRIDE(tigeroad_state,pushman)
-MACHINE_CONFIG_END
-
-MACHINE_RESET_MEMBER(tigeroad_state,bballs)
+void pushman_state::machine_start()
{
- MACHINE_RESET_CALL_MEMBER(pushman);
-
- m_latch = 0x400;
+ save_item(NAME(m_host_semaphore));
+ save_item(NAME(m_mcu_semaphore));
+ save_item(NAME(m_host_latch));
+ save_item(NAME(m_mcu_latch));
+ save_item(NAME(m_mcu_output));
+ save_item(NAME(m_mcu_latch_ctl));
}
-static MACHINE_CONFIG_DERIVED( bballs, f1dream_comad )
+static MACHINE_CONFIG_DERIVED_CLASS(pushman, f1dream_comad, pushman_state)
MCFG_CPU_MODIFY("maincpu")
- MCFG_CPU_PROGRAM_MAP(bballs_map)
+ MCFG_CPU_PROGRAM_MAP(pushman_map)
+
+ MCFG_CPU_ADD("mcu", M68705R3, 4000000) /* No idea */
+ MCFG_M68705_PORTA_W_CB(WRITE8(pushman_state, mcu_pa_w))
+ MCFG_M68705_PORTB_W_CB(WRITE8(pushman_state, mcu_pb_w))
+ MCFG_M68705_PORTC_W_CB(WRITE8(pushman_state, mcu_pc_w))
+MACHINE_CONFIG_END
- MCFG_MACHINE_RESET_OVERRIDE(tigeroad_state,bballs)
+
+static MACHINE_CONFIG_DERIVED(bballs, pushman)
+ MCFG_CPU_MODIFY("maincpu")
+ MCFG_CPU_PROGRAM_MAP(bballs_map)
MACHINE_CONFIG_END
@@ -1120,8 +1109,8 @@ ROM_START( bballs )
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "bb13.n4", 0x00000, 0x08000, CRC(1ef78175) SHA1(2e7dcbab3a572c2a6bb67a36ba283a5faeb14a88) )
- ROM_REGION( 0x01000, "cpu2", 0 )
- ROM_LOAD( "68705.uc", 0x00000, 0x01000, NO_DUMP )
+ ROM_REGION( 0x01000, "mcu", 0 ) /* using dump from bballsa set */
+ ROM_LOAD( "mc68705r3.bin", 0x00000, 0x01000, CRC(4b37b853) SHA1(c95b7b1dcc6f4730fd08535001e2f02b34ea14c2) BAD_DUMP )
ROM_REGION( 0x10000, "text", 0 )
ROM_LOAD( "bb1.g20", 0x00000, 0x08000, CRC(b62dbcb8) SHA1(121613f6d2bcd226e71d4ae71830b9b0d15c2331) )
@@ -1153,8 +1142,8 @@ ROM_START( bballsa )
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "13.ic216", 0x00000, 0x08000, CRC(1ef78175) SHA1(2e7dcbab3a572c2a6bb67a36ba283a5faeb14a88) )
- ROM_REGION( 0x01000, "cpu2", 0 )
- ROM_LOAD( "68705.uc", 0x00000, 0x01000, NO_DUMP )
+ ROM_REGION( 0x01000, "mcu", 0 )
+ ROM_LOAD( "mc68705r3.bin", 0x00000, 0x01000, CRC(4b37b853) SHA1(c95b7b1dcc6f4730fd08535001e2f02b34ea14c2) )
ROM_REGION( 0x10000, "text", 0 )
ROM_LOAD( "1.ic130", 0x00000, 0x08000, CRC(67672444) SHA1(f1d4681999d44e8d3cbf26b8a9c05f50573e0df6) )
@@ -1179,41 +1168,29 @@ ROM_START( bballsa )
ROM_END
-DRIVER_INIT_MEMBER(tigeroad_state,f1dream)
+DRIVER_INIT_MEMBER(tigeroad_state, f1dream)
{
m_maincpu->space(AS_PROGRAM).install_write_handler(0xfe4002, 0xfe4003, write16_delegate(FUNC(tigeroad_state::f1dream_control_w),this));
}
-DRIVER_INIT_MEMBER(tigeroad_state,pushman)
-{
- m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x060000, 0x060007, read16_delegate(FUNC(tigeroad_state::pushman_68705_r),this), write16_delegate(FUNC(tigeroad_state::pushman_68705_w),this) );
- m_has_coinlock = 0;
-}
-
-DRIVER_INIT_MEMBER(tigeroad_state,bballs)
-{
- m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x060000, 0x060007, read16_delegate(FUNC(tigeroad_state::bballs_68705_r),this), write16_delegate(FUNC(tigeroad_state::bballs_68705_w),this) );
- m_has_coinlock = 0;
-}
-
/***************************************************************************/
-GAME( 1987, tigeroad, 0, tigeroad, tigeroad, driver_device, 0, ROT0, "Capcom", "Tiger Road (US)", 0 )
-GAME( 1987, tigeroadu,tigeroad, tigeroad, tigeroad, driver_device, 0, ROT0, "Capcom (Romstar license)", "Tiger Road (US, Romstar license)", 0 )
-GAME( 1987, toramich, tigeroad, toramich, toramich, driver_device, 0, ROT0, "Capcom", "Tora e no Michi (Japan)", 0 )
-GAME( 1987, tigeroadb,tigeroad, tigeroad, tigeroad, driver_device, 0, ROT0, "bootleg", "Tiger Road (US bootleg)", 0 )
+GAME( 1987, tigeroad, 0, tigeroad, tigeroad, driver_device, 0, ROT0, "Capcom", "Tiger Road (US)", 0 )
+GAME( 1987, tigeroadu,tigeroad, tigeroad, tigeroad, driver_device, 0, ROT0, "Capcom (Romstar license)", "Tiger Road (US, Romstar license)", 0 )
+GAME( 1987, toramich, tigeroad, toramich, toramich, driver_device, 0, ROT0, "Capcom", "Tora e no Michi (Japan)", 0 )
+GAME( 1987, tigeroadb,tigeroad, tigeroad, tigeroad, driver_device, 0, ROT0, "bootleg", "Tiger Road (US bootleg)", 0 )
/* F1 Dream has an Intel 8751 microcontroller for protection */
-GAME( 1988, f1dream, 0, tigeroad, f1dream, tigeroad_state, f1dream, ROT0, "Capcom (Romstar license)", "F-1 Dream", MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION ) // collisions are wrong
-GAME( 1988, f1dreamb, f1dream, tigeroad, f1dream, driver_device, 0, ROT0, "bootleg", "F-1 Dream (bootleg, set 1)", 0 )
-GAME( 1988, f1dreamba,f1dream, tigeroad, f1dream, driver_device, 0, ROT0, "bootleg", "F-1 Dream (bootleg, set 2)", 0 )
+GAME( 1988, f1dream, 0, tigeroad, f1dream, tigeroad_state, f1dream, ROT0, "Capcom (Romstar license)", "F-1 Dream", MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION ) // collisions are wrong
+GAME( 1988, f1dreamb, f1dream, tigeroad, f1dream, driver_device, 0, ROT0, "bootleg", "F-1 Dream (bootleg, set 1)", 0 )
+GAME( 1988, f1dreamba,f1dream, tigeroad, f1dream, driver_device, 0, ROT0, "bootleg", "F-1 Dream (bootleg, set 2)", 0 )
/* This Comad hardware is based around the F1 Dream design */
-GAME( 1990, pushman, 0, pushman, pushman, tigeroad_state, pushman, ROT0, "Comad", "Pushman (Korea, set 1)", MACHINE_SUPPORTS_SAVE )
-GAME( 1990, pushmana, pushman, pushman, pushman, tigeroad_state, pushman, ROT0, "Comad", "Pushman (Korea, set 2)", MACHINE_SUPPORTS_SAVE )
-GAME( 1990, pushmans, pushman, pushman, pushman, tigeroad_state, pushman, ROT0, "Comad (American Sammy license)", "Pushman (American Sammy license)", MACHINE_SUPPORTS_SAVE )
-GAME( 1990, pushmant, pushman, pushman, pushman, tigeroad_state, pushman, ROT0, "Comad (Top Tronic license)", "Pushman (Top Tronic license)", MACHINE_SUPPORTS_SAVE )
+GAME( 1990, pushman, 0, pushman, pushman, driver_device, 0, ROT0, "Comad", "Pushman (Korea, set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1990, pushmana, pushman, pushman, pushman, driver_device, 0, ROT0, "Comad", "Pushman (Korea, set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1990, pushmans, pushman, pushman, pushman, driver_device, 0, ROT0, "Comad (American Sammy license)", "Pushman (American Sammy license)", MACHINE_SUPPORTS_SAVE )
+GAME( 1990, pushmant, pushman, pushman, pushman, driver_device, 0, ROT0, "Comad (Top Tronic license)", "Pushman (Top Tronic license)", MACHINE_SUPPORTS_SAVE )
-GAME( 1991, bballs, 0, bballs, bballs, tigeroad_state, bballs, ROT0, "Comad", "Bouncing Balls", MACHINE_SUPPORTS_SAVE )
-GAME( 1991, bballsa, bballs, bballs, bballs, tigeroad_state, bballs, ROT0, "Comad", "Bouncing Balls (Adult)", MACHINE_SUPPORTS_SAVE )
+GAME( 1991, bballs, 0, bballs, bballs, driver_device, 0, ROT0, "Comad", "Bouncing Balls", MACHINE_SUPPORTS_SAVE )
+GAME( 1991, bballsa, bballs, bballs, bballs, driver_device, 0, ROT0, "Comad", "Bouncing Balls (Adult)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/tispeak.cpp b/src/mame/drivers/tispeak.cpp
index d51c44dee0e..e5fe4410109 100644
--- a/src/mame/drivers/tispeak.cpp
+++ b/src/mame/drivers/tispeak.cpp
@@ -452,21 +452,21 @@ public:
DECLARE_WRITE16_MEMBER(snspellc_write_r);
DECLARE_READ8_MEMBER(tntell_read_k);
- void k28_prepare_display(uint8_t old, uint8_t data);
+ void k28_prepare_display(u8 old, u8 data);
DECLARE_READ8_MEMBER(k28_read_k);
DECLARE_WRITE16_MEMBER(k28_write_o);
DECLARE_WRITE16_MEMBER(k28_write_r);
// cartridge
- uint32_t m_cart_max_size;
- uint8_t* m_cart_base;
+ u32 m_cart_max_size;
+ u8* m_cart_base;
void init_cartridge();
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(tispeak_cartridge);
DECLARE_DRIVER_INIT(snspell);
DECLARE_DRIVER_INIT(tntell);
DECLARE_DRIVER_INIT(lantutor);
- uint8_t m_overlay;
+ u8 m_overlay;
TIMER_DEVICE_CALLBACK_MEMBER(tntell_get_overlay);
protected:
@@ -504,7 +504,7 @@ void tispeak_state::init_cartridge()
DEVICE_IMAGE_LOAD_MEMBER(tispeak_state, tispeak_cartridge)
{
- uint32_t size = m_cart->common_get_size("rom");
+ u32 size = m_cart->common_get_size("rom");
if (size > m_cart_max_size)
{
@@ -549,7 +549,7 @@ DRIVER_INIT_MEMBER(tispeak_state, lantutor)
void tispeak_state::prepare_display()
{
- uint16_t gridmask = vfd_filament_on() ? 0xffff : 0x8000;
+ u16 gridmask = vfd_filament_on() ? 0xffff : 0x8000;
set_display_segmask(0x21ff, 0x3fff);
display_matrix(16+1, 16, m_plate | 1<<16, m_grid & gridmask);
}
@@ -640,7 +640,7 @@ WRITE16_MEMBER(tispeak_state::snspellc_write_o)
READ8_MEMBER(tispeak_state::snspellc_read_k)
{
// K4: TMS5100 CTL1
- uint8_t k4 = m_tms5100->ctl_r(space, 0) << 2 & 4;
+ u8 k4 = m_tms5100->ctl_r(space, 0) << 2 & 4;
// K: multiplexed inputs (note: the Vss row is always on)
return k4 | m_inp_matrix[9]->read() | read_inputs(9);
@@ -652,7 +652,7 @@ READ8_MEMBER(tispeak_state::snspellc_read_k)
READ8_MEMBER(tispeak_state::tntell_read_k)
{
// K8: overlay code from R5,O4-O7
- uint8_t k8 = (((m_r >> 1 & 0x10) | (m_o >> 4 & 0xf)) & m_overlay) ? 8 : 0;
+ u8 k8 = (((m_r >> 1 & 0x10) | (m_o >> 4 & 0xf)) & m_overlay) ? 8 : 0;
// rest is same as snpellc
return k8 | snspellc_read_k(space, offset);
@@ -678,7 +678,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(tispeak_state::tntell_get_overlay)
// k28 specific
-void tispeak_state::k28_prepare_display(uint8_t old, uint8_t data)
+void tispeak_state::k28_prepare_display(u8 old, u8 data)
{
// ?
}
diff --git a/src/mame/drivers/tispellb.cpp b/src/mame/drivers/tispellb.cpp
index 40936b78e14..dfe0439207c 100644
--- a/src/mame/drivers/tispellb.cpp
+++ b/src/mame/drivers/tispellb.cpp
@@ -76,9 +76,9 @@ public:
optional_device<cpu_device> m_subcpu;
optional_device<tms6100_device> m_tms6100;
- uint8_t m_rev1_ctl;
- uint16_t m_sub_o;
- uint16_t m_sub_r;
+ u8 m_rev1_ctl;
+ u16 m_sub_o;
+ u16 m_sub_r;
virtual DECLARE_INPUT_CHANGED_MEMBER(power_button) override;
void power_off();
@@ -140,7 +140,7 @@ void tispellb_state::power_off()
void tispellb_state::prepare_display()
{
// almost same as snspell
- uint16_t gridmask = vfd_filament_on() ? 0xffff : 0x8000;
+ u16 gridmask = vfd_filament_on() ? 0xffff : 0x8000;
set_display_segmask(0xff, 0x3fff);
display_matrix(16+1, 16, m_plate | 1<<16, m_grid & gridmask);
}
diff --git a/src/mame/drivers/toaplan2.cpp b/src/mame/drivers/toaplan2.cpp
index 46917219621..ce751775a85 100644
--- a/src/mame/drivers/toaplan2.cpp
+++ b/src/mame/drivers/toaplan2.cpp
@@ -39,7 +39,7 @@ Supported games:
batsugun TP-030 Toaplan Batsugun
batsuguna TP-030 Toaplan Batsugun (older)
batsugunsp TP-030 Toaplan Batsugun (Special Version)
- enmadaio TP-031 Toaplan Enma Daio
+ enmadaio TP-031 Toaplan Enma Daio
pwrkick SW931201 Sunwise Power Kick
othldrby ?????? Sunwise Othello Derby
snowbro2 TP-033 Hanafram Snow Bros. 2 - With New Elves
@@ -1559,7 +1559,7 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( enmadaio_oki, AS_0, 8, toaplan2_state )
AM_RANGE(0x00000, 0x3ffff) AM_ROMBANK("bank1")
ADDRESS_MAP_END
-
+
WRITE16_MEMBER(toaplan2_state::tekipaki_mcu_w)
@@ -2661,7 +2661,7 @@ static INPUT_PORTS_START( enmadaio )
PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("yes")
- PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("no")
+ PORT_BIT( 0x0020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("no")
PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
diff --git a/src/mame/drivers/upscope.cpp b/src/mame/drivers/upscope.cpp
index bee8ac9d886..20a79f6a81f 100644
--- a/src/mame/drivers/upscope.cpp
+++ b/src/mame/drivers/upscope.cpp
@@ -284,11 +284,13 @@ static MACHINE_CONFIG_START( upscope, upscope_state )
/* sound hardware */
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
- MCFG_SOUND_ADD("amiga", AMIGA, amiga_state::CLK_C1_NTSC)
+ MCFG_SOUND_ADD("amiga", PAULA_8364, amiga_state::CLK_C1_NTSC)
MCFG_SOUND_ROUTE(0, "rspeaker", 0.50)
MCFG_SOUND_ROUTE(1, "lspeaker", 0.50)
MCFG_SOUND_ROUTE(2, "lspeaker", 0.50)
MCFG_SOUND_ROUTE(3, "rspeaker", 0.50)
+ MCFG_PAULA_MEM_READ_CB(READ16(amiga_state, chip_ram_r))
+ MCFG_PAULA_INT_CB(WRITELINE(amiga_state, paula_int_w))
/* cia */
MCFG_DEVICE_ADD("cia_0", MOS8520, amiga_state::CLK_E_NTSC)
diff --git a/src/mame/drivers/vcs80.cpp b/src/mame/drivers/vcs80.cpp
index 9c6508c7ce1..4fe93fc9196 100644
--- a/src/mame/drivers/vcs80.cpp
+++ b/src/mame/drivers/vcs80.cpp
@@ -230,7 +230,7 @@ static MACHINE_CONFIG_START( vcs80, vcs80_state )
/* internal ram */
MCFG_RAM_ADD(RAM_TAG)
MCFG_RAM_DEFAULT_SIZE("1K")
-
+
/* bankdev */
MCFG_DEVICE_ADD("bdmem", ADDRESS_MAP_BANK, 0)
MCFG_DEVICE_PROGRAM_MAP(vcs80_bd_mem)
diff --git a/src/mame/drivers/vd.cpp b/src/mame/drivers/vd.cpp
index 84521e20623..1c21b879cee 100644
--- a/src/mame/drivers/vd.cpp
+++ b/src/mame/drivers/vd.cpp
@@ -3,7 +3,7 @@
/**************************************************************************************
PINBALL
- Videodens
+ Video Dens S.A., Madrid
PinMAME used as reference. The Break '86 manual scan available on the net includes
a mostly illegible schematic.
@@ -223,5 +223,5 @@ ROM_START(papillon)
ROM_END
-GAME(1986, break86, 0, vd, break86, driver_device, 0, ROT0, "Videodens", "Break '86", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1986, papillon, 0, vd, papillon, driver_device, 0, ROT0, "Videodens", "Papillon", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, break86, 0, vd, break86, driver_device, 0, ROT0, "Video Dens", "Break '86", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, papillon, 0, vd, papillon, driver_device, 0, ROT0, "Video Dens", "Papillon", MACHINE_IS_SKELETON_MECHANICAL)
diff --git a/src/mame/drivers/vicdual.cpp b/src/mame/drivers/vicdual.cpp
index e4a76ec2f7c..a6a2d6a64a5 100644
--- a/src/mame/drivers/vicdual.cpp
+++ b/src/mame/drivers/vicdual.cpp
@@ -2547,24 +2547,37 @@ ROM_START( depthcho )
ROM_LOAD( "316-0014.u28", 0x0020, 0x0020, CRC(7b7a8492) SHA1(6ba8d891cc6eb0dd80051377b6b832e8894655e7) ) /* sequence PROM */
ROM_END
+/* Fully working PCB set from my full-size Sub Hunter upright machine.
+
+Essentally this pcb set is a Taito-made license of
+'Depthcharge' by Gremlin.
+
+PCB markings are:
+- DP070001 / DPN00001 (main) (paper label DP80)
+- DP070002 / DPN00002 (sound) (paper label DP80)
+Serial number 430229
+
+12x program Proms were harris 7643
+2x gfx proms were Harris 7603 */
+
ROM_START( subhunt )
ROM_REGION( 0x10000, "maincpu", 0 )
- ROM_LOAD_NIB_LOW ( "dp04", 0x0000, 0x0400, CRC(0ace1aef) SHA1(071256dd63e2e449093a65a4c9b006be5e17b786) )
- ROM_LOAD_NIB_HIGH( "dp01", 0x0000, 0x0400, CRC(da9e835b) SHA1(505c969b479aeab11bb6a21ef06837280846d90a) )
- ROM_LOAD_NIB_LOW ( "dp10", 0x0400, 0x0400, CRC(de752f20) SHA1(513a92554d14a09d6b80ba8017d161c7cda9ed8c) )
- ROM_LOAD_NIB_HIGH( "316-0028.u77", 0x0400, 0x0400, CRC(597ae441) SHA1(8d3af5e64e838a57057d46f97a7b1c1037c1a0cf) ) // dp07
- ROM_LOAD_NIB_LOW ( "dp05", 0x0800, 0x0400, CRC(1c0530cf) SHA1(b1f2b1038ee063533669341f1a71755eecc2e1a9) )
- ROM_LOAD_NIB_HIGH( "316-0023.u52", 0x0800, 0x0400, CRC(9244b613) SHA1(6587035ec22d90194cdc3efaed3571a1ab975e1c) ) // dp02
- ROM_LOAD_NIB_LOW ( "dp11", 0x0c00, 0x0400, CRC(0007044a) SHA1(c8d7c693e3059ff020563336fe712c234e94b8f9) )
- ROM_LOAD_NIB_HIGH( "dp08", 0x0c00, 0x0400, CRC(4d4e3ec8) SHA1(a0d5392fe5795cc6bf7373f194186506283c947c) )
- ROM_LOAD_NIB_LOW ( "dp06", 0x1000, 0x0400, CRC(63e1184b) SHA1(91934cb041365dabdc58a831312577fdb0dc923b) )
- ROM_LOAD_NIB_HIGH( "dp03", 0x1000, 0x0400, CRC(d70dbfd8) SHA1(0183a6b1ffd87a9e28588a7a9aa18aeb003560f0) )
- ROM_LOAD_NIB_LOW ( "dp12", 0x1400, 0x0400, CRC(170d7718) SHA1(4348e4e2dbb1edd9a4228fd3ccef58c50f1ae129) )
- ROM_LOAD_NIB_HIGH( "dp09", 0x1400, 0x0400, CRC(97466803) SHA1(f04ba4a1a960836974a85832596fc3a92a711094) )
+ ROM_LOAD_NIB_LOW ( "dp04.u63", 0x0000, 0x0400, CRC(0ace1aef) SHA1(071256dd63e2e449093a65a4c9b006be5e17b786) )
+ ROM_LOAD_NIB_HIGH( "dp01.u51", 0x0000, 0x0400, CRC(da9e835b) SHA1(505c969b479aeab11bb6a21ef06837280846d90a) )
+ ROM_LOAD_NIB_LOW ( "dp10.u89", 0x0400, 0x0400, CRC(de752f20) SHA1(513a92554d14a09d6b80ba8017d161c7cda9ed8c) )
+ ROM_LOAD_NIB_HIGH( "316-0028.u77", 0x0400, 0x0400, CRC(597ae441) SHA1(8d3af5e64e838a57057d46f97a7b1c1037c1a0cf) ) // dp07.u77
+ ROM_LOAD_NIB_LOW ( "dp05.u64", 0x0800, 0x0400, CRC(1c0530cf) SHA1(b1f2b1038ee063533669341f1a71755eecc2e1a9) )
+ ROM_LOAD_NIB_HIGH( "316-0023.u52", 0x0800, 0x0400, CRC(9244b613) SHA1(6587035ec22d90194cdc3efaed3571a1ab975e1c) ) // dp02.u52
+ ROM_LOAD_NIB_LOW ( "dp11.u90", 0x0c00, 0x0400, CRC(0007044a) SHA1(c8d7c693e3059ff020563336fe712c234e94b8f9) )
+ ROM_LOAD_NIB_HIGH( "dp08.u78", 0x0c00, 0x0400, CRC(4d4e3ec8) SHA1(a0d5392fe5795cc6bf7373f194186506283c947c) )
+ ROM_LOAD_NIB_LOW ( "dp06.u65", 0x1000, 0x0400, CRC(63e1184b) SHA1(91934cb041365dabdc58a831312577fdb0dc923b) )
+ ROM_LOAD_NIB_HIGH( "dp03.u53", 0x1000, 0x0400, CRC(d70dbfd8) SHA1(0183a6b1ffd87a9e28588a7a9aa18aeb003560f0) )
+ ROM_LOAD_NIB_LOW ( "dp12.u91", 0x1400, 0x0400, CRC(170d7718) SHA1(4348e4e2dbb1edd9a4228fd3ccef58c50f1ae129) )
+ ROM_LOAD_NIB_HIGH( "dp09.u79", 0x1400, 0x0400, CRC(97466803) SHA1(f04ba4a1a960836974a85832596fc3a92a711094) )
ROM_REGION( 0x0040, "user1", 0 )
- ROM_LOAD( "316-0013.u27", 0x0000, 0x0020, CRC(690ef530) SHA1(6c0de3fa87a341cd378fefb8e06bf7918db9a074) ) /* control PROM */
- ROM_LOAD( "316-0014.u28", 0x0020, 0x0020, CRC(7b7a8492) SHA1(6ba8d891cc6eb0dd80051377b6b832e8894655e7) ) /* sequence PROM */
+ ROM_LOAD( "316-0013.u27", 0x0000, 0x0020, CRC(690ef530) SHA1(6c0de3fa87a341cd378fefb8e06bf7918db9a074) ) /* dp13.u27 - control PROM */
+ ROM_LOAD( "316-0014.u28", 0x0020, 0x0020, CRC(7b7a8492) SHA1(6ba8d891cc6eb0dd80051377b6b832e8894655e7) ) /* dp14.u28 - sequence PROM */
ROM_END
diff --git a/src/mame/drivers/witch.cpp b/src/mame/drivers/witch.cpp
index 080af26c1ce..6248da7343e 100644
--- a/src/mame/drivers/witch.cpp
+++ b/src/mame/drivers/witch.cpp
@@ -111,7 +111,6 @@ Sound
Mapped @0x8010-0x8016
Had to patch es8712.c to start playing on 0x8016 write and to prevent continuous looping.
There's a test on bit1 at offset 0 (0x8010), so this may be a "read status" kind of port.
- For now reading at 8010 always reports ready.
Ports
@@ -286,7 +285,6 @@ public:
DECLARE_WRITE8_MEMBER(write_a006);
DECLARE_WRITE8_MEMBER(write_a008);
DECLARE_READ8_MEMBER(prot_read_700x);
- DECLARE_READ8_MEMBER(read_8010);
DECLARE_WRITE8_MEMBER(xscroll_w);
DECLARE_WRITE8_MEMBER(yscroll_w);
DECLARE_DRIVER_INIT(witch);
@@ -460,12 +458,6 @@ READ8_MEMBER(witch_state::prot_read_700x)
return memregion("sub")->base()[0x7000+offset];
}
-/*
- * Status from ES8712?
- * BIT1 is zero when no sample is playing?
- */
-READ8_MEMBER(witch_state::read_8010){ return 0x00; }
-
WRITE8_MEMBER(witch_state::xscroll_w)
{
m_scrollx=data;
@@ -502,7 +494,7 @@ static ADDRESS_MAP_START( map_sub, AS_PROGRAM, 8, witch_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x8001) AM_DEVREADWRITE("ym1", ym2203_device, read, write)
AM_RANGE(0x8008, 0x8009) AM_DEVREADWRITE("ym2", ym2203_device, read, write)
- AM_RANGE(0x8010, 0x8016) AM_READ(read_8010) AM_DEVWRITE("essnd", es8712_device, es8712_w)
+ AM_RANGE(0x8010, 0x8016) AM_DEVREADWRITE("essnd", es8712_device, read, write)
AM_RANGE(0xa000, 0xa003) AM_DEVREADWRITE("ppi1", i8255_device, read, write)
AM_RANGE(0xa004, 0xa007) AM_DEVREADWRITE("ppi2", i8255_device, read, write)
AM_RANGE(0xa008, 0xa008) AM_WRITE(write_a008)
diff --git a/src/mame/drivers/x1.cpp b/src/mame/drivers/x1.cpp
index cde608c590a..c2dec9dfb9e 100644
--- a/src/mame/drivers/x1.cpp
+++ b/src/mame/drivers/x1.cpp
@@ -644,7 +644,7 @@ uint16_t x1_state::check_keyboard_press()
if (scancode >= 0x2c && scancode <= 0x5f)
scancode = kanatable[scancode - 0x2c][1];
}
-
+
if (scancode >= 0x41 && scancode < 0x5a)
scancode += 0x20; // lowercase
}
@@ -658,7 +658,7 @@ uint16_t x1_state::check_keyboard_press()
scancode = kanatable[scancode - 0x2c][2];
}
}
-
+
if(scancode >= 0x31 && scancode < 0x3a)
scancode -= 0x10;
if(scancode == 0x30)
diff --git a/src/mame/drivers/zn.cpp b/src/mame/drivers/zn.cpp
index 31bc72c5103..38afb4cf309 100644
--- a/src/mame/drivers/zn.cpp
+++ b/src/mame/drivers/zn.cpp
@@ -3316,6 +3316,31 @@ ROM_START( sfex2 )
ROM_END
/* 97695-1 */
+ROM_START( sfex2u1 )
+ CPZN2_BIOS
+
+ ROM_REGION32_LE( 0x80000, "countryrom", 0 )
+ ROM_LOAD( "ex2u_04.2h", 0x0000000, 0x080000, CRC(eb417c2c) SHA1(bd47d0a1d911af4457c795ec348c847c2cf9e721) )
+
+ ROM_REGION32_LE( 0x3000000, "maskroms", 0 )
+ ROM_LOAD( "ex2-05m.3h", 0x0000000, 0x800000, CRC(78726b17) SHA1(2da449df335ef133ebc3997bbad73ef4137f4771) )
+ ROM_LOAD( "ex2-06m.4h", 0x0800000, 0x800000, CRC(be1075ed) SHA1(36dc673372f30f8b3ff5689ae568c5cd01fe2c07) )
+ ROM_LOAD( "ex2-07m.5h", 0x1000000, 0x800000, CRC(6496c6ed) SHA1(054bcecbb04033abea14d9ffe6634b2bd11ca88b) )
+ ROM_LOAD( "ex2-08m.2k", 0x1800000, 0x800000, CRC(3194132e) SHA1(d1324fcf0a8528fc683791d6342697a7e08674f4) )
+ ROM_LOAD( "ex2-09m.3k", 0x2000000, 0x400000, CRC(075ae585) SHA1(6b88851db618fc3e96f1d740c46c1bc5be0ee21b) )
+
+ ROM_REGION( 0x50000, "audiocpu", 0 ) /* 64k for the audio CPU (+banks) */
+ ROM_LOAD( "ex2_02.2e", 0x00000, 0x08000, CRC(9489875e) SHA1(1fc9985ff98232c63ea8d05a69f7d77cdf72919f) )
+ ROM_CONTINUE( 0x10000, 0x18000 )
+
+ ROM_REGION( 0x400000, "qsound", 0 ) /* Q Sound Samples */
+ ROM_LOAD16_WORD_SWAP( "ex2-01m.3a", 0x0000000, 0x400000, CRC(14a5bb0e) SHA1(dfe3c3a53bd4c58743d8039b5344d3afbe2a9c24) )
+
+ ROM_REGION( 0x8, "cat702_2", 0 )
+ ROM_LOAD( "cp08", 0x000000, 0x000008, CRC(a63d6fa6) SHA1(68995438a1e90ff9aa59090e7e031d51c68c4d73) )
+ROM_END
+
+/* 97695-1 */
ROM_START( sfex2a )
CPZN2_BIOS
@@ -5103,6 +5128,7 @@ GAME( 1997, rvschoolu, rvschool, coh3002c, zn6b, driver_device, 0, ROT0,
GAME( 1997, rvschoola, rvschool, coh3002c, zn6b, driver_device, 0, ROT0, "Capcom", "Rival Schools: United By Fate (Asia 971117)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
GAME( 1997, jgakuen, rvschool, coh3002c, zn6b, driver_device, 0, ROT0, "Capcom", "Shiritsu Justice Gakuen: Legion of Heroes (Japan 971117)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
GAME( 1998, sfex2, coh3002c, coh3002c, zn6b, driver_device, 0, ROT0, "Capcom / Arika", "Street Fighter EX2 (USA 980526)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1998, sfex2u1, sfex2, coh3002c, zn6b, driver_device, 0, ROT0, "Capcom / Arika", "Street Fighter EX2 (USA 980312)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
GAME( 1998, sfex2a, sfex2, coh3002c, zn6b, driver_device, 0, ROT0, "Capcom / Arika", "Street Fighter EX2 (Asia 980312)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
GAME( 1998, sfex2h, sfex2, coh3002c, zn6b, driver_device, 0, ROT0, "Capcom / Arika", "Street Fighter EX2 (Hispanic 980312)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
GAME( 1998, sfex2j, sfex2, coh3002c, zn6b, driver_device, 0, ROT0, "Capcom / Arika", "Street Fighter EX2 (Japan 980312)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
diff --git a/src/mame/drivers/zorba.cpp b/src/mame/drivers/zorba.cpp
index cc1faf0c449..e348c55db0d 100644
--- a/src/mame/drivers/zorba.cpp
+++ b/src/mame/drivers/zorba.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Robbbert
+// copyright-holders:Robbbert, Vas Crabb
/************************************************************************************************************
Telcon Industries/Modular Micros/Gemini Electronics Zorba
@@ -36,6 +36,10 @@ The startup screen varies across each company:
- Modular Micros: "ZORBA" graphical logo with "MODULAR MICROS, INC." below in normal text
- Gemini: "GEMINI ZORBA" graphical logo
+Strangely, the Zorba configures its keyboard UART for 8N2 but the keyboard we're emulating sends 8N1.
+If you type too fast or hold down a key until it repeats, characters will be dropped/corrupted. It's
+possible we have a dump of a different CP/M-compatible keyboard, not the one supplied with the Zorba.
+
Status:
- Boots up, and the keyboard works
@@ -44,8 +48,6 @@ ToDo:
- Add masking feature (only used for the UARTs)
- Connect devices to the above hardware
- Fix the display
-- Connect the PIT to the UARTs
-- Replace the ascii keyboard with the real one, if possible
- Dump Telcon and Gemini BIOSes
- Emulate the Co-Power-88 expansion (allows PC-DOS, CP/M-86, etc. to be used)
- Probably lots of other things
@@ -53,105 +55,44 @@ ToDo:
*************************************************************************************************************/
-
#include "emu.h"
+#include "includes/zorba.h"
+
+#include "machine/zorbakbd.h"
+
+#include "bus/centronics/ctronics.h"
+#include "bus/rs232/rs232.h"
+
#include "cpu/z80/z80.h"
#include "cpu/m6805/m68705.h"
-#include "machine/i8251.h"
-#include "machine/6821pia.h"
-#include "machine/z80dma.h"
+
+#include "machine/input_merger.h"
+#include "machine/latch.h"
#include "machine/pit8253.h"
-#include "video/i8275.h"
-#include "sound/beep.h"
-#include "machine/keyboard.h"
-#include "machine/wd_fdc.h"
+
#include "softlist.h"
-class zorba_state : public driver_device
-{
-public:
- zorba_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag)
- , m_palette(*this, "palette")
- , m_maincpu(*this, "maincpu")
- , m_beep(*this, "beeper")
- , m_dma(*this, "dma")
- , m_u0(*this, "uart0")
- , m_u1(*this, "uart1")
- , m_u2(*this, "uart2")
- , m_pia0(*this, "pia0")
- , m_pia1(*this, "pia1")
- , m_crtc(*this, "crtc")
- , m_fdc (*this, "fdc")
- , m_floppy0(*this, "fdc:0")
- , m_floppy1(*this, "fdc:1")
- {}
-
-public:
- const uint8_t *m_p_chargen;
- DECLARE_DRIVER_INIT(zorba);
- DECLARE_MACHINE_RESET(zorba);
- DECLARE_READ8_MEMBER(ram_r);
- DECLARE_WRITE8_MEMBER(ram_w);
- DECLARE_READ8_MEMBER(rom_r);
- DECLARE_WRITE8_MEMBER(rom_w);
- DECLARE_WRITE8_MEMBER(intmask_w);
- DECLARE_WRITE_LINE_MEMBER(busreq_w);
- DECLARE_READ8_MEMBER(memory_read_byte);
- DECLARE_WRITE8_MEMBER(memory_write_byte);
- DECLARE_READ8_MEMBER(io_read_byte);
- DECLARE_WRITE8_MEMBER(io_write_byte);
- DECLARE_WRITE8_MEMBER(pia0_porta_w);
- DECLARE_WRITE8_MEMBER(kbd_put);
- DECLARE_READ8_MEMBER(keyboard_r);
- DECLARE_WRITE_LINE_MEMBER(irq0_w);
- DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
- DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w);
- I8275_DRAW_CHARACTER_MEMBER(zorba_update_chr);
- required_device<palette_device> m_palette;
-
-private:
- uint8_t m_term_data;
- uint8_t m_fdc_rq;
- required_device<cpu_device> m_maincpu;
- required_device<beep_device> m_beep;
- required_device<z80dma_device> m_dma;
- required_device<i8251_device> m_u0;
- required_device<i8251_device> m_u1;
- required_device<i8251_device> m_u2;
- required_device<pia6821_device> m_pia0;
- required_device<pia6821_device> m_pia1;
- required_device<i8275_device> m_crtc;
- required_device<fd1793_t> m_fdc;
- required_device<floppy_connector> m_floppy0;
- required_device<floppy_connector> m_floppy1;
-};
+namespace {
-static ADDRESS_MAP_START( zorba_mem, AS_PROGRAM, 8, zorba_state )
+ADDRESS_MAP_START( zorba_mem, AS_PROGRAM, 8, zorba_state )
AM_RANGE( 0x0000, 0x3fff ) AM_READ_BANK("bankr0") AM_WRITE_BANK("bankw0")
AM_RANGE( 0x4000, 0xffff ) AM_RAM
ADDRESS_MAP_END
-static ADDRESS_MAP_START( zorba_kbdmem, AS_PROGRAM, 8, zorba_state )
- ADDRESS_MAP_GLOBAL_MASK(0x7ff)
- AM_RANGE( 0x000, 0x07f ) AM_RAM // internal RAM
- AM_RANGE( 0x080, 0x7ff ) AM_ROM // internal EPROM
-ADDRESS_MAP_END
-static ADDRESS_MAP_START( zorba_io, AS_IO, 8, zorba_state )
+ADDRESS_MAP_START( zorba_io, AS_IO, 8, zorba_state )
ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x00, 0x03) AM_DEVREADWRITE("pit", pit8254_device, read, write)
- AM_RANGE(0x04, 0x04) AM_READWRITE(rom_r,rom_w)
- AM_RANGE(0x05, 0x05) AM_READWRITE(ram_r,ram_w)
+ AM_RANGE(0x04, 0x04) AM_READWRITE(rom_r, rom_w)
+ AM_RANGE(0x05, 0x05) AM_READWRITE(ram_r, ram_w)
AM_RANGE(0x10, 0x11) AM_DEVREADWRITE("crtc", i8275_device, read, write)
AM_RANGE(0x20, 0x20) AM_DEVREADWRITE("uart0", i8251_device, data_r, data_w)
AM_RANGE(0x21, 0x21) AM_DEVREADWRITE("uart0", i8251_device, status_r, control_w)
AM_RANGE(0x22, 0x22) AM_DEVREADWRITE("uart1", i8251_device, data_r, data_w)
AM_RANGE(0x23, 0x23) AM_DEVREADWRITE("uart1", i8251_device, status_r, control_w)
- //AM_RANGE(0x24, 0x24) AM_DEVREADWRITE("uart2", i8251_device, data_r, data_w)
- //AM_RANGE(0x25, 0x25) AM_DEVREADWRITE("uart2", i8251_device, status_r, control_w)
- AM_RANGE(0x24, 0x25) AM_READ(keyboard_r) AM_WRITENOP
+ AM_RANGE(0x24, 0x24) AM_DEVREADWRITE("uart2", i8251_device, data_r, data_w)
+ AM_RANGE(0x25, 0x25) AM_DEVREADWRITE("uart2", i8251_device, status_r, control_w)
AM_RANGE(0x26, 0x26) AM_WRITE(intmask_w)
AM_RANGE(0x30, 0x30) AM_DEVREADWRITE("dma", z80dma_device, read, write)
AM_RANGE(0x40, 0x43) AM_DEVREADWRITE("fdc", fd1793_t, read, write)
@@ -159,83 +100,294 @@ static ADDRESS_MAP_START( zorba_io, AS_IO, 8, zorba_state )
AM_RANGE(0x60, 0x63) AM_DEVREADWRITE("pia1", pia6821_device, read, write)
ADDRESS_MAP_END
+
+INPUT_PORTS_START( zorba )
+ PORT_START("CNF")
+ PORT_CONFNAME(0x01, 0x00, "Parallel Printer") PORT_CHANGED_MEMBER(DEVICE_SELF, zorba_state, printer_type, 0)
+ PORT_CONFSETTING(0x00, "Centronics")
+ PORT_CONFSETTING(0x01, "Prowriter")
+INPUT_PORTS_END
+
+
+SLOT_INTERFACE_START( zorba_floppies )
+ SLOT_INTERFACE( "525dd", FLOPPY_525_DD )
+SLOT_INTERFACE_END
+
+
+// F4 Character Displayer
+const gfx_layout u5_charlayout =
+{
+ 8, 11, // 8 x 11 characters
+ 256, // 256 characters
+ 1, // 1 bits per pixel
+ { 0 }, // no bitplanes
+ /* x offsets */
+ { 0, 1, 2, 3, 4, 5, 6, 7 },
+ /* y offsets */
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8, 10*8 },
+ 8*16 // every char takes 16 bytes
+};
+
+GFXDECODE_START( zorba )
+ GFXDECODE_ENTRY( "chargen", 0x0000, u5_charlayout, 0, 1 )
+GFXDECODE_END
+
+
+MACHINE_CONFIG_START( zorba, zorba_state )
+ // basic machine hardware
+ MCFG_CPU_ADD("maincpu", Z80, XTAL_24MHz / 6)
+ MCFG_CPU_PROGRAM_MAP(zorba_mem)
+ MCFG_CPU_IO_MAP(zorba_io)
+ MCFG_MACHINE_RESET_OVERRIDE(zorba_state, zorba)
+
+ /* video hardware */
+ MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
+ MCFG_SCREEN_REFRESH_RATE(50)
+ MCFG_SCREEN_UPDATE_DEVICE("crtc", i8275_device, screen_update)
+ MCFG_GFXDECODE_ADD("gfxdecode", "palette", zorba)
+ MCFG_PALETTE_ADD_MONOCHROME_HIGHLIGHT("palette")
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_SOUND_ADD("beeper", BEEP, 800) // should be horizontal frequency / 16, so depends on CRTC parameters
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
+
+ MCFG_INPUT_MERGER_ACTIVE_HIGH("irq0")
+ MCFG_INPUT_MERGER_OUTPUT_HANDLER(WRITELINE(zorba_state, irq_w<0>))
+ MCFG_INPUT_MERGER_ACTIVE_HIGH("irq1")
+ MCFG_INPUT_MERGER_OUTPUT_HANDLER(WRITELINE(zorba_state, irq_w<1>))
+ MCFG_INPUT_MERGER_ACTIVE_HIGH("irq2")
+ MCFG_INPUT_MERGER_OUTPUT_HANDLER(WRITELINE(zorba_state, irq_w<2>))
+
+ /* devices */
+ MCFG_DEVICE_ADD("dma", Z80DMA, XTAL_24MHz/6)
+ // busack on cpu connects to bai pin
+ MCFG_Z80DMA_OUT_BUSREQ_CB(WRITELINE(zorba_state, busreq_w)) //connects to busreq on cpu
+ MCFG_Z80DMA_OUT_INT_CB(DEVWRITELINE("irq0", input_merger_active_high_device, in0_w))
+ //ba0 - not connected
+ MCFG_Z80DMA_IN_MREQ_CB(READ8(zorba_state, memory_read_byte))
+ MCFG_Z80DMA_OUT_MREQ_CB(WRITE8(zorba_state, memory_write_byte))
+ MCFG_Z80DMA_IN_IORQ_CB(READ8(zorba_state, io_read_byte))
+ MCFG_Z80DMA_OUT_IORQ_CB(WRITE8(zorba_state, io_write_byte))
+
+ MCFG_DEVICE_ADD("uart0", I8251, 0) // U32 COM port J2
+ MCFG_I8251_TXD_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_txd)) // TODO: this line has a LED attached
+ MCFG_I8251_DTR_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_dtr))
+ MCFG_I8251_RTS_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_rts))
+ MCFG_I8251_RXRDY_HANDLER(WRITELINE(zorba_state, tx_rx_rdy_w<1>))
+ MCFG_I8251_TXRDY_HANDLER(WRITELINE(zorba_state, tx_rx_rdy_w<0>))
+
+ MCFG_DEVICE_ADD("uart1", I8251, 0) // U31 printer port J3
+ MCFG_I8251_TXD_HANDLER(DEVWRITELINE("serprn", rs232_port_device, write_txd))
+ MCFG_I8251_RTS_HANDLER(DEVWRITELINE("serprn", rs232_port_device, write_rts))
+ MCFG_I8251_RXRDY_HANDLER(WRITELINE(zorba_state, tx_rx_rdy_w<3>))
+ MCFG_I8251_TXRDY_HANDLER(WRITELINE(zorba_state, tx_rx_rdy_w<2>))
+
+ MCFG_DEVICE_ADD("uart2", I8251, 0) // U30 serial keyboard J6
+ MCFG_I8251_TXD_HANDLER(DEVWRITELINE("keyboard", zorba_keyboard_device, txd_w))
+ MCFG_I8251_RXRDY_HANDLER(WRITELINE(zorba_state, tx_rx_rdy_w<5>))
+ MCFG_I8251_TXRDY_HANDLER(WRITELINE(zorba_state, tx_rx_rdy_w<4>))
+
+ // port A - disk select etc, beeper
+ // port B - parallel interface
+ MCFG_DEVICE_ADD("pia0", PIA6821, 0)
+ MCFG_PIA_WRITEPA_HANDLER(WRITE8(zorba_state, pia0_porta_w))
+ MCFG_PIA_WRITEPB_HANDLER(DEVWRITE8("parprndata", output_latch_device, write))
+ MCFG_PIA_CB2_HANDLER(DEVWRITELINE("parprn", centronics_device, write_strobe))
+
+ // IEEE488 interface
+ MCFG_DEVICE_ADD("pia1", PIA6821, 0)
+ MCFG_PIA_READPA_HANDLER(DEVREAD8(IEEE488_TAG, ieee488_device, dio_r)) // TODO: gated with PB1
+ MCFG_PIA_WRITEPA_HANDLER(DEVWRITE8(IEEE488_TAG, ieee488_device, dio_w)) // TODO: gated with PB1
+ MCFG_PIA_READPB_HANDLER(READ8(zorba_state, pia1_portb_r))
+ MCFG_PIA_WRITEPB_HANDLER(WRITE8(zorba_state, pia1_portb_w))
+ MCFG_PIA_CA2_HANDLER(DEVWRITELINE(IEEE488_TAG, ieee488_device, ifc_w))
+ MCFG_PIA_CB2_HANDLER(DEVWRITELINE(IEEE488_TAG, ieee488_device, ren_w))
+ MCFG_PIA_IRQA_HANDLER(DEVWRITELINE("irq1", input_merger_active_high_device, in0_w))
+ MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("irq1", input_merger_active_high_device, in1_w))
+
+ // PIT
+ MCFG_DEVICE_ADD("pit", PIT8254, 0)
+ MCFG_PIT8253_CLK0(XTAL_24MHz / 3)
+ MCFG_PIT8253_CLK1(XTAL_24MHz / 3)
+ MCFG_PIT8253_CLK2(XTAL_24MHz / 3)
+ MCFG_PIT8253_OUT0_HANDLER(WRITELINE(zorba_state, br1_w))
+ MCFG_PIT8253_OUT1_HANDLER(DEVWRITELINE("uart1", i8251_device, write_txc))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("uart1", i8251_device, write_rxc))
+ MCFG_PIT8253_OUT2_HANDLER(DEVWRITELINE("uart2", i8251_device, write_txc))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("uart2", i8251_device, write_rxc))
+
+ // CRTC
+ MCFG_DEVICE_ADD("crtc", I8275, XTAL_14_31818MHz/7)
+ MCFG_I8275_CHARACTER_WIDTH(8)
+ MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(zorba_state, zorba_update_chr)
+ MCFG_I8275_DRQ_CALLBACK(DEVWRITELINE("dma", z80dma_device, rdy_w))
+ MCFG_I8275_IRQ_CALLBACK(DEVWRITELINE("irq0", input_merger_active_high_device, in1_w))
+
+ // Floppies
+ MCFG_FD1793_ADD("fdc", XTAL_24MHz / 24)
+ MCFG_WD_FDC_INTRQ_CALLBACK(DEVWRITELINE("irq2", input_merger_active_high_device, in0_w))
+ MCFG_WD_FDC_DRQ_CALLBACK(DEVWRITELINE("irq2", input_merger_active_high_device, in1_w))
+ MCFG_FLOPPY_DRIVE_ADD("fdc:0", zorba_floppies, "525dd", floppy_image_device::default_floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:1", zorba_floppies, "525dd", floppy_image_device::default_floppy_formats)
+ MCFG_FLOPPY_DRIVE_SOUND(true)
+
+ // J1 IEEE-488
+ MCFG_IEEE488_BUS_ADD()
+ MCFG_IEEE488_SRQ_CALLBACK(DEVWRITELINE("pia1", pia6821_device, ca2_w)) // TODO: gated with PB1 from PIA
+
+ // J2 EIA RS232/internal modem
+ // TODO: this has additional lines compared to a regular RS232 port (TxC in, RxC in, RxC out, speaker in, power)
+ MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, nullptr)
+ MCFG_RS232_RXD_HANDLER(DEVWRITELINE("uart0", i8251_device, write_rxd)) // TODO: this line has a LED attached
+ MCFG_RS232_CTS_HANDLER(DEVWRITELINE("uart0", i8251_device, write_cts)) // TODO: this line has a LED attached
+ MCFG_RS232_DSR_HANDLER(DEVWRITELINE("uart0", i8251_device, write_dsr))
+
+ // J3 Parallel printer
+ MCFG_CENTRONICS_OUTPUT_LATCH_ADD("parprndata", "parprn")
+ MCFG_CENTRONICS_ADD("parprn", centronics_devices, "printer")
+ MCFG_CENTRONICS_BUSY_HANDLER(DEVWRITELINE("uart1", i8251_device, write_cts))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("uart1", i8251_device, write_dsr)) // TODO: shared with serial CTS
+ MCFG_CENTRONICS_FAULT_HANDLER(WRITELINE(zorba_state, printer_fault_w))
+ MCFG_CENTRONICS_SELECT_HANDLER(WRITELINE(zorba_state, printer_select_w))
+
+ // J3 Serial printer
+ MCFG_RS232_PORT_ADD("serprn", default_rs232_devices, nullptr)
+ MCFG_RS232_RXD_HANDLER(DEVWRITELINE("uart1", i8251_device, write_rxd)) // TODO: this line has a LED attached
+
+ // J6 TTL-level serial keyboard
+ MCFG_DEVICE_ADD("keyboard", ZORBA_KEYBOARD, 0)
+ MCFG_ZORBA_KEYBOARD_RXD_CB(DEVWRITELINE("uart2", i8251_device, write_rxd))
+ MCFG_QUANTUM_PERFECT_CPU("keyboard:mcu")
+
+ MCFG_SOFTWARE_LIST_ADD("flop_list", "zorba")
+MACHINE_CONFIG_END
+
+} // anonymous namespace
+
+
+//-------------------------------------------------
+// Initialise/reset
+//-------------------------------------------------
+
+DRIVER_INIT_MEMBER( zorba_state, zorba )
+{
+ uint8_t *main = memregion("maincpu")->base();
+
+ membank("bankr0")->configure_entry(0, &main[0x0000]);
+ membank("bankr0")->configure_entry(1, &main[0x10000]);
+ membank("bankw0")->configure_entry(0, &main[0x0000]);
+
+ save_item(NAME(m_intmask));
+ save_item(NAME(m_tx_rx_rdy));
+ save_item(NAME(m_irq));
+
+ save_item(NAME(m_printer_prowriter));
+ save_item(NAME(m_printer_fault));
+ save_item(NAME(m_printer_select));
+
+ save_item(NAME(m_term_data));
+
+ m_printer_prowriter = false;
+ m_printer_fault = 0;
+ m_printer_select = 0;
+}
+
+MACHINE_RESET_MEMBER( zorba_state, zorba )
+{
+ m_uart2->write_cts(0); // always asserted
+
+ m_intmask = 0x00;
+ m_tx_rx_rdy = 0x00;
+ m_irq = 0x00;
+
+ m_printer_prowriter = BIT(m_config_port->read(), 0);
+ m_pia0->cb1_w(m_printer_prowriter ? m_printer_select : m_printer_fault);
+
+ m_read_bank->set_entry(1); // point at rom
+ membank("bankw0")->set_entry(0); // always write to ram
+
+ m_maincpu->reset();
+}
+
+
+//-------------------------------------------------
+// Memory banking control
+//-------------------------------------------------
+
READ8_MEMBER( zorba_state::ram_r )
{
- membank("bankr0")->set_entry(0);
+ if (!space.debugger_access())
+ m_read_bank->set_entry(0);
return 0;
}
WRITE8_MEMBER( zorba_state::ram_w )
{
- membank("bankr0")->set_entry(0);
+ m_read_bank->set_entry(0);
}
READ8_MEMBER( zorba_state::rom_r )
{
- membank("bankr0")->set_entry(1);
+ if (!space.debugger_access())
+ m_read_bank->set_entry(1);
return 0;
}
WRITE8_MEMBER( zorba_state::rom_w )
{
- membank("bankr0")->set_entry(1);
+ m_read_bank->set_entry(1);
}
-WRITE_LINE_MEMBER( zorba_state::irq0_w )
-{
- if (state)
- {
- m_maincpu->set_input_line_vector(0, 0x88);
- m_maincpu->set_input_line(0, ASSERT_LINE);
- }
- else
- m_maincpu->set_input_line(0, CLEAR_LINE);
-}
-WRITE_LINE_MEMBER( zorba_state::fdc_intrq_w )
-{
- m_fdc_rq = (m_fdc_rq & 2) | state;
- if (m_fdc_rq == 1)
- {
- m_maincpu->set_input_line_vector(0, 0x80);
- m_maincpu->set_input_line(0, ASSERT_LINE);
- }
- else
- if (m_fdc_rq == 0)
- m_maincpu->set_input_line(0, CLEAR_LINE);
-}
+//-------------------------------------------------
+// Interrupt vectoring glue
+//-------------------------------------------------
-WRITE_LINE_MEMBER( zorba_state::fdc_drq_w )
+WRITE8_MEMBER( zorba_state::intmask_w )
{
- m_fdc_rq = (m_fdc_rq & 1) | (state << 1);
- if (m_fdc_rq == 2)
- {
- m_maincpu->set_input_line_vector(0, 0x80);
- m_maincpu->set_input_line(0, ASSERT_LINE);
- }
- else
- if (m_fdc_rq == 0)
- m_maincpu->set_input_line(0, CLEAR_LINE);
+ m_intmask = data & 0x3f; // only six lines physically present
+ irq_w<3>(BIT(m_intmask & m_tx_rx_rdy, 0) | BIT(m_intmask & m_tx_rx_rdy, 1));
+ irq_w<4>(BIT(m_intmask & m_tx_rx_rdy, 2) | BIT(m_intmask & m_tx_rx_rdy, 3));
+ irq_w<5>(BIT(m_intmask & m_tx_rx_rdy, 4) | BIT(m_intmask & m_tx_rx_rdy, 5));
}
-WRITE8_MEMBER( zorba_state::intmask_w )
+template <unsigned N> WRITE_LINE_MEMBER( zorba_state::tx_rx_rdy_w )
{
+ m_tx_rx_rdy = (m_tx_rx_rdy & ~(1 << N)) | ((state ? 1 : 0) << N);
+ irq_w<(N >> 1) + 3>(BIT(m_intmask & m_tx_rx_rdy, N & ~1) | BIT(m_intmask & m_tx_rx_rdy, N | 1));
}
-static INPUT_PORTS_START( zorba )
-INPUT_PORTS_END
-
-DRIVER_INIT_MEMBER( zorba_state, zorba )
+template <unsigned N> WRITE_LINE_MEMBER( zorba_state::irq_w )
{
- uint8_t *main = memregion("maincpu")->base();
-
- membank("bankr0")->configure_entry(0, &main[0x0000]);
- membank("bankr0")->configure_entry(1, &main[0x10000]);
- membank("bankw0")->configure_entry(0, &main[0x0000]);
+ m_irq = (m_irq & ~(1 << N)) | ((state ? 1 : 0) << N);
+
+ // TODO: get a good dump of the interrupt vector PROM and get rid of this hack
+ // There are six interrupt sources:
+ // * IRQ0: DMAC/CRTC shared
+ // * IRQ1: IEEE488 (PIA IRQA/IRQB shared)
+ // * IRQ2: FDC INTRQ/DRQ shared
+ // * IRQ3: RS232 TXRDY/RXRDY selectable
+ // * IRQ4: Serial printer TXRDY/RXRDY selectable
+ // * IRQ5: Keyboard TXRDY/RXRDY selectable
+ // Valid vectors are 0x80, 0x84, 0x88, 0x8c, 0x90 and 0x94
+ // Floppy needs to be on 0x80, and RS232 is apparently on 0x88
+ // Everything else, including priority, is a complete guess
+ u8 vector;
+ if (BIT(m_irq, 2)) vector = 0x80;
+ else if (BIT(m_irq, 3)) vector = 0x88;
+ else vector = 0x84; // very wrong, need test cases for other things
+
+ m_maincpu->set_input_line_and_vector(
+ INPUT_LINE_IRQ0,
+ m_irq ? ASSERT_LINE : CLEAR_LINE,
+ vector);
}
+
//-------------------------------------------------
-// Z80DMA
+// DMA controller handlers
//-------------------------------------------------
WRITE_LINE_MEMBER( zorba_state::busreq_w )
@@ -268,19 +420,28 @@ WRITE8_MEMBER(zorba_state::io_write_byte)
address_space& prog_space = m_maincpu->space(AS_IO);
if (offset == 0x10)
- {
m_crtc->dack_w(space, 0, data);
- }
else
- {
prog_space.write_byte(offset, data);
- }
}
-static SLOT_INTERFACE_START( zorba_floppies )
- SLOT_INTERFACE( "525dd", FLOPPY_525_DD )
-SLOT_INTERFACE_END
+//-------------------------------------------------
+// PIT handlers
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER( zorba_state::br1_w )
+{
+ // TODO: these can be jumpered to inputs from J2 so a modem can generate Baud rates
+ // TODO: receive clock is exposed on J2 for external devices without Baud rate generators
+ m_uart0->write_txc(state);
+ m_uart0->write_rxc(state);
+}
+
+
+//-------------------------------------------------
+// PIA handlers
+//-------------------------------------------------
WRITE8_MEMBER( zorba_state::pia0_porta_w )
{
@@ -300,6 +461,50 @@ WRITE8_MEMBER( zorba_state::pia0_porta_w )
m_floppy1->get_device()->mon_w(BIT(data, 4));
}
+READ8_MEMBER( zorba_state::pia1_portb_r )
+{
+ // 0 (output only)
+ // 1 (output only)
+ // 2 (output only)
+ // 3 EOI gated with PB2 (active high)
+ // 4 (output only)
+ // 5 DAV gated with PB2 (active high)
+ // 6 NDAC gated with PB1 (active high)
+ // 7 NRFD gated with PB1 (active high)
+
+ const uint8_t outputs(m_pia0->b_output());
+ return
+ (m_ieee->eoi_r() << 3) |
+ (m_ieee->dav_r() << 5) |
+ (m_ieee->ndac_r() << 6) |
+ (m_ieee->nrfd_r() << 7) |
+ (BIT(outputs, 1) ? 0x00 : 0xc0) |
+ (BIT(outputs, 2) ? 0x00 : 0x28);
+}
+
+WRITE8_MEMBER( zorba_state::pia1_portb_w )
+{
+ // 0 DIO direction
+ // 1 NDAC/NRFD data direction, SRQ gate
+ // 2 EOI/DAV data direction
+ // 3 EOI gated with PB2 (active low)
+ // 4 ATN
+ // 5 DAV gated with PB2 (active low)
+ // 6 NDAC gated with PB1 (active low)
+ // 7 NRFD gated with PB1 (active low)
+
+ m_ieee->eoi_w(BIT(data, 3) & BIT(~data, 2));
+ m_ieee->atn_w(BIT(data, 4));
+ m_ieee->dav_w(BIT(data, 5) & BIT(~data, 2));
+ m_ieee->ndac_w(BIT(data, 6) & BIT(~data, 1));
+ m_ieee->nrfd_w(BIT(data, 7) & BIT(~data, 1));
+}
+
+
+//-------------------------------------------------
+// Video
+//-------------------------------------------------
+
I8275_DRAW_CHARACTER_MEMBER( zorba_state::zorba_update_chr )
{
int i;
@@ -321,138 +526,47 @@ I8275_DRAW_CHARACTER_MEMBER( zorba_state::zorba_update_chr )
}
-/* F4 Character Displayer */
-static const gfx_layout u5_charlayout =
-{
- 8, 11, /* 8 x 11 characters */
- 256, /* 256 characters */
- 1, /* 1 bits per pixel */
- { 0 }, /* no bitplanes */
- /* x offsets */
- { 0, 1, 2, 3, 4, 5, 6, 7 },
- /* y offsets */
- { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8, 10*8 },
- 8*16 /* every char takes 16 bytes */
-};
-
-static GFXDECODE_START( zorba )
- GFXDECODE_ENTRY( "chargen", 0x0000, u5_charlayout, 0, 1 )
-GFXDECODE_END
+//-------------------------------------------------
+// Printer port glue
+//-------------------------------------------------
-MACHINE_RESET_MEMBER( zorba_state, zorba )
+WRITE_LINE_MEMBER( zorba_state::printer_fault_w )
{
- m_fdc_rq = 0;
- m_p_chargen = memregion("chargen")->base();
- membank("bankr0")->set_entry(1); // point at rom
- membank("bankw0")->set_entry(0); // always write to ram
- m_maincpu->reset();
+ // connects to CB1 for Centronics
+ m_printer_fault = state;
+ if (!m_printer_prowriter)
+ m_pia0->cb1_w(state);
}
-READ8_MEMBER( zorba_state::keyboard_r )
+WRITE_LINE_MEMBER( zorba_state::printer_select_w )
{
- if (offset)
- return (m_term_data) ? 0x87 : 0x85;
-
- uint8_t data = m_term_data;
- m_term_data = 0;
- return data;
+ // connects to CB1 for Prowriter
+ m_printer_select = state;
+ if (m_printer_prowriter)
+ m_pia0->cb1_w(state);
}
-WRITE8_MEMBER( zorba_state::kbd_put )
+INPUT_CHANGED_MEMBER( zorba_state::printer_type )
{
- m_term_data = data;
+ m_printer_prowriter = newval;
+ m_pia0->cb1_w(m_printer_prowriter ? m_printer_select : m_printer_fault);
}
-static MACHINE_CONFIG_START( zorba, zorba_state )
- // basic machine hardware
- MCFG_CPU_ADD("maincpu", Z80, XTAL_24MHz / 6)
- MCFG_CPU_PROGRAM_MAP(zorba_mem)
- MCFG_CPU_IO_MAP(zorba_io)
- MCFG_MACHINE_RESET_OVERRIDE(zorba_state, zorba)
-
- /* keyboard */
- MCFG_CPU_ADD("kbdcpu", M68705, XTAL_3_579545MHz) // MC68705P3S (0x80 bytes ram, 0x780 bytes of rom)
- MCFG_CPU_PROGRAM_MAP(zorba_kbdmem)
-
- /* video hardware */
- MCFG_SCREEN_ADD_MONOCHROME("screen", RASTER, rgb_t::green())
- MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_SCREEN_UPDATE_DEVICE("crtc", i8275_device, screen_update)
- MCFG_GFXDECODE_ADD("gfxdecode", "palette", zorba)
- MCFG_PALETTE_ADD_MONOCHROME_HIGHLIGHT("palette")
-
- /* sound hardware */
- MCFG_SPEAKER_STANDARD_MONO("mono")
- MCFG_SOUND_ADD("beeper", BEEP, 800)
- MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
-
- /* devices */
- MCFG_DEVICE_ADD("dma", Z80DMA, XTAL_24MHz/6)
- // busack on cpu connects to bai pin
- MCFG_Z80DMA_OUT_BUSREQ_CB(WRITELINE(zorba_state, busreq_w)) //connects to busreq on cpu
- MCFG_Z80DMA_OUT_INT_CB(WRITELINE(zorba_state, irq0_w)) // connects to IRQ0 on IM2 controller
- //ba0 - not connected
- MCFG_Z80DMA_IN_MREQ_CB(READ8(zorba_state, memory_read_byte))
- MCFG_Z80DMA_OUT_MREQ_CB(WRITE8(zorba_state, memory_write_byte))
- MCFG_Z80DMA_IN_IORQ_CB(READ8(zorba_state, io_read_byte))
- MCFG_Z80DMA_OUT_IORQ_CB(WRITE8(zorba_state, io_write_byte))
-
- MCFG_DEVICE_ADD("uart0", I8251, 0) // U32 COM port J2
-
- MCFG_DEVICE_ADD("uart1", I8251, 0) // U31 printer port J3
-
- MCFG_DEVICE_ADD("uart2", I8251, 0) // U30 serial keyboard J6
-
- // port A - disk select etc, beeper
- // port B - parallel interface
- MCFG_DEVICE_ADD("pia0", PIA6821, 0)
- MCFG_PIA_WRITEPA_HANDLER(WRITE8(zorba_state, pia0_porta_w))
-
- // IEEE488 interface
- MCFG_DEVICE_ADD("pia1", PIA6821, 0)
-
- MCFG_DEVICE_ADD("pit", PIT8254, 0)
- MCFG_PIT8253_CLK0(XTAL_24MHz / 3) /* Timer 0: clock to J2 comm port */
- MCFG_PIT8253_CLK1(XTAL_24MHz / 3) /* Timer 1: clock to U31 */
- MCFG_PIT8253_CLK2(XTAL_24MHz / 3) /* Timer 2: clock to U30 */
-
- MCFG_DEVICE_ADD("crtc", I8275, XTAL_14_31818MHz/7)
- MCFG_I8275_CHARACTER_WIDTH(8)
- MCFG_I8275_DRAW_CHARACTER_CALLBACK_OWNER(zorba_state, zorba_update_chr)
- MCFG_I8275_DRQ_CALLBACK(DEVWRITELINE("dma", z80dma_device, rdy_w))
- MCFG_I8275_IRQ_CALLBACK(WRITELINE(zorba_state, irq0_w))
- MCFG_FD1793_ADD("fdc", XTAL_24MHz / 24)
- MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(zorba_state, fdc_intrq_w))
- MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(zorba_state, fdc_drq_w))
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", zorba_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", zorba_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
-
- /* Keyboard */
- MCFG_DEVICE_ADD("keyboard", GENERIC_KEYBOARD, 0)
- MCFG_GENERIC_KEYBOARD_CB(WRITE8(zorba_state, kbd_put))
-
- MCFG_SOFTWARE_LIST_ADD("flop_list", "zorba")
-MACHINE_CONFIG_END
ROM_START( zorba )
ROM_REGION( 0x14000, "maincpu", ROMREGION_ERASEFF )
ROM_LOAD( "780000.u47", 0x10000, 0x1000, CRC(6d58f2c5) SHA1(7763f08c801cd36e5a761c6dc9f30a50b3bc482d) )
- ROM_REGION( 0x800, "kbdcpu", 0 )
- ROM_LOAD( "8999-1 3-28-83", 0x080, 0x780, CRC(79fe6c0d) SHA1(4b6fca9379d5199d1347ad1187cbfdebfc4c73e7) )
-
ROM_REGION( 0x1000, "chargen", 0 )
ROM_LOAD( "773000.u5", 0x0000, 0x1000, CRC(d0a2f8fc) SHA1(29aee7ee657778c46e9800abd4955e6d4b33ef68) )
ROM_REGION( 0x60, "proms", 0 )
- ROM_LOAD( "74ls288.u37", 0x0000, 0x0020, CRC(0a67edd6) SHA1(c1ece8978a3a061e0130d43907fa63a71e75e75d) )
- ROM_LOAD( "74ls288.u38", 0x0020, 0x0020, CRC(5ec93ea7) SHA1(3a84c098474b05d5cbe1939a3e15f66d06470581) )
- ROM_LOAD( "74ls288.u77", 0x0040, 0x0020, CRC(946e03b0) SHA1(24240bdd7bdf507a5b51628fb36ad1266fc53a28) ) // suspected bad dump
+ ROM_LOAD( "74ls288.u37", 0x0000, 0x0020, CRC(0a67edd6) SHA1(c1ece8978a3a061e0130d43907fa63a71e75e75d) BAD_DUMP ) // looks like interrupt vector PROM dumped with scrambled lines
+ ROM_LOAD( "74ls288.u38", 0x0020, 0x0020, CRC(5ec93ea7) SHA1(3a84c098474b05d5cbe1939a3e15f66d06470581) BAD_DUMP ) // looks like bad dump of address decode PROM
+ ROM_LOAD( "74ls288.u77", 0x0040, 0x0020, CRC(946e03b0) SHA1(24240bdd7bdf507a5b51628fb36ad1266fc53a28) BAD_DUMP ) // looks like bad dump of address decode PROM
ROM_END
-COMP( 1984?, zorba, 0, 0, zorba, zorba, zorba_state, zorba, "Modular Micros", "Zorba (Modular Micros)", MACHINE_NOT_WORKING )
+COMP( 1984?, zorba, 0, 0, zorba, zorba, zorba_state, zorba, "Modular Micros", "Zorba (Modular Micros)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
// Undumped versions (see startup screen notes at top of file)
// COMP( 1983, zorbat, zorba, 0, zorba, zorba, zorba_state, zorba, "Telcon Industries", "Zorba (Telcon Industries)", MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/zx.cpp b/src/mame/drivers/zx.cpp
index cf2096e31b8..d78ec6d6a05 100644
--- a/src/mame/drivers/zx.cpp
+++ b/src/mame/drivers/zx.cpp
@@ -339,11 +339,15 @@ static MACHINE_CONFIG_START( zx80, zx_state )
MCFG_CASSETTE_ADD( "cassette" )
MCFG_CASSETTE_FORMATS(zx80_o_format)
MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED)
+ MCFG_CASSETTE_INTERFACE("zx80_cass")
+
+ /* software lists */
+ MCFG_SOFTWARE_LIST_ADD("cass_list", "zx80_cass")
/* internal ram */
MCFG_RAM_ADD(RAM_TAG)
MCFG_RAM_DEFAULT_SIZE("1K")
- MCFG_RAM_EXTRA_OPTIONS("16K,32K,48K")
+ MCFG_RAM_EXTRA_OPTIONS("1K,2K,3K,16K")
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( zx81, zx80 )
@@ -352,7 +356,16 @@ static MACHINE_CONFIG_DERIVED( zx81, zx80 )
MCFG_CPU_IO_MAP(zx81_io_map)
MCFG_CASSETTE_MODIFY( "cassette" )
- MCFG_CASSETTE_FORMATS(zx81_p_format)
+ MCFG_CASSETTE_FORMATS(zx81_cassette_formats)
+ MCFG_CASSETTE_INTERFACE("zx81_cass")
+
+ /* software lists */
+ MCFG_SOFTWARE_LIST_MODIFY("cass_list", "zx81_cass")
+
+ /* internal ram */
+ MCFG_RAM_MODIFY(RAM_TAG)
+ MCFG_RAM_DEFAULT_SIZE("1K")
+ MCFG_RAM_EXTRA_OPTIONS("16K,32K,48K")
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( zx81_spk, zx81 )
@@ -368,6 +381,10 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( ts1000, zx81 )
MCFG_PALETTE_MODIFY("palette")
MCFG_PALETTE_INIT_OWNER(zx_state, ts1000)
+
+ /* internal ram */
+ MCFG_RAM_MODIFY(RAM_TAG)
+ MCFG_RAM_DEFAULT_SIZE("2K")
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( ts1500, ts1000 )
@@ -473,6 +490,7 @@ ROM_END
/* Game Drivers */
+/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
COMP( 1980, zx80, 0, 0, zx80, zx80, zx_state, zx, "Sinclair Research Ltd", "ZX-80", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW )
COMP( 1981, zx81, 0, 0, zx81, zx81, zx_state, zx, "Sinclair Research Ltd", "ZX-81", MACHINE_NO_SOUND_HW )
COMP( 1982, ts1000, zx81, 0, ts1000, zx81, zx_state, zx, "Timex Sinclair", "Timex Sinclair 1000", MACHINE_NO_SOUND_HW )
@@ -482,4 +500,4 @@ COMP( 1983, ringo470, zx81, 0, ts1000, zx81, zx_state, zx,
COMP( 1984, pc8300, zx81, 0, pc8300, pc8300, zx_state, zx, "Your Computer", "PC8300", MACHINE_NOT_WORKING )
COMP( 1983, pow3000, zx81, 0, pow3000, pow3000, zx_state, zx, "Creon Enterprises", "Power 3000", MACHINE_NOT_WORKING )
COMP( 1982, lambda, zx81, 0, pow3000, pow3000, zx_state, zx, "Lambda Electronics Ltd", "Lambda 8300", MACHINE_NOT_WORKING )
-COMP( 1997, zx97, zx81, 0, zx81, zx81, zx_state, zx, "Wilf Rigter", "ZX97", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW | MACHINE_UNOFFICIAL )
+COMP( 1997, zx97, zx81, 0, zx81, zx81, zx_state, zx, "Wilf Rigter", "ZX97", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW | MACHINE_UNOFFICIAL )
diff --git a/src/mame/includes/aerofgt.h b/src/mame/includes/aerofgt.h
index 7404cd3d689..621de27e2ad 100644
--- a/src/mame/includes/aerofgt.h
+++ b/src/mame/includes/aerofgt.h
@@ -29,7 +29,9 @@ public:
m_spr(*this, "vsystem_spr"),
m_spr_old(*this, "vsystem_spr_old"),
m_spr_old2(*this, "vsystem_spr_ol2"),
- m_soundlatch(*this, "soundlatch") { }
+ m_soundlatch(*this, "soundlatch"),
+ m_soundbank(*this, "soundbank"),
+ m_okibank(*this, "okibank") { }
/* memory pointers */
required_shared_ptr<uint16_t> m_bg1videoram;
@@ -53,7 +55,8 @@ public:
optional_device<vsystem_spr2_device> m_spr_old2; // or a pair of them..
optional_device<generic_latch_8_device> m_soundlatch;
-
+ optional_memory_bank m_soundbank;
+ optional_memory_bank m_okibank;
/* video-related */
tilemap_t *m_bg1_tilemap;
diff --git a/src/mame/includes/amiga.h b/src/mame/includes/amiga.h
index 5a01964f4f7..7e9c7bb852e 100644
--- a/src/mame/includes/amiga.h
+++ b/src/mame/includes/amiga.h
@@ -21,7 +21,7 @@ Ernesto Corvi & Mariusz Wojcieszek
#include "machine/msm6242.h"
#include "machine/akiko.h"
#include "machine/i2cmem.h"
-#include "sound/amiga.h"
+#include "machine/8364_paula.h"
#include "video/amigaaga.h"
@@ -336,7 +336,7 @@ public:
m_cia_1(*this, "cia_1"),
m_rs232(*this, "rs232"),
m_centronics(*this, "centronics"),
- m_sound(*this, "amiga"),
+ m_paula(*this, "amiga"),
m_fdc(*this, "fdc"),
m_screen(*this, "screen"),
m_palette(*this, "palette"),
@@ -378,12 +378,15 @@ public:
{
return EXPECTED(byteoffs < m_chip_ram.bytes()) ? m_chip_ram.read(byteoffs >> 1) : 0xffff;
}
+
void chip_ram_w(offs_t byteoffs, uint16_t data)
{
if (EXPECTED(byteoffs < m_chip_ram.bytes()))
m_chip_ram.write(byteoffs >> 1, data);
}
+ DECLARE_READ16_MEMBER(chip_ram_r) { return chip_ram_r(offset); }
+
/* sprite states */
uint8_t m_sprite_comparitor_enable_mask;
uint8_t m_sprite_dma_reload_mask;
@@ -467,6 +470,8 @@ public:
DECLARE_READ16_MEMBER( custom_chip_r );
DECLARE_WRITE16_MEMBER( custom_chip_w );
+ DECLARE_WRITE_LINE_MEMBER( paula_int_w );
+
DECLARE_READ16_MEMBER( rom_mirror_r );
DECLARE_READ32_MEMBER( rom_mirror32_r );
@@ -563,7 +568,7 @@ protected:
required_device<mos8520_device> m_cia_1;
optional_device<rs232_port_device> m_rs232;
optional_device<centronics_device> m_centronics;
- required_device<amiga_sound_device> m_sound;
+ required_device<paula_8364_device> m_paula;
optional_device<amiga_fdc> m_fdc;
required_device<screen_device> m_screen;
optional_device<palette_device> m_palette;
diff --git a/src/mame/includes/cclimber.h b/src/mame/includes/cclimber.h
index 30cf4b45d85..2b1ec8a32b6 100644
--- a/src/mame/includes/cclimber.h
+++ b/src/mame/includes/cclimber.h
@@ -63,6 +63,7 @@ public:
DECLARE_READ8_MEMBER(yamato_p1_r);
DECLARE_WRITE8_MEMBER(toprollr_rombank_w);
DECLARE_WRITE8_MEMBER(nmi_mask_w);
+ DECLARE_READ8_MEMBER(bagmanf_a000_r);
DECLARE_WRITE8_MEMBER(cclimber_colorram_w);
DECLARE_WRITE8_MEMBER(cannonb_flip_screen_w);
diff --git a/src/mame/includes/changela.h b/src/mame/includes/changela.h
index a66adab876c..025a661153c 100644
--- a/src/mame/includes/changela.h
+++ b/src/mame/includes/changela.h
@@ -85,14 +85,14 @@ public:
protected:
// memory pointers
- required_shared_ptr<u8> m_spriteram;
- required_shared_ptr<u8> m_videoram;
- required_shared_ptr<u8> m_colorram;
+ required_shared_ptr<u8> m_spriteram;
+ required_shared_ptr<u8> m_videoram;
+ required_shared_ptr<u8> m_colorram;
// devices
- required_device<m68705p_device> m_mcu;
- required_device<cpu_device> m_maincpu;
- required_device<screen_device> m_screen;
+ required_device<m68705p_device> m_mcu;
+ required_device<cpu_device> m_maincpu;
+ required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
// mcu-related
diff --git a/src/mame/includes/coco.h b/src/mame/includes/coco.h
index ccc7018b0aa..8853b3155eb 100644
--- a/src/mame/includes/coco.h
+++ b/src/mame/includes/coco.h
@@ -32,7 +32,6 @@
//**************************************************************************
INPUT_PORTS_EXTERN( coco_analog_control );
-INPUT_PORTS_EXTERN( coco_cart_autostart );
INPUT_PORTS_EXTERN( coco_rtc );
INPUT_PORTS_EXTERN( coco_beckerport );
@@ -58,7 +57,6 @@ SLOT_INTERFACE_EXTERN( coco_cart );
// inputs
#define CTRL_SEL_TAG "ctrl_sel"
#define HIRES_INTF_TAG "hires_intf"
-#define CART_AUTOSTART_TAG "cart_autostart"
#define BECKERPORT_TAG "beckerport"
#define JOYSTICK_RX_TAG "joystick_rx"
#define JOYSTICK_RY_TAG "joystick_ry"
diff --git a/src/mame/includes/dc.h b/src/mame/includes/dc.h
index 0d4f86e300a..37d9f304f50 100644
--- a/src/mame/includes/dc.h
+++ b/src/mame/includes/dc.h
@@ -77,6 +77,11 @@ class dc_state : public driver_device
DECLARE_WRITE64_MEMBER( dc_modem_w );
DECLARE_WRITE8_MEMBER( g1_irq );
DECLARE_WRITE8_MEMBER( pvr_irq );
+ DECLARE_READ64_MEMBER( sh4_soundram_r );
+ DECLARE_WRITE64_MEMBER( sh4_soundram_w );
+ DECLARE_WRITE_LINE_MEMBER(aica_irq);
+ DECLARE_WRITE_LINE_MEMBER(sh4_aica_irq);
+
required_device<sh4_base_device> m_maincpu;
required_device<cpu_device> m_soundcpu;
@@ -87,6 +92,9 @@ class dc_state : public driver_device
void generic_dma(uint32_t main_adr, void *dma_ptr, uint32_t length, uint32_t size, bool to_mainram);
TIMER_DEVICE_CALLBACK_MEMBER(dc_scanline);
+ DECLARE_MACHINE_RESET(dc_console);
+
+ DECLARE_INPUT_CHANGED_MEMBER(mastercpu_cheat_r);
};
/*--------- Ch2-DMA Control Registers ----------*/
diff --git a/src/mame/includes/dccons.h b/src/mame/includes/dccons.h
index 8c7d3ba7bb6..90767a3219b 100644
--- a/src/mame/includes/dccons.h
+++ b/src/mame/includes/dccons.h
@@ -24,7 +24,6 @@ public:
DECLARE_READ64_MEMBER(dcus_idle_skip_r);
DECLARE_READ64_MEMBER(dcjp_idle_skip_r);
- DECLARE_MACHINE_RESET(dc_console);
DECLARE_READ64_MEMBER(dc_pdtra_r);
DECLARE_WRITE64_MEMBER(dc_pdtra_w);
DECLARE_READ64_MEMBER(dc_arm_r);
diff --git a/src/mame/includes/ddragon.h b/src/mame/includes/ddragon.h
index 775c4bd3e55..caf4cce2bd4 100644
--- a/src/mame/includes/ddragon.h
+++ b/src/mame/includes/ddragon.h
@@ -6,31 +6,34 @@
*************************************************************************/
+#include "cpu/m6805/m68705.h"
#include "machine/gen_latch.h"
#include "sound/msm5205.h"
+
class ddragon_state : public driver_device
{
public:
ddragon_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_rambase(*this, "rambase"),
- m_bgvideoram(*this, "bgvideoram"),
- m_fgvideoram(*this, "fgvideoram"),
- m_comram(*this, "comram"),
- m_spriteram(*this, "spriteram"),
- m_scrollx_lo(*this, "scrollx_lo"),
- m_scrolly_lo(*this, "scrolly_lo"),
- m_darktowr_mcu_ports(*this, "darktowr_mcu"),
- m_maincpu(*this, "maincpu"),
- m_soundcpu(*this, "soundcpu"),
- m_subcpu(*this, "sub"),
- m_adpcm1(*this, "adpcm1"),
- m_adpcm2(*this, "adpcm2"),
- m_gfxdecode(*this, "gfxdecode"),
- m_screen(*this, "screen"),
- m_palette(*this, "palette"),
- m_soundlatch(*this, "soundlatch") { }
+ : driver_device(mconfig, type, tag)
+ , m_rambase(*this, "rambase")
+ , m_bgvideoram(*this, "bgvideoram")
+ , m_fgvideoram(*this, "fgvideoram")
+ , m_comram(*this, "comram")
+ , m_spriteram(*this, "spriteram")
+ , m_scrollx_lo(*this, "scrollx_lo")
+ , m_scrolly_lo(*this, "scrolly_lo")
+ , m_maincpu(*this, "maincpu")
+ , m_soundcpu(*this, "soundcpu")
+ , m_subcpu(*this, "sub")
+ , m_adpcm1(*this, "adpcm1")
+ , m_adpcm2(*this, "adpcm2")
+ , m_gfxdecode(*this, "gfxdecode")
+ , m_screen(*this, "screen")
+ , m_palette(*this, "palette")
+ , m_soundlatch(*this, "soundlatch")
+ {
+ }
/* memory pointers */
optional_shared_ptr<uint8_t> m_rambase;
@@ -40,7 +43,6 @@ public:
required_shared_ptr<uint8_t> m_spriteram;
required_shared_ptr<uint8_t> m_scrollx_lo;
required_shared_ptr<uint8_t> m_scrolly_lo;
- optional_shared_ptr<uint8_t> m_darktowr_mcu_ports;
/* video-related */
tilemap_t *m_fg_tilemap;
@@ -105,15 +107,10 @@ public:
DECLARE_WRITE8_MEMBER(ddragon_fgvideoram_w);
DECLARE_CUSTOM_INPUT_MEMBER(subcpu_bus_free);
DECLARE_WRITE8_MEMBER(ddragon_bankswitch_w);
- DECLARE_WRITE8_MEMBER(toffy_bankswitch_w);
- DECLARE_READ8_MEMBER(darktowr_mcu_bank_r);
- DECLARE_WRITE8_MEMBER(darktowr_mcu_bank_w);
- DECLARE_WRITE8_MEMBER(darktowr_bankswitch_w);
DECLARE_READ8_MEMBER(ddragon_interrupt_r);
DECLARE_WRITE8_MEMBER(ddragon_interrupt_w);
DECLARE_WRITE8_MEMBER(ddragon2_sub_irq_ack_w);
DECLARE_WRITE8_MEMBER(ddragon2_sub_irq_w);
- DECLARE_WRITE8_MEMBER(darktowr_mcu_w);
DECLARE_READ8_MEMBER(ddragon_hd63701_internal_registers_r);
DECLARE_WRITE8_MEMBER(ddragon_hd63701_internal_registers_w);
DECLARE_READ8_MEMBER(ddragon_comram_r);
@@ -124,9 +121,45 @@ public:
DECLARE_WRITE_LINE_MEMBER(dd_adpcm_int_1);
DECLARE_WRITE_LINE_MEMBER(dd_adpcm_int_2);
- DECLARE_DRIVER_INIT(toffy);
- DECLARE_DRIVER_INIT(darktowr);
DECLARE_DRIVER_INIT(ddragon2);
DECLARE_DRIVER_INIT(ddragon);
DECLARE_DRIVER_INIT(ddragon6809);
};
+
+
+class darktowr_state : public ddragon_state
+{
+public:
+ darktowr_state(const machine_config &mconfig, device_type type, const char *tag)
+ : ddragon_state(mconfig, type, tag)
+ , m_mcu(*this, "mcu")
+ , m_mcu_port_a_out(0xff)
+ {
+ }
+
+ DECLARE_READ8_MEMBER(darktowr_mcu_bank_r);
+ DECLARE_WRITE8_MEMBER(darktowr_mcu_bank_w);
+ DECLARE_WRITE8_MEMBER(darktowr_bankswitch_w);
+ DECLARE_WRITE8_MEMBER(mcu_port_a_w);
+
+ DECLARE_DRIVER_INIT(darktowr);
+
+protected:
+ required_device<m68705p_device> m_mcu;
+
+ uint8_t m_mcu_port_a_out;;
+};
+
+
+class toffy_state : public ddragon_state
+{
+public:
+ toffy_state(const machine_config &mconfig, device_type type, const char *tag)
+ : ddragon_state(mconfig, type, tag)
+ {
+ }
+
+ DECLARE_WRITE8_MEMBER(toffy_bankswitch_w);
+
+ DECLARE_DRIVER_INIT(toffy);
+};
diff --git a/src/mame/includes/dec0.h b/src/mame/includes/dec0.h
index af3899ff356..415ccb58174 100644
--- a/src/mame/includes/dec0.h
+++ b/src/mame/includes/dec0.h
@@ -10,6 +10,12 @@
class dec0_state : public driver_device
{
public:
+ enum class mcu_type {
+ EMULATED,
+ BADDUDES_SIM,
+ BIRDTRY_SIM
+ };
+
dec0_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
@@ -47,9 +53,9 @@ public:
optional_shared_ptr<uint8_t> m_robocop_shared_ram;
optional_shared_ptr<uint8_t> m_hippodrm_shared_ram;
- int m_game;
- int m_i8751_return;
- int m_i8751_command;
+ mcu_type m_game;
+ uint16_t m_i8751_return;
+ uint16_t m_i8751_command;
int m_slyspy_state;
int m_hippodrm_msb;
int m_hippodrm_lsb;
@@ -85,7 +91,7 @@ public:
DECLARE_DRIVER_INIT(hbarrel);
DECLARE_DRIVER_INIT(slyspy);
DECLARE_DRIVER_INIT(birdtry);
- DECLARE_DRIVER_INIT(baddudes);
+ DECLARE_DRIVER_INIT(drgninja);
DECLARE_DRIVER_INIT(midresb);
DECLARE_DRIVER_INIT(ffantasybl);
diff --git a/src/mame/includes/deco32.h b/src/mame/includes/deco32.h
index 0bf7a485dcd..07938191fdb 100644
--- a/src/mame/includes/deco32.h
+++ b/src/mame/includes/deco32.h
@@ -186,7 +186,7 @@ public:
uint16_t port_b_tattass(int unused);
void tattass_sound_cb( address_space &space, uint16_t data, uint16_t mem_mask );
void deco32_set_audio_output(uint8_t raw_data);
-
+
DECO16IC_BANK_CB_MEMBER(fghthist_bank_callback);
DECO16IC_BANK_CB_MEMBER(captaven_bank_callback);
DECO16IC_BANK_CB_MEMBER(tattass_bank_callback);
diff --git a/src/mame/includes/fidelbase.h b/src/mame/includes/fidelbase.h
new file mode 100644
index 00000000000..1f36fdc490b
--- /dev/null
+++ b/src/mame/includes/fidelbase.h
@@ -0,0 +1,70 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/******************************************************************************
+*
+* Fidelity Electronics chess machines base class
+*
+******************************************************************************/
+
+#include "emu.h"
+#include "sound/dac.h"
+#include "sound/s14001a.h"
+#include "bus/generic/slot.h"
+#include "bus/generic/carts.h"
+#include "softlist.h"
+
+class fidelbase_state : public driver_device
+{
+public:
+ fidelbase_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_inp_matrix(*this, "IN.%u", 0),
+ m_speech(*this, "speech"),
+ m_speech_rom(*this, "speech"),
+ m_dac(*this, "dac"),
+ m_cart(*this, "cartslot"),
+ m_display_wait(33),
+ m_display_maxy(1),
+ m_display_maxx(0)
+ { }
+
+ // devices/pointers
+ required_device<cpu_device> m_maincpu;
+ optional_ioport_array<11> m_inp_matrix; // max 11
+ optional_device<s14001a_device> m_speech;
+ optional_region_ptr<u8> m_speech_rom;
+ optional_device<dac_bit_interface> m_dac;
+ optional_device<generic_slot_device> m_cart;
+
+ // misc common
+ u16 m_inp_mux; // multiplexed keypad/leds mask
+ u16 m_led_select;
+ u32 m_7seg_data; // data for seg leds
+ u16 m_led_data;
+ u8 m_speech_data;
+ u8 m_speech_bank; // speech rom higher address bits
+
+ u16 read_inputs(int columns);
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(scc_cartridge);
+
+ // display common
+ int m_display_wait; // led/lamp off-delay in microseconds (default 33ms)
+ int m_display_maxy; // display matrix number of rows
+ int m_display_maxx; // display matrix number of columns (max 31 for now)
+
+ u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
+ u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
+ u32 m_display_cache[0x20]; // (internal use)
+ u8 m_display_decay[0x20][0x20]; // (internal use)
+
+ TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
+ void display_update();
+ void set_display_size(int maxx, int maxy);
+ void set_display_segmask(u32 digits, u32 mask);
+ void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true);
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+};
diff --git a/src/mame/includes/fidelz80.h b/src/mame/includes/fidelz80.h
deleted file mode 100644
index 1fe4e19cb6b..00000000000
--- a/src/mame/includes/fidelz80.h
+++ /dev/null
@@ -1,71 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Kevin Horton,Jonathan Gevaryahu,Sandro Ronco,hap
-// thanks-to:Berger
-/******************************************************************************
-*
-* Fidelity Electronics Z80 based board driver
-*
-******************************************************************************/
-
-#include "emu.h"
-#include "sound/dac.h"
-#include "sound/s14001a.h"
-#include "bus/generic/slot.h"
-#include "bus/generic/carts.h"
-#include "softlist.h"
-
-class fidelz80base_state : public driver_device
-{
-public:
- fidelz80base_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_inp_matrix(*this, "IN.%u", 0),
- m_speech(*this, "speech"),
- m_speech_rom(*this, "speech"),
- m_dac(*this, "dac"),
- m_cart(*this, "cartslot"),
- m_display_wait(33),
- m_display_maxy(1),
- m_display_maxx(0)
- { }
-
- // devices/pointers
- required_device<cpu_device> m_maincpu;
- optional_ioport_array<11> m_inp_matrix; // max 11
- optional_device<s14001a_device> m_speech;
- optional_region_ptr<uint8_t> m_speech_rom;
- optional_device<dac_bit_interface> m_dac;
- optional_device<generic_slot_device> m_cart;
-
- // misc common
- uint16_t m_inp_mux; // multiplexed keypad/leds mask
- uint16_t m_led_select;
- uint32_t m_7seg_data; // data for seg leds
- uint16_t m_led_data;
- uint8_t m_speech_data;
- uint8_t m_speech_bank; // speech rom higher address bits
-
- uint16_t read_inputs(int columns);
- DECLARE_DEVICE_IMAGE_LOAD_MEMBER(scc_cartridge);
-
- // display common
- int m_display_wait; // led/lamp off-delay in microseconds (default 33ms)
- int m_display_maxy; // display matrix number of rows
- int m_display_maxx; // display matrix number of columns (max 31 for now)
-
- uint32_t m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
- uint16_t m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
- uint32_t m_display_cache[0x20]; // (internal use)
- uint8_t m_display_decay[0x20][0x20]; // (internal use)
-
- TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
- void display_update();
- void set_display_size(int maxx, int maxy);
- void set_display_segmask(uint32_t digits, uint32_t mask);
- void display_matrix(int maxx, int maxy, uint32_t setx, uint32_t sety, bool update = true);
-
-protected:
- virtual void machine_start() override;
- virtual void machine_reset() override;
-};
diff --git a/src/mame/includes/gcpinbal.h b/src/mame/includes/gcpinbal.h
index 92346a6f767..e945eae55c5 100644
--- a/src/mame/includes/gcpinbal.h
+++ b/src/mame/includes/gcpinbal.h
@@ -1,6 +1,8 @@
// license:BSD-3-Clause
// copyright-holders:David Graves, R. Belmont
+#include "machine/74157.h"
+#include "machine/eepromser.h"
#include "sound/okim6295.h"
#include "sound/msm5205.h"
#include "video/excellent_spr.h"
@@ -17,8 +19,10 @@ public:
gcpinbal_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
+ m_eeprom(*this, "eeprom"),
m_oki(*this, "oki"),
m_msm(*this, "msm"),
+ m_adpcm_select(*this, "adpcm_select"),
m_tilemapram(*this, "tilemapram"),
m_ioc_ram(*this, "ioc_ram"),
m_gfxdecode(*this, "gfxdecode"),
@@ -28,8 +32,10 @@ public:
/* devices */
required_device<cpu_device> m_maincpu;
+ required_device<eeprom_serial_93cxx_device> m_eeprom;
required_device<okim6295_device> m_oki;
required_device<msm6585_device> m_msm;
+ required_device<hct157_device> m_adpcm_select;
/* memory pointers */
required_shared_ptr<uint16_t> m_tilemapram;
@@ -56,7 +62,6 @@ public:
uint32_t m_adpcm_end;
uint32_t m_adpcm_idle;
uint8_t m_adpcm_trigger;
- uint8_t m_adpcm_data;
DECLARE_READ16_MEMBER(ioc_r);
DECLARE_WRITE16_MEMBER(ioc_w);
diff --git a/src/mame/includes/gladiatr.h b/src/mame/includes/gladiatr.h
index 60166ed4b99..39c99eb8391 100644
--- a/src/mame/includes/gladiatr.h
+++ b/src/mame/includes/gladiatr.h
@@ -83,8 +83,6 @@ public:
, m_in2(*this, "IN2")
, m_coins(*this, "COINS")
, m_tclk_val(false)
- , m_in0_val(0xff)
- , m_in1_val(0xff)
, m_cctl_p1(0xff)
, m_cctl_p2(0xff)
, m_ucpu_p1(0xff)
@@ -123,6 +121,11 @@ public:
DECLARE_WRITE8_MEMBER(csnd_p1_w);
DECLARE_READ8_MEMBER(csnd_p2_r);
+ DECLARE_INPUT_CHANGED_MEMBER(p1_s1);
+ DECLARE_INPUT_CHANGED_MEMBER(p1_s2);
+ DECLARE_INPUT_CHANGED_MEMBER(p2_s1);
+ DECLARE_INPUT_CHANGED_MEMBER(p2_s2);
+
DECLARE_DRIVER_INIT(gladiatr);
DECLARE_MACHINE_RESET(gladiator);
@@ -137,7 +140,6 @@ private:
required_ioport m_coins;
bool m_tclk_val;
- u8 m_in0_val, m_in1_val;
u8 m_cctl_p1, m_cctl_p2;
u8 m_ucpu_p1, m_csnd_p1;
diff --git a/src/mame/includes/gundealr.h b/src/mame/includes/gundealr.h
index dff065de3b2..c0439ab4d57 100644
--- a/src/mame/includes/gundealr.h
+++ b/src/mame/includes/gundealr.h
@@ -28,7 +28,6 @@ public:
/* video-related */
tilemap_t *m_bg_tilemap;
tilemap_t *m_fg_tilemap;
- int m_flipscreen;
uint8_t m_scroll[4];
/* misc */
@@ -40,6 +39,7 @@ public:
DECLARE_WRITE8_MEMBER(gundealr_fg_scroll_w);
DECLARE_WRITE8_MEMBER(yamyam_fg_scroll_w);
DECLARE_WRITE8_MEMBER(gundealr_flipscreen_w);
+ DECLARE_WRITE8_MEMBER(yamyam_flipscreen_w);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILEMAP_MAPPER_MEMBER(gundealr_scan);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
diff --git a/src/mame/includes/hh_tms1k.h b/src/mame/includes/hh_tms1k.h
index b24642aa789..35b27a579ab 100644
--- a/src/mame/includes/hh_tms1k.h
+++ b/src/mame/includes/hh_tms1k.h
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:hap, Sean Riddle, Kevin Horton
+// copyright-holders:hap
/*
TMS1000 MCU series tabletops/handhelds or other simple devices.
@@ -39,35 +39,35 @@ public:
optional_device<speaker_sound_device> m_speaker;
// misc common
- uint16_t m_r; // MCU R-pins data
- uint16_t m_o; // MCU O-pins data
- uint32_t m_inp_mux; // multiplexed inputs mask
+ u16 m_r; // MCU R-pins data
+ u16 m_o; // MCU O-pins data
+ u32 m_inp_mux; // multiplexed inputs mask
bool m_power_on;
bool m_power_led;
- uint8_t read_inputs(int columns);
- uint8_t read_rotated_inputs(int columns, uint8_t rowmask = 0xf);
+ u8 read_inputs(int columns);
+ u8 read_rotated_inputs(int columns, u8 rowmask = 0xf);
virtual DECLARE_INPUT_CHANGED_MEMBER(power_button);
virtual DECLARE_WRITE_LINE_MEMBER(auto_power_off);
// display common
- int m_display_wait; // led/lamp off-delay in microseconds (default 33ms)
- int m_display_maxy; // display matrix number of rows
- int m_display_maxx; // display matrix number of columns (max 31 for now)
+ int m_display_wait; // led/lamp off-delay in microseconds (default 33ms)
+ int m_display_maxy; // display matrix number of rows
+ int m_display_maxx; // display matrix number of columns (max 31 for now)
- uint32_t m_grid; // VFD/LED current row data
- uint32_t m_plate; // VFD/LED current column data
+ u32 m_grid; // VFD/LED current row data
+ u32 m_plate; // VFD/LED current column data
- uint32_t m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
- uint16_t m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
- uint32_t m_display_cache[0x20]; // (internal use)
- uint8_t m_display_decay[0x20][0x20]; // (internal use)
+ u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
+ u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
+ u32 m_display_cache[0x20]; // (internal use)
+ u8 m_display_decay[0x20][0x20]; // (internal use)
TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
void display_update();
void set_display_size(int maxx, int maxy);
- void set_display_segmask(uint32_t digits, uint32_t mask);
- void display_matrix(int maxx, int maxy, uint32_t setx, uint32_t sety, bool update = true);
+ void set_display_segmask(u32 digits, u32 mask);
+ void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true);
protected:
virtual void machine_start() override;
diff --git a/src/mame/includes/hh_ucom4.h b/src/mame/includes/hh_ucom4.h
index 4a0194e3cb0..8328809c09a 100644
--- a/src/mame/includes/hh_ucom4.h
+++ b/src/mame/includes/hh_ucom4.h
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:hap, Kevin Horton
+// copyright-holders:hap
/*
NEC uCOM4 MCU tabletops/handhelds or other simple devices,
@@ -35,32 +35,32 @@ public:
optional_device<speaker_sound_device> m_speaker;
// misc common
- uint8_t m_port[9]; // MCU port A-I write data (optional)
- uint8_t m_int; // MCU INT pin state
- uint16_t m_inp_mux; // multiplexed inputs mask
+ u8 m_port[9]; // MCU port A-I write data (optional)
+ u8 m_int; // MCU INT pin state
+ u16 m_inp_mux; // multiplexed inputs mask
- uint8_t read_inputs(int columns);
+ u8 read_inputs(int columns);
void refresh_interrupts(void);
void set_interrupt(int state);
DECLARE_INPUT_CHANGED_MEMBER(single_interrupt_line);
// display common
- int m_display_wait; // led/lamp off-delay in microseconds (default 33ms)
- int m_display_maxy; // display matrix number of rows
- int m_display_maxx; // display matrix number of columns (max 31 for now)
+ int m_display_wait; // led/lamp off-delay in microseconds (default 33ms)
+ int m_display_maxy; // display matrix number of rows
+ int m_display_maxx; // display matrix number of columns (max 31 for now)
- uint32_t m_grid; // VFD current row data
- uint32_t m_plate; // VFD current column data
+ u32 m_grid; // VFD current row data
+ u32 m_plate; // VFD current column data
- uint32_t m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
- uint16_t m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
- uint32_t m_display_cache[0x20]; // (internal use)
- uint8_t m_display_decay[0x20][0x20]; // (internal use)
+ u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
+ u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
+ u32 m_display_cache[0x20]; // (internal use)
+ u8 m_display_decay[0x20][0x20]; // (internal use)
TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
void display_update();
void set_display_size(int maxx, int maxy);
- void display_matrix(int maxx, int maxy, uint32_t setx, uint32_t sety, bool update = true);
+ void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true);
protected:
virtual void machine_start() override;
diff --git a/src/mame/includes/interpro.h b/src/mame/includes/interpro.h
new file mode 100644
index 00000000000..6ae135b552c
--- /dev/null
+++ b/src/mame/includes/interpro.h
@@ -0,0 +1,131 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+
+#pragma once
+
+#ifndef INTERPRO_H_
+#define INTERPRO_H_
+
+#include "emu.h"
+
+#include "cpu/clipper/clipper.h"
+#include "machine/cammu.h"
+
+#include "machine/interpro_ioga.h"
+#include "machine/interpro_mcga.h"
+#include "machine/interpro_sga.h"
+
+#include "machine/z80scc.h"
+#include "machine/mc146818.h"
+#include "machine/upd765.h"
+#include "machine/ncr539x.h"
+
+#include "bus/scsi/scsi.h"
+#include "bus/scsi/scsicd.h"
+#include "bus/scsi/scsihd.h"
+#include "bus/rs232/rs232.h"
+
+#include "formats/pc_dsk.h"
+
+#define INTERPRO_CPU_TAG "cpu"
+#define INTERPRO_MMU_TAG "mmu"
+
+#define INTERPRO_RTC_TAG "rtc"
+#define INTERPRO_SCC1_TAG "scc1"
+#define INTERPRO_SCC2_TAG "scc2"
+#define INTERPRO_ROM_TAG "rom"
+#define INTERPRO_EEPROM_TAG "eeprom"
+#define INTERPRO_TERMINAL_TAG "terminal"
+#define INTERPRO_FDC_TAG "fdc"
+#define INTERPRO_SCSI_TAG "scsi"
+#define INTERPRO_IOGA_TAG "ioga"
+#define INTERPRO_MCGA_TAG "mcga"
+#define INTERPRO_SGA_TAG "sga"
+#define INTERPRO_SCSI_ADAPTER_TAG "adapter"
+
+// system board register offsets
+#define SREG_LED 0
+#define SREG_ERROR 0
+#define SREG_STATUS 1
+#define SREG_CTRL1 2
+#define SREG_CTRL2 3
+
+// control register 1
+#define CTRL1_FLOPLOW 0x0001
+#define CTRL1_FLOPRDY 0x0002
+#define CTRL1_LEDENA 0x0004
+#define CTRL1_LEDDP 0x0008
+#define CTRL1_ETHLOOP 0x0010
+#define CTRL1_ETHDTR 0x0020
+#define CTRL1_ETHRMOD 0x0040
+#define CTRL1_CLIPRESET 0x0040
+#define CTRL1_FIFOACTIVE 0x0080
+
+// control register 2
+#define CTRL2_PWRUP 0x0001
+#define CTRL2_PWRENA 0x0002
+#define CTRL2_HOLDOFF 0x0004
+#define CTRL2_EXTNMIENA 0x0008
+#define CTRL2_COLDSTART 0x0010
+#define CTRL2_RESET 0x0020
+#define CTRL2_BUSENA 0x0040
+#define CTRL2_FRCPARITY 0x0080
+#define CTRL2_FLASHEN 0x0080
+#define CTRL2_WMASK 0x000f
+
+class interpro_state : public driver_device
+{
+public:
+ interpro_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag),
+ m_maincpu(*this, INTERPRO_CPU_TAG),
+ m_mmu(*this, INTERPRO_MMU_TAG),
+ m_scc1(*this, INTERPRO_SCC1_TAG),
+ m_scc2(*this, INTERPRO_SCC2_TAG),
+ m_rtc(*this, INTERPRO_RTC_TAG),
+ m_fdc(*this, INTERPRO_FDC_TAG),
+ m_scsi(*this, INTERPRO_SCSI_ADAPTER_TAG),
+ m_ioga(*this, INTERPRO_IOGA_TAG),
+ m_mcga(*this, INTERPRO_MCGA_TAG),
+ m_sga(*this, INTERPRO_SGA_TAG)
+ { }
+
+ required_device<clipper_device> m_maincpu;
+ required_device<cammu_device> m_mmu;
+
+ // FIXME: not sure which one is the escc
+ required_device<z80scc_device> m_scc1;
+ required_device<z80scc_device> m_scc2;
+ required_device<mc146818_device> m_rtc;
+ required_device<n82077aa_device> m_fdc;
+ required_device<ncr539x_device> m_scsi;
+
+ required_device<interpro_ioga_device> m_ioga;
+ required_device<interpro_mcga_device> m_mcga;
+ required_device<interpro_sga_device> m_sga;
+
+ DECLARE_DRIVER_INIT(ip2800);
+
+ DECLARE_WRITE16_MEMBER(system_w);
+ DECLARE_READ16_MEMBER(system_r);
+
+ DECLARE_WRITE8_MEMBER(rtc_w);
+ DECLARE_READ8_MEMBER(rtc_r);
+
+ DECLARE_READ32_MEMBER(idprom_r);
+ DECLARE_READ32_MEMBER(slot0_r);
+
+ DECLARE_READ8_MEMBER(scsi_r);
+ DECLARE_WRITE8_MEMBER(scsi_w);
+
+ DECLARE_FLOPPY_FORMATS(floppy_formats);
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+private:
+ uint16_t m_system_reg[4];
+};
+
+#endif \ No newline at end of file
diff --git a/src/mame/includes/metro.h b/src/mame/includes/metro.h
index 0cf865a564b..b0c7b45d78f 100644
--- a/src/mame/includes/metro.h
+++ b/src/mame/includes/metro.h
@@ -168,7 +168,7 @@ public:
// vmetal
DECLARE_WRITE8_MEMBER(vmetal_control_w);
- DECLARE_WRITE8_MEMBER(vmetal_es8712_w);
+ DECLARE_WRITE8_MEMBER(vmetal_se_control_w);
DECLARE_DRIVER_INIT(karatour);
DECLARE_DRIVER_INIT(daitorid);
diff --git a/src/mame/includes/namcos2.h b/src/mame/includes/namcos2.h
index 5ad57bee517..459bd749e29 100644
--- a/src/mame/includes/namcos2.h
+++ b/src/mame/includes/namcos2.h
@@ -143,7 +143,7 @@ public:
void reset_all_subcpus(int state);
TIMER_DEVICE_CALLBACK_MEMBER(screen_scanline);
-
+
// C123 Tilemap Emulation
// TODO: merge with namcos1.cpp implementation and convert to device
public:
@@ -334,7 +334,7 @@ public:
int get_pos_irq_scanline() { return (get_palette_register(5) - 32) & 0xff; }
TIMER_DEVICE_CALLBACK_MEMBER(screen_scanline);
-
+
required_shared_ptr<uint8_t> m_dpram; /* 2Kx8 */
required_shared_ptr<uint16_t> m_paletteram;
optional_shared_ptr<uint16_t> m_spriteram;
diff --git a/src/mame/includes/namcos21.h b/src/mame/includes/namcos21.h
index 0ec60ea94e5..1816bf5f557 100644
--- a/src/mame/includes/namcos21.h
+++ b/src/mame/includes/namcos21.h
@@ -70,7 +70,7 @@ public:
optional_device<cpu_device> m_dsp;
optional_device<namcoio_gearbox_device> m_io_gearbox;
optional_device<namco_c148_device> m_gpu_intc;
-
+
std::unique_ptr<uint8_t[]> m_videoram;
std::unique_ptr<uint8_t[]> m_maskram;
std::unique_ptr<uint16_t[]> m_winrun_dspcomram;
@@ -158,12 +158,12 @@ public:
DECLARE_WRITE16_MEMBER(winrun_gpu_register_w);
DECLARE_WRITE16_MEMBER(winrun_gpu_videoram_w);
DECLARE_READ16_MEMBER(winrun_gpu_videoram_r);
-
+
TIMER_DEVICE_CALLBACK_MEMBER(screen_scanline);
uint8_t m_gearbox_state;
DECLARE_CUSTOM_INPUT_MEMBER(driveyes_gearbox_r);
-
+
DECLARE_DRIVER_INIT(driveyes);
DECLARE_DRIVER_INIT(winrun);
DECLARE_DRIVER_INIT(starblad);
diff --git a/src/mame/includes/naomi.h b/src/mame/includes/naomi.h
index c9f1b7ba16d..5fa4de38c37 100644
--- a/src/mame/includes/naomi.h
+++ b/src/mame/includes/naomi.h
@@ -35,59 +35,36 @@ enum {
JVSBD_MAHJONG,
JVSBD_KEYBOARD
};
+
class naomi_state : public dc_state
{
public:
naomi_state(const machine_config &mconfig, device_type type, const char *tag)
: dc_state(mconfig, type, tag),
- pvr2_texture_ram(*this, "textureram2"),
- pvr2_framebuffer_ram(*this, "frameram2"),
- elan_ram(*this, "elan_ram"),
- m_awflash(*this, "awflash"),
m_eeprom(*this, "main_eeprom") { }
- /* Naomi 2 specific (To be moved) */
- optional_shared_ptr<uint64_t> pvr2_texture_ram;
- optional_shared_ptr<uint64_t> pvr2_framebuffer_ram;
- optional_shared_ptr<uint64_t> elan_ram;
- optional_device<macronix_29l001mc_device> m_awflash;
- optional_device<eeprom_serial_93cxx_device> m_eeprom;
+ required_device<eeprom_serial_93cxx_device> m_eeprom;
- DECLARE_WRITE_LINE_MEMBER(aica_irq);
- DECLARE_WRITE_LINE_MEMBER(sh4_aica_irq);
DECLARE_MACHINE_RESET(naomi);
- DECLARE_DRIVER_INIT(atomiswave);
- DECLARE_DRIVER_INIT(xtrmhnt2);
DECLARE_DRIVER_INIT(naomigd);
DECLARE_DRIVER_INIT(ggxx);
DECLARE_DRIVER_INIT(ggxxrl);
DECLARE_DRIVER_INIT(ggxxsla);
- DECLARE_DRIVER_INIT(naomi2);
DECLARE_DRIVER_INIT(naomi);
DECLARE_DRIVER_INIT(naomigd_mp);
DECLARE_DRIVER_INIT(sfz3ugd);
DECLARE_DRIVER_INIT(hotd2);
DECLARE_DRIVER_INIT(naomi_mp);
- DECLARE_READ64_MEMBER( naomi_arm_r );
- DECLARE_WRITE64_MEMBER( naomi_arm_w );
DECLARE_READ64_MEMBER( naomi_unknown1_r );
DECLARE_WRITE64_MEMBER( naomi_unknown1_w );
DECLARE_READ64_MEMBER( eeprom_93c46a_r );
DECLARE_WRITE64_MEMBER( eeprom_93c46a_w );
- DECLARE_READ64_MEMBER( aw_flash_r );
- DECLARE_WRITE64_MEMBER( aw_flash_w );
- DECLARE_READ64_MEMBER( aw_modem_r );
- DECLARE_WRITE64_MEMBER( aw_modem_w );
uint8_t m_mp_mux;
DECLARE_CUSTOM_INPUT_MEMBER(naomi_mp_r);
DECLARE_INPUT_CHANGED_MEMBER(naomi_mp_w);
- inline int decode_reg32_64(uint32_t offset, uint64_t mem_mask, uint64_t *shift);
-
- uint8_t aw_ctrl_type;
-
uint8_t asciihex_to_dec(uint8_t in);
void create_pic_from_retdat();
@@ -99,8 +76,53 @@ class naomi_state : public dc_state
DECLARE_READ64_MEMBER( naomigd_ggxxrl_idle_skip_r );
DECLARE_READ64_MEMBER( naomigd_sfz3ugd_idle_skip_r );
DECLARE_READ64_MEMBER( hotd2_idle_skip_r );
+};
+
+class naomi2_state : public naomi_state
+{
+public:
+ naomi2_state(const machine_config &mconfig, device_type type, const char *tag)
+ : naomi_state(mconfig, type, tag),
+ m_pvr2_texture_ram(*this, "textureram2"),
+ m_pvr2_framebuffer_ram(*this, "frameram2"),
+ m_elan_ram(*this, "elan_ram"),
+ m_powervr2_slave(*this, "powervr2_slave") { }
+
+ required_shared_ptr<uint64_t> m_pvr2_texture_ram;
+ required_shared_ptr<uint64_t> m_pvr2_framebuffer_ram;
+ required_shared_ptr<uint64_t> m_elan_ram;
+ required_device<powervr2_device> m_powervr2_slave;
+
+ DECLARE_DRIVER_INIT(naomi2);
+ DECLARE_WRITE32_MEMBER(both_pvr2_ta_w);
+};
+
+class atomiswave_state : public dc_state
+{
+public:
+ atomiswave_state(const machine_config &mconfig, device_type type, const char *tag)
+ : dc_state(mconfig, type, tag),
+ m_awflash(*this, "awflash")
+ { }
+
+ required_device<macronix_29l001mc_device> m_awflash;
+
+ DECLARE_READ64_MEMBER( aw_flash_r );
+ DECLARE_WRITE64_MEMBER( aw_flash_w );
+ DECLARE_READ64_MEMBER( aw_modem_r );
+ DECLARE_WRITE64_MEMBER( aw_modem_w );
+ DECLARE_READ64_MEMBER( aw_unknown1_r );
+ DECLARE_WRITE64_MEMBER( aw_unknown1_w );
+
+ DECLARE_DRIVER_INIT(atomiswave);
+ DECLARE_DRIVER_INIT(xtrmhnt2);
+
DECLARE_READ64_MEMBER( xtrmhnt2_hack_r );
+
+protected:
+ uint8_t aw_ctrl_type;
+ inline int decode_reg32_64(uint32_t offset, uint64_t mem_mask, uint64_t *shift);
};
-MACHINE_CONFIG_EXTERN(naomi_aw_base);
+MACHINE_CONFIG_EXTERN( naomi_aw_base );
INPUT_PORTS_EXTERN( naomi_debug );
diff --git a/src/mame/includes/novagbase.h b/src/mame/includes/novagbase.h
new file mode 100644
index 00000000000..6516525804e
--- /dev/null
+++ b/src/mame/includes/novagbase.h
@@ -0,0 +1,63 @@
+// license:BSD-3-Clause
+// copyright-holders:hap
+/******************************************************************************
+*
+* Novag chess machines base class
+*
+******************************************************************************/
+
+#include "emu.h"
+#include "sound/beep.h"
+#include "video/hd44780.h"
+
+class novagbase_state : public driver_device
+{
+public:
+ novagbase_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_beeper(*this, "beeper"),
+ m_lcd(*this, "hd44780"),
+ m_inp_matrix(*this, "IN.%u", 0),
+ m_display_wait(33),
+ m_display_maxy(1),
+ m_display_maxx(0)
+ { }
+
+ // devices/pointers
+ required_device<cpu_device> m_maincpu;
+ optional_device<beep_device> m_beeper;
+ optional_device<hd44780_device> m_lcd;
+ optional_ioport_array<8> m_inp_matrix;
+
+ // misc common
+ u16 m_inp_mux; // multiplexed keypad mask
+ u16 m_led_select;
+ u16 m_led_data;
+ u8 m_lcd_control;
+
+ u16 read_inputs(int columns);
+
+ // display common
+ int m_display_wait; // led/lamp off-delay in microseconds (default 33ms)
+ int m_display_maxy; // display matrix number of rows
+ int m_display_maxx; // display matrix number of columns (max 31 for now)
+
+ u32 m_display_state[0x20]; // display matrix rows data (last bit is used for always-on)
+ u16 m_display_segmask[0x20]; // if not 0, display matrix row is a digit, mask indicates connected segments
+ u32 m_display_cache[0x20]; // (internal use)
+ u8 m_display_decay[0x20][0x20]; // (internal use)
+
+ TIMER_DEVICE_CALLBACK_MEMBER(display_decay_tick);
+ void display_update();
+ void set_display_size(int maxx, int maxy);
+ void set_display_segmask(u32 digits, u32 mask);
+ void display_matrix(int maxx, int maxy, u32 setx, u32 sety, bool update = true);
+
+ DECLARE_PALETTE_INIT(novag_lcd);
+ HD44780_PIXEL_UPDATE(novag_lcd_pixel_update);
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+};
diff --git a/src/mame/includes/osborne1.h b/src/mame/includes/osborne1.h
index bbe12f9efcb..56754a43e82 100644
--- a/src/mame/includes/osborne1.h
+++ b/src/mame/includes/osborne1.h
@@ -81,6 +81,8 @@ public:
DECLARE_WRITE_LINE_MEMBER(serial_acia_irq_func);
+ DECLARE_INPUT_CHANGED_MEMBER(reset_key);
+
DECLARE_DRIVER_INIT(osborne1);
virtual void machine_reset() override;
virtual void video_start() override;
diff --git a/src/mame/includes/polepos.h b/src/mame/includes/polepos.h
index cdfd6b4b704..c6c4f0dc5e3 100644
--- a/src/mame/includes/polepos.h
+++ b/src/mame/includes/polepos.h
@@ -106,8 +106,6 @@ public:
DECLARE_WRITE16_MEMBER(polepos_alpha16_w);
DECLARE_READ8_MEMBER(polepos_alpha_r);
DECLARE_WRITE8_MEMBER(polepos_alpha_w);
- DECLARE_CUSTOM_INPUT_MEMBER(high_port_r);
- DECLARE_CUSTOM_INPUT_MEMBER(low_port_r);
DECLARE_CUSTOM_INPUT_MEMBER(auto_start_r);
DECLARE_WRITE8_MEMBER(out_0);
DECLARE_WRITE8_MEMBER(out_1);
diff --git a/src/mame/includes/polyplay.h b/src/mame/includes/polyplay.h
index 93852b1c409..4f66519b51d 100644
--- a/src/mame/includes/polyplay.h
+++ b/src/mame/includes/polyplay.h
@@ -7,7 +7,7 @@
#include "machine/z80sio.h"
#include "sound/speaker.h"
-#define POLYPLAY_MAIN_CLOCK XTAL_9_8304MHz
+#define POLYPLAY_MAIN_CLOCK XTAL_9_8304MHz
#define Z80CPU_TAG "maincpu"
#define Z80CTC_TAG "z80ctc"
@@ -42,6 +42,8 @@ public:
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
+ INTERRUPT_GEN_MEMBER(nmi_handler);
+
/* devices */
DECLARE_WRITE_LINE_MEMBER(ctc_zc0_w);
DECLARE_WRITE_LINE_MEMBER(ctc_zc1_w);
@@ -59,10 +61,10 @@ public:
uint8_t m_flipflop2;
required_device<speaker_sound_device> m_speaker1;
required_device<speaker_sound_device> m_speaker2;
-
+
/* video */
virtual void video_start() override;
- DECLARE_WRITE8_MEMBER(polyplay_characterram_w);
+ DECLARE_WRITE8_MEMBER(polyplay_characterram_w);
DECLARE_PALETTE_INIT(polyplay);
uint32_t screen_update_polyplay(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
};
diff --git a/src/mame/includes/retofinv.h b/src/mame/includes/retofinv.h
index 6ff49e40255..77405bec825 100644
--- a/src/mame/includes/retofinv.h
+++ b/src/mame/includes/retofinv.h
@@ -1,56 +1,28 @@
// license:BSD-3-Clause
// copyright-holders:Jarek Parchanski, Andrea Mazzoleni
+#include "machine/taito68705interface.h"
+
#include "machine/gen_latch.h"
+
class retofinv_state : public driver_device
{
public:
retofinv_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_audiocpu(*this, "audiocpu"),
- m_subcpu(*this, "sub"),
- m_68705(*this, "68705"),
- m_gfxdecode(*this, "gfxdecode"),
- m_palette(*this, "palette"),
- m_soundlatch(*this, "soundlatch"),
- m_fg_videoram(*this, "fg_videoram"),
- m_sharedram(*this, "sharedram"),
- m_bg_videoram(*this, "bg_videoram") { }
-
- required_device<cpu_device> m_maincpu;
- required_device<cpu_device> m_audiocpu;
- required_device<cpu_device> m_subcpu;
- optional_device<cpu_device> m_68705;
- required_device<gfxdecode_device> m_gfxdecode;
- required_device<palette_device> m_palette;
- required_device<generic_latch_8_device> m_soundlatch;
-
- required_shared_ptr<uint8_t> m_fg_videoram;
- required_shared_ptr<uint8_t> m_sharedram;
- required_shared_ptr<uint8_t> m_bg_videoram;
-
- uint8_t m_main_irq_mask;
- uint8_t m_sub_irq_mask;
- uint8_t m_cpu2_m6000;
- uint8_t m_from_main;
- uint8_t m_from_mcu;
- int m_mcu_sent;
- int m_main_sent;
- uint8_t m_portA_in;
- uint8_t m_portA_out;
- uint8_t m_ddrA;
- uint8_t m_portB_in;
- uint8_t m_portB_out;
- uint8_t m_ddrB;
- uint8_t m_portC_in;
- uint8_t m_portC_out;
- uint8_t m_ddrC;
- int m_fg_bank;
- int m_bg_bank;
- tilemap_t *m_bg_tilemap;
- tilemap_t *m_fg_tilemap;
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_audiocpu(*this, "audiocpu")
+ , m_subcpu(*this, "sub")
+ , m_68705(*this, "68705")
+ , m_gfxdecode(*this, "gfxdecode")
+ , m_palette(*this, "palette")
+ , m_soundlatch(*this, "soundlatch")
+ , m_fg_videoram(*this, "fg_videoram")
+ , m_sharedram(*this, "sharedram")
+ , m_bg_videoram(*this, "bg_videoram")
+ {
+ }
DECLARE_WRITE8_MEMBER(cpu1_reset_w);
DECLARE_WRITE8_MEMBER(cpu2_reset_w);
@@ -62,17 +34,6 @@ public:
DECLARE_WRITE8_MEMBER(irq1_ack_w);
DECLARE_WRITE8_MEMBER(coincounter_w);
DECLARE_WRITE8_MEMBER(coinlockout_w);
- DECLARE_READ8_MEMBER(mcu_portA_r);
- DECLARE_WRITE8_MEMBER(mcu_portA_w);
- DECLARE_WRITE8_MEMBER(mcu_ddrA_w);
- DECLARE_READ8_MEMBER(mcu_portB_r);
- DECLARE_WRITE8_MEMBER(mcu_portB_w);
- DECLARE_WRITE8_MEMBER(mcu_ddrB_w);
- DECLARE_READ8_MEMBER(mcu_portC_r);
- DECLARE_WRITE8_MEMBER(mcu_portC_w);
- DECLARE_WRITE8_MEMBER(mcu_ddrC_w);
- DECLARE_WRITE8_MEMBER(mcu_w);
- DECLARE_READ8_MEMBER(mcu_r);
DECLARE_READ8_MEMBER(mcu_status_r);
DECLARE_WRITE8_MEMBER(bg_videoram_w);
DECLARE_WRITE8_MEMBER(fg_videoram_w);
@@ -82,13 +43,36 @@ public:
TILE_GET_INFO_MEMBER(bg_get_tile_info);
TILE_GET_INFO_MEMBER(fg_get_tile_info);
- virtual void machine_start() override;
- virtual void video_start() override;
DECLARE_PALETTE_INIT(retofinv);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- void draw_sprites(bitmap_ind16 &bitmap);
INTERRUPT_GEN_MEMBER(main_vblank_irq);
INTERRUPT_GEN_MEMBER(sub_vblank_irq);
+
+protected:
+ virtual void machine_start() override;
+ virtual void video_start() override;
+
+ void draw_sprites(bitmap_ind16 &bitmap);
+
+ required_device<cpu_device> m_maincpu;
+ required_device<cpu_device> m_audiocpu;
+ required_device<cpu_device> m_subcpu;
+ optional_device<taito68705_mcu_device> m_68705;
+ required_device<gfxdecode_device> m_gfxdecode;
+ required_device<palette_device> m_palette;
+ required_device<generic_latch_8_device> m_soundlatch;
+
+ required_shared_ptr<uint8_t> m_fg_videoram;
+ required_shared_ptr<uint8_t> m_sharedram;
+ required_shared_ptr<uint8_t> m_bg_videoram;
+
+ uint8_t m_main_irq_mask;
+ uint8_t m_sub_irq_mask;
+ uint8_t m_cpu2_m6000;
+ int m_fg_bank;
+ int m_bg_bank;
+ tilemap_t *m_bg_tilemap;
+ tilemap_t *m_fg_tilemap;
};
diff --git a/src/mame/includes/rm380z.h b/src/mame/includes/rm380z.h
index a55abdea6a8..7448b710ad4 100644
--- a/src/mame/includes/rm380z.h
+++ b/src/mame/includes/rm380z.h
@@ -125,7 +125,7 @@ public:
DECLARE_WRITE8_MEMBER(disk_0_control);
DECLARE_WRITE8_MEMBER( keyboard_put );
-
+
DECLARE_DRIVER_INIT(rm380z);
DECLARE_DRIVER_INIT(rm380z34d);
DECLARE_DRIVER_INIT(rm380z34e);
diff --git a/src/mame/includes/stfight.h b/src/mame/includes/stfight.h
index 145b9d54f4a..7197093f469 100644
--- a/src/mame/includes/stfight.h
+++ b/src/mame/includes/stfight.h
@@ -13,37 +13,26 @@ public:
};
stfight_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_audiocpu(*this, "audiocpu"),
- m_mcu(*this, "mcu"),
- m_msm(*this, "msm"),
- m_palette(*this, "palette"),
- m_decrypted_opcodes(*this, "decrypted_opcodes"),
- m_stfight_video(*this, "stfight_vid"),
- m_airraid_video(*this, "airraid_vid")
- { }
-
- required_device<cpu_device> m_maincpu;
- required_device<cpu_device> m_audiocpu;
- required_device<cpu_device> m_mcu;
- required_device<msm5205_device> m_msm;
- required_device<palette_device> m_palette;
-
- optional_shared_ptr<uint8_t> m_decrypted_opcodes;
- optional_device<stfight_video_device> m_stfight_video;
- optional_device<airraid_video_device> m_airraid_video;
-
- uint8_t *m_decrypt;
- uint8_t m_fm_data;
- uint8_t m_cpu_to_mcu_data;
- uint8_t m_cpu_to_mcu_empty;
-
- uint16_t m_adpcm_data_offs;
- uint8_t m_adpcm_nibble;
- uint8_t m_adpcm_reset;
-
- uint8_t m_coin_state;
+ : driver_device(mconfig, type, tag)
+ , m_coin_mech(*this, "COIN")
+ , m_maincpu(*this, "maincpu")
+ , m_audiocpu(*this, "audiocpu")
+ , m_mcu(*this, "mcu")
+ , m_msm(*this, "msm")
+ , m_main_bank(*this, "mainbank")
+ , m_samples(*this, "adpcm")
+ , m_decrypted_opcodes(*this, "decrypted_opcodes")
+ , m_coin_state(0)
+ , m_fm_data(0)
+ , m_cpu_to_mcu_empty(true)
+ , m_cpu_to_mcu_data(0x0f)
+ , m_port_a_out(0xff)
+ , m_port_c_out(0xff)
+ , m_vck2(false)
+ , m_adpcm_reset(true)
+ , m_adpcm_data_offs(0x0000)
+ {
+ }
DECLARE_WRITE_LINE_MEMBER(stfight_adpcm_int);
@@ -59,13 +48,8 @@ public:
DECLARE_WRITE8_MEMBER(stfight_bank_w);
-
DECLARE_READ8_MEMBER(stfight_fm_r);
-
- virtual void machine_start() override;
- virtual void machine_reset() override;
-
INTERRUPT_GEN_MEMBER(stfight_vb_interrupt);
// MCU specifics
@@ -74,8 +58,34 @@ public:
DECLARE_WRITE8_MEMBER(stfight_68705_port_b_w);
DECLARE_WRITE8_MEMBER(stfight_68705_port_c_w);
- uint8_t m_portC_out;
-
protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+
+ required_ioport m_coin_mech;
+
+ required_device<cpu_device> m_maincpu;
+ required_device<cpu_device> m_audiocpu;
+ required_device<cpu_device> m_mcu;
+ required_device<msm5205_device> m_msm;
+
+ required_memory_bank m_main_bank;
+
+ required_region_ptr<uint8_t> m_samples;
+ optional_shared_ptr<uint8_t> m_decrypted_opcodes;
+
+ uint8_t m_coin_state;
+
+ uint8_t m_fm_data;
+
+ bool m_cpu_to_mcu_empty;
+ uint8_t m_cpu_to_mcu_data;
+ uint8_t m_port_a_out;
+ uint8_t m_port_c_out;
+
+ bool m_vck2;
+ bool m_adpcm_reset;
+ uint16_t m_adpcm_data_offs;
};
diff --git a/src/mame/includes/superqix.h b/src/mame/includes/superqix.h
index acdd694d3ec..147086de778 100644
--- a/src/mame/includes/superqix.h
+++ b/src/mame/includes/superqix.h
@@ -159,21 +159,21 @@ protected:
void pbillian_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
- required_ioport_array<2> m_dsw;
- required_ioport_array<2> m_dials;
- optional_ioport_array<2> m_plungers;
- optional_device<m68705p_device> m_mcu;
- optional_device<samples_device> m_samples;
- optional_region_ptr<u8> m_samples_region;
+ required_ioport_array<2> m_dsw;
+ required_ioport_array<2> m_dials;
+ optional_ioport_array<2> m_plungers;
+ optional_device<m68705p_device> m_mcu;
+ optional_device<samples_device> m_samples;
+ optional_region_ptr<u8> m_samples_region;
- std::unique_ptr<s16[]> m_samplebuf;
+ std::unique_ptr<s16[]> m_samplebuf;
// HLE-related for prebillian
int m_curr_player;
// 68705 related
- u8 m_portB_out;
- u8 m_portC_out;
+ u8 m_portB_out;
+ u8 m_portC_out;
// spinner quadrature stuff
int m_oldpos[2];
diff --git a/src/mame/includes/tigeroad.h b/src/mame/includes/tigeroad.h
index 4a41ebcd907..7e2e04fa337 100644
--- a/src/mame/includes/tigeroad.h
+++ b/src/mame/includes/tigeroad.h
@@ -1,22 +1,26 @@
// license:BSD-3-Clause
// copyright-holders:Phil Stroffolino
-#include "video/bufsprite.h"
-#include "sound/msm5205.h"
+#include "video/tigeroad_spr.h"
+
#include "cpu/m68000/m68000.h"
+#include "cpu/m6805/m68705.h"
#include "cpu/z80/z80.h"
+
#include "machine/gen_latch.h"
+
#include "sound/2203intf.h"
#include "sound/msm5205.h"
-#include "cpu/m6805/m68705.h"
-#include "video/tigeroad_spr.h"
+
+#include "video/bufsprite.h"
+
class tigeroad_state : public driver_device
{
public:
tigeroad_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
- m_spriteram(*this, "spriteram") ,
+ m_spriteram(*this, "spriteram"),
m_videoram(*this, "videoram"),
m_ram16(*this, "ram16"),
m_maincpu(*this, "maincpu"),
@@ -24,10 +28,9 @@ public:
m_msm(*this, "msm"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
- m_mcu(*this, "mcu"),
m_spritegen(*this, "spritegen"),
m_soundlatch(*this, "soundlatch"),
- m_has_coinlock(1)
+ m_has_coinlock(true)
{ }
required_device<buffered_spriteram16_device> m_spriteram;
@@ -43,8 +46,6 @@ public:
DECLARE_WRITE16_MEMBER(tigeroad_scroll_w);
DECLARE_WRITE8_MEMBER(msm5205_w);
DECLARE_DRIVER_INIT(f1dream);
- DECLARE_DRIVER_INIT(pushman);
- DECLARE_DRIVER_INIT(bballs);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
TILEMAP_MAPPER_MEMBER(tigeroad_tilemap_scan);
@@ -56,28 +57,46 @@ public:
optional_device<msm5205_device> m_msm;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
- optional_device<cpu_device> m_mcu;
required_device<tigeroad_spr_device> m_spritegen;
required_device<generic_latch_8_device> m_soundlatch;
- uint16_t m_control[2];
-
+protected:
/* misc */
- uint8_t m_shared_ram[8];
- uint16_t m_latch;
- uint16_t m_new_latch;
- int m_has_coinlock;
-
- /* protection handling */
- DECLARE_READ16_MEMBER(pushman_68705_r);
- DECLARE_WRITE16_MEMBER(pushman_68705_w);
- DECLARE_READ16_MEMBER(bballs_68705_r);
- DECLARE_WRITE16_MEMBER(bballs_68705_w);
- DECLARE_READ8_MEMBER(pushman_68000_r);
- DECLARE_WRITE8_MEMBER(pushman_68000_w);
- DECLARE_MACHINE_RESET(pushman);
- DECLARE_MACHINE_RESET(bballs);
+ bool m_has_coinlock;
+};
+
+
+class pushman_state : public tigeroad_state
+{
+public:
+ pushman_state(const machine_config &mconfig, device_type type, const char *tag)
+ : tigeroad_state(mconfig, type, tag)
+ , m_mcu(*this, "mcu")
+ , m_host_semaphore(false)
+ , m_mcu_semaphore(false)
+ , m_host_latch(0xffff)
+ , m_mcu_latch(0xffff)
+ , m_mcu_output(0xffff)
+ , m_mcu_latch_ctl(0xff)
+ {
+ m_has_coinlock = false;
+ }
+
+ DECLARE_READ16_MEMBER(mcu_comm_r);
+ DECLARE_WRITE16_MEMBER(pushman_mcu_comm_w);
+ DECLARE_WRITE16_MEMBER(bballs_mcu_comm_w);
+ DECLARE_WRITE8_MEMBER(mcu_pa_w);
+ DECLARE_WRITE8_MEMBER(mcu_pb_w);
+ DECLARE_WRITE8_MEMBER(mcu_pc_w);
+
+protected:
virtual void machine_start() override;
+ required_device<m68705u_device> m_mcu;
+
+ bool m_host_semaphore, m_mcu_semaphore;
+ u16 m_host_latch, m_mcu_latch;
+ u16 m_mcu_output;
+ u8 m_mcu_latch_ctl;
};
diff --git a/src/mame/includes/vcs80.h b/src/mame/includes/vcs80.h
index fa1f3d1ce8d..adb956251a2 100644
--- a/src/mame/includes/vcs80.h
+++ b/src/mame/includes/vcs80.h
@@ -43,13 +43,13 @@ public:
DECLARE_WRITE8_MEMBER( pio_w );
DECLARE_READ8_MEMBER( pio_pa_r );
DECLARE_WRITE8_MEMBER( pio_pb_w );
-
+
DECLARE_READ8_MEMBER( mem_r )
{
m_pio->port_b_write((!BIT(offset, 0)) << 7);
return m_bdmem->read8(space, offset);
}
-
+
DECLARE_WRITE8_MEMBER( mem_w )
{
m_pio->port_b_write((!BIT(offset, 0)) << 7);
@@ -65,7 +65,7 @@ public:
}
return 0xff;
}
-
+
DECLARE_WRITE8_MEMBER( io_w )
{
m_pio->port_b_write((!BIT(offset, 0)) << 7);
diff --git a/src/mame/includes/xbox_nv2a.h b/src/mame/includes/xbox_nv2a.h
index 65d3b79048d..e56e586f495 100644
--- a/src/mame/includes/xbox_nv2a.h
+++ b/src/mame/includes/xbox_nv2a.h
@@ -108,7 +108,7 @@ public:
{
union
{
- uint32_t i;
+ uint32_t i;
float f;
} cnv;
diff --git a/src/mame/includes/zorba.h b/src/mame/includes/zorba.h
new file mode 100644
index 00000000000..1c14b8399b3
--- /dev/null
+++ b/src/mame/includes/zorba.h
@@ -0,0 +1,113 @@
+// license:BSD-3-Clause
+// copyright-holders:Robbbert, Vas Crabb
+
+#include "sound/beep.h"
+
+#include "bus/ieee488/ieee488.h"
+
+#include "machine/6821pia.h"
+#include "machine/i8251.h"
+#include "machine/wd_fdc.h"
+#include "machine/z80dma.h"
+
+#include "video/i8275.h"
+
+
+class zorba_state : public driver_device
+{
+public:
+ zorba_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_config_port(*this, "CNF")
+ , m_read_bank(*this, "bankr0")
+ , m_p_chargen(*this, "chargen")
+ , m_maincpu(*this, "maincpu")
+ , m_dma(*this, "dma")
+ , m_uart0(*this, "uart0")
+ , m_uart1(*this, "uart1")
+ , m_uart2(*this, "uart2")
+ , m_pia0(*this, "pia0")
+ , m_pia1(*this, "pia1")
+ , m_palette(*this, "palette")
+ , m_crtc(*this, "crtc")
+ , m_beep(*this, "beeper")
+ , m_fdc (*this, "fdc")
+ , m_floppy0(*this, "fdc:0")
+ , m_floppy1(*this, "fdc:1")
+ , m_ieee(*this, IEEE488_TAG)
+ {
+ }
+
+public:
+ DECLARE_DRIVER_INIT(zorba);
+ DECLARE_MACHINE_RESET(zorba);
+
+ // Memory banking control
+ DECLARE_READ8_MEMBER(ram_r);
+ DECLARE_WRITE8_MEMBER(ram_w);
+ DECLARE_READ8_MEMBER(rom_r);
+ DECLARE_WRITE8_MEMBER(rom_w);
+
+ // Interrupt vectoring glue
+ DECLARE_WRITE8_MEMBER(intmask_w);
+ template <unsigned N> DECLARE_WRITE_LINE_MEMBER(tx_rx_rdy_w);
+ template <unsigned N> DECLARE_WRITE_LINE_MEMBER(irq_w);
+
+ // DMA controller handlers
+ DECLARE_WRITE_LINE_MEMBER(busreq_w);
+ DECLARE_READ8_MEMBER(memory_read_byte);
+ DECLARE_WRITE8_MEMBER(memory_write_byte);
+ DECLARE_READ8_MEMBER(io_read_byte);
+ DECLARE_WRITE8_MEMBER(io_write_byte);
+
+ // PIT handlers
+ DECLARE_WRITE_LINE_MEMBER(br1_w);
+
+ // PIA handlers
+ DECLARE_WRITE8_MEMBER(pia0_porta_w);
+ DECLARE_READ8_MEMBER(pia1_portb_r);
+ DECLARE_WRITE8_MEMBER(pia1_portb_w);
+
+ // Video
+ I8275_DRAW_CHARACTER_MEMBER(zorba_update_chr);
+
+ // Printer port glue
+ DECLARE_WRITE_LINE_MEMBER(printer_fault_w);
+ DECLARE_WRITE_LINE_MEMBER(printer_select_w);
+ DECLARE_INPUT_CHANGED_MEMBER(printer_type);
+
+private:
+ required_ioport m_config_port;
+
+ required_memory_bank m_read_bank;
+ required_region_ptr<uint8_t> m_p_chargen;
+
+ required_device<cpu_device> m_maincpu;
+ required_device<z80dma_device> m_dma;
+ required_device<i8251_device> m_uart0;
+ required_device<i8251_device> m_uart1;
+ required_device<i8251_device> m_uart2;
+ required_device<pia6821_device> m_pia0;
+ required_device<pia6821_device> m_pia1;
+
+ required_device<palette_device> m_palette;
+ required_device<i8275_device> m_crtc;
+
+ required_device<beep_device> m_beep;
+
+ required_device<fd1793_t> m_fdc;
+ required_device<floppy_connector> m_floppy0;
+ required_device<floppy_connector> m_floppy1;
+
+ required_device<ieee488_device> m_ieee;
+
+ uint8_t m_intmask;
+ uint8_t m_tx_rx_rdy;
+ uint8_t m_irq;
+
+ bool m_printer_prowriter;
+ int m_printer_fault;
+ int m_printer_select;
+
+ uint8_t m_term_data;
+};
diff --git a/src/mame/includes/zx.h b/src/mame/includes/zx.h
index d8717e0371c..b695f82f9ab 100644
--- a/src/mame/includes/zx.h
+++ b/src/mame/includes/zx.h
@@ -15,6 +15,7 @@
#include "sound/wave.h"
#include "imagedev/cassette.h"
#include "formats/zx81_p.h"
+#include "formats/tzx_cas.h"
#include "machine/ram.h"
diff --git a/src/mame/layout/aristmk5.lay b/src/mame/layout/aristmk5.lay
index 2f48631a00f..d6b099ffa53 100644
--- a/src/mame/layout/aristmk5.lay
+++ b/src/mame/layout/aristmk5.lay
@@ -1,23 +1,23 @@
<?xml version="1.0"?>
<mamelayout version="2">
- <element name="CASHOUT">
- <rect state="1">
+ <element name="COLLECT">
+ <rect state="0">
<color red="1.0" green="1.0" blue="0.0" />
</rect>
- <rect state="0">
+ <rect state="1">
<color red="0.5" green="0.5" blue="0.0" />
</rect>
- <text string="CASHOUT">
+ <text string="COLLECT">
<color red="0.0" green="0.0" blue="0.0" />
<bounds x="0" y="0.1" width="1" height="0.8" />
</text>
</element>
<element name="1LINE">
- <rect state="1">
+ <rect state="0">
<color red="1.0" green="1.0" blue="1.0" />
</rect>
- <rect state="0">
+ <rect state="1">
<color red="0.5" green="0.5" blue="0.5" />
</rect>
<text string="1 LINE">
@@ -26,63 +26,63 @@
</text>
</element>
- <element name="3LINES">
- <rect state="1">
+ <element name="5LINES">
+ <rect state="0">
<color red="1.0" green="1.0" blue="1.0" />
</rect>
- <rect state="0">
+ <rect state="1">
<color red="0.5" green="0.5" blue="0.5" />
</rect>
- <text string="3 LINES">
+ <text string="5 LINES">
<color red="0.0" green="0.0" blue="0.0" />
<bounds x="0" y="0.1" width="1" height="0.8" />
</text>
</element>
- <element name="5LINES">
- <rect state="1">
+ <element name="10LINES">
+ <rect state="0">
<color red="1.0" green="1.0" blue="1.0" />
</rect>
- <rect state="0">
+ <rect state="1">
<color red="0.5" green="0.5" blue="0.5" />
</rect>
- <text string="5 LINES">
+ <text string="10 LINES">
<color red="0.0" green="0.0" blue="0.0" />
<bounds x="0" y="0.1" width="1" height="0.8" />
</text>
</element>
- <element name="7LINES">
- <rect state="1">
+ <element name="15LINES">
+ <rect state="0">
<color red="1.0" green="1.0" blue="1.0" />
</rect>
- <rect state="0">
+ <rect state="1">
<color red="0.5" green="0.5" blue="0.5" />
</rect>
- <text string="7 LINES">
+ <text string="15 LINES">
<color red="0.0" green="0.0" blue="0.0" />
<bounds x="0" y="0.1" width="1" height="0.8" />
</text>
</element>
- <element name="9LINES">
- <rect state="1">
+ <element name="20LINES">
+ <rect state="0">
<color red="1.0" green="1.0" blue="1.0" />
</rect>
- <rect state="0">
+ <rect state="1">
<color red="0.5" green="0.5" blue="0.5" />
</rect>
- <text string="9 LINES">
+ <text string="20 LINES">
<color red="0.0" green="0.0" blue="0.0" />
<bounds x="0" y="0.1" width="1" height="0.8" />
</text>
</element>
<element name="GAMBLE">
- <rect state="1">
+ <rect state="0">
<color red="0.5" green="0.0" blue="0.7" />
</rect>
- <rect state="0">
+ <rect state="1">
<color red="0.25" green="0.0" blue="0.35" />
</rect>
@@ -92,24 +92,24 @@
</text>
</element>
- <element name="SERVICE">
- <rect state="1">
+ <element name="RESERVE">
+ <rect state="0">
<color red="0.0" green="1.0" blue="0.0" />
</rect>
- <rect state="0">
+ <rect state="1">
<color red="0.0" green="0.5" blue="0.0" />
</rect>
- <text string="SERVICE">
+ <text string="RESERVE">
<color red="0.0" green="0.0" blue="0.0" />
<bounds x="0" y="0.1" width="1" height="0.8" />
</text>
</element>
<element name="BET1">
- <rect state="1">
+ <rect state="0">
<color red="1.0" green="1.0" blue="1.0" />
</rect>
- <rect state="0">
+ <rect state="1">
<color red="0.5" green="0.5" blue="0.5" />
</rect>
<text string="BET 1">
@@ -119,10 +119,10 @@
</element>
<element name="BET2">
- <rect state="1">
+ <rect state="0">
<color red="1.0" green="1.0" blue="1.0" />
</rect>
- <rect state="0">
+ <rect state="1">
<color red="0.5" green="0.5" blue="0.5" />
</rect>
<text string="BET 2">
@@ -132,10 +132,10 @@
</element>
<element name="BET3">
- <rect state="1">
+ <rect state="0">
<color red="1.0" green="1.0" blue="1.0" />
</rect>
- <rect state="0">
+ <rect state="1">
<color red="0.5" green="0.5" blue="0.5" />
</rect>
<text string="BET 3">
@@ -145,10 +145,10 @@
</element>
<element name="BET5">
- <rect state="1">
+ <rect state="0">
<color red="1.0" green="1.0" blue="1.0" />
</rect>
- <rect state="0">
+ <rect state="1">
<color red="0.5" green="0.5" blue="0.5" />
</rect>
<text string="BET 5">
@@ -158,10 +158,10 @@
</element>
<element name="BET10">
- <rect state="1">
+ <rect state="0">
<color red="1.0" green="1.0" blue="1.0" />
</rect>
- <rect state="0">
+ <rect state="1">
<color red="0.5" green="0.5" blue="0.5" />
</rect>
<text string="BET 10">
@@ -171,10 +171,10 @@
</element>
<element name="TAKE_WIN">
- <rect state="1">
+ <rect state="0">
<color red="1.0" green="0.7" blue="0.0" />
</rect>
- <rect state="0">
+ <rect state="1">
<color red="0.5" green="0.35" blue="0.0" />
</rect>
<text string="TAKE WIN">
@@ -183,20 +183,11 @@
</text>
</element>
- <element name="WHITELAMP" defstate="0">
- <disk state="0">
- <color red="0.2" green="0.2" blue="0.2" />
- </disk>
+ <element name="REDLAMP">
<disk state="1">
- <color red="1.0" green="1.0" blue="1.0" />
- </disk>
- </element>
-
- <element name="REDLAMP" defstate="0">
- <disk state="0">
<color red="0.2" green="0.0" blue="0.0" />
</disk>
- <disk state="1">
+ <disk state="0">
<color red="1.0" green="0.0" blue="0.0" />
</disk>
</element>
@@ -207,55 +198,62 @@
</screen>
<!-- Buttons lamps -->
- <bezel name="lamp8" element="CASHOUT" inputtag="P2" inputmask="0x01">
- <bounds x="0.27" y="3.02" width="0.31" height="0.24" />
+ <bezel name="lamp8" element="COLLECT" inputtag="P1" inputmask="0x100">
+ <bounds x="0.47" y="3.02" width="0.31" height="0.24" />
</bezel>
- <bezel name="lamp9" element="1LINE" inputtag="P2" inputmask="0x02">
- <bounds x="0.68" y="3.02" width="0.31" height="0.24" />
+ <bezel name="lamp9" element="BET1" inputtag="P1" inputmask="0x200">
+ <bounds x="0.88" y="3.02" width="0.31" height="0.24" />
</bezel>
- <bezel name="lamp10" element="3LINES" inputtag="P2" inputmask="0x04">
- <bounds x="1.09" y="3.02" width="0.31" height="0.24" />
+ <bezel name="lamp10" element="BET2" inputtag="P1" inputmask="0x400">
+ <bounds x="1.29" y="3.02" width="0.31" height="0.24" />
</bezel>
- <bezel name="lamp11" element="5LINES" inputtag="P2" inputmask="0x08">
- <bounds x="1.51" y="3.02" width="0.31" height="0.24" />
+ <bezel name="lamp11" element="BET3" inputtag="P1" inputmask="0x800">
+ <bounds x="1.71" y="3.02" width="0.31" height="0.24" />
</bezel>
- <bezel name="lamp12" element="7LINES" inputtag="P2" inputmask="0x10">
- <bounds x="1.91" y="3.02" width="0.31" height="0.24" />
+ <bezel name="lamp12" element="BET5" inputtag="P1" inputmask="0x1000">
+ <bounds x="2.11" y="3.02" width="0.31" height="0.24" />
</bezel>
- <bezel name="lamp13" element="9LINES" inputtag="P2" inputmask="0x20">
- <bounds x="2.32" y="3.02" width="0.31" height="0.24" />
+ <bezel name="lamp13" element="BET10" inputtag="P1" inputmask="0x2000">
+ <bounds x="2.52" y="3.02" width="0.31" height="0.24" />
</bezel>
- <bezel name="lamp7" element="SERVICE" inputtag="P1" inputmask="0x80">
- <bounds x="0.27" y="3.28" width="0.31" height="0.24" />
+ <bezel name="lamp0" element="GAMBLE" inputtag="P1" inputmask="0x01">
+ <bounds x="2.93" y="3.02" width="0.31" height="0.24" />
</bezel>
- <bezel name="lamp6" element="BET1" inputtag="P1" inputmask="0x40">
- <bounds x="0.68" y="3.28" width="0.31" height="0.24" />
+
+ <bezel name="lamp7" element="RESERVE" inputtag="P1" inputmask="0x80">
+ <bounds x="0.47" y="3.28" width="0.31" height="0.24" />
</bezel>
- <bezel name="lamp5" element="BET2" inputtag="P1" inputmask="0x20">
- <bounds x="1.09" y="3.28" width="0.31" height="0.24" />
+ <bezel name="lamp6" element="1LINE" inputtag="P1" inputmask="0x40">
+ <bounds x="0.88" y="3.28" width="0.31" height="0.24" />
</bezel>
- <bezel name="lamp4" element="BET3" inputtag="P1" inputmask="0x10">
- <bounds x="1.51" y="3.28" width="0.31" height="0.24" />
+ <bezel name="lamp5" element="5LINES" inputtag="P1" inputmask="0x20">
+ <bounds x="1.29" y="3.28" width="0.31" height="0.24" />
</bezel>
- <bezel name="lamp3" element="BET5" inputtag="P1" inputmask="0x08">
- <bounds x="1.91" y="3.28" width="0.31" height="0.24" />
+ <bezel name="lamp4" element="10LINES" inputtag="P1" inputmask="0x10">
+ <bounds x="1.71" y="3.28" width="0.31" height="0.24" />
</bezel>
- <bezel name="lamp2" element="BET10" inputtag="P1" inputmask="0x04">
- <bounds x="2.32" y="3.28" width="0.31" height="0.24" />
+ <bezel name="lamp3" element="15LINES" inputtag="P1" inputmask="0x08">
+ <bounds x="2.11" y="3.28" width="0.31" height="0.24" />
</bezel>
- <bezel name="lamp0" element="GAMBLE" inputtag="P1" inputmask="0x01">
- <bounds x="2.73" y="3.28" width="0.31" height="0.24" />
+ <bezel name="lamp2" element="20LINES" inputtag="P1" inputmask="0x04">
+ <bounds x="2.52" y="3.28" width="0.31" height="0.24" />
</bezel>
<bezel name="lamp1" element="TAKE_WIN" inputtag="P1" inputmask="0x02">
- <bounds x="3.14" y="3.28" width="0.31" height="0.24" />
+ <bounds x="2.93" y="3.28" width="0.31" height="0.24" />
</bezel>
<!-- Tower lamps -->
- <bezel name="lamp17" element="WHITELAMP">
- <bounds x="3.68" y="3.24" width="0.10" height="0.10" />
+ <bezel name="lamp32" element="REDLAMP">
+ <bounds x="3.57" y="3.25" width="0.10" height="0.10" />
+ </bezel>
+ <bezel name="lamp33" element="REDLAMP">
+ <bounds x="3.57" y="3.36" width="0.10" height="0.10" />
+ </bezel>
+ <bezel name="lamp34" element="REDLAMP">
+ <bounds x="3.67" y="3.25" width="0.10" height="0.10" />
</bezel>
- <bezel name="lamp16" element="REDLAMP">
- <bounds x="3.68" y="3.36" width="0.10" height="0.10" />
+ <bezel name="lamp35" element="REDLAMP">
+ <bounds x="3.67" y="3.36" width="0.10" height="0.10" />
</bezel>
</view>
diff --git a/src/mame/layout/aristmk5_us.lay b/src/mame/layout/aristmk5_us.lay
new file mode 100644
index 00000000000..2f48631a00f
--- /dev/null
+++ b/src/mame/layout/aristmk5_us.lay
@@ -0,0 +1,267 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+ <element name="CASHOUT">
+ <rect state="1">
+ <color red="1.0" green="1.0" blue="0.0" />
+ </rect>
+ <rect state="0">
+ <color red="0.5" green="0.5" blue="0.0" />
+ </rect>
+ <text string="CASHOUT">
+ <color red="0.0" green="0.0" blue="0.0" />
+ <bounds x="0" y="0.1" width="1" height="0.8" />
+ </text>
+ </element>
+
+ <element name="1LINE">
+ <rect state="1">
+ <color red="1.0" green="1.0" blue="1.0" />
+ </rect>
+ <rect state="0">
+ <color red="0.5" green="0.5" blue="0.5" />
+ </rect>
+ <text string="1 LINE">
+ <color red="0.0" green="0.0" blue="0.0" />
+ <bounds x="0" y="0.1" width="1" height="0.8" />
+ </text>
+ </element>
+
+ <element name="3LINES">
+ <rect state="1">
+ <color red="1.0" green="1.0" blue="1.0" />
+ </rect>
+ <rect state="0">
+ <color red="0.5" green="0.5" blue="0.5" />
+ </rect>
+ <text string="3 LINES">
+ <color red="0.0" green="0.0" blue="0.0" />
+ <bounds x="0" y="0.1" width="1" height="0.8" />
+ </text>
+ </element>
+
+ <element name="5LINES">
+ <rect state="1">
+ <color red="1.0" green="1.0" blue="1.0" />
+ </rect>
+ <rect state="0">
+ <color red="0.5" green="0.5" blue="0.5" />
+ </rect>
+ <text string="5 LINES">
+ <color red="0.0" green="0.0" blue="0.0" />
+ <bounds x="0" y="0.1" width="1" height="0.8" />
+ </text>
+ </element>
+
+ <element name="7LINES">
+ <rect state="1">
+ <color red="1.0" green="1.0" blue="1.0" />
+ </rect>
+ <rect state="0">
+ <color red="0.5" green="0.5" blue="0.5" />
+ </rect>
+ <text string="7 LINES">
+ <color red="0.0" green="0.0" blue="0.0" />
+ <bounds x="0" y="0.1" width="1" height="0.8" />
+ </text>
+ </element>
+
+ <element name="9LINES">
+ <rect state="1">
+ <color red="1.0" green="1.0" blue="1.0" />
+ </rect>
+ <rect state="0">
+ <color red="0.5" green="0.5" blue="0.5" />
+ </rect>
+ <text string="9 LINES">
+ <color red="0.0" green="0.0" blue="0.0" />
+ <bounds x="0" y="0.1" width="1" height="0.8" />
+ </text>
+ </element>
+
+ <element name="GAMBLE">
+ <rect state="1">
+ <color red="0.5" green="0.0" blue="0.7" />
+ </rect>
+ <rect state="0">
+ <color red="0.25" green="0.0" blue="0.35" />
+
+ </rect>
+ <text string="GAMBLE">
+ <color red="0.0" green="0.0" blue="0.0" />
+ <bounds x="0" y="0.1" width="1" height="0.8" />
+ </text>
+ </element>
+
+ <element name="SERVICE">
+ <rect state="1">
+ <color red="0.0" green="1.0" blue="0.0" />
+ </rect>
+ <rect state="0">
+ <color red="0.0" green="0.5" blue="0.0" />
+ </rect>
+ <text string="SERVICE">
+ <color red="0.0" green="0.0" blue="0.0" />
+ <bounds x="0" y="0.1" width="1" height="0.8" />
+ </text>
+ </element>
+
+ <element name="BET1">
+ <rect state="1">
+ <color red="1.0" green="1.0" blue="1.0" />
+ </rect>
+ <rect state="0">
+ <color red="0.5" green="0.5" blue="0.5" />
+ </rect>
+ <text string="BET 1">
+ <color red="0.0" green="0.0" blue="0.0" />
+ <bounds x="0" y="0.1" width="1" height="0.8" />
+ </text>
+ </element>
+
+ <element name="BET2">
+ <rect state="1">
+ <color red="1.0" green="1.0" blue="1.0" />
+ </rect>
+ <rect state="0">
+ <color red="0.5" green="0.5" blue="0.5" />
+ </rect>
+ <text string="BET 2">
+ <color red="0.0" green="0.0" blue="0.0" />
+ <bounds x="0" y="0.1" width="1" height="0.8" />
+ </text>
+ </element>
+
+ <element name="BET3">
+ <rect state="1">
+ <color red="1.0" green="1.0" blue="1.0" />
+ </rect>
+ <rect state="0">
+ <color red="0.5" green="0.5" blue="0.5" />
+ </rect>
+ <text string="BET 3">
+ <color red="0.0" green="0.0" blue="0.0" />
+ <bounds x="0" y="0.1" width="1" height="0.8" />
+ </text>
+ </element>
+
+ <element name="BET5">
+ <rect state="1">
+ <color red="1.0" green="1.0" blue="1.0" />
+ </rect>
+ <rect state="0">
+ <color red="0.5" green="0.5" blue="0.5" />
+ </rect>
+ <text string="BET 5">
+ <color red="0.0" green="0.0" blue="0.0" />
+ <bounds x="0" y="0.1" width="1" height="0.8" />
+ </text>
+ </element>
+
+ <element name="BET10">
+ <rect state="1">
+ <color red="1.0" green="1.0" blue="1.0" />
+ </rect>
+ <rect state="0">
+ <color red="0.5" green="0.5" blue="0.5" />
+ </rect>
+ <text string="BET 10">
+ <color red="0.0" green="0.0" blue="0.0" />
+ <bounds x="0" y="0.1" width="1" height="0.8" />
+ </text>
+ </element>
+
+ <element name="TAKE_WIN">
+ <rect state="1">
+ <color red="1.0" green="0.7" blue="0.0" />
+ </rect>
+ <rect state="0">
+ <color red="0.5" green="0.35" blue="0.0" />
+ </rect>
+ <text string="TAKE WIN">
+ <color red="0.0" green="0.0" blue="0.0" />
+ <bounds x="0" y="0.1" width="1" height="0.8" />
+ </text>
+ </element>
+
+ <element name="WHITELAMP" defstate="0">
+ <disk state="0">
+ <color red="0.2" green="0.2" blue="0.2" />
+ </disk>
+ <disk state="1">
+ <color red="1.0" green="1.0" blue="1.0" />
+ </disk>
+ </element>
+
+ <element name="REDLAMP" defstate="0">
+ <disk state="0">
+ <color red="0.2" green="0.0" blue="0.0" />
+ </disk>
+ <disk state="1">
+ <color red="1.0" green="0.0" blue="0.0" />
+ </disk>
+ </element>
+
+ <view name="Button Lamps">
+ <screen index="0">
+ <bounds left="0" top="0" right="4" bottom="3" />
+ </screen>
+
+ <!-- Buttons lamps -->
+ <bezel name="lamp8" element="CASHOUT" inputtag="P2" inputmask="0x01">
+ <bounds x="0.27" y="3.02" width="0.31" height="0.24" />
+ </bezel>
+ <bezel name="lamp9" element="1LINE" inputtag="P2" inputmask="0x02">
+ <bounds x="0.68" y="3.02" width="0.31" height="0.24" />
+ </bezel>
+ <bezel name="lamp10" element="3LINES" inputtag="P2" inputmask="0x04">
+ <bounds x="1.09" y="3.02" width="0.31" height="0.24" />
+ </bezel>
+ <bezel name="lamp11" element="5LINES" inputtag="P2" inputmask="0x08">
+ <bounds x="1.51" y="3.02" width="0.31" height="0.24" />
+ </bezel>
+ <bezel name="lamp12" element="7LINES" inputtag="P2" inputmask="0x10">
+ <bounds x="1.91" y="3.02" width="0.31" height="0.24" />
+ </bezel>
+ <bezel name="lamp13" element="9LINES" inputtag="P2" inputmask="0x20">
+ <bounds x="2.32" y="3.02" width="0.31" height="0.24" />
+ </bezel>
+ <bezel name="lamp7" element="SERVICE" inputtag="P1" inputmask="0x80">
+ <bounds x="0.27" y="3.28" width="0.31" height="0.24" />
+ </bezel>
+ <bezel name="lamp6" element="BET1" inputtag="P1" inputmask="0x40">
+ <bounds x="0.68" y="3.28" width="0.31" height="0.24" />
+ </bezel>
+ <bezel name="lamp5" element="BET2" inputtag="P1" inputmask="0x20">
+ <bounds x="1.09" y="3.28" width="0.31" height="0.24" />
+ </bezel>
+ <bezel name="lamp4" element="BET3" inputtag="P1" inputmask="0x10">
+ <bounds x="1.51" y="3.28" width="0.31" height="0.24" />
+ </bezel>
+ <bezel name="lamp3" element="BET5" inputtag="P1" inputmask="0x08">
+ <bounds x="1.91" y="3.28" width="0.31" height="0.24" />
+ </bezel>
+ <bezel name="lamp2" element="BET10" inputtag="P1" inputmask="0x04">
+ <bounds x="2.32" y="3.28" width="0.31" height="0.24" />
+ </bezel>
+ <bezel name="lamp0" element="GAMBLE" inputtag="P1" inputmask="0x01">
+ <bounds x="2.73" y="3.28" width="0.31" height="0.24" />
+ </bezel>
+ <bezel name="lamp1" element="TAKE_WIN" inputtag="P1" inputmask="0x02">
+ <bounds x="3.14" y="3.28" width="0.31" height="0.24" />
+ </bezel>
+
+ <!-- Tower lamps -->
+ <bezel name="lamp17" element="WHITELAMP">
+ <bounds x="3.68" y="3.24" width="0.10" height="0.10" />
+ </bezel>
+ <bezel name="lamp16" element="REDLAMP">
+ <bounds x="3.68" y="3.36" width="0.10" height="0.10" />
+ </bezel>
+ </view>
+
+ <view name="Screen">
+ <screen index="0">
+ <bounds left="0" top="0" right="4" bottom="3" />
+ </screen>
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/cnsector.lay b/src/mame/layout/cnsector.lay
index 8bca9c3ab7a..15ca5c92e40 100644
--- a/src/mame/layout/cnsector.lay
+++ b/src/mame/layout/cnsector.lay
@@ -242,8 +242,8 @@
<bezel element="static_red"><bounds x="199" y="98" width="24" height="31" /></bezel>
<bezel element="button" inputtag="IN.0" inputmask="0x01"><bounds x="107" y="33" width="16" height="8" /></bezel>
- <bezel element="button" inputtag="IN.2" inputmask="0x08"><bounds x="155" y="33" width="16" height="8" /></bezel>
- <bezel element="button" inputtag="IN.4" inputmask="0x08"><bounds x="203" y="33" width="16" height="8" /></bezel>
+ <bezel element="button" inputtag="IN.2" inputmask="0x01"><bounds x="155" y="33" width="16" height="8" /></bezel>
+ <bezel element="button" inputtag="IN.4" inputmask="0x01"><bounds x="203" y="33" width="16" height="8" /></bezel>
<bezel element="button" inputtag="IN.0" inputmask="0x02"><bounds x="107" y="55" width="16" height="8" /></bezel>
<bezel element="button" inputtag="IN.1" inputmask="0x02"><bounds x="131" y="55" width="16" height="8" /></bezel>
@@ -252,10 +252,10 @@
<bezel element="button" inputtag="IN.4" inputmask="0x02"><bounds x="203" y="55" width="16" height="8" /></bezel>
<bezel element="button" inputtag="IN.0" inputmask="0x08"><bounds x="107" y="102" width="16" height="8" /></bezel>
- <bezel element="button" inputtag="IN.1" inputmask="0x01"><bounds x="131" y="102" width="16" height="8" /></bezel>
- <bezel element="button" inputtag="IN.2" inputmask="0x01"><bounds x="155" y="102" width="16" height="8" /></bezel>
- <bezel element="buttond" inputtag="IN.3" inputmask="0x01"><bounds x="185" y="104" width="4" height="4" /></bezel>
- <bezel element="button" inputtag="IN.4" inputmask="0x01"><bounds x="207" y="102" width="8" height="8" /></bezel>
+ <bezel element="button" inputtag="IN.1" inputmask="0x08"><bounds x="131" y="102" width="16" height="8" /></bezel>
+ <bezel element="button" inputtag="IN.2" inputmask="0x08"><bounds x="155" y="102" width="16" height="8" /></bezel>
+ <bezel element="buttond" inputtag="IN.3" inputmask="0x08"><bounds x="185" y="104" width="4" height="4" /></bezel>
+ <bezel element="button" inputtag="IN.4" inputmask="0x08"><bounds x="207" y="102" width="8" height="8" /></bezel>
<bezel element="text_rnext"><bounds x="127" y="32" width="18" height="5" /></bezel>
<bezel element="text_rship"><bounds x="127" y="37" width="18" height="5" /></bezel>
diff --git a/src/mame/layout/einvader.lay b/src/mame/layout/einvader.lay
index 81021899dbf..7f2d4f87dd0 100644
--- a/src/mame/layout/einvader.lay
+++ b/src/mame/layout/einvader.lay
@@ -4,82 +4,29 @@
<!-- define elements -->
<element name="static_black"><rect><color red="0.0" green="0.0" blue="0.0" /></rect></element>
+ <element name="static_white"><rect><color red="0.8" green="0.8" blue="0.8" /></rect></element>
+ <element name="text_score"><text string="SCORE"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="digit" defstate="0">
- <led7seg><color red="1.0" green="0.20" blue="0.22" /></led7seg>
- </element>
- <element name="led" defstate="0">
- <disk state="0"><color red="0.2" green="0.04" blue="0.05" /></disk>
- <disk state="1"><color red="1.0" green="0.20" blue="0.22" /></disk>
+ <led7seg><color red="1.0" green="0.165" blue="0.165" /></led7seg>
</element>
<!-- build screen -->
- <view name="Test Layout">
- <bounds left="0" right="12" top="0" bottom="28" />
- <bezel element="static_black">
- <bounds left="0" right="12" top="0" bottom="28" />
- </bezel>
-
- <bezel name="digit9" element="digit"><bounds x="0" y="0" width="4" height="6" /></bezel>
- <bezel name="digit8" element="digit"><bounds x="4" y="0" width="4" height="6" /></bezel>
- <bezel name="digit7" element="digit"><bounds x="8" y="0" width="4" height="6" /></bezel>
-
- <!-- led matrix -->
-
- <bezel name="lamp0" element="led"><bounds x="0" y="10" width="1" height="1" /></bezel>
- <bezel name="lamp1" element="led"><bounds x="2" y="10" width="1" height="1" /></bezel>
- <bezel name="lamp2" element="led"><bounds x="4" y="10" width="1" height="1" /></bezel>
- <bezel name="lamp3" element="led"><bounds x="6" y="10" width="1" height="1" /></bezel>
- <bezel name="lamp4" element="led"><bounds x="8" y="10" width="1" height="1" /></bezel>
- <bezel name="lamp5" element="led"><bounds x="10" y="10" width="1" height="1" /></bezel>
-
- <bezel name="lamp10" element="led"><bounds x="0" y="12" width="1" height="1" /></bezel>
- <bezel name="lamp11" element="led"><bounds x="2" y="12" width="1" height="1" /></bezel>
- <bezel name="lamp12" element="led"><bounds x="4" y="12" width="1" height="1" /></bezel>
- <bezel name="lamp13" element="led"><bounds x="6" y="12" width="1" height="1" /></bezel>
- <bezel name="lamp14" element="led"><bounds x="8" y="12" width="1" height="1" /></bezel>
- <bezel name="lamp15" element="led"><bounds x="10" y="12" width="1" height="1" /></bezel>
-
- <bezel name="lamp20" element="led"><bounds x="0" y="14" width="1" height="1" /></bezel>
- <bezel name="lamp21" element="led"><bounds x="2" y="14" width="1" height="1" /></bezel>
- <bezel name="lamp22" element="led"><bounds x="4" y="14" width="1" height="1" /></bezel>
- <bezel name="lamp23" element="led"><bounds x="6" y="14" width="1" height="1" /></bezel>
- <bezel name="lamp24" element="led"><bounds x="8" y="14" width="1" height="1" /></bezel>
- <bezel name="lamp25" element="led"><bounds x="10" y="14" width="1" height="1" /></bezel>
-
- <bezel name="lamp30" element="led"><bounds x="0" y="16" width="1" height="1" /></bezel>
- <bezel name="lamp31" element="led"><bounds x="2" y="16" width="1" height="1" /></bezel>
- <bezel name="lamp32" element="led"><bounds x="4" y="16" width="1" height="1" /></bezel>
- <bezel name="lamp33" element="led"><bounds x="6" y="16" width="1" height="1" /></bezel>
- <bezel name="lamp34" element="led"><bounds x="8" y="16" width="1" height="1" /></bezel>
- <bezel name="lamp35" element="led"><bounds x="10" y="16" width="1" height="1" /></bezel>
-
- <bezel name="lamp40" element="led"><bounds x="0" y="18" width="1" height="1" /></bezel>
- <bezel name="lamp41" element="led"><bounds x="2" y="18" width="1" height="1" /></bezel>
- <bezel name="lamp42" element="led"><bounds x="4" y="18" width="1" height="1" /></bezel>
- <bezel name="lamp43" element="led"><bounds x="6" y="18" width="1" height="1" /></bezel>
- <bezel name="lamp44" element="led"><bounds x="8" y="18" width="1" height="1" /></bezel>
- <bezel name="lamp45" element="led"><bounds x="10" y="18" width="1" height="1" /></bezel>
-
- <bezel name="lamp50" element="led"><bounds x="0" y="20" width="1" height="1" /></bezel>
- <bezel name="lamp51" element="led"><bounds x="2" y="20" width="1" height="1" /></bezel>
- <bezel name="lamp52" element="led"><bounds x="4" y="20" width="1" height="1" /></bezel>
- <bezel name="lamp53" element="led"><bounds x="6" y="20" width="1" height="1" /></bezel>
- <bezel name="lamp54" element="led"><bounds x="8" y="20" width="1" height="1" /></bezel>
- <bezel name="lamp55" element="led"><bounds x="10" y="20" width="1" height="1" /></bezel>
-
- <bezel name="lamp6" element="led"><bounds x="2" y="22" width="1" height="1" /></bezel>
- <bezel name="lamp7" element="led"><bounds x="8" y="22" width="1" height="1" /></bezel>
+ <view name="Internal Layout">
+ <bounds left="-0.1" right="20.1" top="4.6" bottom="33.1" />
+ <screen index="0">
+ <bounds x="0" y="10" width="20" height="23" />
+ </screen>
- <bezel name="lamp60" element="led"><bounds x="0" y="24" width="1" height="1" /></bezel>
- <bezel name="lamp61" element="led"><bounds x="2" y="24" width="1" height="1" /></bezel>
- <bezel name="lamp62" element="led"><bounds x="4" y="24" width="1" height="1" /></bezel>
- <bezel name="lamp63" element="led"><bounds x="6" y="24" width="1" height="1" /></bezel>
- <bezel name="lamp64" element="led"><bounds x="8" y="24" width="1" height="1" /></bezel>
- <bezel name="lamp65" element="led"><bounds x="10" y="24" width="1" height="1" /></bezel>
+ <bezel element="static_white"><bounds x="6.6" y="4.59" width="6.8" height="3.81" /></bezel>
+ <bezel element="static_black"><bounds x="6.8" y="4.8" width="6.4" height="3.4" /></bezel>
+ <bezel element="text_score"><bounds x="2" y="5.75" width="4.6" height="1.5" /></bezel>
+ <bezel name="digit9" element="digit"><bounds x="7" y="5" width="2" height="3" /></bezel>
+ <bezel name="digit8" element="digit"><bounds x="9" y="5" width="2" height="3" /></bezel>
+ <bezel name="digit7" element="digit"><bounds x="11" y="5" width="2" height="3" /></bezel>
</view>
</mamelayout>
diff --git a/src/mame/layout/einvaderc.lay b/src/mame/layout/einvaderc.lay
index 0916b783796..3eb8570986e 100644
--- a/src/mame/layout/einvaderc.lay
+++ b/src/mame/layout/einvaderc.lay
@@ -4,82 +4,29 @@
<!-- define elements -->
<element name="static_black"><rect><color red="0.0" green="0.0" blue="0.0" /></rect></element>
+ <element name="static_white"><rect><color red="0.8" green="0.8" blue="0.8" /></rect></element>
+ <element name="text_score"><text string="SCORE"><color red="0.8" green="0.8" blue="0.8" /></text></element>
<element name="digit" defstate="0">
- <led7seg><color red="1.0" green="0.20" blue="0.22" /></led7seg>
- </element>
- <element name="led" defstate="0">
- <disk state="0"><color red="0.2" green="0.04" blue="0.05" /></disk>
- <disk state="1"><color red="1.0" green="0.20" blue="0.22" /></disk>
+ <led7seg><color red="1.0" green="0.165" blue="0.165" /></led7seg>
</element>
<!-- build screen -->
- <view name="Test Layout">
- <bounds left="0" right="12" top="0" bottom="28" />
- <bezel element="static_black">
- <bounds left="0" right="12" top="0" bottom="28" />
- </bezel>
-
- <bezel name="digit0" element="digit"><bounds x="0" y="0" width="4" height="6" /></bezel>
- <bezel name="digit1" element="digit"><bounds x="4" y="0" width="4" height="6" /></bezel>
- <bezel name="digit2" element="digit"><bounds x="8" y="0" width="4" height="6" /></bezel>
-
- <!-- led matrix -->
-
- <bezel name="lamp90" element="led"><bounds x="0" y="10" width="1" height="1" /></bezel>
- <bezel name="lamp91" element="led"><bounds x="2" y="10" width="1" height="1" /></bezel>
- <bezel name="lamp92" element="led"><bounds x="4" y="10" width="1" height="1" /></bezel>
- <bezel name="lamp93" element="led"><bounds x="6" y="10" width="1" height="1" /></bezel>
- <bezel name="lamp94" element="led"><bounds x="8" y="10" width="1" height="1" /></bezel>
- <bezel name="lamp95" element="led"><bounds x="10" y="10" width="1" height="1" /></bezel>
-
- <bezel name="lamp80" element="led"><bounds x="0" y="12" width="1" height="1" /></bezel>
- <bezel name="lamp81" element="led"><bounds x="2" y="12" width="1" height="1" /></bezel>
- <bezel name="lamp82" element="led"><bounds x="4" y="12" width="1" height="1" /></bezel>
- <bezel name="lamp83" element="led"><bounds x="6" y="12" width="1" height="1" /></bezel>
- <bezel name="lamp84" element="led"><bounds x="8" y="12" width="1" height="1" /></bezel>
- <bezel name="lamp85" element="led"><bounds x="10" y="12" width="1" height="1" /></bezel>
-
- <bezel name="lamp40" element="led"><bounds x="0" y="14" width="1" height="1" /></bezel>
- <bezel name="lamp41" element="led"><bounds x="2" y="14" width="1" height="1" /></bezel>
- <bezel name="lamp42" element="led"><bounds x="4" y="14" width="1" height="1" /></bezel>
- <bezel name="lamp43" element="led"><bounds x="6" y="14" width="1" height="1" /></bezel>
- <bezel name="lamp44" element="led"><bounds x="8" y="14" width="1" height="1" /></bezel>
- <bezel name="lamp45" element="led"><bounds x="10" y="14" width="1" height="1" /></bezel>
-
- <bezel name="lamp50" element="led"><bounds x="0" y="16" width="1" height="1" /></bezel>
- <bezel name="lamp51" element="led"><bounds x="2" y="16" width="1" height="1" /></bezel>
- <bezel name="lamp52" element="led"><bounds x="4" y="16" width="1" height="1" /></bezel>
- <bezel name="lamp53" element="led"><bounds x="6" y="16" width="1" height="1" /></bezel>
- <bezel name="lamp54" element="led"><bounds x="8" y="16" width="1" height="1" /></bezel>
- <bezel name="lamp55" element="led"><bounds x="10" y="16" width="1" height="1" /></bezel>
-
- <bezel name="lamp60" element="led"><bounds x="0" y="18" width="1" height="1" /></bezel>
- <bezel name="lamp61" element="led"><bounds x="2" y="18" width="1" height="1" /></bezel>
- <bezel name="lamp62" element="led"><bounds x="4" y="18" width="1" height="1" /></bezel>
- <bezel name="lamp63" element="led"><bounds x="6" y="18" width="1" height="1" /></bezel>
- <bezel name="lamp64" element="led"><bounds x="8" y="18" width="1" height="1" /></bezel>
- <bezel name="lamp65" element="led"><bounds x="10" y="18" width="1" height="1" /></bezel>
-
- <bezel name="lamp70" element="led"><bounds x="0" y="20" width="1" height="1" /></bezel>
- <bezel name="lamp71" element="led"><bounds x="2" y="20" width="1" height="1" /></bezel>
- <bezel name="lamp72" element="led"><bounds x="4" y="20" width="1" height="1" /></bezel>
- <bezel name="lamp73" element="led"><bounds x="6" y="20" width="1" height="1" /></bezel>
- <bezel name="lamp74" element="led"><bounds x="8" y="20" width="1" height="1" /></bezel>
- <bezel name="lamp75" element="led"><bounds x="10" y="20" width="1" height="1" /></bezel>
-
- <bezel name="lamp97" element="led"><bounds x="2" y="22" width="1" height="1" /></bezel>
- <bezel name="lamp96" element="led"><bounds x="8" y="22" width="1" height="1" /></bezel>
+ <view name="Internal Layout">
+ <bounds left="-0.1" right="20.1" top="4.6" bottom="33.76" />
+ <screen index="0">
+ <bounds x="0" y="10" width="20" height="23.66" />
+ </screen>
- <bezel name="lamp30" element="led"><bounds x="0" y="24" width="1" height="1" /></bezel>
- <bezel name="lamp31" element="led"><bounds x="2" y="24" width="1" height="1" /></bezel>
- <bezel name="lamp32" element="led"><bounds x="4" y="24" width="1" height="1" /></bezel>
- <bezel name="lamp33" element="led"><bounds x="6" y="24" width="1" height="1" /></bezel>
- <bezel name="lamp34" element="led"><bounds x="8" y="24" width="1" height="1" /></bezel>
- <bezel name="lamp35" element="led"><bounds x="10" y="24" width="1" height="1" /></bezel>
+ <bezel element="static_white"><bounds x="6.6" y="4.59" width="6.8" height="3.81" /></bezel>
+ <bezel element="static_black"><bounds x="6.8" y="4.8" width="6.4" height="3.4" /></bezel>
+ <bezel element="text_score"><bounds x="2" y="5.75" width="4.6" height="1.5" /></bezel>
+ <bezel name="digit0" element="digit"><bounds x="7" y="5" width="2" height="3" /></bezel>
+ <bezel name="digit1" element="digit"><bounds x="9" y="5" width="2" height="3" /></bezel>
+ <bezel name="digit2" element="digit"><bounds x="11" y="5" width="2" height="3" /></bezel>
</view>
</mamelayout>
diff --git a/src/mame/layout/f2pbball.lay b/src/mame/layout/f2pbball.lay
new file mode 100644
index 00000000000..e62927601e1
--- /dev/null
+++ b/src/mame/layout/f2pbball.lay
@@ -0,0 +1,328 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="static_black"><rect><color red="0.0" green="0.0" blue="0.0" /></rect></element>
+ <element name="static_red"><rect><color red="0.2" green="0.04" blue="0.05" /></rect></element>
+ <element name="disk_red"><disk><color red="0.2" green="0.04" blue="0.05" /></disk></element>
+ <element name="static_green"><rect><color red="0.0" green="0.38" blue="0.15" /></rect></element>
+ <element name="static_white"><rect><color red="0.75" green="0.75" blue="0.75" /></rect></element>
+ <element name="disk_white"><disk><color red="0.75" green="0.75" blue="0.75" /></disk></element>
+ <element name="static_white2"><rect><color red="0.8" green="0.8" blue="0.8" /></rect></element>
+
+ <element name="ledo" defstate="0">
+ <disk state="0"><color red="0.2" green="0.04" blue="0.05" /></disk>
+ <disk state="1"><color red="1.0" green="0.20" blue="0.22" /></disk>
+ </element>
+ <element name="led" defstate="0">
+ <disk>
+ <bounds x="0.0" y="0.0" width="1.0" height="1.0" />
+ <color red="0.2" green="0.04" blue="0.05" />
+ </disk>
+ <disk state="1">
+ <bounds x="0.25" y="0.25" width="0.5" height="0.5" />
+ <color red="1.0" green="0.20" blue="0.22" />
+ </disk>
+ </element>
+
+ <element name="digit" defstate="0">
+ <led7seg><color red="1.0" green="0.20" blue="0.22" /></led7seg>
+ </element>
+
+ <element name="text_p">
+ <rect><color red="0.0" green="0.38" blue="0.15" /></rect>
+ <text string="P"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+ <element name="text_1st">
+ <rect><color red="0.0" green="0.38" blue="0.15" /></rect>
+ <text string="1st"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+ <element name="text_2nd">
+ <rect><color red="0.0" green="0.38" blue="0.15" /></rect>
+ <text string="2nd"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+ <element name="text_3rd">
+ <rect><color red="0.0" green="0.38" blue="0.15" /></rect>
+ <text string="3rd"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+ <element name="text_foul">
+ <rect><color red="0.0" green="0.38" blue="0.15" /></rect>
+ <text string="FOUL"><color red="0.8" green="0.8" blue="0.8" /></text>
+ </element>
+ <element name="text_curve">
+ <rect><color red="0.0" green="0.38" blue="0.15" /></rect>
+ <text string="CURVE"><color red="0.8" green="0.8" blue="0.8" /></text>
+ </element>
+ <element name="text_ball">
+ <rect><color red="0.0" green="0.38" blue="0.15" /></rect>
+ <text string="BALL"><color red="0.8" green="0.8" blue="0.8" /></text>
+ </element>
+ <element name="text_strike">
+ <rect><color red="0.0" green="0.38" blue="0.15" /></rect>
+ <text string="STRIKE"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+ <element name="text_flyout">
+ <rect><color red="0.0" green="0.38" blue="0.15" /></rect>
+ <text string="FLY OUT"><color red="0.8" green="0.8" blue="0.8" /></text>
+ </element>
+ <element name="text_homerun">
+ <rect><color red="0.0" green="0.38" blue="0.15" /></rect>
+ <text string="HOME RUN"><color red="0.8" green="0.8" blue="0.8" /></text>
+ </element>
+ <element name="text_grout">
+ <rect><color red="0.0" green="0.38" blue="0.15" /></rect>
+ <text string="GR. OUT"><color red="0.8" green="0.8" blue="0.8" /></text>
+ </element>
+ <element name="text_single">
+ <rect><color red="0.0" green="0.38" blue="0.15" /></rect>
+ <text string="SINGLE"><color red="0.8" green="0.8" blue="0.8" /></text>
+ </element>
+ <element name="text_double">
+ <rect><color red="0.0" green="0.38" blue="0.15" /></rect>
+ <text string="DOUBLE"><color red="0.8" green="0.8" blue="0.8" /></text>
+ </element>
+ <element name="text_triple">
+ <rect><color red="0.0" green="0.38" blue="0.15" /></rect>
+ <text string="TRIPLE"><color red="0.8" green="0.8" blue="0.8" /></text>
+ </element>
+
+ <element name="text_visitor"><text string="VISITOR"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_hometeam"><text string="HOME TEAM"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_balls"><text string="BALLS"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_strikes"><text string="STKS"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_atbat"><text string="ATBAT"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_outs"><text string="OUTS"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+ <element name="text_innings"><text string="INGS"><color red="0.8" green="0.8" blue="0.8" /></text></element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bounds left="3" right="28" top="-2" bottom="33" />
+
+ <bezel element="static_white2"><bounds x="2" y="3.6" width="27" height="1" /></bezel>
+ <bezel element="static_green"><bounds x="2" y="4" width="27" height="30" /></bezel>
+
+ <!-- score panel -->
+
+ <bezel element="text_visitor"><bounds x="6.55" y="-1.7" width="6.4" height="1.2" /></bezel>
+ <bezel element="static_white"><bounds x="6.55" y="-0.5" width="6.4" height="3.65" /></bezel>
+ <bezel element="static_black"><bounds x="6.75" y="-0.3" width="6" height="3.25" /></bezel>
+
+ <bezel element="text_balls"><bounds x="6.75" y="-0.3" width="2" height="0.7" /></bezel>
+ <bezel element="text_strikes"><bounds x="8.75" y="-0.3" width="2" height="0.7" /></bezel>
+ <bezel element="text_atbat"><bounds x="10.85" y="-0.3" width="2" height="0.7" /></bezel>
+
+ <bezel name="digit8" element="digit"><bounds x="7" y="0.5" width="1.5" height="2.25" /></bezel>
+ <bezel name="digit7" element="digit"><bounds x="9" y="0.5" width="1.5" height="2.25" /></bezel>
+ <bezel name="8.7" element="ledo"><bounds x="11.5" y="1.4" width="0.5" height="0.5" /></bezel>
+
+ <bezel element="static_white"><bounds x="8.65" y="-0.4" width="0.2" height="3.45" /></bezel>
+ <bezel element="static_white"><bounds x="10.65" y="-0.4" width="0.2" height="3.45" /></bezel>
+
+ <bezel element="text_hometeam"><bounds x="18" y="-1.7" width="6.4" height="1.2" /></bezel>
+ <bezel element="static_white"><bounds x="18" y="-0.5" width="6.4" height="3.65" /></bezel>
+ <bezel element="static_black"><bounds x="18.2" y="-0.3" width="6" height="3.25" /></bezel>
+
+ <bezel element="text_atbat"><bounds x="18.2" y="-0.3" width="2" height="0.7" /></bezel>
+ <bezel element="text_outs"><bounds x="20.2" y="-0.3" width="2" height="0.7" /></bezel>
+ <bezel element="text_innings"><bounds x="22.2" y="-0.3" width="2" height="0.7" /></bezel>
+
+
+ <bezel name="6.7" element="ledo"><bounds x="18.95" y="1.4" width="0.5" height="0.5" /></bezel>
+ <bezel name="digit6" element="digit"><bounds x="20.45" y="0.5" width="1.5" height="2.25" /></bezel>
+ <bezel name="digit5" element="digit"><bounds x="22.45" y="0.5" width="1.5" height="2.25" /></bezel>
+
+ <bezel element="static_white"><bounds x="20.1" y="-0.4" width="0.2" height="3.45" /></bezel>
+ <bezel element="static_white"><bounds x="22.1" y="-0.4" width="0.2" height="3.45" /></bezel>
+
+ <!-- upper part -->
+
+ <bezel element="text_flyout"><bounds x="4.5" y="8.1" width="4" height="0.7" /></bezel>
+ <bezel element="text_homerun"><bounds x="7.5" y="7.1" width="4" height="0.7" /></bezel>
+ <bezel element="text_grout"><bounds x="10.5" y="6.1" width="4" height="0.7" /></bezel>
+ <bezel element="text_triple"><bounds x="4.5" y="11.1" width="4" height="0.7" /></bezel>
+ <bezel element="text_grout"><bounds x="7.5" y="10.1" width="4" height="0.7" /></bezel>
+ <bezel element="text_single"><bounds x="10.5" y="9.1" width="4" height="0.7" /></bezel>
+
+ <bezel element="text_flyout"><bounds x="16.5" y="6.1" width="4" height="0.7" /></bezel>
+ <bezel element="text_flyout"><bounds x="19.5" y="7.1" width="4" height="0.7" /></bezel>
+ <bezel element="text_double"><bounds x="22.5" y="8.1" width="4" height="0.7" /></bezel>
+ <bezel element="text_single"><bounds x="16.5" y="9.1" width="4" height="0.7" /></bezel>
+ <bezel element="text_single"><bounds x="19.5" y="10.1" width="4" height="0.7" /></bezel>
+ <bezel element="text_grout"><bounds x="22.5" y="11.1" width="4" height="0.7" /></bezel>
+
+ <bezel name="0.3" element="led"><bounds x="6" y="7" width="1" height="1" /></bezel>
+ <bezel name="3.2" element="led"><bounds x="9" y="6" width="1" height="1" /></bezel>
+ <bezel name="2.3" element="led"><bounds x="12" y="5" width="1" height="1" /></bezel>
+ <bezel name="1.2" element="led"><bounds x="6" y="10" width="1" height="1" /></bezel>
+ <bezel name="2.2" element="led"><bounds x="9" y="9" width="1" height="1" /></bezel>
+ <bezel name="1.3" element="led"><bounds x="12" y="8" width="1" height="1" /></bezel>
+
+ <bezel name="0.4" element="led"><bounds x="18" y="5" width="1" height="1" /></bezel>
+ <bezel name="0.5" element="led"><bounds x="21" y="6" width="1" height="1" /></bezel>
+ <bezel name="3.4" element="led"><bounds x="24" y="7" width="1" height="1" /></bezel>
+ <bezel name="1.4" element="led"><bounds x="18" y="8" width="1" height="1" /></bezel>
+ <bezel name="3.3" element="led"><bounds x="21" y="9" width="1" height="1" /></bezel>
+ <bezel name="2.4" element="led"><bounds x="24" y="10" width="1" height="1" /></bezel>
+
+ <!-- field labels -->
+
+ <bezel element="text_p"><bounds x="14" y="13.2" width="3" height="1.2" /></bezel>
+ <bezel element="text_2nd"><bounds x="14" y="7" width="3" height="1.2" /></bezel>
+ <bezel element="text_3rd"><bounds x="2.9" y="17.9" width="3" height="1.2" /></bezel>
+ <bezel element="text_1st"><bounds x="25.1" y="17.9" width="3" height="1.2" /></bezel>
+ <bezel element="text_strike"><bounds x="13" y="31.2" width="5" height="1.2" /></bezel>
+
+ <bezel element="text_foul"><bounds x="6.8" y="24" width="2.2" height="1" /></bezel>
+ <bezel element="text_foul"><bounds x="22.1" y="24" width="2.2" height="1" /></bezel>
+
+ <bezel element="text_curve"><bounds x="8.8" y="27" width="3" height="1" /></bezel>
+ <bezel element="text_ball"><bounds x="9.2" y="30" width="3" height="1" /></bezel>
+ <bezel element="text_curve"><bounds x="19.3" y="27" width="3" height="1" /></bezel>
+ <bezel element="text_ball"><bounds x="18.9" y="30" width="3" height="1" /></bezel>
+
+ <bezel element="static_white"><bounds x="11.8" y="26.8" width="1.4" height="4.4" /></bezel>
+ <bezel element="static_green"><bounds x="12" y="27" width="1" height="4" /></bezel>
+ <bezel element="static_white"><bounds x="17.8" y="26.8" width="1.4" height="4.4" /></bezel>
+ <bezel element="static_green"><bounds x="18" y="27" width="1" height="4" /></bezel>
+
+ <bezel element="disk_red"><bounds x="14.5" y="8.5" width="2" height="2" /></bezel>
+ <bezel element="disk_red"><bounds x="5.5" y="17.5" width="2" height="2" /></bezel>
+ <bezel element="disk_red"><bounds x="23.5" y="17.5" width="2" height="2" /></bezel>
+
+ <bezel element="disk_red"><bounds x="14.5" y="14.5" width="2" height="2" /></bezel>
+ <bezel element="static_red"><bounds x="14.99" y="15.5" width="1.02" height="12" /></bezel>
+
+ <bezel element="static_white"><bounds x="14.5" y="26.5" width="2" height="2.5" /></bezel>
+ <bezel element="static_red"><bounds x="14.7" y="26.7" width="1.6" height="2.1" /></bezel>
+
+ <!-- diamond city -->
+
+ <bezel element="disk_white"><bounds x="5.9" y="17.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="6.4" y="17.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="6.9" y="16.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="7.4" y="16.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="7.9" y="15.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="8.4" y="15.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="8.9" y="14.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="9.4" y="14.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="9.9" y="13.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="10.4" y="13.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="10.9" y="12.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="11.4" y="12.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="11.9" y="11.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="12.4" y="11.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="12.9" y="10.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="13.4" y="10.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="13.9" y="9.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="14.4" y="9.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="14.9" y="8.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="15.4" y="8.4" width="0.2" height="0.2" /></bezel>
+
+ <bezel element="disk_white"><bounds x="15.9" y="8.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="16.4" y="9.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="16.9" y="9.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="17.4" y="10.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="17.9" y="10.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="18.4" y="11.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="18.9" y="11.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="19.4" y="12.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="19.9" y="12.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="20.4" y="13.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="20.9" y="13.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="21.4" y="14.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="21.9" y="14.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="22.4" y="15.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="22.9" y="15.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="23.4" y="16.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="23.9" y="16.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="24.4" y="17.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="24.9" y="17.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="25.4" y="18.4" width="0.2" height="0.2" /></bezel>
+
+ <bezel element="disk_white"><bounds x="24.9" y="18.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="24.4" y="19.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="23.9" y="19.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="23.4" y="20.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="22.9" y="20.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="22.4" y="21.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="21.9" y="21.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="21.4" y="22.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="20.9" y="22.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="20.4" y="23.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="19.9" y="23.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="19.4" y="24.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="18.9" y="24.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="18.4" y="25.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="17.9" y="25.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="17.4" y="26.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="16.9" y="26.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="16.4" y="27.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="15.9" y="27.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="15.4" y="28.4" width="0.2" height="0.2" /></bezel>
+
+ <bezel element="disk_white"><bounds x="14.9" y="27.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="14.4" y="27.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="13.9" y="26.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="13.4" y="26.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="12.9" y="25.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="12.4" y="25.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="11.9" y="24.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="11.4" y="24.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="10.9" y="23.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="10.4" y="23.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="9.9" y="22.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="9.4" y="22.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="8.9" y="21.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="8.4" y="21.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="7.9" y="20.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="7.4" y="20.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="6.9" y="19.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="6.4" y="19.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="5.9" y="18.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="5.4" y="18.4" width="0.2" height="0.2" /></bezel>
+
+ <bezel element="disk_white"><bounds x="4.9" y="17.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="4.4" y="17.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="3.9" y="16.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="3.4" y="16.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="2.9" y="15.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="2.4" y="15.4" width="0.2" height="0.2" /></bezel>
+
+ <bezel element="disk_white"><bounds x="28.4" y="15.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="27.9" y="15.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="27.4" y="16.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="26.9" y="16.9" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="26.4" y="17.4" width="0.2" height="0.2" /></bezel>
+ <bezel element="disk_white"><bounds x="25.9" y="17.9" width="0.2" height="0.2" /></bezel>
+
+ <!-- field leds -->
+
+ <bezel name="1.7" element="led"><bounds x="15" y="9" width="1" height="1" /></bezel>
+ <bezel name="1.0" element="led"><bounds x="12" y="12" width="1" height="1" /></bezel>
+ <bezel name="2.1" element="led"><bounds x="18" y="12" width="1" height="1" /></bezel>
+ <bezel name="1.1" element="led"><bounds x="9" y="15" width="1" height="1" /></bezel>
+ <bezel name="4.7" element="led"><bounds x="15" y="15" width="1" height="1" /></bezel>
+ <bezel name="2.0" element="led"><bounds x="21" y="15" width="1" height="1" /></bezel>
+ <bezel name="0.7" element="led"><bounds x="6" y="18" width="1" height="1" /></bezel>
+ <bezel name="4.0" element="led"><bounds x="15" y="18" width="1" height="1" /></bezel>
+ <bezel name="2.7" element="led"><bounds x="24" y="18" width="1" height="1" /></bezel>
+ <bezel name="0.0" element="led"><bounds x="9" y="21" width="1" height="1" /></bezel>
+ <bezel name="4.1" element="led"><bounds x="15" y="21" width="1" height="1" /></bezel>
+ <bezel name="3.1" element="led"><bounds x="21" y="21" width="1" height="1" /></bezel>
+ <bezel name="0.2" element="led"><bounds x="9" y="24" width="1" height="1" /></bezel>
+ <bezel name="0.1" element="led"><bounds x="12" y="24" width="1" height="1" /></bezel>
+ <bezel name="4.2" element="led"><bounds x="15" y="24" width="1" height="1" /></bezel>
+ <bezel name="3.0" element="led"><bounds x="18" y="24" width="1" height="1" /></bezel>
+ <bezel name="1.5" element="led"><bounds x="21" y="24" width="1" height="1" /></bezel>
+ <bezel name="4.4" element="led"><bounds x="12" y="27" width="1" height="1" /></bezel>
+ <bezel name="3.7" element="led"><bounds x="15" y="27" width="1" height="1" /></bezel>
+ <bezel name="4.3" element="led"><bounds x="18" y="27" width="1" height="1" /></bezel>
+ <bezel name="4.6" element="led"><bounds x="12" y="30" width="1" height="1" /></bezel>
+ <bezel name="3.5" element="led"><bounds x="15" y="30" width="1" height="1" /></bezel>
+ <bezel name="4.5" element="led"><bounds x="18" y="30" width="1" height="1" /></bezel>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/hh_cop400_test.lay b/src/mame/layout/hh_cop400_test.lay
new file mode 100644
index 00000000000..691c91e1aa1
--- /dev/null
+++ b/src/mame/layout/hh_cop400_test.lay
@@ -0,0 +1,556 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="static_black"><rect><color red="0.0" green="0.0" blue="0.0" /></rect></element>
+
+ <element name="led" defstate="2">
+ <disk state="0"><color red="0.2" green="0.04" blue="0.05" /></disk>
+ <disk state="1"><color red="1.0" green="0.2" blue="0.23" /></disk>
+
+ <disk state="2"><color red="0" green="0" blue="0" /></disk>
+ </element>
+
+
+<!-- build screen -->
+
+ <view name="Test Layout">
+ <bounds left="0" right="64" top="0" bottom="64" />
+ <bezel element="static_black">
+ <bounds left="0" right="64" top="0" bottom="64" />
+ </bezel>
+
+ <!-- max 16*32 matrix -->
+
+ <bezel name="0.0" element="led"><bounds x="0" y="0" width="1" height="1" /></bezel>
+ <bezel name="0.1" element="led"><bounds x="0" y="2" width="1" height="1" /></bezel>
+ <bezel name="0.2" element="led"><bounds x="0" y="4" width="1" height="1" /></bezel>
+ <bezel name="0.3" element="led"><bounds x="0" y="6" width="1" height="1" /></bezel>
+ <bezel name="0.4" element="led"><bounds x="0" y="8" width="1" height="1" /></bezel>
+ <bezel name="0.5" element="led"><bounds x="0" y="10" width="1" height="1" /></bezel>
+ <bezel name="0.6" element="led"><bounds x="0" y="12" width="1" height="1" /></bezel>
+ <bezel name="0.7" element="led"><bounds x="0" y="14" width="1" height="1" /></bezel>
+ <bezel name="0.8" element="led"><bounds x="0" y="16" width="1" height="1" /></bezel>
+ <bezel name="0.9" element="led"><bounds x="0" y="18" width="1" height="1" /></bezel>
+ <bezel name="0.10" element="led"><bounds x="0" y="20" width="1" height="1" /></bezel>
+ <bezel name="0.11" element="led"><bounds x="0" y="22" width="1" height="1" /></bezel>
+ <bezel name="0.12" element="led"><bounds x="0" y="24" width="1" height="1" /></bezel>
+ <bezel name="0.13" element="led"><bounds x="0" y="26" width="1" height="1" /></bezel>
+ <bezel name="0.14" element="led"><bounds x="0" y="28" width="1" height="1" /></bezel>
+ <bezel name="0.15" element="led"><bounds x="0" y="30" width="1" height="1" /></bezel>
+ <bezel name="0.16" element="led"><bounds x="0" y="32" width="1" height="1" /></bezel>
+ <bezel name="0.17" element="led"><bounds x="0" y="34" width="1" height="1" /></bezel>
+ <bezel name="0.18" element="led"><bounds x="0" y="36" width="1" height="1" /></bezel>
+ <bezel name="0.19" element="led"><bounds x="0" y="38" width="1" height="1" /></bezel>
+ <bezel name="0.20" element="led"><bounds x="0" y="40" width="1" height="1" /></bezel>
+ <bezel name="0.21" element="led"><bounds x="0" y="42" width="1" height="1" /></bezel>
+ <bezel name="0.22" element="led"><bounds x="0" y="44" width="1" height="1" /></bezel>
+ <bezel name="0.23" element="led"><bounds x="0" y="46" width="1" height="1" /></bezel>
+ <bezel name="0.24" element="led"><bounds x="0" y="48" width="1" height="1" /></bezel>
+ <bezel name="0.25" element="led"><bounds x="0" y="50" width="1" height="1" /></bezel>
+ <bezel name="0.26" element="led"><bounds x="0" y="52" width="1" height="1" /></bezel>
+ <bezel name="0.27" element="led"><bounds x="0" y="54" width="1" height="1" /></bezel>
+ <bezel name="0.28" element="led"><bounds x="0" y="56" width="1" height="1" /></bezel>
+ <bezel name="0.29" element="led"><bounds x="0" y="58" width="1" height="1" /></bezel>
+ <bezel name="0.30" element="led"><bounds x="0" y="60" width="1" height="1" /></bezel>
+ <bezel name="0.31" element="led"><bounds x="0" y="62" width="1" height="1" /></bezel>
+
+ <bezel name="1.0" element="led"><bounds x="2" y="0" width="1" height="1" /></bezel>
+ <bezel name="1.1" element="led"><bounds x="2" y="2" width="1" height="1" /></bezel>
+ <bezel name="1.2" element="led"><bounds x="2" y="4" width="1" height="1" /></bezel>
+ <bezel name="1.3" element="led"><bounds x="2" y="6" width="1" height="1" /></bezel>
+ <bezel name="1.4" element="led"><bounds x="2" y="8" width="1" height="1" /></bezel>
+ <bezel name="1.5" element="led"><bounds x="2" y="10" width="1" height="1" /></bezel>
+ <bezel name="1.6" element="led"><bounds x="2" y="12" width="1" height="1" /></bezel>
+ <bezel name="1.7" element="led"><bounds x="2" y="14" width="1" height="1" /></bezel>
+ <bezel name="1.8" element="led"><bounds x="2" y="16" width="1" height="1" /></bezel>
+ <bezel name="1.9" element="led"><bounds x="2" y="18" width="1" height="1" /></bezel>
+ <bezel name="1.10" element="led"><bounds x="2" y="20" width="1" height="1" /></bezel>
+ <bezel name="1.11" element="led"><bounds x="2" y="22" width="1" height="1" /></bezel>
+ <bezel name="1.12" element="led"><bounds x="2" y="24" width="1" height="1" /></bezel>
+ <bezel name="1.13" element="led"><bounds x="2" y="26" width="1" height="1" /></bezel>
+ <bezel name="1.14" element="led"><bounds x="2" y="28" width="1" height="1" /></bezel>
+ <bezel name="1.15" element="led"><bounds x="2" y="30" width="1" height="1" /></bezel>
+ <bezel name="1.16" element="led"><bounds x="2" y="32" width="1" height="1" /></bezel>
+ <bezel name="1.17" element="led"><bounds x="2" y="34" width="1" height="1" /></bezel>
+ <bezel name="1.18" element="led"><bounds x="2" y="36" width="1" height="1" /></bezel>
+ <bezel name="1.19" element="led"><bounds x="2" y="38" width="1" height="1" /></bezel>
+ <bezel name="1.20" element="led"><bounds x="2" y="40" width="1" height="1" /></bezel>
+ <bezel name="1.21" element="led"><bounds x="2" y="42" width="1" height="1" /></bezel>
+ <bezel name="1.22" element="led"><bounds x="2" y="44" width="1" height="1" /></bezel>
+ <bezel name="1.23" element="led"><bounds x="2" y="46" width="1" height="1" /></bezel>
+ <bezel name="1.24" element="led"><bounds x="2" y="48" width="1" height="1" /></bezel>
+ <bezel name="1.25" element="led"><bounds x="2" y="50" width="1" height="1" /></bezel>
+ <bezel name="1.26" element="led"><bounds x="2" y="52" width="1" height="1" /></bezel>
+ <bezel name="1.27" element="led"><bounds x="2" y="54" width="1" height="1" /></bezel>
+ <bezel name="1.28" element="led"><bounds x="2" y="56" width="1" height="1" /></bezel>
+ <bezel name="1.29" element="led"><bounds x="2" y="58" width="1" height="1" /></bezel>
+ <bezel name="1.30" element="led"><bounds x="2" y="60" width="1" height="1" /></bezel>
+ <bezel name="1.31" element="led"><bounds x="2" y="62" width="1" height="1" /></bezel>
+
+ <bezel name="2.0" element="led"><bounds x="4" y="0" width="1" height="1" /></bezel>
+ <bezel name="2.1" element="led"><bounds x="4" y="2" width="1" height="1" /></bezel>
+ <bezel name="2.2" element="led"><bounds x="4" y="4" width="1" height="1" /></bezel>
+ <bezel name="2.3" element="led"><bounds x="4" y="6" width="1" height="1" /></bezel>
+ <bezel name="2.4" element="led"><bounds x="4" y="8" width="1" height="1" /></bezel>
+ <bezel name="2.5" element="led"><bounds x="4" y="10" width="1" height="1" /></bezel>
+ <bezel name="2.6" element="led"><bounds x="4" y="12" width="1" height="1" /></bezel>
+ <bezel name="2.7" element="led"><bounds x="4" y="14" width="1" height="1" /></bezel>
+ <bezel name="2.8" element="led"><bounds x="4" y="16" width="1" height="1" /></bezel>
+ <bezel name="2.9" element="led"><bounds x="4" y="18" width="1" height="1" /></bezel>
+ <bezel name="2.10" element="led"><bounds x="4" y="20" width="1" height="1" /></bezel>
+ <bezel name="2.11" element="led"><bounds x="4" y="22" width="1" height="1" /></bezel>
+ <bezel name="2.12" element="led"><bounds x="4" y="24" width="1" height="1" /></bezel>
+ <bezel name="2.13" element="led"><bounds x="4" y="26" width="1" height="1" /></bezel>
+ <bezel name="2.14" element="led"><bounds x="4" y="28" width="1" height="1" /></bezel>
+ <bezel name="2.15" element="led"><bounds x="4" y="30" width="1" height="1" /></bezel>
+ <bezel name="2.16" element="led"><bounds x="4" y="32" width="1" height="1" /></bezel>
+ <bezel name="2.17" element="led"><bounds x="4" y="34" width="1" height="1" /></bezel>
+ <bezel name="2.18" element="led"><bounds x="4" y="36" width="1" height="1" /></bezel>
+ <bezel name="2.19" element="led"><bounds x="4" y="38" width="1" height="1" /></bezel>
+ <bezel name="2.20" element="led"><bounds x="4" y="40" width="1" height="1" /></bezel>
+ <bezel name="2.21" element="led"><bounds x="4" y="42" width="1" height="1" /></bezel>
+ <bezel name="2.22" element="led"><bounds x="4" y="44" width="1" height="1" /></bezel>
+ <bezel name="2.23" element="led"><bounds x="4" y="46" width="1" height="1" /></bezel>
+ <bezel name="2.24" element="led"><bounds x="4" y="48" width="1" height="1" /></bezel>
+ <bezel name="2.25" element="led"><bounds x="4" y="50" width="1" height="1" /></bezel>
+ <bezel name="2.26" element="led"><bounds x="4" y="52" width="1" height="1" /></bezel>
+ <bezel name="2.27" element="led"><bounds x="4" y="54" width="1" height="1" /></bezel>
+ <bezel name="2.28" element="led"><bounds x="4" y="56" width="1" height="1" /></bezel>
+ <bezel name="2.29" element="led"><bounds x="4" y="58" width="1" height="1" /></bezel>
+ <bezel name="2.30" element="led"><bounds x="4" y="60" width="1" height="1" /></bezel>
+ <bezel name="2.31" element="led"><bounds x="4" y="62" width="1" height="1" /></bezel>
+
+ <bezel name="3.0" element="led"><bounds x="6" y="0" width="1" height="1" /></bezel>
+ <bezel name="3.1" element="led"><bounds x="6" y="2" width="1" height="1" /></bezel>
+ <bezel name="3.2" element="led"><bounds x="6" y="4" width="1" height="1" /></bezel>
+ <bezel name="3.3" element="led"><bounds x="6" y="6" width="1" height="1" /></bezel>
+ <bezel name="3.4" element="led"><bounds x="6" y="8" width="1" height="1" /></bezel>
+ <bezel name="3.5" element="led"><bounds x="6" y="10" width="1" height="1" /></bezel>
+ <bezel name="3.6" element="led"><bounds x="6" y="12" width="1" height="1" /></bezel>
+ <bezel name="3.7" element="led"><bounds x="6" y="14" width="1" height="1" /></bezel>
+ <bezel name="3.8" element="led"><bounds x="6" y="16" width="1" height="1" /></bezel>
+ <bezel name="3.9" element="led"><bounds x="6" y="18" width="1" height="1" /></bezel>
+ <bezel name="3.10" element="led"><bounds x="6" y="20" width="1" height="1" /></bezel>
+ <bezel name="3.11" element="led"><bounds x="6" y="22" width="1" height="1" /></bezel>
+ <bezel name="3.12" element="led"><bounds x="6" y="24" width="1" height="1" /></bezel>
+ <bezel name="3.13" element="led"><bounds x="6" y="26" width="1" height="1" /></bezel>
+ <bezel name="3.14" element="led"><bounds x="6" y="28" width="1" height="1" /></bezel>
+ <bezel name="3.15" element="led"><bounds x="6" y="30" width="1" height="1" /></bezel>
+ <bezel name="3.16" element="led"><bounds x="6" y="32" width="1" height="1" /></bezel>
+ <bezel name="3.17" element="led"><bounds x="6" y="34" width="1" height="1" /></bezel>
+ <bezel name="3.18" element="led"><bounds x="6" y="36" width="1" height="1" /></bezel>
+ <bezel name="3.19" element="led"><bounds x="6" y="38" width="1" height="1" /></bezel>
+ <bezel name="3.20" element="led"><bounds x="6" y="40" width="1" height="1" /></bezel>
+ <bezel name="3.21" element="led"><bounds x="6" y="42" width="1" height="1" /></bezel>
+ <bezel name="3.22" element="led"><bounds x="6" y="44" width="1" height="1" /></bezel>
+ <bezel name="3.23" element="led"><bounds x="6" y="46" width="1" height="1" /></bezel>
+ <bezel name="3.24" element="led"><bounds x="6" y="48" width="1" height="1" /></bezel>
+ <bezel name="3.25" element="led"><bounds x="6" y="50" width="1" height="1" /></bezel>
+ <bezel name="3.26" element="led"><bounds x="6" y="52" width="1" height="1" /></bezel>
+ <bezel name="3.27" element="led"><bounds x="6" y="54" width="1" height="1" /></bezel>
+ <bezel name="3.28" element="led"><bounds x="6" y="56" width="1" height="1" /></bezel>
+ <bezel name="3.29" element="led"><bounds x="6" y="58" width="1" height="1" /></bezel>
+ <bezel name="3.30" element="led"><bounds x="6" y="60" width="1" height="1" /></bezel>
+ <bezel name="3.31" element="led"><bounds x="6" y="62" width="1" height="1" /></bezel>
+
+ <bezel name="4.0" element="led"><bounds x="8" y="0" width="1" height="1" /></bezel>
+ <bezel name="4.1" element="led"><bounds x="8" y="2" width="1" height="1" /></bezel>
+ <bezel name="4.2" element="led"><bounds x="8" y="4" width="1" height="1" /></bezel>
+ <bezel name="4.3" element="led"><bounds x="8" y="6" width="1" height="1" /></bezel>
+ <bezel name="4.4" element="led"><bounds x="8" y="8" width="1" height="1" /></bezel>
+ <bezel name="4.5" element="led"><bounds x="8" y="10" width="1" height="1" /></bezel>
+ <bezel name="4.6" element="led"><bounds x="8" y="12" width="1" height="1" /></bezel>
+ <bezel name="4.7" element="led"><bounds x="8" y="14" width="1" height="1" /></bezel>
+ <bezel name="4.8" element="led"><bounds x="8" y="16" width="1" height="1" /></bezel>
+ <bezel name="4.9" element="led"><bounds x="8" y="18" width="1" height="1" /></bezel>
+ <bezel name="4.10" element="led"><bounds x="8" y="20" width="1" height="1" /></bezel>
+ <bezel name="4.11" element="led"><bounds x="8" y="22" width="1" height="1" /></bezel>
+ <bezel name="4.12" element="led"><bounds x="8" y="24" width="1" height="1" /></bezel>
+ <bezel name="4.13" element="led"><bounds x="8" y="26" width="1" height="1" /></bezel>
+ <bezel name="4.14" element="led"><bounds x="8" y="28" width="1" height="1" /></bezel>
+ <bezel name="4.15" element="led"><bounds x="8" y="30" width="1" height="1" /></bezel>
+ <bezel name="4.16" element="led"><bounds x="8" y="32" width="1" height="1" /></bezel>
+ <bezel name="4.17" element="led"><bounds x="8" y="34" width="1" height="1" /></bezel>
+ <bezel name="4.18" element="led"><bounds x="8" y="36" width="1" height="1" /></bezel>
+ <bezel name="4.19" element="led"><bounds x="8" y="38" width="1" height="1" /></bezel>
+ <bezel name="4.20" element="led"><bounds x="8" y="40" width="1" height="1" /></bezel>
+ <bezel name="4.21" element="led"><bounds x="8" y="42" width="1" height="1" /></bezel>
+ <bezel name="4.22" element="led"><bounds x="8" y="44" width="1" height="1" /></bezel>
+ <bezel name="4.23" element="led"><bounds x="8" y="46" width="1" height="1" /></bezel>
+ <bezel name="4.24" element="led"><bounds x="8" y="48" width="1" height="1" /></bezel>
+ <bezel name="4.25" element="led"><bounds x="8" y="50" width="1" height="1" /></bezel>
+ <bezel name="4.26" element="led"><bounds x="8" y="52" width="1" height="1" /></bezel>
+ <bezel name="4.27" element="led"><bounds x="8" y="54" width="1" height="1" /></bezel>
+ <bezel name="4.28" element="led"><bounds x="8" y="56" width="1" height="1" /></bezel>
+ <bezel name="4.29" element="led"><bounds x="8" y="58" width="1" height="1" /></bezel>
+ <bezel name="4.30" element="led"><bounds x="8" y="60" width="1" height="1" /></bezel>
+ <bezel name="4.31" element="led"><bounds x="8" y="62" width="1" height="1" /></bezel>
+
+ <bezel name="5.0" element="led"><bounds x="10" y="0" width="1" height="1" /></bezel>
+ <bezel name="5.1" element="led"><bounds x="10" y="2" width="1" height="1" /></bezel>
+ <bezel name="5.2" element="led"><bounds x="10" y="4" width="1" height="1" /></bezel>
+ <bezel name="5.3" element="led"><bounds x="10" y="6" width="1" height="1" /></bezel>
+ <bezel name="5.4" element="led"><bounds x="10" y="8" width="1" height="1" /></bezel>
+ <bezel name="5.5" element="led"><bounds x="10" y="10" width="1" height="1" /></bezel>
+ <bezel name="5.6" element="led"><bounds x="10" y="12" width="1" height="1" /></bezel>
+ <bezel name="5.7" element="led"><bounds x="10" y="14" width="1" height="1" /></bezel>
+ <bezel name="5.8" element="led"><bounds x="10" y="16" width="1" height="1" /></bezel>
+ <bezel name="5.9" element="led"><bounds x="10" y="18" width="1" height="1" /></bezel>
+ <bezel name="5.10" element="led"><bounds x="10" y="20" width="1" height="1" /></bezel>
+ <bezel name="5.11" element="led"><bounds x="10" y="22" width="1" height="1" /></bezel>
+ <bezel name="5.12" element="led"><bounds x="10" y="24" width="1" height="1" /></bezel>
+ <bezel name="5.13" element="led"><bounds x="10" y="26" width="1" height="1" /></bezel>
+ <bezel name="5.14" element="led"><bounds x="10" y="28" width="1" height="1" /></bezel>
+ <bezel name="5.15" element="led"><bounds x="10" y="30" width="1" height="1" /></bezel>
+ <bezel name="5.16" element="led"><bounds x="10" y="32" width="1" height="1" /></bezel>
+ <bezel name="5.17" element="led"><bounds x="10" y="34" width="1" height="1" /></bezel>
+ <bezel name="5.18" element="led"><bounds x="10" y="36" width="1" height="1" /></bezel>
+ <bezel name="5.19" element="led"><bounds x="10" y="38" width="1" height="1" /></bezel>
+ <bezel name="5.20" element="led"><bounds x="10" y="40" width="1" height="1" /></bezel>
+ <bezel name="5.21" element="led"><bounds x="10" y="42" width="1" height="1" /></bezel>
+ <bezel name="5.22" element="led"><bounds x="10" y="44" width="1" height="1" /></bezel>
+ <bezel name="5.23" element="led"><bounds x="10" y="46" width="1" height="1" /></bezel>
+ <bezel name="5.24" element="led"><bounds x="10" y="48" width="1" height="1" /></bezel>
+ <bezel name="5.25" element="led"><bounds x="10" y="50" width="1" height="1" /></bezel>
+ <bezel name="5.26" element="led"><bounds x="10" y="52" width="1" height="1" /></bezel>
+ <bezel name="5.27" element="led"><bounds x="10" y="54" width="1" height="1" /></bezel>
+ <bezel name="5.28" element="led"><bounds x="10" y="56" width="1" height="1" /></bezel>
+ <bezel name="5.29" element="led"><bounds x="10" y="58" width="1" height="1" /></bezel>
+ <bezel name="5.30" element="led"><bounds x="10" y="60" width="1" height="1" /></bezel>
+ <bezel name="5.31" element="led"><bounds x="10" y="62" width="1" height="1" /></bezel>
+
+ <bezel name="6.0" element="led"><bounds x="12" y="0" width="1" height="1" /></bezel>
+ <bezel name="6.1" element="led"><bounds x="12" y="2" width="1" height="1" /></bezel>
+ <bezel name="6.2" element="led"><bounds x="12" y="4" width="1" height="1" /></bezel>
+ <bezel name="6.3" element="led"><bounds x="12" y="6" width="1" height="1" /></bezel>
+ <bezel name="6.4" element="led"><bounds x="12" y="8" width="1" height="1" /></bezel>
+ <bezel name="6.5" element="led"><bounds x="12" y="10" width="1" height="1" /></bezel>
+ <bezel name="6.6" element="led"><bounds x="12" y="12" width="1" height="1" /></bezel>
+ <bezel name="6.7" element="led"><bounds x="12" y="14" width="1" height="1" /></bezel>
+ <bezel name="6.8" element="led"><bounds x="12" y="16" width="1" height="1" /></bezel>
+ <bezel name="6.9" element="led"><bounds x="12" y="18" width="1" height="1" /></bezel>
+ <bezel name="6.10" element="led"><bounds x="12" y="20" width="1" height="1" /></bezel>
+ <bezel name="6.11" element="led"><bounds x="12" y="22" width="1" height="1" /></bezel>
+ <bezel name="6.12" element="led"><bounds x="12" y="24" width="1" height="1" /></bezel>
+ <bezel name="6.13" element="led"><bounds x="12" y="26" width="1" height="1" /></bezel>
+ <bezel name="6.14" element="led"><bounds x="12" y="28" width="1" height="1" /></bezel>
+ <bezel name="6.15" element="led"><bounds x="12" y="30" width="1" height="1" /></bezel>
+ <bezel name="6.16" element="led"><bounds x="12" y="32" width="1" height="1" /></bezel>
+ <bezel name="6.17" element="led"><bounds x="12" y="34" width="1" height="1" /></bezel>
+ <bezel name="6.18" element="led"><bounds x="12" y="36" width="1" height="1" /></bezel>
+ <bezel name="6.19" element="led"><bounds x="12" y="38" width="1" height="1" /></bezel>
+ <bezel name="6.20" element="led"><bounds x="12" y="40" width="1" height="1" /></bezel>
+ <bezel name="6.21" element="led"><bounds x="12" y="42" width="1" height="1" /></bezel>
+ <bezel name="6.22" element="led"><bounds x="12" y="44" width="1" height="1" /></bezel>
+ <bezel name="6.23" element="led"><bounds x="12" y="46" width="1" height="1" /></bezel>
+ <bezel name="6.24" element="led"><bounds x="12" y="48" width="1" height="1" /></bezel>
+ <bezel name="6.25" element="led"><bounds x="12" y="50" width="1" height="1" /></bezel>
+ <bezel name="6.26" element="led"><bounds x="12" y="52" width="1" height="1" /></bezel>
+ <bezel name="6.27" element="led"><bounds x="12" y="54" width="1" height="1" /></bezel>
+ <bezel name="6.28" element="led"><bounds x="12" y="56" width="1" height="1" /></bezel>
+ <bezel name="6.29" element="led"><bounds x="12" y="58" width="1" height="1" /></bezel>
+ <bezel name="6.30" element="led"><bounds x="12" y="60" width="1" height="1" /></bezel>
+ <bezel name="6.31" element="led"><bounds x="12" y="62" width="1" height="1" /></bezel>
+
+ <bezel name="7.0" element="led"><bounds x="14" y="0" width="1" height="1" /></bezel>
+ <bezel name="7.1" element="led"><bounds x="14" y="2" width="1" height="1" /></bezel>
+ <bezel name="7.2" element="led"><bounds x="14" y="4" width="1" height="1" /></bezel>
+ <bezel name="7.3" element="led"><bounds x="14" y="6" width="1" height="1" /></bezel>
+ <bezel name="7.4" element="led"><bounds x="14" y="8" width="1" height="1" /></bezel>
+ <bezel name="7.5" element="led"><bounds x="14" y="10" width="1" height="1" /></bezel>
+ <bezel name="7.6" element="led"><bounds x="14" y="12" width="1" height="1" /></bezel>
+ <bezel name="7.7" element="led"><bounds x="14" y="14" width="1" height="1" /></bezel>
+ <bezel name="7.8" element="led"><bounds x="14" y="16" width="1" height="1" /></bezel>
+ <bezel name="7.9" element="led"><bounds x="14" y="18" width="1" height="1" /></bezel>
+ <bezel name="7.10" element="led"><bounds x="14" y="20" width="1" height="1" /></bezel>
+ <bezel name="7.11" element="led"><bounds x="14" y="22" width="1" height="1" /></bezel>
+ <bezel name="7.12" element="led"><bounds x="14" y="24" width="1" height="1" /></bezel>
+ <bezel name="7.13" element="led"><bounds x="14" y="26" width="1" height="1" /></bezel>
+ <bezel name="7.14" element="led"><bounds x="14" y="28" width="1" height="1" /></bezel>
+ <bezel name="7.15" element="led"><bounds x="14" y="30" width="1" height="1" /></bezel>
+ <bezel name="7.16" element="led"><bounds x="14" y="32" width="1" height="1" /></bezel>
+ <bezel name="7.17" element="led"><bounds x="14" y="34" width="1" height="1" /></bezel>
+ <bezel name="7.18" element="led"><bounds x="14" y="36" width="1" height="1" /></bezel>
+ <bezel name="7.19" element="led"><bounds x="14" y="38" width="1" height="1" /></bezel>
+ <bezel name="7.20" element="led"><bounds x="14" y="40" width="1" height="1" /></bezel>
+ <bezel name="7.21" element="led"><bounds x="14" y="42" width="1" height="1" /></bezel>
+ <bezel name="7.22" element="led"><bounds x="14" y="44" width="1" height="1" /></bezel>
+ <bezel name="7.23" element="led"><bounds x="14" y="46" width="1" height="1" /></bezel>
+ <bezel name="7.24" element="led"><bounds x="14" y="48" width="1" height="1" /></bezel>
+ <bezel name="7.25" element="led"><bounds x="14" y="50" width="1" height="1" /></bezel>
+ <bezel name="7.26" element="led"><bounds x="14" y="52" width="1" height="1" /></bezel>
+ <bezel name="7.27" element="led"><bounds x="14" y="54" width="1" height="1" /></bezel>
+ <bezel name="7.28" element="led"><bounds x="14" y="56" width="1" height="1" /></bezel>
+ <bezel name="7.29" element="led"><bounds x="14" y="58" width="1" height="1" /></bezel>
+ <bezel name="7.30" element="led"><bounds x="14" y="60" width="1" height="1" /></bezel>
+ <bezel name="7.31" element="led"><bounds x="14" y="62" width="1" height="1" /></bezel>
+
+ <bezel name="8.0" element="led"><bounds x="16" y="0" width="1" height="1" /></bezel>
+ <bezel name="8.1" element="led"><bounds x="16" y="2" width="1" height="1" /></bezel>
+ <bezel name="8.2" element="led"><bounds x="16" y="4" width="1" height="1" /></bezel>
+ <bezel name="8.3" element="led"><bounds x="16" y="6" width="1" height="1" /></bezel>
+ <bezel name="8.4" element="led"><bounds x="16" y="8" width="1" height="1" /></bezel>
+ <bezel name="8.5" element="led"><bounds x="16" y="10" width="1" height="1" /></bezel>
+ <bezel name="8.6" element="led"><bounds x="16" y="12" width="1" height="1" /></bezel>
+ <bezel name="8.7" element="led"><bounds x="16" y="14" width="1" height="1" /></bezel>
+ <bezel name="8.8" element="led"><bounds x="16" y="16" width="1" height="1" /></bezel>
+ <bezel name="8.9" element="led"><bounds x="16" y="18" width="1" height="1" /></bezel>
+ <bezel name="8.10" element="led"><bounds x="16" y="20" width="1" height="1" /></bezel>
+ <bezel name="8.11" element="led"><bounds x="16" y="22" width="1" height="1" /></bezel>
+ <bezel name="8.12" element="led"><bounds x="16" y="24" width="1" height="1" /></bezel>
+ <bezel name="8.13" element="led"><bounds x="16" y="26" width="1" height="1" /></bezel>
+ <bezel name="8.14" element="led"><bounds x="16" y="28" width="1" height="1" /></bezel>
+ <bezel name="8.15" element="led"><bounds x="16" y="30" width="1" height="1" /></bezel>
+ <bezel name="8.16" element="led"><bounds x="16" y="32" width="1" height="1" /></bezel>
+ <bezel name="8.17" element="led"><bounds x="16" y="34" width="1" height="1" /></bezel>
+ <bezel name="8.18" element="led"><bounds x="16" y="36" width="1" height="1" /></bezel>
+ <bezel name="8.19" element="led"><bounds x="16" y="38" width="1" height="1" /></bezel>
+ <bezel name="8.20" element="led"><bounds x="16" y="40" width="1" height="1" /></bezel>
+ <bezel name="8.21" element="led"><bounds x="16" y="42" width="1" height="1" /></bezel>
+ <bezel name="8.22" element="led"><bounds x="16" y="44" width="1" height="1" /></bezel>
+ <bezel name="8.23" element="led"><bounds x="16" y="46" width="1" height="1" /></bezel>
+ <bezel name="8.24" element="led"><bounds x="16" y="48" width="1" height="1" /></bezel>
+ <bezel name="8.25" element="led"><bounds x="16" y="50" width="1" height="1" /></bezel>
+ <bezel name="8.26" element="led"><bounds x="16" y="52" width="1" height="1" /></bezel>
+ <bezel name="8.27" element="led"><bounds x="16" y="54" width="1" height="1" /></bezel>
+ <bezel name="8.28" element="led"><bounds x="16" y="56" width="1" height="1" /></bezel>
+ <bezel name="8.29" element="led"><bounds x="16" y="58" width="1" height="1" /></bezel>
+ <bezel name="8.30" element="led"><bounds x="16" y="60" width="1" height="1" /></bezel>
+ <bezel name="8.31" element="led"><bounds x="16" y="62" width="1" height="1" /></bezel>
+
+ <bezel name="9.0" element="led"><bounds x="18" y="0" width="1" height="1" /></bezel>
+ <bezel name="9.1" element="led"><bounds x="18" y="2" width="1" height="1" /></bezel>
+ <bezel name="9.2" element="led"><bounds x="18" y="4" width="1" height="1" /></bezel>
+ <bezel name="9.3" element="led"><bounds x="18" y="6" width="1" height="1" /></bezel>
+ <bezel name="9.4" element="led"><bounds x="18" y="8" width="1" height="1" /></bezel>
+ <bezel name="9.5" element="led"><bounds x="18" y="10" width="1" height="1" /></bezel>
+ <bezel name="9.6" element="led"><bounds x="18" y="12" width="1" height="1" /></bezel>
+ <bezel name="9.7" element="led"><bounds x="18" y="14" width="1" height="1" /></bezel>
+ <bezel name="9.8" element="led"><bounds x="18" y="16" width="1" height="1" /></bezel>
+ <bezel name="9.9" element="led"><bounds x="18" y="18" width="1" height="1" /></bezel>
+ <bezel name="9.10" element="led"><bounds x="18" y="20" width="1" height="1" /></bezel>
+ <bezel name="9.11" element="led"><bounds x="18" y="22" width="1" height="1" /></bezel>
+ <bezel name="9.12" element="led"><bounds x="18" y="24" width="1" height="1" /></bezel>
+ <bezel name="9.13" element="led"><bounds x="18" y="26" width="1" height="1" /></bezel>
+ <bezel name="9.14" element="led"><bounds x="18" y="28" width="1" height="1" /></bezel>
+ <bezel name="9.15" element="led"><bounds x="18" y="30" width="1" height="1" /></bezel>
+ <bezel name="9.16" element="led"><bounds x="18" y="32" width="1" height="1" /></bezel>
+ <bezel name="9.17" element="led"><bounds x="18" y="34" width="1" height="1" /></bezel>
+ <bezel name="9.18" element="led"><bounds x="18" y="36" width="1" height="1" /></bezel>
+ <bezel name="9.19" element="led"><bounds x="18" y="38" width="1" height="1" /></bezel>
+ <bezel name="9.20" element="led"><bounds x="18" y="40" width="1" height="1" /></bezel>
+ <bezel name="9.21" element="led"><bounds x="18" y="42" width="1" height="1" /></bezel>
+ <bezel name="9.22" element="led"><bounds x="18" y="44" width="1" height="1" /></bezel>
+ <bezel name="9.23" element="led"><bounds x="18" y="46" width="1" height="1" /></bezel>
+ <bezel name="9.24" element="led"><bounds x="18" y="48" width="1" height="1" /></bezel>
+ <bezel name="9.25" element="led"><bounds x="18" y="50" width="1" height="1" /></bezel>
+ <bezel name="9.26" element="led"><bounds x="18" y="52" width="1" height="1" /></bezel>
+ <bezel name="9.27" element="led"><bounds x="18" y="54" width="1" height="1" /></bezel>
+ <bezel name="9.28" element="led"><bounds x="18" y="56" width="1" height="1" /></bezel>
+ <bezel name="9.29" element="led"><bounds x="18" y="58" width="1" height="1" /></bezel>
+ <bezel name="9.30" element="led"><bounds x="18" y="60" width="1" height="1" /></bezel>
+ <bezel name="9.31" element="led"><bounds x="18" y="62" width="1" height="1" /></bezel>
+
+ <bezel name="10.0" element="led"><bounds x="20" y="0" width="1" height="1" /></bezel>
+ <bezel name="10.1" element="led"><bounds x="20" y="2" width="1" height="1" /></bezel>
+ <bezel name="10.2" element="led"><bounds x="20" y="4" width="1" height="1" /></bezel>
+ <bezel name="10.3" element="led"><bounds x="20" y="6" width="1" height="1" /></bezel>
+ <bezel name="10.4" element="led"><bounds x="20" y="8" width="1" height="1" /></bezel>
+ <bezel name="10.5" element="led"><bounds x="20" y="10" width="1" height="1" /></bezel>
+ <bezel name="10.6" element="led"><bounds x="20" y="12" width="1" height="1" /></bezel>
+ <bezel name="10.7" element="led"><bounds x="20" y="14" width="1" height="1" /></bezel>
+ <bezel name="10.8" element="led"><bounds x="20" y="16" width="1" height="1" /></bezel>
+ <bezel name="10.9" element="led"><bounds x="20" y="18" width="1" height="1" /></bezel>
+ <bezel name="10.10" element="led"><bounds x="20" y="20" width="1" height="1" /></bezel>
+ <bezel name="10.11" element="led"><bounds x="20" y="22" width="1" height="1" /></bezel>
+ <bezel name="10.12" element="led"><bounds x="20" y="24" width="1" height="1" /></bezel>
+ <bezel name="10.13" element="led"><bounds x="20" y="26" width="1" height="1" /></bezel>
+ <bezel name="10.14" element="led"><bounds x="20" y="28" width="1" height="1" /></bezel>
+ <bezel name="10.15" element="led"><bounds x="20" y="30" width="1" height="1" /></bezel>
+ <bezel name="10.16" element="led"><bounds x="20" y="32" width="1" height="1" /></bezel>
+ <bezel name="10.17" element="led"><bounds x="20" y="34" width="1" height="1" /></bezel>
+ <bezel name="10.18" element="led"><bounds x="20" y="36" width="1" height="1" /></bezel>
+ <bezel name="10.19" element="led"><bounds x="20" y="38" width="1" height="1" /></bezel>
+ <bezel name="10.20" element="led"><bounds x="20" y="40" width="1" height="1" /></bezel>
+ <bezel name="10.21" element="led"><bounds x="20" y="42" width="1" height="1" /></bezel>
+ <bezel name="10.22" element="led"><bounds x="20" y="44" width="1" height="1" /></bezel>
+ <bezel name="10.23" element="led"><bounds x="20" y="46" width="1" height="1" /></bezel>
+ <bezel name="10.24" element="led"><bounds x="20" y="48" width="1" height="1" /></bezel>
+ <bezel name="10.25" element="led"><bounds x="20" y="50" width="1" height="1" /></bezel>
+ <bezel name="10.26" element="led"><bounds x="20" y="52" width="1" height="1" /></bezel>
+ <bezel name="10.27" element="led"><bounds x="20" y="54" width="1" height="1" /></bezel>
+ <bezel name="10.28" element="led"><bounds x="20" y="56" width="1" height="1" /></bezel>
+ <bezel name="10.29" element="led"><bounds x="20" y="58" width="1" height="1" /></bezel>
+ <bezel name="10.30" element="led"><bounds x="20" y="60" width="1" height="1" /></bezel>
+ <bezel name="10.31" element="led"><bounds x="20" y="62" width="1" height="1" /></bezel>
+
+ <bezel name="11.0" element="led"><bounds x="22" y="0" width="1" height="1" /></bezel>
+ <bezel name="11.1" element="led"><bounds x="22" y="2" width="1" height="1" /></bezel>
+ <bezel name="11.2" element="led"><bounds x="22" y="4" width="1" height="1" /></bezel>
+ <bezel name="11.3" element="led"><bounds x="22" y="6" width="1" height="1" /></bezel>
+ <bezel name="11.4" element="led"><bounds x="22" y="8" width="1" height="1" /></bezel>
+ <bezel name="11.5" element="led"><bounds x="22" y="10" width="1" height="1" /></bezel>
+ <bezel name="11.6" element="led"><bounds x="22" y="12" width="1" height="1" /></bezel>
+ <bezel name="11.7" element="led"><bounds x="22" y="14" width="1" height="1" /></bezel>
+ <bezel name="11.8" element="led"><bounds x="22" y="16" width="1" height="1" /></bezel>
+ <bezel name="11.9" element="led"><bounds x="22" y="18" width="1" height="1" /></bezel>
+ <bezel name="11.10" element="led"><bounds x="22" y="20" width="1" height="1" /></bezel>
+ <bezel name="11.11" element="led"><bounds x="22" y="22" width="1" height="1" /></bezel>
+ <bezel name="11.12" element="led"><bounds x="22" y="24" width="1" height="1" /></bezel>
+ <bezel name="11.13" element="led"><bounds x="22" y="26" width="1" height="1" /></bezel>
+ <bezel name="11.14" element="led"><bounds x="22" y="28" width="1" height="1" /></bezel>
+ <bezel name="11.15" element="led"><bounds x="22" y="30" width="1" height="1" /></bezel>
+ <bezel name="11.16" element="led"><bounds x="22" y="32" width="1" height="1" /></bezel>
+ <bezel name="11.17" element="led"><bounds x="22" y="34" width="1" height="1" /></bezel>
+ <bezel name="11.18" element="led"><bounds x="22" y="36" width="1" height="1" /></bezel>
+ <bezel name="11.19" element="led"><bounds x="22" y="38" width="1" height="1" /></bezel>
+ <bezel name="11.20" element="led"><bounds x="22" y="40" width="1" height="1" /></bezel>
+ <bezel name="11.21" element="led"><bounds x="22" y="42" width="1" height="1" /></bezel>
+ <bezel name="11.22" element="led"><bounds x="22" y="44" width="1" height="1" /></bezel>
+ <bezel name="11.23" element="led"><bounds x="22" y="46" width="1" height="1" /></bezel>
+ <bezel name="11.24" element="led"><bounds x="22" y="48" width="1" height="1" /></bezel>
+ <bezel name="11.25" element="led"><bounds x="22" y="50" width="1" height="1" /></bezel>
+ <bezel name="11.26" element="led"><bounds x="22" y="52" width="1" height="1" /></bezel>
+ <bezel name="11.27" element="led"><bounds x="22" y="54" width="1" height="1" /></bezel>
+ <bezel name="11.28" element="led"><bounds x="22" y="56" width="1" height="1" /></bezel>
+ <bezel name="11.29" element="led"><bounds x="22" y="58" width="1" height="1" /></bezel>
+ <bezel name="11.30" element="led"><bounds x="22" y="60" width="1" height="1" /></bezel>
+ <bezel name="11.31" element="led"><bounds x="22" y="62" width="1" height="1" /></bezel>
+
+ <bezel name="12.0" element="led"><bounds x="24" y="0" width="1" height="1" /></bezel>
+ <bezel name="12.1" element="led"><bounds x="24" y="2" width="1" height="1" /></bezel>
+ <bezel name="12.2" element="led"><bounds x="24" y="4" width="1" height="1" /></bezel>
+ <bezel name="12.3" element="led"><bounds x="24" y="6" width="1" height="1" /></bezel>
+ <bezel name="12.4" element="led"><bounds x="24" y="8" width="1" height="1" /></bezel>
+ <bezel name="12.5" element="led"><bounds x="24" y="10" width="1" height="1" /></bezel>
+ <bezel name="12.6" element="led"><bounds x="24" y="12" width="1" height="1" /></bezel>
+ <bezel name="12.7" element="led"><bounds x="24" y="14" width="1" height="1" /></bezel>
+ <bezel name="12.8" element="led"><bounds x="24" y="16" width="1" height="1" /></bezel>
+ <bezel name="12.9" element="led"><bounds x="24" y="18" width="1" height="1" /></bezel>
+ <bezel name="12.10" element="led"><bounds x="24" y="20" width="1" height="1" /></bezel>
+ <bezel name="12.11" element="led"><bounds x="24" y="22" width="1" height="1" /></bezel>
+ <bezel name="12.12" element="led"><bounds x="24" y="24" width="1" height="1" /></bezel>
+ <bezel name="12.13" element="led"><bounds x="24" y="26" width="1" height="1" /></bezel>
+ <bezel name="12.14" element="led"><bounds x="24" y="28" width="1" height="1" /></bezel>
+ <bezel name="12.15" element="led"><bounds x="24" y="30" width="1" height="1" /></bezel>
+ <bezel name="12.16" element="led"><bounds x="24" y="32" width="1" height="1" /></bezel>
+ <bezel name="12.17" element="led"><bounds x="24" y="34" width="1" height="1" /></bezel>
+ <bezel name="12.18" element="led"><bounds x="24" y="36" width="1" height="1" /></bezel>
+ <bezel name="12.19" element="led"><bounds x="24" y="38" width="1" height="1" /></bezel>
+ <bezel name="12.20" element="led"><bounds x="24" y="40" width="1" height="1" /></bezel>
+ <bezel name="12.21" element="led"><bounds x="24" y="42" width="1" height="1" /></bezel>
+ <bezel name="12.22" element="led"><bounds x="24" y="44" width="1" height="1" /></bezel>
+ <bezel name="12.23" element="led"><bounds x="24" y="46" width="1" height="1" /></bezel>
+ <bezel name="12.24" element="led"><bounds x="24" y="48" width="1" height="1" /></bezel>
+ <bezel name="12.25" element="led"><bounds x="24" y="50" width="1" height="1" /></bezel>
+ <bezel name="12.26" element="led"><bounds x="24" y="52" width="1" height="1" /></bezel>
+ <bezel name="12.27" element="led"><bounds x="24" y="54" width="1" height="1" /></bezel>
+ <bezel name="12.28" element="led"><bounds x="24" y="56" width="1" height="1" /></bezel>
+ <bezel name="12.29" element="led"><bounds x="24" y="58" width="1" height="1" /></bezel>
+ <bezel name="12.30" element="led"><bounds x="24" y="60" width="1" height="1" /></bezel>
+ <bezel name="12.31" element="led"><bounds x="24" y="62" width="1" height="1" /></bezel>
+
+ <bezel name="13.0" element="led"><bounds x="26" y="0" width="1" height="1" /></bezel>
+ <bezel name="13.1" element="led"><bounds x="26" y="2" width="1" height="1" /></bezel>
+ <bezel name="13.2" element="led"><bounds x="26" y="4" width="1" height="1" /></bezel>
+ <bezel name="13.3" element="led"><bounds x="26" y="6" width="1" height="1" /></bezel>
+ <bezel name="13.4" element="led"><bounds x="26" y="8" width="1" height="1" /></bezel>
+ <bezel name="13.5" element="led"><bounds x="26" y="10" width="1" height="1" /></bezel>
+ <bezel name="13.6" element="led"><bounds x="26" y="12" width="1" height="1" /></bezel>
+ <bezel name="13.7" element="led"><bounds x="26" y="14" width="1" height="1" /></bezel>
+ <bezel name="13.8" element="led"><bounds x="26" y="16" width="1" height="1" /></bezel>
+ <bezel name="13.9" element="led"><bounds x="26" y="18" width="1" height="1" /></bezel>
+ <bezel name="13.10" element="led"><bounds x="26" y="20" width="1" height="1" /></bezel>
+ <bezel name="13.11" element="led"><bounds x="26" y="22" width="1" height="1" /></bezel>
+ <bezel name="13.12" element="led"><bounds x="26" y="24" width="1" height="1" /></bezel>
+ <bezel name="13.13" element="led"><bounds x="26" y="26" width="1" height="1" /></bezel>
+ <bezel name="13.14" element="led"><bounds x="26" y="28" width="1" height="1" /></bezel>
+ <bezel name="13.15" element="led"><bounds x="26" y="30" width="1" height="1" /></bezel>
+ <bezel name="13.16" element="led"><bounds x="26" y="32" width="1" height="1" /></bezel>
+ <bezel name="13.17" element="led"><bounds x="26" y="34" width="1" height="1" /></bezel>
+ <bezel name="13.18" element="led"><bounds x="26" y="36" width="1" height="1" /></bezel>
+ <bezel name="13.19" element="led"><bounds x="26" y="38" width="1" height="1" /></bezel>
+ <bezel name="13.20" element="led"><bounds x="26" y="40" width="1" height="1" /></bezel>
+ <bezel name="13.21" element="led"><bounds x="26" y="42" width="1" height="1" /></bezel>
+ <bezel name="13.22" element="led"><bounds x="26" y="44" width="1" height="1" /></bezel>
+ <bezel name="13.23" element="led"><bounds x="26" y="46" width="1" height="1" /></bezel>
+ <bezel name="13.24" element="led"><bounds x="26" y="48" width="1" height="1" /></bezel>
+ <bezel name="13.25" element="led"><bounds x="26" y="50" width="1" height="1" /></bezel>
+ <bezel name="13.26" element="led"><bounds x="26" y="52" width="1" height="1" /></bezel>
+ <bezel name="13.27" element="led"><bounds x="26" y="54" width="1" height="1" /></bezel>
+ <bezel name="13.28" element="led"><bounds x="26" y="56" width="1" height="1" /></bezel>
+ <bezel name="13.29" element="led"><bounds x="26" y="58" width="1" height="1" /></bezel>
+ <bezel name="13.30" element="led"><bounds x="26" y="60" width="1" height="1" /></bezel>
+ <bezel name="13.31" element="led"><bounds x="26" y="62" width="1" height="1" /></bezel>
+
+ <bezel name="14.0" element="led"><bounds x="28" y="0" width="1" height="1" /></bezel>
+ <bezel name="14.1" element="led"><bounds x="28" y="2" width="1" height="1" /></bezel>
+ <bezel name="14.2" element="led"><bounds x="28" y="4" width="1" height="1" /></bezel>
+ <bezel name="14.3" element="led"><bounds x="28" y="6" width="1" height="1" /></bezel>
+ <bezel name="14.4" element="led"><bounds x="28" y="8" width="1" height="1" /></bezel>
+ <bezel name="14.5" element="led"><bounds x="28" y="10" width="1" height="1" /></bezel>
+ <bezel name="14.6" element="led"><bounds x="28" y="12" width="1" height="1" /></bezel>
+ <bezel name="14.7" element="led"><bounds x="28" y="14" width="1" height="1" /></bezel>
+ <bezel name="14.8" element="led"><bounds x="28" y="16" width="1" height="1" /></bezel>
+ <bezel name="14.9" element="led"><bounds x="28" y="18" width="1" height="1" /></bezel>
+ <bezel name="14.10" element="led"><bounds x="28" y="20" width="1" height="1" /></bezel>
+ <bezel name="14.11" element="led"><bounds x="28" y="22" width="1" height="1" /></bezel>
+ <bezel name="14.12" element="led"><bounds x="28" y="24" width="1" height="1" /></bezel>
+ <bezel name="14.13" element="led"><bounds x="28" y="26" width="1" height="1" /></bezel>
+ <bezel name="14.14" element="led"><bounds x="28" y="28" width="1" height="1" /></bezel>
+ <bezel name="14.15" element="led"><bounds x="28" y="30" width="1" height="1" /></bezel>
+ <bezel name="14.16" element="led"><bounds x="28" y="32" width="1" height="1" /></bezel>
+ <bezel name="14.17" element="led"><bounds x="28" y="34" width="1" height="1" /></bezel>
+ <bezel name="14.18" element="led"><bounds x="28" y="36" width="1" height="1" /></bezel>
+ <bezel name="14.19" element="led"><bounds x="28" y="38" width="1" height="1" /></bezel>
+ <bezel name="14.20" element="led"><bounds x="28" y="40" width="1" height="1" /></bezel>
+ <bezel name="14.21" element="led"><bounds x="28" y="42" width="1" height="1" /></bezel>
+ <bezel name="14.22" element="led"><bounds x="28" y="44" width="1" height="1" /></bezel>
+ <bezel name="14.23" element="led"><bounds x="28" y="46" width="1" height="1" /></bezel>
+ <bezel name="14.24" element="led"><bounds x="28" y="48" width="1" height="1" /></bezel>
+ <bezel name="14.25" element="led"><bounds x="28" y="50" width="1" height="1" /></bezel>
+ <bezel name="14.26" element="led"><bounds x="28" y="52" width="1" height="1" /></bezel>
+ <bezel name="14.27" element="led"><bounds x="28" y="54" width="1" height="1" /></bezel>
+ <bezel name="14.28" element="led"><bounds x="28" y="56" width="1" height="1" /></bezel>
+ <bezel name="14.29" element="led"><bounds x="28" y="58" width="1" height="1" /></bezel>
+ <bezel name="14.30" element="led"><bounds x="28" y="60" width="1" height="1" /></bezel>
+ <bezel name="14.31" element="led"><bounds x="28" y="62" width="1" height="1" /></bezel>
+
+ <bezel name="15.0" element="led"><bounds x="30" y="0" width="1" height="1" /></bezel>
+ <bezel name="15.1" element="led"><bounds x="30" y="2" width="1" height="1" /></bezel>
+ <bezel name="15.2" element="led"><bounds x="30" y="4" width="1" height="1" /></bezel>
+ <bezel name="15.3" element="led"><bounds x="30" y="6" width="1" height="1" /></bezel>
+ <bezel name="15.4" element="led"><bounds x="30" y="8" width="1" height="1" /></bezel>
+ <bezel name="15.5" element="led"><bounds x="30" y="10" width="1" height="1" /></bezel>
+ <bezel name="15.6" element="led"><bounds x="30" y="12" width="1" height="1" /></bezel>
+ <bezel name="15.7" element="led"><bounds x="30" y="14" width="1" height="1" /></bezel>
+ <bezel name="15.8" element="led"><bounds x="30" y="16" width="1" height="1" /></bezel>
+ <bezel name="15.9" element="led"><bounds x="30" y="18" width="1" height="1" /></bezel>
+ <bezel name="15.10" element="led"><bounds x="30" y="20" width="1" height="1" /></bezel>
+ <bezel name="15.11" element="led"><bounds x="30" y="22" width="1" height="1" /></bezel>
+ <bezel name="15.12" element="led"><bounds x="30" y="24" width="1" height="1" /></bezel>
+ <bezel name="15.13" element="led"><bounds x="30" y="26" width="1" height="1" /></bezel>
+ <bezel name="15.14" element="led"><bounds x="30" y="28" width="1" height="1" /></bezel>
+ <bezel name="15.15" element="led"><bounds x="30" y="30" width="1" height="1" /></bezel>
+ <bezel name="15.16" element="led"><bounds x="30" y="32" width="1" height="1" /></bezel>
+ <bezel name="15.17" element="led"><bounds x="30" y="34" width="1" height="1" /></bezel>
+ <bezel name="15.18" element="led"><bounds x="30" y="36" width="1" height="1" /></bezel>
+ <bezel name="15.19" element="led"><bounds x="30" y="38" width="1" height="1" /></bezel>
+ <bezel name="15.20" element="led"><bounds x="30" y="40" width="1" height="1" /></bezel>
+ <bezel name="15.21" element="led"><bounds x="30" y="42" width="1" height="1" /></bezel>
+ <bezel name="15.22" element="led"><bounds x="30" y="44" width="1" height="1" /></bezel>
+ <bezel name="15.23" element="led"><bounds x="30" y="46" width="1" height="1" /></bezel>
+ <bezel name="15.24" element="led"><bounds x="30" y="48" width="1" height="1" /></bezel>
+ <bezel name="15.25" element="led"><bounds x="30" y="50" width="1" height="1" /></bezel>
+ <bezel name="15.26" element="led"><bounds x="30" y="52" width="1" height="1" /></bezel>
+ <bezel name="15.27" element="led"><bounds x="30" y="54" width="1" height="1" /></bezel>
+ <bezel name="15.28" element="led"><bounds x="30" y="56" width="1" height="1" /></bezel>
+ <bezel name="15.29" element="led"><bounds x="30" y="58" width="1" height="1" /></bezel>
+ <bezel name="15.30" element="led"><bounds x="30" y="60" width="1" height="1" /></bezel>
+ <bezel name="15.31" element="led"><bounds x="30" y="62" width="1" height="1" /></bezel>
+
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/horseran.lay b/src/mame/layout/horseran.lay
new file mode 100644
index 00000000000..5f8e136a5fd
--- /dev/null
+++ b/src/mame/layout/horseran.lay
@@ -0,0 +1,154 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- lcd colours are inverted due to 7seg element limitation -->
+
+<!-- define elements -->
+
+ <element name="text_places" defstate="0">
+ <text state="0" string="PLACES"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text state="1" string="PLACES"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+ <element name="text_shows" defstate="0">
+ <text state="0" string="SHOWS"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text state="1" string="SHOWS"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+ <element name="text_earnings" defstate="0">
+ <text state="0" string="EARNINGS"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text state="1" string="EARNINGS"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+ <element name="text_oflast5" defstate="0">
+ <text state="0" string="OF LAST 5 RACES"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text state="1" string="OF LAST 5 RACES"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+ <element name="text_rating" defstate="0">
+ <text state="0" string="RATING"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text state="1" string="RATING"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+ <element name="text_finpos" defstate="0">
+ <text state="0" string="FINISH POSITION"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text state="1" string="FINISH POSITION"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+ <element name="text_finish" defstate="0">
+ <text state="0" string="FINISH"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text state="1" string="FINISH"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+ <element name="text_3call" defstate="0">
+ <text state="0" string="3RD CALL"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text state="1" string="3RD CALL"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+
+ <element name="text_curyear" defstate="0">
+ <text state="0" string="CURRENT YEAR"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text state="1" string="CURRENT YEAR"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+ <element name="text_pastyear" defstate="0">
+ <text state="0" string="PAST YEAR"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text state="1" string="PAST YEAR"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+ <element name="text_rsl" defstate="0">
+ <text state="0" string="RACES SINCE LAYOFF"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text state="1" string="RACES SINCE LAYOFF"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+ <element name="text_distance" defstate="0">
+ <text state="0" string="DISTANCE"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text state="1" string="DISTANCE"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+ <element name="text_postpos" defstate="0">
+ <text state="0" string="POST POSITION"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text state="1" string="POST POSITION"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+ <element name="text_3rb" defstate="0">
+ <text state="0" string="3RD RACE BACK"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text state="1" string="3RD RACE BACK"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+ <element name="text_2rb" defstate="0">
+ <text state="0" string="2ND RACE BACK"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text state="1" string="2ND RACE BACK"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+ <element name="text_lastrace" defstate="0">
+ <text state="0" string="LAST RACE"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text state="1" string="LAST RACE"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+ <element name="text_purse" defstate="0">
+ <text state="0" string="PURSE"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text state="1" string="PURSE"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+
+ <element name="text_lback" defstate="0">
+ <text state="0" string="LENGTHS BACK"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text state="1" string="LENGTHS BACK"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+ <element name="text_1call" defstate="0">
+ <text state="0" string="1ST CALL"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text state="1" string="1ST CALL"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+ <element name="text_2call" defstate="0">
+ <text state="0" string="2ND CALL"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text state="1" string="2ND CALL"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+ <element name="text_2bsr" defstate="0">
+ <text state="0" string="2 BEST SPEED RATINGS"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text state="1" string="2 BEST SPEED RATINGS"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+ <element name="text_daysaway" defstate="0">
+ <text state="0" string="DAYS AWAY"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text state="1" string="DAYS AWAY"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+ <element name="text_wins" defstate="0">
+ <text state="0" string="WINS"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text state="1" string="WINS"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+ <element name="text_races" defstate="0">
+ <text state="0" string="RACES"><color red="0.1" green="0.1" blue="0.1" /></text>
+ <text state="1" string="RACES"><color red="0.9" green="0.9" blue="0.9" /></text>
+ </element>
+
+ <element name="digit" defstate="0">
+ <led7seg><color red="0.9" green="0.9" blue="0.9" /></led7seg>
+ </element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bounds left="0.4" right="21" top="-0.2" bottom="12.2" />
+
+ <bezel name="lamp124" element="text_purse"><bounds x="4" y="0" width="5" height="1" /></bezel>
+ <bezel name="lamp101" element="text_curyear"><bounds x="0" y="1" width="10" height="1" /></bezel>
+ <bezel name="lamp123" element="text_lastrace"><bounds x="0" y="2" width="10" height="1" /></bezel>
+ <bezel name="lamp102" element="text_pastyear"><bounds x="0" y="3" width="10" height="1" /></bezel>
+ <bezel name="lamp122" element="text_2rb"><bounds x="0" y="4" width="10" height="1" /></bezel>
+ <bezel name="lamp103" element="text_rsl"><bounds x="0" y="5" width="10" height="1" /></bezel>
+ <bezel name="lamp121" element="text_3rb"><bounds x="0" y="6" width="10" height="1" /></bezel>
+ <bezel name="lamp104" element="text_distance"><bounds x="0" y="7" width="6" height="1" /></bezel>
+
+ <bezel name="lamp224" element="text_postpos"><bounds x="8" y="0" width="8" height="1" /></bezel>
+ <bezel name="lamp201" element="text_lback"><bounds x="6" y="1" width="10" height="1" /></bezel>
+ <bezel name="lamp223" element="text_races"><bounds x="6" y="2" width="10" height="1" /></bezel>
+ <bezel name="lamp202" element="text_1call"><bounds x="6" y="3" width="10" height="1" /></bezel>
+ <bezel name="lamp222" element="text_wins"><bounds x="6" y="4" width="10" height="1" /></bezel>
+ <bezel name="lamp203" element="text_2call"><bounds x="6" y="5" width="10" height="1" /></bezel>
+ <bezel name="lamp221" element="text_daysaway"><bounds x="6" y="6" width="10" height="1" /></bezel>
+ <bezel name="lamp204" element="text_2bsr"><bounds x="4.5" y="7" width="10" height="1" /></bezel>
+
+ <bezel name="lamp1" element="text_places"><bounds x="12" y="1" width="10" height="1" /></bezel>
+ <bezel name="lamp23" element="text_3call"><bounds x="12" y="2" width="10" height="1" /></bezel>
+ <bezel name="lamp2" element="text_shows"><bounds x="12" y="3" width="10" height="1" /></bezel>
+ <bezel name="lamp22" element="text_finish"><bounds x="12" y="4" width="10" height="1" /></bezel>
+ <bezel name="lamp3" element="text_earnings"><bounds x="12" y="5" width="10" height="1" /></bezel>
+ <bezel name="lamp21" element="text_finpos"><bounds x="12" y="6" width="10" height="1" /></bezel>
+ <bezel name="lamp4" element="text_oflast5"><bounds x="12.25" y="7" width="10" height="1" /></bezel>
+
+ <bezel name="digit3" element="digit"><bounds x="4" y="8.2" width="2" height="3" /></bezel>
+ <bezel name="digit5" element="digit"><bounds x="6" y="8.2" width="2" height="3" /></bezel>
+ <bezel name="digit1" element="digit"><bounds x="8" y="8.2" width="2" height="3" /></bezel>
+ <bezel name="digit2" element="digit"><bounds x="10" y="8.2" width="2" height="3" /></bezel>
+ <bezel name="digit4" element="digit"><bounds x="12" y="8.2" width="2" height="3" /></bezel>
+ <bezel name="digit0" element="digit"><bounds x="14" y="8.2" width="2" height="3" /></bezel>
+
+ <bezel name="lamp120" element="text_postpos"><bounds x="2.5" y="11.3" width="6" height="0.66" /></bezel>
+ <bezel name="lamp20" element="text_rating"><bounds x="10.5" y="11.3" width="6" height="0.66" /></bezel>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/lchicken.lay b/src/mame/layout/lchicken.lay
new file mode 100644
index 00000000000..a58fe6a05de
--- /dev/null
+++ b/src/mame/layout/lchicken.lay
@@ -0,0 +1,133 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="static_orange"><rect><color red="0.9" green="0.3" blue="0.2" /></rect></element>
+ <element name="static_white2"><rect><color red="0.7" green="0.7" blue="0.7" /></rect></element>
+
+ <element name="hl" defstate="0">
+ <text string=" ">
+ <bounds x="0.0" y="0.0" width="1.0" height="1.0" />
+ <color red="0.0" green="0.0" blue="0.0" />
+ </text>
+ <disk state="1">
+ <bounds x="0.07" y="0.07" width="0.86" height="0.86" />
+ <color red="0.0" green="0.0" blue="0.0" />
+ </disk>
+ </element>
+
+ <element name="led" defstate="0">
+ <disk state="0"><color red="0.2" green="0.04" blue="0.05" /></disk>
+ <disk state="1"><color red="1.0" green="0.2" blue="0.23" /></disk>
+ </element>
+
+ <element name="led1" defstate="0">
+ <rect><bounds x="0" y="0" width="1" height="1"/><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text state="0" string="1"><bounds x="0.15" y="0.12" width="0.7" height="0.7"/><color red="0.15" green="0.15" blue="0.15" /></text>
+ <text state="1" string="1"><bounds x="0.15" y="0.12" width="0.7" height="0.7"/><color red="1.0" green="0.2" blue="0.23" /></text>
+ </element>
+ <element name="led2" defstate="0">
+ <rect><bounds x="0" y="0" width="1" height="1"/><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text state="0" string="2"><bounds x="0.15" y="0.12" width="0.7" height="0.7"/><color red="0.15" green="0.15" blue="0.15" /></text>
+ <text state="1" string="2"><bounds x="0.15" y="0.12" width="0.7" height="0.7"/><color red="1.0" green="0.2" blue="0.23" /></text>
+ </element>
+ <element name="led3" defstate="0">
+ <rect><bounds x="0" y="0" width="1" height="1"/><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text state="0" string="3"><bounds x="0.15" y="0.12" width="0.7" height="0.7"/><color red="0.15" green="0.15" blue="0.15" /></text>
+ <text state="1" string="3"><bounds x="0.15" y="0.12" width="0.7" height="0.7"/><color red="1.0" green="0.2" blue="0.23" /></text>
+ </element>
+ <element name="led4" defstate="0">
+ <rect><bounds x="0" y="0" width="1" height="1"/><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text state="0" string="4"><bounds x="0.15" y="0.12" width="0.7" height="0.7"/><color red="0.15" green="0.15" blue="0.15" /></text>
+ <text state="1" string="4"><bounds x="0.15" y="0.12" width="0.7" height="0.7"/><color red="1.0" green="0.2" blue="0.23" /></text>
+ </element>
+ <element name="led5" defstate="0">
+ <rect><bounds x="0" y="0" width="1" height="1"/><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text state="0" string="5"><bounds x="0.15" y="0.12" width="0.7" height="0.7"/><color red="0.15" green="0.15" blue="0.15" /></text>
+ <text state="1" string="5"><bounds x="0.15" y="0.12" width="0.7" height="0.7"/><color red="1.0" green="0.2" blue="0.23" /></text>
+ </element>
+ <element name="led6" defstate="0">
+ <rect><bounds x="0" y="0" width="1" height="1"/><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text state="0" string="6"><bounds x="0.15" y="0.12" width="0.7" height="0.7"/><color red="0.15" green="0.15" blue="0.15" /></text>
+ <text state="1" string="6"><bounds x="0.15" y="0.12" width="0.7" height="0.7"/><color red="1.0" green="0.2" blue="0.23" /></text>
+ </element>
+ <element name="led7" defstate="0">
+ <rect><bounds x="0" y="0" width="1" height="1"/><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text state="0" string="7"><bounds x="0.15" y="0.12" width="0.7" height="0.7"/><color red="0.15" green="0.15" blue="0.15" /></text>
+ <text state="1" string="7"><bounds x="0.15" y="0.12" width="0.7" height="0.7"/><color red="1.0" green="0.2" blue="0.23" /></text>
+ </element>
+ <element name="led8" defstate="0">
+ <rect><bounds x="0" y="0" width="1" height="1"/><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text state="0" string="8"><bounds x="0.15" y="0.12" width="0.7" height="0.7"/><color red="0.15" green="0.15" blue="0.15" /></text>
+ <text state="1" string="8"><bounds x="0.15" y="0.12" width="0.7" height="0.7"/><color red="1.0" green="0.2" blue="0.23" /></text>
+ </element>
+ <element name="led9" defstate="0">
+ <rect><bounds x="0" y="0" width="1" height="1"/><color red="0.9" green="0.9" blue="0.9" /></rect>
+ <text state="0" string="9"><bounds x="0.15" y="0.12" width="0.7" height="0.7"/><color red="0.15" green="0.15" blue="0.15" /></text>
+ <text state="1" string="9"><bounds x="0.15" y="0.12" width="0.7" height="0.7"/><color red="1.0" green="0.2" blue="0.23" /></text>
+ </element>
+
+ <element name="text_chicken"><text string="CHICKEN" align="2"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_player"><text string="PLAYER" align="2"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+
+ <element name="mask" defstate="0">
+ <text string=" "><color red="0.0" green="0.0" blue="0.0" /></text>
+ <rect state="0"><color red="0.0" green="0.0" blue="0.0" /></rect>
+ </element>
+
+ <element name="text_m1"><text string="(motor pos: 0." align="1"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="text_m2"><text string=")" align="1"><color red="0.7" green="0.7" blue="0.7" /></text></element>
+ <element name="counter" defstate="0">
+ <simplecounter maxstate="99" digits="2" align="1">
+ <color red="0.7" green="0.7" blue="0.7" />
+ </simplecounter>
+ </element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bounds left="0.01" right="16.99" top="7.4" bottom="31" />
+
+ <bezel element="static_white2"><bounds x="0" y="9.75" width="17" height="17.5" /></bezel>
+ <bezel element="static_orange"><bounds x="0" y="10" width="17" height="17" /></bezel>
+ <bezel name="0.2" element="led1"><bounds x="0" y="10" width="5" height="5" /></bezel>
+ <bezel name="0.1" element="led2"><bounds x="6" y="10" width="5" height="5" /></bezel>
+ <bezel name="0.0" element="led3"><bounds x="12" y="10" width="5" height="5" /></bezel>
+ <bezel name="1.2" element="led4"><bounds x="0" y="16" width="5" height="5" /></bezel>
+ <bezel name="1.1" element="led5"><bounds x="6" y="16" width="5" height="5" /></bezel>
+ <bezel name="1.0" element="led6"><bounds x="12" y="16" width="5" height="5" /></bezel>
+ <bezel name="2.2" element="led7"><bounds x="0" y="22" width="5" height="5" /></bezel>
+ <bezel name="2.1" element="led8"><bounds x="6" y="22" width="5" height="5" /></bezel>
+ <bezel name="2.0" element="led9"><bounds x="12" y="22" width="5" height="5" /></bezel>
+
+ <bezel element="text_chicken"><bounds x="0" y="28" width="4.5" height="1" /></bezel>
+ <bezel element="text_player"><bounds x="0" y="29.5" width="4.5" height="1" /></bezel>
+ <bezel name="0.3" element="led"><bounds x="5" y="28" width="1" height="1" /></bezel>
+ <bezel name="1.3" element="led"><bounds x="5" y="29.5" width="1" height="1" /></bezel>
+
+ <!-- in reality the keypad is under the led panel, but here just put it on top of the led panel -->
+
+ <bezel element="hl" inputtag="IN.2" inputmask="0x01"><bounds x="0" y="10" width="5" height="5" /><color alpha="0.15" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x01"><bounds x="6" y="10" width="5" height="5" /><color alpha="0.15" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x01"><bounds x="12" y="10" width="5" height="5" /><color alpha="0.15" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x02"><bounds x="0" y="16" width="5" height="5" /><color alpha="0.15" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x02"><bounds x="6" y="16" width="5" height="5" /><color alpha="0.15" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x02"><bounds x="12" y="16" width="5" height="5" /><color alpha="0.15" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x04"><bounds x="0" y="22" width="5" height="5" /><color alpha="0.15" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x04"><bounds x="6" y="22" width="5" height="5" /><color alpha="0.15" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x04"><bounds x="12" y="22" width="5" height="5" /><color alpha="0.15" /></bezel>
+
+ <!-- motor status info -->
+
+ <bezel element="text_m1"><bounds x="5.3" y="8" width="6" height="1" /></bezel>
+ <bezel name="motor_pos" element="counter"><bounds x="10.46" y="8" width="3" height="1" /></bezel>
+ <bezel element="text_m2"><bounds x="11.4" y="8" width="2" height="1" /></bezel>
+ <bezel name="motor_on" element="mask">
+ <bounds x="5" y="7.5" width="10" height="2" />
+ <color alpha="0.7" />
+ </bezel>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/mdallas.lay b/src/mame/layout/mdallas.lay
new file mode 100644
index 00000000000..e4e2a98443e
--- /dev/null
+++ b/src/mame/layout/mdallas.lay
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+ <element name="digit" defstate="0">
+ <led7seg><color red="1.0" green="0.15" blue="0.08" /></led7seg>
+ </element>
+
+ <view name="Internal Layout">
+ <bounds left="0" right="80" top="0" bottom="15" />
+
+ <bezel name="digit7" element="digit">
+ <bounds x="0" y="0" width="10" height="15" />
+ </bezel>
+ <bezel name="digit6" element="digit">
+ <bounds x="10" y="0" width="10" height="15" />
+ </bezel>
+ <bezel name="digit5" element="digit">
+ <bounds x="20" y="0" width="10" height="15" />
+ </bezel>
+ <bezel name="digit4" element="digit">
+ <bounds x="30" y="0" width="10" height="15" />
+ </bezel>
+ <bezel name="digit3" element="digit">
+ <bounds x="40" y="0" width="10" height="15" />
+ </bezel>
+ <bezel name="digit2" element="digit">
+ <bounds x="50" y="0" width="10" height="15" />
+ </bezel>
+ <bezel name="digit1" element="digit">
+ <bounds x="60" y="0" width="10" height="15" />
+ </bezel>
+ <bezel name="digit0" element="digit">
+ <bounds x="70" y="0" width="10" height="15" />
+ </bezel>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/novag_diablo68k.lay b/src/mame/layout/novag_diablo68k.lay
new file mode 100644
index 00000000000..f56d9de4757
--- /dev/null
+++ b/src/mame/layout/novag_diablo68k.lay
@@ -0,0 +1,435 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+
+<!-- define elements -->
+
+ <element name="static_lcd"><rect><color red="0.5412" green="0.57255" blue="0.5804" /></rect></element>
+
+ <element name="led" defstate="0">
+ <disk state="1"><color red="1.0" green="0.1" blue="0.15" /></disk>
+ <disk state="0"><color red="0.1" green="0.01" blue="0.015" /></disk>
+ </element>
+
+ <element name="hl" defstate="0">
+ <text string=" ">
+ <bounds x="0.0" y="0.0" width="1.0" height="1.0" />
+ <color red="0.0" green="0.0" blue="0.0" />
+ </text>
+ <disk state="1">
+ <bounds x="0.12" y="0.12" width="0.76" height="0.76" />
+ <color red="1.0" green="1.0" blue="1.0" />
+ </disk>
+ </element>
+ <element name="but" defstate="0">
+ <disk state="0"><color red="0.17" green="0.15" blue="0.15" /></disk>
+ <disk state="1"><color red="0.34" green="0.3" blue="0.3" /></disk>
+ </element>
+
+ <element name="black"><rect><color red="0.17" green="0.15" blue="0.15" /></rect></element>
+ <element name="white"><rect><color red="0.81" green="0.8" blue="0.79" /></rect></element>
+
+ <element name="text_1"><text string="1"><color red="0.9" green="0.9" blue="0.9" /></text></element>
+ <element name="text_2"><text string="2"><color red="0.9" green="0.9" blue="0.9" /></text></element>
+ <element name="text_3"><text string="3"><color red="0.9" green="0.9" blue="0.9" /></text></element>
+ <element name="text_4"><text string="4"><color red="0.9" green="0.9" blue="0.9" /></text></element>
+ <element name="text_5"><text string="5"><color red="0.9" green="0.9" blue="0.9" /></text></element>
+ <element name="text_6"><text string="6"><color red="0.9" green="0.9" blue="0.9" /></text></element>
+ <element name="text_7"><text string="7"><color red="0.9" green="0.9" blue="0.9" /></text></element>
+ <element name="text_8"><text string="8"><color red="0.9" green="0.9" blue="0.9" /></text></element>
+
+ <element name="text_a"><text string="A"><color red="0.9" green="0.9" blue="0.9" /></text></element>
+ <element name="text_b"><text string="B"><color red="0.9" green="0.9" blue="0.9" /></text></element>
+ <element name="text_c"><text string="C"><color red="0.9" green="0.9" blue="0.9" /></text></element>
+ <element name="text_d"><text string="D"><color red="0.9" green="0.9" blue="0.9" /></text></element>
+ <element name="text_e"><text string="E"><color red="0.9" green="0.9" blue="0.9" /></text></element>
+ <element name="text_f"><text string="F"><color red="0.9" green="0.9" blue="0.9" /></text></element>
+ <element name="text_g"><text string="G"><color red="0.9" green="0.9" blue="0.9" /></text></element>
+ <element name="text_h"><text string="H"><color red="0.9" green="0.9" blue="0.9" /></text></element>
+
+ <element name="text_l1a"><text string="Print Board"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_l1b"><text string="Interface"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_l2a"><text string="Print List"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_l2b"><text string="Acc. Time"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_l3a"><text string="Print Moves"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_l3b"><text string="Print"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_l3bx"><text string="Evaluations"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_l4a"><text string="Print Book"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_l4b"><text string="Store Game"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_l5a"><text string="No/End"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_l5b"><text string="End of Game"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_l6a"><text string="Yes/Start"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_l6b"><text string="Start of Game"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_l7a"><text string="&lt;-"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_l7b"><text string=" "><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_l8a"><text string="-&gt;"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_l8b"><text string=" "><color red="0.51" green="0.5" blue="0.49" /></text></element>
+
+ <element name="text_m1ax"><text string="Player/"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_m1a"><text string="Player"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_m1b"><text string="Gambit Book"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_m2a"><text string="Solve Mate"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_m2b"><text string="Infinite"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_m3a"><text string="Sound"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_m3b"><text string="Info"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_m4ax"><text string="Best Move/"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_m4a"><text string="Random"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_m4b"><text string="Review"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_m5a"><text string="Pro-Op"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_m5b"><text string="Restore Game"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_m6a"><text string="Priority"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_m6b"><text string="Tournament"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_m6bx"><text string="Book"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_m7a"><text string="Flip Display"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_m7b"><text string="Time Control"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_m8a"><text string="Take Back"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_m8b"><text string="Analyze Games"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+
+ <element name="text_r1a"><text string="New Game"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_r1b"><text string=" "><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_r2a"><text string="Verify/Set Up"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_r2b"><text string="Pro-Op Book/"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_r2bx"><text string="Both Books"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_r3a"><text string="Change Color"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_r3b"><text string=" "><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_r4a"><text string="Clear Board"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_r4b"><text string="Delete Pro-Op"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_r5a"><text string="Trace Forward"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_r5b"><text string="AutoPlay"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_r6a"><text string="Hint"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_r6b"><text string="Next Best"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_r7a"><text string="Set Level"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_r7b"><text string=" "><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_r8a"><text string="Go"><color red="0.51" green="0.5" blue="0.49" /></text></element>
+ <element name="text_r8b"><text string=" "><color red="0.51" green="0.5" blue="0.49" /></text></element>
+
+ <element name="text_king"><text string="&#x265a;"><color red="0.61" green="0.6" blue="0.59" /></text></element>
+ <element name="text_queen"><text string="&#x265b;"><color red="0.61" green="0.6" blue="0.59" /></text></element>
+ <element name="text_rook"><text string="&#x265c;"><color red="0.61" green="0.6" blue="0.59" /></text></element>
+ <element name="text_bishop"><text string="&#x265d;"><color red="0.61" green="0.6" blue="0.59" /></text></element>
+ <element name="text_knight"><text string="&#x265e;"><color red="0.61" green="0.6" blue="0.59" /></text></element>
+ <element name="text_pawn"><text string="&#x265f;"><color red="0.61" green="0.6" blue="0.59" /></text></element>
+
+
+<!-- build screen -->
+
+ <view name="Internal Layout">
+ <bounds left="-3" right="114" top="-2" bottom="89" />
+
+ <!-- chessboard coords -->
+
+ <bezel element="text_8"><bounds x="-0.8" y="7" width="2" height="2" /></bezel>
+ <bezel element="text_7"><bounds x="-0.8" y="17" width="2" height="2" /></bezel>
+ <bezel element="text_6"><bounds x="-0.8" y="27" width="2" height="2" /></bezel>
+ <bezel element="text_5"><bounds x="-0.8" y="37" width="2" height="2" /></bezel>
+ <bezel element="text_4"><bounds x="-0.8" y="47" width="2" height="2" /></bezel>
+ <bezel element="text_3"><bounds x="-0.8" y="57" width="2" height="2" /></bezel>
+ <bezel element="text_2"><bounds x="-0.8" y="67" width="2" height="2" /></bezel>
+ <bezel element="text_1"><bounds x="-0.8" y="77" width="2" height="2" /></bezel>
+
+ <bezel element="text_a"><bounds x="7" y="85" width="2" height="2" /></bezel>
+ <bezel element="text_b"><bounds x="17" y="85" width="2" height="2" /></bezel>
+ <bezel element="text_c"><bounds x="27" y="85" width="2" height="2" /></bezel>
+ <bezel element="text_d"><bounds x="37" y="85" width="2" height="2" /></bezel>
+ <bezel element="text_e"><bounds x="47" y="85" width="2" height="2" /></bezel>
+ <bezel element="text_f"><bounds x="57" y="85" width="2" height="2" /></bezel>
+ <bezel element="text_g"><bounds x="67" y="85" width="2" height="2" /></bezel>
+ <bezel element="text_h"><bounds x="77" y="85" width="2" height="2" /></bezel>
+
+ <!-- chessboard bezel -->
+
+ <bezel element="black"><bounds x="2" y="2" width="82" height="82" /></bezel>
+ <bezel element="white"><bounds x="3" y="3" width="80" height="80" /></bezel>
+
+ <bezel element="black"><bounds x="13" y="2.5" width="10" height="10.5" /></bezel>
+ <bezel element="black"><bounds x="33" y="2.5" width="10" height="10.5" /></bezel>
+ <bezel element="black"><bounds x="53" y="2.5" width="10" height="10.5" /></bezel>
+ <bezel element="black"><bounds x="73" y="2.5" width="10.5" height="10.5" /></bezel>
+
+ <bezel element="black"><bounds x="2.5" y="13" width="10.5" height="10" /></bezel>
+ <bezel element="black"><bounds x="23" y="13" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="43" y="13" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="63" y="13" width="10" height="10" /></bezel>
+
+ <bezel element="black"><bounds x="13" y="23" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="33" y="23" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="53" y="23" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="73" y="23" width="10.5" height="10" /></bezel>
+
+ <bezel element="black"><bounds x="2.5" y="33" width="10.5" height="10" /></bezel>
+ <bezel element="black"><bounds x="23" y="33" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="43" y="33" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="63" y="33" width="10" height="10" /></bezel>
+
+ <bezel element="black"><bounds x="13" y="43" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="33" y="43" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="53" y="43" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="73" y="43" width="10.5" height="10" /></bezel>
+
+ <bezel element="black"><bounds x="2.5" y="53" width="10.5" height="10" /></bezel>
+ <bezel element="black"><bounds x="23" y="53" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="43" y="53" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="63" y="53" width="10" height="10" /></bezel>
+
+ <bezel element="black"><bounds x="13" y="63" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="33" y="63" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="53" y="63" width="10" height="10" /></bezel>
+ <bezel element="black"><bounds x="73" y="63" width="10.5" height="10" /></bezel>
+
+ <bezel element="black"><bounds x="2.5" y="73" width="10.5" height="10.5" /></bezel>
+ <bezel element="black"><bounds x="23" y="73" width="10" height="10.5" /></bezel>
+ <bezel element="black"><bounds x="43" y="73" width="10" height="10.5" /></bezel>
+ <bezel element="black"><bounds x="63" y="73" width="10" height="10.5" /></bezel>
+
+ <!-- chessboard leds -->
+
+ <bezel name="7.7" element="led"><bounds x=" 3.2" y="11.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="7.6" element="led"><bounds x="13.2" y="11.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="7.5" element="led"><bounds x="23.2" y="11.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="7.4" element="led"><bounds x="33.2" y="11.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="7.3" element="led"><bounds x="43.2" y="11.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="7.2" element="led"><bounds x="53.2" y="11.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="7.1" element="led"><bounds x="63.2" y="11.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="7.0" element="led"><bounds x="73.2" y="11.3" width="1.5" height="1.5" /></bezel>
+
+ <bezel name="6.7" element="led"><bounds x=" 3.2" y="21.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="6.6" element="led"><bounds x="13.2" y="21.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="6.5" element="led"><bounds x="23.2" y="21.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="6.4" element="led"><bounds x="33.2" y="21.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="6.3" element="led"><bounds x="43.2" y="21.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="6.2" element="led"><bounds x="53.2" y="21.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="6.1" element="led"><bounds x="63.2" y="21.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="6.0" element="led"><bounds x="73.2" y="21.3" width="1.5" height="1.5" /></bezel>
+
+ <bezel name="5.7" element="led"><bounds x=" 3.2" y="31.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.6" element="led"><bounds x="13.2" y="31.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.5" element="led"><bounds x="23.2" y="31.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.4" element="led"><bounds x="33.2" y="31.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.3" element="led"><bounds x="43.2" y="31.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.2" element="led"><bounds x="53.2" y="31.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.1" element="led"><bounds x="63.2" y="31.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="5.0" element="led"><bounds x="73.2" y="31.3" width="1.5" height="1.5" /></bezel>
+
+ <bezel name="4.7" element="led"><bounds x=" 3.2" y="41.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="4.6" element="led"><bounds x="13.2" y="41.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="4.5" element="led"><bounds x="23.2" y="41.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="4.4" element="led"><bounds x="33.2" y="41.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="4.3" element="led"><bounds x="43.2" y="41.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="4.2" element="led"><bounds x="53.2" y="41.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="4.1" element="led"><bounds x="63.2" y="41.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="4.0" element="led"><bounds x="73.2" y="41.3" width="1.5" height="1.5" /></bezel>
+
+ <bezel name="3.7" element="led"><bounds x=" 3.2" y="51.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="3.6" element="led"><bounds x="13.2" y="51.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="3.5" element="led"><bounds x="23.2" y="51.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="3.4" element="led"><bounds x="33.2" y="51.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="3.3" element="led"><bounds x="43.2" y="51.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="3.2" element="led"><bounds x="53.2" y="51.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="3.1" element="led"><bounds x="63.2" y="51.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="3.0" element="led"><bounds x="73.2" y="51.3" width="1.5" height="1.5" /></bezel>
+
+ <bezel name="2.7" element="led"><bounds x=" 3.2" y="61.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="2.6" element="led"><bounds x="13.2" y="61.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="2.5" element="led"><bounds x="23.2" y="61.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="2.4" element="led"><bounds x="33.2" y="61.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="2.3" element="led"><bounds x="43.2" y="61.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="2.2" element="led"><bounds x="53.2" y="61.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="2.1" element="led"><bounds x="63.2" y="61.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="2.0" element="led"><bounds x="73.2" y="61.3" width="1.5" height="1.5" /></bezel>
+
+ <bezel name="1.7" element="led"><bounds x=" 3.2" y="71.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="1.6" element="led"><bounds x="13.2" y="71.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="1.5" element="led"><bounds x="23.2" y="71.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="1.4" element="led"><bounds x="33.2" y="71.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="1.3" element="led"><bounds x="43.2" y="71.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="1.2" element="led"><bounds x="53.2" y="71.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="1.1" element="led"><bounds x="63.2" y="71.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="1.0" element="led"><bounds x="73.2" y="71.3" width="1.5" height="1.5" /></bezel>
+
+ <bezel name="0.7" element="led"><bounds x=" 3.2" y="81.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="0.6" element="led"><bounds x="13.2" y="81.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="0.5" element="led"><bounds x="23.2" y="81.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="0.4" element="led"><bounds x="33.2" y="81.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="0.3" element="led"><bounds x="43.2" y="81.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="0.2" element="led"><bounds x="53.2" y="81.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="0.1" element="led"><bounds x="63.2" y="81.3" width="1.5" height="1.5" /></bezel>
+ <bezel name="0.0" element="led"><bounds x="73.2" y="81.3" width="1.5" height="1.5" /></bezel>
+
+ <!-- chessboard sensors -->
+
+ <bezel element="hl" inputtag="IN.7" inputmask="0x80"><bounds x="3" y="3" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.7" inputmask="0x40"><bounds x="13" y="3" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.7" inputmask="0x20"><bounds x="23" y="3" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.7" inputmask="0x10"><bounds x="33" y="3" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.7" inputmask="0x08"><bounds x="43" y="3" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.7" inputmask="0x04"><bounds x="53" y="3" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.7" inputmask="0x02"><bounds x="63" y="3" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.7" inputmask="0x01"><bounds x="73" y="3" width="10" height="10" /><color alpha="0.2" /></bezel>
+
+ <bezel element="hl" inputtag="IN.6" inputmask="0x80"><bounds x="3" y="13" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.6" inputmask="0x40"><bounds x="13" y="13" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.6" inputmask="0x20"><bounds x="23" y="13" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.6" inputmask="0x10"><bounds x="33" y="13" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.6" inputmask="0x08"><bounds x="43" y="13" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.6" inputmask="0x04"><bounds x="53" y="13" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.6" inputmask="0x02"><bounds x="63" y="13" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.6" inputmask="0x01"><bounds x="73" y="13" width="10" height="10" /><color alpha="0.4" /></bezel>
+
+ <bezel element="hl" inputtag="IN.5" inputmask="0x80"><bounds x="3" y="23" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.5" inputmask="0x40"><bounds x="13" y="23" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.5" inputmask="0x20"><bounds x="23" y="23" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.5" inputmask="0x10"><bounds x="33" y="23" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.5" inputmask="0x08"><bounds x="43" y="23" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.5" inputmask="0x04"><bounds x="53" y="23" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.5" inputmask="0x02"><bounds x="63" y="23" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.5" inputmask="0x01"><bounds x="73" y="23" width="10" height="10" /><color alpha="0.2" /></bezel>
+
+ <bezel element="hl" inputtag="IN.4" inputmask="0x80"><bounds x="3" y="33" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x40"><bounds x="13" y="33" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x20"><bounds x="23" y="33" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x10"><bounds x="33" y="33" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x08"><bounds x="43" y="33" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x04"><bounds x="53" y="33" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x02"><bounds x="63" y="33" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.4" inputmask="0x01"><bounds x="73" y="33" width="10" height="10" /><color alpha="0.4" /></bezel>
+
+ <bezel element="hl" inputtag="IN.3" inputmask="0x80"><bounds x="3" y="43" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x40"><bounds x="13" y="43" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x20"><bounds x="23" y="43" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x10"><bounds x="33" y="43" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x08"><bounds x="43" y="43" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x04"><bounds x="53" y="43" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x02"><bounds x="63" y="43" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.3" inputmask="0x01"><bounds x="73" y="43" width="10" height="10" /><color alpha="0.2" /></bezel>
+
+ <bezel element="hl" inputtag="IN.2" inputmask="0x80"><bounds x="3" y="53" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x40"><bounds x="13" y="53" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x20"><bounds x="23" y="53" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x10"><bounds x="33" y="53" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x08"><bounds x="43" y="53" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x04"><bounds x="53" y="53" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x02"><bounds x="63" y="53" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.2" inputmask="0x01"><bounds x="73" y="53" width="10" height="10" /><color alpha="0.4" /></bezel>
+
+ <bezel element="hl" inputtag="IN.1" inputmask="0x80"><bounds x="3" y="63" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x40"><bounds x="13" y="63" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x20"><bounds x="23" y="63" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x10"><bounds x="33" y="63" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x08"><bounds x="43" y="63" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x04"><bounds x="53" y="63" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x02"><bounds x="63" y="63" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.1" inputmask="0x01"><bounds x="73" y="63" width="10" height="10" /><color alpha="0.2" /></bezel>
+
+ <bezel element="hl" inputtag="IN.0" inputmask="0x80"><bounds x="3" y="73" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x40"><bounds x="13" y="73" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x20"><bounds x="23" y="73" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x10"><bounds x="33" y="73" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x08"><bounds x="43" y="73" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x04"><bounds x="53" y="73" width="10" height="10" /><color alpha="0.4" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x02"><bounds x="63" y="73" width="10" height="10" /><color alpha="0.2" /></bezel>
+ <bezel element="hl" inputtag="IN.0" inputmask="0x01"><bounds x="73" y="73" width="10" height="10" /><color alpha="0.4" /></bezel>
+
+ <!-- lcd panel -->
+
+ <screen index="0">
+ <bounds x="86.5" y="9.5" width="24.25" height="2.5" />
+ </screen>
+
+ <bezel element="static_lcd"><bounds x="86" y="8.5" width="25.25" height="1.1" /></bezel>
+ <bezel element="static_lcd"><bounds x="86" y="11.9" width="25.25" height="1.1" /></bezel>
+ <bezel element="static_lcd"><bounds x="86" y="8.5" width="0.6" height="3.5" /></bezel>
+ <bezel element="static_lcd"><bounds x="110.65" y="8.5" width="0.6" height="3.5" /></bezel>
+
+ <!-- right side buttons -->
+
+ <bezel element="but" inputtag="IN.7" inputmask="0x400"><bounds x="87.75" y="24.00" width="2.5" height="2.5" /></bezel>
+ <bezel element="but" inputtag="IN.6" inputmask="0x400"><bounds x="87.75" y="31.71" width="2.5" height="2.5" /></bezel>
+ <bezel element="but" inputtag="IN.5" inputmask="0x400"><bounds x="87.75" y="39.43" width="2.5" height="2.5" /></bezel>
+ <bezel element="but" inputtag="IN.4" inputmask="0x400"><bounds x="87.75" y="47.14" width="2.5" height="2.5" /></bezel>
+ <bezel element="but" inputtag="IN.3" inputmask="0x400"><bounds x="87.75" y="54.86" width="2.5" height="2.5" /></bezel>
+ <bezel element="but" inputtag="IN.2" inputmask="0x400"><bounds x="87.75" y="62.57" width="2.5" height="2.5" /></bezel>
+ <bezel element="but" inputtag="IN.1" inputmask="0x400"><bounds x="87.75" y="70.29" width="2.5" height="2.5" /></bezel>
+ <bezel element="but" inputtag="IN.0" inputmask="0x400"><bounds x="87.75" y="78.00" width="2.5" height="2.5" /></bezel>
+
+ <bezel element="but" inputtag="IN.7" inputmask="0x200"><bounds x="97.38" y="24.00" width="2.5" height="2.5" /></bezel>
+ <bezel element="but" inputtag="IN.6" inputmask="0x200"><bounds x="97.38" y="31.71" width="2.5" height="2.5" /></bezel>
+ <bezel element="but" inputtag="IN.5" inputmask="0x200"><bounds x="97.38" y="39.43" width="2.5" height="2.5" /></bezel>
+ <bezel element="but" inputtag="IN.4" inputmask="0x200"><bounds x="97.38" y="47.14" width="2.5" height="2.5" /></bezel>
+ <bezel element="but" inputtag="IN.3" inputmask="0x200"><bounds x="97.38" y="54.86" width="2.5" height="2.5" /></bezel>
+ <bezel element="but" inputtag="IN.2" inputmask="0x200"><bounds x="97.38" y="62.57" width="2.5" height="2.5" /></bezel>
+ <bezel element="but" inputtag="IN.1" inputmask="0x200"><bounds x="97.38" y="70.29" width="2.5" height="2.5" /></bezel>
+ <bezel element="but" inputtag="IN.0" inputmask="0x200"><bounds x="97.38" y="78.00" width="2.5" height="2.5" /></bezel>
+
+ <bezel element="but" inputtag="IN.7" inputmask="0x100"><bounds x="107.00" y="24.00" width="2.5" height="2.5" /></bezel>
+ <bezel element="but" inputtag="IN.6" inputmask="0x100"><bounds x="107.00" y="31.71" width="2.5" height="2.5" /></bezel>
+ <bezel element="but" inputtag="IN.5" inputmask="0x100"><bounds x="107.00" y="39.43" width="2.5" height="2.5" /></bezel>
+ <bezel element="but" inputtag="IN.4" inputmask="0x100"><bounds x="107.00" y="47.14" width="2.5" height="2.5" /></bezel>
+ <bezel element="but" inputtag="IN.3" inputmask="0x100"><bounds x="107.00" y="54.86" width="2.5" height="2.5" /></bezel>
+ <bezel element="but" inputtag="IN.2" inputmask="0x100"><bounds x="107.00" y="62.57" width="2.5" height="2.5" /></bezel>
+ <bezel element="but" inputtag="IN.1" inputmask="0x100"><bounds x="107.00" y="70.29" width="2.5" height="2.5" /></bezel>
+ <bezel element="but" inputtag="IN.0" inputmask="0x100"><bounds x="107.00" y="78.00" width="2.5" height="2.5" /></bezel>
+
+ <bezel element="text_king"><bounds x="100.38" y="23.50" width="3" height="3" /></bezel>
+ <bezel element="text_queen"><bounds x="100.38" y="31.21" width="3" height="3" /></bezel>
+ <bezel element="text_bishop"><bounds x="100.38" y="38.93" width="3" height="3" /></bezel>
+ <bezel element="text_knight"><bounds x="100.38" y="46.64" width="3" height="3" /></bezel>
+ <bezel element="text_rook"><bounds x="100.38" y="54.36" width="3" height="3" /></bezel>
+ <bezel element="text_pawn"><bounds x="100.38" y="62.07" width="3" height="3" /></bezel>
+
+ <bezel element="text_l1a"><bounds x="82" y="22.35" width="14" height="1.4" /></bezel>
+ <bezel element="text_l1b"><bounds x="82" y="26.70" width="14" height="1.4" /></bezel>
+ <bezel element="text_l2a"><bounds x="82" y="30.06" width="14" height="1.4" /></bezel>
+ <bezel element="text_l2b"><bounds x="82" y="34.41" width="14" height="1.4" /></bezel>
+ <bezel element="text_l3a"><bounds x="82" y="37.78" width="14" height="1.4" /></bezel>
+ <bezel element="text_l3b"><bounds x="82" y="42.13" width="14" height="1.4" /></bezel>
+ <bezel element="text_l3bx"><bounds x="82" y="43.53" width="14" height="1.4" /></bezel>
+ <bezel element="text_l4a"><bounds x="82" y="45.49" width="14" height="1.4" /></bezel>
+ <bezel element="text_l4b"><bounds x="82" y="49.84" width="14" height="1.4" /></bezel>
+ <bezel element="text_l5a"><bounds x="82" y="53.21" width="14" height="1.4" /></bezel>
+ <bezel element="text_l5b"><bounds x="82" y="57.56" width="14" height="1.4" /></bezel>
+ <bezel element="text_l6a"><bounds x="82" y="60.92" width="14" height="1.4" /></bezel>
+ <bezel element="text_l6b"><bounds x="82" y="65.27" width="14" height="1.4" /></bezel>
+ <bezel element="text_l7a"><bounds x="82" y="68.64" width="14" height="1.4" /></bezel>
+ <bezel element="text_l7b"><bounds x="82" y="72.99" width="14" height="1.4" /></bezel>
+ <bezel element="text_l8a"><bounds x="82" y="76.35" width="14" height="1.4" /></bezel>
+ <bezel element="text_l8b"><bounds x="82" y="80.70" width="14" height="1.4" /></bezel>
+
+ <bezel element="text_m1ax"><bounds x="91.63" y="20.95" width="14" height="1.4" /></bezel>
+ <bezel element="text_m1a"><bounds x="91.63" y="22.35" width="14" height="1.4" /></bezel>
+ <bezel element="text_m1b"><bounds x="91.63" y="26.70" width="14" height="1.4" /></bezel>
+ <bezel element="text_m2a"><bounds x="91.63" y="30.06" width="14" height="1.4" /></bezel>
+ <bezel element="text_m2b"><bounds x="91.63" y="34.41" width="14" height="1.4" /></bezel>
+ <bezel element="text_m3a"><bounds x="91.63" y="37.78" width="14" height="1.4" /></bezel>
+ <bezel element="text_m3b"><bounds x="91.63" y="42.13" width="14" height="1.4" /></bezel>
+ <bezel element="text_m4ax"><bounds x="91.63" y="44.09" width="14" height="1.4" /></bezel>
+ <bezel element="text_m4a"><bounds x="91.63" y="45.49" width="14" height="1.4" /></bezel>
+ <bezel element="text_m4b"><bounds x="91.63" y="49.84" width="14" height="1.4" /></bezel>
+ <bezel element="text_m5a"><bounds x="91.63" y="53.21" width="14" height="1.4" /></bezel>
+ <bezel element="text_m5b"><bounds x="91.63" y="57.56" width="14" height="1.4" /></bezel>
+ <bezel element="text_m6a"><bounds x="91.63" y="60.92" width="14" height="1.4" /></bezel>
+ <bezel element="text_m6b"><bounds x="91.63" y="65.27" width="14" height="1.4" /></bezel>
+ <bezel element="text_m6bx"><bounds x="91.63" y="66.67" width="14" height="1.4" /></bezel>
+ <bezel element="text_m7a"><bounds x="91.63" y="68.64" width="14" height="1.4" /></bezel>
+ <bezel element="text_m7b"><bounds x="91.63" y="72.99" width="14" height="1.4" /></bezel>
+ <bezel element="text_m8a"><bounds x="91.63" y="76.35" width="14" height="1.4" /></bezel>
+ <bezel element="text_m8b"><bounds x="91.63" y="80.70" width="14" height="1.4" /></bezel>
+
+ <bezel element="text_r1a"><bounds x="101.25" y="22.35" width="14" height="1.4" /></bezel>
+ <bezel element="text_r1b"><bounds x="101.25" y="26.70" width="14" height="1.4" /></bezel>
+ <bezel element="text_r2a"><bounds x="101.25" y="30.06" width="14" height="1.4" /></bezel>
+ <bezel element="text_r2b"><bounds x="101.25" y="34.41" width="14" height="1.4" /></bezel>
+ <bezel element="text_r2bx"><bounds x="101.25" y="35.81" width="14" height="1.4" /></bezel>
+ <bezel element="text_r3a"><bounds x="101.25" y="37.78" width="14" height="1.4" /></bezel>
+ <bezel element="text_r3b"><bounds x="101.25" y="42.13" width="14" height="1.4" /></bezel>
+ <bezel element="text_r4a"><bounds x="101.25" y="45.49" width="14" height="1.4" /></bezel>
+ <bezel element="text_r4b"><bounds x="101.25" y="49.84" width="14" height="1.4" /></bezel>
+ <bezel element="text_r5a"><bounds x="101.25" y="53.21" width="14" height="1.4" /></bezel>
+ <bezel element="text_r5b"><bounds x="101.25" y="57.56" width="14" height="1.4" /></bezel>
+ <bezel element="text_r6a"><bounds x="101.25" y="60.92" width="14" height="1.4" /></bezel>
+ <bezel element="text_r6b"><bounds x="101.25" y="65.27" width="14" height="1.4" /></bezel>
+ <bezel element="text_r7a"><bounds x="101.25" y="68.64" width="14" height="1.4" /></bezel>
+ <bezel element="text_r7b"><bounds x="101.25" y="72.99" width="14" height="1.4" /></bezel>
+ <bezel element="text_r8a"><bounds x="101.25" y="76.35" width="14" height="1.4" /></bezel>
+ <bezel element="text_r8b"><bounds x="101.25" y="80.70" width="14" height="1.4" /></bezel>
+
+ </view>
+</mamelayout>
diff --git a/src/mame/layout/polepos.lay b/src/mame/layout/polepos.lay
index 50634fadfd5..91c82ed096b 100644
--- a/src/mame/layout/polepos.lay
+++ b/src/mame/layout/polepos.lay
@@ -52,7 +52,7 @@
<screen index="0">
<bounds x="0" y="0" width="640" height="480" />
</screen>
- <bezel element="shifter" inputtag="IN0L" inputmask="0x02">
+ <bezel element="shifter" inputtag="IN0" inputmask="0x02">
<bounds x="606" y="414" width="32" height="64" />
<color alpha="0.6" />
</bezel>
@@ -61,7 +61,7 @@
<screen index="0">
<bounds x="0" y="0" width="640" height="480" />
</screen>
- <bezel element="shifter" inputtag="IN0L" inputmask="0x02">
+ <bezel element="shifter" inputtag="IN0" inputmask="0x02">
<bounds x="2" y="414" width="32" height="64" />
<color alpha="0.6" />
</bezel>
diff --git a/src/mame/layout/polyplay.lay b/src/mame/layout/polyplay.lay
new file mode 100644
index 00000000000..ef1ce3a1dff
--- /dev/null
+++ b/src/mame/layout/polyplay.lay
@@ -0,0 +1,117 @@
+<?xml version="1.0"?>
+<mamelayout version="2">
+ <element name="red1">
+ <text state ="0" string="Y">
+ <bounds x="0" y="0" width="7" height="7" />
+ <color red="0.3" green="0.1" blue="0.1" />
+ </text>
+ <text state ="1" string="Y">
+ <bounds x="0" y="0" width="7" height="7" />
+ <color red="1.0" green="0.1" blue="0.1" />
+ </text>
+ </element>
+ <element name="blue1">
+ <text state ="0" string="A">
+ <bounds x="0" y="0" width="7" height="7" />
+ <color red="0.1" green="0.1" blue="0.3" />
+ </text>
+ <text state ="1" string="A">
+ <bounds x="0" y="0" width="7" height="7" />
+ <color red="0.1" green="0.1" blue="1.0" />
+ </text>
+ </element>
+ <element name="yellow1">
+ <text state ="0" string="L">
+ <bounds x="0" y="0" width="7" height="7" />
+ <color red="0.3" green="0.3" blue="0.1" />
+ </text>
+ <text state ="1" string="L">
+ <bounds x="0" y="0" width="7" height="7" />
+ <color red="1.0" green="1.0" blue="0.1" />
+ </text>
+ </element>
+ <element name="green1">
+ <text state ="0" string="P">
+ <bounds x="0" y="0" width="7" height="7" />
+ <color red="0.1" green="0.3" blue="0.1" />
+ </text>
+ <text state ="1" string="P">
+ <bounds x="0" y="0" width="7" height="7" />
+ <color red="0.1" green="1.0" blue="0.1" />
+ </text>
+ </element>
+ <element name="red2">
+ <text state ="0" string="Y">
+ <bounds x="0" y="0" width="7" height="7" />
+ <color red="0.3" green="0.1" blue="0.1" />
+ </text>
+ <text state ="1" string="Y">
+ <bounds x="0" y="0" width="7" height="7" />
+ <color red="1.0" green="0.1" blue="0.1" />
+ </text>
+ </element>
+ <element name="blue2">
+ <text state ="0" string="L">
+ <bounds x="0" y="0" width="7" height="7" />
+ <color red="0.1" green="0.1" blue="0.3" />
+ </text>
+ <text state ="1" string="L">
+ <bounds x="0" y="0" width="7" height="7" />
+ <color red="0.1" green="0.1" blue="1.0" />
+ </text>
+ </element>
+ <element name="yellow2">
+ <text state ="0" string="O">
+ <bounds x="0" y="0" width="7" height="7" />
+ <color red="0.3" green="0.3" blue="0.1" />
+ </text>
+ <text state ="1" string="O">
+ <bounds x="0" y="0" width="7" height="7" />
+ <color red="1.0" green="1.0" blue="0.1" />
+ </text>
+ </element>
+ <element name="green2">
+ <text state ="0" string="P">
+ <bounds x="0" y="0" width="7" height="7" />
+ <color red="0.1" green="0.3" blue="0.1" />
+ </text>
+ <text state ="1" string="P">
+ <bounds x="0" y="0" width="7" height="7" />
+ <color red="0.1" green="1.0" blue="0.1" />
+ </text>
+ </element>
+ <view name="Screen only">
+ <screen index="0">
+ <bounds x="0" y="0" width="4" height="3" />
+ </screen>
+ </view>
+ <view name="Screen + Lights">
+ <backdrop name="lamp1" element="red1" state="0">
+ <bounds x="7" y="0" width="1" height="1"/>
+ </backdrop>
+ <backdrop name="lamp2" element="blue1" state="0">
+ <bounds x="6" y="0" width="1" height="1"/>
+ </backdrop>
+ <backdrop name="lamp3" element="yellow1" state="0">
+ <bounds x="5" y="0" width="1" height="1"/>
+ </backdrop>
+ <backdrop name="lamp4" element="green1" state="0">
+ <bounds x="4" y="0" width="1" height="1"/>
+ </backdrop>
+ <backdrop name="lamp1" element="red2" state="0">
+ <bounds x="3" y="0" width="1" height="1"/>
+ </backdrop>
+ <backdrop name="lamp2" element="blue2" state="0">
+ <bounds x="2" y="0" width="1" height="1"/>
+ </backdrop>
+ <backdrop name="lamp3" element="yellow2" state="0">
+ <bounds x="1" y="0" width="1" height="1"/>
+ </backdrop>
+ <backdrop name="lamp4" element="green2" state="0">
+ <bounds x="0" y="0" width="1" height="1"/>
+ </backdrop>
+ <screen index="0">
+ <bounds x="0" y="1" width="8" height="6" />
+ </screen>
+ </view>
+</mamelayout> \ No newline at end of file
diff --git a/src/mame/machine/alpha8201.cpp b/src/mame/machine/alpha8201.cpp
index 852d4eaadd0..1acaf966405 100644
--- a/src/mame/machine/alpha8201.cpp
+++ b/src/mame/machine/alpha8201.cpp
@@ -282,7 +282,7 @@ const device_type ALPHA_8201 = &device_creator<alpha_8201_device>;
// alpha_8201_device - constructor
//-------------------------------------------------
-alpha_8201_device::alpha_8201_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+alpha_8201_device::alpha_8201_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, ALPHA_8201, "ALPHA-8201", tag, owner, clock, "alpha8201", __FILE__),
m_mcu(*this, "mcu")
{
@@ -295,7 +295,7 @@ alpha_8201_device::alpha_8201_device(const machine_config &mconfig, const char *
void alpha_8201_device::device_start()
{
- m_shared_ram = make_unique_clear<uint8_t[]>(0x400);
+ m_shared_ram = make_unique_clear<u8[]>(0x400);
// zerofill
m_bus = 0;
@@ -364,7 +364,7 @@ void alpha_8201_device::mcu_update_address()
READ8_MEMBER(alpha_8201_device::mcu_data_r)
{
- uint8_t ret = 0;
+ u8 ret = 0;
if (m_bus && ~m_mcu_d & 4)
ret = m_shared_ram[m_mcu_address];
diff --git a/src/mame/machine/alpha8201.h b/src/mame/machine/alpha8201.h
index 241a6d1c3bb..9d13dba6d96 100644
--- a/src/mame/machine/alpha8201.h
+++ b/src/mame/machine/alpha8201.h
@@ -14,7 +14,7 @@
class alpha_8201_device : public device_t
{
public:
- alpha_8201_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ alpha_8201_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
~alpha_8201_device() {}
DECLARE_READ8_MEMBER(mcu_data_r);
@@ -38,11 +38,11 @@ private:
required_device<cpu_device> m_mcu;
// internal state
- int m_bus; // shared RAM bus direction
- uint16_t m_mcu_address; // MCU side RAM address
- uint16_t m_mcu_d; // MCU D output data
- uint8_t m_mcu_r[4]; // MCU R0-R3 output data
- std::unique_ptr<uint8_t[]> m_shared_ram; // 1KB RAM
+ int m_bus; // shared RAM bus direction
+ u16 m_mcu_address; // MCU side RAM address
+ u16 m_mcu_d; // MCU D output data
+ u8 m_mcu_r[4]; // MCU R0-R3 output data
+ std::unique_ptr<u8[]> m_shared_ram; // 1KB RAM
void mcu_update_address();
void mcu_writeram();
diff --git a/src/mame/machine/amiga.cpp b/src/mame/machine/amiga.cpp
index 4b383a4a165..7eb00839867 100644
--- a/src/mame/machine/amiga.cpp
+++ b/src/mame/machine/amiga.cpp
@@ -188,7 +188,7 @@ WRITE_LINE_MEMBER( amiga_state::kbreset_w )
// this is connected to the gary chip, gary then resets the 68k, agnus, paula and the cias
if (!state)
{
- m_sound->reset();
+ m_paula->reset();
machine_reset();
m_maincpu->reset();
}
@@ -293,7 +293,7 @@ TIMER_CALLBACK_MEMBER( amiga_state::scanline_callback )
m_cia_1->tod_w((scanline & 1) ^ BIT(CUSTOM_REG(REG_VPOSR), 15));
// force a sound update
- m_sound->update();
+ m_paula->update();
// set timer for next line
scanline = (scanline + 1) % m_screen->height();
@@ -373,6 +373,11 @@ TIMER_CALLBACK_MEMBER( amiga_state::amiga_irq_proc )
m_irq_timer->reset();
}
+WRITE_LINE_MEMBER( amiga_state::paula_int_w )
+{
+ set_interrupt(INTENA_SETCLR | (0x80 << state));
+}
+
//**************************************************************************
// INPUTS
@@ -1267,6 +1272,9 @@ WRITE16_MEMBER( amiga_state::custom_chip_w )
if (LOG_CUSTOM)
logerror("%06X:write to custom %s = %04X\n", space.device().safe_pc(), amiga_custom_names[offset & 0xff], data);
+ // paula will handle some of those registers
+ m_paula->reg_w(space, offset, data, mem_mask);
+
switch (offset)
{
case REG_BLTDDAT: case REG_DMACONR: case REG_VPOSR: case REG_VHPOSR:
@@ -1427,8 +1435,6 @@ WRITE16_MEMBER( amiga_state::custom_chip_w )
break;
case REG_DMACON:
- m_sound->update();
-
/* bits BBUSY (14) and BZERO (13) are read-only */
data &= 0x9fff;
data = (data & 0x8000) ? (CUSTOM_REG(offset) | (data & 0x7fff)) : (CUSTOM_REG(offset) & ~(data & 0x7fff));
@@ -1480,22 +1486,10 @@ WRITE16_MEMBER( amiga_state::custom_chip_w )
break;
case REG_ADKCON:
- m_sound->update();
data = (data & 0x8000) ? (CUSTOM_REG(offset) | (data & 0x7fff)) : (CUSTOM_REG(offset) & ~(data & 0x7fff));
m_fdc->adkcon_set(data);
break;
- case REG_AUD0LCL: case REG_AUD0LCH: case REG_AUD0LEN: case REG_AUD0PER: case REG_AUD0VOL:
- case REG_AUD1LCL: case REG_AUD1LCH: case REG_AUD1LEN: case REG_AUD1PER: case REG_AUD1VOL:
- case REG_AUD2LCL: case REG_AUD2LCH: case REG_AUD2LEN: case REG_AUD2PER: case REG_AUD2VOL:
- case REG_AUD3LCL: case REG_AUD3LCH: case REG_AUD3LEN: case REG_AUD3PER: case REG_AUD3VOL:
- m_sound->update();
- break;
-
- case REG_AUD0DAT: case REG_AUD1DAT: case REG_AUD2DAT: case REG_AUD3DAT:
- m_sound->data_w((offset - REG_AUD0DAT) / 8, data);
- break;
-
case REG_BPL1PTH: case REG_BPL2PTH: case REG_BPL3PTH: case REG_BPL4PTH:
case REG_BPL5PTH: case REG_BPL6PTH:
data &= ( m_chip_ram_mask >> 16 );
@@ -1575,7 +1569,7 @@ void amiga_state::serial_adjust()
amiga_state *state = this;
uint32_t divisor = (CUSTOM_REG(REG_SERPER) & 0x7fff) + 1;
- uint32_t baud = m_sound->clock() / divisor;
+ uint32_t baud = m_paula->clock() / divisor;
m_serial_timer->adjust(attotime::from_hz(baud) / 2, 0, attotime::from_hz(baud));
}
diff --git a/src/mame/machine/amigakbd.cpp b/src/mame/machine/amigakbd.cpp
deleted file mode 100644
index 21d1c11d71e..00000000000
--- a/src/mame/machine/amigakbd.cpp
+++ /dev/null
@@ -1,574 +0,0 @@
-// license:GPL-2.0+
-// copyright-holders:Dirk Best
-/***************************************************************************
-
- Amiga Keyboard
-
- We currently emulate the Amiga 500 keyboard controller, which was
- also used in later Amiga 2000 keyboards.
-
- TODO: - Natural keyboard mode doesn't work with shifted characters,
- they get sent in the wrong order (core bug?)
- - Move 6500/1 to its own CPU core so that it can be shared with
- other systems
- - Add support for more keyboard controllers (pending on them
- getting dumped)
-
- Amiga 1000 keyboard part numbers (manufactured by Mitsumi):
-
- - 327063-01 R56-2144 English
- - 327063-02 British
- - 327063-03 R56-2153 German
- - 327063-04 R56-2152 French
- - 327063-05 R56-2154 Italian
-
-***************************************************************************/
-
-#include "amigakbd.h"
-#include "machine/rescap.h"
-
-
-//**************************************************************************
-// DEVICE DEFINITIONS
-//**************************************************************************
-
-const device_type AMIGAKBD = &device_creator<amigakbd_device>;
-
-//-------------------------------------------------
-// machine_config_additions - device-specific
-// machine configurations
-//-------------------------------------------------
-
-static ADDRESS_MAP_START( mpu6500_map, AS_PROGRAM, 8, amigakbd_device )
- ADDRESS_MAP_GLOBAL_MASK(0xfff)
- AM_RANGE(0x000, 0x03f) AM_RAM
- AM_RANGE(0x080, 0x080) AM_READWRITE(port_a_r, port_a_w)
- AM_RANGE(0x081, 0x081) AM_READ_PORT("special") AM_WRITE(port_b_w)
- AM_RANGE(0x082, 0x082) AM_WRITE(port_c_w)
- AM_RANGE(0x083, 0x083) AM_WRITE(port_d_w)
- AM_RANGE(0x084, 0x085) AM_WRITE(latch_w)
- AM_RANGE(0x086, 0x087) AM_READ(counter_r)
- AM_RANGE(0x088, 0x088) AM_WRITE(transfer_latch_w)
- AM_RANGE(0x089, 0x089) AM_WRITE(clear_pa0_detect)
- AM_RANGE(0x08a, 0x08a) AM_WRITE(clear_pa1_detect)
- AM_RANGE(0x08f, 0x08f) AM_READWRITE(control_r, control_w)
- AM_RANGE(0x090, 0x0ff) AM_NOP
- AM_RANGE(0x800, 0xfff) AM_ROM AM_REGION("mos6570_036", 0)
-ADDRESS_MAP_END
-
-static MACHINE_CONFIG_FRAGMENT( a500_keyboard )
- MCFG_CPU_ADD("mos6570_036", M6502, XTAL_3MHz / 2)
- MCFG_CPU_PROGRAM_MAP(mpu6500_map)
-MACHINE_CONFIG_END
-
-machine_config_constructor amigakbd_device::device_mconfig_additions() const
-{
- return MACHINE_CONFIG_NAME( a500_keyboard );
-}
-
-//-------------------------------------------------
-// rom_region - device-specific ROM region
-//-------------------------------------------------
-
-ROM_START( mos6570_036 )
- ROM_REGION(0x800, "mos6570_036", 0)
- ROM_LOAD("328191-02.ic1", 0x000, 0x800, CRC(4a3fc332) SHA1(83b21d0c8b93fc9b9b3b287fde4ec8f3badac5a2))
-ROM_END
-
-const tiny_rom_entry *amigakbd_device::device_rom_region() const
-{
- return ROM_NAME( mos6570_036 );
-}
-
-//-------------------------------------------------
-// input_ports - device-specific input ports
-//-------------------------------------------------
-
-static INPUT_PORTS_START( a500_us_keyboard )
- PORT_START("special")
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LWIN) PORT_CHAR(UCHAR_MAMEKEY(LWIN)) PORT_NAME("Left Amiga") PORT_CHANGED_MEMBER(DEVICE_SELF, amigakbd_device, check_reset, nullptr)
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT))
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2) PORT_NAME("Ctrl") PORT_CHANGED_MEMBER(DEVICE_SELF, amigakbd_device, check_reset, nullptr)
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RWIN) PORT_CHAR(UCHAR_MAMEKEY(RWIN)) PORT_NAME("Right Amiga") PORT_CHANGED_MEMBER(DEVICE_SELF, amigakbd_device, check_reset, nullptr)
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RALT) PORT_CHAR(UCHAR_MAMEKEY(RALT))
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
-
- PORT_START("row_d6")
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR(UCHAR_MAMEKEY(ASTERISK))
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_END) PORT_NAME("Unused")
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_NAME("Caps Lock")
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_CHAR(9)
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_TILDE) PORT_CHAR('`') PORT_CHAR('~')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC))
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("row_d5")
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD))
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_HOME) PORT_NAME("(")
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("row_d4")
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD))
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1))
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("row_d3")
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD))
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2))
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("row_d2")
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD))
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3))
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("row_d1")
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD))
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4))
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("row_d0")
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD))
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5))
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("row_c7")
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD))
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_PGUP) PORT_NAME(")")
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("row_c6")
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD))
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6))
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("row_c5")
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD))
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHAR('/')
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("row_c4")
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7') PORT_CHAR('&')
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7))
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("row_c3")
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD))
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('"')
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8))
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("row_c2")
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD))
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_PGDN) PORT_NAME("Unused")
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}')
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9))
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("row_c1")
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD))
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DEL) PORT_CHAR(UCHAR_MAMEKEY(DEL))
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|')
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10))
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-
- PORT_START("row_c0")
- PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD))
- PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
- PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F11) PORT_NAME("Help")
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED)
-INPUT_PORTS_END
-
-ioport_constructor amigakbd_device::device_input_ports() const
-{
- return INPUT_PORTS_NAME( a500_us_keyboard );
-}
-
-
-//**************************************************************************
-// LIVE DEVICE
-//**************************************************************************
-
-//-------------------------------------------------
-// amigakbd_device - constructor
-//-------------------------------------------------
-
-amigakbd_device::amigakbd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, AMIGAKBD, "Amiga 500 Keyboard with 6570-036 MPU", tag, owner, clock, "amigakbd", __FILE__),
- m_write_kclk(*this),
- m_write_kdat(*this),
- m_write_krst(*this),
- m_mpu(*this, "mos6570_036"),
- m_special(*this, "special"),
- m_row_d6(*this, "row_d6"),
- m_row_d5(*this, "row_d5"),
- m_row_d4(*this, "row_d4"),
- m_row_d3(*this, "row_d3"),
- m_row_d2(*this, "row_d2"),
- m_row_d1(*this, "row_d1"),
- m_row_d0(*this, "row_d0"),
- m_row_c7(*this, "row_c7"),
- m_row_c6(*this, "row_c6"),
- m_row_c5(*this, "row_c5"),
- m_row_c4(*this, "row_c4"),
- m_row_c3(*this, "row_c3"),
- m_row_c2(*this, "row_c2"),
- m_row_c1(*this, "row_c1"),
- m_row_c0(*this, "row_c0"),
- m_timer(nullptr),
- m_watchdog(nullptr),
- m_reset(nullptr),
- m_kdat(1),
- m_kclk(1),
- m_port_c(0xff),
- m_port_d(0xff),
- m_latch(0xffff),
- m_counter(0xffff),
- m_control(0x00)
-{
-}
-
-//-------------------------------------------------
-// device_start - device-specific startup
-//-------------------------------------------------
-
-void amigakbd_device::device_start()
-{
- // resolve callbacks
- m_write_kclk.resolve_safe();
- m_write_kdat.resolve_safe();
- m_write_krst.resolve_safe();
-
- // allocate timers
- m_timer = timer_alloc(0, nullptr);
- m_watchdog = timer_alloc(1, nullptr);
- m_reset = timer_alloc(2, nullptr);
-
- // register for save states
- save_item(NAME(m_kdat));
- save_item(NAME(m_kclk));
- save_item(NAME(m_port_c));
- save_item(NAME(m_port_d));
- save_item(NAME(m_latch));
- save_item(NAME(m_counter));
- save_item(NAME(m_control));
-}
-
-//-------------------------------------------------
-// device_reset - device-specific reset
-//-------------------------------------------------
-
-void amigakbd_device::device_reset()
-{
- // stack starts 0
- m_mpu->set_state_int(M6502_S, 0);
-
- m_kdat = 1;
- m_kclk = 1;
- m_port_c = 0xff;
- m_port_d = 0xff;
- m_latch = 0xffff; // not initialized by hardware
- m_counter = 0xffff; // not initialized by hardware
- m_control = 0x00;
-
- m_timer->adjust(attotime::zero, 0, attotime::from_hz(XTAL_3MHz / 2));
- m_watchdog->adjust(attotime::from_msec(54));
-}
-
-void amigakbd_device::device_timer(emu_timer &timer, device_timer_id tid, int param, void *ptr)
-{
- switch (tid)
- {
- // 6500/1 internal timer
- case 0:
- switch (m_control & 0x03)
- {
- // interval timer, pulse width measurement (connected to gnd here)
- case 0:
- case 3:
- if (m_counter-- == 0)
- {
- // counter overflow
- m_control |= COUNTER_OVERFLOW;
- m_counter = m_latch;
-
- // generate interrupt?
- update_irqs();
- }
- break;
-
- // pulse generator
- case 1:
- break;
-
- // event counter
- case 2:
- break;
- }
- break;
-
- // watchdog
- case 1:
- m_mpu->reset();
- m_watchdog->adjust(attotime::from_msec(54));
- break;
-
- // keyboard reset timer
- case 2:
- m_write_krst(1);
- break;
- }
-}
-
-
-//**************************************************************************
-// IMPLEMENTATION
-//**************************************************************************
-
-INPUT_CHANGED_MEMBER( amigakbd_device::check_reset )
-{
- uint8_t keys = m_special->read();
-
- // ctrl-amiga-amiga pressed?
- if (!BIT(keys, 6) && !BIT(keys, 3) && !BIT(keys, 2))
- {
- m_write_krst(0);
- m_reset->adjust(PERIOD_OF_555_MONOSTABLE(RES_K(47), CAP_U(10)));
- }
-}
-
-void amigakbd_device::update_irqs()
-{
- if ((m_control & PA1_INT_ENABLED) && (m_control & PA1_NEGATIVE_EDGE))
- m_mpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
-
- else if ((m_control & PA0_INT_ENABLED) && (m_control & PA0_POSITIVE_EDGE))
- m_mpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
-
- else if ((m_control & COUNTER_INT_ENABLED) && (m_control & COUNTER_OVERFLOW))
- m_mpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
-
- else
- m_mpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
-}
-
-READ8_MEMBER( amigakbd_device::port_a_r )
-{
- uint8_t data = 0xfc;
-
- // kdat & kclk
- data |= m_kdat << 0;
- data |= m_kclk << 1;
-
- // port d rows
- if (!BIT(m_port_d, 6)) data &= m_row_d6->read();
- if (!BIT(m_port_d, 5)) data &= m_row_d5->read();
- if (!BIT(m_port_d, 4)) data &= m_row_d4->read();
- if (!BIT(m_port_d, 3)) data &= m_row_d3->read();
- if (!BIT(m_port_d, 2)) data &= m_row_d2->read();
- if (!BIT(m_port_d, 1)) data &= m_row_d1->read();
- if (!BIT(m_port_d, 0)) data &= m_row_d0->read();
-
- // port c rows
- if (!BIT(m_port_c, 7)) data &= m_row_c7->read();
- if (!BIT(m_port_c, 6)) data &= m_row_c6->read();
- if (!BIT(m_port_c, 5)) data &= m_row_c5->read();
- if (!BIT(m_port_c, 4)) data &= m_row_c4->read();
- if (!BIT(m_port_c, 3)) data &= m_row_c3->read();
- if (!BIT(m_port_c, 2)) data &= m_row_c2->read();
- if (!BIT(m_port_c, 1)) data &= m_row_c1->read();
- if (!BIT(m_port_c, 0)) data &= m_row_c0->read();
-
- return data;
-}
-
-WRITE8_MEMBER( amigakbd_device::port_a_w )
-{
- // look for pa0 edge
- if (!m_kdat && BIT(data, 0))
- {
- m_control |= PA0_POSITIVE_EDGE;
- update_irqs();
- }
-
- // and pa1 edge
- if (m_kclk && !BIT(data, 1))
- {
- m_control |= PA1_NEGATIVE_EDGE;
- update_irqs();
- }
-
- // update with new values and output
- if (m_kdat != BIT(data, 0))
- {
- m_kdat = BIT(data, 0);
- m_write_kdat(m_kdat);
- }
-
- if (m_kclk != BIT(data, 1))
- {
- m_kclk = BIT(data, 1);
- m_write_kclk(m_kclk);
- }
-}
-
-WRITE8_MEMBER( amigakbd_device::port_b_w )
-{
- // caps lock led
- machine().output().set_value("led0", BIT(data, 7));
-}
-
-WRITE8_MEMBER( amigakbd_device::port_c_w )
-{
- m_port_c = data;
-}
-
-WRITE8_MEMBER( amigakbd_device::port_d_w )
-{
- // reset watchdog on 0 -> 1 transition
- if (!BIT(m_port_d, 7) && BIT(data, 7))
- m_watchdog->adjust(attotime::from_msec(54));
-
- m_port_d = data;
-}
-
-WRITE8_MEMBER( amigakbd_device::latch_w )
-{
- if (offset == 0)
- {
- m_latch &= 0x00ff;
- m_latch |= data << 8;
- }
- else
- {
- m_latch &= 0xff00;
- m_latch |= data << 0;
- }
-}
-
-READ8_MEMBER( amigakbd_device::counter_r )
-{
- if (!space.debugger_access())
- {
- m_control &= ~COUNTER_OVERFLOW;
- update_irqs();
- }
-
- if (offset == 0)
- return m_counter >> 8;
- else
- return m_counter >> 0;
-}
-
-WRITE8_MEMBER( amigakbd_device::transfer_latch_w )
-{
- m_control &= ~COUNTER_OVERFLOW;
- update_irqs();
-
- m_latch &= 0x00ff;
- m_latch |= data << 8;
-
- m_counter = m_latch;
-}
-
-WRITE8_MEMBER( amigakbd_device::clear_pa0_detect )
-{
- m_control &= ~PA0_POSITIVE_EDGE;
- update_irqs();
-}
-
-WRITE8_MEMBER( amigakbd_device::clear_pa1_detect )
-{
- m_control &= ~PA1_NEGATIVE_EDGE;
- update_irqs();
-}
-
-READ8_MEMBER( amigakbd_device::control_r )
-{
- return m_control;
-}
-
-WRITE8_MEMBER( amigakbd_device::control_w )
-{
- m_control = data;
- update_irqs();
-}
-
-WRITE_LINE_MEMBER( amigakbd_device::kdat_w )
-{
- // detect positive edge
- if (state && !m_kdat)
- {
- m_control |= PA0_POSITIVE_EDGE;
- update_irqs();
- }
-
- m_kdat = state;
-}
diff --git a/src/mame/machine/amigakbd.h b/src/mame/machine/amigakbd.h
deleted file mode 100644
index 687401a1c20..00000000000
--- a/src/mame/machine/amigakbd.h
+++ /dev/null
@@ -1,143 +0,0 @@
-// license:GPL-2.0+
-// copyright-holders:Dirk Best
-/***************************************************************************
-
- Amiga Keyboard
-
- We currently emulate the Amiga 500 keyboard controller, which was
- also used in later Amiga 2000 keyboards.
-
-***************************************************************************/
-
-#pragma once
-
-#ifndef __AMIGAKBD_H__
-#define __AMIGAKBD_H__
-
-#include "emu.h"
-#include "cpu/m6502/m6502.h"
-
-
-//**************************************************************************
-// INTERFACE CONFIGURATION MACROS
-//**************************************************************************
-
-#define MCFG_AMIGA_KEYBOARD_KCLK_CALLBACK(_write) \
- devcb = &amigakbd_device::set_kclk_wr_callback(*device, DEVCB_##_write);
-
-#define MCFG_AMIGA_KEYBOARD_KDAT_CALLBACK(_write) \
- devcb = &amigakbd_device::set_kdat_wr_callback(*device, DEVCB_##_write);
-
-#define MCFG_AMIGA_KEYBOARD_KRST_CALLBACK(_write) \
- devcb = &amigakbd_device::set_krst_wr_callback(*device, DEVCB_##_write);
-
-
-//**************************************************************************
-// TYPE DEFINITIONS
-//**************************************************************************
-
-// ======================> amigakbd_device
-
-class amigakbd_device : public device_t
-{
-public:
- // construction/destruction
- amigakbd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
- template<class _Object> static devcb_base &set_kclk_wr_callback(device_t &device, _Object object)
- { return downcast<amigakbd_device &>(device).m_write_kclk.set_callback(object); }
- template<class _Object> static devcb_base &set_kdat_wr_callback(device_t &device, _Object object)
- { return downcast<amigakbd_device &>(device).m_write_kdat.set_callback(object); }
- template<class _Object> static devcb_base &set_krst_wr_callback(device_t &device, _Object object)
- { return downcast<amigakbd_device &>(device).m_write_krst.set_callback(object); }
-
- DECLARE_WRITE_LINE_MEMBER( kdat_w );
-
- // 6500/1 internal
- DECLARE_READ8_MEMBER( port_a_r );
- DECLARE_WRITE8_MEMBER( port_a_w );
- DECLARE_WRITE8_MEMBER( port_b_w );
- DECLARE_WRITE8_MEMBER( port_c_w );
- DECLARE_WRITE8_MEMBER( port_d_w );
- DECLARE_WRITE8_MEMBER( latch_w );
- DECLARE_READ8_MEMBER( counter_r );
- DECLARE_WRITE8_MEMBER( transfer_latch_w );
- DECLARE_WRITE8_MEMBER( clear_pa0_detect );
- DECLARE_WRITE8_MEMBER( clear_pa1_detect );
- DECLARE_READ8_MEMBER( control_r );
- DECLARE_WRITE8_MEMBER( control_w );
-
- DECLARE_INPUT_CHANGED_MEMBER( check_reset );
-
-protected:
- // device-level overrides
- virtual const tiny_rom_entry *device_rom_region() const override;
- virtual machine_config_constructor device_mconfig_additions() const override;
- virtual ioport_constructor device_input_ports() const override;
- virtual void device_start() override;
- virtual void device_reset() override;
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
-
-private:
- enum
- {
- // counter modes
- COUNTER_INTERVAL = 0x00,
- COUNTER_PULSE = 0x01,
- COUNTER_EVENT = 0x02,
- COUNTER_PWM = 0x03,
-
- // interrupt enables
- PA1_INT_ENABLED = 0x04,
- PA0_INT_ENABLED = 0x08,
- COUNTER_INT_ENABLED = 0x10,
-
- // status
- PA1_NEGATIVE_EDGE = 0x20,
- PA0_POSITIVE_EDGE = 0x40,
- COUNTER_OVERFLOW = 0x80
- };
-
- void update_irqs();
-
- devcb_write_line m_write_kclk;
- devcb_write_line m_write_kdat;
- devcb_write_line m_write_krst;
-
- required_device<m6502_device> m_mpu;
-
- required_ioport m_special;
- required_ioport m_row_d6;
- required_ioport m_row_d5;
- required_ioport m_row_d4;
- required_ioport m_row_d3;
- required_ioport m_row_d2;
- required_ioport m_row_d1;
- required_ioport m_row_d0;
- required_ioport m_row_c7;
- required_ioport m_row_c6;
- required_ioport m_row_c5;
- required_ioport m_row_c4;
- required_ioport m_row_c3;
- required_ioport m_row_c2;
- required_ioport m_row_c1;
- required_ioport m_row_c0;
-
- emu_timer *m_timer;
- emu_timer *m_watchdog;
- emu_timer *m_reset;
-
- int m_kdat;
- int m_kclk;
-
- uint8_t m_port_c;
- uint8_t m_port_d;
- uint16_t m_latch;
- uint16_t m_counter;
- uint8_t m_control;
-};
-
-// device type definition
-extern const device_type AMIGAKBD;
-
-#endif // __AMIGAKBD_H__
diff --git a/src/mame/machine/archimds.cpp b/src/mame/machine/archimds.cpp
index 9d5b46951f3..38778054513 100644
--- a/src/mame/machine/archimds.cpp
+++ b/src/mame/machine/archimds.cpp
@@ -43,27 +43,20 @@ void archimedes_state::archimedes_request_irq_a(int mask)
{
m_ioc_regs[IRQ_STATUS_A] |= mask;
- if (m_ioc_regs[IRQ_STATUS_A] & m_ioc_regs[IRQ_MASK_A])
- {
+ if ((m_ioc_regs[IRQ_STATUS_A] & m_ioc_regs[IRQ_MASK_A]) || (m_ioc_regs[IRQ_STATUS_B] & m_ioc_regs[IRQ_MASK_B]))
m_maincpu->set_input_line(ARM_IRQ_LINE, ASSERT_LINE);
- }
-
- if ((m_ioc_regs[IRQ_STATUS_A] & m_ioc_regs[IRQ_MASK_A]) == 0)
- {
+ else
m_maincpu->set_input_line(ARM_IRQ_LINE, CLEAR_LINE);
- }
}
void archimedes_state::archimedes_request_irq_b(int mask)
{
m_ioc_regs[IRQ_STATUS_B] |= mask;
- if (m_ioc_regs[IRQ_STATUS_B] & m_ioc_regs[IRQ_MASK_B])
- {
- generic_pulse_irq_line(*m_maincpu, ARM_IRQ_LINE, 1);
- //m_maincpu->set_input_line(ARM_IRQ_LINE, CLEAR_LINE);
- //m_maincpu->set_input_line(ARM_IRQ_LINE, ASSERT_LINE);
- }
+ if ((m_ioc_regs[IRQ_STATUS_A] & m_ioc_regs[IRQ_MASK_A]) || (m_ioc_regs[IRQ_STATUS_B] & m_ioc_regs[IRQ_MASK_B]))
+ m_maincpu->set_input_line(ARM_IRQ_LINE, ASSERT_LINE);
+ else
+ m_maincpu->set_input_line(ARM_IRQ_LINE, CLEAR_LINE);
}
void archimedes_state::archimedes_request_fiq(int mask)
@@ -90,7 +83,7 @@ void archimedes_state::archimedes_clear_irq_a(int mask)
void archimedes_state::archimedes_clear_irq_b(int mask)
{
m_ioc_regs[IRQ_STATUS_B] &= ~mask;
- //archimedes_request_irq_b(0);
+ archimedes_request_irq_b(0);
}
void archimedes_state::archimedes_clear_fiq(int mask)
diff --git a/src/mame/machine/cammu.cpp b/src/mame/machine/cammu.cpp
new file mode 100644
index 00000000000..1ee7cdab38a
--- /dev/null
+++ b/src/mame/machine/cammu.cpp
@@ -0,0 +1,181 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+
+/*
+ * An implementation of the Fairchild/Intergraph Cache and Memory Management Unit (CAMMU) designed for use with the CLIPPER CPU family.
+ *
+ * Primary reference: http://bitsavers.trailing-edge.com/pdf/fairchild/clipper/CLIPPER%20C300%2032-Bit%20Compute%20Engine.pdf
+ * Another reference: http://www.eecs.berkeley.edu/Pubs/TechRpts/1986/CSD-86-289.pdf
+ *
+ * This implementation is currently at a very early stage, and is only sufficient to handle the bare minimum of boot/diagnostic code.
+ *
+ * TODO
+ * - almost everything
+ * - map registers
+ * - refactor hardware tlb
+ * - address translation
+ * - faults
+ * - tlb
+ * - cache
+ * - bus errors
+ */
+
+#include "cammu.h"
+
+#define VERBOSE 0
+
+// each variant of the cammu has different registers and a different addressing map
+// TODO: decode the cammu registers properly
+DEVICE_ADDRESS_MAP_START(map, 32, cammu_c4t_device)
+ AM_RANGE(0x000, 0xfff) AM_READWRITE(cammu_r, cammu_w)
+ADDRESS_MAP_END
+
+DEVICE_ADDRESS_MAP_START(map, 32, cammu_c4i_device)
+ AM_RANGE(0x000, 0xfff) AM_READWRITE(cammu_r, cammu_w)
+ADDRESS_MAP_END
+
+DEVICE_ADDRESS_MAP_START(map, 32, cammu_c3_device)
+ AM_RANGE(0x000, 0xfff) AM_READWRITE(cammu_r, cammu_w)
+ADDRESS_MAP_END
+
+const device_type CAMMU_C4T = &device_creator<cammu_c4t_device>;
+const device_type CAMMU_C4I = &device_creator<cammu_c4i_device>;
+const device_type CAMMU_C3 = &device_creator<cammu_c3_device>;
+
+cammu_c4t_device::cammu_c4t_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : cammu_device(mconfig, CAMMU_C4T, "C4E/C4T CAMMU", tag, owner, clock, "C4T", __FILE__) { }
+
+cammu_c4i_device::cammu_c4i_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : cammu_device(mconfig, CAMMU_C4I, "C4I CAMMU", tag, owner, clock, "C4I", __FILE__) { }
+
+cammu_c3_device::cammu_c3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : cammu_device(mconfig, CAMMU_C4T, "C1/C3 CAMMU", tag, owner, clock, "C3", __FILE__) { }
+
+cammu_device::cammu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source)
+ : device_t(mconfig, type, name, tag, owner, clock, shortname, source)
+ , device_memory_interface(mconfig, *this),
+ m_main_space_config("main", ENDIANNESS_LITTLE, 32, 32, 0),
+ m_io_space_config("io", ENDIANNESS_LITTLE, 32, 32, 0),
+ m_boot_space_config("boot", ENDIANNESS_LITTLE, 32, 32, 0),
+ m_main_space(nullptr),
+ m_io_space(nullptr),
+ m_boot_space(nullptr),
+ m_ssw_func(*this)
+{ }
+
+void cammu_device::device_start()
+{
+ m_ssw_func.resolve_safe(0);
+
+ m_main_space = &space(AS_0);
+ m_io_space = &space(AS_1);
+ m_boot_space = &space(AS_2);
+}
+
+void cammu_device::device_reset()
+{
+}
+
+const address_space_config *cammu_device::memory_space_config (address_spacenum spacenum) const
+{
+ switch (spacenum)
+ {
+ case AS_0: return &m_main_space_config;
+ case AS_1: return &m_io_space_config;
+ case AS_2: return &m_boot_space_config;
+ default: break;
+ }
+
+ return nullptr;
+}
+
+READ32_MEMBER(cammu_device::mmu_r)
+{
+ u32 ssw = m_ssw_func();
+ u32 address = offset << 2;
+
+ // in supervisor mode, the first 8 pages are always mapped via the hard-wired tlb
+ if ((ssw & 0x40000000) == 0 && (address & ~0x7fff) == 0)
+ {
+ switch (address & 0xf000)
+ {
+ case 0x0000:
+ case 0x1000:
+ case 0x2000:
+ case 0x3000:
+ // pages 0-3: main space pages 0-3
+ return m_main_space->read_dword(address, mem_mask);
+
+ case 0x4000:
+ case 0x5000:
+ // pages 4-5: i/o space pages 0-1
+ return m_io_space->read_dword(address & 0x1fff, mem_mask);
+
+ case 0x6000:
+ case 0x7000:
+ // pages 6-7: boot space pages 0-1
+ return m_boot_space->read_dword(address & 0x1fff, mem_mask);
+ }
+ }
+
+ // FIXME: currently maps addresses with upper bits 0x00 or 0x7f1 to main memory and everything else to I/O
+ if ((address & 0xff000000) == 0x00000000 || (address & 0xfff00000) == 0x7f100000)
+ {
+#ifdef ICACHE_ENTRIES
+ // if this is an instruction fetch, check the cache first
+ if (space.spacenum() == AS_PROGRAM)
+ {
+ if (m_icache[offset & (ICACHE_ENTRIES-1)].offset != offset)
+ {
+ m_icache[offset & (ICACHE_ENTRIES - 1)].offset = offset;
+ m_icache[offset & (ICACHE_ENTRIES - 1)].data = m_main_space->read_dword(address, mem_mask);
+ }
+
+ return m_icache[offset & (ICACHE_ENTRIES - 1)].data;
+ }
+ else
+#endif
+ return m_main_space->read_dword(address, mem_mask);
+ }
+ else
+ return m_io_space->read_dword(address, mem_mask);
+}
+
+WRITE32_MEMBER(cammu_device::mmu_w)
+{
+ u32 ssw = m_ssw_func();
+ u32 address = offset << 2;
+
+ // in supervisor mode, the first 8 pages are always mapped via the hard-wired tlb
+ if ((ssw & 0x40000000) == 0 && (address & ~0x7fff) == 0)
+ {
+ switch (address & 0xf000)
+ {
+ case 0x0000:
+ case 0x1000:
+ case 0x2000:
+ case 0x3000:
+ // pages 0-3: main space pages 0-3
+ m_main_space->write_dword(address, data, mem_mask);
+ return;
+
+ case 0x4000:
+ case 0x5000:
+ // pages 4-5: i/o space pages 0-1
+ m_io_space->write_dword(address & 0x1fff, data, mem_mask);
+ return;
+
+ case 0x6000:
+ case 0x7000:
+ // pages 6-7: boot space pages 0-1
+ m_boot_space->write_dword(address & 0x1fff, data, mem_mask);
+ return;
+ }
+ }
+
+ // FIXME: currently maps addresses with upper bits 0x00 or 0x7f1 to main memory and everything else to I/O
+ if ((address & 0xff000000) == 0x00000000 || (address & 0xfff00000) == 0x7f100000)
+ m_main_space->write_dword(address, data, mem_mask);
+ else
+ m_io_space->write_dword(address, data, mem_mask);
+}
diff --git a/src/mame/machine/cammu.h b/src/mame/machine/cammu.h
new file mode 100644
index 00000000000..a00208efbb5
--- /dev/null
+++ b/src/mame/machine/cammu.h
@@ -0,0 +1,91 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+
+#pragma once
+
+#ifndef CAMMU_H_
+#define CAMMU_H_
+
+#include "emu.h"
+
+// the following enables a very crude instruction cache - it has known (future)
+// problems, but speeds up cpu execution quite noticeably in the short term by
+// avoiding some of the delays in the mame memory subsystem
+#define ICACHE_ENTRIES 32768
+
+#define MCFG_CAMMU_SSW_CB(_sswcb) \
+ devcb = &cammu_device::static_set_ssw_callback(*device, DEVCB_##_sswcb);
+
+class cammu_device : public device_t, public device_memory_interface
+{
+public:
+ cammu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source);
+
+ template<class _Object> static devcb_base &static_set_ssw_callback(device_t &device, _Object object) { return downcast<cammu_device &>(device).m_ssw_func.set_callback(object); }
+
+ virtual DECLARE_ADDRESS_MAP(map, 32) = 0;
+
+ DECLARE_READ32_MEMBER(mmu_r);
+ DECLARE_WRITE32_MEMBER(mmu_w);
+
+ DECLARE_READ32_MEMBER(cammu_r) { return m_cammu[offset]; }
+ DECLARE_WRITE32_MEMBER(cammu_w) { m_cammu[offset] = data; }
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // device_memory_interface overrides
+ virtual const address_space_config *memory_space_config (address_spacenum spacenum) const override;
+
+private:
+ address_space_config m_main_space_config;
+ address_space_config m_io_space_config;
+ address_space_config m_boot_space_config;
+ address_space *m_main_space;
+ address_space *m_io_space;
+ address_space *m_boot_space;
+ devcb_read32 m_ssw_func;
+
+ u32 m_cammu[1024];
+
+#ifdef ICACHE_ENTRIES
+ struct icache
+ {
+ u32 offset;
+ u32 data;
+ } m_icache[ICACHE_ENTRIES];
+#endif
+};
+
+class cammu_c4t_device : public cammu_device
+{
+public:
+ cammu_c4t_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ virtual DECLARE_ADDRESS_MAP(map, 32) override;
+};
+
+class cammu_c4i_device : public cammu_device
+{
+public:
+ cammu_c4i_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ virtual DECLARE_ADDRESS_MAP(map, 32) override;
+};
+
+class cammu_c3_device : public cammu_device
+{
+public:
+ cammu_c3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ virtual DECLARE_ADDRESS_MAP(map, 32) override;
+};
+
+// device type definitions
+extern const device_type CAMMU_C4T;
+extern const device_type CAMMU_C4I;
+extern const device_type CAMMU_C3;
+
+#endif \ No newline at end of file
diff --git a/src/mame/machine/dc.cpp b/src/mame/machine/dc.cpp
index 7b5d08dd79d..135f9e0d87a 100644
--- a/src/mame/machine/dc.cpp
+++ b/src/mame/machine/dc.cpp
@@ -10,6 +10,7 @@
#include "debugger.h"
#include "includes/dc.h"
#include "cpu/sh4/sh4.h"
+#include "cpu/arm7/arm7core.h"
#include "machine/mie.h"
#include "machine/naomig1.h"
#include "video/powervr2.h"
@@ -718,7 +719,46 @@ WRITE32_MEMBER(dc_state::dc_arm_aica_w)
m_aica->write(space, offset*2, data, mem_mask&0xffff);
}
+READ64_MEMBER(dc_state::sh4_soundram_r )
+{
+ return *((uint64_t *)dc_sound_ram.target()+offset);
+}
+
+WRITE64_MEMBER(dc_state::sh4_soundram_w )
+{
+ COMBINE_DATA((uint64_t *)dc_sound_ram.target() + offset);
+}
+
+WRITE_LINE_MEMBER(dc_state::aica_irq)
+{
+ m_soundcpu->set_input_line(ARM7_FIRQ_LINE, state ? ASSERT_LINE : CLEAR_LINE);
+}
+
+WRITE_LINE_MEMBER(dc_state::sh4_aica_irq)
+{
+ if(state)
+ dc_sysctrl_regs[SB_ISTEXT] |= IST_EXT_AICA;
+ else
+ dc_sysctrl_regs[SB_ISTEXT] &= ~IST_EXT_AICA;
+
+ dc_update_interrupt_status();
+}
+
+MACHINE_RESET_MEMBER(dc_state,dc_console)
+{
+ dc_state::machine_reset();
+ m_aica->set_ram_base(dc_sound_ram, 2*1024*1024);
+}
+
TIMER_DEVICE_CALLBACK_MEMBER(dc_state::dc_scanline)
{
m_powervr2->pvr_scanline_timer(param);
}
+
+// crude cheat pending SH4 DRC, especially useful for inp playback
+INPUT_CHANGED_MEMBER(dc_state::mastercpu_cheat_r)
+{
+ const u32 CPU_CLOCK = (200000000);
+ const u32 timing_value[4] = { CPU_CLOCK, CPU_CLOCK/2, CPU_CLOCK/4, CPU_CLOCK/16 };
+ m_maincpu->set_unscaled_clock(timing_value[newval]);
+}
diff --git a/src/mame/machine/dec0.cpp b/src/mame/machine/dec0.cpp
index 7a1c48ee654..4aef1d1dcff 100644
--- a/src/mame/machine/dec0.cpp
+++ b/src/mame/machine/dec0.cpp
@@ -10,7 +10,9 @@ Data East machine functions - Bryan McPhail, mish@tendril.co.uk
#include "emu.h"
#include "includes/dec0.h"
+
#include "cpu/h6280/h6280.h"
+#include "cpu/m68000/m68000.h"
#include "cpu/mcs51/mcs51.h"
@@ -165,39 +167,35 @@ WRITE16_MEMBER(dec0_state::hippodrm_68000_share_w)
READ8_MEMBER(dec0_state::dec0_mcu_port_r)
{
- int latchEnable=m_i8751_ports[2]>>4;
+ uint8_t result = 0xff;
- // P0 connected to 4 latches
- if (offset==0)
+ // P0 connected to latches
+ if (offset == 0)
{
- if ((latchEnable&1)==0)
- return m_i8751_command>>8;
- else if ((latchEnable&2)==0)
- return m_i8751_command&0xff;
- else if ((latchEnable&4)==0)
- return m_i8751_return>>8;
- else if ((latchEnable&8)==0)
- return m_i8751_return&0xff;
+ if (!BIT(m_i8751_ports[2], 4))
+ result &= m_i8751_command >> 8;
+ if (!BIT(m_i8751_ports[2], 5))
+ result &= m_i8751_command & 0x00ff;
}
- return 0xff;
+ return result;
}
WRITE8_MEMBER(dec0_state::dec0_mcu_port_w)
{
- m_i8751_ports[offset]=data;
-
- if (offset==2)
+ if (offset == 2)
{
- if ((data&0x4)==0)
- m_maincpu->set_input_line(5, HOLD_LINE);
- if ((data&0x8)==0)
+ if (!BIT(data, 2) && BIT(m_i8751_ports[2], 2))
+ m_maincpu->set_input_line(M68K_IRQ_5, HOLD_LINE);
+ if (!BIT(data, 3))
m_mcu->set_input_line(MCS51_INT1_LINE, CLEAR_LINE);
- if ((data&0x40)==0)
- m_i8751_return=(m_i8751_return&0xff00)|(m_i8751_ports[0]);
- if ((data&0x80)==0)
- m_i8751_return=(m_i8751_return&0xff)|(m_i8751_ports[0]<<8);
+ if (BIT(data, 6) && !BIT(m_i8751_ports[2], 6))
+ m_i8751_return = (m_i8751_return & 0xff00) | m_i8751_ports[0];
+ if (BIT(data, 7) && !BIT(m_i8751_ports[2], 7))
+ m_i8751_return = (m_i8751_return & 0x00ff) | (m_i8751_ports[0] << 8);
}
+
+ m_i8751_ports[offset] = data;
}
void dec0_state::baddudes_i8751_write(int data)
@@ -300,12 +298,22 @@ void dec0_state::birdtry_i8751_write(int data)
void dec0_state::dec0_i8751_write(int data)
{
- m_i8751_command=data;
+ m_i8751_command = data;
- /* Writes to this address cause an IRQ to the i8751 microcontroller */
- if (m_game == 1) m_mcu->set_input_line(MCS51_INT1_LINE, ASSERT_LINE);
- if (m_game == 2) baddudes_i8751_write(data);
- if (m_game == 3) birdtry_i8751_write(data);
+ /* Writes to this address raise an IRQ on the i8751 microcontroller */
+ switch (m_game)
+ {
+ case mcu_type::EMULATED:
+ if (BIT(m_i8751_ports[2], 3))
+ m_mcu->set_input_line(MCS51_INT1_LINE, ASSERT_LINE);
+ break;
+ case mcu_type::BADDUDES_SIM:
+ baddudes_i8751_write(data);
+ break;
+ case mcu_type::BIRDTRY_SIM:
+ birdtry_i8751_write(data);
+ break;
+ }
//logerror("%s: warning - write %02x to i8751\n",machine().describe_context(),data);
}
@@ -388,17 +396,17 @@ DRIVER_INIT_MEMBER(dec0_state,robocop)
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x180000, 0x180fff, read16_delegate(FUNC(dec0_state::robocop_68000_share_r),this), write16_delegate(FUNC(dec0_state::robocop_68000_share_w),this));
}
-DRIVER_INIT_MEMBER(dec0_state,baddudes)
+DRIVER_INIT_MEMBER(dec0_state,drgninja)
{
- m_game = 2;
+ m_game = mcu_type::BADDUDES_SIM;
}
DRIVER_INIT_MEMBER(dec0_state,hbarrel)
{
- m_game = 1;
+ m_game = mcu_type::EMULATED;
}
DRIVER_INIT_MEMBER(dec0_state,birdtry)
{
- m_game=3;
+ m_game = mcu_type::BIRDTRY_SIM;
}
diff --git a/src/mame/machine/egret.cpp b/src/mame/machine/egret.cpp
index 1aee97637e2..ee3352fb0ea 100644
--- a/src/mame/machine/egret.cpp
+++ b/src/mame/machine/egret.cpp
@@ -162,7 +162,7 @@ void egret_device::send_port(address_space &space, uint8_t offset, uint8_t data)
printf("EG-> VIA_CLOCK: %d (PC=%x)\n", ((data>>4)&1)^1, m_maincpu->pc());
#endif
via_clock = (data>>4) & 1;
- write_via_clock(via_clock^1);
+ write_via_clock(via_clock);
}
}
break;
diff --git a/src/mame/machine/harddriv.cpp b/src/mame/machine/harddriv.cpp
index 9d41af07fe8..396264b5573 100644
--- a/src/mame/machine/harddriv.cpp
+++ b/src/mame/machine/harddriv.cpp
@@ -388,7 +388,7 @@ WRITE16_MEMBER( harddriv_state::hd68k_wr1_write )
machine().output().set_value("SEL3", m_sel3_data);
break;
- case 4: /* SEL4 */
+ case 4: /* SEL4 */
m_sel4_data = data;
machine().output().set_value("SEL4", m_sel4_data);
break;
diff --git a/src/mame/machine/ibm6580_fdc.cpp b/src/mame/machine/ibm6580_fdc.cpp
index 3d5fafdea73..baa10e83f37 100644
--- a/src/mame/machine/ibm6580_fdc.cpp
+++ b/src/mame/machine/ibm6580_fdc.cpp
@@ -30,24 +30,24 @@ const tiny_rom_entry *dw_fdc_device::device_rom_region() const
}
static ADDRESS_MAP_START( dw_fdc_io, AS_IO, 8, dw_fdc_device )
-// AM_RANGE(MCS48_PORT_BUS, MCS48_PORT_BUS) AM_READWRITE(bus_r, bus_w)
+// AM_RANGE(MCS48_PORT_BUS, MCS48_PORT_BUS) AM_READWRITE(bus_r, bus_w)
AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_WRITE(p1_w)
AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_WRITE(p2_w)
-// AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_READ(t0_r)
+// AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_READ(t0_r)
AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(t1_r)
ADDRESS_MAP_END
static MACHINE_CONFIG_FRAGMENT( dw_fdc )
- MCFG_CPU_ADD("mcu", I8048, XTAL_24MHz/4) // divisor is unverified
+ MCFG_CPU_ADD("mcu", I8048, XTAL_24MHz/4) // divisor is unverified
MCFG_CPU_IO_MAP(dw_fdc_io)
MCFG_DEVICE_ADD("ppi8255", I8255, 0)
MCFG_UPD765A_ADD("upd765", false, false)
-// MCFG_UPD765_INTRQ_CALLBACK(DEVWRITELINE("pic8259", pic8259_device, ir4_w))
-// MCFG_UPD765_DRQ_CALLBACK(DEVWRITELINE("dma8257", dma8257_device, XXX))
-// MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":0", wangpc_floppies, "525dd", wangpc_state::floppy_formats)
-// MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":1", wangpc_floppies, "525dd", wangpc_state::floppy_formats)
+// MCFG_UPD765_INTRQ_CALLBACK(DEVWRITELINE("pic8259", pic8259_device, ir4_w))
+// MCFG_UPD765_DRQ_CALLBACK(DEVWRITELINE("dma8257", dma8257_device, XXX))
+// MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":0", wangpc_floppies, "525dd", wangpc_state::floppy_formats)
+// MCFG_FLOPPY_DRIVE_ADD(UPD765_TAG ":1", wangpc_floppies, "525dd", wangpc_state::floppy_formats)
MACHINE_CONFIG_END
machine_config_constructor dw_fdc_device::device_mconfig_additions() const
diff --git a/src/mame/machine/ibm6580_kbd.cpp b/src/mame/machine/ibm6580_kbd.cpp
index a697bb76464..1ae0e34fe9c 100644
--- a/src/mame/machine/ibm6580_kbd.cpp
+++ b/src/mame/machine/ibm6580_kbd.cpp
@@ -37,7 +37,7 @@ static ADDRESS_MAP_START( dw_keyboard_io, AS_IO, 8, dw_keyboard_device )
ADDRESS_MAP_END
static MACHINE_CONFIG_FRAGMENT( dw_keyboard )
- MCFG_CPU_ADD("mcu", I8049, XTAL_6MHz) // XXX RC oscillator
+ MCFG_CPU_ADD("mcu", I8049, XTAL_6MHz) // XXX RC oscillator
MCFG_CPU_IO_MAP(dw_keyboard_io)
MACHINE_CONFIG_END
@@ -52,7 +52,7 @@ INPUT_PORTS_START( dw_keyboard )
* Keyboard Matrix -- p. 5-6 ('83) and p. 26 ('82)
*/
PORT_START("DIP")
- PORT_DIPNAME( 0xff, 1, "Layout" )
+ PORT_DIPNAME( 0xff, 1, "Layout" )
PORT_DIPSETTING( 1, "U.S." )
PORT_DIPSETTING( 250, "U.S. Dvorak" )
@@ -97,7 +97,7 @@ INPUT_PORTS_START( dw_keyboard )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD))
PORT_START("COL.4")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',')
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',')
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':')
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P')
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')')
@@ -270,7 +270,7 @@ WRITE8_MEMBER( dw_keyboard_device::bus_w )
*/
if ((data & 0x72) != 0x72)
- DBG_LOG(1,"bus",( "<- %02x = send %d strobe %d clock %d | dip clk %d dip load %d\n",
+ DBG_LOG(1,"bus",( "<- %02x = send %d strobe %d clock %d | dip clk %d dip load %d\n",
data, BIT(data, 0), BIT(data, 1), BIT(data, 4), BIT(data, 5), BIT(data, 6)));
m_bus = data;
diff --git a/src/mame/machine/interpro_ioga.cpp b/src/mame/machine/interpro_ioga.cpp
new file mode 100644
index 00000000000..67a47f2cfd0
--- /dev/null
+++ b/src/mame/machine/interpro_ioga.cpp
@@ -0,0 +1,691 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+
+/*
+ * An implementation of the IOGA device found on Intergraph InterPro family workstations. There is no
+ * public documentation on this device, so the implementation is being built to follow the logic of the
+ * system boot ROM and its diagnostic tests.
+ *
+ * The device handles most of the I/O for the system, including timers, interrupts, DMA and target device
+ * interfacing. There remains a significant amount of work to be completed before the boot diagnostics will
+ * pass without errors, let alone successfully booting CLIX.
+ *
+ * Please be aware that code in here is not only broken, it's likely wrong in many cases.
+ *
+ * TODO
+ * - too long to list
+ */
+#include "interpro_ioga.h"
+
+#define VERBOSE 0
+#if VERBOSE
+#define LOG_TIMER_MASK 0xff
+#define LOG_TIMER(timer, ...) if (LOG_TIMER_MASK & (1 << timer)) logerror(__VA_ARGS__)
+#define LOG_INTERRUPT(...) logerror(__VA_ARGS__)
+#define LOG_IOGA(...) logerror(__VA_ARGS__)
+#define LOG_DMA(...) logerror(__VA_ARGS__)
+#else
+#define LOG_TIMER_MASK 0x00
+#define LOG_TIMER(timer, ...)
+#define LOG_INTERRUPT(...)
+#define LOG_IOGA(...)
+#define LOG_DMA(...)
+#endif
+
+DEVICE_ADDRESS_MAP_START(map, 32, interpro_ioga_device)
+ AM_RANGE(0x0c, 0x1b) AM_READWRITE(dma_plotter_r, dma_plotter_w)
+ AM_RANGE(0x1c, 0x1f) AM_READWRITE(dma_plotter_eosl_r, dma_plotter_eosl_w)
+ AM_RANGE(0x20, 0x2f) AM_READWRITE(dma_scsi_r, dma_scsi_w)
+ AM_RANGE(0x30, 0x3f) AM_READWRITE(dma_floppy_r, dma_floppy_w)
+
+ AM_RANGE(0x5c, 0x7f) AM_READWRITE16(icr_r, icr_w, 0xffffffff)
+ AM_RANGE(0x80, 0x83) AM_READWRITE16(icr18_r, icr18_w, 0x0000ffff)
+ AM_RANGE(0x80, 0x83) AM_READWRITE8(softint_r, softint_w, 0x00ff0000)
+ AM_RANGE(0x80, 0x83) AM_READWRITE8(nmictrl_r, nmictrl_w, 0xff000000)
+
+ AM_RANGE(0x88, 0x8b) AM_READWRITE(timer_prescaler_r, timer_prescaler_w)
+ AM_RANGE(0x8c, 0x8f) AM_READWRITE(timer0_r, timer0_w)
+ AM_RANGE(0x90, 0x93) AM_READWRITE(timer1_r, timer1_w)
+ AM_RANGE(0x94, 0x97) AM_READ(error_address_r)
+ AM_RANGE(0x98, 0x9b) AM_READ(error_businfo_r)
+ AM_RANGE(0x9c, 0x9f) AM_READWRITE16(arbctl_r, arbctl_w, 0x0000ffff)
+
+ AM_RANGE(0xa8, 0xab) AM_READWRITE(timer3_r, timer3_w)
+
+ AM_RANGE(0xb0, 0xbf) AM_READWRITE16(softint_vector_r, softint_vector_w, 0xffffffff)
+ADDRESS_MAP_END
+
+const device_type INTERPRO_IOGA = &device_creator<interpro_ioga_device>;
+
+interpro_ioga_device::interpro_ioga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, INTERPRO_IOGA, "InterPro IOGA", tag, owner, clock, "ioga", __FILE__),
+ m_out_nmi_func(*this),
+ m_out_int_func(*this),
+ m_memory_space(nullptr),
+ m_dma_channel{
+ { 0,0,0,0,false, 0, {*this}, {*this} },
+ { 0,0,0,0,false, 0, {*this}, {*this} },
+ { 0,0,0,0,false, 0, {*this}, {*this} },
+ { 0,0,0,0,false, 0, {*this}, {*this} } },
+ m_fdc_tc_func(*this)
+{
+}
+
+void interpro_ioga_device::device_start()
+{
+ // resolve callbacks
+ m_out_nmi_func.resolve();
+ m_out_int_func.resolve();
+
+ // TODO: parameterise the cammu name and space number
+ // grab the main memory space from the mmu so we can do DMA to/from it
+ device_memory_interface *mmu;
+ siblingdevice("mmu")->interface(mmu);
+ m_memory_space = &mmu->space(AS_0);
+
+ for (int i = 0; i < IOGA_DMA_CHANNELS; i++)
+ {
+ m_dma_channel[i].device_r.resolve_safe(0xff);
+ m_dma_channel[i].device_w.resolve();
+ }
+
+ m_fdc_tc_func.resolve();
+
+ // allocate ioga timers
+ m_timer[0] = timer_alloc(IOGA_TIMER_0);
+ m_timer[1] = timer_alloc(IOGA_TIMER_1);
+ m_timer[2] = timer_alloc(IOGA_TIMER_2);
+ m_timer[3] = timer_alloc(IOGA_TIMER_3);
+
+ for (auto & elem : m_timer)
+ elem->enable(false);
+
+ // allocate timer for DMA controller
+ m_dma_timer = timer_alloc(IOGA_TIMER_DMA);
+ m_dma_timer->adjust(attotime::never);
+}
+
+void interpro_ioga_device::device_reset()
+{
+ m_nmi_pending = false;
+
+ m_interrupt_active = 0;
+ m_irq_forced = 0;
+
+ // configure timer 0 at 60Hz
+ m_timer_reg[0] = 0;
+ m_timer[0]->adjust(attotime::zero, IOGA_TIMER_0, attotime::from_hz(60));
+}
+
+/******************************************************************************
+ Timers
+******************************************************************************/
+READ32_MEMBER(interpro_ioga_device::timer1_r)
+{
+ uint32_t result = m_timer1_count & IOGA_TIMER1_VMASK;
+
+ // set the start bit if the timer is currently enabled
+ if (m_timer[1]->enabled())
+ result |= IOGA_TIMER1_START;
+ else if (m_timer[1]->param())
+ result |= IOGA_TIMER1_EXPIRED;
+
+ return result;
+}
+
+READ32_MEMBER(interpro_ioga_device::timer3_r)
+{
+ uint32_t result = m_timer3_count & IOGA_TIMER3_VMASK;
+
+ if (m_timer[3]->enabled())
+ result |= IOGA_TIMER3_START;
+ else if (m_timer[3]->param())
+ result |= IOGA_TIMER3_EXPIRED;
+
+ return result;
+}
+
+void interpro_ioga_device::write_timer(int timer, uint32_t value, device_timer_id id)
+{
+ switch (id)
+ {
+ case IOGA_TIMER_1:
+ // disable the timer
+ m_timer[timer]->enable(false);
+
+ // store the timer count value
+ m_timer1_count = value;
+
+ // start the timer if necessary
+ if (value & IOGA_TIMER1_START)
+ {
+ LOG_TIMER(1, "timer 1: started prescaler %d value %d\n", m_prescaler & 0x7fff, value & IOGA_TIMER1_VMASK);
+
+ // FIXME: this division by 50 is sufficient to pass iogadiag timer 1 tests
+ m_timer[timer]->adjust(attotime::zero, false, attotime::from_usec((m_prescaler & 0x7fff) / 50));
+ }
+ break;
+
+ case IOGA_TIMER_3:
+ // stop the timer so it won't trigger while we're fiddling with it
+ m_timer[timer]->enable(false);
+
+ // write the new value to the timer register
+ m_timer3_count = value & IOGA_TIMER3_VMASK;
+
+ // start the timer if necessary
+ if (value & IOGA_TIMER3_START)
+ {
+ LOG_TIMER(3, "timer 3: started value %d\n", value & IOGA_TIMER3_VMASK);
+
+ m_timer[timer]->adjust(attotime::zero, false, attotime::from_hz(XTAL_25MHz));
+ }
+ break;
+
+ default:
+ // save the value
+ m_timer_reg[timer] = value;
+
+ // timer_set(attotime::from_usec(500), id);
+
+ LOG_TIMER(0xf, "timer %d: set to 0x%x (%d)\n", timer, m_timer_reg[timer], m_timer_reg[timer]);
+ break;
+ }
+}
+
+void interpro_ioga_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ switch (id)
+ {
+ case IOGA_TIMER_0:
+ m_timer_reg[0]++;
+ set_irq_line(IOGA_TIMER0_IRQ, ASSERT_LINE);
+ break;
+
+ case IOGA_TIMER_1:
+ // decrement timer count value
+ m_timer1_count--;
+
+ // check if timer has expired
+ if (m_timer1_count == 0)
+ {
+ LOG_TIMER(1, "timer 1: stopped\n");
+
+ // disable timer and set the zero flag
+ timer.enable(false);
+ timer.set_param(true);
+
+ // throw an interrupt
+ set_irq_line(IOGA_TIMER1_IRQ, ASSERT_LINE);
+ }
+ break;
+
+ case IOGA_TIMER_3:
+ // decrement timer count value
+ m_timer3_count--;
+
+ // check for expiry
+ if (m_timer3_count == 0)
+ {
+ LOG_TIMER(3, "timer 3: stopped\n");
+
+ // disable timer and set the zero flag
+ timer.enable(false);
+ timer.set_param(true);
+
+ // throw an interrupt
+ set_irq_line(IOGA_TIMER3_IRQ, ASSERT_LINE);
+ }
+ break;
+
+ case IOGA_TIMER_DMA:
+ // transfer data between device and main memory
+
+ // TODO: figure out what indicates dma write (memory -> device)
+ // TODO: implement multiple dma channels
+ // TODO: virtual memory?
+
+ if (!m_dma_channel[param].dma_active)
+ {
+ LOG_DMA("dma: transfer started, channel = %d, control 0x%08x, real address 0x%08x count 0x%08x\n",
+ param, m_dma_channel[param].control, m_dma_channel[param].real_address, m_dma_channel[param].transfer_count);
+ m_dma_channel[param].dma_active = true;
+ }
+
+ // while the device is requesting a data transfer and the transfer count is not zero
+ while (m_dma_channel[param].drq_state && m_dma_channel[param].transfer_count)
+ {
+ // transfer a byte between device and memory
+ if (true)
+ m_memory_space->write_byte(m_dma_channel[param].real_address, m_dma_channel[param].device_r());
+ else
+ m_dma_channel[param].device_w(m_memory_space->read_byte(m_dma_channel[param].real_address));
+
+ // increment addresses and decrement count
+ m_dma_channel[param].real_address++;
+ m_dma_channel[param].virtual_address++;
+ m_dma_channel[param].transfer_count--;
+ }
+
+ // if there are no more bytes remaining, terminate the transfer
+ if (m_dma_channel[param].transfer_count == 0)
+ {
+ LOG_DMA("dma: transfer stopped, control 0x%08x, real address 0x%08x count 0x%08x\n",
+ m_dma_channel[param].control, m_dma_channel[param].fdc_real_address, m_dma_channel[param].transfer_count);
+
+ if (param == IOGA_DMA_FLOPPY)
+ {
+ LOG_DMA("dma: asserting fdc terminal count line\n");
+
+ m_fdc_tc_func(ASSERT_LINE);
+ m_fdc_tc_func(CLEAR_LINE);
+ }
+
+ m_dma_channel[param].dma_active = false;
+ }
+ break;
+ }
+}
+
+/******************************************************************************
+ Interrupts
+******************************************************************************/
+
+static const uint16_t irq_enable_mask[IOGA_INTERRUPT_COUNT] =
+{
+ IOGA_INTERRUPT_ENABLE_EXTERNAL,
+ IOGA_INTERRUPT_ENABLE_EXTERNAL,
+ IOGA_INTERRUPT_ENABLE_EXTERNAL | IOGA_INTERRUPT_ENABLE_INTERNAL, // external interrupt 0: SCSI
+ IOGA_INTERRUPT_ENABLE_EXTERNAL | IOGA_INTERRUPT_ENABLE_INTERNAL, // external interrupt 1: floppy
+ IOGA_INTERRUPT_ENABLE_EXTERNAL | IOGA_INTERRUPT_ENABLE_INTERNAL, // external interrupt 2: plotter
+ IOGA_INTERRUPT_ENABLE_EXTERNAL,
+ IOGA_INTERRUPT_ENABLE_EXTERNAL,
+ IOGA_INTERRUPT_ENABLE_EXTERNAL,
+
+ IOGA_INTERRUPT_ENABLE_EXTERNAL,
+ IOGA_INTERRUPT_ENABLE_EXTERNAL,
+ IOGA_INTERRUPT_ENABLE_EXTERNAL,
+ IOGA_INTERRUPT_ENABLE_EXTERNAL,
+ IOGA_INTERRUPT_ENABLE_EXTERNAL,
+ IOGA_INTERRUPT_ENABLE_EXTERNAL,
+ IOGA_INTERRUPT_ENABLE_EXTERNAL,
+ IOGA_INTERRUPT_ENABLE_EXTERNAL,
+
+ // internal interrupt 5: serial DMA - one interrupt enable per DMA channel
+ IOGA_INTERRUPT_ENABLE_EXTERNAL << 0 | IOGA_INTERRUPT_ENABLE_EXTERNAL << 1 | IOGA_INTERRUPT_ENABLE_EXTERNAL << 2,
+ IOGA_INTERRUPT_ENABLE_EXTERNAL,
+ IOGA_INTERRUPT_ENABLE_EXTERNAL | IOGA_INTERRUPT_ENABLE_INTERNAL // external interrupt 12: Ethernet
+};
+
+void interpro_ioga_device::set_nmi_line(int state)
+{
+ switch (state)
+ {
+ case ASSERT_LINE:
+
+ LOG_INTERRUPT("nmi: ctrl = 0x%02x\n", m_nmictrl);
+
+ if ((m_nmictrl & IOGA_NMI_ENABLE) == IOGA_NMI_ENABLE)
+ {
+ // if edge triggered mode, clear enable in
+ if (m_nmictrl & IOGA_NMI_EDGE)
+ m_nmictrl &= ~IOGA_NMI_ENABLE_IN;
+
+ m_nmi_pending = true;
+ update_interrupt(ASSERT_LINE);
+ }
+ break;
+
+ case CLEAR_LINE:
+ m_nmi_pending = false;
+ update_interrupt(ASSERT_LINE);
+ break;
+ }
+}
+
+void interpro_ioga_device::set_irq_line(int irq, int state)
+{
+ LOG_INTERRUPT("set_irq_line(%d, %d)\n", irq, state);
+ switch (state)
+ {
+ case ASSERT_LINE:
+ if (m_int_vector[irq] & irq_enable_mask[irq])
+ {
+ // set pending bit
+ m_int_vector[irq] |= IOGA_INTERRUPT_PENDING;
+
+ // update irq line state
+ update_interrupt(state);
+ }
+ else
+ LOG_INTERRUPT("received disabled interrupt irq %d vector 0x%04x\n", irq, m_int_vector[irq]);
+ break;
+
+ case CLEAR_LINE:
+ // clear pending bit
+ m_int_vector[irq] &= ~IOGA_INTERRUPT_PENDING;
+
+ // update irq line state
+ update_interrupt(state);
+ break;
+ }
+}
+
+void interpro_ioga_device::set_irq_soft(int irq, int state)
+{
+ LOG_INTERRUPT("set_irq_soft(%d, %d)\n", irq, state);
+ switch (state)
+ {
+ case ASSERT_LINE:
+ // set pending bit
+ if (irq < 8)
+ m_softint |= 1 << irq;
+ else
+ m_softint_vector[irq - 8] |= IOGA_INTERRUPT_PENDING;
+
+ update_interrupt(state);
+ break;
+
+ case CLEAR_LINE:
+ // clear pending bit
+ if (irq < 8)
+ m_softint &= ~(1 << irq);
+ else
+ m_softint_vector[irq - 8] &= ~IOGA_INTERRUPT_PENDING;
+
+ // update irq line state
+ update_interrupt(state);
+ break;
+ }
+}
+
+IRQ_CALLBACK_MEMBER(interpro_ioga_device::inta_cb)
+{
+ switch (irqline)
+ {
+ case INPUT_LINE_IRQ0:
+ // FIXME: clear pending bit - can't rely on device callbacks
+ switch (m_interrupt_active)
+ {
+ case IOGA_INTERRUPT_INTERNAL:
+ case IOGA_INTERRUPT_EXTERNAL:
+ m_int_vector[m_irq_current] &= ~IOGA_INTERRUPT_PENDING;
+ break;
+
+ case IOGA_INTERRUPT_SOFT_LO:
+ m_softint &= ~(1 << m_irq_current);
+ break;
+
+ case IOGA_INTERRUPT_SOFT_HI:
+ m_softint_vector[m_irq_current] &= ~IOGA_INTERRUPT_PENDING;
+ break;
+ }
+
+ // clear irq line
+ update_interrupt(CLEAR_LINE);
+
+ // fall through to return interrupt vector
+ case -1:
+ // return vector for current interrupt without clearing irq line
+ switch (m_interrupt_active)
+ {
+ case IOGA_INTERRUPT_EXTERNAL:
+ case IOGA_INTERRUPT_INTERNAL:
+ return m_int_vector[m_irq_current] & 0xff;
+
+ case IOGA_INTERRUPT_SOFT_LO:
+ return 0x8f + m_irq_current * 0x10;
+
+ case IOGA_INTERRUPT_SOFT_HI:
+ return m_softint_vector[m_irq_current] & 0xff;
+ }
+ break;
+
+ case INPUT_LINE_NMI:
+ // clear pending flag
+ m_nmi_pending = false;
+
+ // clear line
+ update_interrupt(CLEAR_LINE);
+
+ // return vector
+ return 0;
+ }
+
+ return 0;
+}
+
+void interpro_ioga_device::update_interrupt(int state)
+{
+ switch (state)
+ {
+ case CLEAR_LINE:
+ if (m_interrupt_active)
+ {
+ // the cpu has acknowledged the active interrupt, deassert the nmi/irq line
+ m_interrupt_active == IOGA_INTERRUPT_NMI ? m_out_nmi_func(CLEAR_LINE) : m_out_int_func(CLEAR_LINE);
+
+ // clear the active status
+ m_interrupt_active = 0;
+ }
+ // fall through to handle any pending interrupts
+
+ case ASSERT_LINE:
+ // if an interrupt is currently active, don't do anything
+ if (m_interrupt_active == 0)
+ {
+ // check for pending nmi
+ if (m_nmi_pending)
+ {
+ m_interrupt_active = IOGA_INTERRUPT_NMI;
+
+ m_out_nmi_func(ASSERT_LINE);
+ return;
+ }
+
+ // check for any pending irq
+ for (int i = 0; i < IOGA_INTERRUPT_COUNT; i++)
+ {
+ if (m_int_vector[i] & IOGA_INTERRUPT_PENDING)
+ {
+ m_interrupt_active = IOGA_INTERRUPT_INTERNAL; // TODO: flag internal/external
+ m_irq_current = i;
+
+ m_out_int_func(ASSERT_LINE);
+ return;
+ }
+ }
+
+ // check for any pending soft interrupts (low type)
+ for (int i = 0; i < 8; i++)
+ {
+ if (m_softint & (1 << i))
+ {
+ m_interrupt_active = IOGA_INTERRUPT_SOFT_LO;
+ m_irq_current = i;
+
+ m_out_int_func(ASSERT_LINE);
+ return;
+ }
+ }
+
+ // check for any pending soft interrupts (high type)
+ for (int i = 0; i < 8; i++)
+ {
+ if (m_softint_vector[i] & IOGA_INTERRUPT_PENDING)
+ {
+ m_interrupt_active = IOGA_INTERRUPT_SOFT_HI;
+ m_irq_current = i;
+
+ m_out_int_func(ASSERT_LINE);
+ return;
+ }
+ }
+ }
+ break;
+ }
+}
+
+WRITE16_MEMBER(interpro_ioga_device::icr_w)
+{
+ LOG_INTERRUPT("interrupt vector %d set to 0x%04x at pc 0x%08x\n", offset, data, space.device().safe_pc());
+
+ // FIXME: now that the interrupt handling only depends on IOGA_INTERRUPT_PENDING, we might be able
+ // to avoid this hack
+ if (data & IOGA_INTERRUPT_PENDING)
+ {
+ m_irq_forced |= 1 << offset;
+ m_int_vector[offset] = data & ~IOGA_INTERRUPT_PENDING;
+ }
+ else if (m_irq_forced & 1 << offset)
+ {
+ m_int_vector[offset] = data;
+
+ // clear forced flag
+ m_irq_forced &= ~(1 << offset);
+
+ // force an interrupt
+ set_irq_line(offset, ASSERT_LINE);
+ }
+ else
+ m_int_vector[offset] = data;
+}
+
+WRITE8_MEMBER(interpro_ioga_device::softint_w)
+{
+ // save the existing value
+ uint8_t previous = m_softint;
+
+ // store the written value
+ m_softint = data;
+
+ // force soft interrupt for any bit written from 1 to 0
+ for (int i = 0; i < 8; i++)
+ {
+ uint8_t mask = 1 << i;
+
+ // check for transition from 1 to 0 and force a soft interrupt
+ if (previous & mask && !(data & mask))
+ set_irq_soft(i, ASSERT_LINE);
+ }
+}
+
+WRITE8_MEMBER(interpro_ioga_device::nmictrl_w)
+{
+ // save the existing value
+ uint8_t previous = m_nmictrl;
+
+ // store the written value
+ m_nmictrl = data;
+
+ // force an nmi when pending bit is written low
+ if (previous & IOGA_NMI_PENDING && !(data & IOGA_NMI_PENDING))
+ set_nmi_line(ASSERT_LINE);
+}
+
+WRITE16_MEMBER(interpro_ioga_device::softint_vector_w)
+{
+ // save the existing value
+ uint16_t previous = m_softint_vector[offset];
+
+ // store the written value
+ m_softint_vector[offset] = data;
+
+ // check for transition from 1 to 0 and force a soft interrupt
+ if (previous & IOGA_INTERRUPT_PENDING && !(data & IOGA_INTERRUPT_PENDING))
+ set_irq_soft(offset + 8, ASSERT_LINE);
+}
+
+/******************************************************************************
+ DMA
+******************************************************************************/
+void interpro_ioga_device::drq(int state, int channel)
+{
+ // this member is called when the device has data ready for reading via dma
+ m_dma_channel[channel].drq_state = state;
+
+ if (state)
+ {
+ // TODO: check if dma is enabled
+ m_dma_timer->adjust(attotime::zero, channel);
+ }
+}
+/*
+0x94: error address reg: expect 0x7f200000 after bus error (from dma virtual address)
+0x98: error cycle type: expect 0x52f0 (after failed dma?)
+ 0x5331 - forced berr with nmi/interrupts disabled?
+ 0xc2f0
+ 0x62f0
+*/
+// TODO: 7.0266 - forced BERR not working
+
+uint32_t interpro_ioga_device::dma_r(address_space &space, offs_t offset, uint32_t mem_mask, int channel)
+{
+ switch (offset)
+ {
+ case 0:
+ return m_dma_channel[channel].real_address;
+
+ case 1:
+ return m_dma_channel[channel].virtual_address;
+
+ case 2:
+ return m_dma_channel[channel].transfer_count;
+
+ case 3:
+ return m_dma_channel[channel].control;
+ }
+
+ logerror("dma_r: unknown channel %d\n", channel);
+ return 0;
+}
+
+void interpro_ioga_device::dma_w(address_space &space, offs_t offset, uint32_t data, uint32_t mem_mask, int channel)
+{
+ switch (offset)
+ {
+ case 0:
+ m_dma_channel[channel].real_address = data;
+ break;
+
+ case 1:
+ m_dma_channel[channel].virtual_address = data & ~0x3;
+ break;
+
+ case 2:
+ m_dma_channel[channel].transfer_count = data;
+ break;
+
+ case 3:
+ m_dma_channel[channel].control = data & IOGA_DMA_CTRL_WMASK;
+
+ logerror("dma: channel = %d, control = 0x%08x, ra = 0x%08x, va = 0x%08x, tc = 0x%08x\n",
+ channel, data, m_dma_channel[channel].real_address, m_dma_channel[channel].virtual_address, m_dma_channel[channel].transfer_count);
+
+ // iogadiag test 7.0265
+ if (data == IOGA_DMA_CTRL_START)
+ {
+ uint32_t mask = 0;
+
+ switch (channel)
+ {
+ case IOGA_DMA_PLOTTER:
+ mask = IOGA_ARBCTL_BGR_PLOT;
+ break;
+
+ case IOGA_DMA_SCSI:
+ mask = IOGA_ARBCTL_BGR_SCSI;
+ break;
+
+ case IOGA_DMA_FLOPPY:
+ mask = IOGA_ARBCTL_BGR_FDC;
+ break;
+ }
+
+ // if bus grant is not enabled, set the busy flag
+ if (!(m_arbctl & mask))
+ m_dma_channel[channel].control |= IOGA_DMA_CTRL_BUSY;
+ }
+ break;
+ }
+}
diff --git a/src/mame/machine/interpro_ioga.h b/src/mame/machine/interpro_ioga.h
new file mode 100644
index 00000000000..2809601d98e
--- /dev/null
+++ b/src/mame/machine/interpro_ioga.h
@@ -0,0 +1,255 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+
+#pragma once
+
+#ifndef INTERPRO_IOGA_H_
+#define INTERPRO_IOGA_H_
+
+#include "emu.h"
+
+#define MCFG_INTERPRO_IOGA_ADD(_tag) \
+ MCFG_DEVICE_ADD(_tag, INTERPRO_IOGA, 0)
+
+#define MCFG_INTERPRO_IOGA_NMI_CB(_out_nmi) \
+ devcb = &interpro_ioga_device::static_set_out_nmi_callback(*device, DEVCB_##_out_nmi);
+
+#define MCFG_INTERPRO_IOGA_IRQ_CB(_out_int) \
+ devcb = &interpro_ioga_device::static_set_out_int_callback(*device, DEVCB_##_out_int);
+
+#define MCFG_INTERPRO_IOGA_DMA_CB(_channel, _dma_r, _dma_w) \
+ devcb = &interpro_ioga_device::static_set_dma_r_callback(*device, _channel, DEVCB_##_dma_r); \
+ devcb = &interpro_ioga_device::static_set_dma_w_callback(*device, _channel, DEVCB_##_dma_w);
+
+#define MCFG_INTERPRO_IOGA_FDCTC_CB(_tc) \
+ devcb = &interpro_ioga_device::static_set_fdc_tc_callback(*device, DEVCB_##_tc);
+
+#define MCFG_INTERPRO_IOGA_DMA_BUS(_mmu, _space)
+
+// timer 0 seem to be a 60Hz cycle
+#define IOGA_TIMER0_IRQ 14
+
+// best guess for timer 1 is 10MHz based on typical prescaler value of 1000 and timer value of 100 for a delay of 100ms
+#define IOGA_TIMER1_IRQ 15
+#define IOGA_TIMER1_VMASK 0xffff
+#define IOGA_TIMER1_START 0x10000
+#define IOGA_TIMER1_EXPIRED 0x20000
+
+// best guess for timer 3 is 12.5MHz based on typical value of 12500 for a delay of 1ms
+#define IOGA_TIMER3_CLOCK XTAL_12_5MHz
+#define IOGA_TIMER3_IRQ 1
+#define IOGA_TIMER3_VMASK 0x3fffffff
+#define IOGA_TIMER3_START 0x40000000
+#define IOGA_TIMER3_EXPIRED 0x80000000
+
+#define IOGA_INTERRUPT_COUNT 19
+#define IOGA_INTERRUPT_PENDING 0x0100
+#define IOGA_INTERRUPT_ENABLE_EXTERNAL 0x0200
+#define IOGA_INTERRUPT_EDGE 0x0400
+#define IOGA_INTERRUPT_NEGPOL 0x0800
+#define IOGA_INTERRUPT_ENABLE_INTERNAL 0x1000
+
+#define IOGA_NMI_EDGE 0x02
+#define IOGA_NMI_PENDING 0x08
+#define IOGA_NMI_ENABLE_IN 0x10
+#define IOGA_NMI_ENABLE (IOGA_NMI_EDGE | IOGA_NMI_ENABLE_IN)
+
+#define IOGA_INTERRUPT_NMI 1
+#define IOGA_INTERRUPT_INTERNAL 2
+#define IOGA_INTERRUPT_EXTERNAL 3
+#define IOGA_INTERRUPT_SOFT_LO 4
+#define IOGA_INTERRUPT_SOFT_HI 5
+
+#define IOGA_DMA_CHANNELS 4
+#define IOGA_DMA_PLOTTER 0
+#define IOGA_DMA_SCSI 1
+#define IOGA_DMA_FLOPPY 2
+#define IOGA_DMA_SERIAL 3
+
+// dma write values
+#define IOGA_DMA_CTRL_WMASK 0xfd000e00
+#define IOGA_DMA_CTRL_RESET_L 0x61000000 // do not clear bus error bit
+#define IOGA_DMA_CTRL_RESET 0x60400000 // clear bus error bit
+
+#define IOGA_DMA_CTRL_START 0x63000800 // perhaps start a transfer? - maybe the 8 is the channel?
+#define IOGA_DMA_CTRL_UNK1 0x60000000 // don't know yet
+#define IOGA_DMA_CTRL_UNK2 0x67000600 // forced berr with nmi and interrupts disabled
+
+// read values
+#define IOGA_DMA_CTRL_BUSY 0x02000000
+#define IOGA_DMA_CTRL_BERR 0x00400000 // iogadiag code expects 0x60400000 on bus error
+// iogadiag expects 0x64400800 after forced berr with nmi/interrupts disabled
+
+
+// bus arbitration bus grant bits
+#define IOGA_ARBCTL_BGR_ETHC 0x0001
+#define IOGA_ARBCTL_BGR_SCSI 0x0002
+#define IOGA_ARBCTL_BGR_PLOT 0x0004
+#define IOGA_ARBCTL_BGR_FDC 0x0008
+#define IOGA_ARBCTL_BGR_SER0 0x0010
+#define IOGA_ARBCTL_BGR_SER1 0x0020
+#define IOGA_ARBCTL_BGR_SER2 0x0040
+#define IOGA_ARBCTL_BGR_ETHB 0x0080
+#define IOGA_ARBCTL_BGR_ETHA 0x0100
+
+class interpro_ioga_device : public device_t
+{
+public:
+ interpro_ioga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ template<class _Object> static devcb_base &static_set_out_nmi_callback(device_t &device, _Object object) { return downcast<interpro_ioga_device &>(device).m_out_nmi_func.set_callback(object); }
+ template<class _Object> static devcb_base &static_set_out_int_callback(device_t &device, _Object object) { return downcast<interpro_ioga_device &>(device).m_out_int_func.set_callback(object); }
+
+ template<class _Object> static devcb_base &static_set_dma_r_callback(device_t &device, int channel, _Object object) { return downcast<interpro_ioga_device &>(device).m_dma_channel[channel].device_r.set_callback(object); }
+ template<class _Object> static devcb_base &static_set_dma_w_callback(device_t &device, int channel, _Object object) { return downcast<interpro_ioga_device &>(device).m_dma_channel[channel].device_w.set_callback(object); }
+
+ template<class _Object> static devcb_base &static_set_fdc_tc_callback(device_t &device, _Object object) { return downcast<interpro_ioga_device &>(device).m_fdc_tc_func.set_callback(object); }
+
+ virtual DECLARE_ADDRESS_MAP(map, 32);
+
+ // external interrupt lines
+ DECLARE_WRITE_LINE_MEMBER(ir0_w) { set_irq_line(2, state); }
+ DECLARE_WRITE_LINE_MEMBER(ir1_w) { set_irq_line(3, state); }
+ DECLARE_WRITE_LINE_MEMBER(ir2_w) { set_irq_line(4, state); }
+ DECLARE_WRITE_LINE_MEMBER(ir3_w) { set_irq_line(5, state); }
+ DECLARE_WRITE_LINE_MEMBER(ir4_w) { set_irq_line(6, state); }
+ DECLARE_WRITE_LINE_MEMBER(ir5_w) { set_irq_line(7, state); }
+ DECLARE_WRITE_LINE_MEMBER(ir6_w) { set_irq_line(8, state); }
+ DECLARE_WRITE_LINE_MEMBER(ir7_w) { set_irq_line(9, state); }
+ DECLARE_WRITE_LINE_MEMBER(ir8_w) { set_irq_line(10, state); }
+ // FIXME: this is a workaround for the mc146818 code which inverts the normal irq state convention
+ DECLARE_WRITE_LINE_MEMBER(ir9_w) { set_irq_line(11, !state); }
+ DECLARE_WRITE_LINE_MEMBER(ir10_w) { set_irq_line(12, state); }
+ DECLARE_WRITE_LINE_MEMBER(ir11_w) { set_irq_line(17, state); }
+ DECLARE_WRITE_LINE_MEMBER(ir12_w) { set_irq_line(18, state); }
+
+ IRQ_CALLBACK_MEMBER(inta_cb);
+
+ DECLARE_WRITE_LINE_MEMBER(drq_plotter) { drq(state, IOGA_DMA_PLOTTER); }
+ DECLARE_WRITE_LINE_MEMBER(drq_scsi) { drq(state, IOGA_DMA_SCSI); }
+ DECLARE_WRITE_LINE_MEMBER(drq_floppy) { drq(state, IOGA_DMA_FLOPPY); }
+
+ DECLARE_READ32_MEMBER(timer_prescaler_r) { return m_prescaler; }
+ DECLARE_READ32_MEMBER(timer0_r) { return m_timer_reg[0]; }
+ DECLARE_READ32_MEMBER(timer1_r);
+ DECLARE_READ16_MEMBER(arbctl_r) { return m_arbctl; }
+ DECLARE_WRITE16_MEMBER(arbctl_w) { m_arbctl = data; }
+ DECLARE_READ32_MEMBER(timer2_r) { return m_timer_reg[2]; }
+ DECLARE_READ32_MEMBER(timer3_r);
+
+ DECLARE_WRITE32_MEMBER(timer_prescaler_w) {
+ // this logic satisfies prescaler tests, but fails timer prescaler tests
+ if ((data & 0x7fff) < 0x100 && (data & 0x7fff) != 0)
+ m_prescaler = (data ^ 0xffff0000);
+ else
+ m_prescaler = (data ^ 0xffff0000) - 0x10000;
+
+ //logerror("prescaler: input 0x%08x output 0x%08x\n", data, m_prescaler);
+ }
+ DECLARE_WRITE32_MEMBER(timer0_w) { write_timer(0, data, IOGA_TIMER_0); }
+ DECLARE_WRITE32_MEMBER(timer1_w) { write_timer(1, data, IOGA_TIMER_1); }
+ DECLARE_WRITE32_MEMBER(timer2_w) { write_timer(2, data, IOGA_TIMER_2); }
+ DECLARE_WRITE32_MEMBER(timer3_w) { write_timer(3, data, IOGA_TIMER_3); }
+
+ DECLARE_READ16_MEMBER(icr_r) { return m_int_vector[offset]; }
+ DECLARE_WRITE16_MEMBER(icr_w);
+ DECLARE_READ16_MEMBER(icr18_r) { return icr_r(space, 18, mem_mask); }
+ DECLARE_WRITE16_MEMBER(icr18_w) { icr_w(space, 18, data, mem_mask); }
+
+ DECLARE_READ8_MEMBER(softint_r) { return m_softint; }
+ DECLARE_WRITE8_MEMBER(softint_w);
+ DECLARE_READ8_MEMBER(nmictrl_r) { return m_nmictrl; }
+ DECLARE_WRITE8_MEMBER(nmictrl_w);
+
+ DECLARE_READ16_MEMBER(softint_vector_r) { return m_softint_vector[offset]; }
+ DECLARE_WRITE16_MEMBER(softint_vector_w);
+
+ DECLARE_READ32_MEMBER(dma_plotter_r) { return dma_r(space, offset, mem_mask, IOGA_DMA_PLOTTER); }
+ DECLARE_WRITE32_MEMBER(dma_plotter_w) { dma_w(space, offset, data, mem_mask, IOGA_DMA_PLOTTER); }
+ DECLARE_READ32_MEMBER(dma_scsi_r) { return dma_r(space, offset, mem_mask, IOGA_DMA_SCSI); }
+ DECLARE_WRITE32_MEMBER(dma_scsi_w) { dma_w(space, offset, data, mem_mask, IOGA_DMA_SCSI); }
+ DECLARE_READ32_MEMBER(dma_floppy_r) { return dma_r(space, offset, mem_mask, IOGA_DMA_FLOPPY); }
+ DECLARE_WRITE32_MEMBER(dma_floppy_w) { dma_w(space, offset, data, mem_mask, IOGA_DMA_FLOPPY); }
+
+ DECLARE_READ32_MEMBER(dma_plotter_eosl_r) { return m_dma_plotter_eosl; }
+ DECLARE_WRITE32_MEMBER(dma_plotter_eosl_w) { m_dma_plotter_eosl = data; }
+
+ DECLARE_READ32_MEMBER(error_address_r) { return m_error_address; }
+ DECLARE_READ32_MEMBER(error_businfo_r) { return m_error_businfo; }
+ void bus_error(uint32_t address, uint32_t cycle_type) { m_error_address = address; m_error_businfo = cycle_type; }
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+
+private:
+ static const device_timer_id IOGA_TIMER_0 = 0;
+ static const device_timer_id IOGA_TIMER_1 = 1;
+ static const device_timer_id IOGA_TIMER_2 = 2;
+ static const device_timer_id IOGA_TIMER_3 = 3;
+
+ static const device_timer_id IOGA_TIMER_DMA = 4;
+
+ void set_nmi_line(int state);
+ void set_irq_line(int irq, int state);
+ void set_irq_soft(int irq, int state);
+ void write_timer(int timer, uint32_t value, device_timer_id id);
+
+ void update_interrupt(int state);
+
+ void drq(int state, int channel);
+ devcb_write_line m_out_nmi_func;
+ devcb_write_line m_out_int_func;
+ address_space *m_memory_space;
+
+ // dma channels
+ struct dma
+ {
+ uint32_t real_address;
+ uint32_t virtual_address;
+ uint32_t transfer_count;
+ uint32_t control;
+
+ bool dma_active;
+ int drq_state;
+ devcb_read8 device_r;
+ devcb_write8 device_w;
+ } m_dma_channel[IOGA_DMA_CHANNELS];
+ uint32_t m_dma_plotter_eosl;
+
+ devcb_write_line m_fdc_tc_func;
+
+ bool m_nmi_pending;
+ uint32_t m_interrupt_active;
+ uint32_t m_irq_current;
+ uint32_t m_irq_forced;
+
+ uint16_t m_int_vector[IOGA_INTERRUPT_COUNT];
+ uint8_t m_softint;
+ uint8_t m_nmictrl;
+ uint16_t m_softint_vector[8];
+
+ uint32_t m_prescaler;
+ uint32_t m_timer_reg[3];
+ uint16_t m_timer1_count;
+ uint32_t m_timer3_count;
+ emu_timer *m_timer[4];
+
+ // dma state
+ emu_timer *m_dma_timer;
+
+ uint32_t dma_r(address_space &space, offs_t offset, uint32_t mem_mask, int channel);
+ void dma_w(address_space &space, offs_t offset, uint32_t data, uint32_t mem_mask, int channel);
+
+ uint16_t m_arbctl;
+
+ uint32_t m_error_address;
+ uint32_t m_error_businfo;
+};
+
+// device type definition
+extern const device_type INTERPRO_IOGA;
+
+#endif \ No newline at end of file
diff --git a/src/mame/machine/interpro_mcga.cpp b/src/mame/machine/interpro_mcga.cpp
new file mode 100644
index 00000000000..d807f571bab
--- /dev/null
+++ b/src/mame/machine/interpro_mcga.cpp
@@ -0,0 +1,89 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+
+/*
+* An implementation of the MCGA device found on Intergraph InterPro family workstations. There is no
+* public documentation on this device, so the implementation is being built to follow the logic of the
+* system boot ROM and its diagnostic tests.
+*
+* Please be aware that code in here is not only broken, it's likely wrong in many cases.
+*
+* TODO
+* - too long to list
+*/
+#include "interpro_mcga.h"
+
+#define VERBOSE 0
+#if VERBOSE
+#define LOG_MCGA(...) logerror(__VA_ARGS__)
+#else
+#define LOG_MCGA(...) {}
+#endif
+
+DEVICE_ADDRESS_MAP_START(map, 16, interpro_mcga_device)
+ AM_RANGE(0x00, 0x3f) AM_READWRITE16(read, write, 0xffff)
+ADDRESS_MAP_END
+
+const device_type INTERPRO_MCGA = &device_creator<interpro_mcga_device>;
+
+interpro_mcga_device::interpro_mcga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, INTERPRO_MCGA, "InterPro MCGA", tag, owner, clock, "mcga", __FILE__)
+{
+}
+
+void interpro_mcga_device::device_start()
+{
+}
+
+void interpro_mcga_device::device_reset()
+{
+ m_reg[0] = 0x00ff; // 0x00
+ m_reg[2] = MCGA_CTRL_ENREFRESH | MCGA_CTRL_CBITFRCSUB | MCGA_CTRL_CBITFRCRD; // 0x08 ctrl
+ //m_mcga[4] = 0x8000; // 0x10 error
+ m_reg[10] = 0x00ff; // 0x28
+ m_reg[14] = 0x0340; // 0x38 memsize
+}
+
+WRITE16_MEMBER(interpro_mcga_device::write)
+{
+ /*
+ read MEMSIZE 0x38 mask 0xffff
+ read 0x00 mask 0x0000
+ write CBSUB 0x20 mask 0x00ff data 0
+ write FRCRD 0x18 mask 0x00ff data 0
+ read ERROR 0x10 mask 0xffff
+ read 0x00 mask 0xffff
+
+ (0x38 >> 8) & 0xF == 3?
+
+ if (0x00 != 0xFF) -> register reset error
+
+ 0x00 = 0x0055 (test value & 0xff)
+ r7 = 0x00 & 0xff
+ */
+ LOG_MCGA("mcga write offset = 0x%08x, mask = 0x%08x, data = 0x%08x, pc = 0x%08x\n", offset, mem_mask, data, space.device().safe_pc());
+ switch (offset)
+ {
+ case 0x02: // MCGA_CTRL
+ // HACK: set or clear error status depending on ENMMBE bit
+ if (data & MCGA_CTRL_ENMMBE)
+ m_reg[4] |= MCGA_ERROR_VALID;
+ // else
+ // m_reg[4] &= ~MCGA_ERROR_VALID;
+
+ default:
+ m_reg[offset] = data;
+ break;
+ }
+}
+
+READ16_MEMBER(interpro_mcga_device::read)
+{
+ LOG_MCGA("mcga read offset = 0x%08x, mask = 0x%08x, pc = 0x%08x\n", offset, mem_mask, space.device().safe_pc());
+
+ switch (offset)
+ {
+ default:
+ return m_reg[offset];
+ }
+} \ No newline at end of file
diff --git a/src/mame/machine/interpro_mcga.h b/src/mame/machine/interpro_mcga.h
new file mode 100644
index 00000000000..4f3ecde78cc
--- /dev/null
+++ b/src/mame/machine/interpro_mcga.h
@@ -0,0 +1,45 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+
+#pragma once
+
+#ifndef INTERPRO_MCGA_H_
+#define INTERPRO_MCGA_H_
+
+#include "emu.h"
+
+// mcga control register
+#define MCGA_CTRL_OPTMASK 0x00000003
+#define MCGA_CTRL_CBITFRCRD 0x00000004
+#define MCGA_CTRL_CBITFRCSUB 0x00000008
+#define MCGA_CTRL_ENREFRESH 0x00000010
+#define MCGA_CTRL_ENMSBE 0x00000100
+#define MCGA_CTRL_ENMMBE 0x00000200
+#define MCGA_CTRL_ENECC 0x00000400
+#define MCGA_CTRL_WRPROT 0x00008000
+
+// mcga error register
+#define MCGA_ERROR_VALID 0x00008000
+
+class interpro_mcga_device : public device_t
+{
+public:
+ interpro_mcga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ virtual DECLARE_ADDRESS_MAP(map, 32);
+
+ DECLARE_WRITE16_MEMBER(write);
+ DECLARE_READ16_MEMBER(read);
+
+protected:
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+ uint16_t m_reg[32];
+};
+
+// device type definition
+extern const device_type INTERPRO_MCGA;
+
+#endif \ No newline at end of file
diff --git a/src/mame/machine/interpro_sga.cpp b/src/mame/machine/interpro_sga.cpp
new file mode 100644
index 00000000000..102c58a2f0b
--- /dev/null
+++ b/src/mame/machine/interpro_sga.cpp
@@ -0,0 +1,88 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+
+/*
+* An implementation of the SGA device found on Intergraph InterPro family workstations. There is no
+* public documentation on this device, so the implementation is being built to follow the logic of the
+* system boot ROM and its diagnostic tests.
+*
+* Please be aware that code in here is not only broken, it's likely wrong in many cases.
+*
+* TODO
+* - too long to list
+*/
+#include "interpro_sga.h"
+
+#define VERBOSE 0
+
+DEVICE_ADDRESS_MAP_START(map, 32, interpro_sga_device)
+ AM_RANGE(0x00, 0x03) AM_READWRITE(gcs_r, gcs_w)
+ AM_RANGE(0x04, 0x07) AM_READWRITE(ipoll_r, ipoll_w)
+ AM_RANGE(0x08, 0x0b) AM_READWRITE(imask_r, imask_w)
+ AM_RANGE(0x0c, 0x0f) AM_READWRITE(range_base_r, range_base_w)
+ AM_RANGE(0x10, 0x13) AM_READWRITE(range_end_r, range_end_w)
+ AM_RANGE(0x14, 0x17) AM_READWRITE(cttag_r, cttag_w)
+ AM_RANGE(0x18, 0x1b) AM_READWRITE(address_r, address_w)
+ AM_RANGE(0x1c, 0x1f) AM_READWRITE(dmacs_r, dmacs_w)
+ AM_RANGE(0x20, 0x23) AM_READWRITE(edmacs_r, edmacs_w)
+
+ AM_RANGE(0xa4, 0xa7) AM_READWRITE(dspad1_r, dspad1_w)
+ AM_RANGE(0xa8, 0xab) AM_READWRITE(dsoff1_r, dsoff1_w)
+
+ AM_RANGE(0xb4, 0xb7) AM_READWRITE(unknown1_r, unknown1_w)
+ AM_RANGE(0xb8, 0xbb) AM_READWRITE(unknown2_r, unknown2_w)
+ AM_RANGE(0xbc, 0xbf) AM_READWRITE(ddtc1_r, ddtc1_w)
+ADDRESS_MAP_END
+
+const device_type INTERPRO_SGA = &device_creator<interpro_sga_device>;
+
+interpro_sga_device::interpro_sga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, INTERPRO_SGA, "InterPro SGA", tag, owner, clock, "sga", __FILE__)
+{
+}
+
+void interpro_sga_device::device_start()
+{
+}
+
+void interpro_sga_device::device_reset()
+{
+}
+
+WRITE32_MEMBER(interpro_sga_device::ddtc1_w)
+{
+ // we assume that when this register is written, we should start a
+ // memory to memory dma transfer
+
+ logerror(" gcs = 0x%08x dmacs = 0x%08x\n", m_gcs, m_dmacs);
+ logerror(" ipoll = 0x%08x imask = 0x%08x\n", m_ipoll, m_imask);
+ logerror("dspad1 = 0x%08x dsoff1 = 0x%08x\n", m_dspad1, m_dsoff1);
+ logerror(" unk1 = 0x%08x unk2 = 0x%08x\n", m_unknown1, m_unknown2);
+ logerror(" ddtc1 = 0x%08x\n", data);
+
+ m_ddtc1 = data;
+
+ // when complete, we indicate by setting DMAEND(2) - 2 is probably the channel
+ // we also turn off the INTBERR and INTMMBE flags
+ m_ipoll &= ~(0x20000 | 0x10000);
+ m_ipoll |= 0x200;
+
+ // if the address is invalid, fake a bus error
+ if (m_dspad1 == 0x40000000 || m_unknown1 == 0x40000000
+ || m_dspad1 == 0x40000200 || m_unknown1 == 0x40000200)
+ {
+ m_ipoll |= 0x10000;
+
+ // error cycle - bit 0x10 indicates source address error (dspad1)
+ // now expecting 0x5463?
+#if 0
+ if ((m_dspad1 & 0xfffff000) == 0x40000000)
+ m_ioga->bus_error(m_dspad1, 0x5433);
+ else
+ m_ioga->bus_error(m_unknown1, 0x5423);
+#endif
+ // 0x5423 = BERR|SNAPOK | BG(ICAMMU)? | CT(23)
+ // 0x5433 = BERR|SNAPOK | BG(ICAMMU)? | CT(33)
+ // 0x5463 = BERR|SNAPOK | BG(ICAMMU)? | TAG(1) | CT(23)
+ }
+}
diff --git a/src/mame/machine/interpro_sga.h b/src/mame/machine/interpro_sga.h
new file mode 100644
index 00000000000..06c2d1fba8f
--- /dev/null
+++ b/src/mame/machine/interpro_sga.h
@@ -0,0 +1,71 @@
+// license:BSD-3-Clause
+// copyright-holders:Patrick Mackinlay
+
+#pragma once
+
+#ifndef INTERPRO_SGA_H_
+#define INTERPRO_SGA_H_
+
+#include "emu.h"
+
+class interpro_sga_device : public device_t
+{
+public:
+ interpro_sga_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ virtual DECLARE_ADDRESS_MAP(map, 32);
+
+ DECLARE_READ32_MEMBER(gcs_r) { return m_gcs; }
+ DECLARE_WRITE32_MEMBER(gcs_w) { m_gcs = data; }
+ DECLARE_READ32_MEMBER(ipoll_r) { return m_ipoll; }
+ DECLARE_WRITE32_MEMBER(ipoll_w) { m_ipoll = data; }
+ DECLARE_READ32_MEMBER(imask_r) { return m_imask; }
+ DECLARE_WRITE32_MEMBER(imask_w) { m_imask = data; }
+ DECLARE_READ32_MEMBER(range_base_r) { return m_range_base; }
+ DECLARE_WRITE32_MEMBER(range_base_w) { m_range_base = data; }
+ DECLARE_READ32_MEMBER(range_end_r) { return m_range_end; }
+ DECLARE_WRITE32_MEMBER(range_end_w) { m_range_end = data; }
+ DECLARE_READ32_MEMBER(cttag_r) { return m_cttag; }
+ DECLARE_WRITE32_MEMBER(cttag_w) { m_cttag = data; }
+ DECLARE_READ32_MEMBER(address_r) { return m_address; }
+ DECLARE_WRITE32_MEMBER(address_w) { m_address = data; }
+ DECLARE_READ32_MEMBER(dmacs_r) { return m_dmacs; }
+ DECLARE_WRITE32_MEMBER(dmacs_w) { m_dmacs = data; }
+ DECLARE_READ32_MEMBER(edmacs_r) { return m_edmacs; }
+ DECLARE_WRITE32_MEMBER(edmacs_w) { m_edmacs = data; }
+ DECLARE_READ32_MEMBER(dspad1_r) { return m_dspad1; }
+ DECLARE_WRITE32_MEMBER(dspad1_w) { m_dspad1 = data; }
+ DECLARE_READ32_MEMBER(dsoff1_r) { return m_dsoff1; }
+ DECLARE_WRITE32_MEMBER(dsoff1_w) { m_dsoff1 = data; }
+ DECLARE_READ32_MEMBER(unknown1_r) { return m_unknown1; }
+ DECLARE_WRITE32_MEMBER(unknown1_w) { m_unknown1 = data; }
+ DECLARE_READ32_MEMBER(unknown2_r) { return m_unknown2; }
+ DECLARE_WRITE32_MEMBER(unknown2_w) { m_unknown2 = data; }
+ DECLARE_READ32_MEMBER(ddtc1_r) { return m_ddtc1; }
+ DECLARE_WRITE32_MEMBER(ddtc1_w);
+
+protected:
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+private:
+ uint32_t m_gcs; // general control/status
+ uint32_t m_ipoll; // interrupt poll
+ uint32_t m_imask; // interrupt mask
+ uint32_t m_range_base;
+ uint32_t m_range_end;
+ uint32_t m_cttag; // error cycletype/tag
+ uint32_t m_address;
+ uint32_t m_dmacs; // dma control/status
+ uint32_t m_edmacs; // extended dma control/status
+ uint32_t m_dspad1;
+ uint32_t m_dsoff1;
+ uint32_t m_unknown1;
+ uint32_t m_unknown2;
+ uint32_t m_ddtc1;
+};
+
+// device type definition
+extern const device_type INTERPRO_SGA;
+
+#endif \ No newline at end of file
diff --git a/src/mame/machine/namco_c139.cpp b/src/mame/machine/namco_c139.cpp
index 0e081a7836e..ed021210762 100644
--- a/src/mame/machine/namco_c139.cpp
+++ b/src/mame/machine/namco_c139.cpp
@@ -2,13 +2,13 @@
// copyright-holders:Angelo Salese
/***************************************************************************
- Namco C139 - Serial I/F Controller
+ Namco C139 - Serial I/F Controller
+
+
+ TODO:
+ - Make this to actually work!
+ - Is RAM shared with a specific CPU other than master/slave?
-
- TODO:
- - Make this to actually work!
- - Is RAM shared with a specific CPU other than master/slave?
-
***************************************************************************/
#include "emu.h"
@@ -35,9 +35,9 @@ ADDRESS_MAP_END
DEVICE_ADDRESS_MAP_START( regs_map, 16, namco_c139_device )
AM_RANGE(0x00, 0x00) AM_READ(status_r) // WRITE clears flags
AM_RANGE(0x02, 0x02) AM_NOP // settings?
-// AM_RANGE(0x0a, 0x0a) // WRITE tx_w
-// AM_RANGE(0x0c, 0x0c) // READ rx_r
-// AM_RANGE(0x0e, 0x0e) //
+// AM_RANGE(0x0a, 0x0a) // WRITE tx_w
+// AM_RANGE(0x0c, 0x0c) // READ rx_r
+// AM_RANGE(0x0e, 0x0e) //
ADDRESS_MAP_END
//-------------------------------------------------
diff --git a/src/mame/machine/namco_c139.h b/src/mame/machine/namco_c139.h
index 08a38e74425..bee3f51a6a3 100644
--- a/src/mame/machine/namco_c139.h
+++ b/src/mame/machine/namco_c139.h
@@ -2,7 +2,7 @@
// copyright-holders:Angelo Salese
/***************************************************************************
- Namco C139 - Serial I/F Controller
+ Namco C139 - Serial I/F Controller
***************************************************************************/
@@ -37,7 +37,7 @@ public:
DECLARE_ADDRESS_MAP(regs_map, 16);
DECLARE_READ16_MEMBER(status_r);
-
+
DECLARE_READ16_MEMBER(ram_r);
DECLARE_WRITE16_MEMBER(ram_w);
diff --git a/src/mame/machine/namco_c148.cpp b/src/mame/machine/namco_c148.cpp
index d09d82c7ff6..a12ece76d55 100644
--- a/src/mame/machine/namco_c148.cpp
+++ b/src/mame/machine/namco_c148.cpp
@@ -2,27 +2,27 @@
// copyright-holders:Angelo Salese
/***************************************************************************
- Namco C148 - CPU Bus Manager
+ Namco C148 - CPU Bus Manager
- Does some Memory Decode, Interrupt Handling, 3 bit PIO port, Bus Controller
+ Does some Memory Decode, Interrupt Handling, 3 bit PIO port, Bus Controller
+
+ Based off implementation from K.Wilkins and Phil Stroffolino
+
+ TODO:
+ - hookup C116 device, @see mame/includes/namcoic.h
- Based off implementation from K.Wilkins and Phil Stroffolino
-
- TODO:
- - hookup C116 device, @see mame/includes/namcoic.h
-
=============================================================================
Interrupt Controller C148 1C0000-1FFFFF R/W D00-D02
Bus Controller? 1C0XXX
???????? 1C2XXX
???????? 1C4XXX
- -x- master priority bit?
+ -x- master priority bit?
Master/Slave IRQ level 1C6XXX D00-D02
EXIRQ level 1C8XXX D00-D02
POSIRQ level 1CAXXX D00-D02
SCIRQ level 1CCXXX D00-D02
VBLANK IRQ level 1CEXXX D00-D02
- xxx irq level for specific irq.
+ xxx irq level for specific irq.
???????? 1D0XXX
???????? 1D4000 trigger master/slave INT?
@@ -35,9 +35,9 @@ Interrupt Controller C148 1C0000-1FFFFF R/W D00-D02
EEPROM Ready status 1E0XXX R D01
Sound CPU Reset control 1E2XXX W D01
Slave 68000 & IO CPU Reset 1E4XXX W D01
- xxx PIO ports, per-HW / CPU specific
+ xxx PIO ports, per-HW / CPU specific
Watchdog reset kicker 1E6XXX W
- xxx Unknown at current stage if internal or external to the C148
+ xxx Unknown at current stage if internal or external to the C148
***************************************************************************/
@@ -111,6 +111,14 @@ void namco_c148_device::device_start()
m_out_ext2_cb.resolve_safe();
// TODO: link to SCI, EX and the screen device controller devices
+
+ save_item(NAME(m_irqlevel.cpu));
+ save_item(NAME(m_irqlevel.ex));
+ save_item(NAME(m_irqlevel.sci));
+ save_item(NAME(m_irqlevel.pos));
+ save_item(NAME(m_irqlevel.vblank));
+ save_item(NAME(m_posirq_line));
+ save_item(NAME(m_bus_reg));
}
@@ -131,11 +139,11 @@ void namco_c148_device::device_reset()
// IRQ section
//**************************************************************************
-READ8_MEMBER( namco_c148_device::pos_irq_level_r ) { return m_irqlevel.pos & 7; }
-READ8_MEMBER( namco_c148_device::vblank_irq_level_r ) { return m_irqlevel.vblank & 7; }
-READ8_MEMBER( namco_c148_device::cpu_irq_level_r ) { return m_irqlevel.cpu & 7; }
-READ8_MEMBER( namco_c148_device::ex_irq_level_r ) { return m_irqlevel.ex & 7; }
-READ8_MEMBER( namco_c148_device::sci_irq_level_r ) { return m_irqlevel.sci & 7; }
+READ8_MEMBER( namco_c148_device::pos_irq_level_r ) { return m_irqlevel.pos & 7; }
+READ8_MEMBER( namco_c148_device::vblank_irq_level_r ) { return m_irqlevel.vblank & 7; }
+READ8_MEMBER( namco_c148_device::cpu_irq_level_r ) { return m_irqlevel.cpu & 7; }
+READ8_MEMBER( namco_c148_device::ex_irq_level_r ) { return m_irqlevel.ex & 7; }
+READ8_MEMBER( namco_c148_device::sci_irq_level_r ) { return m_irqlevel.sci & 7; }
inline void namco_c148_device::flush_irq_acks()
{
@@ -146,23 +154,23 @@ inline void namco_c148_device::flush_irq_acks()
m_hostcpu->set_input_line(i,CLEAR_LINE);
}
-WRITE8_MEMBER( namco_c148_device::pos_irq_level_w ) { m_irqlevel.pos = data & 7; flush_irq_acks(); if(data != 0) { LOG(("%s: pos IRQ level = %02x\n",this->tag(),data)); } }
-WRITE8_MEMBER( namco_c148_device::vblank_irq_level_w ) { m_irqlevel.vblank = data & 7; flush_irq_acks(); LOG(("%s: vblank IRQ level = %02x\n",this->tag(),data)); }
-WRITE8_MEMBER( namco_c148_device::cpu_irq_level_w ) { m_irqlevel.cpu = data & 7; flush_irq_acks(); LOG(("%s: cpu IRQ level = %02x\n",this->tag(),data)); }
-WRITE8_MEMBER( namco_c148_device::ex_irq_level_w ) { m_irqlevel.ex = data & 7; flush_irq_acks(); LOG(("%s: ex IRQ level = %02x\n",this->tag(),data)); }
-WRITE8_MEMBER( namco_c148_device::sci_irq_level_w ) { m_irqlevel.sci = data & 7; flush_irq_acks(); LOG(("%s: sci IRQ level = %02x\n",this->tag(),data)); }
-
-READ16_MEMBER( namco_c148_device::vblank_irq_ack_r ) { m_hostcpu->set_input_line(m_irqlevel.vblank, CLEAR_LINE); return 0; }
-READ16_MEMBER( namco_c148_device::pos_irq_ack_r ) { m_hostcpu->set_input_line(m_irqlevel.pos, CLEAR_LINE); return 0; }
-READ16_MEMBER( namco_c148_device::cpu_irq_ack_r ) { m_hostcpu->set_input_line(m_irqlevel.cpu, CLEAR_LINE); return 0; }
-READ16_MEMBER( namco_c148_device::ex_irq_ack_r ) { m_hostcpu->set_input_line(m_irqlevel.ex, CLEAR_LINE); return 0; }
-READ16_MEMBER( namco_c148_device::sci_irq_ack_r ) { m_hostcpu->set_input_line(m_irqlevel.sci, CLEAR_LINE); return 0; }
-
-WRITE16_MEMBER( namco_c148_device::vblank_irq_ack_w ) { m_hostcpu->set_input_line(m_irqlevel.vblank, CLEAR_LINE); }
-WRITE16_MEMBER( namco_c148_device::pos_irq_ack_w ) { m_hostcpu->set_input_line(m_irqlevel.pos, CLEAR_LINE); }
-WRITE16_MEMBER( namco_c148_device::cpu_irq_ack_w ) { m_hostcpu->set_input_line(m_irqlevel.cpu, CLEAR_LINE); }
-WRITE16_MEMBER( namco_c148_device::ex_irq_ack_w ) { m_hostcpu->set_input_line(m_irqlevel.ex, CLEAR_LINE); }
-WRITE16_MEMBER( namco_c148_device::sci_irq_ack_w ) { m_hostcpu->set_input_line(m_irqlevel.sci, CLEAR_LINE); }
+WRITE8_MEMBER( namco_c148_device::pos_irq_level_w ) { m_irqlevel.pos = data & 7; flush_irq_acks(); if(data != 0) { LOG(("%s: pos IRQ level = %02x\n",this->tag(),data)); } }
+WRITE8_MEMBER( namco_c148_device::vblank_irq_level_w ) { m_irqlevel.vblank = data & 7; flush_irq_acks(); LOG(("%s: vblank IRQ level = %02x\n",this->tag(),data)); }
+WRITE8_MEMBER( namco_c148_device::cpu_irq_level_w ) { m_irqlevel.cpu = data & 7; flush_irq_acks(); LOG(("%s: cpu IRQ level = %02x\n",this->tag(),data)); }
+WRITE8_MEMBER( namco_c148_device::ex_irq_level_w ) { m_irqlevel.ex = data & 7; flush_irq_acks(); LOG(("%s: ex IRQ level = %02x\n",this->tag(),data)); }
+WRITE8_MEMBER( namco_c148_device::sci_irq_level_w ) { m_irqlevel.sci = data & 7; flush_irq_acks(); LOG(("%s: sci IRQ level = %02x\n",this->tag(),data)); }
+
+READ16_MEMBER( namco_c148_device::vblank_irq_ack_r ) { m_hostcpu->set_input_line(m_irqlevel.vblank, CLEAR_LINE); return 0; }
+READ16_MEMBER( namco_c148_device::pos_irq_ack_r ) { m_hostcpu->set_input_line(m_irqlevel.pos, CLEAR_LINE); return 0; }
+READ16_MEMBER( namco_c148_device::cpu_irq_ack_r ) { m_hostcpu->set_input_line(m_irqlevel.cpu, CLEAR_LINE); return 0; }
+READ16_MEMBER( namco_c148_device::ex_irq_ack_r ) { m_hostcpu->set_input_line(m_irqlevel.ex, CLEAR_LINE); return 0; }
+READ16_MEMBER( namco_c148_device::sci_irq_ack_r ) { m_hostcpu->set_input_line(m_irqlevel.sci, CLEAR_LINE); return 0; }
+
+WRITE16_MEMBER( namco_c148_device::vblank_irq_ack_w ) { m_hostcpu->set_input_line(m_irqlevel.vblank, CLEAR_LINE); }
+WRITE16_MEMBER( namco_c148_device::pos_irq_ack_w ) { m_hostcpu->set_input_line(m_irqlevel.pos, CLEAR_LINE); }
+WRITE16_MEMBER( namco_c148_device::cpu_irq_ack_w ) { m_hostcpu->set_input_line(m_irqlevel.cpu, CLEAR_LINE); }
+WRITE16_MEMBER( namco_c148_device::ex_irq_ack_w ) { m_hostcpu->set_input_line(m_irqlevel.ex, CLEAR_LINE); }
+WRITE16_MEMBER( namco_c148_device::sci_irq_ack_w ) { m_hostcpu->set_input_line(m_irqlevel.sci, CLEAR_LINE); }
//**************************************************************************
// Comm ports
diff --git a/src/mame/machine/namco_c148.h b/src/mame/machine/namco_c148.h
index 3f53228ebcc..7b920708e2b 100644
--- a/src/mame/machine/namco_c148.h
+++ b/src/mame/machine/namco_c148.h
@@ -2,7 +2,7 @@
// copyright-holders:Angelo Salese
/***************************************************************************
- Namco C148 - CPU Bus Manager
+ Namco C148 - CPU Bus Manager
***************************************************************************/
@@ -27,7 +27,7 @@
#define MCFG_NAMCO_C148_EXT2_CB(_cb) \
devcb = &namco_c148_device::set_out_ext2_callback(*device, DEVCB_##_cb);
-
+
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@@ -48,20 +48,20 @@ public:
dev.m_hostcpu_tag = tag;
dev.m_hostcpu_master = is_master;
}
-
+
static void link_c148_device(device_t &device, const char *tag)
{
namco_c148_device &dev = downcast<namco_c148_device &>(device);
dev.m_linked_c148_tag = tag;
}
-
+
template<class _Object> static devcb_base &set_out_ext1_callback(device_t &device, _Object object) { return downcast<namco_c148_device &>(device).m_out_ext1_cb.set_callback(object); }
template<class _Object> static devcb_base &set_out_ext2_callback(device_t &device, _Object object) { return downcast<namco_c148_device &>(device).m_out_ext2_cb.set_callback(object); }
devcb_write8 m_out_ext1_cb;
devcb_write8 m_out_ext2_cb;
-
+
DECLARE_READ8_MEMBER( vblank_irq_level_r );
DECLARE_WRITE8_MEMBER( vblank_irq_level_w );
DECLARE_READ16_MEMBER( vblank_irq_ack_r );
@@ -76,12 +76,12 @@ public:
DECLARE_WRITE8_MEMBER( cpu_irq_level_w );
DECLARE_READ16_MEMBER( cpu_irq_ack_r );
DECLARE_WRITE16_MEMBER( cpu_irq_ack_w );
-
+
DECLARE_READ8_MEMBER( ex_irq_level_r );
DECLARE_WRITE8_MEMBER( ex_irq_level_w );
DECLARE_READ16_MEMBER( ex_irq_ack_r );
DECLARE_WRITE16_MEMBER( ex_irq_ack_w );
-
+
DECLARE_READ8_MEMBER( sci_irq_level_r );
DECLARE_WRITE8_MEMBER( sci_irq_level_w );
DECLARE_READ16_MEMBER( sci_irq_ack_r );
@@ -110,11 +110,11 @@ protected:
virtual void device_start() override;
virtual void device_reset() override;
private:
- cpu_device *m_hostcpu; /**< reference to the host cpu */
- namco_c148_device *m_linked_c148; /**< reference to linked master/slave c148 */
- const char *m_hostcpu_tag; /**< host cpu tag name */
- const char *m_linked_c148_tag; /**< other c148 tag name */
- bool m_hostcpu_master; /**< define if host cpu is master */
+ cpu_device *m_hostcpu; /**< reference to the host cpu */
+ namco_c148_device *m_linked_c148; /**< reference to linked master/slave c148 */
+ const char *m_hostcpu_tag; /**< host cpu tag name */
+ const char *m_linked_c148_tag; /**< other c148 tag name */
+ bool m_hostcpu_master; /**< define if host cpu is master */
struct{
uint8_t cpu;
uint8_t ex;
diff --git a/src/mame/machine/namcoio_gearbox.cpp b/src/mame/machine/namcoio_gearbox.cpp
index cf4c472a653..68f0c82e794 100644
--- a/src/mame/machine/namcoio_gearbox.cpp
+++ b/src/mame/machine/namcoio_gearbox.cpp
@@ -2,24 +2,24 @@
// copyright-holders:Angelo Salese
/***************************************************************************
- Namco 6-speed Gearbox device
-
+ Namco 6-speed Gearbox device
+
Used in Ridge Racer deluxe cabinet, Ace Driver and Driver's Eyes
- User side gear scheme:
- 1 3 5
- |-|-|
- 2 4 6
-
- Being a mechanical part there are currently two methods hooked up,
- emulated and natural.
- First one just uses whatever is read in the inputs, second one
- simulates clutch lock as in a real car.
-
- TODO:
- - check clutch lock via real HW, and get a way to lock current gear via
- MAME's input system;
- - Custom part #;
- - gear output for artwork system;
+ User side gear scheme:
+ 1 3 5
+ |-|-|
+ 2 4 6
+
+ Being a mechanical part there are currently two methods hooked up,
+ emulated and natural.
+ First one just uses whatever is read in the inputs, second one
+ simulates clutch lock as in a real car.
+
+ TODO:
+ - check clutch lock via real HW, and get a way to lock current gear via
+ MAME's input system;
+ - Custom part #;
+ - gear output for artwork system;
***************************************************************************/
@@ -74,7 +74,7 @@ static INPUT_PORTS_START( gearbox_inputs )
PORT_START("GEARBOX")
PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_NAME("Gearbox Up")
PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_NAME("Gearbox Down")
- PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_NAME("Gearbox Left")
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_NAME("Gearbox Left")
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_NAME("Gearbox Right")
PORT_START("CLUTCH")
@@ -105,21 +105,21 @@ CUSTOM_INPUT_MEMBER( namcoio_gearbox_device::in_r )
{
if(ioport("CONFIG")->read() & 1)
return ioport("GEARBOX")->read() & 0xf;
-
+
bool clutch_pressed = (ioport("CLUTCH")->read() & 1) == 0;
- const char gearbox_output[16] = { '-', '-', '-', '-',
- '-', '6', '5', 'N',
- '-', '2', '1', 'N',
+ const char gearbox_output[16] = { '-', '-', '-', '-',
+ '-', '6', '5', 'N',
+ '-', '2', '1', 'N',
'-', '4', '3', 'N' };
-
+
if(ioport("CONFIG")->read() & 2)
popmessage("%c %c",gearbox_output[m_gearbox_state],clutch_pressed == true ? '*' : '.');
-
+
if(clutch_pressed == false)
return m_gearbox_state;
-
+
m_gearbox_state = ioport("GEARBOX")->read() & 0xf;
-
+
return 0xf; // return neutral while changing gear
}
diff --git a/src/mame/machine/namcoio_gearbox.h b/src/mame/machine/namcoio_gearbox.h
index 463338930d0..5d80d09d8e4 100644
--- a/src/mame/machine/namcoio_gearbox.h
+++ b/src/mame/machine/namcoio_gearbox.h
@@ -2,7 +2,7 @@
// copyright-holders:Angelo Salese
/***************************************************************************
- Namco 6-speed Gearbox device
+ Namco 6-speed Gearbox device
***************************************************************************/
diff --git a/src/mame/machine/namcos2.cpp b/src/mame/machine/namcos2.cpp
index d2c23f350ed..876b79fc799 100644
--- a/src/mame/machine/namcos2.cpp
+++ b/src/mame/machine/namcos2.cpp
@@ -86,7 +86,7 @@ WRITE8_MEMBER(namcos2_shared_state::sound_reset_w)
/* Suspend execution */
m_audiocpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
}
-
+
if (namcos2_kickstart != nullptr)
{
//printf( "dspkick=0x%x\n", data );
@@ -97,11 +97,11 @@ WRITE8_MEMBER(namcos2_shared_state::sound_reset_w)
}
}
-// TODO:
+// TODO:
WRITE8_MEMBER(namcos2_shared_state::system_reset_w)
-{
+{
reset_all_subcpus(data & 1 ? CLEAR_LINE : ASSERT_LINE);
-
+
if (data & 0x01)
{
address_space &masterspace = m_maincpu->space(AS_PROGRAM);
diff --git a/src/mame/machine/naomi.cpp b/src/mame/machine/naomi.cpp
index ce88e041838..c1a41b66be6 100644
--- a/src/mame/machine/naomi.cpp
+++ b/src/mame/machine/naomi.cpp
@@ -209,7 +209,7 @@ DRIVER_INIT_MEMBER(naomi_state,naomi)
create_pic_from_retdat();
}
-DRIVER_INIT_MEMBER(naomi_state,naomi2)
+DRIVER_INIT_MEMBER(naomi2_state,naomi2)
{
m_maincpu->space(AS_PROGRAM).install_read_handler(0xc2b0600, 0xc2b0607, read64_delegate(FUNC(naomi_state::naomi2_biose_idle_skip_r),this)); // rev e bios
diff --git a/src/mame/machine/naomibd.cpp b/src/mame/machine/naomibd.cpp
index 2ea0d246a80..559ec53c9f7 100644
--- a/src/mame/machine/naomibd.cpp
+++ b/src/mame/machine/naomibd.cpp
@@ -52,6 +52,9 @@
"M1" type carts: DMA_OFFSET 0 = enable decryptyon/decompression during DMA transfer, ROM_OFFSET - ROM size/mapping select similar to M2 cart type
"M4" type carts: no effect, ROM_OFFSET bit 29 always return 1 then read, used by BIOS to determine this cart is encrypted and require bit 30 set then read ROM header
+ * bit 28 (mode bit 0)
+ "M2" type carts: ROM_OFFSET - master/slave ROM board select
+
* bit 0 can be set for "M4" type carts, function unknown
Normal address starts with 0xa0000000 to enable auto-advance and 8MB ROM addressing mode.
diff --git a/src/mame/machine/naomim2.cpp b/src/mame/machine/naomim2.cpp
index e4b140a7231..6061fc4763d 100644
--- a/src/mame/machine/naomim2.cpp
+++ b/src/mame/machine/naomim2.cpp
@@ -11,10 +11,10 @@ Naomi cartridge type M2/3 mapping
NAOMI_ROM_OFFSET bit29: ROM size/mapping selection, 0 - 4MB ROM mode, 1 - 8MB ROM mode
-bit28: Bank selection.
- in the case of flash-based 171-7885A ROM boards two of them can be stacked at once
- onto main board. each must be configured as Bank 0 or 1 via some (currently unknown) jumper.
- this bit selects which one ROM board will be accessed.
+bit28: master/slave ROM board select.
+ flash-based 171-7885A ROM board JP4 select master (access at 0xxxxxxx) or slave (access at 1xxxxxxx) mode.
+ then set to slave it can be stacked with another type M2/3 ROM board.
+ this bit selects which one ROM board will be accessed.
note: if ROM is not mounted its area readed as 0xFF
@@ -52,8 +52,8 @@ note: if ROM is not mounted its area readed as 0xFF
|0D000000 | | | 6N MA13 (16MB) |
|0E000000 | | | 6M MA14 (16MB) |
|0F000000 | | | 6L MA15 (16MB) |
-|10000000 | | | 6K MA16 (16MB) |
-|11000000 | | | 6J MA17 (16MB) |
+|10000000 | Slave ROM board | Slave ROM board | 6K MA16 (16MB) |
+|11000000 | area | area | 6J MA17 (16MB) |
|12000000 | | | 6H MA18 (16MB) |
|13000000 | | | 6F MA19 (16MB) |
|14000000 | | | 6E MA20 (16MB) |
@@ -104,7 +104,7 @@ note: if ROM is not mounted its area readed as 0xFF
+---------+-------------------+---------------------+----------------------------------------------------+
|08000000 | mirror (128MB) | mirror (128MB) | mirror (128MB) |
+---------+-------------------+---------------------+----------------------------------------------------+
-|10000000 | FF filled (256MB) | FF filled (256MB) | FF filled (256MB) (or MA16-23 in 4MB mode?) |
+|10000000 | slave ROM board | slave ROM board | FF filled (256MB) (or MA16-23 in 4MB mode?) |
+---------+-------------------+---------------------+----------------------------------------------------+
********************************************************************************************************/
diff --git a/src/mame/machine/nl_hazelvid.h b/src/mame/machine/nl_hazelvid.h
index ff436aa1f8d..d394ed35f57 100644
--- a/src/mame/machine/nl_hazelvid.h
+++ b/src/mame/machine/nl_hazelvid.h
@@ -1,4 +1,6 @@
// license:BSD-3-Clause
// copyright-holders:Ryan Holtz
+#include "netlist/nl_setup.h"
+
NETLIST_EXTERNAL(hazelvid)
diff --git a/src/mame/machine/nl_pong.cpp b/src/mame/machine/nl_pong.cpp
index d03ae825d78..f375164068c 100644
--- a/src/mame/machine/nl_pong.cpp
+++ b/src/mame/machine/nl_pong.cpp
@@ -7,13 +7,13 @@
***************************************************************************/
-#include "netlist/devices/net_lib.h"
-
-#define FAST_CLOCK (1)
-
#ifndef __PLIB_PREPROCESSOR__
+ #define NL_PROHIBIT_BASEH_INCLUDE 1
+ #include "netlist/devices/net_lib.h"
#endif
+#define FAST_CLOCK (1)
+
NETLIST_START(pong_fast)
SOLVER(Solver, 48000)
diff --git a/src/mame/machine/nl_pongd.cpp b/src/mame/machine/nl_pongd.cpp
index 545b7a1c5f5..e04fb89e304 100644
--- a/src/mame/machine/nl_pongd.cpp
+++ b/src/mame/machine/nl_pongd.cpp
@@ -87,6 +87,7 @@ CIRCUIT_LAYOUT( pongdoubles )
ANALOG_INPUT(V5, 5)
#define VCC "V5", Q
+#undef GND
#define GND "GND", Q
CHIP("F9", 7493)
diff --git a/src/mame/machine/nl_stuntcyc.cpp b/src/mame/machine/nl_stuntcyc.cpp
index ccbf4b2906e..7ec790eafbd 100644
--- a/src/mame/machine/nl_stuntcyc.cpp
+++ b/src/mame/machine/nl_stuntcyc.cpp
@@ -46,7 +46,7 @@ NETLIST_START(stuntcyc)
ALIAS( 32H, L4.QB)
ALIAS( 64H, L4.QC)
ALIAS(128H, L4.QD)
-
+
TTL_74107(K4_1, 128H, P, P, P)
ALIAS(256H, K4_1.Q)
ALIAS(256H_Q, K4_1.QQ)
@@ -450,7 +450,7 @@ NETLIST_START(stuntcyc)
PROM_82S123(d7, GROUND, S1, S2, S3, S4, S5)
PARAM(d7.ROM, "004811.d7")
-
+
ALIAS(MAX_SCORE_Q, d7.O6)
TTL_7410_NAND(D6_1, 256H_Q, 128H, 128H)
diff --git a/src/mame/machine/nl_stuntcyc.h b/src/mame/machine/nl_stuntcyc.h
index 71fd5bfbb7a..1ed85be033a 100644
--- a/src/mame/machine/nl_stuntcyc.h
+++ b/src/mame/machine/nl_stuntcyc.h
@@ -1,4 +1,6 @@
// license:BSD-3-Clause
// copyright-holders:Ryan Holtz
+#include "netlist/nl_setup.h"
+
NETLIST_EXTERNAL(stuntcyc)
diff --git a/src/mame/machine/osborne1.cpp b/src/mame/machine/osborne1.cpp
index cd649cef91a..cb9f84f5bf3 100644
--- a/src/mame/machine/osborne1.cpp
+++ b/src/mame/machine/osborne1.cpp
@@ -252,6 +252,14 @@ WRITE_LINE_MEMBER( osborne1_state::serial_acia_irq_func )
}
+INPUT_CHANGED_MEMBER( osborne1_state::reset_key )
+{
+ // This key affects NMI
+ if (!m_ub6a_q)
+ m_maincpu->set_input_line(INPUT_LINE_NMI, newval ? CLEAR_LINE : ASSERT_LINE);
+}
+
+
DRIVER_INIT_MEMBER( osborne1_state, osborne1 )
{
m_bank_0xxx->configure_entries(0, 1, m_ram->pointer(), 0);
@@ -443,10 +451,6 @@ TIMER_CALLBACK_MEMBER(osborne1_state::video_callback)
m_beep_state = (ra & 0x04) ? 1 : 0;
m_speaker->level_w((BIT(port_b, 5) && m_beep_state) ? 1 : 0);
- // Check reset key if necessary - it affects NMI
- if (!m_ub6a_q)
- m_maincpu->set_input_line(INPUT_LINE_NMI, (m_btn_reset->read() & 0x80) ? CLEAR_LINE : ASSERT_LINE);
-
m_video_timer->adjust(machine().first_screen()->time_until_pos(y + 1, 0));
}
diff --git a/src/mame/machine/pc9801_86.cpp b/src/mame/machine/pc9801_86.cpp
index f7d9b6245b0..5a2b80ea2b7 100644
--- a/src/mame/machine/pc9801_86.cpp
+++ b/src/mame/machine/pc9801_86.cpp
@@ -4,8 +4,8 @@
NEC PC-9801-86 sound card
- Similar to PC-9801-26, this one has YM2608 instead of YM2203 and an
- additional DAC port
+ Similar to PC-9801-26, this one has YM2608 instead of YM2203 and an
+ additional DAC port
TODO:
- joystick code should be shared between -26, -86 and -118
diff --git a/src/mame/machine/pc9801_kbd.cpp b/src/mame/machine/pc9801_kbd.cpp
index c0199096563..728c9c4b23b 100644
--- a/src/mame/machine/pc9801_kbd.cpp
+++ b/src/mame/machine/pc9801_kbd.cpp
@@ -9,7 +9,7 @@
- Verify untested keys:
STOP, COPY, and vf-1 through vf-5
- STOP is correct, verified with branmar2
+ STOP is correct, verified with branmar2
- Problems with natural keyboard (most nonprinting keys don't work)
diff --git a/src/mame/machine/retofinv.cpp b/src/mame/machine/retofinv.cpp
deleted file mode 100644
index 34aa9733b2a..00000000000
--- a/src/mame/machine/retofinv.cpp
+++ /dev/null
@@ -1,133 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Jarek Parchanski, Andrea Mazzoleni
-#include "emu.h"
-#include "cpu/z80/z80.h"
-#include "includes/retofinv.h"
-
-
-/***************************************************************************
-
- Return of Invaders 68705 protection interface
-
-***************************************************************************/
-
-
-READ8_MEMBER(retofinv_state::mcu_portA_r)
-{
-//logerror("%04x: 68705 port A read %02x\n",space.device().safe_pc(),m_portA_in);
- return (m_portA_out & m_ddrA) | (m_portA_in & ~m_ddrA);
-}
-
-WRITE8_MEMBER(retofinv_state::mcu_portA_w)
-{
-//logerror("%04x: 68705 port A write %02x\n",space.device().safe_pc(),data);
- m_portA_out = data;
-}
-
-WRITE8_MEMBER(retofinv_state::mcu_ddrA_w)
-{
- m_ddrA = data;
-}
-
-
-
-/*
- * Port B connections:
- *
- * all bits are logical 1 when read (+5V pullup)
- *
- * 1 W IRQ ack and enable latch which holds data from main Z80 memory
- * 2 W loads latch to Z80
- */
-
-
-READ8_MEMBER(retofinv_state::mcu_portB_r)
-{
- return (m_portB_out & m_ddrB) | (m_portB_in & ~m_ddrB);
-}
-
-WRITE8_MEMBER(retofinv_state::mcu_portB_w)
-{
-//logerror("%04x: 68705 port B write %02x\n",space.device().safe_pc(),data);
-
- if ((m_ddrB & 0x02) && (~data & 0x02) && (m_portB_out & 0x02))
- {
- m_portA_in = m_from_main;
- if (m_main_sent) m_68705->set_input_line(0, CLEAR_LINE);
- m_main_sent = 0;
-//logerror("read command %02x from main cpu\n",m_portA_in);
- }
- if ((m_ddrB & 0x04) && (data & 0x04) && (~m_portB_out & 0x04))
- {
-//logerror("send command %02x to main cpu\n",m_portA_out);
- m_from_mcu = m_portA_out;
- m_mcu_sent = 1;
- }
-
- m_portB_out = data;
-}
-
-WRITE8_MEMBER(retofinv_state::mcu_ddrB_w)
-{
- m_ddrB = data;
-}
-
-
-/*
- * Port C connections:
- *
- * all bits are logical 1 when read (+5V pullup)
- *
- * 0 R 1 when pending command Z80->68705
- * 1 R 0 when pending command 68705->Z80
- */
-
-
-READ8_MEMBER(retofinv_state::mcu_portC_r)
-{
- m_portC_in = 0;
- if (m_main_sent) m_portC_in |= 0x01;
- if (!m_mcu_sent) m_portC_in |= 0x02;
-//logerror("%04x: 68705 port C read %02x\n",space.device().safe_pc(),m_portC_in);
- return (m_portC_out & m_ddrC) | (m_portC_in & ~m_ddrC);
-}
-
-WRITE8_MEMBER(retofinv_state::mcu_portC_w)
-{
-logerror("%04x: 68705 port C write %02x\n",space.device().safe_pc(),data);
- m_portC_out = data;
-}
-
-WRITE8_MEMBER(retofinv_state::mcu_ddrC_w)
-{
- m_ddrC = data;
-}
-
-
-WRITE8_MEMBER(retofinv_state::mcu_w)
-{
-logerror("%04x: mcu_w %02x\n",space.device().safe_pc(),data);
- m_from_main = data;
- m_main_sent = 1;
- m_68705->set_input_line(0, ASSERT_LINE);
-}
-
-READ8_MEMBER(retofinv_state::mcu_r)
-{
-logerror("%04x: mcu_r %02x\n",space.device().safe_pc(),m_from_mcu);
- m_mcu_sent = 0;
- return m_from_mcu;
-}
-
-READ8_MEMBER(retofinv_state::mcu_status_r)
-{
- int res = 0;
-
- /* bit 4 = when 1, mcu is ready to receive data from main cpu */
- /* bit 5 = when 1, mcu has sent data to the main cpu */
-//logerror("%04x: mcu_status_r\n",space.device().safe_pc());
- if (!m_main_sent) res |= 0x10;
- if (m_mcu_sent) res |= 0x20;
-
- return res;
-}
diff --git a/src/mame/machine/rm380z.cpp b/src/mame/machine/rm380z.cpp
index 5bcf5c50004..a6931c93677 100644
--- a/src/mame/machine/rm380z.cpp
+++ b/src/mame/machine/rm380z.cpp
@@ -33,8 +33,8 @@ WRITE8_MEMBER( rm380z_state::port_write )
case 0xFC: // PORT0
//printf("FBFCw[%2.2x] FBFD [%2.2x] FBFE [%2.2x] PC [%4.4x] writenum [%4.4x]\n",data,m_fbfd,m_fbfe,m_maincpu->safe_pc(),writenum);
m_port0 = data;
-
- m_cassette->output((m_port0 & 0xEF) ? +1.0 : -1.0); // set 2400hz, bit 4
+
+ m_cassette->output((m_port0 & 0xEF) ? +1.0 : -1.0); // set 2400hz, bit 4
if (data&0x01)
{
@@ -64,7 +64,7 @@ WRITE8_MEMBER( rm380z_state::port_write )
case 0xFE: // line on screen to write to divided by 2
//printf("FBFC [%2.2x] FBFD [%2.2x] FBFEw[%2.2x] PC [%4.4x] writenum [%4.4x]\n",m_port0,m_fbfd,data,m_maincpu->safe_pc(),writenum);
m_fbfe=data;
-
+
break;
case 0xFF: // user I/O port
@@ -98,10 +98,10 @@ READ8_MEMBER( rm380z_state::port_read )
case 0xFE: // PORT1
if ((m_cassette)->input() < +0.0)
- m_port1 &= 0xDF; // bit 5 off
+ m_port1 &= 0xDF; // bit 5 off
else
- m_port1 |= 0x20; // bit 5 on
-
+ m_port1 |= 0x20; // bit 5 on
+
data = m_port1;
//printf("read of port1 from PC [%x]\n",m_maincpu->safe_pc());
break;
@@ -251,14 +251,14 @@ DRIVER_INIT_MEMBER( rm380z_state, rm380z34d )
{
m_videomode=RM380Z_VIDEOMODE_40COL;
m_old_videomode=m_videomode;
- m_port0_mask=0xdf; // disable 80 column mode
+ m_port0_mask=0xdf; // disable 80 column mode
}
DRIVER_INIT_MEMBER( rm380z_state, rm380z34e )
{
m_videomode=RM380Z_VIDEOMODE_40COL;
m_old_videomode=m_videomode;
- m_port0_mask=0xdf; // disable 80 column mode
+ m_port0_mask=0xdf; // disable 80 column mode
}
@@ -273,8 +273,8 @@ void rm380z_state::machine_reset()
m_old_old_fbfd=0x00;
writenum=0;
-// m_videomode=RM380Z_VIDEOMODE_80COL;
-// m_old_videomode=m_videomode;
+// m_videomode=RM380Z_VIDEOMODE_80COL;
+// m_old_videomode=m_videomode;
m_rasterlineCtr=0;
// note: from COS 4.0 videos, screen seems to show garbage at the beginning
diff --git a/src/mame/machine/stfight.cpp b/src/mame/machine/stfight.cpp
index d90cbc127bc..521555bbc33 100644
--- a/src/mame/machine/stfight.cpp
+++ b/src/mame/machine/stfight.cpp
@@ -10,11 +10,11 @@
***************************************************************************/
#include "emu.h"
-#include "cpu/z80/z80.h"
-#include "sound/msm5205.h"
#include "includes/stfight.h"
-
+#include "cpu/m6805/m68705.h"
+#include "cpu/z80/z80.h"
+#include "sound/msm5205.h"
/*
@@ -37,7 +37,7 @@ Encryption PAL 16R4 on CPU board
*/
-DRIVER_INIT_MEMBER(stfight_state,empcity)
+DRIVER_INIT_MEMBER(stfight_state, empcity)
{
uint8_t *rom = memregion("maincpu")->base();
@@ -64,35 +64,40 @@ DRIVER_INIT_MEMBER(stfight_state,empcity)
}
-DRIVER_INIT_MEMBER(stfight_state,stfight)
+DRIVER_INIT_MEMBER(stfight_state, stfight)
{
DRIVER_INIT_CALL(empcity);
}
-DRIVER_INIT_MEMBER(stfight_state,cshooter)
+DRIVER_INIT_MEMBER(stfight_state, cshooter)
{
}
void stfight_state::machine_start()
{
- membank("mainbank")->configure_entries(0, 4, memregion("maincpu")->base() + 0x10000, 0x4000);
- membank("mainbank")->set_entry(0);
+ m_main_bank->configure_entries(0, 4, memregion("maincpu")->base() + 0x10000, 0x4000);
+ m_main_bank->set_entry(0);
+
+ save_item(NAME(m_coin_state));
save_item(NAME(m_fm_data));
+
save_item(NAME(m_cpu_to_mcu_empty));
- save_item(NAME(m_adpcm_data_offs));
- save_item(NAME(m_adpcm_nibble));
+ save_item(NAME(m_cpu_to_mcu_data));
+ save_item(NAME(m_port_a_out));
+ save_item(NAME(m_port_c_out));
+
+ save_item(NAME(m_vck2));
save_item(NAME(m_adpcm_reset));
- save_item(NAME(m_coin_state));
- save_item(NAME(m_portC_out));
+ save_item(NAME(m_adpcm_data_offs));
}
void stfight_state::machine_reset()
{
m_fm_data = 0;
- m_adpcm_reset = 1;
- m_cpu_to_mcu_empty = 1;
+ m_cpu_to_mcu_empty = true;
+ m_adpcm_reset = true;
// Coin signals are active low
m_coin_state = 3;
@@ -102,15 +107,7 @@ void stfight_state::machine_reset()
// - in fact I don't even know how/where it's switched in!
WRITE8_MEMBER(stfight_state::stfight_bank_w)
{
- uint8_t bank_num = 0;
-
- if(data & 0x80)
- bank_num |= 2;
-
- if(data & 0x04)
- bank_num |= 1;
-
- membank("mainbank")->set_entry(bank_num);
+ m_main_bank->set_entry(bitswap(data, 7, 2));
}
/*
@@ -169,26 +166,19 @@ WRITE8_MEMBER(stfight_state::stfight_coin_w)
WRITE_LINE_MEMBER(stfight_state::stfight_adpcm_int)
{
- static int m_vck2 = 0;
-
// Falling edge triggered interrupt at half the rate of /VCK?
- if (m_vck2)
- m_mcu->set_input_line(0, HOLD_LINE);
-
- m_vck2 ^= 1;
+ m_mcu->set_input_line(M68705_IRQ_LINE, m_vck2 ? ASSERT_LINE : CLEAR_LINE);
+ m_vck2 = !m_vck2;
if (!m_adpcm_reset)
{
- const uint8_t *samples = memregion("adpcm")->base();
- uint8_t adpcm_data = samples[m_adpcm_data_offs & 0x7fff];
+ uint8_t adpcm_data = m_samples[(m_adpcm_data_offs >> 1) & 0x7fff];
- if (m_adpcm_nibble == 0)
+ if (!BIT(m_adpcm_data_offs, 0))
adpcm_data >>= 4;
- else
- ++m_adpcm_data_offs;
+ ++m_adpcm_data_offs;
m_msm->data_w(adpcm_data & 0x0f);
- m_adpcm_nibble ^= 1;
}
}
@@ -205,10 +195,11 @@ WRITE8_MEMBER(stfight_state::stfight_fm_w)
READ8_MEMBER(stfight_state::stfight_fm_r)
{
- uint8_t data = m_fm_data;
+ uint8_t const data = m_fm_data;
// Acknowledge the command
- m_fm_data &= ~0x80;
+ if (!space.debugger_access())
+ m_fm_data &= ~0x80;
return data;
}
@@ -221,51 +212,45 @@ READ8_MEMBER(stfight_state::stfight_fm_r)
WRITE8_MEMBER(stfight_state::stfight_mcu_w)
{
m_cpu_to_mcu_data = data & 0x0f;
- m_cpu_to_mcu_empty = 0;
+ m_cpu_to_mcu_empty = false;
}
WRITE8_MEMBER(stfight_state::stfight_68705_port_a_w)
{
- m_adpcm_data_offs = data << 8;
+ m_port_a_out = data;
}
READ8_MEMBER(stfight_state::stfight_68705_port_b_r)
{
- return (ioport("COIN")->read() << 6) | (m_cpu_to_mcu_empty << 4) | m_cpu_to_mcu_data;
+ return
+ (m_coin_mech->read() << 6) |
+ (m_cpu_to_mcu_empty ? 0x10 : 0x00) |
+ (m_cpu_to_mcu_data & 0x0f);
}
WRITE8_MEMBER(stfight_state::stfight_68705_port_b_w)
{
// Acknowledge Z80 command
- if (BIT(mem_mask, 5) && !BIT(data, 5))
- m_cpu_to_mcu_empty = 1;
+ if (!BIT(data, 5))
+ m_cpu_to_mcu_empty = true;
}
WRITE8_MEMBER(stfight_state::stfight_68705_port_c_w)
{
// Signal a valid coin on the falling edge
- if (BIT(mem_mask, 0) && BIT(m_portC_out, 0) && !BIT(data, 0))
+ if (BIT(m_port_c_out, 0) && !BIT(data, 0))
m_coin_state &= ~1;
- if (BIT(mem_mask, 1) && BIT(m_portC_out, 1) && !BIT(data, 1))
+ if (BIT(m_port_c_out, 1) && !BIT(data, 1))
m_coin_state &= ~2;
- if (BIT(mem_mask, 2))
- {
- if (BIT(data, 2))
- {
- m_adpcm_reset = 1;
- m_adpcm_nibble = 0;
- m_msm->reset_w(1);
- }
- else
- {
- m_adpcm_reset = 0;
- m_msm->reset_w(0);
- }
- }
+ // Latch ADPCM data address when dropping the reset line
+ m_adpcm_reset = BIT(data, 2);
+ if (!m_adpcm_reset && BIT(m_port_c_out, 2))
+ m_adpcm_data_offs = m_port_a_out << 9;
+ m_msm->reset_w(m_adpcm_reset ? ASSERT_LINE : CLEAR_LINE);
- if (BIT(mem_mask, 3))
- m_maincpu->set_input_line(INPUT_LINE_NMI, BIT(data, 3) ? CLEAR_LINE : ASSERT_LINE);
+ // Generate NMI on host CPU (used on handshake error or stuck coin)
+ m_maincpu->set_input_line(INPUT_LINE_NMI, BIT(data, 3) ? CLEAR_LINE : ASSERT_LINE);
- m_portC_out = data;
+ m_port_c_out = data;
}
diff --git a/src/mame/machine/taito68705interface.cpp b/src/mame/machine/taito68705interface.cpp
index 7605053dbe8..3cb18183b9a 100644
--- a/src/mame/machine/taito68705interface.cpp
+++ b/src/mame/machine/taito68705interface.cpp
@@ -21,6 +21,7 @@
matmania.cpp - maniach
nycaptor.cpp - nycaptor
renegade.cpp - renegade
+ retofinv.cpp - retofinv
slapfght.cpp - slapfght
xain.cpp - xsleena
@@ -37,7 +38,6 @@
bublbobl.cpp - bub68705 - this is a bootleg, not an official Taito hookup
changela.cpp - changela - looks like an ancestor of arkanoid without automatic semaphores
mexico86.cpp - knightb, mexico86 - bootleg 68705s
- retofinv.cpp - the current MCU dump is a bootleg at least
sqix.cpp - hotsmash - kaneko hookup, different from Taito ones.
there are other drivers (and games in existing drivers) that could hookup here, but currently lack MCU dumps.
diff --git a/src/mame/machine/tigeroad.cpp b/src/mame/machine/tigeroad.cpp
index d19b4e11dba..6153306b34d 100644
--- a/src/mame/machine/tigeroad.cpp
+++ b/src/mame/machine/tigeroad.cpp
@@ -124,91 +124,75 @@ WRITE16_MEMBER(tigeroad_state::f1dream_control_w)
}
-READ16_MEMBER(tigeroad_state::pushman_68705_r)
+READ16_MEMBER(pushman_state::mcu_comm_r)
{
- if (offset == 0)
- return m_latch;
-
- if (offset == 3 && m_new_latch)
+ switch (offset & 0x03)
{
- m_new_latch = 0;
- return 0;
+ case 0: // read and acknowledge MCU reply
+ if (!space.debugger_access())
+ m_mcu_semaphore = false;
+ return m_mcu_latch;
+ case 2: // expects bit 0 to be high when MCU has accepted command (other bits ignored)
+ return m_host_semaphore ? 0xfffe : 0xffff;
+ case 3: // expects bit 0 to be low when MCU has sent response (other bits ignored)
+ return m_mcu_semaphore ? 0xfffe : 0xffff;
}
- if (offset == 3 && !m_new_latch)
- return 0xff;
-
- return (m_shared_ram[2 * offset + 1] << 8) + m_shared_ram[2 * offset];
+ logerror("unknown MCU read offset %X & %04X\n", offset, mem_mask);
+ return 0xffff;
}
-WRITE16_MEMBER(tigeroad_state::pushman_68705_w)
+WRITE16_MEMBER(pushman_state::pushman_mcu_comm_w)
{
- if (ACCESSING_BITS_8_15)
- m_shared_ram[2 * offset] = data >> 8;
- if (ACCESSING_BITS_0_7)
- m_shared_ram[2 * offset + 1] = data & 0xff;
-
- if (offset == 1)
+ switch (offset & 0x01)
{
- m_mcu->set_input_line(M68705_IRQ_LINE, HOLD_LINE);
- space.device().execute().spin();
- m_new_latch = 0;
+ case 0:
+ m_host_latch = flipendian_int16(data);
+ break;
+ case 1:
+ m_mcu->pd_w(space, 0, data & 0x00ff);
+ m_host_semaphore = true;
+ m_mcu->set_input_line(M68705_IRQ_LINE, ASSERT_LINE);
+ break;
}
}
-/* ElSemi - Bouncing balls protection. */
-READ16_MEMBER(tigeroad_state::bballs_68705_r)
+WRITE16_MEMBER(pushman_state::bballs_mcu_comm_w)
{
- if (offset == 0)
- return m_latch;
- if (offset == 3 && m_new_latch)
- {
- m_new_latch = 0;
- return 0;
- }
- if (offset == 3 && !m_new_latch)
- return 0xff;
-
- return (m_shared_ram[2 * offset + 1] << 8) + m_shared_ram[2 * offset];
+ m_host_latch = data;
+ m_host_semaphore = true;
+ m_mcu->set_input_line(M68705_IRQ_LINE, ASSERT_LINE);
}
-WRITE16_MEMBER(tigeroad_state::bballs_68705_w)
+WRITE8_MEMBER(pushman_state::mcu_pa_w)
{
- if (ACCESSING_BITS_8_15)
- m_shared_ram[2 * offset] = data >> 8;
- if (ACCESSING_BITS_0_7)
- m_shared_ram[2 * offset + 1] = data & 0xff;
-
- if (offset == 0)
- {
- m_latch = 0;
- if (m_shared_ram[0] <= 0xf)
- {
- m_latch = m_shared_ram[0] << 2;
- if (m_shared_ram[1])
- m_latch |= 2;
- m_new_latch = 1;
- }
- else if (m_shared_ram[0])
- {
- if (m_shared_ram[1])
- m_latch |= 2;
- m_new_latch = 1;
- }
- }
+ m_mcu_output = (m_mcu_output & 0xff00) | (u16(data) & 0x00ff);
}
-
-READ8_MEMBER(tigeroad_state::pushman_68000_r)
+WRITE8_MEMBER(pushman_state::mcu_pb_w)
{
- return m_shared_ram[offset];
+ m_mcu_output = (m_mcu_output & 0x00ff) | (u16(data) << 8);
}
-WRITE8_MEMBER(tigeroad_state::pushman_68000_w)
+WRITE8_MEMBER(pushman_state::mcu_pc_w)
{
- if (offset == 2 && (m_shared_ram[2] & 2) == 0 && data & 2)
+ if (BIT(data, 0))
+ {
+ m_mcu->pa_w(space, 0, 0xff);
+ m_mcu->pb_w(space, 0, 0xff);
+ }
+ else
{
- m_latch = (m_shared_ram[1] << 8) | m_shared_ram[0];
- m_new_latch = 1;
+ m_host_semaphore = false;
+ m_mcu->set_input_line(M68705_IRQ_LINE, CLEAR_LINE);
+ m_mcu->pa_w(space, 0, (m_host_latch >> 0) & 0x00ff);
+ m_mcu->pb_w(space, 0, (m_host_latch >> 8) & 0x00ff);
}
- m_shared_ram[offset] = data;
+
+ if (BIT(m_mcu_latch_ctl, 1) && !BIT(data, 1))
+ {
+ m_mcu_latch = m_mcu_output & (BIT(m_mcu_latch_ctl, 0) ? 0xffff : m_host_latch);
+ m_mcu_semaphore = true;
+ }
+
+ m_mcu_latch_ctl = data;
}
diff --git a/src/mame/machine/zorbakbd.cpp b/src/mame/machine/zorbakbd.cpp
new file mode 100644
index 00000000000..1cb8be7ce20
--- /dev/null
+++ b/src/mame/machine/zorbakbd.cpp
@@ -0,0 +1,315 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+/*
+ * TTL-level serial matrix keyboard
+ *
+ * The keyboard MCU handles scanning the matrix and converting key down/
+ * up events to high-level characters for the host computer. The DIP
+ * switches are only read on startup.
+ *
+ * TODO: the eight "holes" generate control codes, six of them are break, home and the arrows
+ *
+ * Strangely, the Zorba configures its keyboard UART for 8N2 but this
+ * keyboard sends 8N1. If you type too fast or hold down a key until it
+ * repeats, characters will be dropped/corrupted. It's possible this is
+ * a dump of a different CP/M-compatible keyboard, not the one supplied
+ * with the Zorba.
+ *
+ * The Zorba manual describes a keyboard PROM with enough space to map
+ * all eight modifier combinations independently, however this keyboard
+ * contains no PROMs (just the MCU and demultiplexer), and the internal
+ * MCU EPROM only contains three tables for normal, shift, and control
+ * (caps lock is computed off the normal table by checking for letter
+ * characters).
+ *
+ * 0 1 2 3 4 5 6 7
+ * 0 F1 F13 3 # KP8 i I s S KP2 , <
+ * 1 F2 F14 4 $ KP9 o O d D KP3 . >
+ * 2 F3 F15 5 % p P f F / ?
+ * 3 F4 F16 6 ^ [ { g G KP0
+ * 4 F5 F17 7 & tab ] } h H shift KP.
+ * 5 F6 F18 8 * q Q KP4 j J z Z
+ * 6 F7 F19 9 ( w W KP5 k K x X
+ * 7 F8 ~ 0 ) e E KP6 l L c C space
+ * 8 F9 \ | - _ r R s-lock ; : v V newline
+ * 9 F10 ESC = + t T ctrl ' " b B KP-
+ * 10 F11 1 ! del y Y c-lock return n N
+ * 11 F12 2 @ KP7 u U a A KP1 m M
+ */
+#include "emu.h"
+#include "zorbakbd.h"
+
+#include "cpu/m6805/m68705.h"
+
+
+namespace {
+
+INPUT_PORTS_START(zorba_keyboard)
+ PORT_START("ROW0")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1))
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F13") PORT_CODE(KEYCODE_F13) PORT_CHAR(UCHAR_MAMEKEY(F13))
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#')
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("KP 8") PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD))
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I')
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S')
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("KP 2") PORT_CODE(KEYCODE_2_PAD) PORT_CHAR(UCHAR_MAMEKEY(2_PAD))
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
+
+ PORT_START("ROW1")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2))
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F14") PORT_CODE(KEYCODE_F14) PORT_CHAR(UCHAR_MAMEKEY(F14))
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$')
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("KP 9") PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD))
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O')
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D')
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("KP 3") PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD))
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
+
+ PORT_START("ROW2")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3))
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F15") PORT_CODE(KEYCODE_F15) PORT_CHAR(UCHAR_MAMEKEY(F15))
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%')
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) // b9
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P')
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F')
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) // b3
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
+
+ PORT_START("ROW3")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F4") PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4))
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F16") PORT_CODE(KEYCODE_F16) PORT_CHAR(UCHAR_MAMEKEY(F16))
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^')
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN ) // b7
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{')
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G')
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) // b4
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("KP 0") PORT_CODE(KEYCODE_0_PAD) PORT_CHAR(UCHAR_MAMEKEY(0_PAD))
+
+ PORT_START("ROW4")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5))
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F17") PORT_CODE(KEYCODE_F17) PORT_CHAR(UCHAR_MAMEKEY(F17))
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&')
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("TAB") PORT_CODE(KEYCODE_TAB) PORT_CHAR(9)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}')
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H')
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("KP .") PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD))
+
+ PORT_START("ROW5")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F6") PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6))
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F18") PORT_CODE(KEYCODE_F18) PORT_CHAR(UCHAR_MAMEKEY(F18))
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*')
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q')
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("KP 4") PORT_CODE(KEYCODE_4_PAD) PORT_CHAR(UCHAR_MAMEKEY(4_PAD))
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J')
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z')
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) // b5
+
+ PORT_START("ROW6")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F7") PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7))
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F19") PORT_CODE(KEYCODE_F19) PORT_CHAR(UCHAR_MAMEKEY(F19))
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(')
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W')
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("KP 5") PORT_CODE(KEYCODE_5_PAD) PORT_CHAR(UCHAR_MAMEKEY(5_PAD))
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K')
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X')
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) // b6
+
+ PORT_START("ROW7")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F8") PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8))
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("~ PRINT") PORT_CODE(KEYCODE_TILDE) PORT_CHAR('~') PORT_CHAR(UCHAR_MAMEKEY(PRTSCR))
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')')
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E')
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("KP 6") PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD))
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L')
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C')
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
+
+ PORT_START("ROW8")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F9") PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9))
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|')
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_')
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R')
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SHIFT LOCK") PORT_CODE(KEYCODE_LALT)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':')
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V')
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("NEW LINE") PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD))
+
+ PORT_START("ROW9")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F10") PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10))
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("ESC") PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC))
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+')
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T')
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("CTRL") PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL))
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('"')
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B')
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("KP -") PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD))
+
+ PORT_START("ROW10")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F11") PORT_CODE(KEYCODE_F11) PORT_CHAR(UCHAR_MAMEKEY(F11))
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("BS DEL") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) PORT_CHAR(UCHAR_MAMEKEY(DEL))
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y')
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("CAPS LOCK") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK))
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("RETURN") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N')
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) // e0
+
+ PORT_START("ROW11")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F12") PORT_CODE(KEYCODE_F12) PORT_CHAR(UCHAR_MAMEKEY(F12))
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@')
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("KP 7") PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD))
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U')
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A')
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("KP 1") PORT_CODE(KEYCODE_1_PAD) PORT_CHAR(UCHAR_MAMEKEY(1_PAD))
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M')
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) // e1
+
+ PORT_START("ROW12")
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) // scanned but the tables are too small so it would post garbage
+
+ PORT_START("ROW13")
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) // scanned but the tables are too small so it would post garbage
+
+ PORT_START("ROW14")
+ PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) // scanned but the tables are too small so it would post garbage
+
+ PORT_START("ROW15")
+ PORT_DIPNAME( 0x07, 0x07, "Diagnostic Mode" )
+ PORT_DIPSETTING( 0x07, "0 (Normal)" )
+ PORT_DIPSETTING( 0x06, "1 (Dump Tables)" )
+ PORT_DIPSETTING( 0x05, "2 (Report Revision)" )
+ PORT_DIPSETTING( 0x04, "3 (Serial Test)" )
+ PORT_DIPSETTING( 0x03, "4 (Serial Echo)" )
+ PORT_DIPSETTING( 0x02, "5 (Output Test)" )
+ PORT_DIPSETTING( 0x01, "6 (Normal)" )
+ PORT_DIPSETTING( 0x00, "7 (Dump Tables)" )
+ PORT_DIPNAME( 0x08, 0x08, "Key Repeat" )
+ PORT_DIPSETTING( 0x08, DEF_STR(On) )
+ PORT_DIPSETTING( 0x00, DEF_STR(Off) )
+ PORT_DIPNAME( 0x10, 0x10, "Baud Rate" )
+ PORT_DIPSETTING( 0x10, "1200" )
+ PORT_DIPSETTING( 0x00, "300" )
+ PORT_DIPNAME( 0x20, 0x20, "Key Click" )
+ PORT_DIPSETTING( 0x20, DEF_STR(On) )
+ PORT_DIPSETTING( 0x00, DEF_STR(Off) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR(Unknown) )
+ PORT_DIPSETTING( 0x40, DEF_STR(Off) )
+ PORT_DIPSETTING( 0x00, DEF_STR(On) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR(Unknown) )
+ PORT_DIPSETTING( 0x80, DEF_STR(Off) )
+ PORT_DIPSETTING( 0x00, DEF_STR(On) )
+INPUT_PORTS_END
+
+
+MACHINE_CONFIG_FRAGMENT(zorba_keyboard)
+ // MC68705P3S
+ MCFG_CPU_ADD("mcu", M68705P3, XTAL_3_579545MHz * 1.05) // the 1.05 is a hack to get better sync with the host's USART - something's off in our timings
+ MCFG_M68705_PORTA_R_CB(READ8(zorba_keyboard_device, mcu_pa_r));
+ MCFG_M68705_PORTB_R_CB(READ8(zorba_keyboard_device, mcu_pb_r));
+ MCFG_M68705_PORTB_W_CB(WRITE8(zorba_keyboard_device, mcu_pb_w));
+ MCFG_M68705_PORTC_W_CB(WRITE8(zorba_keyboard_device, mcu_pc_w));
+
+ // TODO: beeper frequency is unknown, using value from Sun keyboard for now
+ MCFG_SPEAKER_STANDARD_MONO("bell")
+ MCFG_SOUND_ADD("beeper", BEEP, ATTOSECONDS_TO_HZ(480 * ATTOSECONDS_PER_MICROSECOND))
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "bell", 0.4)
+MACHINE_CONFIG_END
+
+
+ROM_START(zorba_keyboard)
+ ROM_REGION(0x0800, "mcu", 0)
+ ROM_LOAD( "8999-1 3-28-83", 0x080, 0x780, CRC(79fe6c0d) SHA1(4b6fca9379d5199d1347ad1187cbfdebfc4c73e7) )
+ROM_END
+
+} // anonymous namespace
+
+
+device_type const ZORBA_KEYBOARD = &device_creator<zorba_keyboard_device>;
+
+
+zorba_keyboard_device::zorba_keyboard_device(
+ machine_config const &mconfig,
+ char const *tag,
+ device_t *owner,
+ uint32_t clock)
+ : device_t(
+ mconfig,
+ ZORBA_KEYBOARD,
+ "Zorba Keyboard",
+ tag,
+ owner,
+ clock,
+ "zorba_kbd",
+ __FILE__)
+ , m_rows(*this, "ROW%u", 0)
+ , m_beeper(*this, "beeper")
+ , m_rxd_cb(*this)
+ , m_txd_high(true)
+ , m_row_select(0)
+{
+}
+
+
+WRITE_LINE_MEMBER(zorba_keyboard_device::txd_w)
+{
+ m_txd_high = CLEAR_LINE != state;
+}
+
+
+READ8_MEMBER(zorba_keyboard_device::mcu_pa_r)
+{
+ return m_rows[m_row_select]->read();
+}
+
+
+READ8_MEMBER(zorba_keyboard_device::mcu_pb_r)
+{
+ return m_txd_high ? 0x7f : 0xff;
+}
+
+
+WRITE8_MEMBER(zorba_keyboard_device::mcu_pb_w)
+{
+ // TODO: bits 2/3/4 do something; some photos show F17/F18/F19 with LED windows
+ m_rxd_cb(BIT(data, 6) ? 0 : 1);
+ m_beeper->set_state(BIT(data, 5) ? 0 : 1);
+ machine().output().set_value("led_key_caps_lock", BIT(data, 1) ? 0 : 1);
+ machine().output().set_value("led_key_shift_lock", BIT(data, 0) ? 0 : 1);
+}
+
+
+WRITE8_MEMBER(zorba_keyboard_device::mcu_pc_w)
+{
+ m_row_select = data & 0x0f;
+}
+
+
+void zorba_keyboard_device::device_start()
+{
+ m_rxd_cb.resolve_safe();
+
+ save_item(NAME(m_txd_high));
+ save_item(NAME(m_row_select));
+
+ m_txd_high = true;
+ m_row_select = 0;
+}
+
+
+machine_config_constructor zorba_keyboard_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME(zorba_keyboard);
+}
+
+
+ioport_constructor zorba_keyboard_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(zorba_keyboard);
+}
+
+
+tiny_rom_entry const *zorba_keyboard_device::device_rom_region() const
+{
+ return ROM_NAME(zorba_keyboard);
+}
diff --git a/src/mame/machine/zorbakbd.h b/src/mame/machine/zorbakbd.h
new file mode 100644
index 00000000000..6d03fc5a9c5
--- /dev/null
+++ b/src/mame/machine/zorbakbd.h
@@ -0,0 +1,43 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+#ifndef MAME_MACHINE_ZORBAKBD_H
+#define MAME_MACHINE_ZORBAKBD_H
+
+#include "sound/beep.h"
+
+
+extern device_type const ZORBA_KEYBOARD;
+
+#define MCFG_ZORBA_KEYBOARD_RXD_CB(cb) \
+ zorba_keyboard_device::set_rxd_cb(*device, DEVCB_##cb);
+
+class zorba_keyboard_device : public device_t
+{
+public:
+ template <typename Obj> static devcb_base &set_rxd_cb(device_t &device, Obj &&object)
+ { return downcast<zorba_keyboard_device &>(device).m_rxd_cb.set_callback(std::forward<Obj>(object)); }
+
+ zorba_keyboard_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock);
+
+ DECLARE_WRITE_LINE_MEMBER(txd_w);
+
+ DECLARE_READ8_MEMBER(mcu_pa_r);
+ DECLARE_READ8_MEMBER(mcu_pb_r);
+ DECLARE_WRITE8_MEMBER(mcu_pb_w);
+ DECLARE_WRITE8_MEMBER(mcu_pc_w);
+
+protected:
+ virtual void device_start() override;
+ virtual machine_config_constructor device_mconfig_additions() const override;
+ virtual ioport_constructor device_input_ports() const override;
+ virtual tiny_rom_entry const *device_rom_region() const override;
+
+ required_ioport_array<16> m_rows;
+ required_device<beep_device> m_beeper;
+ devcb_write_line m_rxd_cb;
+
+ bool m_txd_high;
+ u8 m_row_select;
+};
+
+#endif // MAME_MACHINE_ZORBAKBD_H
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 0e4f922f41d..449a4744036 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -1414,6 +1414,8 @@ dolphntr // (c) 1996
dolphntra // (c) 1996
dolphntrb
dolphntru // (c) 1996
+dolphntrce
+drgneye
dynajack
eldorda5
eforsta5 // (c) 1995
@@ -1425,6 +1427,7 @@ genmagi
gnomeatw
goldpyr // (c) 1997
goldpyra // (c) 1997
+goldpyrb
goldenra
incasun
incasunsp
@@ -1444,6 +1447,7 @@ magimaska // (c) 2000
magtcha5
marmagic // (c) 2000
marmagicu // (c) 2000
+marmagicua
minemine // (c) 1996
monmouse
montree
@@ -1453,6 +1457,7 @@ mystgard
orchidms
oscara5
pantmag
+pantmaga
partygrs // (c) 2001
partygrsa // (c) 2001
peaflut
@@ -1460,7 +1465,10 @@ pengpay
pengpaya
pengpayb
pengpayu // (c) 1997
+penpir2
petshop
+petshopa
+phantpay
przfight
qcash
qnile
@@ -1469,6 +1477,7 @@ qnileb // (c) 1997
qnilec
qnileu // (c) 1997
qnilemax
+qtbird
rainwrce
reelrock // (c) 1998
retrsam
@@ -1493,6 +1502,8 @@ wamazonv
wildbill
wcougar
wcougaru // (c) 1997
+wizways
+wnpost
wthing
wtiger // (c) 1999
@@ -11965,6 +11976,7 @@ deluxe5a // (c) 2000 ESD
deluxe5b // (c) 2000 ESD
deluxe4u // (c) 2000 ESD
hedpanic // (c) 2000 ESD
+hedpanica // (c) 1999 ESD
hedpanicf // (c) 2000 ESD + Fuuki, Co. Ltd.
hedpanico // (c) 1999 ESD
jumppop // (c) 2001 ESD
@@ -12060,6 +12072,7 @@ fax // (c) 1983
fax2 // (c) 1983
hardhat // (c) 1982
mtrap // (c) 1981
+mtrap2 // (c) 1981
mtrap3 // (c) 1981
mtrap4 // (c) 1981
mtrapb // bootleg
@@ -12215,7 +12228,13 @@ fb01 // 1986 FB-01
fc100 //
@source:fccpu20.cpp
-fccpu20
+fccpu20sbc
+fccpu21ssbc
+fccpu21sbc
+fccpu21asbc
+fccpu21yasbc
+fccpu21bsbc
+fccpu21ybsbc
@source:fccpu30.cpp
fccpu30
@@ -12557,6 +12576,7 @@ magicrd2 // (c) 1996 Impera
magicrd2a // (c) 1996 Impera
magicrd2b // (c) 1996 Impera
magicrd2c // (c) 1996 Impera
+megacard // (c) 1993 Fun World
mongolnw // 199? bootleg
multiwin // (c) 1992 Fun World
novoplay // (c) 1986 Novomatic
@@ -13958,6 +13978,7 @@ jamesb //
jamesb2 //
marsp //
marspf //
+marspp //
panthera //
pnkpnthr //
s80tst //
@@ -13997,37 +14018,71 @@ touchdn //
@source:gts80b.cpp
amazonh2 //
amazonh3 //
+amazonh3a //
arena //
arenaa //
+arenaf //
+arenag //
badgirls //
+badgirlsf //
+badgirlsg //
bighouse //
+bighousef //
+bighouseg //
bonebstr //
bonebstrf //
+bonebstrg //
bountyh //
+bountyhg //
diamondp //
+diamondpf //
+diamondpg //
excalibr //
+excalibrf //
genesisp //
+genesispf //
+genesispg //
goldwing //
+goldwingf //
+goldwingg //
hlywoodh //
+hlywoodhf //
+hlywoodhg //
hotshots //
+hotshotsf //
+hotshotsg //
mntecrlo //
+mntecrlo2 //
mntecrloa //
+mntecrlof //
+mntecrlog //
nmoves //
raven //
ravena //
+raveng //
robowars //
+robowarsf //
rock //
+rockg //
rock_enc //
+rock_encg //
s80btest //
sprbreak //
sprbreaka //
+sprbreakf //
+sprbreakg //
sprbreaks //
tagteamp //
tagteamp2 //
+tagteampg //
triplay //
triplaya //
txsector //
+txsectorf //
+txsectorg //
victoryp //
+victorypf //
+victorypg //
@source:guab.cpp
crisscrs // (c) 1986
@@ -14200,7 +14255,9 @@ einvaderc // Entex
funjacks // Mattel
funrlgl // Mattel
h2hbaskb // Coleco
+lchicken // LJN
lightfgt // Milton Bradley
+mdallas // Mattel
plus1 // Milton Bradley
qkracer // National Semiconductor
@@ -14286,6 +14343,7 @@ elecbowl // Marx
elecdet // Ideal
esbattle // Entex
esoccer // Entex
+f2pbball // Fonas
fxmcr165 // Gakken
ginv1000 // Gakken
gjackpot // Gakken
@@ -14293,6 +14351,7 @@ gpoker // Gakken
h2hbaseb // Coleco
h2hboxing // Coleco
h2hfootb // Coleco
+horseran // Mattel
lostreas // Parker Bros
matchnum // A-One
mathmagi // APF
@@ -14667,6 +14726,7 @@ lhbv33c // (c) 1995
nkishusp // (c) 1998
ryukobou // (c) 1995
vbowl // (c) 1996
+vbowlhk // (c) 1996
vbowlj // (c) 1996
wlcc // (c) 1996
xymg // (c) 1996
@@ -14768,6 +14828,9 @@ instruct //
hector1 //
interact //
+@source:interpro.cpp
+ip2800 // Intergraph InterPro 28xx workstation
+
@source:intrscti.cpp
intrscti // ????
@@ -20411,6 +20474,7 @@ mcombats // bootleg
missile // 035820-035825 (c) 1980, 1 ROM update to rev 2 board
missile1 // 035820-035825 (c) 1980
missile2 // 035820-035825 (c) 1980
+missilea // bootleg (Ugames)
missilem // hack
suprmatk // (c) 1980 + (c) 1981 Gencomp
suprmatkd // (c) 1980 + (c) 1981 Gencomp
@@ -20497,7 +20561,6 @@ alm16 // 1988 Mephisto Almeria 68000
alm32 // 1988 Mephisto Alimera 68020
berlinp // 1994 Mephisto Berlin Pro 68020
bpl32 // 1996 Mephisto Berlin Pro London Upgrade V5.00
-diablo68 // 1991 Novag Diablo 68000 Chess Computer
gen32 // 1993 Mephisto Genius030 V4.00
gen32_41 // 1993 Mephisto Genius030 V4.01
lond020 // 1996 Mephisto London 68020 32 Bit
@@ -28431,11 +28494,16 @@ ss2005 // 2005.04 Super Shanghai 2005 (Rev A)
ss2005o // 2005.03 Super Shanghai 2005
sstrkfgt // 2000.10 Sega Strike Fighter (Rev A)
sstrkfgta // 2000.10 Sega Strike Fighter (Rev A, no training mode)
-starhrcl // 2000.11.28 Star Horse (satellite)
-starhrct // 2000.12 Star Horse (server)
-starhrpr // 2009.07.27 Star Horse Progress Returns (satellite)
-starhrse // 2000.?? Star Horse (big screens)
-starhrsp // 2003.12.01 Star Horse Progress (satellite) (Rev A)
+shorse // 2000.11.28 Star Horse (satellite)
+shorsem // 2000.?? Star Horse (main screens)
+shorsel // 2000.12 Star Horse (live and backup)
+shors2k1 // 2002.01.09 Star Horse 2001 (satellite, Rev B)
+shorsep // 2003.12.01 Star Horse Progress (satellite, Rev A)
+shorsepm // 2003.?? Star Horse Progress (main screens, Rev B)
+shorseps // 2003.12.02 Star Horse Progress (sound & backup, Rev A)
+shorsepb // 2000.?? Star Horse Progress (backup data)
+shorsepl // 2003.12.02 Star Horse Progress (live, Rev A)
+shorsepr // 2009.07.27 Star Horse Progress Returns (satellite)
starseek // 2001.07 Dokidoki Idol Star Seeker
suchie3 // 1999.09 Idol Janshi Su-Chi-Pi 3
sushibar // 2003 Sushi Bar
@@ -28487,7 +28555,8 @@ wccf331e // 2005.06 World Club Champion Football European
wccf420e // 2006.08 World Club Champion Football European Clubs 2005-2006
wldkicks // 2000.03 World Kicks (US, WK3 Ver.A)
wldkicksa // 2000.03 World Kicks (Asia, WK2 Ver.A)
-wldkicksj // 2000.03 World Kicks PCB (Japan, WKC1 Ver.A)
+wldkicksj // 2000.03 World Kicks (Japan, WK1 Ver.A)
+wldkickspj // 2000.03 World Kicks PCB (Japan, WKC1 Ver.A)
wldrider // 2001.05 Wild Riders
wrungp // 2001.08 Wave Runner GP
wrungpo // 2001.?? Wave Runner GP (USA, Rev A)
@@ -28798,6 +28867,7 @@ kof99 // 0251 (c) 1999 SNK
kof99e // 0251 (c) 1999 SNK
kof99h // 0251 (c) 1999 SNK
kof99k // 0152 (c) 1999 SNK
+kof99ka // 0152 (c) 1999 SNK
kof99p // 0251 (c) 1999 SNK
kog // bootleg of kof97
kotm // 0016 (c) 1991 SNK
@@ -29119,6 +29189,7 @@ redfoxwp2a // (c) 1998 (China)
redhawk // (c) 1997 New Vision Ent. license
redhawkb // (c) 1997
redhawke // (c) 1997 Excellent Co., Ltd license
+redhawkg // (c) 1997
redhawki // (c) 1997 Haedong Corp. license
redhawkk // (c) 1997
sabotenb // (c) 1992 NMK / Tecmo
@@ -29220,6 +29291,9 @@ sforteb //
sfortec //
supercon //
+@source:novag68k.cpp
+diablo68 //
+
@source:nsm.cpp
firebird //
@@ -31019,6 +31093,7 @@ poly880 //
@source:polyplay.cpp
polyplay //
polyplay2 //
+polyplay2c //
@source:pong.cpp
breakout // (c) 1976 Atari
@@ -31981,8 +32056,11 @@ pool_p7 //
radcl_g1 //
radcl_l1 //
radcl_p3 //
+rollr_d2 //
rollr_e1 //
rollr_ex //
+rollr_f2 //
+rollr_f3 //
rollr_g3 //
rollr_l2 //
rollr_l3 //
@@ -34435,6 +34513,7 @@ vfremix // 1995.06 Virtua Fighter Remix
vmahjong // 1997.02 Virtual Mahjong (Micronet)
winterht // 1997.10 Winter Heat (Data East)
znpwfv // 1997.12 Zen Nippon Pro Wrestling featuring Virtua
+znpwfvt // 1997.12 Zen Nippon Pro Wrestling featuring Virtua
@source:su2000.cpp
su2000 // (c) 1993 Virtuality
@@ -34630,8 +34709,9 @@ galpanis // 1997.04 (c) 1997 Kaneko (Europe)
galpanise // 1997.04 (c) 1997 Kaneko (Europe)
galpanisj // 1997.04 (c) 1997 Kaneko (Japan)
galpanisk // 1997.04 (c) 1997 Kaneko (Korea)
-galpans2 // 1999.02 (c) 1999 Kaneko (Japan)
+galpans2 // 1999.?? (c) 1999 Kaneko (Europe)
galpans2a // 1999.?? (c) 1999 Kaneko (Asia)
+galpans2j // 1999.02 (c) 1999 Kaneko (Japan)
galpans3 // 2002.07 (c) 2002 Kaneko (Japan)
galpansu // 1999.?? (c) 1999 Kaneko (Korea)
gutsn // 2000.06 (c) 2000 Kaneko / Kouyousha (Japan)
@@ -34650,9 +34730,11 @@ sarukani // 1997.01 (c) 1997 Kaneko / Mediaworks (Japan)
sengekis // 1997.?? (c) 1997 Kaneko / Warashi (Asia)
sengekisj // 1997.07 (c) 1997 Kaneko / Warashi (Japan)
senknow // 1999.04 (c) 1999 Kaneko / Kouyousha (Japan)
-skns //
+skns // - BIOS - various regions
teljan // 1999.11 (c) 1999 Electro Design Co. (Japan)
-vblokbrk // 1997.?? (c) 1997 Kaneko / Mediaworks (Asia)
+vblokbrk // 1997.?? (c) 1997 Kaneko / Mediaworks (Europe)
+vblokbrka // 1997.?? (c) 1997 Kaneko / Mediaworks (Asia)
+
@source:suprridr.cpp
suprridr // (c) 1983 Venture Line + Taito license
@@ -35101,6 +35183,7 @@ puzznicb // bootleg
puzznicba // bootleg
puzznici // bootleg
puzznicj // C20 (c) 1989 Taito Corporation (Japan)
+puzznicu // C20 (c) 1989 Taito America Corporation (US)
raimais // B36 (c) 1988 Taito Corporation (Japan)
raimaisj // B36 (c) 1988 Taito Corporation
raimaisjo // B36 (c) 1988 Taito Corporation
@@ -37978,6 +38061,7 @@ sfex2p // Street Fighter EX 2 Plus (USA 990611)
sfex2pa // Street Fighter EX 2 Plus (ASIA 990611)
sfex2ph // Street Fighter EX 2 Plus (HISPANIC 990611)
sfex2pj // Street Fighter EX 2 Plus (JAPAN 990611)
+sfex2u1 // Street Fighter EX 2 (USA 980312)
sfexa // Street Fighter EX (ASIA 961219)
sfexj // Street Fighter EX (JAPAN 961130)
sfexp // Street Fighter EX Plus (USA 970407)
diff --git a/src/mame/mess.flt b/src/mame/mess.flt
index 66b57c88741..d9ef0963233 100644
--- a/src/mame/mess.flt
+++ b/src/mame/mess.flt
@@ -268,6 +268,7 @@ indigo.cpp
indy_indigo2.cpp
instruct.cpp
interact.cpp
+interpro.cpp
intv.cpp
ipc.cpp
ipds.cpp
@@ -398,6 +399,7 @@ ngp.cpp
nokia_3310.cpp
notetaker.cpp
novag6502.cpp
+novag68k.cpp
ob68k1a.cpp
octopus.cpp
odyssey2.cpp
diff --git a/src/mame/video/combatsc.cpp b/src/mame/video/combatsc.cpp
index e53b1c5fa14..cae826bfec7 100644
--- a/src/mame/video/combatsc.cpp
+++ b/src/mame/video/combatsc.cpp
@@ -431,7 +431,7 @@ uint32_t combatsc_state::screen_update_combatsc(screen_device &screen, bitmap_in
{
rectangle clip;
clip = cliprect;
-
+
for (i = 0; i < 32; i++)
{
// scrollram [0x20]-[0x3f]: char enable (presumably bit 0 only)
@@ -439,7 +439,7 @@ uint32_t combatsc_state::screen_update_combatsc(screen_device &screen, bitmap_in
if(m_scrollram[base_scroll] == 0)
continue;
-
+
clip.min_y = i * 8;
clip.max_y = clip.min_y + 7;
diff --git a/src/mame/video/deco16ic.cpp b/src/mame/video/deco16ic.cpp
index 5549b11e137..8cd4f6c57ee 100644
--- a/src/mame/video/deco16ic.cpp
+++ b/src/mame/video/deco16ic.cpp
@@ -735,7 +735,7 @@ static int deco16_pf_update(
if (tilemap_8x8)
{
int numrows = rows;
-
+
// wolffang uses a larger 8x8 tilemap for the Japanese intro text, everything else seems to need this logic tho?
if (!(tilemapsizes & 4))
numrows = rows >> 1;
diff --git a/src/mame/video/goldstar.cpp b/src/mame/video/goldstar.cpp
index f7c4477e57e..369c6f89de1 100644
--- a/src/mame/video/goldstar.cpp
+++ b/src/mame/video/goldstar.cpp
@@ -487,9 +487,9 @@ uint32_t wingco_state::screen_update_mbstar(screen_device &screen, bitmap_ind16
const rectangle visible2(0*8, (14+48)*8-1, 14*8, (36+7)*8-1); // seems to be the one used...
const rectangle visible3(0*8, (14+48)*8-1, 4*8, (4+7)*8-1);
-// m_reel1_tilemap->draw(screen, bitmap, visible1, 0, 0);
+// m_reel1_tilemap->draw(screen, bitmap, visible1, 0, 0);
m_reel2_tilemap->draw(screen, bitmap, visible2, 0, 0);
-// m_reel3_tilemap->draw(screen, bitmap, visible3, 0, 0);
+// m_reel3_tilemap->draw(screen, bitmap, visible3, 0, 0);
}
if (m_cm_enable_reg & 0x02)
diff --git a/src/mame/video/gundealr.cpp b/src/mame/video/gundealr.cpp
index 5f528fd44bb..0f92327b189 100644
--- a/src/mame/video/gundealr.cpp
+++ b/src/mame/video/gundealr.cpp
@@ -111,8 +111,12 @@ WRITE8_MEMBER(gundealr_state::yamyam_fg_scroll_w)
WRITE8_MEMBER(gundealr_state::gundealr_flipscreen_w)
{
- m_flipscreen = data;
- machine().tilemap().set_flip_all(m_flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
+ machine().tilemap().set_flip_all(BIT(data, 0) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
+}
+
+WRITE8_MEMBER(gundealr_state::yamyam_flipscreen_w)
+{
+ machine().tilemap().set_flip_all(BIT(data, 7) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
}
diff --git a/src/mame/video/n64.cpp b/src/mame/video/n64.cpp
index ac784a06431..66449ac7425 100644
--- a/src/mame/video/n64.cpp
+++ b/src/mame/video/n64.cpp
@@ -151,6 +151,8 @@ uint32_t n64_state::screen_update_n64(screen_device &screen, bitmap_rgb32 &bitma
}
*/
+ m_rdp->mark_frame();
+
if (n64->vi_blank)
{
bitmap.fill(0, screen.visible_area());
@@ -168,6 +170,7 @@ void n64_state::screen_eof_n64(screen_device &screen, bool state)
void n64_periphs::video_update(bitmap_rgb32 &bitmap)
{
+
if(vi_control & 0x40) /* Interlace */
{
field ^= 1;
@@ -1095,15 +1098,15 @@ uint32_t n64_rdp::get_log2(uint32_t lod_clamp)
/*****************************************************************************/
-uint32_t n64_rdp::read_data(uint32_t address)
+uint64_t n64_rdp::read_data(uint32_t address)
{
if (m_status & 0x1) // XBUS_DMEM_DMA enabled
{
- return m_dmem[(address & 0xfff) / 4];
+ return (uint64_t(m_dmem[(address & 0xfff) / 4]) << 32) | m_dmem[((address + 4) & 0xfff) / 4];
}
else
{
- return m_rdram[((address & 0xffffff) / 4)];
+ return (uint64_t(m_rdram[((address & 0xffffff) / 4)]) << 32) | m_rdram[(((address + 4) & 0xffffff) / 4)];
}
}
@@ -1192,39 +1195,38 @@ void n64_rdp::disassemble(char* buffer)
char drdy[32], dgdy[32], dbdy[32], dady[32];
char drde[32], dgde[32], dbde[32], dade[32];
- uint32_t cmd[64];
+ uint64_t cmd[32];
- const uint32_t length = m_cmd_ptr * 4;
+ const uint32_t length = m_cmd_ptr * 8;
if (length < 8)
{
sprintf(buffer, "ERROR: length = %d\n", length);
return;
}
- cmd[0] = m_cmd_data[m_cmd_cur+0];
- cmd[1] = m_cmd_data[m_cmd_cur+1];
+ cmd[0] = m_cmd_data[m_cmd_cur];
- const int32_t tile = (cmd[1] >> 24) & 0x7;
- sprintf(sl, "%4.2f", (float)((cmd[0] >> 12) & 0xfff) / 4.0f);
- sprintf(tl, "%4.2f", (float)((cmd[0] >> 0) & 0xfff) / 4.0f);
- sprintf(sh, "%4.2f", (float)((cmd[1] >> 12) & 0xfff) / 4.0f);
- sprintf(th, "%4.2f", (float)((cmd[1] >> 0) & 0xfff) / 4.0f);
+ const int32_t tile = (cmd[0] >> 56) & 0x7;
+ sprintf(sl, "%4.2f", (float)((cmd[0] >> 44) & 0xfff) / 4.0f);
+ sprintf(tl, "%4.2f", (float)((cmd[0] >> 32) & 0xfff) / 4.0f);
+ sprintf(sh, "%4.2f", (float)((cmd[0] >> 12) & 0xfff) / 4.0f);
+ sprintf(th, "%4.2f", (float)((cmd[0] >> 0) & 0xfff) / 4.0f);
- const char* format = s_image_format[(cmd[0] >> 21) & 0x7];
- const char* size = s_image_size[(cmd[0] >> 19) & 0x3];
+ const char* format = s_image_format[(cmd[0] >> 53) & 0x7];
+ const char* size = s_image_size[(cmd[0] >> 51) & 0x3];
- const uint32_t r = (cmd[1] >> 24) & 0xff;
- const uint32_t g = (cmd[1] >> 16) & 0xff;
- const uint32_t b = (cmd[1] >> 8) & 0xff;
- const uint32_t a = (cmd[1] >> 0) & 0xff;
+ const uint32_t r = (cmd[0] >> 24) & 0xff;
+ const uint32_t g = (cmd[0] >> 16) & 0xff;
+ const uint32_t b = (cmd[0] >> 8) & 0xff;
+ const uint32_t a = (cmd[0] >> 0) & 0xff;
- const uint32_t command = (cmd[0] >> 24) & 0x3f;
+ const uint32_t command = (cmd[0] >> 56) & 0x3f;
switch (command)
{
case 0x00: sprintf(buffer, "No Op"); break;
case 0x08: // Tri_NoShade
{
- const int32_t lft = (command >> 23) & 0x1;
+ const int32_t lft = (cmd[0] >> 55) & 0x1;
if (length != s_rdp_command_length[command])
{
@@ -1232,29 +1234,26 @@ void n64_rdp::disassemble(char* buffer)
return;
}
+ cmd[1] = m_cmd_data[m_cmd_cur+1];
cmd[2] = m_cmd_data[m_cmd_cur+2];
cmd[3] = m_cmd_data[m_cmd_cur+3];
- cmd[4] = m_cmd_data[m_cmd_cur+4];
- cmd[5] = m_cmd_data[m_cmd_cur+5];
- cmd[6] = m_cmd_data[m_cmd_cur+6];
- cmd[7] = m_cmd_data[m_cmd_cur+7];
-
- sprintf(yl, "%4.4f", (float)((cmd[0] >> 0) & 0x1fff) / 4.0f);
- sprintf(ym, "%4.4f", (float)((cmd[1] >> 16) & 0x1fff) / 4.0f);
- sprintf(yh, "%4.4f", (float)((cmd[1] >> 0) & 0x1fff) / 4.0f);
- sprintf(xl, "%4.4f", (float)(cmd[2] / 65536.0f));
- sprintf(dxldy, "%4.4f", (float)(cmd[3] / 65536.0f));
- sprintf(xh, "%4.4f", (float)(cmd[4] / 65536.0f));
- sprintf(dxhdy, "%4.4f", (float)(cmd[5] / 65536.0f));
- sprintf(xm, "%4.4f", (float)(cmd[6] / 65536.0f));
- sprintf(dxmdy, "%4.4f", (float)(cmd[7] / 65536.0f));
+
+ sprintf(yl, "%4.4f", (float)((cmd[0] >> 32) & 0x1fff) / 4.0f);
+ sprintf(ym, "%4.4f", (float)((cmd[0] >> 16) & 0x1fff) / 4.0f);
+ sprintf(yh, "%4.4f", (float)((cmd[0] >> 0) & 0x1fff) / 4.0f);
+ sprintf(xl, "%4.4f", (float)int32_t(cmd[1] >> 32) / 65536.0f);
+ sprintf(dxldy, "%4.4f", (float)int32_t(cmd[1]) / 65536.0f);
+ sprintf(xh, "%4.4f", (float)int32_t(cmd[2] >> 32) / 65536.0f);
+ sprintf(dxhdy, "%4.4f", (float)int32_t(cmd[2]) / 65536.0f);
+ sprintf(xm, "%4.4f", (float)int32_t(cmd[3] >> 32) / 65536.0f);
+ sprintf(dxmdy, "%4.4f", (float)int32_t(cmd[3]) / 65536.0f);
sprintf(buffer, "Tri_NoShade %d, XL: %s, XM: %s, XH: %s, YL: %s, YM: %s, YH: %s\n", lft, xl,xm,xh,yl,ym,yh);
break;
}
case 0x09: // Tri_NoShadeZ
{
- const int32_t lft = (command >> 23) & 0x1;
+ const int32_t lft = (cmd[0] >> 55) & 0x1;
if (length != s_rdp_command_length[command])
{
@@ -1262,29 +1261,26 @@ void n64_rdp::disassemble(char* buffer)
return;
}
+ cmd[1] = m_cmd_data[m_cmd_cur+1];
cmd[2] = m_cmd_data[m_cmd_cur+2];
cmd[3] = m_cmd_data[m_cmd_cur+3];
- cmd[4] = m_cmd_data[m_cmd_cur+4];
- cmd[5] = m_cmd_data[m_cmd_cur+5];
- cmd[6] = m_cmd_data[m_cmd_cur+6];
- cmd[7] = m_cmd_data[m_cmd_cur+7];
-
- sprintf(yl, "%4.4f", (float)((cmd[0] >> 0) & 0x1fff) / 4.0f);
- sprintf(ym, "%4.4f", (float)((cmd[1] >> 16) & 0x1fff) / 4.0f);
- sprintf(yh, "%4.4f", (float)((cmd[1] >> 0) & 0x1fff) / 4.0f);
- sprintf(xl, "%4.4f", (float)(cmd[2] / 65536.0f));
- sprintf(dxldy, "%4.4f", (float)(cmd[3] / 65536.0f));
- sprintf(xh, "%4.4f", (float)(cmd[4] / 65536.0f));
- sprintf(dxhdy, "%4.4f", (float)(cmd[5] / 65536.0f));
- sprintf(xm, "%4.4f", (float)(cmd[6] / 65536.0f));
- sprintf(dxmdy, "%4.4f", (float)(cmd[7] / 65536.0f));
+
+ sprintf(yl, "%4.4f", (float)((cmd[0] >> 32) & 0x1fff) / 4.0f);
+ sprintf(ym, "%4.4f", (float)((cmd[0] >> 16) & 0x1fff) / 4.0f);
+ sprintf(yh, "%4.4f", (float)((cmd[0] >> 0) & 0x1fff) / 4.0f);
+ sprintf(xl, "%4.4f", (float)int32_t(cmd[1] >> 32) / 65536.0f);
+ sprintf(dxldy, "%4.4f", (float)int32_t(cmd[1]) / 65536.0f);
+ sprintf(xh, "%4.4f", (float)int32_t(cmd[2] >> 32) / 65536.0f);
+ sprintf(dxhdy, "%4.4f", (float)int32_t(cmd[2]) / 65536.0f);
+ sprintf(xm, "%4.4f", (float)int32_t(cmd[3] >> 32) / 65536.0f);
+ sprintf(dxmdy, "%4.4f", (float)int32_t(cmd[3]) / 65536.0f);
sprintf(buffer, "Tri_NoShadeZ %d, XL: %s, XM: %s, XH: %s, YL: %s, YM: %s, YH: %s\n", lft, xl,xm,xh,yl,ym,yh);
break;
}
case 0x0a: // Tri_Tex
{
- const int32_t lft = (command >> 23) & 0x1;
+ const int32_t lft = (cmd[0] >> 55) & 0x1;
if (length < s_rdp_command_length[command])
{
@@ -1292,34 +1288,33 @@ void n64_rdp::disassemble(char* buffer)
return;
}
- for (int32_t i = 2; i < 24; i++)
+ for (int32_t i = 1; i < 12; i++)
{
cmd[i] = m_cmd_data[m_cmd_cur+i];
}
- sprintf(yl, "%4.4f", (float)((cmd[0] >> 0) & 0x1fff) / 4.0f);
- sprintf(ym, "%4.4f", (float)((cmd[1] >> 16) & 0x1fff) / 4.0f);
- sprintf(yh, "%4.4f", (float)((cmd[1] >> 0) & 0x1fff) / 4.0f);
- sprintf(xl, "%4.4f", (float)((int32_t)cmd[2] / 65536.0f));
- sprintf(dxldy, "%4.4f", (float)((int32_t)cmd[3] / 65536.0f));
- sprintf(xh, "%4.4f", (float)((int32_t)cmd[4] / 65536.0f));
- sprintf(dxhdy, "%4.4f", (float)((int32_t)cmd[5] / 65536.0f));
- sprintf(xm, "%4.4f", (float)((int32_t)cmd[6] / 65536.0f));
- sprintf(dxmdy, "%4.4f", (float)((int32_t)cmd[7] / 65536.0f));
-
- sprintf(s, "%4.4f", (float)(int32_t)((cmd[ 8] & 0xffff0000) | ((cmd[12] >> 16) & 0xffff)) / 65536.0f);
- sprintf(t, "%4.4f", (float)(int32_t)(((cmd[ 8] & 0xffff) << 16) | (cmd[12] & 0xffff)) / 65536.0f);
- sprintf(w, "%4.4f", (float)(int32_t)((cmd[ 9] & 0xffff0000) | ((cmd[13] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dsdx, "%4.4f", (float)(int32_t)((cmd[10] & 0xffff0000) | ((cmd[14] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dtdx, "%4.4f", (float)(int32_t)(((cmd[10] & 0xffff) << 16) | (cmd[14] & 0xffff)) / 65536.0f);
- sprintf(dwdx, "%4.4f", (float)(int32_t)((cmd[11] & 0xffff0000) | ((cmd[15] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dsde, "%4.4f", (float)(int32_t)((cmd[16] & 0xffff0000) | ((cmd[20] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dtde, "%4.4f", (float)(int32_t)(((cmd[16] & 0xffff) << 16) | (cmd[20] & 0xffff)) / 65536.0f);
- sprintf(dwde, "%4.4f", (float)(int32_t)((cmd[17] & 0xffff0000) | ((cmd[21] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dsdy, "%4.4f", (float)(int32_t)((cmd[18] & 0xffff0000) | ((cmd[22] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dtdy, "%4.4f", (float)(int32_t)(((cmd[18] & 0xffff) << 16) | (cmd[22] & 0xffff)) / 65536.0f);
- sprintf(dwdy, "%4.4f", (float)(int32_t)((cmd[19] & 0xffff0000) | ((cmd[23] >> 16) & 0xffff)) / 65536.0f);
-
+ sprintf(yl, "%4.4f", (float)((cmd[0] >> 32) & 0x1fff) / 4.0f);
+ sprintf(ym, "%4.4f", (float)((cmd[0] >> 16) & 0x1fff) / 4.0f);
+ sprintf(yh, "%4.4f", (float)((cmd[0] >> 0) & 0x1fff) / 4.0f);
+ sprintf(xl, "%4.4f", (float)int32_t(cmd[1] >> 32) / 65536.0f);
+ sprintf(dxldy, "%4.4f", (float)int32_t(cmd[1]) / 65536.0f);
+ sprintf(xh, "%4.4f", (float)int32_t(cmd[2] >> 32) / 65536.0f);
+ sprintf(dxhdy, "%4.4f", (float)int32_t(cmd[2]) / 65536.0f);
+ sprintf(xm, "%4.4f", (float)int32_t(cmd[3] >> 32) / 65536.0f);
+ sprintf(dxmdy, "%4.4f", (float)int32_t(cmd[3]) / 65536.0f);
+
+ sprintf(s, "%4.4f", (float)int32_t( ((cmd[4] >> 32) & 0xffff0000) | ((cmd[ 6] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(t, "%4.4f", (float)int32_t((((cmd[4] >> 32) & 0x0000ffff) << 16) | ((cmd[ 6] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(w, "%4.4f", (float)int32_t( (cmd[4] & 0xffff0000) | ((cmd[ 6] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(dsdx, "%4.4f", (float)int32_t( ((cmd[5] >> 32) & 0xffff0000) | ((cmd[ 7] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(dtdx, "%4.4f", (float)int32_t((((cmd[5] >> 32) & 0x0000ffff) << 16) | ((cmd[ 7] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(dwdx, "%4.4f", (float)int32_t( (cmd[5] & 0xffff0000) | ((cmd[ 7] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(dsde, "%4.4f", (float)int32_t( ((cmd[8] >> 32) & 0xffff0000) | ((cmd[10] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(dtde, "%4.4f", (float)int32_t((((cmd[8] >> 32) & 0x0000ffff) << 16) | ((cmd[10] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(dwde, "%4.4f", (float)int32_t( (cmd[8] & 0xffff0000) | ((cmd[10] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(dsdy, "%4.4f", (float)int32_t( ((cmd[9] >> 32) & 0xffff0000) | ((cmd[11] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(dtdy, "%4.4f", (float)int32_t((((cmd[9] >> 32) & 0x0000ffff) << 16) | ((cmd[11] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(dwdy, "%4.4f", (float)int32_t( (cmd[9] & 0xffff0000) | ((cmd[11] >> 16) & 0xffff)) / 65536.0f);
buffer+=sprintf(buffer, "Tri_Tex %d, XL: %s, XM: %s, XH: %s, YL: %s, YM: %s, YH: %s\n", lft, xl,xm,xh,yl,ym,yh);
buffer+=sprintf(buffer, " ");
@@ -1334,7 +1329,7 @@ void n64_rdp::disassemble(char* buffer)
}
case 0x0b: // Tri_TexZ
{
- const int32_t lft = (command >> 23) & 0x1;
+ const int32_t lft = (cmd[0] >> 55) & 0x1;
if (length < s_rdp_command_length[command])
{
@@ -1342,34 +1337,33 @@ void n64_rdp::disassemble(char* buffer)
return;
}
- for (int32_t i = 2; i < 24; i++)
+ for (int32_t i = 1; i < 12; i++)
{
cmd[i] = m_cmd_data[m_cmd_cur+i];
}
- sprintf(yl, "%4.4f", (float)((cmd[0] >> 0) & 0x1fff) / 4.0f);
- sprintf(ym, "%4.4f", (float)((cmd[1] >> 16) & 0x1fff) / 4.0f);
- sprintf(yh, "%4.4f", (float)((cmd[1] >> 0) & 0x1fff) / 4.0f);
- sprintf(xl, "%4.4f", (float)((int32_t)cmd[2] / 65536.0f));
- sprintf(dxldy, "%4.4f", (float)((int32_t)cmd[3] / 65536.0f));
- sprintf(xh, "%4.4f", (float)((int32_t)cmd[4] / 65536.0f));
- sprintf(dxhdy, "%4.4f", (float)((int32_t)cmd[5] / 65536.0f));
- sprintf(xm, "%4.4f", (float)((int32_t)cmd[6] / 65536.0f));
- sprintf(dxmdy, "%4.4f", (float)((int32_t)cmd[7] / 65536.0f));
-
- sprintf(s, "%4.4f", (float)(int32_t)((cmd[ 8] & 0xffff0000) | ((cmd[12] >> 16) & 0xffff)) / 65536.0f);
- sprintf(t, "%4.4f", (float)(int32_t)(((cmd[ 8] & 0xffff) << 16) | (cmd[12] & 0xffff)) / 65536.0f);
- sprintf(w, "%4.4f", (float)(int32_t)((cmd[ 9] & 0xffff0000) | ((cmd[13] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dsdx, "%4.4f", (float)(int32_t)((cmd[10] & 0xffff0000) | ((cmd[14] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dtdx, "%4.4f", (float)(int32_t)(((cmd[10] & 0xffff) << 16) | (cmd[14] & 0xffff)) / 65536.0f);
- sprintf(dwdx, "%4.4f", (float)(int32_t)((cmd[11] & 0xffff0000) | ((cmd[15] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dsde, "%4.4f", (float)(int32_t)((cmd[16] & 0xffff0000) | ((cmd[20] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dtde, "%4.4f", (float)(int32_t)(((cmd[16] & 0xffff) << 16) | (cmd[20] & 0xffff)) / 65536.0f);
- sprintf(dwde, "%4.4f", (float)(int32_t)((cmd[17] & 0xffff0000) | ((cmd[21] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dsdy, "%4.4f", (float)(int32_t)((cmd[18] & 0xffff0000) | ((cmd[22] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dtdy, "%4.4f", (float)(int32_t)(((cmd[18] & 0xffff) << 16) | (cmd[22] & 0xffff)) / 65536.0f);
- sprintf(dwdy, "%4.4f", (float)(int32_t)((cmd[19] & 0xffff0000) | ((cmd[23] >> 16) & 0xffff)) / 65536.0f);
-
+ sprintf(yl, "%4.4f", (float)((cmd[0] >> 32) & 0x1fff) / 4.0f);
+ sprintf(ym, "%4.4f", (float)((cmd[0] >> 16) & 0x1fff) / 4.0f);
+ sprintf(yh, "%4.4f", (float)((cmd[0] >> 0) & 0x1fff) / 4.0f);
+ sprintf(xl, "%4.4f", (float)int32_t(cmd[1] >> 32) / 65536.0f);
+ sprintf(dxldy, "%4.4f", (float)int32_t(cmd[1]) / 65536.0f);
+ sprintf(xh, "%4.4f", (float)int32_t(cmd[2] >> 32) / 65536.0f);
+ sprintf(dxhdy, "%4.4f", (float)int32_t(cmd[2]) / 65536.0f);
+ sprintf(xm, "%4.4f", (float)int32_t(cmd[3] >> 32) / 65536.0f);
+ sprintf(dxmdy, "%4.4f", (float)int32_t(cmd[3]) / 65536.0f);
+
+ sprintf(s, "%4.4f", (float)int32_t( ((cmd[4] >> 32) & 0xffff0000) | ((cmd[ 6] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(t, "%4.4f", (float)int32_t((((cmd[4] >> 32) & 0x0000ffff) << 16) | ((cmd[ 6] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(w, "%4.4f", (float)int32_t( (cmd[4] & 0xffff0000) | ((cmd[ 6] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(dsdx, "%4.4f", (float)int32_t( ((cmd[5] >> 32) & 0xffff0000) | ((cmd[ 7] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(dtdx, "%4.4f", (float)int32_t((((cmd[5] >> 32) & 0x0000ffff) << 16) | ((cmd[ 7] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(dwdx, "%4.4f", (float)int32_t( (cmd[5] & 0xffff0000) | ((cmd[ 7] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(dsde, "%4.4f", (float)int32_t( ((cmd[8] >> 32) & 0xffff0000) | ((cmd[10] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(dtde, "%4.4f", (float)int32_t((((cmd[8] >> 32) & 0x0000ffff) << 16) | ((cmd[10] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(dwde, "%4.4f", (float)int32_t( (cmd[8] & 0xffff0000) | ((cmd[10] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(dsdy, "%4.4f", (float)int32_t( ((cmd[9] >> 32) & 0xffff0000) | ((cmd[11] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(dtdy, "%4.4f", (float)int32_t((((cmd[9] >> 32) & 0x0000ffff) << 16) | ((cmd[11] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(dwdy, "%4.4f", (float)int32_t( (cmd[9] & 0xffff0000) | ((cmd[11] >> 16) & 0xffff)) / 65536.0f);
buffer+=sprintf(buffer, "Tri_TexZ %d, XL: %s, XM: %s, XH: %s, YL: %s, YM: %s, YH: %s\n", lft, xl,xm,xh,yl,ym,yh);
buffer+=sprintf(buffer, " ");
@@ -1392,36 +1386,37 @@ void n64_rdp::disassemble(char* buffer)
return;
}
- for (int32_t i = 2; i < 24; i++)
+ for (int32_t i = 1; i < 12; i++)
{
cmd[i] = m_cmd_data[i];
}
- sprintf(yl, "%4.4f", (float)((cmd[0] >> 0) & 0x1fff) / 4.0f);
- sprintf(ym, "%4.4f", (float)((cmd[1] >> 16) & 0x1fff) / 4.0f);
- sprintf(yh, "%4.4f", (float)((cmd[1] >> 0) & 0x1fff) / 4.0f);
- sprintf(xl, "%4.4f", (float)((int32_t)cmd[2] / 65536.0f));
- sprintf(dxldy, "%4.4f", (float)((int32_t)cmd[3] / 65536.0f));
- sprintf(xh, "%4.4f", (float)((int32_t)cmd[4] / 65536.0f));
- sprintf(dxhdy, "%4.4f", (float)((int32_t)cmd[5] / 65536.0f));
- sprintf(xm, "%4.4f", (float)((int32_t)cmd[6] / 65536.0f));
- sprintf(dxmdy, "%4.4f", (float)((int32_t)cmd[7] / 65536.0f));
- sprintf(rt, "%4.4f", (float)(int32_t)((cmd[8] & 0xffff0000) | ((cmd[12] >> 16) & 0xffff)) / 65536.0f);
- sprintf(gt, "%4.4f", (float)(int32_t)(((cmd[8] & 0xffff) << 16) | (cmd[12] & 0xffff)) / 65536.0f);
- sprintf(bt, "%4.4f", (float)(int32_t)((cmd[9] & 0xffff0000) | ((cmd[13] >> 16) & 0xffff)) / 65536.0f);
- sprintf(at, "%4.4f", (float)(int32_t)(((cmd[9] & 0xffff) << 16) | (cmd[13] & 0xffff)) / 65536.0f);
- sprintf(drdx, "%4.4f", (float)(int32_t)((cmd[10] & 0xffff0000) | ((cmd[14] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dgdx, "%4.4f", (float)(int32_t)(((cmd[10] & 0xffff) << 16) | (cmd[14] & 0xffff)) / 65536.0f);
- sprintf(dbdx, "%4.4f", (float)(int32_t)((cmd[11] & 0xffff0000) | ((cmd[15] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dadx, "%4.4f", (float)(int32_t)(((cmd[11] & 0xffff) << 16) | (cmd[15] & 0xffff)) / 65536.0f);
- sprintf(drde, "%4.4f", (float)(int32_t)((cmd[16] & 0xffff0000) | ((cmd[20] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dgde, "%4.4f", (float)(int32_t)(((cmd[16] & 0xffff) << 16) | (cmd[20] & 0xffff)) / 65536.0f);
- sprintf(dbde, "%4.4f", (float)(int32_t)((cmd[17] & 0xffff0000) | ((cmd[21] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dade, "%4.4f", (float)(int32_t)(((cmd[17] & 0xffff) << 16) | (cmd[21] & 0xffff)) / 65536.0f);
- sprintf(drdy, "%4.4f", (float)(int32_t)((cmd[18] & 0xffff0000) | ((cmd[22] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dgdy, "%4.4f", (float)(int32_t)(((cmd[18] & 0xffff) << 16) | (cmd[22] & 0xffff)) / 65536.0f);
- sprintf(dbdy, "%4.4f", (float)(int32_t)((cmd[19] & 0xffff0000) | ((cmd[23] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dady, "%4.4f", (float)(int32_t)(((cmd[19] & 0xffff) << 16) | (cmd[23] & 0xffff)) / 65536.0f);
+ sprintf(yl, "%4.4f", (float)((cmd[0] >> 32) & 0x1fff) / 4.0f);
+ sprintf(ym, "%4.4f", (float)((cmd[0] >> 16) & 0x1fff) / 4.0f);
+ sprintf(yh, "%4.4f", (float)((cmd[0] >> 0) & 0x1fff) / 4.0f);
+ sprintf(xl, "%4.4f", (float)int32_t(cmd[1] >> 32) / 65536.0f);
+ sprintf(dxldy, "%4.4f", (float)int32_t(cmd[1]) / 65536.0f);
+ sprintf(xh, "%4.4f", (float)int32_t(cmd[2] >> 32) / 65536.0f);
+ sprintf(dxhdy, "%4.4f", (float)int32_t(cmd[2]) / 65536.0f);
+ sprintf(xm, "%4.4f", (float)int32_t(cmd[3] >> 32) / 65536.0f);
+ sprintf(dxmdy, "%4.4f", (float)int32_t(cmd[3]) / 65536.0f);
+
+ sprintf(rt, "%4.4f", (float)int32_t( ((cmd[4] >> 32) & 0xffff0000) | ((cmd[ 6] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(gt, "%4.4f", (float)int32_t((((cmd[4] >> 32) & 0x0000ffff) << 16) | ((cmd[ 6] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(bt, "%4.4f", (float)int32_t( (cmd[4] & 0xffff0000) | ((cmd[ 6] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(at, "%4.4f", (float)int32_t( ((cmd[4] & 0x0000ffff) << 16) | ( cmd[ 6] & 0xffff)) / 65536.0f);
+ sprintf(drdx, "%4.4f", (float)int32_t( ((cmd[5] >> 32) & 0xffff0000) | ((cmd[ 7] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(dgdx, "%4.4f", (float)int32_t((((cmd[5] >> 32) & 0x0000ffff) << 16) | ((cmd[ 7] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(dbdx, "%4.4f", (float)int32_t( (cmd[5] & 0xffff0000) | ((cmd[ 7] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(dadx, "%4.4f", (float)int32_t( ((cmd[5] & 0x0000ffff) << 16) | ( cmd[ 7] & 0xffff)) / 65536.0f);
+ sprintf(drde, "%4.4f", (float)int32_t( ((cmd[8] >> 32) & 0xffff0000) | ((cmd[10] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(dgde, "%4.4f", (float)int32_t((((cmd[8] >> 32) & 0x0000ffff) << 16) | ((cmd[10] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(dbde, "%4.4f", (float)int32_t( (cmd[8] & 0xffff0000) | ((cmd[10] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(dade, "%4.4f", (float)int32_t( ((cmd[8] & 0x0000ffff) << 16) | ( cmd[10] & 0xffff)) / 65536.0f);
+ sprintf(drdy, "%4.4f", (float)int32_t( ((cmd[9] >> 32) & 0xffff0000) | ((cmd[11] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(dgdy, "%4.4f", (float)int32_t((((cmd[9] >> 32) & 0x0000ffff) << 16) | ((cmd[11] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(dbdy, "%4.4f", (float)int32_t( (cmd[9] & 0xffff0000) | ((cmd[11] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(dady, "%4.4f", (float)int32_t( ((cmd[9] & 0x0000ffff) << 16) | ( cmd[11] & 0xffff)) / 65536.0f);
buffer+=sprintf(buffer, "Tri_Shade %d, XL: %s, XM: %s, XH: %s, YL: %s, YM: %s, YH: %s\n", lft, xl,xm,xh,yl,ym,yh);
buffer+=sprintf(buffer, " ");
@@ -1444,36 +1439,37 @@ void n64_rdp::disassemble(char* buffer)
return;
}
- for (int32_t i = 2; i < 24; i++)
+ for (int32_t i = 1; i < 12; i++)
{
cmd[i] = m_cmd_data[i];
}
- sprintf(yl, "%4.4f", (float)((cmd[0] >> 0) & 0x1fff) / 4.0f);
- sprintf(ym, "%4.4f", (float)((cmd[1] >> 16) & 0x1fff) / 4.0f);
- sprintf(yh, "%4.4f", (float)((cmd[1] >> 0) & 0x1fff) / 4.0f);
- sprintf(xl, "%4.4f", (float)((int32_t)cmd[2] / 65536.0f));
- sprintf(dxldy, "%4.4f", (float)((int32_t)cmd[3] / 65536.0f));
- sprintf(xh, "%4.4f", (float)((int32_t)cmd[4] / 65536.0f));
- sprintf(dxhdy, "%4.4f", (float)((int32_t)cmd[5] / 65536.0f));
- sprintf(xm, "%4.4f", (float)((int32_t)cmd[6] / 65536.0f));
- sprintf(dxmdy, "%4.4f", (float)((int32_t)cmd[7] / 65536.0f));
- sprintf(rt, "%4.4f", (float)(int32_t)((cmd[8] & 0xffff0000) | ((cmd[12] >> 16) & 0xffff)) / 65536.0f);
- sprintf(gt, "%4.4f", (float)(int32_t)(((cmd[8] & 0xffff) << 16) | (cmd[12] & 0xffff)) / 65536.0f);
- sprintf(bt, "%4.4f", (float)(int32_t)((cmd[9] & 0xffff0000) | ((cmd[13] >> 16) & 0xffff)) / 65536.0f);
- sprintf(at, "%4.4f", (float)(int32_t)(((cmd[9] & 0xffff) << 16) | (cmd[13] & 0xffff)) / 65536.0f);
- sprintf(drdx, "%4.4f", (float)(int32_t)((cmd[10] & 0xffff0000) | ((cmd[14] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dgdx, "%4.4f", (float)(int32_t)(((cmd[10] & 0xffff) << 16) | (cmd[14] & 0xffff)) / 65536.0f);
- sprintf(dbdx, "%4.4f", (float)(int32_t)((cmd[11] & 0xffff0000) | ((cmd[15] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dadx, "%4.4f", (float)(int32_t)(((cmd[11] & 0xffff) << 16) | (cmd[15] & 0xffff)) / 65536.0f);
- sprintf(drde, "%4.4f", (float)(int32_t)((cmd[16] & 0xffff0000) | ((cmd[20] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dgde, "%4.4f", (float)(int32_t)(((cmd[16] & 0xffff) << 16) | (cmd[20] & 0xffff)) / 65536.0f);
- sprintf(dbde, "%4.4f", (float)(int32_t)((cmd[17] & 0xffff0000) | ((cmd[21] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dade, "%4.4f", (float)(int32_t)(((cmd[17] & 0xffff) << 16) | (cmd[21] & 0xffff)) / 65536.0f);
- sprintf(drdy, "%4.4f", (float)(int32_t)((cmd[18] & 0xffff0000) | ((cmd[22] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dgdy, "%4.4f", (float)(int32_t)(((cmd[18] & 0xffff) << 16) | (cmd[22] & 0xffff)) / 65536.0f);
- sprintf(dbdy, "%4.4f", (float)(int32_t)((cmd[19] & 0xffff0000) | ((cmd[23] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dady, "%4.4f", (float)(int32_t)(((cmd[19] & 0xffff) << 16) | (cmd[23] & 0xffff)) / 65536.0f);
+ sprintf(yl, "%4.4f", (float)((cmd[0] >> 32) & 0x1fff) / 4.0f);
+ sprintf(ym, "%4.4f", (float)((cmd[0] >> 16) & 0x1fff) / 4.0f);
+ sprintf(yh, "%4.4f", (float)((cmd[0] >> 0) & 0x1fff) / 4.0f);
+ sprintf(xl, "%4.4f", (float)int32_t(cmd[1] >> 32) / 65536.0f);
+ sprintf(dxldy, "%4.4f", (float)int32_t(cmd[1]) / 65536.0f);
+ sprintf(xh, "%4.4f", (float)int32_t(cmd[2] >> 32) / 65536.0f);
+ sprintf(dxhdy, "%4.4f", (float)int32_t(cmd[2]) / 65536.0f);
+ sprintf(xm, "%4.4f", (float)int32_t(cmd[3] >> 32) / 65536.0f);
+ sprintf(dxmdy, "%4.4f", (float)int32_t(cmd[3]) / 65536.0f);
+
+ sprintf(rt, "%4.4f", (float)int32_t( ((cmd[4] >> 32) & 0xffff0000) | ((cmd[ 6] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(gt, "%4.4f", (float)int32_t((((cmd[4] >> 32) & 0x0000ffff) << 16) | ((cmd[ 6] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(bt, "%4.4f", (float)int32_t( (cmd[4] & 0xffff0000) | ((cmd[ 6] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(at, "%4.4f", (float)int32_t( ((cmd[4] & 0x0000ffff) << 16) | ( cmd[ 6] & 0xffff)) / 65536.0f);
+ sprintf(drdx, "%4.4f", (float)int32_t( ((cmd[5] >> 32) & 0xffff0000) | ((cmd[ 7] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(dgdx, "%4.4f", (float)int32_t((((cmd[5] >> 32) & 0x0000ffff) << 16) | ((cmd[ 7] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(dbdx, "%4.4f", (float)int32_t( (cmd[5] & 0xffff0000) | ((cmd[ 7] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(dadx, "%4.4f", (float)int32_t( ((cmd[5] & 0x0000ffff) << 16) | ( cmd[ 7] & 0xffff)) / 65536.0f);
+ sprintf(drde, "%4.4f", (float)int32_t( ((cmd[8] >> 32) & 0xffff0000) | ((cmd[10] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(dgde, "%4.4f", (float)int32_t((((cmd[8] >> 32) & 0x0000ffff) << 16) | ((cmd[10] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(dbde, "%4.4f", (float)int32_t( (cmd[8] & 0xffff0000) | ((cmd[10] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(dade, "%4.4f", (float)int32_t( ((cmd[8] & 0x0000ffff) << 16) | ( cmd[10] & 0xffff)) / 65536.0f);
+ sprintf(drdy, "%4.4f", (float)int32_t( ((cmd[9] >> 32) & 0xffff0000) | ((cmd[11] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(dgdy, "%4.4f", (float)int32_t((((cmd[9] >> 32) & 0x0000ffff) << 16) | ((cmd[11] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(dbdy, "%4.4f", (float)int32_t( (cmd[9] & 0xffff0000) | ((cmd[11] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(dady, "%4.4f", (float)int32_t( ((cmd[9] & 0x0000ffff) << 16) | ( cmd[11] & 0xffff)) / 65536.0f);
buffer+=sprintf(buffer, "Tri_ShadeZ %d, XL: %s, XM: %s, XH: %s, YL: %s, YM: %s, YH: %s\n", lft, xl,xm,xh,yl,ym,yh);
buffer+=sprintf(buffer, " ");
@@ -1496,50 +1492,50 @@ void n64_rdp::disassemble(char* buffer)
return;
}
- for (int32_t i = 2; i < 40; i++)
+ for (int32_t i = 1; i < 20; i++)
{
cmd[i] = m_cmd_data[m_cmd_cur+i];
}
- sprintf(yl, "%4.4f", (float)((cmd[0] >> 0) & 0x1fff) / 4.0f);
- sprintf(ym, "%4.4f", (float)((cmd[1] >> 16) & 0x1fff) / 4.0f);
- sprintf(yh, "%4.4f", (float)((cmd[1] >> 0) & 0x1fff) / 4.0f);
- sprintf(xl, "%4.4f", (float)((int32_t)cmd[2] / 65536.0f));
- sprintf(dxldy, "%4.4f", (float)((int32_t)cmd[3] / 65536.0f));
- sprintf(xh, "%4.4f", (float)((int32_t)cmd[4] / 65536.0f));
- sprintf(dxhdy, "%4.4f", (float)((int32_t)cmd[5] / 65536.0f));
- sprintf(xm, "%4.4f", (float)((int32_t)cmd[6] / 65536.0f));
- sprintf(dxmdy, "%4.4f", (float)((int32_t)cmd[7] / 65536.0f));
- sprintf(rt, "%4.4f", (float)(int32_t)((cmd[8] & 0xffff0000) | ((cmd[12] >> 16) & 0xffff)) / 65536.0f);
- sprintf(gt, "%4.4f", (float)(int32_t)(((cmd[8] & 0xffff) << 16) | (cmd[12] & 0xffff)) / 65536.0f);
- sprintf(bt, "%4.4f", (float)(int32_t)((cmd[9] & 0xffff0000) | ((cmd[13] >> 16) & 0xffff)) / 65536.0f);
- sprintf(at, "%4.4f", (float)(int32_t)(((cmd[9] & 0xffff) << 16) | (cmd[13] & 0xffff)) / 65536.0f);
- sprintf(drdx, "%4.4f", (float)(int32_t)((cmd[10] & 0xffff0000) | ((cmd[14] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dgdx, "%4.4f", (float)(int32_t)(((cmd[10] & 0xffff) << 16) | (cmd[14] & 0xffff)) / 65536.0f);
- sprintf(dbdx, "%4.4f", (float)(int32_t)((cmd[11] & 0xffff0000) | ((cmd[15] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dadx, "%4.4f", (float)(int32_t)(((cmd[11] & 0xffff) << 16) | (cmd[15] & 0xffff)) / 65536.0f);
- sprintf(drde, "%4.4f", (float)(int32_t)((cmd[16] & 0xffff0000) | ((cmd[20] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dgde, "%4.4f", (float)(int32_t)(((cmd[16] & 0xffff) << 16) | (cmd[20] & 0xffff)) / 65536.0f);
- sprintf(dbde, "%4.4f", (float)(int32_t)((cmd[17] & 0xffff0000) | ((cmd[21] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dade, "%4.4f", (float)(int32_t)(((cmd[17] & 0xffff) << 16) | (cmd[21] & 0xffff)) / 65536.0f);
- sprintf(drdy, "%4.4f", (float)(int32_t)((cmd[18] & 0xffff0000) | ((cmd[22] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dgdy, "%4.4f", (float)(int32_t)(((cmd[18] & 0xffff) << 16) | (cmd[22] & 0xffff)) / 65536.0f);
- sprintf(dbdy, "%4.4f", (float)(int32_t)((cmd[19] & 0xffff0000) | ((cmd[23] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dady, "%4.4f", (float)(int32_t)(((cmd[19] & 0xffff) << 16) | (cmd[23] & 0xffff)) / 65536.0f);
-
- sprintf(s, "%4.4f", (float)(int32_t)((cmd[24] & 0xffff0000) | ((cmd[28] >> 16) & 0xffff)) / 65536.0f);
- sprintf(t, "%4.4f", (float)(int32_t)(((cmd[24] & 0xffff) << 16) | (cmd[28] & 0xffff)) / 65536.0f);
- sprintf(w, "%4.4f", (float)(int32_t)((cmd[25] & 0xffff0000) | ((cmd[29] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dsdx, "%4.4f", (float)(int32_t)((cmd[26] & 0xffff0000) | ((cmd[30] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dtdx, "%4.4f", (float)(int32_t)(((cmd[26] & 0xffff) << 16) | (cmd[30] & 0xffff)) / 65536.0f);
- sprintf(dwdx, "%4.4f", (float)(int32_t)((cmd[27] & 0xffff0000) | ((cmd[31] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dsde, "%4.4f", (float)(int32_t)((cmd[32] & 0xffff0000) | ((cmd[36] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dtde, "%4.4f", (float)(int32_t)(((cmd[32] & 0xffff) << 16) | (cmd[36] & 0xffff)) / 65536.0f);
- sprintf(dwde, "%4.4f", (float)(int32_t)((cmd[33] & 0xffff0000) | ((cmd[37] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dsdy, "%4.4f", (float)(int32_t)((cmd[34] & 0xffff0000) | ((cmd[38] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dtdy, "%4.4f", (float)(int32_t)(((cmd[34] & 0xffff) << 16) | (cmd[38] & 0xffff)) / 65536.0f);
- sprintf(dwdy, "%4.4f", (float)(int32_t)((cmd[35] & 0xffff0000) | ((cmd[39] >> 16) & 0xffff)) / 65536.0f);
-
+ sprintf(yl, "%4.4f", (float)((cmd[0] >> 32) & 0x1fff) / 4.0f);
+ sprintf(ym, "%4.4f", (float)((cmd[0] >> 16) & 0x1fff) / 4.0f);
+ sprintf(yh, "%4.4f", (float)((cmd[0] >> 0) & 0x1fff) / 4.0f);
+ sprintf(xl, "%4.4f", (float)int32_t(cmd[1] >> 32) / 65536.0f);
+ sprintf(dxldy, "%4.4f", (float)int32_t(cmd[1]) / 65536.0f);
+ sprintf(xh, "%4.4f", (float)int32_t(cmd[2] >> 32) / 65536.0f);
+ sprintf(dxhdy, "%4.4f", (float)int32_t(cmd[2]) / 65536.0f);
+ sprintf(xm, "%4.4f", (float)int32_t(cmd[3] >> 32) / 65536.0f);
+ sprintf(dxmdy, "%4.4f", (float)int32_t(cmd[3]) / 65536.0f);
+
+ sprintf(rt, "%4.4f", (float)int32_t( ((cmd[4] >> 32) & 0xffff0000) | ((cmd[ 6] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(gt, "%4.4f", (float)int32_t((((cmd[4] >> 32) & 0x0000ffff) << 16) | ((cmd[ 6] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(bt, "%4.4f", (float)int32_t( (cmd[4] & 0xffff0000) | ((cmd[ 6] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(at, "%4.4f", (float)int32_t( ((cmd[4] & 0x0000ffff) << 16) | ( cmd[ 6] & 0xffff)) / 65536.0f);
+ sprintf(drdx, "%4.4f", (float)int32_t( ((cmd[5] >> 32) & 0xffff0000) | ((cmd[ 7] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(dgdx, "%4.4f", (float)int32_t((((cmd[5] >> 32) & 0x0000ffff) << 16) | ((cmd[ 7] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(dbdx, "%4.4f", (float)int32_t( (cmd[5] & 0xffff0000) | ((cmd[ 7] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(dadx, "%4.4f", (float)int32_t( ((cmd[5] & 0x0000ffff) << 16) | ( cmd[ 7] & 0xffff)) / 65536.0f);
+ sprintf(drde, "%4.4f", (float)int32_t( ((cmd[8] >> 32) & 0xffff0000) | ((cmd[10] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(dgde, "%4.4f", (float)int32_t((((cmd[8] >> 32) & 0x0000ffff) << 16) | ((cmd[10] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(dbde, "%4.4f", (float)int32_t( (cmd[8] & 0xffff0000) | ((cmd[10] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(dade, "%4.4f", (float)int32_t( ((cmd[8] & 0x0000ffff) << 16) | ( cmd[10] & 0xffff)) / 65536.0f);
+ sprintf(drdy, "%4.4f", (float)int32_t( ((cmd[9] >> 32) & 0xffff0000) | ((cmd[11] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(dgdy, "%4.4f", (float)int32_t((((cmd[9] >> 32) & 0x0000ffff) << 16) | ((cmd[11] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(dbdy, "%4.4f", (float)int32_t( (cmd[9] & 0xffff0000) | ((cmd[11] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(dady, "%4.4f", (float)int32_t( ((cmd[9] & 0x0000ffff) << 16) | ( cmd[11] & 0xffff)) / 65536.0f);
+
+ sprintf(s, "%4.4f", (float)int32_t( ((cmd[4] >> 32) & 0xffff0000) | ((cmd[ 6] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(t, "%4.4f", (float)int32_t((((cmd[4] >> 32) & 0x0000ffff) << 16) | ((cmd[ 6] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(w, "%4.4f", (float)int32_t( (cmd[4] & 0xffff0000) | ((cmd[ 6] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(dsdx, "%4.4f", (float)int32_t( ((cmd[5] >> 32) & 0xffff0000) | ((cmd[ 7] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(dtdx, "%4.4f", (float)int32_t((((cmd[5] >> 32) & 0x0000ffff) << 16) | ((cmd[ 7] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(dwdx, "%4.4f", (float)int32_t( (cmd[5] & 0xffff0000) | ((cmd[ 7] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(dsde, "%4.4f", (float)int32_t( ((cmd[8] >> 32) & 0xffff0000) | ((cmd[10] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(dtde, "%4.4f", (float)int32_t((((cmd[8] >> 32) & 0x0000ffff) << 16) | ((cmd[10] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(dwde, "%4.4f", (float)int32_t( (cmd[8] & 0xffff0000) | ((cmd[10] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(dsdy, "%4.4f", (float)int32_t( ((cmd[9] >> 32) & 0xffff0000) | ((cmd[11] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(dtdy, "%4.4f", (float)int32_t((((cmd[9] >> 32) & 0x0000ffff) << 16) | ((cmd[11] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(dwdy, "%4.4f", (float)int32_t( (cmd[9] & 0xffff0000) | ((cmd[11] >> 16) & 0xffff)) / 65536.0f);
buffer+=sprintf(buffer, "Tri_TexShade %d, XL: %s, XM: %s, XH: %s, YL: %s, YM: %s, YH: %s\n", lft, xl,xm,xh,yl,ym,yh);
buffer+=sprintf(buffer, " ");
@@ -1571,50 +1567,50 @@ void n64_rdp::disassemble(char* buffer)
return;
}
- for (int32_t i = 2; i < 40; i++)
+ for (int32_t i = 1; i < 20; i++)
{
cmd[i] = m_cmd_data[m_cmd_cur+i];
}
- sprintf(yl, "%4.4f", (float)((cmd[0] >> 0) & 0x1fff) / 4.0f);
- sprintf(ym, "%4.4f", (float)((cmd[1] >> 16) & 0x1fff) / 4.0f);
- sprintf(yh, "%4.4f", (float)((cmd[1] >> 0) & 0x1fff) / 4.0f);
- sprintf(xl, "%4.4f", (float)((int32_t)cmd[2] / 65536.0f));
- sprintf(dxldy, "%4.4f", (float)((int32_t)cmd[3] / 65536.0f));
- sprintf(xh, "%4.4f", (float)((int32_t)cmd[4] / 65536.0f));
- sprintf(dxhdy, "%4.4f", (float)((int32_t)cmd[5] / 65536.0f));
- sprintf(xm, "%4.4f", (float)((int32_t)cmd[6] / 65536.0f));
- sprintf(dxmdy, "%4.4f", (float)((int32_t)cmd[7] / 65536.0f));
- sprintf(rt, "%4.4f", (float)(int32_t)((cmd[8] & 0xffff0000) | ((cmd[12] >> 16) & 0xffff)) / 65536.0f);
- sprintf(gt, "%4.4f", (float)(int32_t)(((cmd[8] & 0xffff) << 16) | (cmd[12] & 0xffff)) / 65536.0f);
- sprintf(bt, "%4.4f", (float)(int32_t)((cmd[9] & 0xffff0000) | ((cmd[13] >> 16) & 0xffff)) / 65536.0f);
- sprintf(at, "%4.4f", (float)(int32_t)(((cmd[9] & 0xffff) << 16) | (cmd[13] & 0xffff)) / 65536.0f);
- sprintf(drdx, "%4.4f", (float)(int32_t)((cmd[10] & 0xffff0000) | ((cmd[14] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dgdx, "%4.4f", (float)(int32_t)(((cmd[10] & 0xffff) << 16) | (cmd[14] & 0xffff)) / 65536.0f);
- sprintf(dbdx, "%4.4f", (float)(int32_t)((cmd[11] & 0xffff0000) | ((cmd[15] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dadx, "%4.4f", (float)(int32_t)(((cmd[11] & 0xffff) << 16) | (cmd[15] & 0xffff)) / 65536.0f);
- sprintf(drde, "%4.4f", (float)(int32_t)((cmd[16] & 0xffff0000) | ((cmd[20] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dgde, "%4.4f", (float)(int32_t)(((cmd[16] & 0xffff) << 16) | (cmd[20] & 0xffff)) / 65536.0f);
- sprintf(dbde, "%4.4f", (float)(int32_t)((cmd[17] & 0xffff0000) | ((cmd[21] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dade, "%4.4f", (float)(int32_t)(((cmd[17] & 0xffff) << 16) | (cmd[21] & 0xffff)) / 65536.0f);
- sprintf(drdy, "%4.4f", (float)(int32_t)((cmd[18] & 0xffff0000) | ((cmd[22] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dgdy, "%4.4f", (float)(int32_t)(((cmd[18] & 0xffff) << 16) | (cmd[22] & 0xffff)) / 65536.0f);
- sprintf(dbdy, "%4.4f", (float)(int32_t)((cmd[19] & 0xffff0000) | ((cmd[23] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dady, "%4.4f", (float)(int32_t)(((cmd[19] & 0xffff) << 16) | (cmd[23] & 0xffff)) / 65536.0f);
-
- sprintf(s, "%4.4f", (float)(int32_t)((cmd[24] & 0xffff0000) | ((cmd[28] >> 16) & 0xffff)) / 65536.0f);
- sprintf(t, "%4.4f", (float)(int32_t)(((cmd[24] & 0xffff) << 16) | (cmd[28] & 0xffff)) / 65536.0f);
- sprintf(w, "%4.4f", (float)(int32_t)((cmd[25] & 0xffff0000) | ((cmd[29] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dsdx, "%4.4f", (float)(int32_t)((cmd[26] & 0xffff0000) | ((cmd[30] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dtdx, "%4.4f", (float)(int32_t)(((cmd[26] & 0xffff) << 16) | (cmd[30] & 0xffff)) / 65536.0f);
- sprintf(dwdx, "%4.4f", (float)(int32_t)((cmd[27] & 0xffff0000) | ((cmd[31] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dsde, "%4.4f", (float)(int32_t)((cmd[32] & 0xffff0000) | ((cmd[36] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dtde, "%4.4f", (float)(int32_t)(((cmd[32] & 0xffff) << 16) | (cmd[36] & 0xffff)) / 65536.0f);
- sprintf(dwde, "%4.4f", (float)(int32_t)((cmd[33] & 0xffff0000) | ((cmd[37] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dsdy, "%4.4f", (float)(int32_t)((cmd[34] & 0xffff0000) | ((cmd[38] >> 16) & 0xffff)) / 65536.0f);
- sprintf(dtdy, "%4.4f", (float)(int32_t)(((cmd[34] & 0xffff) << 16) | (cmd[38] & 0xffff)) / 65536.0f);
- sprintf(dwdy, "%4.4f", (float)(int32_t)((cmd[35] & 0xffff0000) | ((cmd[39] >> 16) & 0xffff)) / 65536.0f);
-
+ sprintf(yl, "%4.4f", (float)((cmd[0] >> 32) & 0x1fff) / 4.0f);
+ sprintf(ym, "%4.4f", (float)((cmd[0] >> 16) & 0x1fff) / 4.0f);
+ sprintf(yh, "%4.4f", (float)((cmd[0] >> 0) & 0x1fff) / 4.0f);
+ sprintf(xl, "%4.4f", (float)int32_t(cmd[1] >> 32) / 65536.0f);
+ sprintf(dxldy, "%4.4f", (float)int32_t(cmd[1]) / 65536.0f);
+ sprintf(xh, "%4.4f", (float)int32_t(cmd[2] >> 32) / 65536.0f);
+ sprintf(dxhdy, "%4.4f", (float)int32_t(cmd[2]) / 65536.0f);
+ sprintf(xm, "%4.4f", (float)int32_t(cmd[3] >> 32) / 65536.0f);
+ sprintf(dxmdy, "%4.4f", (float)int32_t(cmd[3]) / 65536.0f);
+
+ sprintf(rt, "%4.4f", (float)int32_t( ((cmd[4] >> 32) & 0xffff0000) | ((cmd[ 6] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(gt, "%4.4f", (float)int32_t((((cmd[4] >> 32) & 0x0000ffff) << 16) | ((cmd[ 6] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(bt, "%4.4f", (float)int32_t( (cmd[4] & 0xffff0000) | ((cmd[ 6] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(at, "%4.4f", (float)int32_t( ((cmd[4] & 0x0000ffff) << 16) | ( cmd[ 6] & 0xffff)) / 65536.0f);
+ sprintf(drdx, "%4.4f", (float)int32_t( ((cmd[5] >> 32) & 0xffff0000) | ((cmd[ 7] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(dgdx, "%4.4f", (float)int32_t((((cmd[5] >> 32) & 0x0000ffff) << 16) | ((cmd[ 7] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(dbdx, "%4.4f", (float)int32_t( (cmd[5] & 0xffff0000) | ((cmd[ 7] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(dadx, "%4.4f", (float)int32_t( ((cmd[5] & 0x0000ffff) << 16) | ( cmd[ 7] & 0xffff)) / 65536.0f);
+ sprintf(drde, "%4.4f", (float)int32_t( ((cmd[8] >> 32) & 0xffff0000) | ((cmd[10] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(dgde, "%4.4f", (float)int32_t((((cmd[8] >> 32) & 0x0000ffff) << 16) | ((cmd[10] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(dbde, "%4.4f", (float)int32_t( (cmd[8] & 0xffff0000) | ((cmd[10] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(dade, "%4.4f", (float)int32_t( ((cmd[8] & 0x0000ffff) << 16) | ( cmd[10] & 0xffff)) / 65536.0f);
+ sprintf(drdy, "%4.4f", (float)int32_t( ((cmd[9] >> 32) & 0xffff0000) | ((cmd[11] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(dgdy, "%4.4f", (float)int32_t((((cmd[9] >> 32) & 0x0000ffff) << 16) | ((cmd[11] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(dbdy, "%4.4f", (float)int32_t( (cmd[9] & 0xffff0000) | ((cmd[11] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(dady, "%4.4f", (float)int32_t( ((cmd[9] & 0x0000ffff) << 16) | ( cmd[11] & 0xffff)) / 65536.0f);
+
+ sprintf(s, "%4.4f", (float)int32_t( ((cmd[4] >> 32) & 0xffff0000) | ((cmd[ 6] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(t, "%4.4f", (float)int32_t((((cmd[4] >> 32) & 0x0000ffff) << 16) | ((cmd[ 6] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(w, "%4.4f", (float)int32_t( (cmd[4] & 0xffff0000) | ((cmd[ 6] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(dsdx, "%4.4f", (float)int32_t( ((cmd[5] >> 32) & 0xffff0000) | ((cmd[ 7] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(dtdx, "%4.4f", (float)int32_t((((cmd[5] >> 32) & 0x0000ffff) << 16) | ((cmd[ 7] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(dwdx, "%4.4f", (float)int32_t( (cmd[5] & 0xffff0000) | ((cmd[ 7] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(dsde, "%4.4f", (float)int32_t( ((cmd[8] >> 32) & 0xffff0000) | ((cmd[10] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(dtde, "%4.4f", (float)int32_t((((cmd[8] >> 32) & 0x0000ffff) << 16) | ((cmd[10] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(dwde, "%4.4f", (float)int32_t( (cmd[8] & 0xffff0000) | ((cmd[10] >> 16) & 0xffff)) / 65536.0f);
+ sprintf(dsdy, "%4.4f", (float)int32_t( ((cmd[9] >> 32) & 0xffff0000) | ((cmd[11] >> 48) & 0xffff)) / 65536.0f);
+ sprintf(dtdy, "%4.4f", (float)int32_t((((cmd[9] >> 32) & 0x0000ffff) << 16) | ((cmd[11] >> 32) & 0xffff)) / 65536.0f);
+ sprintf(dwdy, "%4.4f", (float)int32_t( (cmd[9] & 0xffff0000) | ((cmd[11] >> 16) & 0xffff)) / 65536.0f);
buffer+=sprintf(buffer, "Tri_TexShadeZ %d, XL: %s, XM: %s, XH: %s, YL: %s, YM: %s, YH: %s\n", lft, xl,xm,xh,yl,ym,yh);
buffer+=sprintf(buffer, " ");
@@ -1644,12 +1640,12 @@ void n64_rdp::disassemble(char* buffer)
sprintf(buffer, "ERROR: Texture_Rectangle length = %d\n", length);
return;
}
- cmd[2] = m_cmd_data[m_cmd_cur+2];
- cmd[3] = m_cmd_data[m_cmd_cur+3];
- sprintf(s, "%4.4f", (float)(int16_t)((cmd[2] >> 16) & 0xffff) / 32.0f);
- sprintf(t, "%4.4f", (float)(int16_t)((cmd[2] >> 0) & 0xffff) / 32.0f);
- sprintf(dsdx, "%4.4f", (float)(int16_t)((cmd[3] >> 16) & 0xffff) / 1024.0f);
- sprintf(dtdy, "%4.4f", (float)(int16_t)((cmd[3] >> 16) & 0xffff) / 1024.0f);
+
+ cmd[1] = m_cmd_data[m_cmd_cur+1];
+ sprintf(s, "%4.4f", (float)int16_t((cmd[1] >> 48) & 0xffff) / 32.0f);
+ sprintf(t, "%4.4f", (float)int16_t((cmd[1] >> 32) & 0xffff) / 32.0f);
+ sprintf(dsdx, "%4.4f", (float)int16_t((cmd[1] >> 16) & 0xffff) / 1024.0f);
+ sprintf(dtdy, "%4.4f", (float)int16_t((cmd[1] >> 0) & 0xffff) / 1024.0f);
if (command == 0x24)
sprintf(buffer, "Texture_Rectangle %d, %s, %s, %s, %s, %s, %s, %s, %s", tile, sh, th, sl, tl, s, t, dsdx, dtdy);
@@ -1663,24 +1659,24 @@ void n64_rdp::disassemble(char* buffer)
case 0x28: sprintf(buffer, "Sync_Tile"); break;
case 0x29: sprintf(buffer, "Sync_Full"); break;
case 0x2d: sprintf(buffer, "Set_Scissor %s, %s, %s, %s", sl, tl, sh, th); break;
- case 0x2e: sprintf(buffer, "Set_Prim_Depth %04X, %04X", (cmd[1] >> 16) & 0xffff, cmd[1] & 0xffff); break;
- case 0x2f: sprintf(buffer, "Set_Other_Modes %08X %08X", cmd[0], cmd[1]); break;
+ case 0x2e: sprintf(buffer, "Set_Prim_Depth %04X, %04X", uint32_t(cmd[0] >> 16) & 0xffff, (uint32_t)cmd[0] & 0xffff); break;
+ case 0x2f: sprintf(buffer, "Set_Other_Modes %08X %08X", uint32_t(cmd[0] >> 32), (uint32_t)cmd[0]); break;
case 0x30: sprintf(buffer, "Load_TLUT %d, %s, %s, %s, %s", tile, sl, tl, sh, th); break;
case 0x32: sprintf(buffer, "Set_Tile_Size %d, %s, %s, %s, %s", tile, sl, tl, sh, th); break;
- case 0x33: sprintf(buffer, "Load_Block %d, %03X, %03X, %03X, %03X", tile, (cmd[0] >> 12) & 0xfff, cmd[0] & 0xfff, (cmd[1] >> 12) & 0xfff, cmd[1] & 0xfff); break;
+ case 0x33: sprintf(buffer, "Load_Block %d, %03X, %03X, %03X, %03X", tile, uint32_t(cmd[0] >> 44) & 0xfff, uint32_t(cmd[0] >> 32) & 0xfff, uint32_t(cmd[0] >> 12) & 0xfff, uint32_t(cmd[1]) & 0xfff); break;
case 0x34: sprintf(buffer, "Load_Tile %d, %s, %s, %s, %s", tile, sl, tl, sh, th); break;
- case 0x35: sprintf(buffer, "Set_Tile %d, %s, %s, %d, %04X", tile, format, size, ((cmd[0] >> 9) & 0x1ff) * 8, (cmd[0] & 0x1ff) * 8); break;
+ case 0x35: sprintf(buffer, "Set_Tile %d, %s, %s, %d, %04X", tile, format, size, (uint32_t(cmd[0] >> 41) & 0x1ff) * 8, (uint32_t(cmd[0] >> 32) & 0x1ff) * 8); break;
case 0x36: sprintf(buffer, "Fill_Rectangle %s, %s, %s, %s", sh, th, sl, tl); break;
case 0x37: sprintf(buffer, "Set_Fill_Color R: %d, G: %d, B: %d, A: %d", r, g, b, a); break;
case 0x38: sprintf(buffer, "Set_Fog_Color R: %d, G: %d, B: %d, A: %d", r, g, b, a); break;
case 0x39: sprintf(buffer, "Set_Blend_Color R: %d, G: %d, B: %d, A: %d", r, g, b, a); break;
- case 0x3a: sprintf(buffer, "Set_Prim_Color %d, %d, R: %d, G: %d, B: %d, A: %d", (cmd[0] >> 8) & 0x1f, cmd[0] & 0xff, r, g, b, a); break;
+ case 0x3a: sprintf(buffer, "Set_Prim_Color %d, %d, R: %d, G: %d, B: %d, A: %d", uint32_t(cmd[0] >> 40) & 0x1f, uint32_t(cmd[0] >> 32) & 0xff, r, g, b, a); break;
case 0x3b: sprintf(buffer, "Set_Env_Color R: %d, G: %d, B: %d, A: %d", r, g, b, a); break;
- case 0x3c: sprintf(buffer, "Set_Combine %08X %08X", cmd[0], cmd[1]); break;
- case 0x3d: sprintf(buffer, "Set_Texture_Image %s, %s, %d, %08X", format, size, (cmd[0] & 0x1ff)+1, cmd[1]); break;
- case 0x3e: sprintf(buffer, "Set_Mask_Image %08X", cmd[1]); break;
- case 0x3f: sprintf(buffer, "Set_Color_Image %s, %s, %d, %08X", format, size, (cmd[0] & 0x1ff)+1, cmd[1]); break;
- default: sprintf(buffer, "Unknown (%08X %08X)", cmd[0], cmd[1]); break;
+ case 0x3c: sprintf(buffer, "Set_Combine %08X %08X", uint32_t(cmd[0] >> 32), (uint32_t)cmd[0]); break;
+ case 0x3d: sprintf(buffer, "Set_Texture_Image %s, %s, %d, %08X", format, size, (uint32_t(cmd[0] >> 32) & 0x1ff) + 1, (uint32_t)cmd[0]); break;
+ case 0x3e: sprintf(buffer, "Set_Mask_Image %08X", (uint32_t)cmd[0]); break;
+ case 0x3f: sprintf(buffer, "Set_Color_Image %s, %s, %d, %08X", format, size, (uint32_t(cmd[0] >> 32) & 0x1ff) + 1, (uint32_t)cmd[0]); break;
+ default: sprintf(buffer, "Unknown (%08X %08X)", uint32_t(cmd[0] >> 32), (uint32_t)cmd[0]); break;
}
}
@@ -1865,16 +1861,17 @@ void n64_rdp::compute_cvg_flip(extent_t* spans, int32_t* majorx, int32_t* minorx
}
}
+#define SIGN(x, numb) (((x) & ((1 << numb) - 1)) | -((x) & (1 << (numb - 1))))
+
void n64_rdp::draw_triangle(bool shade, bool texture, bool zbuffer, bool rect)
{
- const uint32_t* cmd_data = rect ? m_temp_rect_data : m_cmd_data;
+ const uint64_t* cmd_data = rect ? m_temp_rect_data : m_cmd_data;
const uint32_t fifo_index = rect ? 0 : m_cmd_cur;
- const uint32_t w1 = cmd_data[fifo_index + 0];
- const uint32_t w2 = cmd_data[fifo_index + 1];
+ const uint64_t w1 = cmd_data[fifo_index + 0];
- int32_t flip = (w1 & 0x00800000) ? 1 : 0;
- m_misc_state.m_max_level = ((w1 >> 19) & 7);
- int32_t tilenum = (w1 >> 16) & 0x7;
+ int32_t flip = int32_t(w1 >> 55) & 1;
+ m_misc_state.m_max_level = uint32_t(w1 >> 51) & 7;
+ int32_t tilenum = int32_t(w1 >> 48) & 0x7;
int32_t dsdiff = 0, dtdiff = 0, dwdiff = 0, drdiff = 0, dgdiff = 0, dbdiff = 0, dadiff = 0, dzdiff = 0;
int32_t dsdeh = 0, dtdeh = 0, dwdeh = 0, drdeh = 0, dgdeh = 0, dbdeh = 0, dadeh = 0, dzdeh = 0;
@@ -1886,36 +1883,33 @@ void n64_rdp::draw_triangle(bool shade, bool texture, bool zbuffer, bool rect)
int32_t maxxhx = 0;
int32_t minxhx = 0;
- int32_t shade_base = fifo_index + 8;
- int32_t texture_base = fifo_index + 8;
- int32_t zbuffer_base = fifo_index + 8;
+ int32_t shade_base = fifo_index + 4;
+ int32_t texture_base = fifo_index + 4;
+ int32_t zbuffer_base = fifo_index + 4;
if(shade)
{
- texture_base += 16;
- zbuffer_base += 16;
+ texture_base += 8;
+ zbuffer_base += 8;
}
if(texture)
{
- zbuffer_base += 16;
+ zbuffer_base += 8;
}
- uint32_t w3 = cmd_data[fifo_index + 2];
- uint32_t w4 = cmd_data[fifo_index + 3];
- uint32_t w5 = cmd_data[fifo_index + 4];
- uint32_t w6 = cmd_data[fifo_index + 5];
- uint32_t w7 = cmd_data[fifo_index + 6];
- uint32_t w8 = cmd_data[fifo_index + 7];
+ uint64_t w2 = cmd_data[fifo_index + 1];
+ uint64_t w3 = cmd_data[fifo_index + 2];
+ uint64_t w4 = cmd_data[fifo_index + 3];
- int32_t yl = (w1 & 0x3fff);
- int32_t ym = ((w2 >> 16) & 0x3fff);
- int32_t yh = ((w2 >> 0) & 0x3fff);
- int32_t xl = (int32_t)(w3 & 0x3fffffff);
- int32_t xh = (int32_t)(w5 & 0x3fffffff);
- int32_t xm = (int32_t)(w7 & 0x3fffffff);
+ int32_t yl = int32_t(w1 >> 32) & 0x3fff;
+ int32_t ym = int32_t(w1 >> 16) & 0x3fff;
+ int32_t yh = int32_t(w1 >> 0) & 0x3fff;
+ int32_t xl = (int32_t)(w2 >> 32) & 0x3fffffff;
+ int32_t xh = (int32_t)(w3 >> 32) & 0x3fffffff;
+ int32_t xm = (int32_t)(w4 >> 32) & 0x3fffffff;
// Inverse slopes in 16.16 format
- int32_t dxldy = (int32_t)(w4);
- int32_t dxhdy = (int32_t)(w6);
- int32_t dxmdy = (int32_t)(w8);
+ int32_t dxldy = (int32_t)w2;
+ int32_t dxhdy = (int32_t)w3;
+ int32_t dxmdy = (int32_t)w4;
if (yl & 0x2000) yl |= 0xffffc000;
if (ym & 0x2000) ym |= 0xffffc000;
@@ -1925,38 +1919,40 @@ void n64_rdp::draw_triangle(bool shade, bool texture, bool zbuffer, bool rect)
if (xm & 0x20000000) xm |= 0xc0000000;
if (xh & 0x20000000) xh |= 0xc0000000;
- int32_t r = (cmd_data[shade_base+0 ] & 0xffff0000) | ((cmd_data[shade_base+4 ] >> 16) & 0x0000ffff);
- int32_t g = ((cmd_data[shade_base+0 ] << 16) & 0xffff0000) | (cmd_data[shade_base+4 ] & 0x0000ffff);
- int32_t b = (cmd_data[shade_base+1 ] & 0xffff0000) | ((cmd_data[shade_base+5 ] >> 16) & 0x0000ffff);
- int32_t a = ((cmd_data[shade_base+1 ] << 16) & 0xffff0000) | (cmd_data[shade_base+5 ] & 0x0000ffff);
- const int32_t drdx = (cmd_data[shade_base+2 ] & 0xffff0000) | ((cmd_data[shade_base+6 ] >> 16) & 0x0000ffff);
- const int32_t dgdx = ((cmd_data[shade_base+2 ] << 16) & 0xffff0000) | (cmd_data[shade_base+6 ] & 0x0000ffff);
- const int32_t dbdx = (cmd_data[shade_base+3 ] & 0xffff0000) | ((cmd_data[shade_base+7 ] >> 16) & 0x0000ffff);
- const int32_t dadx = ((cmd_data[shade_base+3 ] << 16) & 0xffff0000) | (cmd_data[shade_base+7 ] & 0x0000ffff);
- const int32_t drde = (cmd_data[shade_base+8 ] & 0xffff0000) | ((cmd_data[shade_base+12] >> 16) & 0x0000ffff);
- const int32_t dgde = ((cmd_data[shade_base+8 ] << 16) & 0xffff0000) | (cmd_data[shade_base+12] & 0x0000ffff);
- const int32_t dbde = (cmd_data[shade_base+9 ] & 0xffff0000) | ((cmd_data[shade_base+13] >> 16) & 0x0000ffff);
- const int32_t dade = ((cmd_data[shade_base+9 ] << 16) & 0xffff0000) | (cmd_data[shade_base+13] & 0x0000ffff);
- const int32_t drdy = (cmd_data[shade_base+10] & 0xffff0000) | ((cmd_data[shade_base+14] >> 16) & 0x0000ffff);
- const int32_t dgdy = ((cmd_data[shade_base+10] << 16) & 0xffff0000) | (cmd_data[shade_base+14] & 0x0000ffff);
- const int32_t dbdy = (cmd_data[shade_base+11] & 0xffff0000) | ((cmd_data[shade_base+15] >> 16) & 0x0000ffff);
- const int32_t dady = ((cmd_data[shade_base+11] << 16) & 0xffff0000) | (cmd_data[shade_base+15] & 0x0000ffff);
- int32_t s = (cmd_data[texture_base+0 ] & 0xffff0000) | ((cmd_data[texture_base+4 ] >> 16) & 0x0000ffff);
- int32_t t = ((cmd_data[texture_base+0 ] << 16) & 0xffff0000) | (cmd_data[texture_base+4 ] & 0x0000ffff);
- int32_t w = (cmd_data[texture_base+1 ] & 0xffff0000) | ((cmd_data[texture_base+5 ] >> 16) & 0x0000ffff);
- const int32_t dsdx = (cmd_data[texture_base+2 ] & 0xffff0000) | ((cmd_data[texture_base+6 ] >> 16) & 0x0000ffff);
- const int32_t dtdx = ((cmd_data[texture_base+2 ] << 16) & 0xffff0000) | (cmd_data[texture_base+6 ] & 0x0000ffff);
- const int32_t dwdx = (cmd_data[texture_base+3 ] & 0xffff0000) | ((cmd_data[texture_base+7 ] >> 16) & 0x0000ffff);
- const int32_t dsde = (cmd_data[texture_base+8 ] & 0xffff0000) | ((cmd_data[texture_base+12] >> 16) & 0x0000ffff);
- const int32_t dtde = ((cmd_data[texture_base+8 ] << 16) & 0xffff0000) | (cmd_data[texture_base+12] & 0x0000ffff);
- const int32_t dwde = (cmd_data[texture_base+9 ] & 0xffff0000) | ((cmd_data[texture_base+13] >> 16) & 0x0000ffff);
- const int32_t dsdy = (cmd_data[texture_base+10] & 0xffff0000) | ((cmd_data[texture_base+14] >> 16) & 0x0000ffff);
- const int32_t dtdy = ((cmd_data[texture_base+10] << 16) & 0xffff0000) | (cmd_data[texture_base+14] & 0x0000ffff);
- const int32_t dwdy = (cmd_data[texture_base+11] & 0xffff0000) | ((cmd_data[texture_base+15] >> 16) & 0x0000ffff);
- int32_t z = cmd_data[zbuffer_base+0];
- const int32_t dzdx = cmd_data[zbuffer_base+1];
- const int32_t dzde = cmd_data[zbuffer_base+2];
- const int32_t dzdy = cmd_data[zbuffer_base+3];
+ int32_t r = int32_t(((cmd_data[shade_base] >> 32) & 0xffff0000) | ((cmd_data[shade_base + 2] >> 48) & 0x0000ffff));
+ int32_t g = int32_t(((cmd_data[shade_base] >> 16) & 0xffff0000) | ((cmd_data[shade_base + 2] >> 32) & 0x0000ffff));
+ int32_t b = int32_t( (cmd_data[shade_base] & 0xffff0000) | ((cmd_data[shade_base + 2] >> 16) & 0x0000ffff));
+ int32_t a = int32_t(((cmd_data[shade_base] << 16) & 0xffff0000) | (cmd_data[shade_base + 2] & 0x0000ffff));
+ const int32_t drdx = int32_t(((cmd_data[shade_base + 1] >> 32) & 0xffff0000) | ((cmd_data[shade_base + 3] >> 48) & 0x0000ffff));
+ const int32_t dgdx = int32_t(((cmd_data[shade_base + 1] >> 16) & 0xffff0000) | ((cmd_data[shade_base + 3] >> 32) & 0x0000ffff));
+ const int32_t dbdx = int32_t( (cmd_data[shade_base + 1] & 0xffff0000) | ((cmd_data[shade_base + 3] >> 16) & 0x0000ffff));
+ const int32_t dadx = int32_t(((cmd_data[shade_base + 1] << 16) & 0xffff0000) | (cmd_data[shade_base + 3] & 0x0000ffff));
+ const int32_t drde = int32_t(((cmd_data[shade_base + 4] >> 32) & 0xffff0000) | ((cmd_data[shade_base + 6] >> 48) & 0x0000ffff));
+ const int32_t dgde = int32_t(((cmd_data[shade_base + 4] >> 16) & 0xffff0000) | ((cmd_data[shade_base + 6] >> 32) & 0x0000ffff));
+ const int32_t dbde = int32_t( (cmd_data[shade_base + 4] & 0xffff0000) | ((cmd_data[shade_base + 6] >> 16) & 0x0000ffff));
+ const int32_t dade = int32_t(((cmd_data[shade_base + 4] << 16) & 0xffff0000) | (cmd_data[shade_base + 6] & 0x0000ffff));
+ const int32_t drdy = int32_t(((cmd_data[shade_base + 5] >> 32) & 0xffff0000) | ((cmd_data[shade_base + 7] >> 48) & 0x0000ffff));
+ const int32_t dgdy = int32_t(((cmd_data[shade_base + 5] >> 16) & 0xffff0000) | ((cmd_data[shade_base + 7] >> 32) & 0x0000ffff));
+ const int32_t dbdy = int32_t( (cmd_data[shade_base + 5] & 0xffff0000) | ((cmd_data[shade_base + 7] >> 16) & 0x0000ffff));
+ const int32_t dady = int32_t(((cmd_data[shade_base + 5] << 16) & 0xffff0000) | (cmd_data[shade_base + 7] & 0x0000ffff));
+
+ int32_t s = int32_t(((cmd_data[texture_base] >> 32) & 0xffff0000) | ((cmd_data[texture_base+ 2 ] >> 48) & 0x0000ffff));
+ int32_t t = int32_t(((cmd_data[texture_base] >> 16) & 0xffff0000) | ((cmd_data[texture_base+ 2 ] >> 32) & 0x0000ffff));
+ int32_t w = int32_t( (cmd_data[texture_base] & 0xffff0000) | ((cmd_data[texture_base+ 2 ] >> 16) & 0x0000ffff));
+ const int32_t dsdx = int32_t(((cmd_data[texture_base + 1] >> 32) & 0xffff0000) | ((cmd_data[texture_base + 3] >> 48) & 0x0000ffff));
+ const int32_t dtdx = int32_t(((cmd_data[texture_base + 1] >> 16) & 0xffff0000) | ((cmd_data[texture_base + 3] >> 32) & 0x0000ffff));
+ const int32_t dwdx = int32_t( (cmd_data[texture_base + 1] & 0xffff0000) | ((cmd_data[texture_base + 3] >> 16) & 0x0000ffff));
+ const int32_t dsde = int32_t(((cmd_data[texture_base + 4] >> 32) & 0xffff0000) | ((cmd_data[texture_base + 6] >> 48) & 0x0000ffff));
+ const int32_t dtde = int32_t(((cmd_data[texture_base + 4] >> 16) & 0xffff0000) | ((cmd_data[texture_base + 6] >> 32) & 0x0000ffff));
+ const int32_t dwde = int32_t( (cmd_data[texture_base + 4] & 0xffff0000) | ((cmd_data[texture_base + 6] >> 16) & 0x0000ffff));
+ const int32_t dsdy = int32_t(((cmd_data[texture_base + 5] >> 32) & 0xffff0000) | ((cmd_data[texture_base + 7] >> 48) & 0x0000ffff));
+ const int32_t dtdy = int32_t(((cmd_data[texture_base + 5] >> 16) & 0xffff0000) | ((cmd_data[texture_base + 7] >> 32) & 0x0000ffff));
+ const int32_t dwdy = int32_t( (cmd_data[texture_base + 5] & 0xffff0000) | ((cmd_data[texture_base + 7] >> 16) & 0x0000ffff));
+
+ int32_t z = int32_t(cmd_data[zbuffer_base] >> 32);
+ const int32_t dzdx = int32_t(cmd_data[zbuffer_base]);
+ const int32_t dzde = int32_t(cmd_data[zbuffer_base+1] >> 32);
+ const int32_t dzdy = int32_t(cmd_data[zbuffer_base+1]);
const int32_t dzdy_dz = (dzdy >> 16) & 0xffff;
const int32_t dzdx_dz = (dzdx >> 16) & 0xffff;
@@ -2215,207 +2211,180 @@ void n64_rdp::triangle(bool shade, bool texture, bool zbuffer)
m_pipe_clean = false;
}
-void n64_rdp::cmd_triangle(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_triangle(uint64_t w1)
{
triangle(false, false, false);
}
-void n64_rdp::cmd_triangle_z(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_triangle_z(uint64_t w1)
{
triangle(false, false, true);
}
-void n64_rdp::cmd_triangle_t(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_triangle_t(uint64_t w1)
{
triangle(false, true, false);
}
-void n64_rdp::cmd_triangle_tz(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_triangle_tz(uint64_t w1)
{
triangle(false, true, true);
}
-void n64_rdp::cmd_triangle_s(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_triangle_s(uint64_t w1)
{
triangle(true, false, false);
}
-void n64_rdp::cmd_triangle_sz(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_triangle_sz(uint64_t w1)
{
triangle(true, false, true);
}
-void n64_rdp::cmd_triangle_st(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_triangle_st(uint64_t w1)
{
triangle(true, true, false);
}
-void n64_rdp::cmd_triangle_stz(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_triangle_stz(uint64_t w1)
{
triangle(true, true, true);
}
-void n64_rdp::cmd_tex_rect(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_tex_rect(uint64_t w1)
{
- const uint32_t* data = m_cmd_data + m_cmd_cur;
+ const uint64_t* data = m_cmd_data + m_cmd_cur;
- const uint32_t w3 = data[2];
- const uint32_t w4 = data[3];
+ const uint64_t w2 = data[1];
- const int32_t tilenum = (w2 >> 24) & 0x7;
- const int32_t xh = (w2 >> 12) & 0xfff;
- const int32_t xl = (w1 >> 12) & 0xfff;
- const int32_t yh = (w2 >> 0) & 0xfff;
- int32_t yl = (w1 >> 0) & 0xfff;
+ const uint64_t tilenum = (w1 >> 24) & 0x7;
+ const uint64_t xh = (w1 >> 12) & 0xfff;
+ const uint64_t xl = (w1 >> 44) & 0xfff;
+ const uint64_t yh = (w1 >> 0) & 0xfff;
+ uint64_t yl = (w1 >> 32) & 0xfff;
- const int32_t s = (w3 >> 16) & 0xffff;
- const int32_t t = (w3 >> 0) & 0xffff;
- const int32_t dsdx = SIGN16((w4 >> 16) & 0xffff);
- const int32_t dtdy = SIGN16((w4 >> 0) & 0xffff);
+ const uint64_t s = (w2 >> 48) & 0xffff;
+ const uint64_t t = (w2 >> 32) & 0xffff;
+ const uint64_t dsdx = SIGN16((w2 >> 16) & 0xffff);
+ const uint64_t dtdy = SIGN16((w2 >> 0) & 0xffff);
if (m_other_modes.cycle_type == CYCLE_TYPE_FILL || m_other_modes.cycle_type == CYCLE_TYPE_COPY)
{
yl |= 3;
}
- const int32_t xlint = (xl >> 2) & 0x3ff;
- const int32_t xhint = (xh >> 2) & 0x3ff;
-
- uint32_t* ewdata = m_temp_rect_data;
- ewdata[0] = (0x24 << 24) | ((0x80 | tilenum) << 16) | yl; // command, flipped, tile, yl
- ewdata[1] = (yl << 16) | yh; // ym, yh
- ewdata[2] = (xlint << 16) | ((xl & 3) << 14); // xl, xl frac
- // ewdata[3] = 0; dxldy, dxldy frac
- ewdata[4] = (xhint << 16) | ((xh & 3) << 14); // xh, xh frac
- // ewdata[5] = 0; dxhdy, dxhdy frac
- ewdata[6] = (xlint << 16) | ((xl & 3) << 14); // xm, xm frac
- //ewdata[7] = 0; dxmdy, dxmdy frac
- memset(&ewdata[8], 0, 16 * sizeof(uint32_t)); // shade
- ewdata[24] = (s << 16) | t; // s, t
- // ewdata[25] = 0; w
- ewdata[26] = ((dsdx >> 5) << 16); // dsdx, dtdx
- // ewdata[27] = 0; dwdx
- // ewdata[28] = 0; s frac, t frac
- // ewdata[29] = 0; w frac
- ewdata[30] = ((dsdx & 0x1f) << 11) << 16; // dsdx frac, dtdx frac
- // ewdata[31] = 0; dwdx frac
- ewdata[32] = (dtdy >> 5) & 0xffff; // dsde, dtde
- // ewdata[33] = 0; dwde
- ewdata[34] = (dtdy >> 5) & 0xffff; // dsdy, dtdy
- // ewdata[35] = 0; dwdy
- ewdata[36] = (dtdy & 0x1f) << 11; // dsde frac, dtde frac
- // ewdata[37] = 0; dwde frac
- ewdata[38] = (dtdy & 0x1f) << 11; // dsdy frac, dtdy frac
- // ewdata[39] = 0; // dwdy frac
+ const uint64_t xlint = (xl >> 2) & 0x3ff;
+ const uint64_t xhint = (xh >> 2) & 0x3ff;
+
+ uint64_t* ewdata = m_temp_rect_data;
+ ewdata[0] = ((uint64_t)0x24 << 56) | ((0x80L | tilenum) << 48) | (yl << 32) | (yl << 16) | yh; // command, flipped, tile, yl
+ ewdata[1] = (xlint << 48) | ((xl & 3) << 46); // xl, xl frac, dxldy (0), dxldy frac (0)
+ ewdata[2] = (xhint << 48) | ((xh & 3) << 46); // xh, xh frac, dxhdy (0), dxhdy frac (0)
+ ewdata[3] = (xlint << 48) | ((xl & 3) << 46); // xm, xm frac, dxmdy (0), dxmdy frac (0)
+ memset(&ewdata[4], 0, 8 * sizeof(uint64_t)); // shade
+ ewdata[12] = (s << 48) | (t << 32); // s, t, w (0)
+ ewdata[13] = (dsdx >> 5) << 48; // dsdx, dtdx, dwdx (0)
+ ewdata[14] = 0; // s frac (0), t frac (0), w frac (0)
+ ewdata[15] = (dsdx & 0x1f) << 59; // dsdx frac, dtdx frac, dwdx frac (0)
+ ewdata[16] = ((dtdy >> 5) & 0xffff) << 32; // dsde, dtde, dwde (0)
+ ewdata[17] = ((dtdy >> 5) & 0xffff) << 32; // dsdy, dtdy, dwdy (0)
+ ewdata[18] = ((dtdy & 0x1f) << 11) << 32; // dsde frac, dtde frac, dwde frac (0)
+ ewdata[38] = ((dtdy & 0x1f) << 11) << 32; // dsdy frac, dtdy frac, dwdy frac (0)
// ewdata[40-43] = 0; // depth
draw_triangle(true, true, false, true);
}
-void n64_rdp::cmd_tex_rect_flip(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_tex_rect_flip(uint64_t w1)
{
- const uint32_t* data = m_cmd_data + m_cmd_cur;
+ const uint64_t* data = m_cmd_data + m_cmd_cur;
- const uint32_t w3 = data[2];
- const uint32_t w4 = data[3];
+ const uint64_t w2 = data[1];
- const int32_t tilenum = (w2 >> 24) & 0x7;
- const int32_t xh = (w2 >> 12) & 0xfff;
- const int32_t xl = (w1 >> 12) & 0xfff;
- const int32_t yh = (w2 >> 0) & 0xfff;
- int32_t yl = (w1 >> 0) & 0xfff;
+ const uint64_t tilenum = (w1 >> 56) & 0x7;
+ const uint64_t xh = (w1 >> 12) & 0xfff;
+ const uint64_t xl = (w1 >> 44) & 0xfff;
+ const uint64_t yh = (w1 >> 0) & 0xfff;
+ uint64_t yl = (w1 >> 32) & 0xfff;
- const int32_t s = (w3 >> 16) & 0xffff;
- const int32_t t = (w3 >> 0) & 0xffff;
- const int32_t dsdx = SIGN16((w4 >> 16) & 0xffff);
- const int32_t dtdy = SIGN16((w4 >> 0) & 0xffff);
+ const uint64_t s = (w2 >> 48) & 0xffff;
+ const uint64_t t = (w2 >> 32) & 0xffff;
+ const uint64_t dsdx = SIGN16((w2 >> 16) & 0xffff);
+ const uint64_t dtdy = SIGN16((w2 >> 0) & 0xffff);
if (m_other_modes.cycle_type == CYCLE_TYPE_FILL || m_other_modes.cycle_type == CYCLE_TYPE_COPY)
{
yl |= 3;
}
- const int32_t xlint = (xl >> 2) & 0x3ff;
- const int32_t xhint = (xh >> 2) & 0x3ff;
-
- uint32_t* ewdata = m_temp_rect_data;
- ewdata[0] = (0x25 << 24) | ((0x80 | tilenum) << 16) | yl; // command, flipped, tile, yl
- ewdata[1] = (yl << 16) | yh; // ym, yh
- ewdata[2] = (xlint << 16) | ((xl & 3) << 14); // xl, xl frac
- // ewdata[3] = 0; dxldy, dxldy frac
- ewdata[4] = (xhint << 16) | ((xh & 3) << 14); // xh, xh frac
- // ewdata[5] = 0; dxhdy, dxhdy frac
- ewdata[6] = (xlint << 16) | ((xl & 3) << 14); // xm, xm frac
- // ewdata[7] = 0; dxmdy, dxmdy frac
- memset(&ewdata[8], 0, 16 * sizeof(uint32_t)); // shade
- ewdata[24] = (s << 16) | t; // s, t
- // ewdata[25] = 0; // w
- ewdata[26] = (dtdy >> 5) & 0xffff; // dsdx, dtdx
- // ewdata[27] = 0; dwdx
- // ewdata[28] = 0; s frac, t frac
- // ewdata[29] = 0; w frac
- ewdata[30] = ((dtdy & 0x1f) << 11); // dsdx frac, dtdx frac
- // ewdata[31] = 0; dwdx frac
- ewdata[32] = (dsdx >> 5) << 16; // dsde, dtde
- // ewdata[33] = 0; dwde
- ewdata[34] = (dsdx >> 5) << 16; // dsdy, dtdy
- // ewdata[35] = 0; dwdy
- ewdata[36] = (dsdx & 0x1f) << 27; // dsde frac, dtde frac
- // ewdata[37] = 0; dwde frac
- ewdata[38] = (dsdx & 0x1f) << 27; // dsdy frac, dtdy frac
- // ewdata[39] = 0; // dwdy frac
- // ewdata[40-43] = 0; // depth
+ const uint64_t xlint = (xl >> 2) & 0x3ff;
+ const uint64_t xhint = (xh >> 2) & 0x3ff;
+
+ uint64_t* ewdata = m_temp_rect_data;
+ ewdata[0] = ((uint64_t)0x25 << 56) | ((0x80L | tilenum) << 48) | (yl << 32) | (yl << 16) | yh; // command, flipped, tile, yl
+ ewdata[1] = (xlint << 48) | ((xl & 3) << 46); // xl, xl frac, dxldy (0), dxldy frac (0)
+ ewdata[2] = (xhint << 48) | ((xh & 3) << 46); // xh, xh frac, dxhdy (0), dxhdy frac (0)
+ ewdata[3] = (xlint << 48) | ((xl & 3) << 46); // xm, xm frac, dxmdy (0), dxmdy frac (0)
+ memset(&ewdata[4], 0, 8 * sizeof(uint64_t)); // shade
+ ewdata[12] = (s << 48) | (t << 32); // s, t, w (0)
+ ewdata[13] = ((dtdy >> 5) & 0xffff) << 32; // dsdx, dtdx, dwdx (0)
+ ewdata[14] = 0; // s frac (0), t frac (0), w frac (0)
+ ewdata[15] = ((dtdy & 0x1f) << 43); // dsdx frac, dtdx frac, dwdx frac (0)
+ ewdata[16] = (dsdx >> 5) << 48; // dsde, dtde, dwde (0)
+ ewdata[17] = (dsdx >> 5) << 48; // dsdy, dtdy, dwdy (0)
+ ewdata[18] = (dsdx & 0x1f) << 59; // dsde frac, dtde frac, dwde frac (0)
+ ewdata[19] = (dsdx & 0x1f) << 59; // dsdy frac, dtdy frac, dwdy frac (0)
draw_triangle(true, true, false, true);
}
-void n64_rdp::cmd_sync_load(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_sync_load(uint64_t w1)
{
//wait("SyncLoad");
}
-void n64_rdp::cmd_sync_pipe(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_sync_pipe(uint64_t w1)
{
//wait("SyncPipe");
}
-void n64_rdp::cmd_sync_tile(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_sync_tile(uint64_t w1)
{
//wait("SyncTile");
}
-void n64_rdp::cmd_sync_full(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_sync_full(uint64_t w1)
{
//wait("SyncFull");
dp_full_sync(*m_machine);
}
-void n64_rdp::cmd_set_key_gb(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_set_key_gb(uint64_t w1)
{
- m_key_scale.set_b(w2 & 0xff);
- m_key_scale.set_g((w2 >> 16) & 0xff);
+ m_key_scale.set_b(uint32_t(w1 >> 0) & 0xff);
+ m_key_scale.set_g(uint32_t(w1 >> 16) & 0xff);
}
-void n64_rdp::cmd_set_key_r(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_set_key_r(uint64_t w1)
{
- m_key_scale.set_r(w2 & 0xff);
+ m_key_scale.set_r(uint32_t(w1 & 0xff));
}
-void n64_rdp::cmd_set_fill_color32(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_set_fill_color32(uint64_t w1)
{
//wait("SetFillColor");
- m_fill_color = w2;
+ m_fill_color = (uint32_t)w1;
}
-void n64_rdp::cmd_set_convert(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_set_convert(uint64_t w1)
{
if(!m_pipe_clean) { m_pipe_clean = true; wait("SetConvert"); }
- int32_t k0 = (w1 >> 13) & 0x1ff;
- int32_t k1 = (w1 >> 4) & 0x1ff;
- int32_t k2 = ((w1 & 0xf) << 5) | ((w2 >> 27) & 0x1f);
- int32_t k3 = (w2 >> 18) & 0x1ff;
- int32_t k4 = (w2 >> 9) & 0x1ff;
- int32_t k5 = w2 & 0x1ff;
+ int32_t k0 = int32_t(w1 >> 45) & 0x1ff;
+ int32_t k1 = int32_t(w1 >> 36) & 0x1ff;
+ int32_t k2 = int32_t(w1 >> 27) & 0x1ff;
+ int32_t k3 = int32_t(w1 >> 18) & 0x1ff;
+ int32_t k4 = int32_t(w1 >> 9) & 0x1ff;
+ int32_t k5 = int32_t(w1 >> 0) & 0x1ff;
k0 = (SIGN9(k0) << 1) + 1;
k1 = (SIGN9(k1) << 1) + 1;
@@ -2425,81 +2394,83 @@ void n64_rdp::cmd_set_convert(uint32_t w1, uint32_t w2)
set_yuv_factors(rgbaint_t(0, k0, k2, k3), rgbaint_t(0, 0, k1, 0), rgbaint_t(k4, k4, k4, k4), rgbaint_t(k5, k5, k5, k5));
}
-void n64_rdp::cmd_set_scissor(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_set_scissor(uint64_t w1)
{
- m_scissor.m_xh = ((w1 >> 12) & 0xfff) >> 2;
- m_scissor.m_yh = ((w1 >> 0) & 0xfff) >> 2;
- m_scissor.m_xl = ((w2 >> 12) & 0xfff) >> 2;
- m_scissor.m_yl = ((w2 >> 0) & 0xfff) >> 2;
+ m_scissor.m_xh = ((w1 >> 44) & 0xfff) >> 2;
+ m_scissor.m_yh = ((w1 >> 32) & 0xfff) >> 2;
+ m_scissor.m_xl = ((w1 >> 12) & 0xfff) >> 2;
+ m_scissor.m_yl = ((w1 >> 0) & 0xfff) >> 2;
// TODO: handle f & o?
}
-void n64_rdp::cmd_set_prim_depth(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_set_prim_depth(uint64_t w1)
{
- m_misc_state.m_primitive_z = w2 & 0x7fff0000;
- m_misc_state.m_primitive_dz = (uint16_t)(w1);
+ m_misc_state.m_primitive_z = (uint32_t)(w1 & 0x7fff0000);
+ m_misc_state.m_primitive_dz = (uint16_t)(w1 >> 32);
}
-void n64_rdp::cmd_set_other_modes(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_set_other_modes(uint64_t w1)
{
//wait("SetOtherModes");
- m_other_modes.cycle_type = (w1 >> 20) & 0x3; // 01
- m_other_modes.persp_tex_en = (w1 & 0x80000) ? 1 : 0; // 1
- m_other_modes.detail_tex_en = (w1 & 0x40000) ? 1 : 0; // 0
- m_other_modes.sharpen_tex_en = (w1 & 0x20000) ? 1 : 0; // 0
- m_other_modes.tex_lod_en = (w1 & 0x10000) ? 1 : 0; // 0
- m_other_modes.en_tlut = (w1 & 0x08000) ? 1 : 0; // 0
- m_other_modes.tlut_type = (w1 & 0x04000) ? 1 : 0; // 0
- m_other_modes.sample_type = (w1 & 0x02000) ? 1 : 0; // 1
- m_other_modes.mid_texel = (w1 & 0x01000) ? 1 : 0; // 0
- m_other_modes.bi_lerp0 = (w1 & 0x00800) ? 1 : 0; // 1
- m_other_modes.bi_lerp1 = (w1 & 0x00400) ? 1 : 0; // 1
- m_other_modes.convert_one = (w1 & 0x00200) ? 1 : 0; // 0
- m_other_modes.key_en = (w1 & 0x00100) ? 1 : 0; // 0
- m_other_modes.rgb_dither_sel = (w1 >> 6) & 0x3; // 00
- m_other_modes.alpha_dither_sel = (w1 >> 4) & 0x3; // 01
- m_other_modes.blend_m1a_0 = (w2 >> 30) & 0x3; // 11
- m_other_modes.blend_m1a_1 = (w2 >> 28) & 0x3; // 00
- m_other_modes.blend_m1b_0 = (w2 >> 26) & 0x3; // 10
- m_other_modes.blend_m1b_1 = (w2 >> 24) & 0x3; // 00
- m_other_modes.blend_m2a_0 = (w2 >> 22) & 0x3; // 00
- m_other_modes.blend_m2a_1 = (w2 >> 20) & 0x3; // 01
- m_other_modes.blend_m2b_0 = (w2 >> 18) & 0x3; // 00
- m_other_modes.blend_m2b_1 = (w2 >> 16) & 0x3; // 01
- m_other_modes.force_blend = (w2 >> 14) & 1; // 0
- m_other_modes.blend_shift = m_other_modes.force_blend ? 5 : 2;
- m_other_modes.alpha_cvg_select = (w2 >> 13) & 1; // 1
- m_other_modes.cvg_times_alpha = (w2 >> 12) & 1; // 0
- m_other_modes.z_mode = (w2 >> 10) & 0x3; // 00
- m_other_modes.cvg_dest = (w2 >> 8) & 0x3; // 00
- m_other_modes.color_on_cvg = (w2 >> 7) & 1; // 0
- m_other_modes.image_read_en = (w2 >> 6) & 1; // 1
- m_other_modes.z_update_en = (w2 >> 5) & 1; // 1
- m_other_modes.z_compare_en = (w2 >> 4) & 1; // 1
- m_other_modes.antialias_en = (w2 >> 3) & 1; // 1
- m_other_modes.z_source_sel = (w2 >> 2) & 1; // 0
- m_other_modes.dither_alpha_en = (w2 >> 1) & 1; // 0
- m_other_modes.alpha_compare_en = (w2) & 1; // 0
+ m_other_modes.cycle_type = (w1 >> 52) & 0x3; // 01
+ m_other_modes.persp_tex_en = (w1 >> 51) & 1; // 1
+ m_other_modes.detail_tex_en = (w1 >> 50) & 1; // 0
+ m_other_modes.sharpen_tex_en = (w1 >> 49) & 1; // 0
+ m_other_modes.tex_lod_en = (w1 >> 48) & 1; // 0
+ m_other_modes.en_tlut = (w1 >> 47) & 1; // 0
+ m_other_modes.tlut_type = (w1 >> 46) & 1; // 0
+ m_other_modes.sample_type = (w1 >> 45) & 1; // 1
+ m_other_modes.mid_texel = (w1 >> 44) & 1; // 0
+ m_other_modes.bi_lerp0 = (w1 >> 43) & 1; // 1
+ m_other_modes.bi_lerp1 = (w1 >> 42) & 1; // 1
+ m_other_modes.convert_one = (w1 >> 41) & 1; // 0
+ m_other_modes.key_en = (w1 >> 40) & 1; // 0
+ m_other_modes.rgb_dither_sel = (w1 >> 38) & 0x3; // 00
+ m_other_modes.alpha_dither_sel = (w1 >> 36) & 0x3; // 01
+ m_other_modes.blend_m1a_0 = (w1 >> 30) & 0x3; // 11
+ m_other_modes.blend_m1a_1 = (w1 >> 28) & 0x3; // 00
+ m_other_modes.blend_m1b_0 = (w1 >> 26) & 0x3; // 10
+ m_other_modes.blend_m1b_1 = (w1 >> 24) & 0x3; // 00
+ m_other_modes.blend_m2a_0 = (w1 >> 22) & 0x3; // 00
+ m_other_modes.blend_m2a_1 = (w1 >> 20) & 0x3; // 01
+ m_other_modes.blend_m2b_0 = (w1 >> 18) & 0x3; // 00
+ m_other_modes.blend_m2b_1 = (w1 >> 16) & 0x3; // 01
+ m_other_modes.force_blend = (w1 >> 14) & 1; // 0
+ m_other_modes.blend_shift = m_other_modes.force_blend ? 5 : 2;
+ m_other_modes.alpha_cvg_select = (w1 >> 13) & 1; // 1
+ m_other_modes.cvg_times_alpha = (w1 >> 12) & 1; // 0
+ m_other_modes.z_mode = (w1 >> 10) & 0x3; // 00
+ m_other_modes.cvg_dest = (w1 >> 8) & 0x3; // 00
+ m_other_modes.color_on_cvg = (w1 >> 7) & 1; // 0
+ m_other_modes.image_read_en = (w1 >> 6) & 1; // 1
+ m_other_modes.z_update_en = (w1 >> 5) & 1; // 1
+ m_other_modes.z_compare_en = (w1 >> 4) & 1; // 1
+ m_other_modes.antialias_en = (w1 >> 3) & 1; // 1
+ m_other_modes.z_source_sel = (w1 >> 2) & 1; // 0
+ m_other_modes.dither_alpha_en = (w1 >> 1) & 1; // 0
+ m_other_modes.alpha_compare_en = (w1 >> 0) & 1; // 0
m_other_modes.alpha_dither_mode = (m_other_modes.alpha_compare_en << 1) | m_other_modes.dither_alpha_en;
}
-void n64_rdp::cmd_load_tlut(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_load_tlut(uint64_t w1)
{
//wait("LoadTLUT");
n64_tile_t* tile = m_tiles;
- const int32_t tilenum = (w2 >> 24) & 0x7;
- const int32_t sl = tile[tilenum].sl = ((w1 >> 12) & 0xfff);
- const int32_t tl = tile[tilenum].tl = w1 & 0xfff;
- const int32_t sh = tile[tilenum].sh = ((w2 >> 12) & 0xfff);
- const int32_t th = tile[tilenum].th = w2 & 0xfff;
+ const int32_t tilenum = (w1 >> 24) & 0x7;
+ const int32_t sl = tile[tilenum].sl = int32_t(w1 >> 44) & 0xfff;
+ const int32_t tl = tile[tilenum].tl = int32_t(w1 >> 32) & 0xfff;
+ const int32_t sh = tile[tilenum].sh = int32_t(w1 >> 12) & 0xfff;
+ const int32_t th = tile[tilenum].th = int32_t(w1 >> 0) & 0xfff;
if (tl != th)
{
fatalerror("Load tlut: tl=%d, th=%d\n",tl,th);
}
+ m_capture.data_begin();
+
const int32_t count = ((sh >> 2) - (sl >> 2) + 1) << 2;
switch (m_misc_state.m_ti_size)
@@ -2519,6 +2490,7 @@ void n64_rdp::cmd_load_tlut(uint32_t w1, uint32_t w2)
if (dststart < 2048)
{
dst[dststart] = U_RREADIDX16(srcstart);
+ m_capture.data_block()->put16(dst[dststart]);
dst[dststart + 1] = dst[dststart];
dst[dststart + 2] = dst[dststart];
dst[dststart + 3] = dst[dststart];
@@ -2531,37 +2503,39 @@ void n64_rdp::cmd_load_tlut(uint32_t w1, uint32_t w2)
default: fatalerror("RDP: load_tlut: size = %d\n", m_misc_state.m_ti_size);
}
+ m_capture.data_end();
+
m_tiles[tilenum].sth = rgbaint_t(m_tiles[tilenum].sh, m_tiles[tilenum].sh, m_tiles[tilenum].th, m_tiles[tilenum].th);
m_tiles[tilenum].stl = rgbaint_t(m_tiles[tilenum].sl, m_tiles[tilenum].sl, m_tiles[tilenum].tl, m_tiles[tilenum].tl);
}
-void n64_rdp::cmd_set_tile_size(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_set_tile_size(uint64_t w1)
{
//wait("SetTileSize");
- const int32_t tilenum = (w2 >> 24) & 0x7;
+ const int32_t tilenum = int32_t(w1 >> 24) & 0x7;
- m_tiles[tilenum].sl = (w1 >> 12) & 0xfff;
- m_tiles[tilenum].tl = (w1 >> 0) & 0xfff;
- m_tiles[tilenum].sh = (w2 >> 12) & 0xfff;
- m_tiles[tilenum].th = (w2 >> 0) & 0xfff;
+ m_tiles[tilenum].sl = int32_t(w1 >> 44) & 0xfff;
+ m_tiles[tilenum].tl = int32_t(w1 >> 32) & 0xfff;
+ m_tiles[tilenum].sh = int32_t(w1 >> 12) & 0xfff;
+ m_tiles[tilenum].th = int32_t(w1 >> 0) & 0xfff;
m_tiles[tilenum].sth = rgbaint_t(m_tiles[tilenum].sh, m_tiles[tilenum].sh, m_tiles[tilenum].th, m_tiles[tilenum].th);
m_tiles[tilenum].stl = rgbaint_t(m_tiles[tilenum].sl, m_tiles[tilenum].sl, m_tiles[tilenum].tl, m_tiles[tilenum].tl);
}
-void n64_rdp::cmd_load_block(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_load_block(uint64_t w1)
{
//wait("LoadBlock");
n64_tile_t* tile = m_tiles;
- const int32_t tilenum = (w2 >> 24) & 0x7;
+ const int32_t tilenum = int32_t(w1 >> 24) & 0x7;
uint16_t* tc = get_tmem16();
- int32_t sl = tile[tilenum].sl = ((w1 >> 12) & 0xfff);
- int32_t tl = tile[tilenum].tl = ((w1 >> 0) & 0xfff);
- int32_t sh = tile[tilenum].sh = ((w2 >> 12) & 0xfff);
- const int32_t dxt = ((w2 >> 0) & 0xfff);
+ int32_t sl = tile[tilenum].sl = int32_t(w1 >> 44) & 0xfff;
+ int32_t tl = tile[tilenum].tl = int32_t(w1 >> 32) & 0xfff;
+ int32_t sh = tile[tilenum].sh = int32_t(w1 >> 12) & 0xfff;
+ const int32_t dxt = int32_t(w1 >> 0) & 0xfff;
if (sh < sl)
{
@@ -2584,6 +2558,8 @@ void n64_rdp::cmd_load_block(uint32_t w1, uint32_t w2)
const uint32_t src = (m_misc_state.m_ti_address >> 1) + (tl * tiwinwords) + slinwords;
+ m_capture.data_begin();
+
if (dxt != 0)
{
int32_t j = 0;
@@ -2608,6 +2584,12 @@ void n64_rdp::cmd_load_block(uint32_t w1, uint32_t w2)
tc[((ptr + 1) ^ t) & 0x7ff] = U_RREADIDX16(srcptr + 1);
tc[((ptr + 2) ^ t) & 0x7ff] = U_RREADIDX16(srcptr + 2);
tc[((ptr + 3) ^ t) & 0x7ff] = U_RREADIDX16(srcptr + 3);
+
+ m_capture.data_block()->put16(U_RREADIDX16(srcptr));
+ m_capture.data_block()->put16(U_RREADIDX16(srcptr+1));
+ m_capture.data_block()->put16(U_RREADIDX16(srcptr+2));
+ m_capture.data_block()->put16(U_RREADIDX16(srcptr+3));
+
j += dxt;
}
}
@@ -2636,6 +2618,10 @@ void n64_rdp::cmd_load_block(uint32_t w1, uint32_t w2)
tc[ptr] = ((first >> 8) << 8) | (sec >> 8);
tc[ptr | 0x400] = ((first & 0xff) << 8) | (sec & 0xff);
+ m_capture.data_block()->put16(U_RREADIDX16(srcptr));
+ m_capture.data_block()->put16(U_RREADIDX16(srcptr+1));
+ m_capture.data_block()->put16(U_RREADIDX16(srcptr+2));
+ m_capture.data_block()->put16(U_RREADIDX16(srcptr+3));
j += dxt;
}
}
@@ -2657,6 +2643,11 @@ void n64_rdp::cmd_load_block(uint32_t w1, uint32_t w2)
tc[ptr] = U_RREADIDX16(srcptr + 2);
tc[ptr | 0x400] = U_RREADIDX16(srcptr + 3);
+ m_capture.data_block()->put16(U_RREADIDX16(srcptr));
+ m_capture.data_block()->put16(U_RREADIDX16(srcptr+1));
+ m_capture.data_block()->put16(U_RREADIDX16(srcptr+2));
+ m_capture.data_block()->put16(U_RREADIDX16(srcptr+3));
+
j += dxt;
}
}
@@ -2674,6 +2665,11 @@ void n64_rdp::cmd_load_block(uint32_t w1, uint32_t w2)
tc[((ptr + 1) ^ WORD_ADDR_XOR) & 0x7ff] = U_RREADIDX16(srcptr + 1);
tc[((ptr + 2) ^ WORD_ADDR_XOR) & 0x7ff] = U_RREADIDX16(srcptr + 2);
tc[((ptr + 3) ^ WORD_ADDR_XOR) & 0x7ff] = U_RREADIDX16(srcptr + 3);
+
+ m_capture.data_block()->put16(U_RREADIDX16(srcptr));
+ m_capture.data_block()->put16(U_RREADIDX16(srcptr+1));
+ m_capture.data_block()->put16(U_RREADIDX16(srcptr+2));
+ m_capture.data_block()->put16(U_RREADIDX16(srcptr+3));
}
}
else if (tile[tilenum].format == FORMAT_YUV)
@@ -2692,6 +2688,11 @@ void n64_rdp::cmd_load_block(uint32_t w1, uint32_t w2)
sec = U_RREADIDX16(srcptr + 3);
tc[ptr] = ((first >> 8) << 8) | (sec >> 8);
tc[ptr | 0x400] = ((first & 0xff) << 8) | (sec & 0xff);
+
+ m_capture.data_block()->put16(U_RREADIDX16(srcptr));
+ m_capture.data_block()->put16(U_RREADIDX16(srcptr+1));
+ m_capture.data_block()->put16(U_RREADIDX16(srcptr+2));
+ m_capture.data_block()->put16(U_RREADIDX16(srcptr+3));
}
}
else
@@ -2706,25 +2707,32 @@ void n64_rdp::cmd_load_block(uint32_t w1, uint32_t w2)
ptr = ((tb + (i << 1) + 1) ^ WORD_ADDR_XOR) & 0x3ff;
tc[ptr] = U_RREADIDX16(srcptr + 2);
tc[ptr | 0x400] = U_RREADIDX16(srcptr + 3);
+
+ m_capture.data_block()->put16(U_RREADIDX16(srcptr));
+ m_capture.data_block()->put16(U_RREADIDX16(srcptr+1));
+ m_capture.data_block()->put16(U_RREADIDX16(srcptr+2));
+ m_capture.data_block()->put16(U_RREADIDX16(srcptr+3));
}
}
tile[tilenum].th = tl;
}
+ m_capture.data_end();
+
m_tiles[tilenum].sth = rgbaint_t(m_tiles[tilenum].sh, m_tiles[tilenum].sh, m_tiles[tilenum].th, m_tiles[tilenum].th);
m_tiles[tilenum].stl = rgbaint_t(m_tiles[tilenum].sl, m_tiles[tilenum].sl, m_tiles[tilenum].tl, m_tiles[tilenum].tl);
}
-void n64_rdp::cmd_load_tile(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_load_tile(uint64_t w1)
{
//wait("LoadTile");
n64_tile_t* tile = m_tiles;
- const int32_t tilenum = (w2 >> 24) & 0x7;
+ const int32_t tilenum = int32_t(w1 >> 24) & 0x7;
- tile[tilenum].sl = ((w1 >> 12) & 0xfff);
- tile[tilenum].tl = ((w1 >> 0) & 0xfff);
- tile[tilenum].sh = ((w2 >> 12) & 0xfff);
- tile[tilenum].th = ((w2 >> 0) & 0xfff);
+ tile[tilenum].sl = int32_t(w1 >> 44) & 0xfff;
+ tile[tilenum].tl = int32_t(w1 >> 32) & 0xfff;
+ tile[tilenum].sh = int32_t(w1 >> 12) & 0xfff;
+ tile[tilenum].th = int32_t(w1 >> 0) & 0xfff;
const int32_t sl = tile[tilenum].sl >> 2;
const int32_t tl = tile[tilenum].tl >> 2;
@@ -2746,6 +2754,8 @@ void n64_rdp::cmd_load_tile(uint32_t w1, uint32_t w2)
topad = 0; // ????
*/
+ m_capture.data_begin();
+
switch (m_misc_state.m_ti_size)
{
case PIXEL_SIZE_8BIT:
@@ -2762,7 +2772,9 @@ void n64_rdp::cmd_load_tile(uint32_t w1, uint32_t w2)
for (int32_t i = 0; i < width; i++)
{
- tc[((tline + i) ^ xorval8) & 0xfff] = U_RREADADDR8(src + s + i);
+ const uint8_t data = U_RREADADDR8(src + s + i);
+ m_capture.data_block()->put8(data);
+ tc[((tline + i) ^ xorval8) & 0xfff] = data;
}
}
break;
@@ -2783,8 +2795,10 @@ void n64_rdp::cmd_load_tile(uint32_t w1, uint32_t w2)
for (int32_t i = 0; i < width; i++)
{
- uint32_t taddr = (tline + i) ^ xorval16;
- tc[taddr & 0x7ff] = U_RREADIDX16(src + s + i);
+ const uint32_t taddr = (tline + i) ^ xorval16;
+ const uint16_t data = U_RREADIDX16(src + s + i);
+ m_capture.data_block()->put16(data);
+ tc[taddr & 0x7ff] = data;
}
}
}
@@ -2801,6 +2815,7 @@ void n64_rdp::cmd_load_tile(uint32_t w1, uint32_t w2)
{
uint32_t taddr = ((tline + i) ^ xorval8) & 0x7ff;
uint16_t yuvword = U_RREADIDX16(src + s + i);
+ m_capture.data_block()->put16(yuvword);
get_tmem8()[taddr] = yuvword >> 8;
get_tmem8()[taddr | 0x800] = yuvword & 0xff;
}
@@ -2823,6 +2838,7 @@ void n64_rdp::cmd_load_tile(uint32_t w1, uint32_t w2)
for (int32_t i = 0; i < width; i++)
{
uint32_t c = U_RREADIDX32(src + s + i);
+ m_capture.data_block()->put32(c);
uint32_t ptr = ((tline + i) ^ xorval32cur) & 0x3ff;
tc16[ptr] = c >> 16;
tc16[ptr | 0x400] = c & 0xffff;
@@ -2834,29 +2850,31 @@ void n64_rdp::cmd_load_tile(uint32_t w1, uint32_t w2)
default: fatalerror("RDP: load_tile: size = %d\n", m_misc_state.m_ti_size);
}
+ m_capture.data_end();
+
m_tiles[tilenum].sth = rgbaint_t(m_tiles[tilenum].sh, m_tiles[tilenum].sh, m_tiles[tilenum].th, m_tiles[tilenum].th);
m_tiles[tilenum].stl = rgbaint_t(m_tiles[tilenum].sl, m_tiles[tilenum].sl, m_tiles[tilenum].tl, m_tiles[tilenum].tl);
}
-void n64_rdp::cmd_set_tile(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_set_tile(uint64_t w1)
{
//wait("SetTile");
- const int32_t tilenum = (w2 >> 24) & 0x7;
+ const int32_t tilenum = int32_t(w1 >> 24) & 0x7;
n64_tile_t* tex_tile = &m_tiles[tilenum];
- tex_tile->format = (w1 >> 21) & 0x7;
- tex_tile->size = (w1 >> 19) & 0x3;
- tex_tile->line = (w1 >> 9) & 0x1ff;
- tex_tile->tmem = (w1 >> 0) & 0x1ff;
- tex_tile->palette = (w2 >> 20) & 0xf;
- tex_tile->ct = (w2 >> 19) & 0x1;
- tex_tile->mt = (w2 >> 18) & 0x1;
- tex_tile->mask_t = (w2 >> 14) & 0xf;
- tex_tile->shift_t = (w2 >> 10) & 0xf;
- tex_tile->cs = (w2 >> 9) & 0x1;
- tex_tile->ms = (w2 >> 8) & 0x1;
- tex_tile->mask_s = (w2 >> 4) & 0xf;
- tex_tile->shift_s = (w2 >> 0) & 0xf;
+ tex_tile->format = int32_t(w1 >> 53) & 0x7;
+ tex_tile->size = int32_t(w1 >> 51) & 0x3;
+ tex_tile->line = int32_t(w1 >> 41) & 0x1ff;
+ tex_tile->tmem = int32_t(w1 >> 32) & 0x1ff;
+ tex_tile->palette = int32_t(w1 >> 20) & 0xf;
+ tex_tile->ct = int32_t(w1 >> 19) & 0x1;
+ tex_tile->mt = int32_t(w1 >> 18) & 0x1;
+ tex_tile->mask_t = int32_t(w1 >> 14) & 0xf;
+ tex_tile->shift_t = int32_t(w1 >> 10) & 0xf;
+ tex_tile->cs = int32_t(w1 >> 9) & 0x1;
+ tex_tile->ms = int32_t(w1 >> 8) & 0x1;
+ tex_tile->mask_s = int32_t(w1 >> 4) & 0xf;
+ tex_tile->shift_s = int32_t(w1 >> 0) & 0xf;
tex_tile->lshift_s = (tex_tile->shift_s >= 11) ? (16 - tex_tile->shift_s) : 0;
tex_tile->rshift_s = (tex_tile->shift_s < 11) ? tex_tile->shift_s : 0;
@@ -2892,106 +2910,104 @@ void n64_rdp::cmd_set_tile(uint32_t w1, uint32_t w2)
//m_pending_mode_block = true;
}
-void n64_rdp::cmd_fill_rect(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_fill_rect(uint64_t w1)
{
//if(m_pending_mode_block) { wait("Block on pending mode-change"); m_pending_mode_block = false; }
- const uint32_t xh = (w2 >> 12) & 0xfff;
- const uint32_t xl = (w1 >> 12) & 0xfff;
- const uint32_t yh = (w2 >> 0) & 0xfff;
- uint32_t yl = (w1 >> 0) & 0xfff;
+ const uint64_t xh = (w1 >> 12) & 0xfff;
+ const uint64_t xl = (w1 >> 44) & 0xfff;
+ const uint64_t yh = (w1 >> 0) & 0xfff;
+ uint64_t yl = (w1 >> 32) & 0xfff;
if (m_other_modes.cycle_type == CYCLE_TYPE_FILL || m_other_modes.cycle_type == CYCLE_TYPE_COPY)
{
yl |= 3;
}
- const uint32_t xlint = (xl >> 2) & 0x3ff;
- const uint32_t xhint = (xh >> 2) & 0x3ff;
+ const uint64_t xlint = (xl >> 2) & 0x3ff;
+ const uint64_t xhint = (xh >> 2) & 0x3ff;
- uint32_t* ewdata = m_temp_rect_data;
- ewdata[0] = (0x3680 << 16) | yl;//command, flipped, tile, yl
- ewdata[1] = (yl << 16) | yh;//ym, yh
- ewdata[2] = (xlint << 16) | ((xl & 3) << 14);//xl, xl frac
- ewdata[3] = 0;//dxldy, dxldy frac
- ewdata[4] = (xhint << 16) | ((xh & 3) << 14);//xh, xh frac
- ewdata[5] = 0;//dxhdy, dxhdy frac
- ewdata[6] = (xlint << 16) | ((xl & 3) << 14);//xm, xm frac
- ewdata[7] = 0;//dxmdy, dxmdy frac
- memset(&ewdata[8], 0, 36 * sizeof(uint32_t));//shade, texture, depth
+ uint64_t* ewdata = m_temp_rect_data;
+ ewdata[0] = ((uint64_t)0x3680 << 48) | (yl << 32) | (yl << 16) | yh; // command, flipped, tile, yl, ym, yh
+ ewdata[1] = (xlint << 48) | ((xl & 3) << 46); // xl, xl frac, dxldy (0), dxldy frac (0)
+ ewdata[2] = (xhint << 48) | ((xh & 3) << 46); // xh, xh frac, dxhdy (0), dxhdy frac (0)
+ ewdata[3] = (xlint << 48) | ((xl & 3) << 46); // xm, xm frac, dxmdy (0), dxmdy frac (0)
+ memset(&ewdata[4], 0, 18 * sizeof(uint64_t));//shade, texture, depth
draw_triangle(false, false, false, true);
}
-void n64_rdp::cmd_set_fog_color(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_set_fog_color(uint64_t w1)
{
- m_fog_color.set(w2 & 0xff, (w2 >> 24) & 0xff, (w2 >> 16) & 0xff, (w2 >> 8) & 0xff);
+ m_fog_color.set(uint8_t(w1), uint8_t(w1 >> 24), uint8_t(w1 >> 16), uint8_t(w1 >> 8));
}
-void n64_rdp::cmd_set_blend_color(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_set_blend_color(uint64_t w1)
{
- m_blend_color.set(w2 & 0xff, (w2 >> 24) & 0xff, (w2 >> 16) & 0xff, (w2 >> 8) & 0xff);
+ m_blend_color.set(uint8_t(w1), uint8_t(w1 >> 24), uint8_t(w1 >> 16), uint8_t(w1 >> 8));
}
-void n64_rdp::cmd_set_prim_color(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_set_prim_color(uint64_t w1)
{
- m_misc_state.m_min_level = (w1 >> 8) & 0x1f;
- const uint8_t prim_lod_fraction = w1 & 0xff;
+ m_misc_state.m_min_level = uint32_t(w1 >> 40) & 0x1f;
+ const uint8_t prim_lod_fraction(w1 >> 32);
m_prim_lod_fraction.set(prim_lod_fraction, prim_lod_fraction, prim_lod_fraction, prim_lod_fraction);
- m_prim_color.set(w2 & 0xff, (w2 >> 24) & 0xff, (w2 >> 16) & 0xff, (w2 >> 8) & 0xff);
- m_prim_alpha.set(w2 & 0xff, w2 & 0xff, w2 & 0xff, w2 & 0xff);
+ const uint8_t alpha(w1);
+ m_prim_color.set(alpha, uint8_t(w1 >> 24), uint8_t(w1 >> 16), uint8_t(w1 >> 8));
+ m_prim_alpha.set(alpha, alpha, alpha, alpha);
}
-void n64_rdp::cmd_set_env_color(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_set_env_color(uint64_t w1)
{
- m_env_color.set(w2 & 0xff, (w2 >> 24) & 0xff, (w2 >> 16) & 0xff, (w2 >> 8) & 0xff);
- m_env_alpha.set(w2 & 0xff, w2 & 0xff, w2 & 0xff, w2 & 0xff);
+ const uint8_t alpha(w1);
+ m_env_color.set(alpha, uint8_t(w1 >> 24), uint8_t(w1 >> 16), uint8_t(w1 >> 8));
+ m_env_alpha.set(alpha, alpha, alpha, alpha);
}
-void n64_rdp::cmd_set_combine(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_set_combine(uint64_t w1)
{
- m_combine.sub_a_rgb0 = (w1 >> 20) & 0xf;
- m_combine.mul_rgb0 = (w1 >> 15) & 0x1f;
- m_combine.sub_a_a0 = (w1 >> 12) & 0x7;
- m_combine.mul_a0 = (w1 >> 9) & 0x7;
- m_combine.sub_a_rgb1 = (w1 >> 5) & 0xf;
- m_combine.mul_rgb1 = (w1 >> 0) & 0x1f;
+ m_combine.sub_a_rgb0 = uint32_t(w1 >> 52) & 0xf;
+ m_combine.mul_rgb0 = uint32_t(w1 >> 47) & 0x1f;
+ m_combine.sub_a_a0 = uint32_t(w1 >> 44) & 0x7;
+ m_combine.mul_a0 = uint32_t(w1 >> 41) & 0x7;
+ m_combine.sub_a_rgb1 = uint32_t(w1 >> 37) & 0xf;
+ m_combine.mul_rgb1 = uint32_t(w1 >> 32) & 0x1f;
- m_combine.sub_b_rgb0 = (w2 >> 28) & 0xf;
- m_combine.sub_b_rgb1 = (w2 >> 24) & 0xf;
- m_combine.sub_a_a1 = (w2 >> 21) & 0x7;
- m_combine.mul_a1 = (w2 >> 18) & 0x7;
- m_combine.add_rgb0 = (w2 >> 15) & 0x7;
- m_combine.sub_b_a0 = (w2 >> 12) & 0x7;
- m_combine.add_a0 = (w2 >> 9) & 0x7;
- m_combine.add_rgb1 = (w2 >> 6) & 0x7;
- m_combine.sub_b_a1 = (w2 >> 3) & 0x7;
- m_combine.add_a1 = (w2 >> 0) & 0x7;
+ m_combine.sub_b_rgb0 = uint32_t(w1 >> 28) & 0xf;
+ m_combine.sub_b_rgb1 = uint32_t(w1 >> 24) & 0xf;
+ m_combine.sub_a_a1 = uint32_t(w1 >> 21) & 0x7;
+ m_combine.mul_a1 = uint32_t(w1 >> 18) & 0x7;
+ m_combine.add_rgb0 = uint32_t(w1 >> 15) & 0x7;
+ m_combine.sub_b_a0 = uint32_t(w1 >> 12) & 0x7;
+ m_combine.add_a0 = uint32_t(w1 >> 9) & 0x7;
+ m_combine.add_rgb1 = uint32_t(w1 >> 6) & 0x7;
+ m_combine.sub_b_a1 = uint32_t(w1 >> 3) & 0x7;
+ m_combine.add_a1 = uint32_t(w1 >> 0) & 0x7;
}
-void n64_rdp::cmd_set_texture_image(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_set_texture_image(uint64_t w1)
{
- m_misc_state.m_ti_format = (w1 >> 21) & 0x7;
- m_misc_state.m_ti_size = (w1 >> 19) & 0x3;
- m_misc_state.m_ti_width = (w1 & 0x3ff) + 1;
- m_misc_state.m_ti_address = w2 & 0x01ffffff;
+ m_misc_state.m_ti_format = uint32_t(w1 >> 53) & 0x7;
+ m_misc_state.m_ti_size = uint32_t(w1 >> 51) & 0x3;
+ m_misc_state.m_ti_width = (uint32_t(w1 >> 32) & 0x3ff) + 1;
+ m_misc_state.m_ti_address = uint32_t(w1) & 0x01ffffff;
}
-void n64_rdp::cmd_set_mask_image(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_set_mask_image(uint64_t w1)
{
//wait("SetMaskImage");
- m_misc_state.m_zb_address = w2 & 0x01ffffff;
+ m_misc_state.m_zb_address = uint32_t(w1) & 0x01ffffff;
}
-void n64_rdp::cmd_set_color_image(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_set_color_image(uint64_t w1)
{
//wait("SetColorImage");
- m_misc_state.m_fb_format = (w1 >> 21) & 0x7;
- m_misc_state.m_fb_size = (w1 >> 19) & 0x3;
- m_misc_state.m_fb_width = (w1 & 0x3ff) + 1;
- m_misc_state.m_fb_address = w2 & 0x01ffffff;
+ m_misc_state.m_fb_format = uint32_t(w1 >> 53) & 0x7;
+ m_misc_state.m_fb_size = uint32_t(w1 >> 51) & 0x3;
+ m_misc_state.m_fb_width = (uint32_t(w1 >> 32) & 0x3ff) + 1;
+ m_misc_state.m_fb_address = uint32_t(w1) & 0x01ffffff;
if (m_misc_state.m_fb_format < 2 || m_misc_state.m_fb_format > 32) // Jet Force Gemini sets the format to 4, Intensity. Protection?
{
@@ -3001,12 +3017,12 @@ void n64_rdp::cmd_set_color_image(uint32_t w1, uint32_t w2)
/*****************************************************************************/
-void n64_rdp::cmd_invalid(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_invalid(uint64_t w1)
{
- fatalerror("n64_rdp::Invalid: %d, %08x %08x\n", (w1 >> 24) & 0x3f, w1, w2);
+ fatalerror("n64_rdp::Invalid: %d, %08x %08x\n", uint32_t(w1 >> 56) & 0x3f, uint32_t(w1 >> 32), (uint32_t)w1);
}
-void n64_rdp::cmd_noop(uint32_t w1, uint32_t w2)
+void n64_rdp::cmd_noop(uint64_t w1)
{
// Do nothing
}
@@ -3023,15 +3039,15 @@ void n64_rdp::process_command_list()
}
// load command data
- for(int32_t i = 0; i < length; i += 4)
+ for(int32_t i = 0; i < length; i += 8)
{
m_cmd_data[m_cmd_ptr++] = read_data((m_current & 0x1fffffff) + i);
}
m_current = m_end;
- uint32_t cmd = (m_cmd_data[0] >> 24) & 0x3f;
- uint32_t cmd_length = (m_cmd_ptr + 1) * 4;
+ uint32_t cmd = (m_cmd_data[0] >> 56) & 0x3f;
+ uint32_t cmd_length = uint32_t(m_cmd_ptr + 1) * 8;
set_status(get_status() &~ DP_STATUS_FREEZE);
@@ -3043,78 +3059,79 @@ void n64_rdp::process_command_list()
while (m_cmd_cur < m_cmd_ptr)
{
- cmd = (m_cmd_data[m_cmd_cur] >> 24) & 0x3f;
+ cmd = (m_cmd_data[m_cmd_cur] >> 56) & 0x3f;
- if (((m_cmd_ptr - m_cmd_cur) * 4) < s_rdp_command_length[cmd])
+ if (((m_cmd_ptr - m_cmd_cur) * 8) < s_rdp_command_length[cmd])
{
return;
//fatalerror("rdp_process_list: not enough rdp command data: cur = %d, ptr = %d, expected = %d\n", m_cmd_cur, m_cmd_ptr, s_rdp_command_length[cmd]);
}
+ m_capture.command(&m_cmd_data[m_cmd_cur], s_rdp_command_length[cmd] / 8);
+
if (LOG_RDP_EXECUTION)
{
char string[4000];
disassemble(string);
- fprintf(rdp_exec, "%08X: %08X %08X %s\n", m_start+(m_cmd_cur * 4), m_cmd_data[m_cmd_cur+0], m_cmd_data[m_cmd_cur+1], string);
+ fprintf(rdp_exec, "%08X: %08X%08X %s\n", m_start+(m_cmd_cur * 8), uint32_t(m_cmd_data[m_cmd_cur] >> 32), (uint32_t)m_cmd_data[m_cmd_cur], string);
fflush(rdp_exec);
}
// execute the command
- uint32_t w1 = m_cmd_data[m_cmd_cur+0];
- uint32_t w2 = m_cmd_data[m_cmd_cur+1];
+ uint64_t w = m_cmd_data[m_cmd_cur];
switch(cmd)
{
- case 0x00: cmd_noop(w1, w2); break;
+ case 0x00: cmd_noop(w); break;
- case 0x08: cmd_triangle(w1, w2); break;
- case 0x09: cmd_triangle_z(w1, w2); break;
- case 0x0a: cmd_triangle_t(w1, w2); break;
- case 0x0b: cmd_triangle_tz(w1, w2); break;
- case 0x0c: cmd_triangle_s(w1, w2); break;
- case 0x0d: cmd_triangle_sz(w1, w2); break;
- case 0x0e: cmd_triangle_st(w1, w2); break;
- case 0x0f: cmd_triangle_stz(w1, w2); break;
+ case 0x08: cmd_triangle(w); break;
+ case 0x09: cmd_triangle_z(w); break;
+ case 0x0a: cmd_triangle_t(w); break;
+ case 0x0b: cmd_triangle_tz(w); break;
+ case 0x0c: cmd_triangle_s(w); break;
+ case 0x0d: cmd_triangle_sz(w); break;
+ case 0x0e: cmd_triangle_st(w); break;
+ case 0x0f: cmd_triangle_stz(w); break;
- case 0x24: cmd_tex_rect(w1, w2); break;
- case 0x25: cmd_tex_rect_flip(w1, w2); break;
+ case 0x24: cmd_tex_rect(w); break;
+ case 0x25: cmd_tex_rect_flip(w); break;
- case 0x26: cmd_sync_load(w1, w2); break;
- case 0x27: cmd_sync_pipe(w1, w2); break;
- case 0x28: cmd_sync_tile(w1, w2); break;
- case 0x29: cmd_sync_full(w1, w2); break;
+ case 0x26: cmd_sync_load(w); break;
+ case 0x27: cmd_sync_pipe(w); break;
+ case 0x28: cmd_sync_tile(w); break;
+ case 0x29: cmd_sync_full(w); break;
- case 0x2a: cmd_set_key_gb(w1, w2); break;
- case 0x2b: cmd_set_key_r(w1, w2); break;
+ case 0x2a: cmd_set_key_gb(w); break;
+ case 0x2b: cmd_set_key_r(w); break;
- case 0x2c: cmd_set_convert(w1, w2); break;
- case 0x3c: cmd_set_combine(w1, w2); break;
- case 0x2d: cmd_set_scissor(w1, w2); break;
- case 0x2e: cmd_set_prim_depth(w1, w2); break;
- case 0x2f: cmd_set_other_modes(w1, w2); break;
+ case 0x2c: cmd_set_convert(w); break;
+ case 0x3c: cmd_set_combine(w); break;
+ case 0x2d: cmd_set_scissor(w); break;
+ case 0x2e: cmd_set_prim_depth(w); break;
+ case 0x2f: cmd_set_other_modes(w);break;
- case 0x30: cmd_load_tlut(w1, w2); break;
- case 0x33: cmd_load_block(w1, w2); break;
- case 0x34: cmd_load_tile(w1, w2); break;
+ case 0x30: cmd_load_tlut(w); break;
+ case 0x33: cmd_load_block(w); break;
+ case 0x34: cmd_load_tile(w); break;
- case 0x32: cmd_set_tile_size(w1, w2); break;
- case 0x35: cmd_set_tile(w1, w2); break;
+ case 0x32: cmd_set_tile_size(w); break;
+ case 0x35: cmd_set_tile(w); break;
- case 0x36: cmd_fill_rect(w1, w2); break;
+ case 0x36: cmd_fill_rect(w); break;
- case 0x37: cmd_set_fill_color32(w1, w2); break;
- case 0x38: cmd_set_fog_color(w1, w2); break;
- case 0x39: cmd_set_blend_color(w1, w2); break;
- case 0x3a: cmd_set_prim_color(w1, w2); break;
- case 0x3b: cmd_set_env_color(w1, w2); break;
+ case 0x37: cmd_set_fill_color32(w); break;
+ case 0x38: cmd_set_fog_color(w); break;
+ case 0x39: cmd_set_blend_color(w);break;
+ case 0x3a: cmd_set_prim_color(w); break;
+ case 0x3b: cmd_set_env_color(w); break;
- case 0x3d: cmd_set_texture_image(w1, w2); break;
- case 0x3e: cmd_set_mask_image(w1, w2); break;
- case 0x3f: cmd_set_color_image(w1, w2); break;
+ case 0x3d: cmd_set_texture_image(w); break;
+ case 0x3e: cmd_set_mask_image(w); break;
+ case 0x3f: cmd_set_color_image(w); break;
}
- m_cmd_cur += s_rdp_command_length[cmd] / 4;
+ m_cmd_cur += s_rdp_command_length[cmd] / 8;
};
m_cmd_ptr = 0;
m_cmd_cur = 0;
diff --git a/src/mame/video/n64.h b/src/mame/video/n64.h
index e1b0dd983ca..20eeab81fe2 100644
--- a/src/mame/video/n64.h
+++ b/src/mame/video/n64.h
@@ -6,6 +6,7 @@
#include "emu.h"
#include "includes/n64.h"
#include "video/poly.h"
+#include "pin64.h"
/*****************************************************************************/
@@ -128,7 +129,7 @@ class n64_rdp;
#include "video/rdpblend.h"
#include "video/rdptpipe.h"
-typedef void (*rdp_command_t)(uint32_t w1, uint32_t w2);
+typedef void (*rdp_command_t)(uint64_t w1);
class n64_rdp : public poly_manager<uint32_t, rdp_poly_state, 8, 32000>
{
@@ -163,7 +164,7 @@ public:
}
void process_command_list();
- uint32_t read_data(uint32_t address);
+ uint64_t read_data(uint32_t address);
void disassemble(char* buffer);
void set_machine(running_machine& machine) { m_machine = &machine; }
@@ -224,43 +225,43 @@ public:
bool z_compare(uint32_t zcurpixel, uint32_t dzcurpixel, uint32_t sz, uint16_t dzpix, rdp_span_aux* userdata, const rdp_poly_state &object);
// Commands
- void cmd_invalid(uint32_t w1, uint32_t w2);
- void cmd_noop(uint32_t w1, uint32_t w2);
- void cmd_triangle(uint32_t w1, uint32_t w2);
- void cmd_triangle_z(uint32_t w1, uint32_t w2);
- void cmd_triangle_t(uint32_t w1, uint32_t w2);
- void cmd_triangle_tz(uint32_t w1, uint32_t w2);
- void cmd_triangle_s(uint32_t w1, uint32_t w2);
- void cmd_triangle_sz(uint32_t w1, uint32_t w2);
- void cmd_triangle_st(uint32_t w1, uint32_t w2);
- void cmd_triangle_stz(uint32_t w1, uint32_t w2);
- void cmd_tex_rect(uint32_t w1, uint32_t w2);
- void cmd_tex_rect_flip(uint32_t w1, uint32_t w2);
- void cmd_sync_load(uint32_t w1, uint32_t w2);
- void cmd_sync_pipe(uint32_t w1, uint32_t w2);
- void cmd_sync_tile(uint32_t w1, uint32_t w2);
- void cmd_sync_full(uint32_t w1, uint32_t w2);
- void cmd_set_key_gb(uint32_t w1, uint32_t w2);
- void cmd_set_key_r(uint32_t w1, uint32_t w2);
- void cmd_set_fill_color32(uint32_t w1, uint32_t w2);
- void cmd_set_convert(uint32_t w1, uint32_t w2);
- void cmd_set_scissor(uint32_t w1, uint32_t w2);
- void cmd_set_prim_depth(uint32_t w1, uint32_t w2);
- void cmd_set_other_modes(uint32_t w1, uint32_t w2);
- void cmd_load_tlut(uint32_t w1, uint32_t w2);
- void cmd_set_tile_size(uint32_t w1, uint32_t w2);
- void cmd_load_block(uint32_t w1, uint32_t w2);
- void cmd_load_tile(uint32_t w1, uint32_t w2);
- void cmd_fill_rect(uint32_t w1, uint32_t w2);
- void cmd_set_tile(uint32_t w1, uint32_t w2);
- void cmd_set_fog_color(uint32_t w1, uint32_t w2);
- void cmd_set_blend_color(uint32_t w1, uint32_t w2);
- void cmd_set_prim_color(uint32_t w1, uint32_t w2);
- void cmd_set_env_color(uint32_t w1, uint32_t w2);
- void cmd_set_combine(uint32_t w1, uint32_t w2);
- void cmd_set_texture_image(uint32_t w1, uint32_t w2);
- void cmd_set_mask_image(uint32_t w1, uint32_t w2);
- void cmd_set_color_image(uint32_t w1, uint32_t w2);
+ void cmd_invalid(uint64_t w1);
+ void cmd_noop(uint64_t w1);
+ void cmd_triangle(uint64_t w1);
+ void cmd_triangle_z(uint64_t w1);
+ void cmd_triangle_t(uint64_t w1);
+ void cmd_triangle_tz(uint64_t w1);
+ void cmd_triangle_s(uint64_t w1);
+ void cmd_triangle_sz(uint64_t w1);
+ void cmd_triangle_st(uint64_t w1);
+ void cmd_triangle_stz(uint64_t w1);
+ void cmd_tex_rect(uint64_t w1);
+ void cmd_tex_rect_flip(uint64_t w1);
+ void cmd_sync_load(uint64_t w1);
+ void cmd_sync_pipe(uint64_t w1);
+ void cmd_sync_tile(uint64_t w1);
+ void cmd_sync_full(uint64_t w1);
+ void cmd_set_key_gb(uint64_t w1);
+ void cmd_set_key_r(uint64_t w1);
+ void cmd_set_fill_color32(uint64_t w1);
+ void cmd_set_convert(uint64_t w1);
+ void cmd_set_scissor(uint64_t w1);
+ void cmd_set_prim_depth(uint64_t w1);
+ void cmd_set_other_modes(uint64_t w1);
+ void cmd_load_tlut(uint64_t w1);
+ void cmd_set_tile_size(uint64_t w1);
+ void cmd_load_block(uint64_t w1);
+ void cmd_load_tile(uint64_t w1);
+ void cmd_fill_rect(uint64_t w1);
+ void cmd_set_tile(uint64_t w1);
+ void cmd_set_fog_color(uint64_t w1);
+ void cmd_set_blend_color(uint64_t w1);
+ void cmd_set_prim_color(uint64_t w1);
+ void cmd_set_env_color(uint64_t w1);
+ void cmd_set_combine(uint64_t w1);
+ void cmd_set_texture_image(uint64_t w1);
+ void cmd_set_mask_image(uint64_t w1);
+ void cmd_set_color_image(uint64_t w1);
void rgbaz_clip(int32_t sr, int32_t sg, int32_t sb, int32_t sa, int32_t* sz, rdp_span_aux* userdata);
void rgbaz_correct_triangle(int32_t offx, int32_t offy, int32_t* r, int32_t* g, int32_t* b, int32_t* a, int32_t* z, rdp_span_aux* userdata, const rdp_poly_state &object);
@@ -272,6 +273,8 @@ public:
uint16_t decompress_cvmask_frombyte(uint8_t x);
void lookup_cvmask_derivatives(uint32_t mask, uint8_t* offx, uint8_t* offy, rdp_span_aux* userdata);
+ void mark_frame() { m_capture.mark_frame(*m_machine); }
+
misc_state_t m_misc_state;
// Color constants
@@ -344,8 +347,8 @@ private:
uint32_t m_z_complete_dec_table[0x4000]; //the same for decompressed z values, 14b
uint8_t m_compressed_cvmasks[0x10000]; //16bit cvmask -> to byte
- uint32_t m_cmd_data[0x1000];
- uint32_t m_temp_rect_data[0x1000];
+ uint64_t m_cmd_data[0x800];
+ uint64_t m_temp_rect_data[0x800];
int32_t m_cmd_ptr;
int32_t m_cmd_cur;
@@ -367,6 +370,8 @@ private:
int32_t m_norm_point_rom[64];
int32_t m_norm_slope_rom[64];
+ pin64_t m_capture;
+
static uint32_t s_special_9bit_clamptable[512];
static const z_decompress_entry_t m_z_dec_table[8];
diff --git a/src/mame/video/namcos21.cpp b/src/mame/video/namcos21.cpp
index 01865fb2f62..d7f5cb7ad14 100644
--- a/src/mame/video/namcos21.cpp
+++ b/src/mame/video/namcos21.cpp
@@ -417,9 +417,9 @@ uint32_t namcos21_state::screen_update_driveyes(screen_device &screen, bitmap_in
for( pri=pivot; pri<8; pri++ )
c355_obj_draw(screen, bitmap, cliprect, pri );
-
+
c355_obj_draw(screen, bitmap, cliprect, 15 ); //driver's eyes
-
+
return 0;
}
@@ -444,7 +444,7 @@ void namcos21_state::winrun_bitmap_draw(bitmap_ind16 &bitmap, const rectangle &c
{
case 0xff:
break;
- // TODO: additive blending? winrun car select uses register [0xc] for a xscroll value
+ // TODO: additive blending? winrun car select uses register [0xc] for a xscroll value
case 0x00:
pDest[sx] = (pDest[sx]&0x1fff)+0x4000;
break;
@@ -469,6 +469,6 @@ uint32_t namcos21_state::screen_update_winrun(screen_device &screen, bitmap_ind1
winrun_bitmap_draw(bitmap,cliprect);
//popmessage("%04x %04x %04x|%04x %04x",m_winrun_gpu_register[0],m_winrun_gpu_register[2/2],m_winrun_gpu_register[4/2],m_winrun_gpu_register[0xa/2],m_winrun_gpu_register[0xc/2]);
-
+
return 0;
}
diff --git a/src/mame/video/newbrain.cpp b/src/mame/video/newbrain.cpp
index 9aa6f65cb44..817b0d162ce 100644
--- a/src/mame/video/newbrain.cpp
+++ b/src/mame/video/newbrain.cpp
@@ -2,9 +2,9 @@
// copyright-holders:Curt Coder
/*
- TODO:
+ TODO:
- - GR is always 0
+ - GR is always 0
*/
@@ -99,7 +99,7 @@ void newbrain_state::screen_update(bitmap_rgb32 &bitmap, const rectangle &clipre
if (rc3 && txt) {
rc_ = 7;
}
-
+
uint16_t charrom_addr = (m_ucr << 11) | (rc_ << 8) | ((BIT(rd, 7) && m_fs) << 7) | (rd & 0x7f);
uint8_t crd = m_char_rom->base()[charrom_addr & 0xfff];
bool crd0 = BIT(crd, 0);
diff --git a/src/mame/video/pin64.cpp b/src/mame/video/pin64.cpp
new file mode 100644
index 00000000000..cbc9ad934dc
--- /dev/null
+++ b/src/mame/video/pin64.cpp
@@ -0,0 +1,506 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+
+#include "pin64.h"
+
+#define CAP_NAME "pin64_%d.cap"
+
+// pin64_fileutil_t members
+
+void pin64_fileutil_t::write(FILE* file, uint32_t data) {
+ if (!file)
+ return;
+
+ uint8_t temp(data >> 24);
+ fwrite(&temp, 1, 1, file);
+
+ temp = (uint8_t)(data >> 16);
+ fwrite(&temp, 1, 1, file);
+
+ temp = (uint8_t)(data >> 8);
+ fwrite(&temp, 1, 1, file);
+
+ temp = (uint8_t)data;
+ fwrite(&temp, 1, 1, file);
+}
+
+void pin64_fileutil_t::write(FILE* file, const uint8_t* data, uint32_t size) {
+ if (!file)
+ return;
+
+ fwrite(data, 1, size, file);
+}
+
+
+
+// pin64_data_t members
+
+void pin64_data_t::put8(uint8_t data) {
+ m_data.push_back(data);
+ m_offset++;
+}
+
+void pin64_data_t::put16(uint16_t data) {
+ put8((uint8_t)(data >> 8));
+ put8((uint8_t)data);
+}
+
+void pin64_data_t::put32(uint32_t data) {
+ put16((uint16_t)(data >> 16));
+ put16((uint16_t)data);
+}
+
+void pin64_data_t::put64(uint64_t data) {
+ put32((uint32_t)(data >> 32));
+ put32((uint32_t)data);
+}
+
+uint8_t pin64_data_t::get8() {
+ if (m_offset >= m_data.size())
+ fatalerror("PIN64: Call to pin64_data_t::get8() at end of block (requested offset %x, size %x)\n", m_offset, (uint32_t)m_data.size());
+
+ uint8_t ret = m_data[m_offset];
+ m_offset++;
+
+ return ret;
+}
+
+uint16_t pin64_data_t::get16() {
+ uint16_t ret = (uint16_t)get8() << 8;
+ return ret | get8();
+}
+
+uint32_t pin64_data_t::get32() {
+ uint32_t ret = (uint32_t)get16() << 16;
+ return ret | get16();
+}
+
+uint64_t pin64_data_t::get64() {
+ uint64_t ret = (uint64_t)get32() << 32;
+ return ret | get32();
+}
+
+uint8_t pin64_data_t::get8(uint32_t offset, bool temp_access) {
+ update_offset(offset, temp_access);
+
+ uint8_t ret = get8();
+ m_offset = m_old_offset;
+ return ret;
+}
+
+uint16_t pin64_data_t::get16(uint32_t offset, bool temp_access) {
+ update_offset(offset, temp_access);
+
+ uint16_t ret = get16();
+ m_offset = m_old_offset;
+ return ret;
+}
+
+uint32_t pin64_data_t::get32(uint32_t offset, bool temp_access) {
+ update_offset(offset, temp_access);
+
+ uint32_t ret = get32();
+ m_offset = m_old_offset;
+ return ret;
+}
+
+uint64_t pin64_data_t::get64(uint32_t offset, bool temp_access) {
+ update_offset(offset, temp_access);
+
+ uint32_t ret = get64();
+ m_offset = m_old_offset;
+ return ret;
+}
+
+void pin64_data_t::reset() {
+ m_old_offset = 0;
+ m_offset = 0;
+}
+
+void pin64_data_t::clear() {
+ reset();
+ m_data.clear();
+}
+
+void pin64_data_t::update_offset(uint32_t offset, bool update_current) {
+ m_old_offset = (update_current ? offset : m_offset);
+ m_offset = offset;
+}
+
+
+
+// pin64_printer_t members
+
+void pin64_printer_t::print_data(pin64_block_t* block) {
+ pin64_data_t* data = block->data();
+
+ printf(" CRC32: %08x\n", (uint32_t)block->crc32()); fflush(stdout);
+ printf(" Data Size: %08x\n", (uint32_t)data->size()); fflush(stdout);
+ printf(" Data: "); fflush(stdout);
+
+ const uint32_t data_size = data->size();
+ const uint32_t row_count = (data_size + 31) / 32;
+ const uint8_t* bytes = data->bytes();
+ for (uint32_t row = 0; row < row_count; row++) {
+ const uint32_t row_index = row * 32;
+ const uint32_t data_remaining = data_size - row_index;
+ const uint32_t col_count = (data_remaining > 32 ? 32 : data_remaining);
+ for (uint32_t col = 0; col < col_count; col++) {
+ printf("%02x ", bytes[row_index + col]); fflush(stdout);
+ }
+
+ if (row == (row_count - 1)) {
+ printf("\n"); fflush(stdout);
+ } else {
+ printf("\n "); fflush(stdout);
+ }
+ }
+
+ printf("\n"); fflush(stdout);
+}
+
+void pin64_printer_t::print_command(int cmd_start, int cmd, std::unordered_map<util::crc32_t, pin64_block_t*>& blocks, std::vector<util::crc32_t>& commands) {
+ pin64_block_t* block = blocks[commands[cmd]];
+ pin64_data_t* data = block->data();
+
+ printf(" Command %d:\n", cmd - cmd_start); fflush(stdout);
+ const uint32_t cmd_size(data->get32());
+ printf(" CRC32: %08x\n", (uint32_t)commands[cmd]); fflush(stdout);
+ printf(" Packet Data Size: %d words\n", cmd_size); fflush(stdout);
+ printf(" Packet Data: "); fflush(stdout);
+
+ bool load_command = false;
+ for (int i = 0; i < cmd_size; i++) {
+ const uint64_t cmd_entry(data->get64());
+ if (i == 0) {
+ const uint8_t top_byte = uint8_t(cmd_entry >> 56) & 0x3f;
+ if (top_byte == 0x30 || top_byte == 0x33 || top_byte == 0x34)
+ load_command = true;
+ }
+ printf("%08x%08x\n", uint32_t(cmd_entry >> 32), (uint32_t)cmd_entry); fflush(stdout);
+
+ if (i < (cmd_size - 1)) {
+ printf(" "); fflush(stdout);
+ }
+ }
+
+ printf(" Data Block Present: %s\n", load_command ? "Yes" : "No"); fflush(stdout);
+
+ if (load_command) {
+ printf(" Data Block CRC32: %08x\n", data->get32()); fflush(stdout);
+ }
+
+ data->reset();
+};
+
+
+
+// pin64_block_t members
+
+void pin64_block_t::finalize() {
+ if (m_data.size() > 0)
+ m_crc32 = util::crc32_creator::simple(m_data.bytes(), m_data.size());
+ else
+ m_crc32 = ~0;
+ m_data.reset();
+}
+
+void pin64_block_t::clear() {
+ m_crc32 = 0;
+ m_data.clear();
+}
+
+void pin64_block_t::write(FILE* file) {
+ pin64_fileutil_t::write(file, m_crc32);
+ pin64_fileutil_t::write(file, m_data.size());
+ if (m_data.size() > 0)
+ pin64_fileutil_t::write(file, m_data.bytes(), m_data.size());
+}
+
+uint32_t pin64_block_t::size() {
+ return sizeof(uint32_t) // data CRC32
+ + sizeof(uint32_t) // data size
+ + m_data.size(); // data
+}
+
+
+
+// pin64_t members
+
+const uint8_t pin64_t::CAP_ID[8] = { 'P', 'I', 'N', '6', '4', 'C', 'A', 'P' };
+
+pin64_t::~pin64_t() {
+ if (m_capture_file)
+ finish();
+
+ clear();
+}
+
+void pin64_t::start(int frames)
+{
+ if (m_capture_index == ~0)
+ init_capture_index();
+
+ if (m_capture_file)
+ fatalerror("PIN64: Call to start() while already capturing\n");
+
+ char name_buf[256];
+ sprintf(name_buf, CAP_NAME, m_capture_index);
+ m_capture_index++;
+
+ m_capture_file = fopen(name_buf, "wb");
+
+ m_capture_frames = frames;
+
+ m_frames.push_back(0);
+}
+
+void pin64_t::finish() {
+ if (!m_capture_file)
+ return;
+
+ finalize();
+ print();
+
+ write(m_capture_file);
+ fclose(m_capture_file);
+ m_capture_file = nullptr;
+
+ clear();
+}
+
+void pin64_t::finalize() {
+ finish_command();
+ data_end();
+}
+
+void pin64_t::play(int index) {
+}
+
+void pin64_t::mark_frame(running_machine& machine) {
+ if (m_capture_file) {
+ if (m_frames.size() == m_capture_frames && m_capture_frames > 0) {
+ printf("\n");
+ finish();
+ machine.popmessage("Done recording.");
+ } else {
+ printf("%d ", (uint32_t)m_commands.size());
+ m_frames.push_back((uint32_t)m_commands.size());
+ }
+ }
+
+#if PIN64_ENABLE_CAPTURE
+ if (machine.input().code_pressed_once(KEYCODE_N) && !m_capture_file) {
+ start(1);
+ machine.popmessage("Capturing PIN64 snapshot to pin64_%d.cap", m_capture_index - 1);
+ } else if (machine.input().code_pressed_once(KEYCODE_M)) {
+ if (m_capture_file) {
+ finish();
+ machine.popmessage("Done recording.");
+ } else {
+ start();
+ machine.popmessage("Recording PIN64 movie to pin64_%d.cap", m_capture_index - 1);
+ }
+ }
+#endif
+}
+
+void pin64_t::command(uint64_t* cmd_data, uint32_t size) {
+ if (!capturing())
+ return;
+
+ finish_command();
+
+ m_current_command = new pin64_block_t();
+ m_current_command->data()->put32(size);
+
+ for (uint32_t i = 0 ; i < size; i++)
+ m_current_command->data()->put64(cmd_data[i]);
+}
+
+void pin64_t::finish_command() {
+ if (!m_current_command)
+ return;
+
+ m_current_command->finalize();
+ if (m_blocks.find(m_current_command->crc32()) == m_blocks.end())
+ m_blocks[m_current_command->crc32()] = m_current_command;
+
+ m_commands.push_back(m_current_command->crc32());
+}
+
+void pin64_t::data_begin() {
+ if (!capturing())
+ return;
+
+ if (m_current_data)
+ data_end();
+
+ m_current_data = new pin64_block_t();
+}
+
+pin64_data_t* pin64_t::data_block() {
+ if (!capturing() || !m_current_data)
+ return &m_dummy_data;
+
+ return m_current_data->data();
+}
+
+void pin64_t::data_end() {
+ if (!capturing() || !m_current_data)
+ return;
+
+ m_current_data->finalize();
+ m_current_command->data()->put32(m_current_data->crc32());
+ finish_command();
+
+ if (m_blocks.find(m_current_data->crc32()) == m_blocks.end())
+ m_blocks[m_current_data->crc32()] = m_current_data;
+
+ m_current_data = nullptr;
+}
+
+size_t pin64_t::size() {
+ return header_size() + block_directory_size() + cmdlist_directory_size() + cmdlist_size();
+}
+
+size_t pin64_t::header_size() {
+ return sizeof(uint8_t) * 8 // "PIN64CAP"
+ + sizeof(uint32_t) // total file size
+ + sizeof(uint32_t) // start of block directory data
+ + sizeof(uint32_t) // start of command-list directory data
+ + sizeof(uint32_t) // start of blocks
+ + sizeof(uint32_t); // start of commands
+}
+
+size_t pin64_t::block_directory_size() {
+ return (m_blocks.size() + 1) * sizeof(uint32_t);
+}
+
+size_t pin64_t::cmdlist_directory_size() {
+ return (m_frames.size() + 1) * sizeof(uint16_t);
+}
+
+size_t pin64_t::blocks_size() {
+ size_t block_size = 0;
+ for (std::pair<util::crc32_t, pin64_block_t*> block_pair : m_blocks)
+ block_size += (block_pair.second)->size();
+
+ return block_size;
+}
+
+size_t pin64_t::cmdlist_size() {
+ return (m_commands.size() + 1) * sizeof(uint32_t);
+}
+
+void pin64_t::print()
+{
+ printf("Total Size: %9x bytes\n", (uint32_t)size()); fflush(stdout);
+ printf("Header Size: %9x bytes\n", (uint32_t)header_size()); fflush(stdout);
+ printf("Block Dir Size: %9x bytes\n", (uint32_t)block_directory_size()); fflush(stdout);
+ printf("Cmdlist Dir Size: %9x bytes\n", (uint32_t)cmdlist_directory_size()); fflush(stdout);
+ printf("Blocks Size: %9x bytes\n", (uint32_t)blocks_size()); fflush(stdout);
+ printf("Cmdlist Size: %9x bytes\n", (uint32_t)cmdlist_size()); fflush(stdout);
+
+ printf("Command-List Count: %d\n", (uint32_t)m_frames.size()); fflush(stdout);
+ for (int i = 0; i < m_frames.size(); i++) {
+ printf(" List %d:\n", i); fflush(stdout);
+
+ const int next_start = ((i == (m_frames.size() - 1)) ? m_commands.size() : m_frames[i+1]);
+ for (int cmd = m_frames[i]; cmd < next_start; cmd++) {
+ pin64_printer_t::print_command(m_frames[i], cmd, m_blocks, m_commands);
+ }
+ if (i == (m_frames.size() - 1)) {
+ printf("\n"); fflush(stdout);
+ }
+ }
+
+ printf("\nData Block Count: %d\n", (uint32_t)m_blocks.size()); fflush(stdout);
+ int i = 0;
+ for (std::pair<util::crc32_t, pin64_block_t*> block_pair : m_blocks) {
+ printf(" Block %d:\n", i); fflush(stdout);
+
+ pin64_printer_t::print_data((block_pair.second));
+ if (i == (m_blocks.size() - 1)) {
+ printf("\n"); fflush(stdout);
+ }
+ i++;
+ }
+}
+
+void pin64_t::write(FILE* file) {
+ const uint32_t size_total = size();
+ const uint32_t size_header = header_size();
+ const uint32_t size_block_dir = block_directory_size();
+ const uint32_t size_cmdlist_dir = cmdlist_directory_size();
+ const uint32_t size_blocks_dir = blocks_size();
+
+ pin64_fileutil_t::write(file, CAP_ID, 8);
+ pin64_fileutil_t::write(file, size_total);
+ pin64_fileutil_t::write(file, size_header);
+ pin64_fileutil_t::write(file, size_header + size_block_dir);
+ pin64_fileutil_t::write(file, size_header + size_block_dir + size_cmdlist_dir);
+ pin64_fileutil_t::write(file, size_header + size_block_dir + size_cmdlist_dir + size_blocks_dir);
+
+ write_data_directory(file);
+ write_cmdlist_directory(file);
+
+ for (std::pair<util::crc32_t, pin64_block_t*> block_pair : m_blocks)
+ (block_pair.second)->write(file);
+
+ pin64_fileutil_t::write(file, m_commands.size());
+ for (util::crc32_t crc : m_commands)
+ pin64_fileutil_t::write(file, crc);
+}
+
+void pin64_t::write_data_directory(FILE* file) {
+ pin64_fileutil_t::write(file, m_blocks.size());
+ size_t offset(header_size());
+ for (std::pair<util::crc32_t, pin64_block_t*> block_pair : m_blocks) {
+ pin64_fileutil_t::write(file, offset);
+ offset += (block_pair.second)->size();
+ }
+}
+
+void pin64_t::write_cmdlist_directory(FILE* file) {
+ pin64_fileutil_t::write(file, m_frames.size());
+ for (uint32_t frame : m_frames)
+ pin64_fileutil_t::write(file, frame);
+}
+
+void pin64_t::clear() {
+ if (m_capture_file != nullptr) {
+ fclose(m_capture_file);
+ m_capture_file = nullptr;
+ }
+
+ for (std::pair<util::crc32_t, pin64_block_t*> block_pair : m_blocks)
+ delete block_pair.second;
+
+ m_blocks.clear();
+ m_commands.clear();
+ m_frames.clear();
+
+ m_current_data = nullptr;
+ m_current_command = nullptr;
+}
+
+void pin64_t::init_capture_index()
+{
+ char name_buf[256];
+ bool found = true;
+
+ m_capture_index = 0;
+
+ do {
+ sprintf(name_buf, CAP_NAME, m_capture_index);
+
+ FILE* temp = fopen(name_buf, "rb");
+ if (temp == nullptr) {
+ break;
+ } else {
+ fclose(temp);
+ m_capture_index++;
+ }
+ } while(found);
+}
diff --git a/src/mame/video/pin64.h b/src/mame/video/pin64.h
new file mode 100644
index 00000000000..d8e82395f25
--- /dev/null
+++ b/src/mame/video/pin64.h
@@ -0,0 +1,180 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+#pragma once
+
+#ifndef PIN64_H
+#define PIN64_H
+
+#include <cstdio>
+#include <vector>
+#include <map>
+
+#define PIN64_ENABLE_CAPTURE (0)
+
+#include "emu.h"
+
+class pin64_fileutil_t {
+public:
+ static void write(FILE* file, uint32_t data);
+ static void write(FILE* file, const uint8_t* data, uint32_t size);
+};
+
+class pin64_command_t {
+public:
+ std::vector<uint8_t> data;
+};
+
+class pin64_data_t {
+public:
+ pin64_data_t()
+ : m_offset(0)
+ , m_old_offset(0) { }
+
+ void reset();
+ void clear();
+
+ // setters
+ virtual void put8(uint8_t data);
+ virtual void put16(uint16_t data);
+ virtual void put32(uint32_t data);
+ virtual void put64(uint64_t data);
+
+ // getters
+ virtual uint8_t get8();
+ virtual uint8_t get8(uint32_t offset, bool temp_access = false);
+ virtual uint16_t get16();
+ virtual uint16_t get16(uint32_t offset, bool temp_access = false);
+ virtual uint32_t get32();
+ virtual uint32_t get32(uint32_t offset, bool temp_access = false);
+ virtual uint64_t get64();
+ virtual uint64_t get64(uint32_t offset, bool temp_access = false);
+ virtual uint32_t offset() { return m_offset; }
+ uint8_t* bytes() { return (m_data.size() > 0) ? &m_data[0] : nullptr; }
+ uint32_t size() { return m_data.size(); }
+
+private:
+ void update_offset(uint32_t offset, bool temp_access = false);
+
+protected:
+ std::vector<uint8_t> m_data;
+
+ uint32_t m_offset;
+ uint32_t m_old_offset;
+};
+
+class pin64_dummy_data_t : public pin64_data_t {
+public:
+ void put8(uint8_t data) override { }
+ void put16(uint16_t data) override { }
+ void put32(uint32_t data) override { }
+ void put64(uint64_t data) override { }
+
+ uint8_t get8() override { return 0; }
+ uint8_t get8(uint32_t offset, bool update_current = true) override { return 0; }
+ uint16_t get16() override { return 0; }
+ uint16_t get16(uint32_t offset, bool update_current = true) override { return 0; }
+ uint32_t get32() override { return 0; }
+ uint32_t get32(uint32_t offset, bool update_current = true) override { return 0; }
+ uint64_t get64() override { return 0; }
+ uint64_t get64(uint32_t offset, bool update_current = true) override { return 0; }
+
+ uint32_t offset() override { return 0; }
+};
+
+class pin64_block_t {
+public:
+ pin64_block_t()
+ : m_crc32{0} { }
+ virtual ~pin64_block_t() { }
+
+ void finalize();
+ void clear();
+
+ void write(FILE* file);
+
+ // getters
+ uint32_t size();
+ pin64_data_t* data() { return &m_data; }
+ util::crc32_t crc32() const { return m_crc32; }
+
+protected:
+ util::crc32_t m_crc32;
+ pin64_data_t m_data;
+};
+
+class pin64_printer_t {
+public:
+ static void print_data(pin64_block_t* block);
+ static void print_command(int cmd_start, int cmd, std::unordered_map<util::crc32_t, pin64_block_t*>& blocks, std::vector<util::crc32_t>& commands);
+};
+
+class pin64_t
+{
+public:
+ pin64_t()
+ : m_capture_file(nullptr)
+ , m_capture_index(~0)
+ , m_capture_frames(0)
+ , m_current_data(nullptr)
+ , m_current_command(nullptr)
+ , m_playing(false)
+ { }
+ ~pin64_t();
+
+ void start(int frames = 0);
+ void finish();
+ void clear();
+ void print();
+
+ void mark_frame(running_machine& machine);
+ void play(int index);
+
+ void command(uint64_t* cmd_data, uint32_t size);
+
+ void data_begin();
+ pin64_data_t* data_block();
+ pin64_block_t& block() { return *m_current_data; }
+ void data_end();
+
+ bool capturing() const { return m_capture_file != nullptr; }
+ bool playing() const { return m_playing; }
+
+ size_t size();
+
+private:
+ void start_command_block();
+
+ void write(FILE* file);
+
+ size_t header_size();
+ size_t block_directory_size();
+ size_t cmdlist_directory_size();
+ size_t blocks_size();
+ size_t cmdlist_size();
+
+ void finish_command();
+
+ void write_data_directory(FILE* file);
+ void write_cmdlist_directory(FILE* file);
+ void init_capture_index();
+
+ void finalize();
+
+ FILE *m_capture_file;
+ int32_t m_capture_index;
+ int m_capture_frames;
+
+ pin64_block_t* m_current_data;
+ pin64_block_t* m_current_command;
+ std::unordered_map<util::crc32_t, pin64_block_t*> m_blocks;
+
+ std::vector<util::crc32_t> m_commands;
+ std::vector<uint32_t> m_frames;
+
+ bool m_playing;
+
+ pin64_dummy_data_t m_dummy_data;
+ static const uint8_t CAP_ID[8];
+};
+
+#endif // PIN64_H \ No newline at end of file
diff --git a/src/mame/video/powervr2.cpp b/src/mame/video/powervr2.cpp
index 641c2c4b60e..50a8f00a4df 100644
--- a/src/mame/video/powervr2.cpp
+++ b/src/mame/video/powervr2.cpp
@@ -3499,6 +3499,7 @@ WRITE32_MEMBER( powervr2_device::pvr2_ta_w )
//printf("PVR2 %08x %08x\n",reg,dat);
}
+// TODO: move to specific device
READ32_MEMBER( powervr2_device::elan_regs_r )
{
switch(offset)
diff --git a/src/mame/video/taito_f3.cpp b/src/mame/video/taito_f3.cpp
index 8a3b6442faf..b2028d09e98 100644
--- a/src/mame/video/taito_f3.cpp
+++ b/src/mame/video/taito_f3.cpp
@@ -323,7 +323,7 @@ pri_alp_bitmap
*/
-void taito_f3_state::device_post_load()
+void taito_f3_state::device_post_load()
{
/* force a reread of the dynamic tiles in the pixel layer */
m_gfxdecode->gfx(3)->mark_all_dirty();
diff --git a/src/mame/video/ygv608.cpp b/src/mame/video/ygv608.cpp
index a7f73bbdc32..dad7c250008 100644
--- a/src/mame/video/ygv608.cpp
+++ b/src/mame/video/ygv608.cpp
@@ -38,7 +38,6 @@
#define _ENABLE_SCROLLX
#define _ENABLE_SCROLLY
//#define _ENABLE_SCREEN_RESIZE
-//#define _ENABLE_ROTATE_ZOOM
//#define _SHOW_VIDEO_DEBUG
#define GFX_8X8_4BIT 0
@@ -831,6 +830,31 @@ static const char *const mode[] = {
static const char *const psize[] = { "8x8", "16x16", "32x32", "64x64" };
#endif
+inline void ygv608_device::draw_layer_roz(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, tilemap_t *source_tilemap)
+{
+ //int xc, yc;
+ //double r, alpha, sin_theta, cos_theta;
+ //const rectangle &visarea = screen.visible_area();
+
+ if( m_regs.s.r7 & r7_zron )
+ {
+ // old code, for reference.
+ //xc = m_ax >> 16;
+ //yc = m_ay >> 16;
+ //r = sqrt( (double)( xc * xc + yc * yc ) );
+ //alpha = atan( (double)xc / (double)yc );
+ //sin_theta = (double)m_dyx / (double)0x10000;
+ //cos_theta = (double)m_dx / (double)0x10000;
+
+ source_tilemap->draw_roz(screen, bitmap, cliprect,
+ m_ax, m_ay,
+ m_dx, m_dxy, m_dyx, m_dy, true, 0, 0 );
+ }
+ else
+ source_tilemap->draw(screen, bitmap, cliprect, 0, 0 );
+}
+
+
uint32_t ygv608_device::update_screen(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
#ifdef _SHOW_VIDEO_DEBUG
@@ -839,21 +863,17 @@ uint32_t ygv608_device::update_screen(screen_device &screen, bitmap_ind16 &bitma
#ifdef _ENABLE_SCROLLY
int col;
#endif
-#ifdef _ENABLE_ROTATE_ZOOM
- int xc, yc;
- double r, alpha, sin_theta, cos_theta;
-#endif
rectangle finalclip;
const rectangle &visarea = screen.visible_area();
// clip to the current bitmap
finalclip.set(0, screen.width() - 1, 0, screen.height() - 1);
finalclip &= cliprect;
-
+ bitmap.fill(0, visarea );
+
// punt if not initialized
if (m_page_x == 0 || m_page_y == 0)
{
- bitmap.fill(0, finalclip);
return 0;
}
@@ -951,7 +971,6 @@ uint32_t ygv608_device::update_screen(screen_device &screen, bitmap_ind16 &bitma
* now we can render the screen
*/
-#if 1
// LBO - need to implement proper pen marking for sprites as well as set aside a non-transparent
// pen to be used for background fills when plane B is disabled.
if ((m_regs.s.r7 & r7_md) & MD_1PLANE)
@@ -961,34 +980,11 @@ uint32_t ygv608_device::update_screen(screen_device &screen, bitmap_ind16 &bitma
// m_work_bitmap.fill(1, *visarea);
}
else
-#endif
- m_tilemap_B->draw(screen, m_work_bitmap, finalclip, 0, 0 );
-
-#ifdef _ENABLE_ROTATE_ZOOM
-
- /*
- * fudge - translate ax,ay to startx, starty each time
- */
-
- xc = m_ax >> 16;
- yc = m_ay >> 16;
- r = sqrt( (double)( xc * xc + yc * yc ) );
- alpha = atan( (double)xc / (double)yc );
- sin_theta = (double)m_dyx / (double)0x10000;
- cos_theta = (double)m_dx / (double)0x10000;
-
- if( m_regs.s.zron )
- copyrozbitmap( bitmap, finalclip, &m_work_bitmap,
- ( visarea.min_x << 16 ) +
- m_ax + 0x10000 * r *
- ( -sin( alpha ) * cos_theta + cos( alpha ) * sin_theta ),
- ( visarea.min_y << 16 ) +
- m_ay + 0x10000 * r *
- ( cos( alpha ) * cos_theta + sin( alpha ) * sin_theta ),
- m_dx, m_dxy, m_dyx, m_dy, 0);
- else
-#endif
- copybitmap( bitmap, m_work_bitmap, 0, 0, 0, 0, finalclip);
+ {
+ draw_layer_roz(screen, m_work_bitmap, finalclip, m_tilemap_B);
+
+ copybitmap( bitmap, m_work_bitmap, 0, 0, 0, 0, finalclip);
+ }
// for some reason we can't use an opaque m_tilemap_A
// so use a transparent but clear the work bitmap first
@@ -999,19 +995,9 @@ uint32_t ygv608_device::update_screen(screen_device &screen, bitmap_ind16 &bitma
(m_regs.s.r11 & r11_prm) == PRM_ASEBDX )
draw_sprites(bitmap, finalclip);
- m_tilemap_A->draw(screen, m_work_bitmap, finalclip, 0, 0 );
-
-#ifdef _ENABLE_ROTATE_ZOOM
- if( m_regs.s.zron )
- copyrozbitmap_trans( bitmap, finalclip, &m_work_bitmap,
- m_ax, // + ( visarea.min_x << 16 ),
- m_ay, // + ( visarea.min_y << 16 ),
- m_dx, m_dxy, m_dyx, m_dy, 0,
- 0 );
- else
-#endif
- copybitmap_trans( bitmap, m_work_bitmap, 0, 0, 0, 0, finalclip, 0 );
-
+ draw_layer_roz(screen, m_work_bitmap, finalclip, m_tilemap_A);
+ copybitmap_trans( bitmap, m_work_bitmap, 0, 0, 0, 0, finalclip, 0);
+
if ((m_regs.s.r11 & r11_prm) == PRM_SABDEX ||
(m_regs.s.r11 & r11_prm) == PRM_SEABDX)
draw_sprites(bitmap,finalclip );
diff --git a/src/mame/video/ygv608.h b/src/mame/video/ygv608.h
index 314cdea4bf2..8d57682d491 100644
--- a/src/mame/video/ygv608.h
+++ b/src/mame/video/ygv608.h
@@ -312,7 +312,8 @@ private:
void postload();
void register_state_save();
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
-
+ void draw_layer_roz(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, tilemap_t *source_tilemap);
+
uint8_t m_namcond1_gfxbank;
tilemap_t *m_tilemap_A_cache_8[3];
diff --git a/src/osd/asio.h b/src/osd/asio.h
index 61260f3f142..64acfab9674 100644
--- a/src/osd/asio.h
+++ b/src/osd/asio.h
@@ -32,4 +32,4 @@
#define ASIO_ERROR_CATEGORY_NOEXCEPT noexcept(true)
#include "asio/include/asio.hpp"
-#undef interface \ No newline at end of file
+#undef interface
diff --git a/src/osd/modules/debugger/debugosx.mm b/src/osd/modules/debugger/debugosx.mm
index 56e85e21105..60599415e69 100644
--- a/src/osd/modules/debugger/debugosx.mm
+++ b/src/osd/modules/debugger/debugosx.mm
@@ -8,7 +8,7 @@
// TODO:
-// * Automatic scrolling for console and log views
+// * Automatic scrolling for console view
// * Keyboard shortcuts in error log and device windows
// * Don't accept keyboard input while the game is running
// * Interior focus rings - standard/exterior focus rings look really ugly here
diff --git a/src/osd/modules/debugger/osx/debugconsole.mm b/src/osd/modules/debugger/osx/debugconsole.mm
index e96d0757ba7..041e7fc314e 100644
--- a/src/osd/modules/debugger/osx/debugconsole.mm
+++ b/src/osd/modules/debugger/osx/debugconsole.mm
@@ -48,6 +48,7 @@
[regScroll setHasVerticalScroller:YES];
[regScroll setAutohidesScrollers:YES];
[regScroll setBorderType:NSBezelBorder];
+ [regScroll setDrawsBackground:NO];
[regScroll setDocumentView:regView];
[regView release];
@@ -59,6 +60,7 @@
[dasmScroll setHasVerticalScroller:YES];
[dasmScroll setAutohidesScrollers:YES];
[dasmScroll setBorderType:NSBezelBorder];
+ [dasmScroll setDrawsBackground:NO];
[dasmScroll setDocumentView:dasmView];
[dasmView release];
@@ -70,6 +72,7 @@
[consoleScroll setHasVerticalScroller:YES];
[consoleScroll setAutohidesScrollers:YES];
[consoleScroll setBorderType:NSBezelBorder];
+ [consoleScroll setDrawsBackground:NO];
[consoleScroll setDocumentView:consoleView];
[consoleView release];
diff --git a/src/osd/modules/debugger/osx/debugview.mm b/src/osd/modules/debugger/osx/debugview.mm
index ecc55349283..97854b22d70 100644
--- a/src/osd/modules/debugger/osx/debugview.mm
+++ b/src/osd/modules/debugger/osx/debugview.mm
@@ -184,7 +184,7 @@ static void debugwin_view_update(debug_view &view, void *osdprivate)
- (void)typeCharacterAndScrollToCursor:(char)ch {
debug_view_xy const oldPos = view->cursor_position();
view->process_char(ch);
- if (view->cursor_supported() && view->cursor_visible())
+ if (view->cursor_supported())
{
debug_view_xy const newPos = view->cursor_position();
if ((newPos.x != oldPos.x) || (newPos.y != oldPos.y))
diff --git a/src/osd/modules/debugger/osx/deviceinfoviewer.mm b/src/osd/modules/debugger/osx/deviceinfoviewer.mm
index dc2b2114005..8a275d9c573 100644
--- a/src/osd/modules/debugger/osx/deviceinfoviewer.mm
+++ b/src/osd/modules/debugger/osx/deviceinfoviewer.mm
@@ -218,6 +218,7 @@
[contentScroll setHasVerticalScroller:YES];
[contentScroll setAutohidesScrollers:YES];
[contentScroll setBorderType:NSNoBorder];
+ [contentScroll setDrawsBackground:NO];
[contentScroll setDocumentView:contentView];
[contentView release];
[[window contentView] addSubview:contentScroll];
diff --git a/src/osd/modules/debugger/osx/devicesviewer.mm b/src/osd/modules/debugger/osx/devicesviewer.mm
index 2bdb0253299..210f353d76d 100644
--- a/src/osd/modules/debugger/osx/devicesviewer.mm
+++ b/src/osd/modules/debugger/osx/devicesviewer.mm
@@ -145,6 +145,7 @@
[devicesScroll setHasVerticalScroller:YES];
[devicesScroll setAutohidesScrollers:YES];
[devicesScroll setBorderType:NSNoBorder];
+ [devicesScroll setDrawsBackground:NO];
[devicesScroll setDocumentView:devicesView];
[devicesView release];
[[window contentView] addSubview:devicesScroll];
diff --git a/src/osd/modules/debugger/osx/disassemblyviewer.mm b/src/osd/modules/debugger/osx/disassemblyviewer.mm
index d2c3decff11..88934ffbb8c 100644
--- a/src/osd/modules/debugger/osx/disassemblyviewer.mm
+++ b/src/osd/modules/debugger/osx/disassemblyviewer.mm
@@ -88,6 +88,7 @@
[dasmScroll setHasVerticalScroller:YES];
[dasmScroll setAutohidesScrollers:YES];
[dasmScroll setBorderType:NSNoBorder];
+ [dasmScroll setDrawsBackground:NO];
[dasmScroll setDocumentView:dasmView];
[dasmView release];
[[window contentView] addSubview:dasmScroll];
diff --git a/src/osd/modules/debugger/osx/errorlogviewer.mm b/src/osd/modules/debugger/osx/errorlogviewer.mm
index c40d9f89b69..5b78fdd7272 100644
--- a/src/osd/modules/debugger/osx/errorlogviewer.mm
+++ b/src/osd/modules/debugger/osx/errorlogviewer.mm
@@ -31,6 +31,7 @@
[logScroll setHasVerticalScroller:YES];
[logScroll setAutohidesScrollers:YES];
[logScroll setBorderType:NSNoBorder];
+ [logScroll setDrawsBackground:NO];
[logScroll setDocumentView:logView];
[logView release];
[window setContentView:logScroll];
diff --git a/src/osd/modules/debugger/osx/memoryviewer.mm b/src/osd/modules/debugger/osx/memoryviewer.mm
index b30a983ac30..8f0c87701c7 100644
--- a/src/osd/modules/debugger/osx/memoryviewer.mm
+++ b/src/osd/modules/debugger/osx/memoryviewer.mm
@@ -87,6 +87,7 @@
[memoryScroll setHasVerticalScroller:YES];
[memoryScroll setAutohidesScrollers:YES];
[memoryScroll setBorderType:NSNoBorder];
+ [memoryScroll setDrawsBackground:NO];
[memoryScroll setDocumentView:memoryView];
[memoryView release];
[[window contentView] addSubview:memoryScroll];
diff --git a/src/osd/modules/debugger/osx/pointsviewer.mm b/src/osd/modules/debugger/osx/pointsviewer.mm
index e10633076aa..7875e9c91b3 100644
--- a/src/osd/modules/debugger/osx/pointsviewer.mm
+++ b/src/osd/modules/debugger/osx/pointsviewer.mm
@@ -72,6 +72,7 @@
[breakScroll setHasVerticalScroller:YES];
[breakScroll setAutohidesScrollers:YES];
[breakScroll setBorderType:NSNoBorder];
+ [breakScroll setDrawsBackground:NO];
[breakScroll setDocumentView:breakView];
[breakView release];
breakTab = [[NSTabViewItem alloc] initWithIdentifier:@""];
@@ -87,6 +88,7 @@
[watchScroll setHasVerticalScroller:YES];
[watchScroll setAutohidesScrollers:YES];
[watchScroll setBorderType:NSNoBorder];
+ [watchScroll setDrawsBackground:NO];
[watchScroll setDocumentView:watchView];
[watchView release];
watchTab = [[NSTabViewItem alloc] initWithIdentifier:@""];
diff --git a/src/osd/modules/lib/osdobj_common.cpp b/src/osd/modules/lib/osdobj_common.cpp
index dcca53b4361..5bacf0c341d 100644
--- a/src/osd/modules/lib/osdobj_common.cpp
+++ b/src/osd/modules/lib/osdobj_common.cpp
@@ -131,7 +131,7 @@ const options_entry osd_options::s_option_entries[] =
{ nullptr, nullptr, OPTION_HEADER, "PORTAUDIO OPTIONS" },
{ OSDOPTION_PA_API, OSDOPTVAL_NONE, OPTION_STRING, "PortAudio API" },
{ OSDOPTION_PA_DEVICE, OSDOPTVAL_NONE, OPTION_STRING, "PortAudio device" },
- { OSDOPTION_PA_LATENCY "(0.001-0.25)", "0", OPTION_FLOAT, "suggested latency in seconds, 0 for default" },
+ { OSDOPTION_PA_LATENCY "(0-0.25)", "0", OPTION_FLOAT, "suggested latency in seconds, 0 for default" },
#endif
#ifdef SDLMAME_MACOSX
diff --git a/src/osd/modules/render/bgfx/shaders/shader.mk b/src/osd/modules/render/bgfx/shaders/shader.mk
index 8f73be5445c..f9cdeb91f95 100644
--- a/src/osd/modules/render/bgfx/shaders/shader.mk
+++ b/src/osd/modules/render/bgfx/shaders/shader.mk
@@ -1,5 +1,5 @@
#
-# Copyright 2011-2016 Branimir Karadzic. All rights reserved.
+# Copyright 2011-2017 Branimir Karadzic. All rights reserved.
# License: http://www.opensource.org/licenses/BSD-2-Clause
#
diff --git a/src/osd/modules/sound/pa_sound.cpp b/src/osd/modules/sound/pa_sound.cpp
index fb92689504f..dfba0cfa132 100644
--- a/src/osd/modules/sound/pa_sound.cpp
+++ b/src/osd/modules/sound/pa_sound.cpp
@@ -2,9 +2,9 @@
// copyright-holders:intealls, R.Belmont
/***************************************************************************
- pa_sound.c
+ pa_sound.c
- PortAudio interface.
+ PortAudio interface.
*******************************************************************c********/
@@ -13,7 +13,7 @@
#ifndef NO_USE_PORTAUDIO
-#include "portaudio/include/portaudio.h"
+#include <portaudio.h>
#include "modules/lib/osdobj_common.h"
#include <iostream>
@@ -49,78 +49,75 @@ public:
virtual void set_mastervolume(int attenuation);
private:
- /* Lock free SPSC ring buffer */
+ // Lock free SPSC ring buffer
template <typename T>
struct audio_buffer {
T* buf;
int size;
int reserve;
- std::atomic<int> rd_pos, wr_pos;
+ std::atomic<int> playpos, writepos;
- audio_buffer(int size, int reserve) : size(size), reserve(reserve) {
- rd_pos = wr_pos = 0;
- buf = new T[size]();
+ audio_buffer(int size, int reserve) : size(size + reserve), reserve(reserve) {
+ playpos = writepos = 0;
+ buf = new T[this->size];
}
~audio_buffer() { delete[] buf; }
int count() {
- int diff;
- diff = wr_pos - rd_pos;
- diff = diff < 0 ? size + diff : diff;
- diff -= reserve;
- return diff < 0 ? 0 : diff;
+ int diff = writepos - playpos;
+ return diff < 0 ? size + diff : diff;
}
- void increment_wrpos(int n) {
- wr_pos = (wr_pos + n) % size;
+ void increment_writepos(int n) {
+ writepos.store((writepos + n) % size);
}
int write(const T* src, int n, int attenuation) {
- n = std::min<int>(n, size - count());
+ n = std::min<int>(n, size - reserve - count());
- if (wr_pos + n > size) {
- att_memcpy(buf + wr_pos, src, sizeof(T) * (size - wr_pos), attenuation);
- att_memcpy(buf, src + (size - wr_pos), sizeof(T) * (n - (size - wr_pos)), attenuation);
+ if (writepos + n > size) {
+ att_memcpy(buf + writepos, src, sizeof(T) * (size - writepos), attenuation);
+ att_memcpy(buf, src + (size - writepos), sizeof(T) * (n - (size - writepos)), attenuation);
} else {
- att_memcpy(buf + wr_pos, src, sizeof(T) * n, attenuation);
+ att_memcpy(buf + writepos, src, sizeof(T) * n, attenuation);
}
- increment_wrpos(n);
+ increment_writepos(n);
return n;
}
- void increment_rdpos(int n) {
- rd_pos = (rd_pos + n) % size;
+ void increment_playpos(int n) {
+ playpos.store((playpos + n) % size);
}
int read(T* dst, int n) {
n = std::min<int>(n, count());
- if (rd_pos + n > size) {
- std::memcpy(dst, buf + rd_pos, sizeof(T) * (size - rd_pos));
- std::memcpy(dst + (size - rd_pos), buf, sizeof(T) * (n - (size - rd_pos)));
+ if (playpos + n > size) {
+ std::memcpy(dst, buf + playpos, sizeof(T) * (size - playpos));
+ std::memcpy(dst + (size - playpos), buf, sizeof(T) * (n - (size - playpos)));
} else {
- std::memcpy(dst, buf + rd_pos, sizeof(T) * n);
+ std::memcpy(dst, buf + playpos, sizeof(T) * n);
}
- increment_rdpos(n);
+ increment_playpos(n);
return n;
}
int clear(int n) {
- n = std::min<int>(n, size - count());
+ n = std::min<int>(n, size - reserve - count());
- if (wr_pos + n > size) {
- std::memset(buf + wr_pos, 0, sizeof(T) * (size - wr_pos));
- std::memset(buf, 0, sizeof(T) * (n - (size - wr_pos)));
+ if (writepos + n > size) {
+ std::memset(buf + writepos, 0, sizeof(T) * (size - writepos));
+ std::memset(buf, 0, sizeof(T) * (n - (size - writepos)));
} else {
- std::memset(buf + wr_pos, 0, sizeof(T) * n);
+ std::memset(buf + writepos, 0, sizeof(T) * n);
}
- increment_wrpos(n);
+ increment_writepos(n);
return n;
}
@@ -133,6 +130,12 @@ private:
}
};
+ enum
+ {
+ LATENCY_MIN = 1,
+ LATENCY_MAX = 5,
+ };
+
int callback(s16* output_buffer, size_t number_of_frames);
static int _callback(const void*,
void *output_buffer,
@@ -185,7 +188,11 @@ int sound_pa::init(osd_options const &options)
m_overflows = 0;
m_has_overflowed = false;
m_has_underflowed = false;
+ m_osd_ticks = 0;
m_skip_threshold_ticks = 0;
+ m_osd_tps = osd_ticks_per_second();
+ m_buffer_min_ct = INT_MAX;
+ m_audio_latency = std::min<int>(std::max<int>(m_audio_latency, LATENCY_MIN), LATENCY_MAX);
try {
m_ab = new audio_buffer<s16>(m_sample_rate, 2);
@@ -194,8 +201,6 @@ int sound_pa::init(osd_options const &options)
goto error;
}
- m_osd_tps = osd_ticks_per_second();
-
err = Pa_Initialize();
if (err != paNoError) goto pa_error;
@@ -342,7 +347,7 @@ int sound_pa::callback(s16* output_buffer, size_t number_of_samples)
// if adjustment is less than two milliseconds, don't bother
if (adjust / 2 > sample_rate() / 500) {
- m_ab->increment_rdpos(adjust);
+ m_ab->increment_playpos(adjust);
m_has_overflowed = true;
}
@@ -355,9 +360,8 @@ int sound_pa::callback(s16* output_buffer, size_t number_of_samples)
m_ab->read(output_buffer, buf_ct);
std::memset(output_buffer + buf_ct, 0, (number_of_samples - buf_ct) * sizeof(s16));
- // rd_pos == wr_pos only happens when buffer hasn't received any samples,
- // i.e. before update_audio_stream has been called
- if (m_ab->rd_pos != m_ab->wr_pos)
+ // if update_audio_stream has been called, note the underflow
+ if (m_osd_ticks)
m_has_underflowed = true;
m_skip_threshold_ticks = m_osd_ticks;
@@ -371,9 +375,6 @@ void sound_pa::update_audio_stream(bool is_throttled, const s16 *buffer, int sam
if (!sample_rate())
return;
- // for determining buffer overflows, take the sample here instead of in the callback
- m_osd_ticks = osd_ticks();
-
#if LOG_BUFCNT
if (m_log.good())
m_log << m_ab->count() << std::endl;
@@ -394,6 +395,9 @@ void sound_pa::update_audio_stream(bool is_throttled, const s16 *buffer, int sam
}
m_ab->write(buffer, samples_this_frame * 2, m_attenuation);
+
+ // for determining buffer overflows, take the sample here instead of in the callback
+ m_osd_ticks = osd_ticks();
}
void sound_pa::set_mastervolume(int attenuation)
@@ -418,12 +422,15 @@ void sound_pa::exit()
osd_printf_error("PortAudio: Error writing log.\n");
#endif
- Pa_StopStream(m_pa_stream);
- err = Pa_Terminate();
+ err = Pa_StopStream(m_pa_stream); if (err != paNoError) goto error;
+ err = Pa_CloseStream(m_pa_stream); if (err != paNoError) goto error;
+ error:
if (err != paNoError)
osd_printf_error("PortAudio error: %s\n", Pa_GetErrorText(err));
+ Pa_Terminate();
+
delete m_ab;
if (m_overflows || m_underflows)
diff --git a/src/tools/imgtool/charconv.cpp b/src/tools/imgtool/charconv.cpp
index 387d646f006..0dadc8acb88 100644
--- a/src/tools/imgtool/charconv.cpp
+++ b/src/tools/imgtool/charconv.cpp
@@ -78,7 +78,7 @@ void imgtool::simple_charconverter::from_utf8(std::ostream &dest, const char *sr
{
ch = 0xFFFD;
rc = 1;
- }
+ }
iter += rc;
// do the reverse lookup
diff --git a/src/tools/imgtool/imgtool.cpp b/src/tools/imgtool/imgtool.cpp
index 10d35ac34a0..a0986d6a62d 100644
--- a/src/tools/imgtool/imgtool.cpp
+++ b/src/tools/imgtool/imgtool.cpp
@@ -92,8 +92,8 @@ static std::string extract_padded_string(const char *source, size_t len)
//-------------------------------------------------
// extract_padded_filename - this is a common
-// enough scenario that it is justified to have
-// this in common code
+// enough scenario that it is justified to have
+// this in common code
//-------------------------------------------------
std::string extract_padded_filename(const char *source, size_t filename_length, size_t extension_length)
diff --git a/src/tools/imgtool/main.cpp b/src/tools/imgtool/main.cpp
index 895f96145b1..c6f3056e7f0 100644
--- a/src/tools/imgtool/main.cpp
+++ b/src/tools/imgtool/main.cpp
@@ -35,7 +35,7 @@ static void writeusage(std::wostream &output, bool write_word_usage, const struc
L"%s %s %s %s\n",
(write_word_usage ? L"Usage:" : L" "),
wstring_from_utf8(cmdname),
- c->name,
+ wstring_from_utf8(c->name),
c->usage ? wstring_from_utf8(c->usage) : std::wstring());
}
diff --git a/src/tools/imgtool/modules/mac.cpp b/src/tools/imgtool/modules/mac.cpp
index b379286438d..f94246c5e7f 100644
--- a/src/tools/imgtool/modules/mac.cpp
+++ b/src/tools/imgtool/modules/mac.cpp
@@ -6405,7 +6405,7 @@ static void generic_mac_get_info(const imgtool_class *imgclass, uint32_t state,
case IMGTOOLINFO_PTR_GET_ICON_INFO: info->get_iconinfo = mac_image_geticoninfo; break;
case IMGTOOLINFO_PTR_SUGGEST_TRANSFER: info->suggest_transfer = mac_image_suggesttransfer; break;
case IMGTOOLINFO_PTR_FLOPPY_FORMAT: info->p = (void *) floppyoptions_apple35_mac; break;
- case IMGTOOLINFO_PTR_CHARCONVERTER: info->charconverter = &charconverter_macos_roman; break;
+ case IMGTOOLINFO_PTR_CHARCONVERTER: info->charconverter = &charconverter_macos_roman; break;
}
}
diff --git a/src/tools/imgtool/modules/rsdos.cpp b/src/tools/imgtool/modules/rsdos.cpp
index 9ee8de3cf8c..4bcde9444ab 100644
--- a/src/tools/imgtool/modules/rsdos.cpp
+++ b/src/tools/imgtool/modules/rsdos.cpp
@@ -247,7 +247,7 @@ static imgtoolerr_t process_rsdos_file(struct rsdos_dirent *ent, imgtool::image
//-------------------------------------------------
// prepare_dirent - create a new directory entry
-// with a specified name
+// with a specified name
//-------------------------------------------------
static imgtoolerr_t prepare_dirent(rsdos_dirent &ent, const char *fname)
diff --git a/src/tools/unidasm.cpp b/src/tools/unidasm.cpp
index 2c6e58a0f74..e360f503790 100644
--- a/src/tools/unidasm.cpp
+++ b/src/tools/unidasm.cpp
@@ -79,10 +79,12 @@ CPU_DISASSEMBLE( avr8 );
CPU_DISASSEMBLE( ccpu );
CPU_DISASSEMBLE( cdp1801 );
CPU_DISASSEMBLE( cdp1802 );
+CPU_DISASSEMBLE( clipper );
CPU_DISASSEMBLE( coldfire );
CPU_DISASSEMBLE( cop410 );
CPU_DISASSEMBLE( cop420 );
CPU_DISASSEMBLE( cop444 );
+CPU_DISASSEMBLE( cop424 );
CPU_DISASSEMBLE( cp1610 );
CPU_DISASSEMBLE( cquestlin );
CPU_DISASSEMBLE( cquestrot );
@@ -137,6 +139,8 @@ CPU_DISASSEMBLE( m6803 );
CPU_DISASSEMBLE( m68030 );
CPU_DISASSEMBLE( m68040 );
CPU_DISASSEMBLE( m6805 );
+CPU_DISASSEMBLE( m146805 );
+CPU_DISASSEMBLE( m68hc05 );
CPU_DISASSEMBLE( m6808 );
CPU_DISASSEMBLE( m6809 );
CPU_DISASSEMBLE( m68340 );
@@ -247,10 +251,12 @@ static const dasm_table_entry dasm_table[] =
{ "ccpu", _8bit, 0, CPU_DISASSEMBLE_NAME(ccpu) },
{ "cdp1801", _8bit, 0, CPU_DISASSEMBLE_NAME(cdp1801) },
{ "cdp1802", _8bit, 0, CPU_DISASSEMBLE_NAME(cdp1802) },
+ { "clipper", _16le, 0, CPU_DISASSEMBLE_NAME(clipper) },
{ "coldfire", _16be, 0, CPU_DISASSEMBLE_NAME(coldfire) },
{ "cop410", _8bit, 0, CPU_DISASSEMBLE_NAME(cop410) },
{ "cop420", _8bit, 0, CPU_DISASSEMBLE_NAME(cop420) },
{ "cop444", _8bit, 0, CPU_DISASSEMBLE_NAME(cop444) },
+ { "cop424", _8bit, 0, CPU_DISASSEMBLE_NAME(cop424) },
{ "cp1610", _16be, -1, CPU_DISASSEMBLE_NAME(cp1610) },
{ "cquestlin", _64be, -3, CPU_DISASSEMBLE_NAME(cquestlin) },
{ "cquestrot", _64be, -3, CPU_DISASSEMBLE_NAME(cquestrot) },
@@ -307,6 +313,8 @@ static const dasm_table_entry dasm_table[] =
{ "m68030", _16be, 0, CPU_DISASSEMBLE_NAME(m68030) },
{ "m68040", _16be, 0, CPU_DISASSEMBLE_NAME(m68040) },
{ "m6805", _8bit, 0, CPU_DISASSEMBLE_NAME(m6805) },
+ { "m146805", _8bit, 0, CPU_DISASSEMBLE_NAME(m146805) },
+ { "m68hc05", _8bit, 0, CPU_DISASSEMBLE_NAME(m68hc05) },
{ "m6808", _8bit, 0, CPU_DISASSEMBLE_NAME(m6808) },
{ "m6809", _8bit, 0, CPU_DISASSEMBLE_NAME(m6809) },
{ "m68340", _16be, 0, CPU_DISASSEMBLE_NAME(m68340) },
diff --git a/tests/LICENSE b/tests/LICENSE
index 4d9210d10e1..7129c522789 100644
--- a/tests/LICENSE
+++ b/tests/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2016, MAME Development Team
+Copyright (c) 2017, MAME Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/uismall.bdf b/uismall.bdf
index 526d60ae398..a6b7d5b622f 100644
--- a/uismall.bdf
+++ b/uismall.bdf
@@ -1,5 +1,5 @@
STARTFONT 2.1
-COMMENT Copyright (C) 1997-2016 MAMEDev and contributors
+COMMENT Copyright (C) 1997-2017 MAMEDev and contributors
FONT -mamedev-uismall-Medium-R-Normal--16-120-96-96-P-100-ISO10646-1
SIZE 12 96 96
FONTBOUNDINGBOX 8 11 0 -2
diff --git a/web/LICENSE b/web/LICENSE
index 4d9210d10e1..7129c522789 100644
--- a/web/LICENSE
+++ b/web/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2016, MAME Development Team
+Copyright (c) 2017, MAME Development Team
All rights reserved.
Redistribution and use in source and binary forms, with or without