-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path-make.js
109 lines (85 loc) · 3.17 KB
/
-make.js
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
//----------------------------------------------------------------------------
// RAMFOS
// Ñîçäàíèå ïðîøèâêè ÏÇÓ
//
// 2013-11-01 Ðàçðàáîòàíî vinxru
//----------------------------------------------------------------------------
// Êîíñòàíòû
unmlzOffset = 0x0063;
ramfosOffset = 0x0430;
romdiskOffset = 0x1880;
romdiskSize = 0x10000-romdiskOffset-4; // 4 ýòî page0start
loader1Offset = 0x8000;
// Ñòàíäàðòíàÿ åðóíäà
fso = new ActiveXObject("Scripting.FileSystemObject");
shell = new ActiveXObject("WScript.Shell");
function kill(name) { if(fso.FileExists(name)) fso.DeleteFile(name); }
function fileSize(name) { return fso.GetFile(name).Size; }
function loadAll(name) { return fso.OpenTextFile(name, 1, false, 0).Read(fileSize(name)); } // File.LoadAll ãëþ÷èò
function exec(cmd) { if(shell.Run(cmd, 2, true)) throw cmd; }
src = loadAll("tbl.bin"); decode = []; encode = []; for(i=0; i<256; i++) { decode[src.charCodeAt(i)] = i; encode[i] = src.charAt(i); }
// Ïðåîáðàçîâàíèå BIN->INC
function bin2inc(src, dest, x) {
abc = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' ];
src = loadAll(src);
s = "";
pos = 0;
for(i=0; i<src.length; i++) {
if((i%x)!=0) s += ","; else { if(i!=0) s += " ; "+(pos++)+"\r\n"; s += " .db "; }
v = decode[src.charCodeAt(i)];
s += '0' + abc[v>>4] + abc[v&0xF] + 'h';
}
fso.CreateTextFile(dest, true).Write(s);
}
// Óäàëÿåì ôàéëû, ÷òî áû â ñëó÷àå îøèáêè èõ íå áûëî
function killTmpFiles() {
kill("loader1.lst");
kill("loader1.bin");
kill("loader1.mlz");
kill("loader1.inc");
kill("loader0.lst");
kill("loader0.bin");
kill("ramfos.bin");
kill("ramfos.mlz");
}
killTmpFiles();
kill("SpecialistMX2.bin");
// Çàãðóç÷èê íà íóëåâîé ñòðàíèöå
page0start = encode[0x31] + encode[0xFF] + encode[0xF7] + encode[0xC7]; // lxi sp, 0F7FFh / rst 0
// Êîìïèëÿöèÿ çàãðóç÷èêà
exec("tasm -gb -b -85 loader1.asm loader1.bin");
exec("megalz loader1.bin loader1.mlz");
bin2inc("loader1.mlz", "loader1.inc", 16);
exec("tasm -gb -b -85 loader0.asm loader0.bin");
// Âûðåçàåì ïóñòîå ìåñòî èç îáðàçà RAMFOS
src = loadAll("ramfos/ramfos.bin");
offset = 0xC000;
end1 = 0xD2A0 - offset;
start2 = 0xF800 - offset;
end2 = 0xFFE0 - offset;
fso.CreateTextFile("ramfos.bin", true).Write(src.substr(0, end1) + src.substr(start2, end2 - start2));
// Ñæèìàåì åãî
exec("megalz ramfos.bin ramfos.mlz");
// Íóëåâîé áàéò
byte0 = encode[0];
// Ñîáèðàåì îáðàç
// Ïåðâàÿ ñòðàíèöà
romdisk = loadAll("romdisk.bin");
dest = page0start;
dest += romdisk.substr(32768-romdiskOffset, 32768-page0start.length);
while(dest.length < 0x8000) dest += byte0;
// Âòîðàÿ ñòðàíèöà
dest += loadAll("loader0.bin");
if(dest.length > 0x8000+ramfosOffset) throw "ramfosOffset";
while(dest.length < 0x8000+ramfosOffset) dest += byte0;
dest += loadAll("ramfos.mlz");
if(dest.length > 0x8000+romdiskOffset) throw "romdiskOffset";
while(dest.length < 0x8000+romdiskOffset) dest += byte0;
dest += romdisk.substr(0, 32768-romdiskOffset);
while(dest.length < 0x10000) dest += byte0;
// Ñîõðàíÿåì
fso.CreateTextFile("SpecialistMX2.bin", true).Write(dest);
// Êîïèðóåì â ýìóëÿòîð
fso.GetFile("SpecialistMX2.bin").Copy("C:/emu/Specialist/specsvga.bin", true);
// Óäàëåì âðåìåííûå ôàéëû
killTmpFiles();