#!/usr/bin/env ruby require 'yaml' require 'erb' # load template data DATA = YAML.load_file(File.join(__dir__, 'ops.yaml')) switches = DATA['ops'].reduce([]) do |r, set| prefix = (set.first == 'cb') ? 0xCB00 : 0x0000 set.last.reduce(r) do |r, op| # op hex string hex = (prefix + op['hex']).to_s(16).upcase.rjust(4, '0') r << case op['op'] when 'XX' [ "case 0x%s: /* op: %s, cat: %s */", " invalid(ctx, old_pc);", " break;", ].join("\n") % [ hex, op['id'], op['cat'], ] else # time expr time_expr = case op['time'] when Numeric 'ctx->cpu.clock += %d;' % [op['time']] when Hash 'ctx->cpu.clock += %d; // t: %d, f: %d' % %w{f t f}.map { |k| op['time'][k] } else raise "unknown op time: #{hex}: #{op['time']}" end [ "case 0x%s: /* op: \"%s\", cat: \"%s\" */", " %s", # action_expr " %s", # time_expr " break;" ].join("\n") % [ hex, op['id'], op['cat'], op['code'] || 'not_implemented(ctx, old_pc, op);', time_expr, ] end end end.join("\n") t = ERB.new(DATA['templates']['main']) puts t.run(binding)