-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtasm3txt.pl
executable file
·76 lines (67 loc) · 3.44 KB
/
tasm3txt.pl
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
#!/usr/bin/perl
#
# Конвертор исходников формата TASM3s (Rst7, ZX Spectrum) в текстовый.
# По мотивам TASM2TXT.PAS
# https://zx-pk.ru/threads/1356-konverter-iz-tasm-i-alasm-v-tekst.html?p=23804#post23804
# Автор скрипта не знает Perl, читайте на свой страх и риск.
#
use warnings;
use strict;
use utf8;
use open ':std', ':encoding(UTF-8)';
# TASM2TXT.PAS транслитерирует строчные латинские в кириллицу.
# Сохраним возможность, но отключим, поскольку не используется.
my $transliterate = undef;
# Формат строки:
# 1 байт - длина содержимого в байтах;
# содержимое,
# ключевые слова и последовательности пробелов кодируются одним байтом;
# 1 байт - длина содержимого в байтах, дублирует начальный байт.
#
# !"#$%& '()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{| ~
my $rus = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]э_юабцдефгхийклмнопярстужвьызш|щч';
# INCLUDE в оригинальном конверторе нет. Сложно сказать, откуда она взялась, но используется.
my @mnemonic = ("A", "ADC ", "ADD ", "AF'", "AF", "AND ", "B", "BC", "BIT ",
"C", "CALL ", "CCF", "CP ", "CPD", "CPDR", "CPI", "CPIR", "CPL", "D", "DAA",
"DE", "DEC ", "DEFB ", "DEFMAC ", "DEFS ", "DEFW ", "DI", "DISPLAY ", "DJNZ ",
"E", "EI", "ENDMAC ", "EQU ", "EX ", "EXX", "H", "HALT", "HL", "I", "IM ",
"IN ", "INC ", "IND", "INDR", "INI", "INIR", "IX", "IY", "JP ", "JR ",
"L", "LD ", "LDD", "LDDR", "LDI", "LDIR", "M", "NC", "NEG", "NOP", "NV", "NZ",
"OR ", "ORG ", "OTDR", "OTIR", "OUT ", "OUTD", "OUTI", "P", "PE", "PO",
"POP ", "PUSH ", "R", "RES ", "RET", "RETI", "RETN", "RL ", "RLA", "RLC ",
"RLCA", "RLD", "RR ", "RRA", "RRC ", "RRCA", "RRD", "RST ", "SBC ", "SCF",
"SET ", "SLA ", "SP", "SRA ", "SRL ", "SUB ", "V", "XOR ", "Z", "INCLUDE ");
foreach my $original (<*.A>) {
print "\n Обрабатываем `$original'\n";
open(my $in, '<:raw', $original) or die " не могу открыть: $!";
my $txtfile = lc($original) . 'sm';
$txtfile =~ tr/ //ds;
die " $txtfile уже существует" if -e $txtfile;
open(my $out, '>:utf8', $txtfile) or die " не могу создать для записи: $!";
my $inbytes = 0;
my $lines = 0;
while (!eof($in)) {
my $len = ord(getc($in)); ++$inbytes;
while ($len != 0xff && $len > 0) {
my $octet = ord(getc($in)); ++$inbytes;
if ($octet == 1) {
print $out ' ' x ord(getc($in)); ++$inbytes;
} elsif ($octet < 0x20) {
print $out ' ' x $octet;
} elsif ($octet < 0x80) {
if ($transliterate) {
print $out substr($rus, $octet - 0x20, 1);
} else {
print $out chr($octet);
}
} else {
print $out $mnemonic[$octet - 0x80];
}
--$len;
}
getc($in); ++$inbytes;
print $out "\n";
++$lines;
}
print " $inbytes байт --> $lines строк.\n";
}