burn 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/README.md +56 -569
  2. data/lib/burn.rb +5 -3
  3. data/lib/burn/cli.rb +160 -199
  4. data/lib/burn/config.rb +4 -0
  5. data/lib/burn/config/app.rb +15 -0
  6. data/lib/burn/config/config_base.rb +16 -0
  7. data/lib/burn/config/loader.rb +23 -0
  8. data/lib/burn/config/server.rb +11 -0
  9. data/lib/burn/fuel.rb +11 -0
  10. data/lib/burn/{dsl → fuel}/dsl_base.rb +1 -1
  11. data/lib/burn/fuel/rom/channel_stream.rb +106 -0
  12. data/lib/burn/fuel/rom/declare.rb +43 -0
  13. data/lib/burn/fuel/rom/music.rb +37 -0
  14. data/lib/burn/fuel/rom/note.rb +126 -0
  15. data/lib/burn/fuel/rom/scene.rb +279 -0
  16. data/lib/burn/fuel/rom/sound.rb +31 -0
  17. data/lib/burn/fuel/rom/sound_effect.rb +92 -0
  18. data/lib/burn/fuel/telnet/declare.rb +26 -0
  19. data/lib/burn/fuel/telnet/scene.rb +112 -0
  20. data/lib/burn/generator.rb +10 -3
  21. data/lib/burn/generator/rom/assembly_music.rb +49 -0
  22. data/lib/burn/generator/rom/assembly_sound_effect.rb +35 -0
  23. data/lib/burn/generator/rom/c_source.rb +55 -0
  24. data/lib/burn/generator/{template → rom/template}/mus_template.s +0 -0
  25. data/lib/burn/generator/{template → rom/template}/template.c +0 -0
  26. data/lib/burn/generator/rom_builder.rb +67 -0
  27. data/lib/burn/generator/telnet/jit_compiler.rb +41 -0
  28. data/lib/burn/generator/telnet/screen.rb +86 -0
  29. data/lib/burn/generator/telnet/sprite.rb +16 -0
  30. data/lib/burn/generator/telnet/user_input.rb +25 -0
  31. data/lib/burn/generator/telnet_vm.rb +50 -0
  32. data/lib/burn/pxes.rb +3 -0
  33. data/lib/burn/{util/pxes.rb → pxes/cc65_transpiler.rb} +8 -14
  34. data/lib/burn/pxes/cruby_transpiler.rb +189 -0
  35. data/lib/burn/pxes/transpiler_base.rb +14 -0
  36. data/lib/burn/server.rb +2 -0
  37. data/lib/burn/server/rom.rb +24 -0
  38. data/lib/burn/server/telnet.rb +120 -0
  39. data/lib/burn/util.rb +1 -2
  40. data/lib/burn/util/logo.rb +68 -0
  41. data/lib/burn/util/os.rb +1 -1
  42. data/lib/burn/version.rb +1 -1
  43. metadata +53 -19
  44. data/lib/burn/builder.rb +0 -65
  45. data/lib/burn/dsl.rb +0 -8
  46. data/lib/burn/dsl/channel_stream.rb +0 -105
  47. data/lib/burn/dsl/declare.rb +0 -42
  48. data/lib/burn/dsl/music.rb +0 -36
  49. data/lib/burn/dsl/note.rb +0 -125
  50. data/lib/burn/dsl/scene.rb +0 -278
  51. data/lib/burn/dsl/sound.rb +0 -30
  52. data/lib/burn/dsl/sound_effect.rb +0 -91
  53. data/lib/burn/generator/assembly_music.rb +0 -47
  54. data/lib/burn/generator/assembly_sound_effect.rb +0 -33
  55. data/lib/burn/generator/c_source.rb +0 -54
  56. data/lib/burn/util/server.rb +0 -21
@@ -1,30 +0,0 @@
1
- module Burn
2
- module Dsl
3
- class Sound < DslBase
4
- def initialize(resource_name, context)
5
- super(resource_name, context)
6
-
7
- if resource_name.nil? then
8
- raise Exception.new "Resource name for Sound class must be provided."
9
- else
10
- @resource_name = resource_name
11
- end
12
-
13
- @context.instance_exec resource_name, &lambda{|resource_name|
14
- @resources["#{resource_name}"] = Array.new
15
- }
16
-
17
- @se = SoundEffect.new
18
-
19
- end
20
-
21
- def effect(&block)
22
- @context.instance_exec(@resource_name,@se) do |resource_name,se|
23
- se.load(&block)
24
- @resources["#{resource_name}"] << se.generate
25
- end
26
- end
27
-
28
- end
29
- end
30
- end
@@ -1,91 +0,0 @@
1
- module Burn
2
- module Dsl
3
- class SoundEffect
4
- # duty cycle: 00�F12.5%�@01�F25%�@10�F50%�@11�F75%
5
- LOWEST = 0
6
- LOWER = 1
7
- HIGHER = 2
8
- HIGHEST = 3
9
-
10
- def initialize
11
- @output_buffer = Array.new
12
- end
13
-
14
- def load(&block)
15
- self.instance_eval &block
16
- end
17
-
18
- # $4000 related
19
- def duty_cycle(ratio)
20
- @duty_cycle = SoundEffect.const_get(ratio.upcase)
21
- end
22
-
23
- def velocity(level)
24
- @velocity = level
25
- end
26
-
27
- def envelope_decay(flag)
28
- @envelope_decay = flag==:enable ? 0 : 1
29
- end
30
-
31
- def envelope_decay_loop(flag)
32
- @envelope_decay_loop = flag==:enable ? 1 : 0
33
- end
34
-
35
- def length_counter_clock(flag)
36
- @envelope_decay_loop = flag==:enable ? 0 : 1
37
- end
38
-
39
- # $4001 related
40
- def pitch(i)
41
- @pitch = i
42
- end
43
-
44
- def length(i)
45
- @length = i + 15
46
- end
47
-
48
- alias_method :envelope_decay_rate, :velocity
49
- alias_method :volume, :velocity
50
- alias_method :envelope, :envelope_decay
51
- alias_method :envelope_loop, :envelope_decay_loop
52
- alias_method :key_off_counter, :length_counter_clock
53
-
54
- def generate
55
- if !@duty_cycle.nil? || !@velocity.nil? || @envelope_decay.nil? || @envelope_decay_loop.nil? then
56
- @duty_cycle = HIGHER if !@duty_cycle.nil?
57
- @velocity = 7 if @velocity.nil?
58
- @envelope_decay = 0 if @envelope_decay.nil?
59
- @envelope_decay_loop = 0 if @envelope_decay_loop.nil?
60
-
61
- reg = @duty_cycle*64 + @envelope_decay*32 + @envelope_decay_loop*16 + @velocity
62
- if @reg4000 != reg then
63
- @output_buffer << " .byte $00,$%02x" % reg
64
- @reg4000 = reg
65
- end
66
- end
67
-
68
- if !@pitch.nil? then
69
- if @reg4001 != @pitch then
70
- @output_buffer << " .byte $01,$%02x" % @pitch
71
- @reg4001 = @pitch
72
- end
73
- end
74
-
75
- @length = 16 if @length.nil?
76
- @output_buffer << " .byte $%02x" % @length
77
-
78
- # return result
79
- @output_buffer.join("\n") + "\n"
80
-
81
- #" .byte $00,$7f\n .byte $01,$ab\n .byte $02,$01\n .byte $13\n .byte $01,$3f\n .byte $39\n .byte $01,$1c\n .byte $13\n .byte $ff\n"
82
- end
83
-
84
- private
85
- def __translate
86
- " .byte " + @notes.map{|p| "$%02x" % p}.join(",")
87
- end
88
-
89
- end
90
- end
91
- end
@@ -1,47 +0,0 @@
1
- module Burn
2
- module Generator
3
- class AssemblyMusic
4
- include Debug
5
-
6
- def initialize(workspace_root)
7
- # Generic
8
- @workspace_root = workspace_root
9
-
10
- # Music related
11
- @resources = {}
12
-
13
- #@channels = Array.new
14
-
15
- end
16
-
17
- def get_context
18
- self
19
- end
20
-
21
- def generate
22
- # prepare music.s - music assembler file
23
- File.write(
24
- "#{@workspace_root}/tmp/burn/asset/music.s",
25
- File.read("#{@workspace_root}/tmp/burn/asset/music.s")
26
- .gsub(/__@__EXPORT__@__/, @resources.keys.map{|p| " .export _music_#{p}"}.join("\n"))
27
- .gsub(/__@__INCLUDE__@__/, @resources.keys.map{|p| "_music_#{p}: .include \"mus_#{p}.s\""}.join("\n"))
28
- )
29
-
30
- # preparing each song file
31
- @resources.each {|resource_name, channels|
32
- # prepare other music resources
33
- File.write( "#{@workspace_root}/tmp/burn/asset/mus_#{resource_name}.s",
34
- File.read(File.dirname(__FILE__)+"/template/mus_template.s")
35
- .gsub(/__@__NAME__@__/, resource_name)
36
- .gsub(/__@__CHANNEL1__@__/, channels.shift || "")
37
- .gsub(/__@__CHANNEL2__@__/, channels.shift || "")
38
- .gsub(/__@__CHANNEL3__@__/, channels.shift || "")
39
- .gsub(/__@__CHANNEL4__@__/, channels.shift || "")
40
- .gsub(/__@__CHANNEL5__@__/, channels.shift || "")
41
- )
42
- }
43
-
44
- end
45
- end
46
- end
47
- end
@@ -1,33 +0,0 @@
1
- module Burn
2
- module Generator
3
- class AssemblySoundEffect
4
- include Debug
5
- attr_reader :resources
6
-
7
- def initialize(workspace_root)
8
- # Generic
9
- @workspace_root = workspace_root
10
-
11
- # Music related
12
- @resources = {}
13
-
14
- end
15
-
16
- def get_context
17
- self
18
- end
19
-
20
- def generate
21
- # prepare sound.s - sound effect assembler file
22
- File.write(
23
- "#{@workspace_root}/tmp/burn/asset/sounds.s",
24
- "sounds:\n" \
25
- + @resources.keys.map{|p| " .word @#{p}"}.join("\n") \
26
- + "\n" \
27
- + @resources.map{|key,value| "@#{key}:\n#{value.join} .byte $ff\n" }.join
28
- )
29
-
30
- end
31
- end
32
- end
33
- end
@@ -1,54 +0,0 @@
1
- module Burn
2
- module Generator
3
- class CSource
4
- include Debug
5
- attr_reader :global, :code_blocks
6
-
7
- def initialize(workspace_root)
8
- # Generic
9
- @workspace_root = workspace_root
10
- @global = Array.new
11
- @code_blocks = Array.new
12
-
13
- # Scene related
14
- @pattern_tables = Array.new
15
- @pattern_table_pointer = 80 #0x50 equivalent
16
- @pattern_table_index = Hash.new
17
- end
18
-
19
- def get_context
20
- self
21
- end
22
-
23
- def generate
24
- # Initialization for codeblocks
25
- @code_blocks.unshift "init();"
26
-
27
- # generate source code
28
- File.write(
29
- "#{@workspace_root}/tmp/burn/main.c",
30
- File.read(File.dirname(__FILE__) + "/template/template.c")
31
- .gsub(/__@__MAIN__@__/, @code_blocks.join("\n"))
32
- .gsub(/__@__GLOBAL__@__/, @global.join("\n"))
33
- )
34
-
35
- # save pattern tables associated with source code
36
- pattern_header = []
37
- File.open("#{@workspace_root}/tmp/burn/asset/tileset.chr", "rb") do |f|
38
- pattern_header << f.read(16*80)
39
- end
40
- File.open("#{@workspace_root}/tmp/burn/asset/tileset.chr", "wb") do |f|
41
- f << pattern_header[0]
42
- @pattern_tables.each do |p|
43
- f << p
44
- end
45
- (8192-16*80-@pattern_tables.count*16).times do |i|
46
- f << ["0x00"].pack("B*")
47
- end
48
- end
49
-
50
- end
51
-
52
- end
53
- end
54
- end
@@ -1,21 +0,0 @@
1
- module Burn
2
- module Util
3
- class Server
4
- require 'webrick'
5
-
6
- def initialize(document_root)
7
- @server = WEBrick::HTTPServer.new({:DocumentRoot => document_root, :BindAddress => '127.0.0.1', :Port => 17890})
8
- trap 'INT' do
9
- @server.shutdown
10
- end
11
- @server.mount_proc('/shutdown'){ |req, resp|
12
- @server.stop
13
- }
14
- end
15
-
16
- def start
17
- @server.start
18
- end
19
- end
20
- end
21
- end