forked from cyneprepou4uk/Street-Fighter-3
-
Notifications
You must be signed in to change notification settings - Fork 1
/
preparations.lua
165 lines (136 loc) · 5.12 KB
/
preparations.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
time = os.clock() --record script execution time
--список файлов для подготовки перед конвертацией
--list of files which need to be prepared before compilation
files_list = {
"bank_00.asm",
"bank_01.asm",
"bank_02.asm",
"bank_03.asm",
"bank_04.asm",
"bank_05.asm",
"bank_06.asm",
"bank_07.asm",
"bank_08.asm",
"bank_09.asm",
"bank_0A.asm",
"bank_0B.asm",
"bank_0D.asm",
"bank_0E.asm",
"bank_0F.asm",
"bank_10.asm",
"bank_11.asm",
"bank_12.asm",
"bank_13.asm",
"bank_14.asm",
"bank_15.asm",
"bank_16.asm",
"bank_17.asm",
"bank_18.asm",
"bank_19.asm",
"bank_1A.asm",
"bank_1B.asm",
"bank_1C.asm",
"bank_1D.asm",
"bank_FF.asm",
"bank_ram.inc",
"bank_val.inc",
}
--конвертация испанских символов в английские
--convert SPA characters in names of labels and variables into ENG
english = {
"Á", "A", "á", "a",
"É", "E", "é", "e",
"Í", "I", "í", "i",
"Ñ", "N", "ñ", "n",
"Ó", "O", "ó", "o",
"Ú", "U", "ú", "u",
"Ü", "U", "ü", "u",
}
--вспомогательная подпрограмма для вывода возможных ошибок при работе с файлами
--potential file error subroutine like "can't access file" or something
function PrintError(err)
print("\n"..err.."\nPress Enter to exit")
io.read()
end
--[[ *** MAIN SCRIPT STARTS HERE *** --]]
print("*** Preparing files for the assembler ***\n")
for _, f in ipairs(files_list) do --execute this loop for each file from the list
print("Working on "..f.." file...")
local file, err = io.open(f, "r") --open next file
if err ~= nil then PrintError(err) end --check for errors during opening
local text = file:read("*all") --read all text
file:close() --close file
text = string.gsub(text, ".%s.%s.%s.%s.%s.%s0x......%s..:....:...........", "\t")
local i = 1
while true do
if english[i] == nil then break end
text = string.gsub(text, english[i], english[i + 1])
i = i + 2
end
local file, err = io.open("copy_"..f, "w+")
if err ~= nil then PrintError(err) end
io.output(file)
io.write(text)
io.flush(file)
io.close(file)
end
--создание файла комментов для FCEUX
--чтение перевведенного на английский файла с адресами
local inc_file, err = io.open("copy_bank_ram.inc", "r")
if err ~= nil then PrintError(err) end
local nl_file, err = io.open("!sf3.nes.ram.nl", "w+")
if err ~= nil then PrintError(err) end
io.output(nl_file)
local tbl = {}
while true do
local line = inc_file:read("*line")
if line == nil then
io.close(inc_file)
break
end
--удалить все пробелы
line = string.gsub(line, " ", "")
local find_start, find_end = string.find(line, "=%$")
local f_start, _ = string.find(line, ";")
--найти символ коммента
if f_start ~= nil and find_start ~= nil then
if f_start < find_start then
--если коммент существует и находится до "=$" тогда притвориться что адреса не существует
find_start = nil
end
end
local address = ""
if find_start ~= nil then
local i = find_start + 2
while true do
--тест всех символов после "=$", проверка на то что это hex числа, получаем строку из чисел
local byte = ""
byte = string.sub(line, i, i)
test = tonumber(byte, 16)
if test == nil then break end
address = address..byte
i = i + 1
end
end
--проверка что итоговое чисто стопудово hex число, в таком случае создать коммент
result = tonumber(address, 16)
if result ~= nil then
tbl[result + 1] = string.sub(line, 0, find_start - 1)
end
end
--запись комментов, если это не примитивный ram_ коммент, а также если это не con_ коммент
for i = 0x0, 0x7FFF, 1 do
if tbl[i + 1] ~= nil then
if tbl[i + 1] ~= "ram_"..string.upper(string.format("%04x", i)) then
if string.find(tbl[i + 1], "con_") == nil then
local str = "$"..string.upper(string.format("%04x", i)).."#"..tbl[i + 1].."#\n"
str = string.gsub(str, "ram_", "")
io.write(str)
end
end
end
end
io.flush(nl_file)
io.close(nl_file)
print(string.format("\nScript finished in "..string.format("%.3f", os.clock() - time).." seconds"))
--io.read() --uncomment this line in order to pause the console after script is complete