badline 0.10.1 → 0.11.1

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.
Files changed (126) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +23 -0
  3. data/CLAUDE.md +25 -6
  4. data/CONTRIBUTING.md +8 -3
  5. data/README.md +63 -4
  6. data/doc/pinned-behaviour.md +75 -0
  7. data/doc/snapshots.md +15 -0
  8. data/lib/badline/address_bus/pla.rb +3 -16
  9. data/lib/badline/address_bus.rb +14 -0
  10. data/lib/badline/c128/banks.rb +35 -0
  11. data/lib/badline/c128/bus.rb +347 -0
  12. data/lib/badline/c128/bus_state.rb +53 -0
  13. data/lib/badline/c128/color_lines.rb +39 -0
  14. data/lib/badline/c128/cpu.rb +10 -0
  15. data/lib/badline/c128/drives.rb +95 -0
  16. data/lib/badline/c128/fast_serial.rb +62 -0
  17. data/lib/badline/c128/keys.rb +35 -0
  18. data/lib/badline/c128/mmu.rb +197 -0
  19. data/lib/badline/c128/mmu_pages.rb +105 -0
  20. data/lib/badline/c128/model.rb +39 -0
  21. data/lib/badline/c128/modes.rb +48 -0
  22. data/lib/badline/c128/saved_state.rb +121 -0
  23. data/lib/badline/c128/vdc/memory.rb +54 -0
  24. data/lib/badline/c128/vdc/painter.rb +143 -0
  25. data/lib/badline/c128/vdc/raster.rb +97 -0
  26. data/lib/badline/c128/vdc/window.rb +215 -0
  27. data/lib/badline/c128/vdc.rb +268 -0
  28. data/lib/badline/c128.rb +322 -0
  29. data/lib/badline/chrout_trap.rb +3 -0
  30. data/lib/badline/cia/fast_forward.rb +42 -0
  31. data/lib/badline/cia/serial.rb +12 -0
  32. data/lib/badline/cia/timer.rb +39 -0
  33. data/lib/badline/cia.rb +2 -0
  34. data/lib/badline/computer/attachments.rb +10 -13
  35. data/lib/badline/computer/kernal_traps.rb +29 -0
  36. data/lib/badline/computer.rb +5 -0
  37. data/lib/badline/drive/core.rb +172 -0
  38. data/lib/badline/{drive1541 → drive}/idle.rb +18 -19
  39. data/lib/badline/drive/idle_cpu.rb +28 -0
  40. data/lib/badline/{drive1541 → drive}/orbit.rb +2 -1
  41. data/lib/badline/drive/serial_lines.rb +73 -0
  42. data/lib/badline/{drive1541 → drive}/sleep.rb +4 -3
  43. data/lib/badline/drive/watch.rb +150 -0
  44. data/lib/badline/drive.rb +9 -0
  45. data/lib/badline/drive1541/bus.rb +5 -129
  46. data/lib/badline/drive1541/byte_ready.rb +48 -0
  47. data/lib/badline/drive1541/cpu.rb +1 -19
  48. data/lib/badline/drive1541/disk.rb +77 -20
  49. data/lib/badline/drive1541/disk_state.rb +7 -2
  50. data/lib/badline/drive1541/disk_via.rb +3 -0
  51. data/lib/badline/drive1541/mechanism.rb +48 -14
  52. data/lib/badline/drive1541/mechanism_state.rb +5 -4
  53. data/lib/badline/drive1541/rotation.rb +5 -5
  54. data/lib/badline/drive1541/serial_port.rb +4 -60
  55. data/lib/badline/drive1541.rb +13 -172
  56. data/lib/badline/drive1571/bus.rb +111 -0
  57. data/lib/badline/drive1571/cpu.rb +11 -0
  58. data/lib/badline/drive1571/serial_port.rb +37 -0
  59. data/lib/badline/drive1571/serial_via.rb +25 -0
  60. data/lib/badline/drive1571/wd1770.rb +34 -0
  61. data/lib/badline/drive1571.rb +225 -0
  62. data/lib/badline/frontend/app.rb +35 -22
  63. data/lib/badline/frontend/boot.rb +31 -1
  64. data/lib/badline/frontend/controls.rb +11 -0
  65. data/lib/badline/frontend/drive_led.rb +1 -1
  66. data/lib/badline/frontend/keys.rb +28 -1
  67. data/lib/badline/frontend/machine_window.rb +16 -13
  68. data/lib/badline/frontend/menu_media.rb +3 -3
  69. data/lib/badline/frontend/menu_pages.rb +8 -2
  70. data/lib/badline/frontend/menu_ports.rb +1 -1
  71. data/lib/badline/frontend/pause_menu.rb +1 -0
  72. data/lib/badline/frontend/screen.rb +33 -8
  73. data/lib/badline/frontend/screens.rb +90 -0
  74. data/lib/badline/frontend/timeline.rb +15 -4
  75. data/lib/badline/frontend.rb +1 -0
  76. data/lib/badline/iec_bus.rb +54 -4
  77. data/lib/badline/kernal_trap/file.rb +1 -1
  78. data/lib/badline/kernal_trap/layout.rb +58 -8
  79. data/lib/badline/kernal_trap/load.rb +1 -1
  80. data/lib/badline/kernal_trap/save.rb +1 -1
  81. data/lib/badline/kernal_trap/serial.rb +5 -0
  82. data/lib/badline/machine.rb +20 -9
  83. data/lib/badline/media/true_drive.rb +26 -23
  84. data/lib/badline/media.rb +8 -6
  85. data/lib/badline/options/event.rb +5 -1
  86. data/lib/badline/options/family.rb +52 -0
  87. data/lib/badline/options/help.rb +7 -2
  88. data/lib/badline/options/table.rb +8 -2
  89. data/lib/badline/options/validation.rb +14 -1
  90. data/lib/badline/options.rb +20 -19
  91. data/lib/badline/roms/README +36 -0
  92. data/lib/badline/roms/c128/basic.rom +0 -0
  93. data/lib/badline/roms/c128/character.rom +0 -0
  94. data/lib/badline/roms/c128/kernal.rom +0 -0
  95. data/lib/badline/roms/dos1571.rom +0 -0
  96. data/lib/badline/snapshot/container.rb +2 -0
  97. data/lib/badline/snapshot/image.rb +14 -0
  98. data/lib/badline/snapshot.rb +9 -2
  99. data/lib/badline/storage/d64_image.rb +3 -0
  100. data/lib/badline/storage/d71_image.rb +9 -4
  101. data/lib/badline/storage/g64_image.rb +7 -2
  102. data/lib/badline/time_of_day.rb +9 -0
  103. data/lib/badline/version.rb +1 -1
  104. data/lib/badline/via/fast_forward.rb +3 -3
  105. data/lib/badline/vic/display_state.rb +12 -0
  106. data/lib/badline/vic/registers.rb +3 -0
  107. data/lib/badline/vic.rb +108 -7
  108. data/lib/badline/vic20/attachments.rb +6 -0
  109. data/lib/badline/z80/arithmetic.rb +117 -0
  110. data/lib/badline/z80/bit_page.rb +55 -0
  111. data/lib/badline/z80/block_io.rb +58 -0
  112. data/lib/badline/z80/block_transfers.rb +59 -0
  113. data/lib/badline/z80/bus_cycles.rb +111 -0
  114. data/lib/badline/z80/core.rb +111 -0
  115. data/lib/badline/z80/exchanges.rb +50 -0
  116. data/lib/badline/z80/extended_page.rb +89 -0
  117. data/lib/badline/z80/flags.rb +37 -0
  118. data/lib/badline/z80/interrupt_acceptance.rb +46 -0
  119. data/lib/badline/z80/jumps.rb +82 -0
  120. data/lib/badline/z80/loads.rb +98 -0
  121. data/lib/badline/z80/main_page.rb +134 -0
  122. data/lib/badline/z80/registers.rb +120 -0
  123. data/lib/badline/z80/shifts.rb +64 -0
  124. data/lib/badline/z80.rb +11 -0
  125. data/lib/badline.rb +1 -0
  126. metadata +59 -4
@@ -0,0 +1,120 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Badline
4
+ class Z80
5
+ # The register file. Opcodes name 8-bit registers by a 3-bit index,
6
+ # B C D E H L (HL) A, and pairs by a 2-bit one, BC DE HL SP, or BC DE
7
+ # HL AF for PUSH and POP. After a DD or FD prefix, HL means IX or IY
8
+ # and H and L their halves, except beside an (IX+d) operand.
9
+ module Registers
10
+ attr_accessor :a, :f, :b, :c, :d, :e, :h, :l, :i, :r, :pc, :sp, :ix, :iy, :wz, :im, :q,
11
+ :af_alt, :bc_alt, :de_alt, :hl_alt, :iff1, :iff2, :halted, :after_ei, :after_ld_a_ir
12
+
13
+ def af = (@a << 8) | @f
14
+ def bc = (@b << 8) | @c
15
+ def de = (@d << 8) | @e
16
+ def hl = (@h << 8) | @l
17
+
18
+ def af=(value)
19
+ @a = value >> 8
20
+ @f = value & 0xff
21
+ end
22
+
23
+ def bc=(value)
24
+ @b = value >> 8
25
+ @c = value & 0xff
26
+ end
27
+
28
+ def de=(value)
29
+ @d = value >> 8
30
+ @e = value & 0xff
31
+ end
32
+
33
+ def hl=(value)
34
+ @h = value >> 8
35
+ @l = value & 0xff
36
+ end
37
+
38
+ private
39
+
40
+ def register(index)
41
+ case index
42
+ when 0 then @b
43
+ when 1 then @c
44
+ when 2 then @d
45
+ when 3 then @e
46
+ when 4 then @prefix.zero? ? @h : index_register >> 8
47
+ when 5 then @prefix.zero? ? @l : index_register & 0xff
48
+ else @a
49
+ end
50
+ end
51
+
52
+ def set_register(index, value)
53
+ case index
54
+ when 0 then @b = value
55
+ when 1 then @c = value
56
+ when 2 then @d = value
57
+ when 3 then @e = value
58
+ when 4 then @prefix.zero? ? @h = value : self.index_register = (index_register & 0xff) | (value << 8)
59
+ when 5 then @prefix.zero? ? @l = value : self.index_register = (index_register & 0xff00) | value
60
+ else @a = value
61
+ end
62
+ end
63
+
64
+ # The register an (HL) or (IX+d) operand sits beside: H and L are
65
+ # always themselves.
66
+ def plain_register(index)
67
+ case index
68
+ when 4 then @h
69
+ when 5 then @l
70
+ else register(index)
71
+ end
72
+ end
73
+
74
+ def set_plain_register(index, value)
75
+ case index
76
+ when 4 then @h = value
77
+ when 5 then @l = value
78
+ else set_register(index, value)
79
+ end
80
+ end
81
+
82
+ def pair(index)
83
+ case index
84
+ when 0 then bc
85
+ when 1 then de
86
+ when 2 then hl_or_index
87
+ else @sp
88
+ end
89
+ end
90
+
91
+ def set_pair(index, value)
92
+ case index
93
+ when 0 then self.bc = value
94
+ when 1 then self.de = value
95
+ when 2 then self.hl_or_index = value
96
+ else @sp = value
97
+ end
98
+ end
99
+
100
+ # The pairs PUSH and POP name, with AF in place of SP.
101
+ def stack_pair(index) = index == 3 ? af : pair(index)
102
+
103
+ def set_stack_pair(index, value)
104
+ index == 3 ? self.af = value : set_pair(index, value)
105
+ end
106
+
107
+ def hl_or_index = @prefix.zero? ? hl : index_register
108
+
109
+ def hl_or_index=(value)
110
+ @prefix.zero? ? self.hl = value : self.index_register = value
111
+ end
112
+
113
+ def index_register = @prefix == 1 ? @ix : @iy
114
+
115
+ def index_register=(value)
116
+ @prefix == 1 ? @ix = value : @iy = value
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Badline
4
+ class Z80
5
+ # Rotates, shifts and the bit operations.
6
+ module Shifts
7
+ private
8
+
9
+ # RLCA RRCA RLA RRA, which leave S, Z and P/V alone.
10
+ def rotate_a(operation)
11
+ carry = operation.even? ? @a >> 7 : @a & 1
12
+ @a = shifted(operation, @a, carry)
13
+ assign_flags((@f & (SF | ZF | PF)) | (@a & XYF) | carry)
14
+ end
15
+
16
+ # The CB page's rotates and shifts by bits 5-3: RLC RRC RL RR SLA SRA
17
+ # SLL SRL. SLL shifts a 1 in.
18
+ def shift(operation, value)
19
+ carry = operation.even? ? value >> 7 : value & 1
20
+ result = shifted(operation, value, carry)
21
+ assign_flags(SZ53P[result] | carry)
22
+ result
23
+ end
24
+
25
+ def shifted(operation, value, carry)
26
+ case operation
27
+ when 0 then ((value << 1) | carry) & 0xff
28
+ when 1 then (value >> 1) | (carry << 7)
29
+ when 2 then ((value << 1) | (@f & CF)) & 0xff
30
+ when 3 then (value >> 1) | ((@f & CF) << 7)
31
+ when 4 then (value << 1) & 0xff
32
+ when 5 then (value >> 1) | (value & 0x80)
33
+ when 6 then ((value << 1) | 1) & 0xff
34
+ else value >> 1
35
+ end
36
+ end
37
+
38
+ # BIT n tests a bit of +value+ and copies bits 5 and 3 from +source+:
39
+ # the operand for a register, WZ's high byte for a memory operand.
40
+ def bit(number, value, source)
41
+ tested = value & (1 << number)
42
+ flags = (@f & CF) | HF | (source & XYF) | (tested & SF)
43
+ flags |= ZF | PF if tested.zero?
44
+ assign_flags(flags)
45
+ end
46
+
47
+ # RRD and RLD rotate a digit through A and (HL).
48
+ def rotate_digits(left)
49
+ address = hl
50
+ value = read_byte(address)
51
+ @cycles += 4
52
+ if left
53
+ write_byte(address, ((value << 4) | (@a & 0x0f)) & 0xff)
54
+ @a = (@a & 0xf0) | (value >> 4)
55
+ else
56
+ write_byte(address, ((@a << 4) | (value >> 4)) & 0xff)
57
+ @a = (@a & 0xf0) | (value & 0x0f)
58
+ end
59
+ @wz = (address + 1) & 0xffff
60
+ assign_flags((@f & CF) | SZ53P[@a])
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "badline/z80/core"
4
+
5
+ module Badline
6
+ # The Zilog Z80 (NMOS), which the C128 has beside its 8502. It is not
7
+ # part of badline/core, so a machine that has one requires it.
8
+ class Z80
9
+ include Core
10
+ end
11
+ end
data/lib/badline.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "badline/core"
4
+ require "badline/c128"
4
5
  require "badline/options"
5
6
  require "badline/data_path"
6
7
  require "badline/snapshot"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: badline
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.1
4
+ version: 0.11.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Inge Jørgensen
@@ -71,6 +71,25 @@ files:
71
71
  - lib/badline/audio/stereo.rb
72
72
  - lib/badline/audio/terminal.rb
73
73
  - lib/badline/audio/wav.rb
74
+ - lib/badline/c128.rb
75
+ - lib/badline/c128/banks.rb
76
+ - lib/badline/c128/bus.rb
77
+ - lib/badline/c128/bus_state.rb
78
+ - lib/badline/c128/color_lines.rb
79
+ - lib/badline/c128/cpu.rb
80
+ - lib/badline/c128/drives.rb
81
+ - lib/badline/c128/fast_serial.rb
82
+ - lib/badline/c128/keys.rb
83
+ - lib/badline/c128/mmu.rb
84
+ - lib/badline/c128/mmu_pages.rb
85
+ - lib/badline/c128/model.rb
86
+ - lib/badline/c128/modes.rb
87
+ - lib/badline/c128/saved_state.rb
88
+ - lib/badline/c128/vdc.rb
89
+ - lib/badline/c128/vdc/memory.rb
90
+ - lib/badline/c128/vdc/painter.rb
91
+ - lib/badline/c128/vdc/raster.rb
92
+ - lib/badline/c128/vdc/window.rb
74
93
  - lib/badline/cartridge.rb
75
94
  - lib/badline/cartridge/action_replay.rb
76
95
  - lib/badline/cartridge/atomic_power.rb
@@ -102,6 +121,7 @@ files:
102
121
  - lib/badline/checkpoint.rb
103
122
  - lib/badline/chrout_trap.rb
104
123
  - lib/badline/cia.rb
124
+ - lib/badline/cia/fast_forward.rb
105
125
  - lib/badline/cia/interrupt_register.rb
106
126
  - lib/badline/cia/serial.rb
107
127
  - lib/badline/cia/state.rb
@@ -109,6 +129,7 @@ files:
109
129
  - lib/badline/color_memory.rb
110
130
  - lib/badline/computer.rb
111
131
  - lib/badline/computer/attachments.rb
132
+ - lib/badline/computer/kernal_traps.rb
112
133
  - lib/badline/computer/saved_state.rb
113
134
  - lib/badline/control_ports.rb
114
135
  - lib/badline/core.rb
@@ -124,22 +145,34 @@ files:
124
145
  - lib/badline/data_path.rb
125
146
  - lib/badline/datasette.rb
126
147
  - lib/badline/debug_register.rb
148
+ - lib/badline/drive.rb
149
+ - lib/badline/drive/core.rb
150
+ - lib/badline/drive/idle.rb
151
+ - lib/badline/drive/idle_cpu.rb
152
+ - lib/badline/drive/orbit.rb
153
+ - lib/badline/drive/serial_lines.rb
154
+ - lib/badline/drive/sleep.rb
155
+ - lib/badline/drive/watch.rb
127
156
  - lib/badline/drive1541.rb
128
157
  - lib/badline/drive1541/bus.rb
158
+ - lib/badline/drive1541/byte_ready.rb
129
159
  - lib/badline/drive1541/cpu.rb
130
160
  - lib/badline/drive1541/disk.rb
131
161
  - lib/badline/drive1541/disk_state.rb
132
162
  - lib/badline/drive1541/disk_via.rb
133
163
  - lib/badline/drive1541/gcr.rb
134
- - lib/badline/drive1541/idle.rb
135
164
  - lib/badline/drive1541/mechanism.rb
136
165
  - lib/badline/drive1541/mechanism_state.rb
137
- - lib/badline/drive1541/orbit.rb
138
166
  - lib/badline/drive1541/rotation.rb
139
167
  - lib/badline/drive1541/sector_reader.rb
140
168
  - lib/badline/drive1541/serial_port.rb
141
- - lib/badline/drive1541/sleep.rb
142
169
  - lib/badline/drive1541/track.rb
170
+ - lib/badline/drive1571.rb
171
+ - lib/badline/drive1571/bus.rb
172
+ - lib/badline/drive1571/cpu.rb
173
+ - lib/badline/drive1571/serial_port.rb
174
+ - lib/badline/drive1571/serial_via.rb
175
+ - lib/badline/drive1571/wd1770.rb
143
176
  - lib/badline/ffi.rb
144
177
  - lib/badline/frontend.rb
145
178
  - lib/badline/frontend/app.rb
@@ -174,6 +207,7 @@ files:
174
207
  - lib/badline/frontend/player_window.rb
175
208
  - lib/badline/frontend/scope.rb
176
209
  - lib/badline/frontend/screen.rb
210
+ - lib/badline/frontend/screens.rb
177
211
  - lib/badline/frontend/screenshot.rb
178
212
  - lib/badline/frontend/sid_history.rb
179
213
  - lib/badline/frontend/sid_view.rb
@@ -229,6 +263,7 @@ files:
229
263
  - lib/badline/model.rb
230
264
  - lib/badline/options.rb
231
265
  - lib/badline/options/event.rb
266
+ - lib/badline/options/family.rb
232
267
  - lib/badline/options/help.rb
233
268
  - lib/badline/options/option.rb
234
269
  - lib/badline/options/table.rb
@@ -248,9 +283,13 @@ files:
248
283
  - lib/badline/rom.rb
249
284
  - lib/badline/roms/README
250
285
  - lib/badline/roms/basic.rom
286
+ - lib/badline/roms/c128/basic.rom
287
+ - lib/badline/roms/c128/character.rom
288
+ - lib/badline/roms/c128/kernal.rom
251
289
  - lib/badline/roms/c64gs.rom
252
290
  - lib/badline/roms/character.rom
253
291
  - lib/badline/roms/dos1541.rom
292
+ - lib/badline/roms/dos1571.rom
254
293
  - lib/badline/roms/eapi/LICENSE.md
255
294
  - lib/badline/roms/eapi/README
256
295
  - lib/badline/roms/eapi/eapi-am29f040-14
@@ -362,6 +401,22 @@ files:
362
401
  - lib/badline/vic20/vic/painter.rb
363
402
  - lib/badline/vic20/vic/saved_state.rb
364
403
  - lib/badline/vic20/vic/text_window.rb
404
+ - lib/badline/z80.rb
405
+ - lib/badline/z80/arithmetic.rb
406
+ - lib/badline/z80/bit_page.rb
407
+ - lib/badline/z80/block_io.rb
408
+ - lib/badline/z80/block_transfers.rb
409
+ - lib/badline/z80/bus_cycles.rb
410
+ - lib/badline/z80/core.rb
411
+ - lib/badline/z80/exchanges.rb
412
+ - lib/badline/z80/extended_page.rb
413
+ - lib/badline/z80/flags.rb
414
+ - lib/badline/z80/interrupt_acceptance.rb
415
+ - lib/badline/z80/jumps.rb
416
+ - lib/badline/z80/loads.rb
417
+ - lib/badline/z80/main_page.rb
418
+ - lib/badline/z80/registers.rb
419
+ - lib/badline/z80/shifts.rb
365
420
  - packaging/homebrew/badline.rb
366
421
  homepage: https://github.com/elektronaut/badline
367
422
  licenses: