z80 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a5289868d57c23014c7ebf04e4a895cfb66743a55bd158f33802f99b8da91ca8
4
- data.tar.gz: 3d33827c3ea92ef3e6194a9b1f60eb6311763aa421ec0e6e459766f6242ee04b
3
+ metadata.gz: 4105cc740b5ab5ec51d21e3a26e9a05966c44ce7e6557c7fc3f37efa831a5ac9
4
+ data.tar.gz: 3647f4f6f121f54963b7f09794a0a5aef3fa94204cbbd96cc904ee64eecdbb65
5
5
  SHA512:
6
- metadata.gz: efffd69b66de491f606dec0271479dad51bd1d8a698582e65c3f566da4448bd0e7c5e5ff8bd04c3fa3ef0f1d8bb9d9434abc820c9b71fc916d5eb842d97834d4
7
- data.tar.gz: 6909aa3c155aa3f957ee71e160efdef14984232042f9f1f918e171598a5bf24958d15a62d4f482c7d44317d850aac58abc153042aa70f7c968439c85b334706b
6
+ metadata.gz: b1e1a6097cc49a5efe595675e4b63fb8027e9e6cc9ba152fd1c1aa1b7ba7519562f079dc68d86e00d5119fc22d1db6895639e71f4fdf28a237d0bc9682f8ba4c
7
+ data.tar.gz: c3da2a05c7860e59e82827f0b2cf0a3ce70cbae64e6de4d8d3fc2f55850797fca015d24a357714b60fd14c11177336cafede3da347ed445aedff86162974e311
@@ -0,0 +1,57 @@
1
+ name: Build and test extension
2
+
3
+ on:
4
+ push:
5
+ paths:
6
+ - '.github/workflows/build-and-test-extension.yml'
7
+ - 'ext/**'
8
+ - 'lib/**'
9
+ - 'z80.gemspec'
10
+ pull_request:
11
+ paths:
12
+ - '.github/workflows/build-and-test-extension.yml'
13
+ - 'ext/**'
14
+ - 'lib/**'
15
+ - 'z80.gemspec'
16
+
17
+ jobs:
18
+ build-and-test-extension:
19
+ runs-on: ${{matrix.os}}
20
+
21
+ strategy:
22
+ matrix:
23
+ os: [macos-latest, ubuntu-latest]
24
+ ruby-version: ['3.2', '3.1', '3.0', '2.7']
25
+
26
+ steps:
27
+ - uses: actions/checkout@v3
28
+
29
+ - name: Set up Ruby
30
+ uses: ruby/setup-ruby@v1
31
+ with:
32
+ ruby-version: ${{matrix.ruby-version}}
33
+
34
+ - name: Install dependencies (macOS)
35
+ if: startsWith(matrix.os, 'macos')
36
+ run: brew install redcode/zxe/z80
37
+
38
+ - name: Install dependencies (Ubuntu)
39
+ if: startsWith(matrix.os, 'ubuntu')
40
+ run: |
41
+ sudo mkdir -pm700 /root/.gnupg
42
+ sudo mkdir -pm755 /etc/apt/keyrings
43
+ sudo gpg --no-default-keyring --keyring /etc/apt/keyrings/zxe-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys FE214A38D6A0C01D9AF514EE841EA3BD3A7E1487
44
+ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/zxe-archive-keyring.gpg] https://zxe.io/repos/apt stable main" | sudo tee /etc/apt/sources.list.d/zxe.list
45
+ sudo apt-get update
46
+ sudo apt-get -y install libz80-dev
47
+
48
+ - name: Build gem
49
+ run: gem build z80.gemspec
50
+
51
+ - name: Install gem (macOS)
52
+ if: startsWith(matrix.os, 'macos')
53
+ run: gem install z80*.gem -- --with-Z80-dir=$(brew --prefix)
54
+
55
+ - name: Install gem (Ubuntu)
56
+ if: startsWith(matrix.os, 'ubuntu')
57
+ run: gem install z80*.gem
@@ -0,0 +1,40 @@
1
+ name: Publish gem
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
7
+ jobs:
8
+ publish-gem:
9
+ runs-on: ubuntu-latest
10
+
11
+ steps:
12
+ - uses: actions/checkout@v3
13
+
14
+ - name: Set up Ruby
15
+ uses: ruby/setup-ruby@v1
16
+ with:
17
+ ruby-version: "${{vars.PUBLISH_GEM_RUBY_VERSION}}"
18
+
19
+ - name: Publish to GPR
20
+ env:
21
+ GEM_HOST_API_KEY: "Bearer ${{secrets.GPR_PAT}}"
22
+ OWNER: ${{github.repository_owner}}
23
+ run: |
24
+ mkdir -p $HOME/.gem
25
+ touch $HOME/.gem/credentials
26
+ chmod 0600 $HOME/.gem/credentials
27
+ printf -- "---\n:github: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
28
+ gem build *.gemspec
29
+ gem push --key github --host https://rubygems.pkg.github.com/${OWNER} *.gem
30
+
31
+ - name: Publish to RubyGems
32
+ env:
33
+ GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_API_KEY}}"
34
+ run: |
35
+ mkdir -p $HOME/.gem
36
+ touch $HOME/.gem/credentials
37
+ chmod 0600 $HOME/.gem/credentials
38
+ printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
39
+ gem build *.gemspec
40
+ gem push *.gem
data/.gitignore CHANGED
@@ -3,15 +3,17 @@
3
3
  Thumbs.db
4
4
  *.a
5
5
  *.bundle
6
+ *.gem
6
7
  *.o
7
8
  *.so
8
9
  /.bundle/
10
+ /.yardoc/
9
11
  /_yardoc/
10
12
  /coverage/
11
13
  /doc/
12
14
  /pkg/
13
15
  /spec/reports/
14
16
  /tmp/
17
+ /.ruby-gemset
15
18
  /.ruby-version
16
- /.yardoc
17
19
  /Gemfile.lock
data/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # Z80-Ruby ChangeLog
2
2
 
3
+ ## 0.2.0 / 2024-01-02
4
+
5
+ ### Enhancements
6
+
7
+ * Added [`Z80::MINIMUM_CYCLES_PER_STEP`](https://zxe.io/software/Z80/documentation/latest/APIReference.html#c.Z80_MINIMUM_CYCLES_PER_STEP).
8
+ * Minor code improvements.
9
+
10
+ ### Bugfixes
11
+
12
+ * Changed the order in which the files are required so that the extension is loaded before `'z80/version'`.
13
+ * Fixed typos in the names of `#xyl`, `#xyl=`, `#wzh`, `#wzh=`, `#wzl` and `#wzl=`.
14
+
15
+ ### Project
16
+
17
+ * Added CI.
18
+ * Added `Gemfile`, `CITATION.cff`.
19
+ * Added [rake-compiler](https://rubygems.org/gems/rake-compiler) as a development dependency.
20
+
3
21
  ## 0.1.0 / 2023-12-24
4
22
 
5
23
  Initial public release.
data/CITATION.cff ADDED
@@ -0,0 +1,24 @@
1
+ abstract: Ruby interface for the Z80 library.
2
+ authors:
3
+ - family-names: "Sainz de Baranda y Goñi"
4
+ given-names: Manuel
5
+ orcid: https://orcid.org/0000-0001-6326-3519
6
+ email: manuel@zxe.io
7
+ website: https://zxe.io
8
+ cff-version: 1.2.0
9
+ date-released: 2023-01-02
10
+ keywords:
11
+ - binding
12
+ - CPU
13
+ - emulator
14
+ - LLE
15
+ - Ruby
16
+ - Z80
17
+ - Zilog
18
+ license: MIT
19
+ message: If you use this software, please cite it using these metadata.
20
+ repository-code: https://github.com/redcode/Z80-Ruby
21
+ title: Z80-Ruby
22
+ type: software
23
+ version: 0.2.0
24
+ url: https://zxe.io/software/Z80-Ruby
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/README.md CHANGED
@@ -1,33 +1,57 @@
1
- # Z80-Ruby
1
+ # Z80-Ruby <img src="https://zxe.io/software/Z80-Ruby/assets/images/Z80-Ruby.svg" width="128" align="right">
2
+
3
+ [![](https://zxe.io/software/Z80-Ruby/assets/images/gem-badge)](https://zxe.io/software/Z80-Ruby/gem)
4
+ [![](https://github.com/redcode/Z80-Ruby/actions/workflows/build-and-test-extension.yml/badge.svg)](https://github.com/redcode/Z80-Ruby/actions/workflows/build-and-test-extension.yml)
5
+ [![](https://zxe.io/software/Z80/assets/images/chat-badge)](https://zxe.io/software/Z80/chat)
2
6
 
3
7
  Ruby binding for the [Z80](https://github.com/redcode/Z80) library.
4
8
 
5
9
  ## Installation
6
10
 
7
- First make sure that you have the Z80 library [installed](https://github.com/redcode/Z80#installation) on your system.
11
+ First, make sure that you have the Z80 library [installed](https://github.com/redcode/Z80#installation) on your system.
8
12
 
9
- Then add `z80` to the `Gemfile` of your project and run `bundle`:
13
+ Then add the `z80` gem to the `Gemfile` of your project and run `bundle`:
10
14
 
11
15
  ```ruby
12
16
  gem 'z80'
13
17
  ```
14
18
 
15
- Or install the gem directly with `gem`:
19
+ Or install the gem directly:
16
20
 
17
21
  ```shell
18
22
  gem install z80
19
23
  ```
20
24
 
25
+ ### Troubleshooting
26
+
27
+ #### "I installed the Z80 library through Homebrew, but `bundle` does not find it."
28
+
29
+ Configure the environment variables [`C_INCLUDE_PATH`](https://gcc.gnu.org/onlinedocs/gcc/Environment-Variables.html#index-C_005fINCLUDE_005fPATH) and [`LIBRARY_PATH`](https://gcc.gnu.org/onlinedocs/gcc/Environment-Variables.html#index-LIBRARY_005fPATH) by adding the installation prefix of the library:
30
+
31
+ ```shell
32
+ export C_INCLUDE_PATH="$C_INCLUDE_PATH:$(brew --prefix)/include"
33
+ export LIBRARY_PATH="$LIBRARY_PATH:$(brew --prefix)/lib"
34
+ ```
35
+
36
+ #### "I installed the Z80 library through Homebrew, but `gem` does not find it."
37
+
38
+ Tell `gem` the installation prefix of the library:
39
+
40
+ ```shell
41
+ gem install z80 -- --with-Z80-dir=$(brew --prefix)
42
+ ```
43
+
21
44
  ## Examples
22
45
 
23
- This small script demonstrates how to run the [CP/M version of ZEXALL](https://github.com/redcode/Z80/wiki/Z80-Instruction-Set-Exerciser) with a few lines of code:
46
+ ### Z80 Instruction Set Exerciser
47
+
48
+ This small script demonstrates how to run the [CP/M versions of `zexall` and `zexdoc`](https://github.com/redcode/Z80/wiki/Z80-Instruction-Set-Exerciser) with a few lines of code:
24
49
 
25
50
  ```ruby
26
51
  require 'z80'
27
52
 
28
- quit = false
29
- memory = Array.new(65536, 0)
30
- cpu = Z80.new
53
+ memory = quit = nil
54
+ cpu = Z80.new
31
55
 
32
56
  cpu.fetch_opcode = cpu.fetch = cpu.read do |context, address|
33
57
  memory[address]
@@ -55,16 +79,30 @@ cpu.hook do |context, address|
55
79
  end
56
80
  end
57
81
 
58
- program = File.read(ARGV[0])
59
- memory[0x0100, program.size] = program.bytes
60
- memory[0] = memory[5] = Z80::HOOK
61
- cpu.power true
62
- cpu.pc = 0x0100
63
- cpu.run(Z80::MAXIMUM_CYCLES) until quit
64
- puts
82
+ ARGV.each do |file_path|
83
+ program = file_path == '-' ? $stdin.read : File.read(file_path)
84
+ puts "#{file_path}:"
85
+ quit = false
86
+ memory = Array.new(65536, 0)
87
+ memory[0x0100, program.size] = program.bytes
88
+ memory[0] = memory[5] = Z80::HOOK
89
+ cpu.power true
90
+ cpu.pc = 0x0100
91
+ cpu.run(Z80::MAXIMUM_CYCLES) until quit
92
+ puts
93
+ break if file_path == '-'
94
+ end
95
+ ```
96
+
97
+ <sup>**[<sub><img src="https://zxe.io/software/Z80-Ruby/assets/images/rb.svg" height="14"></sub> run-yaze-zex.rb](https://zxe.io/software/Z80-Ruby/scripts/run-yaze-zex.rb)**</sup>
98
+
99
+ Want to try it? Use this:
100
+
101
+ ```shell
102
+ curl ftp://ftp.ping.de/pub/misc/emulators/yaze-1.14.tar.gz | tar -xOzf- yaze-1.14/test/zexall.com | ruby -e'eval `curl https://zxe.io/software/Z80-Ruby/scripts/run-yaze-zex.rb`' -
65
103
  ```
66
104
 
67
- <sup>**[<sub><img src="https://zxe.io/software/Z80/assets/images/ruby-icon.svg" height="14"></sub> run-yaze-zexall.rb](https://zxe.io/software/Z80/scripts/run-yaze-zexall.rb)**</sup>
105
+ ### Zilog Z80 CPU Test Suite
68
106
 
69
107
  This runs any tape from Patrik Rak's [Zilog Z80 CPU Test Suite](https://github.com/raxoft/z80test) (except `z80ccfscr.tap`):
70
108
 
@@ -77,11 +115,8 @@ module Opcode
77
115
  CALL = 0xCD
78
116
  end
79
117
 
80
- quit = false
81
- tab = 0
82
- cursor_x = 0
83
- memory = Array.new(65536, 0)
84
- cpu = Z80.new
118
+ quit = cursor_x = tab = memory = nil
119
+ cpu = Z80.new
85
120
 
86
121
  cpu.fetch_opcode = cpu.fetch = cpu.read do |context, address|
87
122
  memory[address]
@@ -135,29 +170,42 @@ cpu.hook do |context, address|
135
170
  end
136
171
  end
137
172
 
138
- program = File.read(ARGV[0])
139
- memory[0x8000, program.size - 91] = program.bytes[91..-1]
140
- memory[0x0010] = Z80::HOOK # THE 'PRINT A CHARACTER' RESTART
141
- memory[0x0D6B] = Opcode::RET # THE 'CLS' COMMAND ROUTINE
142
- memory[0x1601] = Opcode::RET # THE 'CHAN_OPEN' SUBROUTINE
143
- memory[0x7000] = Opcode::CALL # -.
144
- memory[0x7001] = 0x00 # |- call 8000h
145
- memory[0x7002] = 0x80 # -'
146
- memory[0x7003] = Z80::HOOK
147
- cpu.power true
148
- cpu.im = 1
149
- cpu.i = 0x3F
150
- cpu.pc = 0x7000
151
- cpu.run(Z80::MAXIMUM_CYCLES) until quit
173
+ ARGV.each do |file_path|
174
+ program = file_path == '-' ? $stdin.read : File.read(file_path)
175
+ puts "#{file_path}:"
176
+ quit = false
177
+ cursor_x = tab = 0
178
+ memory = Array.new(65536, 0)
179
+ memory[0x8000, program.size - 91] = program.bytes[91..-1]
180
+ memory[0x0010] = Z80::HOOK # THE 'PRINT A CHARACTER' RESTART
181
+ memory[0x0D6B] = Opcode::RET # THE 'CLS' COMMAND ROUTINE
182
+ memory[0x1601] = Opcode::RET # THE 'CHAN_OPEN' SUBROUTINE
183
+ memory[0x7000] = Opcode::CALL # -.
184
+ memory[0x7001] = 0x00 # |- call 8000h
185
+ memory[0x7002] = 0x80 # -'
186
+ memory[0x7003] = Z80::HOOK
187
+ cpu.power true
188
+ cpu.im = 1
189
+ cpu.i = 0x3F
190
+ cpu.pc = 0x7000
191
+ cpu.run(Z80::MAXIMUM_CYCLES) until quit
192
+ break if file_path == '-'
193
+ end
152
194
  ```
153
195
 
154
- <sup>**[<sub><img src="https://zxe.io/software/Z80/assets/images/ruby-icon.svg" height="14"></sub> run-raxoft-z80test.rb](https://zxe.io/software/Z80/scripts/run-raxoft-z80test.rb)**</sup>
196
+ <sup>**[<sub><img src="https://zxe.io/software/Z80-Ruby/assets/images/rb.svg" height="14"></sub> run-raxoft-z80test.rb](https://zxe.io/software/Z80-Ruby/scripts/run-raxoft-z80test.rb)**</sup>
197
+
198
+ Want to try it? Use this:
199
+
200
+ ```shell
201
+ curl http://zxds.raxoft.cz/taps/misc/z80test-1.2a.zip | bsdtar -xOf- z80test-1.2a/z80full.tap | ruby -e'eval `curl https://zxe.io/software/Z80-Ruby/scripts/run-raxoft-z80test.rb`' -
202
+ ```
155
203
 
156
204
  ## License
157
205
 
158
- <img src="https://zxe.io/software/Z80/assets/images/0bsd.svg" width="160" align="right">
206
+ <img src="https://zxe.io/software/Z80-Ruby/assets/images/0bsd.svg" width="160" align="right">
159
207
 
160
- Copyright © 2023 Manuel Sainz de Baranda y Goñi.
208
+ Copyright © 2023-2024 Manuel Sainz de Baranda y Goñi.
161
209
 
162
210
  Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted.
163
211
 
data/Rakefile CHANGED
@@ -1,5 +1,12 @@
1
+ require "bundler/gem_tasks"
1
2
  require 'rake/extensiontask'
2
3
 
4
+ CLOBBER.include(
5
+ '.yardoc',
6
+ 'doc',
7
+ 'pkg'
8
+ )
9
+
3
10
  Rake::ExtensionTask.new('z80') do |ext|
4
11
  ext.lib_dir = 'lib/z80'
5
12
  end
data/ext/z80/extconf.rb CHANGED
@@ -4,94 +4,48 @@ dir_config 'Z80'
4
4
  abort "missing header Z80.h" unless have_header 'Z80.h'
5
5
  abort "missing library Z80" unless have_library 'Z80'
6
6
 
7
- %w(
8
- z80_power
9
- z80_instant_reset
10
- z80_int
11
- z80_nmi
12
- z80_execute
13
- z80_run
14
- ).each do |function|
15
- abort "missing #{function}()" unless have_func function
7
+ %w(power instant_reset int nmi execute run).each do |function|
8
+ abort "missing z80_#{function}()" unless have_func "z80_#{function}"
16
9
  end
17
10
 
18
11
  have_func 'z80_special_reset'
19
12
 
20
- %w(
21
- z80_break
22
- z80_r
23
- z80_refresh_address
24
- z80_in_cycle
25
- z80_out_cycle
26
- ).each do |function|
27
- abort "missing #{function}()" unless have_func(function, 'Z80.h')
13
+ %w(break r refresh_address in_cycle out_cycle).each do |function|
14
+ abort "missing z80_#{function}()" unless have_func("z80_#{function}", 'Z80.h')
28
15
  end
29
16
 
30
17
  %w(
31
- Z80_MAXIMUM_CYCLES
32
- Z80_MAXIMUM_CYCLES_PER_STEP
33
- Z80_MINIMUM_CYCLES_PER_STEP
34
- Z80_HOOK
35
- Z80_OPTION_OUT_VC_255
36
- Z80_OPTION_LD_A_IR_BUG
37
- Z80_OPTION_HALT_SKIP
38
- Z80_OPTION_XQ
39
- Z80_OPTION_IM0_RETX_NOTIFICATIONS
40
- Z80_OPTION_YQ
41
- Z80_MODEL_ZILOG_NMOS
42
- Z80_MODEL_ZILOG_CMOS
43
- Z80_MODEL_NEC_NMOS
44
- Z80_MODEL_ST_CMOS
45
- Z80_REQUEST_REJECT_NMI
46
- Z80_REQUEST_NMI
47
- Z80_REQUEST_INT
48
- Z80_RESUME_HALT
49
- Z80_RESUME_XY
50
- Z80_RESUME_IM0_XY
51
- Z80_MEMPTR
52
- Z80_PC
53
- Z80_SP
54
- Z80_XY
55
- Z80_IX
56
- Z80_IY
57
- Z80_AF
58
- Z80_BC
59
- Z80_DE
60
- Z80_HL
61
- Z80_AF_
62
- Z80_BC_
63
- Z80_DE_
64
- Z80_HL_
65
- Z80_MEMPTRH
66
- Z80_MEMPTRL
67
- Z80_PCH
68
- Z80_PCL
69
- Z80_SPH
70
- Z80_SPL
71
- Z80_XYH
72
- Z80_XYL
73
- Z80_IXH
74
- Z80_IXL
75
- Z80_IYH
76
- Z80_IYL
77
- Z80_A
78
- Z80_F
79
- Z80_B
80
- Z80_C
81
- Z80_D
82
- Z80_E
83
- Z80_H
84
- Z80_L
85
- Z80_A_
86
- Z80_F_
87
- Z80_B_
88
- Z80_C_
89
- Z80_D_
90
- Z80_E_
91
- Z80_H_
92
- Z80_L_
18
+ MAXIMUM_CYCLES
19
+ MAXIMUM_CYCLES_PER_STEP
20
+ MINIMUM_CYCLES_PER_STEP
21
+
22
+ HOOK
23
+
24
+ OPTION_OUT_VC_255
25
+ OPTION_LD_A_IR_BUG
26
+ OPTION_HALT_SKIP
27
+ OPTION_XQ
28
+ OPTION_IM0_RETX_NOTIFICATIONS
29
+ OPTION_YQ
30
+
31
+ MODEL_ZILOG_NMOS
32
+ MODEL_ZILOG_CMOS
33
+ MODEL_NEC_NMOS
34
+ MODEL_ST_CMOS
35
+
36
+ REQUEST_REJECT_NMI
37
+ REQUEST_NMI
38
+ REQUEST_INT
39
+
40
+ RESUME_HALT
41
+ RESUME_XY
42
+ RESUME_IM0_XY
43
+
44
+ MEMPTR PC SP XY IX IY AF BC DE HL AF_ BC_ DE_ HL_
45
+ MEMPTRH MEMPTRL PCH PCL SPH SPL XYH XYL IXH IXL IYH IYL
46
+ A F B C D E H L A_ F_ B_ C_ D_ E_ H_ L_
93
47
  ).each do |macro|
94
- abort "missing #{macro}" unless have_macro(macro, 'Z80.h')
48
+ abort "missing Z80_#{macro}" unless have_macro("Z80_#{macro}", 'Z80.h')
95
49
  end
96
50
 
97
51
  create_makefile "z80/z80"
data/ext/z80/z80.c CHANGED
@@ -290,7 +290,7 @@ ACCESSOR(zuint8, pcl, MACRO, Z80_PCL, UINT2NUM, NUM2UINT )
290
290
  ACCESSOR(zuint8, sph, MACRO, Z80_SPH, UINT2NUM, NUM2UINT )
291
291
  ACCESSOR(zuint8, spl, MACRO, Z80_SPL, UINT2NUM, NUM2UINT )
292
292
  ACCESSOR(zuint8, xyh, MACRO, Z80_XYH, UINT2NUM, NUM2UINT )
293
- ACCESSOR(zuint8, yl, MACRO, Z80_XYL, UINT2NUM, NUM2UINT )
293
+ ACCESSOR(zuint8, xyl, MACRO, Z80_XYL, UINT2NUM, NUM2UINT )
294
294
  ACCESSOR(zuint8, ixh, MACRO, Z80_IXH, UINT2NUM, NUM2UINT )
295
295
  ACCESSOR(zuint8, ixl, MACRO, Z80_IXL, UINT2NUM, NUM2UINT )
296
296
  ACCESSOR(zuint8, iyh, MACRO, Z80_IYH, UINT2NUM, NUM2UINT )
@@ -624,7 +624,7 @@ static VALUE Z80__alloc(VALUE klass)
624
624
 
625
625
  void Init_z80(void)
626
626
  {
627
- VALUE module, klass = rb_const_get(rb_cObject, rb_intern("Z80"));
627
+ VALUE module, klass = rb_define_class("Z80", rb_cObject);
628
628
 
629
629
  rb_define_alloc_func(klass, Z80__alloc);
630
630
 
@@ -670,92 +670,92 @@ void Init_z80(void)
670
670
  rb_define_const(module, "XY", UINT2NUM(Z80_RESUME_XY ));
671
671
  rb_define_const(module, "IM0_XY", UINT2NUM(Z80_RESUME_IM0_XY));
672
672
 
673
- # define DEFINE_ACCESSOR(name, getter_arity) \
674
- rb_define_method(klass, #name, Z80__##name, getter_arity); \
673
+ # define DEFINE_ACCESSOR(name) \
674
+ rb_define_method(klass, #name, Z80__##name, 0); \
675
675
  rb_define_method(klass, #name "=", Z80__set_##name, 1);
676
676
 
677
- DEFINE_ACCESSOR(fetch_opcode, 0)
678
- DEFINE_ACCESSOR(fetch, 0)
679
- DEFINE_ACCESSOR(read, 0)
680
- DEFINE_ACCESSOR(write, 0)
681
- DEFINE_ACCESSOR(in, 0)
682
- DEFINE_ACCESSOR(out, 0)
683
- DEFINE_ACCESSOR(halt, 0)
684
- DEFINE_ACCESSOR(nop, 0)
685
- DEFINE_ACCESSOR(nmia, 0)
686
- DEFINE_ACCESSOR(inta, 0)
687
- DEFINE_ACCESSOR(int_fetch, 0)
688
- DEFINE_ACCESSOR(ld_i_a, 0)
689
- DEFINE_ACCESSOR(ld_r_a, 0)
690
- DEFINE_ACCESSOR(reti, 0)
691
- DEFINE_ACCESSOR(retn, 0)
692
- DEFINE_ACCESSOR(hook, 0)
693
- DEFINE_ACCESSOR(illegal, 0)
694
- DEFINE_ACCESSOR(context, 0)
695
- DEFINE_ACCESSOR(cycles, 0)
696
- DEFINE_ACCESSOR(cycle_limit, 0)
697
- DEFINE_ACCESSOR(memptr, 0)
698
- DEFINE_ACCESSOR(pc, 0)
699
- DEFINE_ACCESSOR(sp, 0)
700
- DEFINE_ACCESSOR(xy, 0)
701
- DEFINE_ACCESSOR(ix, 0)
702
- DEFINE_ACCESSOR(iy, 0)
703
- DEFINE_ACCESSOR(af, 0)
704
- DEFINE_ACCESSOR(bc, 0)
705
- DEFINE_ACCESSOR(de, 0)
706
- DEFINE_ACCESSOR(hl, 0)
707
- DEFINE_ACCESSOR(af_, 0)
708
- DEFINE_ACCESSOR(bc_, 0)
709
- DEFINE_ACCESSOR(de_, 0)
710
- DEFINE_ACCESSOR(hl_, 0)
711
- DEFINE_ACCESSOR(memptrh, 0)
712
- DEFINE_ACCESSOR(memptrl, 0)
713
- DEFINE_ACCESSOR(pch, 0)
714
- DEFINE_ACCESSOR(pcl, 0)
715
- DEFINE_ACCESSOR(sph, 0)
716
- DEFINE_ACCESSOR(spl, 0)
717
- DEFINE_ACCESSOR(xyh, 0)
718
- DEFINE_ACCESSOR(yl, 0)
719
- DEFINE_ACCESSOR(ixh, 0)
720
- DEFINE_ACCESSOR(ixl, 0)
721
- DEFINE_ACCESSOR(iyh, 0)
722
- DEFINE_ACCESSOR(iyl, 0)
723
- DEFINE_ACCESSOR(a, 0)
724
- DEFINE_ACCESSOR(f, 0)
725
- DEFINE_ACCESSOR(b, 0)
726
- DEFINE_ACCESSOR(c, 0)
727
- DEFINE_ACCESSOR(d, 0)
728
- DEFINE_ACCESSOR(e, 0)
729
- DEFINE_ACCESSOR(h, 0)
730
- DEFINE_ACCESSOR(l, 0)
731
- DEFINE_ACCESSOR(a_, 0)
732
- DEFINE_ACCESSOR(f_, 0)
733
- DEFINE_ACCESSOR(b_, 0)
734
- DEFINE_ACCESSOR(c_, 0)
735
- DEFINE_ACCESSOR(d_, 0)
736
- DEFINE_ACCESSOR(e_, 0)
737
- DEFINE_ACCESSOR(h_, 0)
738
- DEFINE_ACCESSOR(l_, 0)
739
- DEFINE_ACCESSOR(r, 0)
740
- DEFINE_ACCESSOR(i, 0)
741
- DEFINE_ACCESSOR(r7, 0)
742
- DEFINE_ACCESSOR(im, 0)
743
- DEFINE_ACCESSOR(request, 0)
744
- DEFINE_ACCESSOR(resume, 0)
745
- DEFINE_ACCESSOR(iff1, 0)
746
- DEFINE_ACCESSOR(iff2, 0)
747
- DEFINE_ACCESSOR(q, 0)
748
- DEFINE_ACCESSOR(options, 0)
749
- DEFINE_ACCESSOR(int_line, 0)
750
- DEFINE_ACCESSOR(halt_line, 0)
751
- DEFINE_ACCESSOR(sf, 0)
752
- DEFINE_ACCESSOR(zf, 0)
753
- DEFINE_ACCESSOR(yf, 0)
754
- DEFINE_ACCESSOR(hf, 0)
755
- DEFINE_ACCESSOR(xf, 0)
756
- DEFINE_ACCESSOR(pf, 0)
757
- DEFINE_ACCESSOR(nf, 0)
758
- DEFINE_ACCESSOR(cf, 0)
677
+ DEFINE_ACCESSOR(fetch_opcode)
678
+ DEFINE_ACCESSOR(fetch )
679
+ DEFINE_ACCESSOR(read )
680
+ DEFINE_ACCESSOR(write )
681
+ DEFINE_ACCESSOR(in )
682
+ DEFINE_ACCESSOR(out )
683
+ DEFINE_ACCESSOR(halt )
684
+ DEFINE_ACCESSOR(nop )
685
+ DEFINE_ACCESSOR(nmia )
686
+ DEFINE_ACCESSOR(inta )
687
+ DEFINE_ACCESSOR(int_fetch )
688
+ DEFINE_ACCESSOR(ld_i_a )
689
+ DEFINE_ACCESSOR(ld_r_a )
690
+ DEFINE_ACCESSOR(reti )
691
+ DEFINE_ACCESSOR(retn )
692
+ DEFINE_ACCESSOR(hook )
693
+ DEFINE_ACCESSOR(illegal )
694
+ DEFINE_ACCESSOR(context )
695
+ DEFINE_ACCESSOR(cycles )
696
+ DEFINE_ACCESSOR(cycle_limit )
697
+ DEFINE_ACCESSOR(memptr )
698
+ DEFINE_ACCESSOR(pc )
699
+ DEFINE_ACCESSOR(sp )
700
+ DEFINE_ACCESSOR(xy )
701
+ DEFINE_ACCESSOR(ix )
702
+ DEFINE_ACCESSOR(iy )
703
+ DEFINE_ACCESSOR(af )
704
+ DEFINE_ACCESSOR(bc )
705
+ DEFINE_ACCESSOR(de )
706
+ DEFINE_ACCESSOR(hl )
707
+ DEFINE_ACCESSOR(af_ )
708
+ DEFINE_ACCESSOR(bc_ )
709
+ DEFINE_ACCESSOR(de_ )
710
+ DEFINE_ACCESSOR(hl_ )
711
+ DEFINE_ACCESSOR(memptrh )
712
+ DEFINE_ACCESSOR(memptrl )
713
+ DEFINE_ACCESSOR(pch )
714
+ DEFINE_ACCESSOR(pcl )
715
+ DEFINE_ACCESSOR(sph )
716
+ DEFINE_ACCESSOR(spl )
717
+ DEFINE_ACCESSOR(xyh )
718
+ DEFINE_ACCESSOR(xyl )
719
+ DEFINE_ACCESSOR(ixh )
720
+ DEFINE_ACCESSOR(ixl )
721
+ DEFINE_ACCESSOR(iyh )
722
+ DEFINE_ACCESSOR(iyl )
723
+ DEFINE_ACCESSOR(a )
724
+ DEFINE_ACCESSOR(f )
725
+ DEFINE_ACCESSOR(b )
726
+ DEFINE_ACCESSOR(c )
727
+ DEFINE_ACCESSOR(d )
728
+ DEFINE_ACCESSOR(e )
729
+ DEFINE_ACCESSOR(h )
730
+ DEFINE_ACCESSOR(l )
731
+ DEFINE_ACCESSOR(a_ )
732
+ DEFINE_ACCESSOR(f_ )
733
+ DEFINE_ACCESSOR(b_ )
734
+ DEFINE_ACCESSOR(c_ )
735
+ DEFINE_ACCESSOR(d_ )
736
+ DEFINE_ACCESSOR(e_ )
737
+ DEFINE_ACCESSOR(h_ )
738
+ DEFINE_ACCESSOR(l_ )
739
+ DEFINE_ACCESSOR(r )
740
+ DEFINE_ACCESSOR(i )
741
+ DEFINE_ACCESSOR(r7 )
742
+ DEFINE_ACCESSOR(im )
743
+ DEFINE_ACCESSOR(request )
744
+ DEFINE_ACCESSOR(resume )
745
+ DEFINE_ACCESSOR(iff1 )
746
+ DEFINE_ACCESSOR(iff2 )
747
+ DEFINE_ACCESSOR(q )
748
+ DEFINE_ACCESSOR(options )
749
+ DEFINE_ACCESSOR(int_line )
750
+ DEFINE_ACCESSOR(halt_line )
751
+ DEFINE_ACCESSOR(sf )
752
+ DEFINE_ACCESSOR(zf )
753
+ DEFINE_ACCESSOR(yf )
754
+ DEFINE_ACCESSOR(hf )
755
+ DEFINE_ACCESSOR(xf )
756
+ DEFINE_ACCESSOR(pf )
757
+ DEFINE_ACCESSOR(nf )
758
+ DEFINE_ACCESSOR(cf )
759
759
 
760
760
  # undef DEFINE_ACCESSOR
761
761
 
@@ -778,10 +778,10 @@ void Init_z80(void)
778
778
  rb_define_alias(klass, "t=", "cycles=" );
779
779
  rb_define_alias(klass, "wz", "memptr" );
780
780
  rb_define_alias(klass, "wz=", "memptr=" );
781
- rb_define_alias(klass, "w", "memptrh" );
782
- rb_define_alias(klass, "w=", "memptrh=");
783
- rb_define_alias(klass, "z", "memptrl" );
784
- rb_define_alias(klass, "z=", "memptrl=");
781
+ rb_define_alias(klass, "wzh", "memptrh" );
782
+ rb_define_alias(klass, "wzh=", "memptrh=");
783
+ rb_define_alias(klass, "wzl", "memptrl" );
784
+ rb_define_alias(klass, "wzl=", "memptrl=");
785
785
  rb_define_alias(klass, "vf", "pf" );
786
786
  rb_define_alias(klass, "vf=", "pf=" );
787
787
  rb_define_alias(klass, "state", "to_h" );
data/lib/z80/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class Z80
2
- VERSION = '0.1.0'
2
+ VERSION = '0.2.0'
3
3
  end
data/lib/z80.rb CHANGED
@@ -1,2 +1,2 @@
1
- require 'z80/version'
2
1
  require 'z80/z80'
2
+ require 'z80/version'
data/z80.gemspec ADDED
@@ -0,0 +1,49 @@
1
+ require_relative 'lib/z80/version'
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'z80'
5
+ s.version = Z80::VERSION
6
+ s.author = 'Manuel Sainz de Baranda y Goñi'
7
+ s.email = 'manuel@zxe.io'
8
+ s.homepage = 'https://zxe.io/software/Z80-Ruby'
9
+ s.license = '0BSD'
10
+ s.summary = "Ruby binding for the Z80 library."
11
+
12
+ s.description = <<~EOS
13
+ Z80-Ruby is a Ruby binding for the Zilog Z80 CPU emulator \
14
+ (https://github.com/redcode/Z80). It is ideal for analysis, \
15
+ hacking, testing and debugging. All from the comfort of Ruby.
16
+ EOS
17
+
18
+ s.metadata = {
19
+ 'bug_tracker_uri' => "https://github.com/redcode/Z80-Ruby/issues",
20
+ 'changelog_uri' => 'https://github.com/redcode/Z80-Ruby/blob/master/CHANGELOG.md',
21
+ 'documentation_uri' => 'https://zxe.io/software/Z80/documentation/latest',
22
+ 'github_repo' => 'ssh://github.com/redcode/Z80-Ruby',
23
+ 'homepage_uri' => 'https://zxe.io/software/Z80-Ruby',
24
+ 'source_code_uri' => 'https://github.com/redcode/Z80-Ruby'
25
+ }
26
+
27
+ s.files = [
28
+ # `git ls-files | sort`.split("\n")
29
+ '.editorconfig',
30
+ '.github/FUNDING.yml',
31
+ '.github/workflows/build-and-test-extension.yml',
32
+ '.github/workflows/publish-gem.yml',
33
+ '.gitignore',
34
+ 'CHANGELOG.md',
35
+ 'CITATION.cff',
36
+ 'Gemfile',
37
+ 'LICENSE-0BSD',
38
+ 'README.md',
39
+ 'Rakefile',
40
+ 'ext/z80/extconf.rb',
41
+ 'ext/z80/z80.c',
42
+ 'lib/z80.rb',
43
+ 'lib/z80/version.rb',
44
+ 'z80.gemspec'
45
+ ]
46
+
47
+ s.extensions = %w(ext/z80/extconf.rb)
48
+ s.add_development_dependency 'rake-compiler', '~> 1.2', '>= 1.2.0'
49
+ end
metadata CHANGED
@@ -1,15 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: z80
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Manuel Sainz de Baranda y Goñi
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-12-24 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2024-01-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake-compiler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.2'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.2.0
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.2'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.2.0
13
33
  description: 'Z80-Ruby is a Ruby binding for the Zilog Z80 CPU emulator (https://github.com/redcode/Z80).
14
34
  It is ideal for analysis, hacking, testing and debugging. All from the comfort of
15
35
  Ruby.
@@ -23,8 +43,12 @@ extra_rdoc_files: []
23
43
  files:
24
44
  - ".editorconfig"
25
45
  - ".github/FUNDING.yml"
46
+ - ".github/workflows/build-and-test-extension.yml"
47
+ - ".github/workflows/publish-gem.yml"
26
48
  - ".gitignore"
27
49
  - CHANGELOG.md
50
+ - CITATION.cff
51
+ - Gemfile
28
52
  - LICENSE-0BSD
29
53
  - README.md
30
54
  - Rakefile
@@ -32,15 +56,18 @@ files:
32
56
  - ext/z80/z80.c
33
57
  - lib/z80.rb
34
58
  - lib/z80/version.rb
35
- homepage: https://zxe.io/software/Z80
59
+ - z80.gemspec
60
+ homepage: https://zxe.io/software/Z80-Ruby
36
61
  licenses:
37
62
  - 0BSD
38
63
  metadata:
39
64
  bug_tracker_uri: https://github.com/redcode/Z80-Ruby/issues
40
65
  changelog_uri: https://github.com/redcode/Z80-Ruby/blob/master/CHANGELOG.md
41
- homepage_uri: https://zxe.io/software/Z80
66
+ documentation_uri: https://zxe.io/software/Z80/documentation/latest
67
+ github_repo: ssh://github.com/redcode/Z80-Ruby
68
+ homepage_uri: https://zxe.io/software/Z80-Ruby
42
69
  source_code_uri: https://github.com/redcode/Z80-Ruby
43
- post_install_message:
70
+ post_install_message:
44
71
  rdoc_options: []
45
72
  require_paths:
46
73
  - lib
@@ -55,8 +82,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
55
82
  - !ruby/object:Gem::Version
56
83
  version: '0'
57
84
  requirements: []
58
- rubygems_version: 3.5.0.dev
59
- signing_key:
85
+ rubygems_version: 3.2.33
86
+ signing_key:
60
87
  specification_version: 4
61
88
  summary: Ruby binding for the Z80 library.
62
89
  test_files: []