HertzDevil icon

building all the driver headers in 9 seconds

HertzDevil | PRO | 06/02/15 07:38:57 AM UTC | 0 ⭐ | 758 👁️ | Never ⏰ | []
Lua |

3.28 KB

|

None

|

0 👍

/

0 👎

local resolveLabel = function (str)
  if str == "ft_vibrato_table" then return "VIBRATO" end
  if str == "ft_note_table_vrc7_l" then return "SNDCHIP_VRC7" end
  
  local chip = string.upper(string.match(str, "ft_periods_(.*)"))
  if chip == "SAWTOOTH" then chip = "VRC6"
  elseif chip == "NTSC" then chip = "NONE"
  elseif chip == "PAL" then chip = "2A07"
  end
  return "SNDCHIP_" .. chip
end
 
local build = function (chip)
  print("Building NSF driver for " .. chip .. "...")
  os.execute([[ca65 ../driver.s -l out_]]..chip..[[.lst -D USE_]]..chip..[[ -D PACKAGE]])
  os.execute([[ld65 -o c0_]]..chip..[[.bin ../driver.o -C c0.cfg]])
  os.execute([[ld65 -o c1_]]..chip..[[.bin ../driver.o -C c1.cfg]])
  
  local adr = {}
  local pos = {}
  for str in io.lines("out_"..chip..".lst") do
    local hex, used, ident, colon = string.match(str, "(......).....(..).*%f[_%w]([_%w]*)(:?).*;; Patch")
    if hex then
      hex = tonumber(hex, 16)
      used = used == "A9"
      colon = colon == ":"
      ident = resolveLabel(ident)
      if colon then -- ASM label; add to frequency table
        pos[ident] = hex
      elseif used then -- ASM jump; remove entry from reloc table
        adr[hex] = ident
        if ident == "SNDCHIP_VRC7" and chip == "VRC7" or chip == "ALL" then adr[-1] = ident end
      end
    end
  end
  os.remove("out_"..chip..".lst")
  
  local in1 = io.open("c1_"..chip..".bin", "rb")
  local in2 = io.open("c0_"..chip..".bin", "rb")
  local relStr = ""
  local hedStr = ""
  local tRel, tHed = {}, {}
  while true do
    local x, y = in1:read(1), in2:read(1)
    if not x then break
    else x, y = string.byte(x), string.byte(y) end
    if x == y then
      tHed[#tHed + 1] = string.format("0x%02X,", x)
    else
      tHed[#tHed + 1] = string.format("0x%02X,", x - 0xC1)
      if not adr[in1:seek() - 6] then tRel[#tRel + 1] = string.format("%d,", in1:seek() - 2) end
      if #tRel == 20 then
        relStr = relStr .. "\t" .. table.concat(tRel, " ") .. "\n"
        tRel = {}
      end
    end
    if #tHed == 16 then
      hedStr = hedStr .. "\t" .. table.concat(tHed, " ") .. "\n"
      tHed = {}
    end
  end
 
  if #tRel > 0 then
    relStr = relStr .. "\t" .. table.concat(tRel, " ") .. "\n"
  end
  if #tHed > 0 then
    hedStr = hedStr .. "\t" .. table.concat(tHed, " ") .. "\n"
  end
  
  local final = io.open("output/drv_" .. string.lower(chip) .. ".h", "w")
  final:write("const unsigned char DRIVER_", chip, "[] = {\t\t// // //\n")
  final:write(hedStr)
  final:write("};\n\nconst int DRIVER_RELOC_WORD_", chip, "[] = {\n")
  final:write(relStr)
  final:write("};\n\nconst int DRIVER_FREQ_TABLE_", chip, "[] = {\n")
  for k, v in pairs(adr) do
    final:write("\t")
    final:write(k == -1 and "    -1" or string.format("0x%04X", k))
    final:write(string.format(", 0x%04X, %s,\n", pos[v], v))
  end
  final:write("};\n\nconst unsigned int VIBRATO_TABLE_LOCATION_", chip, string.format(" = 0x%X;", pos["VIBRATO"]))
 
  in1:close()
  in2:close()
  final:close()
  os.remove("c0_"..chip..".bin")
  os.remove("c1_"..chip..".bin")
end
 
for _, v in pairs {"2A03", "VRC6", "VRC7", "MMC5", "FDS", "N163", "S5B", "ALL"} do
  build(v)
end
print("All driver headers created in " .. tonumber(os.clock()) .. " seconds.")
os.execute("pause")

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  • Syizuxtrn icon
    05/15/26 01:37:37 PM UTC
    text |

    0 B

    |

    0 👍

    /

    0 👎

    Best Pastebin.com alternatives paste sites list
     Copy and paste the link in a new browser tab and then hit enter!
     https://crazyporn.xxx/members/157354/?asgtbndr=1&play=true&spon=adworld&zone=400