burn 0.1.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.
- data/LICENSE +621 -0
- data/README.md +467 -0
- data/Rakefile +1 -0
- data/bin/burn +14 -0
- data/lib/burn/builder.rb +65 -0
- data/lib/burn/cli.rb +187 -0
- data/lib/burn/debug.rb +25 -0
- data/lib/burn/dsl/channel_stream.rb +105 -0
- data/lib/burn/dsl/declare.rb +42 -0
- data/lib/burn/dsl/dsl_base.rb +31 -0
- data/lib/burn/dsl/music.rb +36 -0
- data/lib/burn/dsl/note.rb +125 -0
- data/lib/burn/dsl/scene.rb +278 -0
- data/lib/burn/dsl/sound.rb +30 -0
- data/lib/burn/dsl/sound_effect.rb +91 -0
- data/lib/burn/dsl.rb +8 -0
- data/lib/burn/generator/assembly_music.rb +47 -0
- data/lib/burn/generator/assembly_sound_effect.rb +33 -0
- data/lib/burn/generator/c_source.rb +54 -0
- data/lib/burn/generator/template/mus_template.s +49 -0
- data/lib/burn/generator/template/template.c +88 -0
- data/lib/burn/generator.rb +3 -0
- data/lib/burn/tools/mac/cc65/asminc/_file.inc +27 -0
- data/lib/burn/tools/mac/cc65/asminc/_heap.inc +35 -0
- data/lib/burn/tools/mac/cc65/asminc/apple2.inc +64 -0
- data/lib/burn/tools/mac/cc65/asminc/atari.inc +1175 -0
- data/lib/burn/tools/mac/cc65/asminc/atari.mac +59 -0
- data/lib/burn/tools/mac/cc65/asminc/atmos.inc +110 -0
- data/lib/burn/tools/mac/cc65/asminc/c128.inc +214 -0
- data/lib/burn/tools/mac/cc65/asminc/c16.inc +9 -0
- data/lib/burn/tools/mac/cc65/asminc/c64.inc +212 -0
- data/lib/burn/tools/mac/cc65/asminc/cbm.mac +50 -0
- data/lib/burn/tools/mac/cc65/asminc/cbm510.inc +182 -0
- data/lib/burn/tools/mac/cc65/asminc/cbm610.inc +110 -0
- data/lib/burn/tools/mac/cc65/asminc/cbm_filetype.inc +34 -0
- data/lib/burn/tools/mac/cc65/asminc/cpu.mac +24 -0
- data/lib/burn/tools/mac/cc65/asminc/ctype.inc +29 -0
- data/lib/burn/tools/mac/cc65/asminc/em-error.inc +49 -0
- data/lib/burn/tools/mac/cc65/asminc/em-kernel.inc +106 -0
- data/lib/burn/tools/mac/cc65/asminc/errno.inc +36 -0
- data/lib/burn/tools/mac/cc65/asminc/fcntl.inc +21 -0
- data/lib/burn/tools/mac/cc65/asminc/generic.mac +55 -0
- data/lib/burn/tools/mac/cc65/asminc/get_tv.inc +22 -0
- data/lib/burn/tools/mac/cc65/asminc/joy-error.inc +44 -0
- data/lib/burn/tools/mac/cc65/asminc/joy-kernel.inc +85 -0
- data/lib/burn/tools/mac/cc65/asminc/longbranch.mac +88 -0
- data/lib/burn/tools/mac/cc65/asminc/lynx.inc +279 -0
- data/lib/burn/tools/mac/cc65/asminc/modload.inc +78 -0
- data/lib/burn/tools/mac/cc65/asminc/mouse-kernel.inc +180 -0
- data/lib/burn/tools/mac/cc65/asminc/nes.inc +93 -0
- data/lib/burn/tools/mac/cc65/asminc/o65.inc +150 -0
- data/lib/burn/tools/mac/cc65/asminc/opcodes.inc +509 -0
- data/lib/burn/tools/mac/cc65/asminc/pet.inc +54 -0
- data/lib/burn/tools/mac/cc65/asminc/plus4.inc +86 -0
- data/lib/burn/tools/mac/cc65/asminc/ser-error.inc +54 -0
- data/lib/burn/tools/mac/cc65/asminc/ser-kernel.inc +162 -0
- data/lib/burn/tools/mac/cc65/asminc/signal.inc +57 -0
- data/lib/burn/tools/mac/cc65/asminc/smc.inc +245 -0
- data/lib/burn/tools/mac/cc65/asminc/stdio.inc +70 -0
- data/lib/burn/tools/mac/cc65/asminc/supervision.inc +76 -0
- data/lib/burn/tools/mac/cc65/asminc/tgi-error.inc +52 -0
- data/lib/burn/tools/mac/cc65/asminc/tgi-kernel.inc +234 -0
- data/lib/burn/tools/mac/cc65/asminc/tgi-vectorfont.inc +70 -0
- data/lib/burn/tools/mac/cc65/asminc/time.inc +59 -0
- data/lib/burn/tools/mac/cc65/asminc/utsname.inc +46 -0
- data/lib/burn/tools/mac/cc65/asminc/vic20.inc +75 -0
- data/lib/burn/tools/mac/cc65/asminc/zeropage.inc +26 -0
- data/lib/burn/tools/mac/cc65/bin/ca65 +0 -0
- data/lib/burn/tools/mac/cc65/bin/cc65 +0 -0
- data/lib/burn/tools/mac/cc65/bin/ld65 +0 -0
- data/lib/burn/tools/other/cc65/asminc/_file.inc +27 -0
- data/lib/burn/tools/other/cc65/asminc/_heap.inc +35 -0
- data/lib/burn/tools/other/cc65/asminc/apple2.inc +64 -0
- data/lib/burn/tools/other/cc65/asminc/atari.inc +1175 -0
- data/lib/burn/tools/other/cc65/asminc/atari.mac +59 -0
- data/lib/burn/tools/other/cc65/asminc/atmos.inc +110 -0
- data/lib/burn/tools/other/cc65/asminc/c128.inc +214 -0
- data/lib/burn/tools/other/cc65/asminc/c16.inc +9 -0
- data/lib/burn/tools/other/cc65/asminc/c64.inc +212 -0
- data/lib/burn/tools/other/cc65/asminc/cbm.mac +50 -0
- data/lib/burn/tools/other/cc65/asminc/cbm510.inc +182 -0
- data/lib/burn/tools/other/cc65/asminc/cbm610.inc +110 -0
- data/lib/burn/tools/other/cc65/asminc/cbm_filetype.inc +34 -0
- data/lib/burn/tools/other/cc65/asminc/cpu.mac +24 -0
- data/lib/burn/tools/other/cc65/asminc/ctype.inc +29 -0
- data/lib/burn/tools/other/cc65/asminc/em-error.inc +49 -0
- data/lib/burn/tools/other/cc65/asminc/em-kernel.inc +106 -0
- data/lib/burn/tools/other/cc65/asminc/errno.inc +36 -0
- data/lib/burn/tools/other/cc65/asminc/fcntl.inc +21 -0
- data/lib/burn/tools/other/cc65/asminc/generic.mac +55 -0
- data/lib/burn/tools/other/cc65/asminc/get_tv.inc +22 -0
- data/lib/burn/tools/other/cc65/asminc/joy-error.inc +44 -0
- data/lib/burn/tools/other/cc65/asminc/joy-kernel.inc +85 -0
- data/lib/burn/tools/other/cc65/asminc/longbranch.mac +88 -0
- data/lib/burn/tools/other/cc65/asminc/lynx.inc +279 -0
- data/lib/burn/tools/other/cc65/asminc/modload.inc +78 -0
- data/lib/burn/tools/other/cc65/asminc/mouse-kernel.inc +180 -0
- data/lib/burn/tools/other/cc65/asminc/nes.inc +93 -0
- data/lib/burn/tools/other/cc65/asminc/o65.inc +150 -0
- data/lib/burn/tools/other/cc65/asminc/opcodes.inc +509 -0
- data/lib/burn/tools/other/cc65/asminc/pet.inc +54 -0
- data/lib/burn/tools/other/cc65/asminc/plus4.inc +86 -0
- data/lib/burn/tools/other/cc65/asminc/ser-error.inc +54 -0
- data/lib/burn/tools/other/cc65/asminc/ser-kernel.inc +162 -0
- data/lib/burn/tools/other/cc65/asminc/signal.inc +57 -0
- data/lib/burn/tools/other/cc65/asminc/smc.inc +245 -0
- data/lib/burn/tools/other/cc65/asminc/stdio.inc +70 -0
- data/lib/burn/tools/other/cc65/asminc/supervision.inc +76 -0
- data/lib/burn/tools/other/cc65/asminc/tgi-error.inc +52 -0
- data/lib/burn/tools/other/cc65/asminc/tgi-kernel.inc +234 -0
- data/lib/burn/tools/other/cc65/asminc/tgi-vectorfont.inc +70 -0
- data/lib/burn/tools/other/cc65/asminc/time.inc +59 -0
- data/lib/burn/tools/other/cc65/asminc/utsname.inc +46 -0
- data/lib/burn/tools/other/cc65/asminc/vic20.inc +75 -0
- data/lib/burn/tools/other/cc65/asminc/zeropage.inc +26 -0
- data/lib/burn/tools/other/cc65/bin/ca65 +0 -0
- data/lib/burn/tools/other/cc65/bin/cc65 +0 -0
- data/lib/burn/tools/other/cc65/bin/ld65 +0 -0
- data/lib/burn/tools/win/cc65/asminc/_file.inc +27 -0
- data/lib/burn/tools/win/cc65/asminc/_heap.inc +35 -0
- data/lib/burn/tools/win/cc65/asminc/apple2.inc +64 -0
- data/lib/burn/tools/win/cc65/asminc/atari.inc +1101 -0
- data/lib/burn/tools/win/cc65/asminc/atmos.inc +31 -0
- data/lib/burn/tools/win/cc65/asminc/c128.inc +213 -0
- data/lib/burn/tools/win/cc65/asminc/c16.inc +9 -0
- data/lib/burn/tools/win/cc65/asminc/c64.inc +212 -0
- data/lib/burn/tools/win/cc65/asminc/cbm510.inc +182 -0
- data/lib/burn/tools/win/cc65/asminc/cbm610.inc +110 -0
- data/lib/burn/tools/win/cc65/asminc/ctype.inc +29 -0
- data/lib/burn/tools/win/cc65/asminc/em-error.inc +44 -0
- data/lib/burn/tools/win/cc65/asminc/em-kernel.inc +100 -0
- data/lib/burn/tools/win/cc65/asminc/errno.inc +36 -0
- data/lib/burn/tools/win/cc65/asminc/fcntl.inc +21 -0
- data/lib/burn/tools/win/cc65/asminc/get_tv.inc +22 -0
- data/lib/burn/tools/win/cc65/asminc/joy-error.inc +44 -0
- data/lib/burn/tools/win/cc65/asminc/joy-kernel.inc +85 -0
- data/lib/burn/tools/win/cc65/asminc/lynx.inc +273 -0
- data/lib/burn/tools/win/cc65/asminc/modload.inc +78 -0
- data/lib/burn/tools/win/cc65/asminc/mouse-kernel.inc +179 -0
- data/lib/burn/tools/win/cc65/asminc/nes.inc +93 -0
- data/lib/burn/tools/win/cc65/asminc/o65.inc +135 -0
- data/lib/burn/tools/win/cc65/asminc/pet.inc +45 -0
- data/lib/burn/tools/win/cc65/asminc/plus4.inc +87 -0
- data/lib/burn/tools/win/cc65/asminc/rs232.inc +19 -0
- data/lib/burn/tools/win/cc65/asminc/ser-error.inc +50 -0
- data/lib/burn/tools/win/cc65/asminc/ser-kernel.inc +161 -0
- data/lib/burn/tools/win/cc65/asminc/signal.inc +57 -0
- data/lib/burn/tools/win/cc65/asminc/stdio.inc +70 -0
- data/lib/burn/tools/win/cc65/asminc/supervision.inc +76 -0
- data/lib/burn/tools/win/cc65/asminc/tgi-error.inc +48 -0
- data/lib/burn/tools/win/cc65/asminc/tgi-kernel.inc +183 -0
- data/lib/burn/tools/win/cc65/asminc/tgi-mode.inc +48 -0
- data/lib/burn/tools/win/cc65/asminc/time.inc +59 -0
- data/lib/burn/tools/win/cc65/asminc/utsname.inc +46 -0
- data/lib/burn/tools/win/cc65/asminc/vic20.inc +77 -0
- data/lib/burn/tools/win/cc65/asminc/zeropage.inc +22 -0
- data/lib/burn/tools/win/cc65/bin/ca65.exe +0 -0
- data/lib/burn/tools/win/cc65/bin/cc65.exe +0 -0
- data/lib/burn/tools/win/cc65/bin/ld65.exe +0 -0
- data/lib/burn/util/os.rb +38 -0
- data/lib/burn/util/patternizer.rb +62 -0
- data/lib/burn/util/pxes.rb +180 -0
- data/lib/burn/util/server.rb +21 -0
- data/lib/burn/util.rb +4 -0
- data/lib/burn/version.rb +3 -0
- data/lib/burn/workspace_default/asset/crt0.s +260 -0
- data/lib/burn/workspace_default/asset/famitone.s +1031 -0
- data/lib/burn/workspace_default/asset/mus_instruments.s +50 -0
- data/lib/burn/workspace_default/asset/music.s +3 -0
- data/lib/burn/workspace_default/asset/nes.cfg +83 -0
- data/lib/burn/workspace_default/asset/neslib.h +213 -0
- data/lib/burn/workspace_default/asset/neslib.s +923 -0
- data/lib/burn/workspace_default/asset/runtime.lib +0 -0
- data/lib/burn/workspace_default/asset/sounds.s +143 -0
- data/lib/burn/workspace_default/asset/test.h +22 -0
- data/lib/burn/workspace_default/asset/tileset.chr +0 -0
- data/lib/burn/workspace_default/release/js/emulator.html +42 -0
- data/lib/burn/workspace_default/release/js/js/dynamicaudio-89ba58da476270a9b630.min.js +1 -0
- data/lib/burn/workspace_default/release/js/js/jquery-1.4.2.min.js +154 -0
- data/lib/burn/workspace_default/release/js/js/jsnes-4e7a7260aa.js +7149 -0
- data/lib/burn/workspace_default/release/js/swf/dynamicaudio.swf +0 -0
- data/lib/burn/workspace_default/scripts/compile.bat +30 -0
- data/lib/burn/workspace_default/scripts/compile.sh +30 -0
- data/lib/burn.rb +11 -0
- data/test/helper.rb +8 -0
- data/test/runner.rb +2 -0
- data/test/test_burn.rb +14 -0
- data/test/test_dsl.rb +22 -0
- data/test/test_pxes.rb +48 -0
- metadata +270 -0
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
module Burn
|
|
2
|
+
module Dsl
|
|
3
|
+
class Scene < DslBase
|
|
4
|
+
# Where to draw
|
|
5
|
+
BG = 0 # background palette (0x00-0x0f)
|
|
6
|
+
TEXT = 1 # background palette (0x00-0x0f)
|
|
7
|
+
PALETTE_X1 = 5 # palette A for #screen and #paint method (whcih is a part background palette)
|
|
8
|
+
PALETTE_X2 = 6
|
|
9
|
+
PALETTE_X3 = 7
|
|
10
|
+
PALETTE_Y1 = 9
|
|
11
|
+
PALETTE_Y2 = 10
|
|
12
|
+
PALETTE_Y3 = 11
|
|
13
|
+
PALETTE_Z1 = 13
|
|
14
|
+
PALETTE_Z2 = 14
|
|
15
|
+
PALETTE_Z3 = 15
|
|
16
|
+
SPRITE = 17 # sprite palette (0x10-0x1f)
|
|
17
|
+
|
|
18
|
+
PALETTE_DEFAULT = 0
|
|
19
|
+
PALETTE_X = 85 # palette expression for PPU Attribute table
|
|
20
|
+
PALETTE_Y = 170 # palette expression for PPU Attribute table
|
|
21
|
+
PALETTE_Z = 255 # palette expression for PPU Attribute table
|
|
22
|
+
|
|
23
|
+
# Color Control
|
|
24
|
+
WHITE = 0
|
|
25
|
+
LIGHTBLUE = 1
|
|
26
|
+
BLUE = 2
|
|
27
|
+
PURPLE = 3
|
|
28
|
+
PINK = 4
|
|
29
|
+
RED = 5
|
|
30
|
+
DEEPRED = 6
|
|
31
|
+
ORANGE = 7
|
|
32
|
+
LIGHTORANGE = 8
|
|
33
|
+
DARKGREEN = 9
|
|
34
|
+
GREEN = 10
|
|
35
|
+
LIGHTGREEN = 11
|
|
36
|
+
BLUEGREEN = 12
|
|
37
|
+
GRAY = 13
|
|
38
|
+
BLACK = 14
|
|
39
|
+
|
|
40
|
+
# Light Control
|
|
41
|
+
DARKEST = 0
|
|
42
|
+
DARKER = 16
|
|
43
|
+
LIGHTER = 32
|
|
44
|
+
LIGHTEST = 48
|
|
45
|
+
|
|
46
|
+
def initialize(resource_name, context)
|
|
47
|
+
super(resource_name, context)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def label(string, x=0, y=1)
|
|
51
|
+
@context.instance_exec {@code_blocks.push sprintf("put_str(NTADR(%d,%d),\"%s\");", x, y, string.upcase)}
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def fade_in
|
|
55
|
+
@context.instance_exec do
|
|
56
|
+
[
|
|
57
|
+
"ppu_on_all();",
|
|
58
|
+
"screen_fade_in();"
|
|
59
|
+
].each {|p| @code_blocks.push p}
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def fade_out(sec=3)
|
|
64
|
+
@context.instance_exec {@code_blocks.push "screen_fade_out(#{sec.to_s});"}
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def color(palette, color, lightness=:lighter)
|
|
68
|
+
palette=Scene.const_get(palette.upcase)
|
|
69
|
+
color=Scene.const_get(color.upcase)
|
|
70
|
+
lightness=Scene.const_get(lightness.upcase)
|
|
71
|
+
|
|
72
|
+
@context.instance_exec {@code_blocks.push "pal_col(#{palette},0x#{(lightness+color).to_s(16)});"}
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def play(song_title)
|
|
76
|
+
@context.instance_exec do
|
|
77
|
+
@global << "extern const unsigned char music_#{song_title}[];"
|
|
78
|
+
@code_blocks << "music_play(music_#{song_title});"
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def stop
|
|
83
|
+
@context.instance_exec {@code_blocks.push "music_stop();"}
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def show(string, x=0, y=0, *args)
|
|
87
|
+
@context.instance_exec(@resource_name) do |resource|
|
|
88
|
+
nmi_plots = Array.new
|
|
89
|
+
iChrCount=0
|
|
90
|
+
isRequireArgs=false
|
|
91
|
+
vname = resource+"_nmi_list"
|
|
92
|
+
init_name = resource+"_nmi_init"
|
|
93
|
+
|
|
94
|
+
string.split(//).each do |c|
|
|
95
|
+
if c=='%' then
|
|
96
|
+
isRequireArgs=true
|
|
97
|
+
next
|
|
98
|
+
end
|
|
99
|
+
nmi_plots.push [x+iChrCount,y] if nmi_plots.index([x+iChrCount, y]).nil?
|
|
100
|
+
if !isRequireArgs then
|
|
101
|
+
@code_blocks.push sprintf("#{vname}[%d]=%s;", nmi_plots.index([x+iChrCount,y])*3+2, sprintf("%#x", c.bytes.to_a[0]-32))
|
|
102
|
+
iChrCount+=1
|
|
103
|
+
else
|
|
104
|
+
if c=='d' then
|
|
105
|
+
@code_blocks.push sprintf("#{vname}[%d]=0x10+%s;", nmi_plots.index([x+iChrCount,y])*3+2, args.shift)
|
|
106
|
+
iChrCount+=1
|
|
107
|
+
elsif c=='s' then
|
|
108
|
+
args.shift.split(//).each do |d|
|
|
109
|
+
nmi_plots.push [x+iChrCount,y] if nmi_plots.index([x+iChrCount, y]).nil?
|
|
110
|
+
@code_blocks.push sprintf("#{vname}[%d]=%s;", nmi_plots.index([x+iChrCount,y])*3+2, sprintf("%#x", d.bytes.to_a[0]-32))
|
|
111
|
+
iChrCount+=1
|
|
112
|
+
end
|
|
113
|
+
else
|
|
114
|
+
raise "method #show can't take any data except for %d or %s. Please make sure you are passing correct 4th parameter."
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
isRequireArgs=false
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
if nmi_plots.count>0 then
|
|
121
|
+
# declaration for show method
|
|
122
|
+
@global.push sprintf("static unsigned char #{vname}[%d*3];", nmi_plots.count)
|
|
123
|
+
@global.push sprintf("const unsigned char #{init_name}[%d*3]={", nmi_plots.count)
|
|
124
|
+
nmi_plots.each_with_index do |plot,i|
|
|
125
|
+
@global.push sprintf("MSB(NTADR(%d,%d)),LSB(NTADR(%d,%d)),0%s", plot[0],plot[1],plot[0],plot[1],i<(nmi_plots.count-1)?",":"")
|
|
126
|
+
end
|
|
127
|
+
@global.push "};"
|
|
128
|
+
@code_blocks.unshift "memcpy(#{vname},#{init_name},sizeof(#{init_name}));", sprintf("set_vram_update(%d,#{vname});", nmi_plots.count)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def wait(interval)
|
|
135
|
+
#@context.instance_exec do
|
|
136
|
+
# [
|
|
137
|
+
# "while(1){",
|
|
138
|
+
# "ppu_on_all();",
|
|
139
|
+
# "delay(#{interval});",
|
|
140
|
+
# "ppu_off();",
|
|
141
|
+
# "break;",
|
|
142
|
+
# "}"
|
|
143
|
+
# ].each {|p| @code_blocks.push p}
|
|
144
|
+
#end
|
|
145
|
+
@context.instance_exec {@code_blocks.push "delay(#{interval});"}
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def goto(scene_name)
|
|
149
|
+
@context.instance_exec do
|
|
150
|
+
[
|
|
151
|
+
"ppu_off();",
|
|
152
|
+
"set_vram_update(0,0);", #clear vram condition for #show
|
|
153
|
+
"vram_adr(0x2000);", #clear nametable
|
|
154
|
+
"vram_fill(0,1024);", #clear nametable
|
|
155
|
+
"goto #{scene_name};"
|
|
156
|
+
].each {|p| @code_blocks.push p}
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def main_loop(rrb_source=nil)
|
|
161
|
+
rrb_source = File.open("#{@resource_name}.rrb").read if rrb_source.nil? || File.extname(rrb_source) == "#{@resource_name}.rrb"
|
|
162
|
+
|
|
163
|
+
# preprocess - for show method, all parameters after the 3rd parameter must be converted to String.
|
|
164
|
+
rrb_source = rrb_source.lines.map{|line|
|
|
165
|
+
if /^[\s\t]*show/ =~ line then
|
|
166
|
+
line.chomp.split(",").each_with_index.map{|data, i|
|
|
167
|
+
if i>2 then
|
|
168
|
+
'"' + data + '"'
|
|
169
|
+
else
|
|
170
|
+
data
|
|
171
|
+
end
|
|
172
|
+
}.join(",")
|
|
173
|
+
else
|
|
174
|
+
line.chomp
|
|
175
|
+
end
|
|
176
|
+
}.join("\n")
|
|
177
|
+
|
|
178
|
+
@context.instance_exec(@context,@resource_name) do |c, resource|
|
|
179
|
+
# preprocess
|
|
180
|
+
[
|
|
181
|
+
"ppu_on_all();",
|
|
182
|
+
"while(1){",
|
|
183
|
+
"ppu_waitnmi(); //wait for next TV frame",
|
|
184
|
+
].each {|p| @code_blocks.push p}
|
|
185
|
+
|
|
186
|
+
# parse ruby source code and process them partially
|
|
187
|
+
p = Burn::Util::Pxes.new(Ripper.sexp(rrb_source),c,resource)
|
|
188
|
+
#require 'pp'
|
|
189
|
+
#pp p
|
|
190
|
+
@code_blocks.push p.to_c
|
|
191
|
+
|
|
192
|
+
# postprocess
|
|
193
|
+
@code_blocks.push "}"
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def inline(code)
|
|
199
|
+
@context.instance_exec {@code_blocks.push code}
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
#def sprite_set(x,y,tile_number,palette=0)
|
|
203
|
+
# @context.instance_exec {@code_blocks.push "oam_spr(#{x},#{y},0x"+tile_number.to_s(16)+",#{palette},0);//0x40 is tile number, i&3 is palette"}
|
|
204
|
+
#end
|
|
205
|
+
|
|
206
|
+
def sprite(resource)
|
|
207
|
+
@context.instance_exec {@code_blocks.push "sprite(&#{resource});"}
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
def screen(map, vars)
|
|
211
|
+
@context.instance_exec(@resource_name) do |resource|
|
|
212
|
+
current_char = nil
|
|
213
|
+
consective_count = 0
|
|
214
|
+
output = Array.new
|
|
215
|
+
# the last character "\b" is just a dummy to finialize loop process
|
|
216
|
+
(map.gsub(/(\r\n|\r|\n)/,"")+"\b").chars do |c|
|
|
217
|
+
if current_char != c then
|
|
218
|
+
if !current_char.nil? then
|
|
219
|
+
if vars.keys.include?(current_char.to_sym) then
|
|
220
|
+
output.push @pattern_table_index[vars[current_char.to_sym].to_sym] # user defined specific pattern
|
|
221
|
+
else
|
|
222
|
+
output.push 0 # blank pattern
|
|
223
|
+
end
|
|
224
|
+
# repeat to draw same pattern
|
|
225
|
+
output.push 1, consective_count if consective_count>0
|
|
226
|
+
end
|
|
227
|
+
current_char = c
|
|
228
|
+
consective_count = 0
|
|
229
|
+
else
|
|
230
|
+
consective_count += 1
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
@global.push "const unsigned char screen_#{resource}["+(output.count+3).to_s+"]={0x01,"+output.map{|p| sprintf "0x%.2x", p}.join(",")+",0x01,0x00};"
|
|
234
|
+
# "unrle_vram" means "decode Run Length Encoding and set them to vram".
|
|
235
|
+
@code_blocks.push "unrle_vram(screen_#{resource},0x2020);" # previously used 0x2000 but it doesn't display very first line of screen.
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
def paint(dest, palette)
|
|
240
|
+
@context.instance_exec(@resource_name) do |resource|
|
|
241
|
+
var_name="screen_#{resource}_color_#{@global.count}"
|
|
242
|
+
@global.push "const unsigned char #{var_name}[6]={0x01,0x"+Scene.const_get(palette.upcase).to_s(16)+",0x01,"+sprintf("0x%.2x",dest.end-dest.begin)+",0x01,0x00};"
|
|
243
|
+
@code_blocks.push "unrle_vram(#{var_name},0x"+(9152+dest.begin).to_s(16)+");" # 9152 is equivalent to 23C0
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
def sound(effect_name)
|
|
248
|
+
@context.instance_exec {@code_blocks.push "sfx_play(SFX_#{effect_name.upcase},0);"}
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
# vcall-ish methods
|
|
253
|
+
def rand
|
|
254
|
+
@context.instance_exec {@code_blocks.push "rand8()"}
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
alias_method :play_sound, :sound
|
|
258
|
+
alias_method :play_music, :play
|
|
259
|
+
|
|
260
|
+
# utility methods
|
|
261
|
+
def range(x_from, y_from, x_to, y_to)
|
|
262
|
+
x_to = x_from if x_to.nil?
|
|
263
|
+
y_to = y_from if y_to.nil?
|
|
264
|
+
|
|
265
|
+
plots = [x_from,y_from,x_to,y_to].map do |v|
|
|
266
|
+
if v.is_a?(String) && v.end_with?("px") then # x:0-255, y:0:239
|
|
267
|
+
v.to_i / 32
|
|
268
|
+
else
|
|
269
|
+
v.to_i / 4
|
|
270
|
+
end
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
plots[1]*8+plots[0]..plots[3]*8+plots[2]
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
end
|
|
277
|
+
end
|
|
278
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
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
|
|
@@ -0,0 +1,91 @@
|
|
|
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
|
data/lib/burn/dsl.rb
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
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(File.dirname(__FILE__)+"/../workspace_default/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
|
|
@@ -0,0 +1,33 @@
|
|
|
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
|
|
@@ -0,0 +1,54 @@
|
|
|
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
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
__@__NAME__@__:
|
|
2
|
+
.word @chn0,@chn1,@chn2,@chn3,@chn4,music_instruments
|
|
3
|
+
.byte $03
|
|
4
|
+
|
|
5
|
+
@chn0:
|
|
6
|
+
@chn0_0:
|
|
7
|
+
__@__CHANNEL1__@__
|
|
8
|
+
@chn0_loop:
|
|
9
|
+
@chn0_1:
|
|
10
|
+
.byte $9f
|
|
11
|
+
.byte $fe
|
|
12
|
+
.word @chn0_loop
|
|
13
|
+
|
|
14
|
+
@chn1:
|
|
15
|
+
@chn1_0:
|
|
16
|
+
__@__CHANNEL2__@__
|
|
17
|
+
@chn1_loop:
|
|
18
|
+
@chn1_1:
|
|
19
|
+
.byte $9f
|
|
20
|
+
.byte $fe
|
|
21
|
+
.word @chn1_loop
|
|
22
|
+
|
|
23
|
+
@chn2:
|
|
24
|
+
@chn2_0:
|
|
25
|
+
__@__CHANNEL3__@__
|
|
26
|
+
.byte $89
|
|
27
|
+
@chn2_loop:
|
|
28
|
+
@chn2_1:
|
|
29
|
+
.byte $9f
|
|
30
|
+
.byte $fe
|
|
31
|
+
.word @chn2_loop
|
|
32
|
+
|
|
33
|
+
@chn3:
|
|
34
|
+
@chn3_0:
|
|
35
|
+
__@__CHANNEL4__@__
|
|
36
|
+
@chn3_loop:
|
|
37
|
+
@chn3_1:
|
|
38
|
+
.byte $9f
|
|
39
|
+
.byte $fe
|
|
40
|
+
.word @chn3_loop
|
|
41
|
+
|
|
42
|
+
@chn4:
|
|
43
|
+
@chn4_0:
|
|
44
|
+
__@__CHANNEL5__@__
|
|
45
|
+
@chn4_loop:
|
|
46
|
+
@chn4_1:
|
|
47
|
+
.byte $9f
|
|
48
|
+
.byte $fe
|
|
49
|
+
.word @chn4_loop
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#include "neslib.h"
|
|
2
|
+
#include "test.h"
|
|
3
|
+
|
|
4
|
+
#define NTADR(x,y) ((0x2000|((y)<<5)|x))
|
|
5
|
+
#define MSB(x) (((x)>>8))
|
|
6
|
+
#define LSB(x) (((x)&0xff))
|
|
7
|
+
|
|
8
|
+
const unsigned char palSprites[16]={
|
|
9
|
+
0x0f,0x17,0x27,0x37,
|
|
10
|
+
0x0f,0x11,0x21,0x31,
|
|
11
|
+
0x0f,0x15,0x25,0x35,
|
|
12
|
+
0x0f,0x19,0x29,0x39
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
static unsigned char vram_buffer[896]; // 896:32*28
|
|
16
|
+
static unsigned char spr;
|
|
17
|
+
|
|
18
|
+
void put_str(unsigned int adr,const char *str)
|
|
19
|
+
{
|
|
20
|
+
vram_adr(adr);
|
|
21
|
+
|
|
22
|
+
while(1)
|
|
23
|
+
{
|
|
24
|
+
if(!*str) break;
|
|
25
|
+
vram_put((*str++)-0x20); //-0x20 because ASCII code 0x20 is placed in tile 0 of the CHR
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
void screen_fade_out(interval){
|
|
30
|
+
unsigned char i=0x05;
|
|
31
|
+
while(1){
|
|
32
|
+
//ppu_waitnmi();//wait for next TV frame
|
|
33
|
+
i--;
|
|
34
|
+
pal_bright(i);
|
|
35
|
+
delay(interval);
|
|
36
|
+
if (i==0){
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
void screen_fade_in(){
|
|
43
|
+
unsigned char i=0x00;
|
|
44
|
+
while(1){
|
|
45
|
+
//ppu_waitnmi();//wait for next TV frame
|
|
46
|
+
i++;
|
|
47
|
+
pal_bright(i);
|
|
48
|
+
delay(5);
|
|
49
|
+
if (i==4){
|
|
50
|
+
break;
|
|
51
|
+
//goto mystart;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
void init_screen(){
|
|
57
|
+
memfill(vram_buffer, 0, 896); // 896:32*28
|
|
58
|
+
vram_write((unsigned char *)vram_buffer, NTADR(0, 1), 32 * 28);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
void init(){
|
|
62
|
+
pal_spr(palSprites);//set palette for sprites
|
|
63
|
+
pal_col(1,0x30);//set while color
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
int is_pressed(unsigned char pad){
|
|
67
|
+
unsigned char i;
|
|
68
|
+
i=pad_poll(0);
|
|
69
|
+
return i&pad;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
typedef struct {
|
|
73
|
+
int x;
|
|
74
|
+
int y;
|
|
75
|
+
unsigned char pattern[];
|
|
76
|
+
} sprite_schema;
|
|
77
|
+
|
|
78
|
+
__@__GLOBAL__@__
|
|
79
|
+
|
|
80
|
+
void sprite(sprite_schema *data){
|
|
81
|
+
spr=oam_meta_spr(data->x,data->y,spr,data->pattern);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
void main(void)
|
|
85
|
+
{
|
|
86
|
+
|
|
87
|
+
}
|
|
88
|
+
|