Задумал я тут написать простую программку, которая будет считать процент "заимствования" кода одной программы в другой (применительно к 8080 процессору). Вот что мне подумалось - так программа может быть перетранслирована в новую память, то адреса могут сбится, т.е. все переходы (J*, C*), если они встречаются в большем повторяющемся куске кода, следует считать совпадающими, не взирая на используемый адрес. Тоже самое касается команд чтения записи данных из памяти - LDA/STA и SHLD/LHLD. Вопрос возникает по поводу LXI - по идее в HL также можно загрузить адрес переменной и потом обращаться к ней через регистр M, т.е. такие команды тоже надо считать заведомо совпадающими? В связи с этим - чтобы исключить ложные срабатывания минимальную длину заведомо повторяющегося участка следует принять за 4 байта или даже за 5...
* * *
вот результаты, полученные по этой методике (сравнивал бейсики с альтаиром 4К и 8К, а также TRS-80 LEVEL1):
Код:
size alt4k alt8k t80-l1
BAS-CIR.RKS 9750 25.18 47.70 2.52
BAS-GR.RKS 9542 25.73 48.75 2.58
BAS-KBH.RKS 8342 29.36 55.32 2.85
BAS-MAG.RKS 8710 26.06 48.46 2.90
BAS-MAG2.RKS 8582 26.45 49.14 2.90
BAS-MIC2.RKS 8198 28.35 53.48 3.04
BAS-MICR.RKS 8199 28.34 53.47 3.04
BAS-NEW.RKS 10518 23.38 44.50 2.46
BAS-RDK.RKS 3334 7.02 11.85 18.72
BAS-S.RKS 7798 31.16 59.25 3.03
BAS-SG.RKS 10518 23.32 44.23 2.41
BAS-SPEC.RKS 8198 29.82 56.40 2.90
BAS-SRV.RKS 8966 27.36 51.81 2.79
BASIC-A.RKS 6758 36.09 68.42 3.17
BASIC.RKM 6662 36.60 69.44 3.00
BASIC.RKP 8200 27.68 51.43 3.11
BASIC.RKS 16390 15.12 28.57 1.53
BASIC1.RKS 16390 15.08 28.52 1.53
BASIC2.RKS 16390 15.12 28.57 1.53
BASIC3.RKS 6758 36.06 68.42 3.23
BASIC80.RKR 6665 36.70 68.99 3.00
BASICMUS.RKR 10741 22.56 42.35 1.86
BASICPC.RKR 8201 28.30 53.33 3.07
BASICSER.RKR 7433 32.73 62.06 2.95
BASIC_OK.RKR 8201 28.23 53.46 2.83
BASIC_PR.RKR 7433 32.69 62.14 2.95
BASIC_RK.RKR 6847 35.65 67.17 2.99
BASMIC.RKR 6601 36.90 69.84 2.97
BASMIC87.RKS 17207 13.26 25.06 1.64
BASMIKR.RKR 8202 27.69 51.43 3.11
программа не идеальна - величины менее 10% наверное можно считать случайным совпадением (ложные срабатывания) - т.е. это означает, что коды мало связаны
вот самый длинный повторяющийся кусок (165 байт) в BASIC_PR.RKR из altair8k:
Код:
BASIC_PR.RKR loaded : 7433 bytes
altair8k.bin loaded : 8192 bytes
62.14 percent copy (max=165 maxa=0x11DF maxb=0x137A)
0x11DF 0x02 | 0x137A 0x02
0x11E0 0x7E | 0x137B 0x7E
0x11E1 0x23 | 0x137C 0x23
0x11E2 0xB7 | 0x137D 0xB7
0x11E3 0xCA | 0x137E 0xCA
0x11E4 0x07 | 0x137F 0xA6
0x11E5 0x12 | 0x1380 0x13
0x11E6 0xE5 | 0x1381 0xE5
0x11E7 0xEB | 0x1382 0xEB
0x11E8 0x1E | 0x1383 0x1E
0x11E9 0x08 | 0x1384 0x08
0x11EA 0x1F | 0x1385 0x1F
0x11EB 0x57 | 0x1386 0x57
0x11EC 0x79 | 0x1387 0x79
0x11ED 0xD2 | 0x1388 0xD2
0x11EE 0xF4 | 0x1389 0x93
0x11EF 0x11 | 0x138A 0x13
0x11F0 0xD5 | 0x138B 0xD5
0x11F1 0x11 | 0x138C 0x11
0x11F2 0x00 | 0x138D 0x00
0x11F3 0x00 | 0x138E 0x00
0x11F4 0x19 | 0x138F 0x19
0x11F5 0xD1 | 0x1390 0xD1
0x11F6 0xCE | 0x1391 0xCE
0x11F7 0x00 | 0x1392 0x00
0x11F8 0x1F | 0x1393 0x1F
0x11F9 0x4F | 0x1394 0x4F
0x11FA 0x7C | 0x1395 0x7C
0x11FB 0x1F | 0x1396 0x1F
0x11FC 0x67 | 0x1397 0x67
0x11FD 0x7D | 0x1398 0x7D
0x11FE 0x1F | 0x1399 0x1F
0x11FF 0x6F | 0x139A 0x6F
0x1200 0x78 | 0x139B 0x78
0x1201 0x1F | 0x139C 0x1F
0x1202 0x47 | 0x139D 0x47
0x1203 0x1D | 0x139E 0x1D
0x1204 0x7A | 0x139F 0x7A
0x1205 0xC2 | 0x13A0 0xC2
0x1206 0xE6 | 0x13A1 0x85
0x1207 0x11 | 0x13A2 0x13
0x1208 0xEB | 0x13A3 0xEB
0x1209 0xE1 | 0x13A4 0xE1
0x120A 0xC9 | 0x13A5 0xC9
0x120B 0x43 | 0x13A6 0x43
0x120C 0x5A | 0x13A7 0x5A
0x120D 0x51 | 0x13A8 0x51
0x120E 0x4F | 0x13A9 0x4F
0x120F 0xC9 | 0x13AA 0xC9
0x1210 0xCD | 0x13AB 0xCD
0x1211 0xF2 | 0x13AC 0x91
0x1212 0x12 | 0x13AD 0x14
0x1213 0x01 | 0x13AE 0x01
0x1214 0x20 | 0x13AF 0x20
0x1215 0x84 | 0x13B0 0x84
0x1216 0x11 | 0x13B1 0x11
0x1217 0x00 | 0x13B2 0x00
0x1218 0x00 | 0x13B3 0x00
0x1219 0xCD | 0x13B4 0xCD
0x121A 0x02 | 0x13B5 0xA1
0x121B 0x13 | 0x13B6 0x14
0x121C 0xC1 | 0x13B7 0xC1
0x121D 0xD1 | 0x13B8 0xD1
0x121E 0xEF | 0x13B9 0xEF
0x121F 0xCA | 0x13BA 0xCA
0x1220 0xD3 | 0x13BB 0xC9
0x1221 0x02 | 0x13BC 0x02
0x1222 0x2E | 0x13BD 0x2E
0x1223 0xFF | 0x13BE 0xFF
0x1224 0xCD | 0x13BF 0xCD
0x1225 0x8A | 0x13C0 0x29
0x1226 0x12 | 0x13C1 0x14
0x1227 0x34 | 0x13C2 0x34
0x1228 0x34 | 0x13C3 0x34
0x1229 0x2B | 0x13C4 0x2B
0x122A 0x7E | 0x13C5 0x7E
0x122B 0x32 | 0x13C6 0x32
0x122C 0x49 | 0x13C7 0xE8
0x122D 0x12 | 0x13C8 0x13
0x122E 0x2B | 0x13C9 0x2B
0x122F 0x7E | 0x13CA 0x7E
0x1230 0x32 | 0x13CB 0x32
0x1231 0x45 | 0x13CC 0xE4
0x1232 0x12 | 0x13CD 0x13
0x1233 0x2B | 0x13CE 0x2B
0x1234 0x7E | 0x13CF 0x7E
0x1235 0x32 | 0x13D0 0x32
0x1236 0x41 | 0x13D1 0xE0
0x1237 0x12 | 0x13D2 0x13
0x1238 0x41 | 0x13D3 0x41
0x1239 0xEB | 0x13D4 0xEB
0x123A 0xAF | 0x13D5 0xAF
0x123B 0x4F | 0x13D6 0x4F
0x123C 0x57 | 0x13D7 0x57
0x123D 0x5F | 0x13D8 0x5F
0x123E 0x32 | 0x13D9 0x32
0x123F 0x4C | 0x13DA 0xEB
0x1240 0x12 | 0x13DB 0x13
0x1241 0xE5 | 0x13DC 0xE5
0x1242 0xC5 | 0x13DD 0xC5
0x1243 0x7D | 0x13DE 0x7D
0x1244 0xD6 | 0x13DF 0xD6
0x1245 0x00 | 0x13E0 0x00
0x1246 0x6F | 0x13E1 0x6F
0x1247 0x7C | 0x13E2 0x7C
0x1248 0xDE | 0x13E3 0xDE
0x1249 0x00 | 0x13E4 0x00
0x124A 0x67 | 0x13E5 0x67
0x124B 0x78 | 0x13E6 0x78
0x124C 0xDE | 0x13E7 0xDE
0x124D 0x00 | 0x13E8 0x00
0x124E 0x47 | 0x13E9 0x47
0x124F 0x3E | 0x13EA 0x3E
0x1250 0x00 | 0x13EB 0x00
0x1251 0xDE | 0x13EC 0xDE
0x1252 0x00 | 0x13ED 0x00
0x1253 0x3F | 0x13EE 0x3F
0x1254 0xD2 | 0x13EF 0xD2
0x1255 0x5A | 0x13F0 0xF9
0x1256 0x12 | 0x13F1 0x13
0x1257 0x32 | 0x13F2 0x32
0x1258 0x4C | 0x13F3 0xEB
0x1259 0x12 | 0x13F4 0x13
0x125A 0xF1 | 0x13F5 0xF1
0x125B 0xF1 | 0x13F6 0xF1
0x125C 0x37 | 0x13F7 0x37
0x125D 0xD2 | 0x13F8 0xD2
0x125E 0xC1 | 0x13F9 0xC1
0x125F 0xE1 | 0x13FA 0xE1
0x1260 0x79 | 0x13FB 0x79
0x1261 0x3C | 0x13FC 0x3C
0x1262 0x3D | 0x13FD 0x3D
0x1263 0x1F | 0x13FE 0x1F
0x1264 0xFA | 0x13FF 0xFA
0x1265 0x09 | 0x1400 0xA8
0x1266 0x11 | 0x1401 0x12
0x1267 0x17 | 0x1402 0x17
0x1268 0x7B | 0x1403 0x7B
0x1269 0x17 | 0x1404 0x17
0x126A 0x5F | 0x1405 0x5F
0x126B 0x7A | 0x1406 0x7A
0x126C 0x17 | 0x1407 0x17
0x126D 0x57 | 0x1408 0x57
0x126E 0x79 | 0x1409 0x79
0x126F 0x17 | 0x140A 0x17
0x1270 0x4F | 0x140B 0x4F
0x1271 0x29 | 0x140C 0x29
0x1272 0x78 | 0x140D 0x78
0x1273 0x17 | 0x140E 0x17
0x1274 0x47 | 0x140F 0x47
0x1275 0x3A | 0x1410 0x3A
0x1276 0x4C | 0x1411 0xEB
0x1277 0x12 | 0x1412 0x13
0x1278 0x17 | 0x1413 0x17
0x1279 0x32 | 0x1414 0x32
0x127A 0x4C | 0x1415 0xEB
0x127B 0x12 | 0x1416 0x13
0x127C 0x79 | 0x1417 0x79
0x127D 0xB2 | 0x1418 0xB2
0x127E 0xB3 | 0x1419 0xB3
0x127F 0xC2 | 0x141A 0xC2
0x1280 0x3D | 0x141B 0xDC
0x1281 0x12 | 0x141C 0x13
0x1282 0xE5 | 0x141D 0xE5
0x1283 0x21 | 0x141E 0x21