zemu 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/zemu/config.rb +312 -0
- data/lib/zemu/instance.rb +179 -0
- data/lib/zemu.rb +172 -0
- data/src/debug.c +118 -0
- data/src/debug.h +30 -0
- data/src/external/Z/API/Z/ABIs/generic/allocator.h +36 -0
- data/src/external/Z/API/Z/ABIs/generic/cipher.h +47 -0
- data/src/external/Z/API/Z/ABIs/generic/data codec.h +33 -0
- data/src/external/Z/API/Z/ABIs/generic/emulation.h +103 -0
- data/src/external/Z/API/Z/ABIs/generic/hash function.h +33 -0
- data/src/external/Z/API/Z/ABIs/generic/module.h +33 -0
- data/src/external/Z/API/Z/ABIs/generic/wave codec.h +40 -0
- data/src/external/Z/API/Z/classes/base/InitializerList.hpp +34 -0
- data/src/external/Z/API/Z/classes/base/OpaqueFunctionPointer.hpp +26 -0
- data/src/external/Z/API/Z/classes/base/OpaqueMemberFunctionPointer.hpp +26 -0
- data/src/external/Z/API/Z/classes/base/Pair.hpp +46 -0
- data/src/external/Z/API/Z/classes/base/Range.hpp +111 -0
- data/src/external/Z/API/Z/classes/base/SizedString.hpp +66 -0
- data/src/external/Z/API/Z/classes/base/Status.hpp +89 -0
- data/src/external/Z/API/Z/classes/base/Symbol.hpp +39 -0
- data/src/external/Z/API/Z/classes/base/Tuple.hpp +111 -0
- data/src/external/Z/API/Z/classes/base/Value2D.hpp +389 -0
- data/src/external/Z/API/Z/classes/base/Value3D.hpp +368 -0
- data/src/external/Z/API/Z/classes/buffering/RingBuffer.hpp +93 -0
- data/src/external/Z/API/Z/classes/buffering/TripleBuffer.hpp +68 -0
- data/src/external/Z/API/Z/classes/functional/Functor.hpp +265 -0
- data/src/external/Z/API/Z/classes/functional/MemberFunction.hpp +98 -0
- data/src/external/Z/API/Z/classes/functional/ObjectMemberFunction.hpp +172 -0
- data/src/external/Z/API/Z/classes/functional/ObjectSelector.hpp +219 -0
- data/src/external/Z/API/Z/classes/functional/Selector.hpp +146 -0
- data/src/external/Z/API/Z/classes/mathematics/geometry/euclidean/AABB.hpp +81 -0
- data/src/external/Z/API/Z/classes/mathematics/geometry/euclidean/AABR.hpp +685 -0
- data/src/external/Z/API/Z/classes/mathematics/geometry/euclidean/Box.hpp +219 -0
- data/src/external/Z/API/Z/classes/mathematics/geometry/euclidean/Circle.hpp +80 -0
- data/src/external/Z/API/Z/classes/mathematics/geometry/euclidean/Line2D.hpp +93 -0
- data/src/external/Z/API/Z/classes/mathematics/geometry/euclidean/Line3D.hpp +80 -0
- data/src/external/Z/API/Z/classes/mathematics/geometry/euclidean/Rectangle.hpp +675 -0
- data/src/external/Z/API/Z/classes/mathematics/geometry/euclidean/Sphere.hpp +0 -0
- data/src/external/Z/API/Z/classes/memory/Shared.hpp +90 -0
- data/src/external/Z/API/Z/constants/base.h +35 -0
- data/src/external/Z/API/Z/constants/chemical elements.h +6385 -0
- data/src/external/Z/API/Z/constants/numbers.h +963 -0
- data/src/external/Z/API/Z/constants/version.h +15 -0
- data/src/external/Z/API/Z/formats/character set/ASCII.h +158 -0
- data/src/external/Z/API/Z/formats/character set/DOS CP437.h +159 -0
- data/src/external/Z/API/Z/formats/character set/DOS CP737.h +159 -0
- data/src/external/Z/API/Z/formats/character set/DOS CP775.h +159 -0
- data/src/external/Z/API/Z/formats/character set/DOS CP850.h +159 -0
- data/src/external/Z/API/Z/formats/character set/DOS CP852.h +159 -0
- data/src/external/Z/API/Z/formats/character set/DOS CP855.h +159 -0
- data/src/external/Z/API/Z/formats/character set/DOS CP857.h +159 -0
- data/src/external/Z/API/Z/formats/character set/DOS CP858.h +159 -0
- data/src/external/Z/API/Z/formats/character set/DOS CP860.h +159 -0
- data/src/external/Z/API/Z/formats/character set/DOS CP861.h +159 -0
- data/src/external/Z/API/Z/formats/character set/DOS CP862.h +159 -0
- data/src/external/Z/API/Z/formats/character set/DOS CP863.h +159 -0
- data/src/external/Z/API/Z/formats/character set/DOS CP864.h +159 -0
- data/src/external/Z/API/Z/formats/character set/DOS CP865.h +159 -0
- data/src/external/Z/API/Z/formats/character set/DOS CP866.h +159 -0
- data/src/external/Z/API/Z/formats/character set/DOS CP869.h +159 -0
- data/src/external/Z/API/Z/formats/character set/DOS CP872.h +159 -0
- data/src/external/Z/API/Z/formats/character set/DOS CP874.h +159 -0
- data/src/external/Z/API/Z/formats/character set/Unicode.h +30119 -0
- data/src/external/Z/API/Z/formats/data model/I16LP32.h +19 -0
- data/src/external/Z/API/Z/formats/data model/ILP32.h +19 -0
- data/src/external/Z/API/Z/formats/data model/ILP64.h +19 -0
- data/src/external/Z/API/Z/formats/data model/IP16L32.h +19 -0
- data/src/external/Z/API/Z/formats/data model/LLP64.h +19 -0
- data/src/external/Z/API/Z/formats/data model/LP32.h +19 -0
- data/src/external/Z/API/Z/formats/data model/LP64.h +19 -0
- data/src/external/Z/API/Z/formats/data model/SILP64.h +19 -0
- data/src/external/Z/API/Z/formats/file system/FAT12.h +61 -0
- data/src/external/Z/API/Z/formats/floating-point/IEEE 754.h +141 -0
- data/src/external/Z/API/Z/formats/floating-point/x87.h +74 -0
- data/src/external/Z/API/Z/formats/image/ICNS.h +39 -0
- data/src/external/Z/API/Z/formats/keymap/Mac OS.h +284 -0
- data/src/external/Z/API/Z/formats/keymap/Z.h +141 -0
- data/src/external/Z/API/Z/formats/multimedia/Creative Voice.h +106 -0
- data/src/external/Z/API/Z/formats/multimedia/Microsoft Wave.h +49 -0
- data/src/external/Z/API/Z/formats/snapshot/machine/computer/ZX Spectrum/ACH.h +44 -0
- data/src/external/Z/API/Z/formats/snapshot/machine/computer/ZX Spectrum/FRZ.h +54 -0
- data/src/external/Z/API/Z/formats/snapshot/machine/computer/ZX Spectrum/PRG.h +33 -0
- data/src/external/Z/API/Z/formats/snapshot/machine/computer/ZX Spectrum/SEM.h +46 -0
- data/src/external/Z/API/Z/formats/snapshot/machine/computer/ZX Spectrum/SIT.h +34 -0
- data/src/external/Z/API/Z/formats/snapshot/machine/computer/ZX Spectrum/SNA.h +117 -0
- data/src/external/Z/API/Z/formats/snapshot/machine/computer/ZX Spectrum/SNP.h +37 -0
- data/src/external/Z/API/Z/formats/snapshot/machine/computer/ZX Spectrum/SP.h +62 -0
- data/src/external/Z/API/Z/formats/snapshot/machine/computer/ZX Spectrum/Z80.h +117 -0
- data/src/external/Z/API/Z/formats/snapshot/machine/computer/ZX Spectrum/ZX.h +56 -0
- data/src/external/Z/API/Z/formats/snapshot/machine/computer/ZX Spectrum/ZX82.h +70 -0
- data/src/external/Z/API/Z/formats/storage medium image/NES Game Pak/UNIF.h +26 -0
- data/src/external/Z/API/Z/formats/storage medium image/NES Game Pak/iNES.h +76 -0
- data/src/external/Z/API/Z/formats/storage medium image/audio/TAP.h +25 -0
- data/src/external/Z/API/Z/formats/storage medium image/audio/TZX.h +1185 -0
- data/src/external/Z/API/Z/formats/storage medium image/audio/Warajevo TAP.h +32 -0
- data/src/external/Z/API/Z/formats/storage medium image/floppy disk/FDI.h +45 -0
- data/src/external/Z/API/Z/functions/base/Z2D.h +583 -0
- data/src/external/Z/API/Z/functions/base/Z3D.h +712 -0
- data/src/external/Z/API/Z/functions/base/ZRange.h +137 -0
- data/src/external/Z/API/Z/functions/base/all.h +16 -0
- data/src/external/Z/API/Z/functions/base/casting.hpp +37 -0
- data/src/external/Z/API/Z/functions/base/character.h +38 -0
- data/src/external/Z/API/Z/functions/base/constructors.h +326 -0
- data/src/external/Z/API/Z/functions/base/structure.hpp +26 -0
- data/src/external/Z/API/Z/functions/base/type.hpp +60 -0
- data/src/external/Z/API/Z/functions/base/value.h +1901 -0
- data/src/external/Z/API/Z/functions/base/value.hpp +112 -0
- data/src/external/Z/API/Z/functions/buffering/ZRingBuffer.h +85 -0
- data/src/external/Z/API/Z/functions/buffering/ZTripleBuffer.h +65 -0
- data/src/external/Z/API/Z/functions/mathematics/geometry/euclidean/Z2DLine.h +179 -0
- data/src/external/Z/API/Z/functions/mathematics/geometry/euclidean/Z3DLine.h +168 -0
- data/src/external/Z/API/Z/functions/mathematics/geometry/euclidean/ZAABB.h +361 -0
- data/src/external/Z/API/Z/functions/mathematics/geometry/euclidean/ZAABR.h +1081 -0
- data/src/external/Z/API/Z/functions/mathematics/geometry/euclidean/ZBox.h +340 -0
- data/src/external/Z/API/Z/functions/mathematics/geometry/euclidean/ZCircle.h +142 -0
- data/src/external/Z/API/Z/functions/mathematics/geometry/euclidean/ZRectangle.h +1267 -0
- data/src/external/Z/API/Z/functions/mathematics/geometry/euclidean/ZSphere.h +156 -0
- data/src/external/Z/API/Z/functions/mathematics/geometry/euclidean/all.h +18 -0
- data/src/external/Z/API/Z/functions/mathematics/geometry/euclidean/constructors.h +620 -0
- data/src/external/Z/API/Z/functions/time/date.h +29 -0
- data/src/external/Z/API/Z/hardware/CPU/architecture/6502.h +90 -0
- data/src/external/Z/API/Z/hardware/CPU/architecture/Z80.h +245 -0
- data/src/external/Z/API/Z/hardware/CPU/architecture/i4004.h +37 -0
- data/src/external/Z/API/Z/hardware/PSG/General Instrument/AY-3-891x.h +180 -0
- data/src/external/Z/API/Z/hardware/VDC/Ricoh/RP2C0x.h +625 -0
- data/src/external/Z/API/Z/hardware/bus/AGP.h +24 -0
- data/src/external/Z/API/Z/hardware/bus/USB.h +510 -0
- data/src/external/Z/API/Z/hardware/machine/model/computer/ZX Spectrum/Inves Spectrum +.h +47 -0
- data/src/external/Z/API/Z/hardware/machine/model/computer/ZX Spectrum/Pentagon.h +13 -0
- data/src/external/Z/API/Z/hardware/machine/model/computer/ZX Spectrum/Scorpion.h +13 -0
- data/src/external/Z/API/Z/hardware/machine/model/computer/ZX Spectrum/ZX Spectrum + 128K.h +158 -0
- data/src/external/Z/API/Z/hardware/machine/model/computer/ZX Spectrum/ZX Spectrum +.h +82 -0
- data/src/external/Z/API/Z/hardware/machine/model/computer/ZX Spectrum/ZX Spectrum +2.h +13 -0
- data/src/external/Z/API/Z/hardware/machine/model/computer/ZX Spectrum/ZX Spectrum +2A.h +13 -0
- data/src/external/Z/API/Z/hardware/machine/model/computer/ZX Spectrum/ZX Spectrum +3.h +13 -0
- data/src/external/Z/API/Z/hardware/machine/model/computer/ZX Spectrum/ZX Spectrum.h +109 -0
- data/src/external/Z/API/Z/hardware/machine/model/console/Nintendo Entertainment System/NES-001 (NTSC).h +29 -0
- data/src/external/Z/API/Z/hardware/machine/model/console/Nintendo Entertainment System/NES-001 (PAL).h +29 -0
- data/src/external/Z/API/Z/hardware/machine/platform/computer/ZX Spectrum.h +405 -0
- data/src/external/Z/API/Z/hardware/machine/platform/console/Game Boy.h +49 -0
- data/src/external/Z/API/Z/hardware/machine/platform/console/Nintendo Entertainment System.h +350 -0
- data/src/external/Z/API/Z/hardware/storage medium/ROM cartridge/SNES Game Pak.h +238 -0
- data/src/external/Z/API/Z/inspection/C/completion.h +178 -0
- data/src/external/Z/API/Z/inspection/C/modules/C11.h +41 -0
- data/src/external/Z/API/Z/inspection/C/modules/C18.h +13 -0
- data/src/external/Z/API/Z/inspection/C/modules/C89.h +19 -0
- data/src/external/Z/API/Z/inspection/C/modules/C90.h +13 -0
- data/src/external/Z/API/Z/inspection/C/modules/C94.h +15 -0
- data/src/external/Z/API/Z/inspection/C/modules/C99.h +29 -0
- data/src/external/Z/API/Z/inspection/C/modules/KR C.h +19 -0
- data/src/external/Z/API/Z/inspection/C++/completion.h +512 -0
- data/src/external/Z/API/Z/inspection/C++/modules/C++03.h +15 -0
- data/src/external/Z/API/Z/inspection/C++/modules/C++11.h +80 -0
- data/src/external/Z/API/Z/inspection/C++/modules/C++14.h +26 -0
- data/src/external/Z/API/Z/inspection/C++/modules/C++17.h +55 -0
- data/src/external/Z/API/Z/inspection/C++/modules/C++85.h +11 -0
- data/src/external/Z/API/Z/inspection/C++/modules/C++89.h +13 -0
- data/src/external/Z/API/Z/inspection/C++/modules/C++98.h +17 -0
- data/src/external/Z/API/Z/inspection/C++.h +78 -0
- data/src/external/Z/API/Z/inspection/C.h +79 -0
- data/src/external/Z/API/Z/inspection/CPU/completion.h +56 -0
- data/src/external/Z/API/Z/inspection/CPU/detection.h +714 -0
- data/src/external/Z/API/Z/inspection/CPU/modules/6502.h +25 -0
- data/src/external/Z/API/Z/inspection/CPU/modules/AArch32.h +32 -0
- data/src/external/Z/API/Z/inspection/CPU/modules/AArch64.h +32 -0
- data/src/external/Z/API/Z/inspection/CPU/modules/Z80.h +26 -0
- data/src/external/Z/API/Z/inspection/CPU/modules/x86-32.h +31 -0
- data/src/external/Z/API/Z/inspection/CPU/modules/x86-64.h +312 -0
- data/src/external/Z/API/Z/inspection/CPU.h +209 -0
- data/src/external/Z/API/Z/inspection/OS/completion.h +36 -0
- data/src/external/Z/API/Z/inspection/OS/detection.h +768 -0
- data/src/external/Z/API/Z/inspection/OS/modules/Linux.h +22 -0
- data/src/external/Z/API/Z/inspection/OS/modules/MS-DOS.h +16 -0
- data/src/external/Z/API/Z/inspection/OS/modules/Mac OS X.h +23 -0
- data/src/external/Z/API/Z/inspection/OS/modules/Windows.h +19 -0
- data/src/external/Z/API/Z/inspection/OS/modules/iPhone OS.h +23 -0
- data/src/external/Z/API/Z/inspection/OS.h +236 -0
- data/src/external/Z/API/Z/inspection/Objective-C/completion.h +8 -0
- data/src/external/Z/API/Z/inspection/Objective-C/modules/Objective-C v1.0.h +11 -0
- data/src/external/Z/API/Z/inspection/Objective-C/modules/Objective-C v2.0.h +15 -0
- data/src/external/Z/API/Z/inspection/Objective-C.h +51 -0
- data/src/external/Z/API/Z/inspection/Z.h +19 -0
- data/src/external/Z/API/Z/inspection/build.h +22 -0
- data/src/external/Z/API/Z/inspection/character set.h +66 -0
- data/src/external/Z/API/Z/inspection/compiler/completion.h +2885 -0
- data/src/external/Z/API/Z/inspection/compiler/modules/Apple LLVM.h +26 -0
- data/src/external/Z/API/Z/inspection/compiler/modules/Clang.h +1664 -0
- data/src/external/Z/API/Z/inspection/compiler/modules/GCC.h +1366 -0
- data/src/external/Z/API/Z/inspection/compiler/modules/SCCZ80.h +473 -0
- data/src/external/Z/API/Z/inspection/compiler/modules/Visual C++.h +606 -0
- data/src/external/Z/API/Z/inspection/compiler/modules/cc65.h +529 -0
- data/src/external/Z/API/Z/inspection/compiler/modules/generic.h +13 -0
- data/src/external/Z/API/Z/inspection/compiler/modules/template.h +650 -0
- data/src/external/Z/API/Z/inspection/compiler.h +299 -0
- data/src/external/Z/API/Z/inspection/data model/completion.h +128 -0
- data/src/external/Z/API/Z/inspection/data model/deduction.h +9 -0
- data/src/external/Z/API/Z/inspection/data model/detection.h +45 -0
- data/src/external/Z/API/Z/inspection/data model.h +362 -0
- data/src/external/Z/API/Z/inspection/floating-point/completion.h +50 -0
- data/src/external/Z/API/Z/inspection/floating-point.h +324 -0
- data/src/external/Z/API/Z/inspection/language.h +163 -0
- data/src/external/Z/API/Z/inspection/platform/detection.h +9 -0
- data/src/external/Z/API/Z/inspection/platform.h +29 -0
- data/src/external/Z/API/Z/keys/C++.h +27 -0
- data/src/external/Z/API/Z/keys/C.h +29 -0
- data/src/external/Z/API/Z/keys/CPU.h +80 -0
- data/src/external/Z/API/Z/keys/OS.h +182 -0
- data/src/external/Z/API/Z/keys/Objective-C.h +17 -0
- data/src/external/Z/API/Z/keys/chemistry.h +26 -0
- data/src/external/Z/API/Z/keys/compiler.h +178 -0
- data/src/external/Z/API/Z/keys/data model.h +32 -0
- data/src/external/Z/API/Z/keys/endianness.h +24 -0
- data/src/external/Z/API/Z/keys/language.h +21 -0
- data/src/external/Z/API/Z/keys/layout.h +20 -0
- data/src/external/Z/API/Z/keys/mathematics/geometry.h +29 -0
- data/src/external/Z/API/Z/keys/mathematics/number.h +21 -0
- data/src/external/Z/API/Z/keys/order.h +18 -0
- data/src/external/Z/API/Z/keys/platform.h +87 -0
- data/src/external/Z/API/Z/keys/program.h +39 -0
- data/src/external/Z/API/Z/keys/science/chemical elements.h +200 -0
- data/src/external/Z/API/Z/keys/science/electricity.h +18 -0
- data/src/external/Z/API/Z/keys/science/magnetism.h +19 -0
- data/src/external/Z/API/Z/keys/status.h +69 -0
- data/src/external/Z/API/Z/keys/text.h +27 -0
- data/src/external/Z/API/Z/keys/value.h +88 -0
- data/src/external/Z/API/Z/macros/arguments.h +25 -0
- data/src/external/Z/API/Z/macros/casting.h +22 -0
- data/src/external/Z/API/Z/macros/character.h +159 -0
- data/src/external/Z/API/Z/macros/date.h +14 -0
- data/src/external/Z/API/Z/macros/key.h +20 -0
- data/src/external/Z/API/Z/macros/language.h +126 -0
- data/src/external/Z/API/Z/macros/language.hpp +81 -0
- data/src/external/Z/API/Z/macros/members.h +86 -0
- data/src/external/Z/API/Z/macros/pasting.h +308 -0
- data/src/external/Z/API/Z/macros/pointer.h +33 -0
- data/src/external/Z/API/Z/macros/repetition.h +283 -0
- data/src/external/Z/API/Z/macros/structure.h +104 -0
- data/src/external/Z/API/Z/macros/templating.h +407 -0
- data/src/external/Z/API/Z/macros/tokens.h +14 -0
- data/src/external/Z/API/Z/macros/type enumeration.h +43 -0
- data/src/external/Z/API/Z/macros/type selection.hpp +76 -0
- data/src/external/Z/API/Z/macros/value.h +489 -0
- data/src/external/Z/API/Z/macros/variadic pasting.h +21 -0
- data/src/external/Z/API/Z/macros/variadic selection.h +56 -0
- data/src/external/Z/API/Z/macros/variadic.h +46 -0
- data/src/external/Z/API/Z/macros/version.h +17 -0
- data/src/external/Z/API/Z/network/3/IP.h +36 -0
- data/src/external/Z/API/Z/network/4/TCP.h +24 -0
- data/src/external/Z/API/Z/network/4/UDP.h +26 -0
- data/src/external/Z/API/Z/network/7/ED2K.h +104 -0
- data/src/external/Z/API/Z/network/7/HTTP.h +100 -0
- data/src/external/Z/API/Z/traits/SelectType.hpp +71 -0
- data/src/external/Z/API/Z/traits/TernaryType.hpp +20 -0
- data/src/external/Z/API/Z/traits/Type.hpp +4516 -0
- data/src/external/Z/API/Z/traits/TypeCount.hpp +52 -0
- data/src/external/Z/API/Z/traits/TypeList.hpp +376 -0
- data/src/external/Z/API/Z/traits/base.hpp +19 -0
- data/src/external/Z/API/Z/traits/filtering.hpp +30 -0
- data/src/external/Z/API/Z/traits/mathematics.hpp +48 -0
- data/src/external/Z/API/Z/types/arguments.h +19 -0
- data/src/external/Z/API/Z/types/base.h +1655 -0
- data/src/external/Z/API/Z/types/base.hpp +169 -0
- data/src/external/Z/API/Z/types/buffering.h +27 -0
- data/src/external/Z/API/Z/types/mathematics.h +135 -0
- data/src/external/Z/API/Z/types/time.h +23 -0
- data/src/external/Z/COPYING.LESSER +165 -0
- data/src/external/Z/development/Qt Creator/Z.pro +253 -0
- data/src/external/Z/distribution/CocoaPods/Zeta.podspec +18 -0
- data/src/external/Z/distribution/Gentoo Linux/Zeta-0.1.ebuild +22 -0
- data/src/external/Z/distribution/Gentoo Linux/metadata.xml +8 -0
- data/src/external/Z/distribution/Homebrew/Zeta.rb +11 -0
- data/src/external/z80/API/emulation/CPU/Z80.h +201 -0
- data/src/external/z80/README.md +229 -0
- data/src/external/z80/building/premake4.lua +33 -0
- data/src/external/z80/development/Xcode/Z80.xcodeproj/project.pbxproj +520 -0
- data/src/external/z80/sources/Z80.c +1660 -0
- data/src/interrupt.c +6 -0
- data/src/interrupt.h +3 -0
- data/src/io.c.erb +115 -0
- data/src/io.h.erb +18 -0
- data/src/main.c +69 -0
- data/src/memory.c.erb +43 -0
- data/src/memory.h.erb +9 -0
- metadata +329 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 98e90e196dcbb84331f8dab176c2b83610180e7ddd11df63f481328cab4b7d7a
|
4
|
+
data.tar.gz: c3cb5cde5230d2dbe34d228a170fa5cd35a6607614c215ea5c01792c1634ee08
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7359557085c2f32b9222c7836c0af65a1104e158f8f9c58d118a5dabbd50fdcb2cfe793957b41cded14af45566a2ddaad4d3148ee736da922e1347bde1bf0091
|
7
|
+
data.tar.gz: d20ce84cc9c41e11203b08e44865b6addf53d63846004f4aa575eb54f58b69200c454c18713569e94220dd6ea49a3dea84634870bfef5a32f58a81f7a04daf49
|
data/lib/zemu/config.rb
ADDED
@@ -0,0 +1,312 @@
|
|
1
|
+
module Zemu
|
2
|
+
# Abstract configuration object.
|
3
|
+
# All configuration objects should inherit from this.
|
4
|
+
class ConfigObject
|
5
|
+
# Defines the parameters of this configuration object.
|
6
|
+
def params
|
7
|
+
raise NotImplementedError, "params must be overridden by inheriting class."
|
8
|
+
end
|
9
|
+
|
10
|
+
protected :params
|
11
|
+
|
12
|
+
# Defines the initial values of parameters, if any.
|
13
|
+
def params_init
|
14
|
+
return {}
|
15
|
+
end
|
16
|
+
|
17
|
+
protected :params_init
|
18
|
+
|
19
|
+
def initialize(&block)
|
20
|
+
if self.class == Zemu::ConfigObject
|
21
|
+
raise NotImplementedError, "Cannot construct an instance of the abstract class Zemu::ConfigObject."
|
22
|
+
end
|
23
|
+
|
24
|
+
@initialized = false
|
25
|
+
|
26
|
+
# Initialize each parameter to nil
|
27
|
+
params.each do |p|
|
28
|
+
if params_init[p].nil?
|
29
|
+
instance_variable_set("@#{p}", nil)
|
30
|
+
else
|
31
|
+
instance_variable_set("@#{p}", params_init[p])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Instance eval the block.
|
36
|
+
instance_eval(&block)
|
37
|
+
|
38
|
+
# Raise a ConfigError if any of the parameters are unset.
|
39
|
+
params.each do |p|
|
40
|
+
if instance_variable_get("@#{p}").nil?
|
41
|
+
raise ConfigError, "The #{p} parameter of a #{self.class.name} configuration object must be set."
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
@initialized = true
|
46
|
+
end
|
47
|
+
|
48
|
+
# This allows some metaprogramming magic to allow the user to set instance variables
|
49
|
+
# (config parameters) while initializing the configuration object, but ensures
|
50
|
+
# that these parameters are readonly once the object is initialized.
|
51
|
+
def method_missing(m, *args, &block)
|
52
|
+
params.each do |v|
|
53
|
+
# We don't allow the setting of instance variables if the object
|
54
|
+
# has been initialized.
|
55
|
+
if m == "#{v}".to_sym
|
56
|
+
if args.size == 1 && !@initialized
|
57
|
+
instance_variable_set("@#{v}", args[0])
|
58
|
+
return
|
59
|
+
elsif args.size == 0
|
60
|
+
return instance_variable_get("@#{v}")
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Otherwise just call super's method_missing
|
66
|
+
super
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# Configuration object.
|
71
|
+
#
|
72
|
+
# An object which represents the configuration of a Zemu emulator.
|
73
|
+
#
|
74
|
+
# @param [String] name The name of the configuration.
|
75
|
+
# @param [String] compiler The path to the compiler to be used for compiling the emulator executable.
|
76
|
+
#
|
77
|
+
class Config < ConfigObject
|
78
|
+
# Memory object.
|
79
|
+
#
|
80
|
+
# This is an abstract class from which all other memory objects inherit.
|
81
|
+
class Memory < ConfigObject
|
82
|
+
# Constructor.
|
83
|
+
#
|
84
|
+
# Do not use, as this is an abstract class. Use one of the subclasses instead.
|
85
|
+
def initialize
|
86
|
+
if self.class == Zemu::Config::Memory
|
87
|
+
raise NotImplementedError, "Cannot construct an instance of the abstract class Zemu::Config::Memory."
|
88
|
+
end
|
89
|
+
|
90
|
+
@contents = []
|
91
|
+
|
92
|
+
super
|
93
|
+
|
94
|
+
# Pad contents with 0x00 bytes.
|
95
|
+
(@size - @contents.size).times do
|
96
|
+
@contents << 0x00
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
# Gets or sets an array of bytes representing the initial state
|
101
|
+
# of this memory block.
|
102
|
+
def contents(*args)
|
103
|
+
if args.size.zero?
|
104
|
+
return @contents
|
105
|
+
else
|
106
|
+
@contents = args[0]
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
# @return [Boolean] true if this memory section is readonly, false otherwise.
|
111
|
+
def readonly?
|
112
|
+
return false
|
113
|
+
end
|
114
|
+
|
115
|
+
# Valid parameters for this object.
|
116
|
+
# Should be extended by subclasses but NOT REPLACED.
|
117
|
+
def params
|
118
|
+
return %w(name address size)
|
119
|
+
end
|
120
|
+
|
121
|
+
# Reads the contents of a file in binary format and
|
122
|
+
# returns them as an array.
|
123
|
+
def from_binary(file)
|
124
|
+
return File.open(file, "rb") do |f|
|
125
|
+
bin = []
|
126
|
+
|
127
|
+
f.each_byte { |b| bin << b }
|
128
|
+
|
129
|
+
bin
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
# Read-Only Memory object
|
135
|
+
#
|
136
|
+
# Represents a block of memory which is read-only.
|
137
|
+
class ROM < Memory
|
138
|
+
# Constructor.
|
139
|
+
#
|
140
|
+
# Takes a block in which the parameters of the memory block
|
141
|
+
# can be initialized.
|
142
|
+
#
|
143
|
+
# All parameters can be set within this block.
|
144
|
+
# They become readonly as soon as the block completes.
|
145
|
+
#
|
146
|
+
# @example
|
147
|
+
#
|
148
|
+
# Zemu::Config::ROM.new do
|
149
|
+
# address 0x8000
|
150
|
+
# size 256
|
151
|
+
# end
|
152
|
+
#
|
153
|
+
#
|
154
|
+
def initialize
|
155
|
+
super
|
156
|
+
end
|
157
|
+
|
158
|
+
def readonly?
|
159
|
+
return true
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
# Random-access Memory object
|
164
|
+
#
|
165
|
+
# Represents a block of memory which can be read and written.
|
166
|
+
class RAM < Memory
|
167
|
+
end
|
168
|
+
|
169
|
+
# Input/Output Port object
|
170
|
+
#
|
171
|
+
# Represents an input/output device assigned to one or more ports.
|
172
|
+
class IOPort < ConfigObject
|
173
|
+
attr_reader :io_type
|
174
|
+
|
175
|
+
# Constructor.
|
176
|
+
#
|
177
|
+
# Do not use, as this is an abstract class. Use one of the subclasses instead.
|
178
|
+
def initialize
|
179
|
+
if self.class == Zemu::Config::IOPort
|
180
|
+
raise NotImplementedError, "Cannot construct an instance of the abstract class Zemu::Config::IOPort."
|
181
|
+
end
|
182
|
+
|
183
|
+
@ports = []
|
184
|
+
|
185
|
+
super
|
186
|
+
end
|
187
|
+
|
188
|
+
# Valid parameters for this object.
|
189
|
+
# Should be extended by subclasses but NOT REPLACED.
|
190
|
+
def params
|
191
|
+
%w(name)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
# Serial Input/Output object
|
196
|
+
#
|
197
|
+
# Represents a serial connection between the emulated CPU
|
198
|
+
# and the host machine, with input and output mapped to Z80 I/O
|
199
|
+
# ports.
|
200
|
+
class SerialPort < IOPort
|
201
|
+
# Constructor.
|
202
|
+
#
|
203
|
+
# Takes a block in which the parameters of the serial port
|
204
|
+
# can be initialized.
|
205
|
+
#
|
206
|
+
# All parameters can be set within this block.
|
207
|
+
# They become readonly as soon as the block completes.
|
208
|
+
#
|
209
|
+
# @example
|
210
|
+
#
|
211
|
+
# Zemu::Config::SerialPort.new do
|
212
|
+
# name "serial"
|
213
|
+
# in_port 0x00
|
214
|
+
# out_port 0x01
|
215
|
+
# end
|
216
|
+
#
|
217
|
+
#
|
218
|
+
def initialize
|
219
|
+
super
|
220
|
+
|
221
|
+
@io_type = :serial
|
222
|
+
end
|
223
|
+
|
224
|
+
# Valid parameters for a SerialPort, along with those
|
225
|
+
# defined in [Zemu::Config::IOPort].
|
226
|
+
def params
|
227
|
+
super + %w(in_port out_port)
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
# Gets a binding for this object.
|
232
|
+
def get_binding
|
233
|
+
return binding
|
234
|
+
end
|
235
|
+
|
236
|
+
# The memory sections of this configuration object.
|
237
|
+
attr_reader :memory
|
238
|
+
|
239
|
+
# The IO devices of this configuration object.
|
240
|
+
attr_reader :io
|
241
|
+
|
242
|
+
# Parameters accessible by this configuration object.
|
243
|
+
def params
|
244
|
+
return %w(name compiler output_directory)
|
245
|
+
end
|
246
|
+
|
247
|
+
# Initial value for parameters of this configuration object.
|
248
|
+
def params_init
|
249
|
+
return {
|
250
|
+
"compiler" => "clang",
|
251
|
+
"output_directory" => "bin"
|
252
|
+
}
|
253
|
+
end
|
254
|
+
|
255
|
+
# Constructor.
|
256
|
+
#
|
257
|
+
# Takes a block in which parameters of the configuration
|
258
|
+
# can be initialized.
|
259
|
+
#
|
260
|
+
# All parameters can be set within this block.
|
261
|
+
# They become readonly as soon as the block completes.
|
262
|
+
#
|
263
|
+
# @example
|
264
|
+
#
|
265
|
+
# Zemu::Config.new do
|
266
|
+
# name "my_config"
|
267
|
+
#
|
268
|
+
# add_memory Zemu::Config::ROM.new do
|
269
|
+
# name "rom"
|
270
|
+
# address 0x0000
|
271
|
+
# size 0x1000
|
272
|
+
# end
|
273
|
+
# end
|
274
|
+
#
|
275
|
+
# @raise [Zemu::ConfigError] Raised if the +name+ parameter is not set, or contains whitespace.
|
276
|
+
def initialize
|
277
|
+
@memory = []
|
278
|
+
@io = []
|
279
|
+
|
280
|
+
super
|
281
|
+
|
282
|
+
if @name.empty?
|
283
|
+
raise ConfigError, "The name parameter of a Zemu::Config configuration object cannot be empty."
|
284
|
+
end
|
285
|
+
|
286
|
+
if /\s/ =~ @name
|
287
|
+
raise ConfigError, "The name parameter of a Zemu::Config configuration object cannot contain whitespace."
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
291
|
+
# Adds a new memory section to this configuration.
|
292
|
+
#
|
293
|
+
# @param [Zemu::Config::Memory] mem The memory object to add.
|
294
|
+
def add_memory(mem)
|
295
|
+
@memory << mem
|
296
|
+
end
|
297
|
+
|
298
|
+
# Adds a new IO device to this configuration.
|
299
|
+
#
|
300
|
+
# @param [Zemu::Config::IOPort] io The IO device to add.
|
301
|
+
def add_io(io)
|
302
|
+
@io << io
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
# Error raised when a configuration is initialized incorrectly.
|
307
|
+
class ConfigError < StandardError
|
308
|
+
def initialize(msg="The configuration is invalid.")
|
309
|
+
super
|
310
|
+
end
|
311
|
+
end
|
312
|
+
end
|
@@ -0,0 +1,179 @@
|
|
1
|
+
require 'ffi'
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
module Zemu
|
5
|
+
# Represents an instance of a Zemu emulator.
|
6
|
+
#
|
7
|
+
# Provides methods by which the state of the emulator can be observed
|
8
|
+
# and the execution of the program controlled.
|
9
|
+
class Instance
|
10
|
+
# Mapping of register names to the ID numbers used to identify them
|
11
|
+
# by the debug functionality of the built library.
|
12
|
+
REGISTERS = {
|
13
|
+
# Special purpose registers
|
14
|
+
"PC" => 0,
|
15
|
+
"SP" => 1,
|
16
|
+
"IY" => 2,
|
17
|
+
"IX" => 3,
|
18
|
+
|
19
|
+
# Main register set
|
20
|
+
"A" => 4,
|
21
|
+
"F" => 5,
|
22
|
+
"B" => 6,
|
23
|
+
"C" => 7,
|
24
|
+
"D" => 8,
|
25
|
+
"E" => 9,
|
26
|
+
"H" => 10,
|
27
|
+
"L" => 11,
|
28
|
+
|
29
|
+
# Alternate register set
|
30
|
+
"A'" => 12,
|
31
|
+
"F'" => 13,
|
32
|
+
"B'" => 14,
|
33
|
+
"C'" => 15,
|
34
|
+
"D'" => 16,
|
35
|
+
"E'" => 17,
|
36
|
+
"H'" => 18,
|
37
|
+
"L'" => 19
|
38
|
+
}
|
39
|
+
|
40
|
+
def initialize(configuration)
|
41
|
+
@wrapper = make_wrapper(configuration)
|
42
|
+
|
43
|
+
@serial = []
|
44
|
+
|
45
|
+
@instance = @wrapper.zemu_init
|
46
|
+
@wrapper.zemu_power_on(@instance)
|
47
|
+
@wrapper.zemu_reset(@instance)
|
48
|
+
end
|
49
|
+
|
50
|
+
# Returns a hash containing current values of the emulated
|
51
|
+
# machine's registers. All names are as those given in the Z80
|
52
|
+
# reference manual.
|
53
|
+
#
|
54
|
+
# 16-bit general-purpose registers must be accessed by their 8-bit
|
55
|
+
# component registers.
|
56
|
+
def registers
|
57
|
+
r = {}
|
58
|
+
|
59
|
+
REGISTERS.each do |reg, num|
|
60
|
+
r[reg] = @wrapper.zemu_debug_register(@instance, num)
|
61
|
+
end
|
62
|
+
|
63
|
+
return r
|
64
|
+
end
|
65
|
+
|
66
|
+
# Access the value in memory at a given address.
|
67
|
+
#
|
68
|
+
# @param address The address in memory to be accessed.
|
69
|
+
#
|
70
|
+
# Returns 0 if the memory address is not mapped, otherwise
|
71
|
+
# returns the value in the given memory location.
|
72
|
+
def memory(address)
|
73
|
+
return @wrapper.zemu_debug_get_memory(address)
|
74
|
+
end
|
75
|
+
|
76
|
+
# Write a string to the serial line of the emulated CPU.
|
77
|
+
#
|
78
|
+
# @param string The string to be sent.
|
79
|
+
#
|
80
|
+
# Sends each character in the string to the receive buffer of the
|
81
|
+
# emulated machine.
|
82
|
+
def serial_puts(string)
|
83
|
+
string.each_char do |c|
|
84
|
+
@wrapper.zemu_io_serial_master_puts(c.ord)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# Get a number of characters from the serial line of the emulated CPU.
|
89
|
+
#
|
90
|
+
# @param count The number of characters to get, or nil if all characters in the buffer
|
91
|
+
# should be retrieved.
|
92
|
+
#
|
93
|
+
# Gets the given number of characters from the emulated machine's send buffer.
|
94
|
+
#
|
95
|
+
# Note: If count is greater than the number of characters currently in the buffer,
|
96
|
+
# the returned string may have invalid characters appended to the end.
|
97
|
+
def serial_gets(count=nil)
|
98
|
+
return_string = ""
|
99
|
+
|
100
|
+
if count.nil?
|
101
|
+
count = @wrapper.zemu_io_serial_buffer_size()
|
102
|
+
end
|
103
|
+
|
104
|
+
count.to_i.times do
|
105
|
+
return_string += @wrapper.zemu_io_serial_master_gets().chr
|
106
|
+
end
|
107
|
+
|
108
|
+
return return_string
|
109
|
+
end
|
110
|
+
|
111
|
+
# Continue running this instance until either:
|
112
|
+
# * A HALT instruction is executed
|
113
|
+
# * A breakpoint is hit
|
114
|
+
def continue
|
115
|
+
@wrapper.zemu_debug_continue(@instance)
|
116
|
+
end
|
117
|
+
|
118
|
+
# Set a breakpoint of the given type at the given address.
|
119
|
+
#
|
120
|
+
# @param address The address of the breakpoint
|
121
|
+
# @param type The type of breakpoint:
|
122
|
+
# * :program => Break when the program counter hits the address given.
|
123
|
+
def break(address, type)
|
124
|
+
@wrapper.zemu_debug_set_breakpoint(address)
|
125
|
+
end
|
126
|
+
|
127
|
+
# Returns true if the CPU has halted, false otherwise.
|
128
|
+
def halted?
|
129
|
+
return @wrapper.zemu_debug_halted
|
130
|
+
end
|
131
|
+
|
132
|
+
# Returns true if a breakpoint has been hit, false otherwise.
|
133
|
+
def break?
|
134
|
+
return @wrapper.zemu_debug_break
|
135
|
+
end
|
136
|
+
|
137
|
+
# Powers off the emulated CPU and destroys this instance.
|
138
|
+
def quit
|
139
|
+
@wrapper.zemu_power_off(@instance)
|
140
|
+
@wrapper.zemu_free(@instance)
|
141
|
+
end
|
142
|
+
|
143
|
+
# Creates a wrapper around the Zemu module built with the given configuration.
|
144
|
+
def make_wrapper(configuration)
|
145
|
+
wrapper = Module.new
|
146
|
+
|
147
|
+
wrapper.extend FFI::Library
|
148
|
+
|
149
|
+
wrapper.ffi_lib [File.join(configuration.output_directory, "#{configuration.name}.so")]
|
150
|
+
|
151
|
+
wrapper.attach_function :zemu_init, [], :pointer
|
152
|
+
wrapper.attach_function :zemu_free, [:pointer], :void
|
153
|
+
|
154
|
+
wrapper.attach_function :zemu_power_on, [:pointer], :void
|
155
|
+
wrapper.attach_function :zemu_power_off, [:pointer], :void
|
156
|
+
|
157
|
+
wrapper.attach_function :zemu_reset, [:pointer], :void
|
158
|
+
|
159
|
+
wrapper.attach_function :zemu_debug_continue, [:pointer], :void
|
160
|
+
|
161
|
+
wrapper.attach_function :zemu_debug_halted, [], :bool
|
162
|
+
wrapper.attach_function :zemu_debug_break, [], :bool
|
163
|
+
|
164
|
+
wrapper.attach_function :zemu_debug_set_breakpoint, [:uint16], :void
|
165
|
+
|
166
|
+
wrapper.attach_function :zemu_debug_register, [:pointer, :uint16], :uint16
|
167
|
+
|
168
|
+
wrapper.attach_function :zemu_debug_get_memory, [:uint16], :uint8
|
169
|
+
|
170
|
+
wrapper.attach_function :zemu_io_serial_master_puts, [:uint8], :void
|
171
|
+
wrapper.attach_function :zemu_io_serial_master_gets, [], :uint8
|
172
|
+
wrapper.attach_function :zemu_io_serial_buffer_size, [], :uint64
|
173
|
+
|
174
|
+
return wrapper
|
175
|
+
end
|
176
|
+
|
177
|
+
private :make_wrapper
|
178
|
+
end
|
179
|
+
end
|
data/lib/zemu.rb
ADDED
@@ -0,0 +1,172 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
3
|
+
require_relative 'zemu/config'
|
4
|
+
require_relative 'zemu/instance'
|
5
|
+
|
6
|
+
# Zemu
|
7
|
+
#
|
8
|
+
# Zemu is a module providing an interface to build and interact with
|
9
|
+
# configurable Z80 emulators.
|
10
|
+
#
|
11
|
+
# Configurations can be defined in a declarative syntax, from which
|
12
|
+
# an emulator executable can be compiled. This executable can then be run
|
13
|
+
# from within Zemu and controlled programmatically.
|
14
|
+
#
|
15
|
+
# Please note: The example below does not currently work, as not all features
|
16
|
+
# have been implemented.
|
17
|
+
#
|
18
|
+
# @example
|
19
|
+
#
|
20
|
+
# require 'zemu'
|
21
|
+
#
|
22
|
+
# # A simple configuration with a ROM block
|
23
|
+
# # and a RAM block.
|
24
|
+
# conf = Zemu::Config.new do
|
25
|
+
# name "zemu_emulator"
|
26
|
+
#
|
27
|
+
# add_memory Zemu::Config::ROM.new do
|
28
|
+
# name "rom"
|
29
|
+
# address 0x0000
|
30
|
+
# size 0x4000
|
31
|
+
#
|
32
|
+
# contents from_binary("app.bin")
|
33
|
+
# end
|
34
|
+
#
|
35
|
+
# add_memory Zemu::Config::RAM.new do
|
36
|
+
# name "ram"
|
37
|
+
# address 0x8000
|
38
|
+
# size 0x1000
|
39
|
+
# end
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
# # Start a new instance with this configuration.
|
43
|
+
# instance = Zemu.start(conf)
|
44
|
+
#
|
45
|
+
# # Program breakpoint.
|
46
|
+
# # Will trigger if the emulator is about to execute an
|
47
|
+
# # instruction at 0x102.
|
48
|
+
# instance.break 0x102, :program
|
49
|
+
#
|
50
|
+
# # Continue. Emulator will run until HALT or until
|
51
|
+
# # the breakpoint (set above) is hit.
|
52
|
+
# instance.continue
|
53
|
+
#
|
54
|
+
# # Display the value of the A register (accumulator)
|
55
|
+
# # at the breakpoint.
|
56
|
+
# puts instance.register["A"]
|
57
|
+
#
|
58
|
+
# # Close the instance.
|
59
|
+
# instance.quit
|
60
|
+
#
|
61
|
+
module Zemu
|
62
|
+
# Location of C source for the emulator.
|
63
|
+
SRC = File.join(__dir__, "..", "src")
|
64
|
+
|
65
|
+
# Build and start an emulator according to the given configuration.
|
66
|
+
#
|
67
|
+
# @param [Zemu::Config] configuration The configuration for which an emulator will be generated.
|
68
|
+
def Zemu::start(configuration)
|
69
|
+
build(configuration)
|
70
|
+
|
71
|
+
return Instance.new(configuration)
|
72
|
+
end
|
73
|
+
|
74
|
+
# Builds a library according to the given configuration.
|
75
|
+
#
|
76
|
+
# @param [Zemu::Config] configuration The configuration for which an emulator will be generated.
|
77
|
+
#
|
78
|
+
# @returns true if the build is a success, false (build failed) or nil (compiler not found) otherwise.
|
79
|
+
def Zemu::build(configuration)
|
80
|
+
# Create the output directory unless it already exists.
|
81
|
+
unless Dir.exist? configuration.output_directory
|
82
|
+
Dir.mkdir configuration.output_directory
|
83
|
+
end
|
84
|
+
|
85
|
+
# Generate the autogenerated source files.
|
86
|
+
generate(configuration)
|
87
|
+
|
88
|
+
output = File.join(configuration.output_directory, "#{configuration.name}.so")
|
89
|
+
|
90
|
+
autogen = File.join(configuration.output_directory, "autogen_#{configuration.name}")
|
91
|
+
|
92
|
+
compiler = configuration.compiler
|
93
|
+
|
94
|
+
inputs = [
|
95
|
+
"main.c", # main library functionality
|
96
|
+
"debug.c", # debug functionality
|
97
|
+
"interrupt.c", # interrupt functionality
|
98
|
+
"external/z80/sources/Z80.c" # z80 core library
|
99
|
+
]
|
100
|
+
|
101
|
+
inputs_str = inputs.map { |i| File.join(SRC, i) }.join(" ")
|
102
|
+
|
103
|
+
inputs_str += " " + File.join(autogen, "memory.c") + " " + File.join(autogen, "io.c")
|
104
|
+
|
105
|
+
defines = {
|
106
|
+
"CPU_Z80_STATIC" => 1,
|
107
|
+
"CPU_Z80_USE_LOCAL_HEADER" => 1
|
108
|
+
}
|
109
|
+
|
110
|
+
defines_str = defines.map { |d, v| "-D#{d}=#{v}" }.join(" ")
|
111
|
+
|
112
|
+
includes = [
|
113
|
+
"external/Z/API",
|
114
|
+
"external/z80/API",
|
115
|
+
"external/z80/API/emulation/CPU",
|
116
|
+
"."
|
117
|
+
]
|
118
|
+
|
119
|
+
includes_str = includes.map { |i| "-I#{File.join(SRC, i)}" }.join(" ")
|
120
|
+
|
121
|
+
includes_str += " -I" + autogen
|
122
|
+
|
123
|
+
command = "#{compiler} -Werror -Wno-unknown-warning-option -fPIC -shared -Wl,-undefined -Wl,dynamic_lookup #{includes_str} #{defines_str} -o #{output} #{inputs_str}"
|
124
|
+
|
125
|
+
# Run the compiler and generate a library.
|
126
|
+
return system(command)
|
127
|
+
end
|
128
|
+
|
129
|
+
# Generates the prerequisite source and header files for a given configuration.
|
130
|
+
#
|
131
|
+
# @param [Zemu::Config] configuration The configuration for which an emulator will be generated.
|
132
|
+
def Zemu::generate(configuration)
|
133
|
+
generate_memory(configuration)
|
134
|
+
generate_io(configuration)
|
135
|
+
end
|
136
|
+
|
137
|
+
# Generates the memory.c and memory.h files for a given configuration.
|
138
|
+
def Zemu::generate_memory(configuration)
|
139
|
+
header_template = ERB.new File.read(File.join(SRC, "memory.h.erb"))
|
140
|
+
source_template = ERB.new File.read(File.join(SRC, "memory.c.erb"))
|
141
|
+
|
142
|
+
autogen = File.join(configuration.output_directory, "autogen_#{configuration.name}")
|
143
|
+
|
144
|
+
unless Dir.exist? autogen
|
145
|
+
Dir.mkdir autogen
|
146
|
+
end
|
147
|
+
|
148
|
+
File.write(File.join(autogen, "memory.h"),
|
149
|
+
header_template.result(configuration.get_binding))
|
150
|
+
|
151
|
+
File.write(File.join(autogen, "memory.c"),
|
152
|
+
source_template.result(configuration.get_binding))
|
153
|
+
end
|
154
|
+
|
155
|
+
# Generates the io.c and io.h files for a given configuration.
|
156
|
+
def Zemu::generate_io(configuration)
|
157
|
+
header_template = ERB.new File.read(File.join(SRC, "io.h.erb"))
|
158
|
+
source_template = ERB.new File.read(File.join(SRC, "io.c.erb"))
|
159
|
+
|
160
|
+
autogen = File.join(configuration.output_directory, "autogen_#{configuration.name}")
|
161
|
+
|
162
|
+
unless Dir.exist? autogen
|
163
|
+
Dir.mkdir autogen
|
164
|
+
end
|
165
|
+
|
166
|
+
File.write(File.join(autogen, "io.h"),
|
167
|
+
header_template.result(configuration.get_binding))
|
168
|
+
|
169
|
+
File.write(File.join(autogen, "io.c"),
|
170
|
+
source_template.result(configuration.get_binding))
|
171
|
+
end
|
172
|
+
end
|