|
Секреты TR-DOS - Адаптация АССЕМБЛЕРа "ZEUS" под систему TR-DOS.
|
СЕКРЕТЫ TR-DOS
Адаптация АССЕМБЛЕРа "ZEUS" под систему TR-DOS
© Мясников Герман, Сыктывкар, 94
Система TR-DOS иашла широкую поддержку в кругах отечественных любителей "Спектрума". Однако, до сих пор многое из давно наработанного программного обеспечения, остается доступным только в кассетных версиях, т.к. не обеспечивается обмен информацией с дисководом. Работы над адаптацией известных прикладных и системных программ под TR-DOS ведутся во всех уголках страны и, нам кажется, на страницах ZX-РЕВЮ было бы не лишним осветить практические приемы таких адаптаций.
В результате предлагаемой адаптации пользователь получит новые команды АССЕМБЛЕРа, доступ к которым возможен из режима MONITOR.
S - записать (SAVE) объектный кода с адреса nn или исходный файл.
L - загрузить (LOAD) файлы типа CODE с адреса, объявленного в каталоге.
D - смена дисковода.
V - каталог.
Р - принтер.
g (строчная) - печать на принтере начинается с колонки 0.
w (строчная) - печать с колонки 40.
Как видите, модернизация программы коснулась не только введения операций ввода/вывода с дисковода, но и возможной поддержки принтера пользователя.
Ниже приведен исходный текст кода, встраиваемого в стандартный АССЕМБЛЕР ZEUS (см. Листинг_1).
Листинг 1.
|
00010 |
|
ORG |
#F1F4 |
|
00020 |
|
CP |
80 |
|
00030 |
|
CALL |
Z,#F880 |
|
00040 |
|
CP |
68 |
|
00050 |
|
JP |
Z,DISK |
|
00060 |
|
CP |
86 |
|
00070 |
|
JP |
Z, CAT |
|
00080 |
|
NOP |
|
|
00090 |
|
JP |
#F980 |
|
00100 |
|
ORG |
#F980 |
|
00110 |
|
CP |
113 |
|
00120 |
|
CALL |
Z,P0 |
|
00130 |
|
CP |
119 |
|
00140 |
|
CALL |
z,p0 |
|
00150 |
|
CP |
83 |
|
00160 |
|
JR |
Z,SAVE |
|
00170 |
|
CP |
76 |
|
00180 |
|
JR |
Z,LOAD |
|
00190 |
|
JR |
END |
|
00200 |
SAVE |
CALL |
#E4E3 |
|
00210 |
|
DEFM |
/Code or File?/ |
|
00220 |
|
DEFB |
13.0 |
|
00230 |
|
CALL |
#F652 |
|
00240 |
|
CP |
70 |
|
00250 |
|
JR |
Z,SAVEF |
|
00260 |
|
CP |
67 |
|
00270 |
|
JP |
Z,SAVEC |
|
00280 |
END |
LD |
A,13 |
|
00290 |
|
CALL |
#F503 |
|
00300 |
|
JP |
#F1B3 |
|
00310 |
SAVEF |
CALL |
NAME |
|
00320 |
|
JR |
C, END |
|
00330 |
|
LD |
A,54 |
|
00340 |
|
LD |
(BUF),A |
|
00350 |
|
CALL |
FNAME |
|
00360 |
|
CP |
255 |
|
00370 |
|
JP |
NZ,ERR |
|
00380 |
|
LD |
DE, (#FD0 0) |
|
00390 |
|
LD |
HL,(#FD02) |
|
00400 |
|
INC |
HL |
|
00410 |
WHOD |
SBC |
HL, DE |
|
00420 |
|
JR |
Z, END |
|
00430 |
|
EX |
DE, HL |
|
00440 |
|
LD |
C,11 |
|
00450 |
LEND1 |
CALL |
15635 |
|
00460 |
|
JR |
END |
|
00470 |
LOAD |
CALL |
NAME |
|
00480 |
|
JR |
C, END |
|
00490 |
|
LD |
A,57 |
|
00500 |
|
LD |
(BUF),A |
|
00510 |
|
CALL |
FNAME |
|
00520 |
|
CP |
255 |
|
00530 |
|
JR |
Z, ERR |
|
00540 |
|
XOR |
A |
|
00550 |
|
LD |
(23801), |
|
00560 |
|
LD |
C,14 |
|
00570 |
LEND |
JR |
LEND1 |
|
00580 |
NAME |
CALL |
FILL |
|
00590 |
|
LD |
B, 8 |
|
00600 |
|
CALL |
#E4E3 |
|
00610 |
|
DEFM |
/Name:/ |
|
00620 |
|
DEFB |
0 |
|
00630 |
LP 1 |
CALL |
#F652 |
|
00640 |
|
CP |
8 |
|
00650 |
|
RET |
C |
|
00660 |
|
CP |
13 |
|
00670 |
|
JR |
Z, LP |
|
00680 |
|
JR |
NC,AGA |
|
00690 |
LP4 |
DEC |
DE |
|
00700 |
|
LD |
A, E |
|
00710 |
|
CP |
#DD |
|
00720 |
|
JR |
C,NAME |
|
00730 |
|
LD |
A,32 |
|
00740 |
|
LD |
(DE),A |
|
00750 |
|
LD |
A,12 |
|
00760 |
|
INC |
B |
|
00770 |
|
INC |
B |
|
00780 |
|
JR |
LP3 |
|
00790 |
AGA |
LD |
(DE),A |
|
00800 |
|
INC |
DE |
|
00810 |
LP3 |
CALL |
#F503 |
|
00820 |
|
DJNZ |
LP 1 |
|
00830 |
|
RET |
|
|
00840 |
LP |
LD |
HL,23773 |
|
00850 |
|
LD |
A,(HL) |
|
00860 |
|
CP |
32 |
|
00870 |
|
RET |
NZ |
|
00880 |
|
LD |
A,90 |
|
00890 |
|
LD |
(HL),A |
|
00900 |
|
INC |
HL |
|
00910 |
|
PUSH |
HL |
|
00920 |
|
LD |
A,47 |
|
00930 |
|
LD |
(HL),A |
|
00940 |
LP2 |
POP |
HL |
|
00950 |
|
INC |
(HL) |
|
00960 |
|
PUSH |
HL |
|
00970 |
|
CALL |
FNAME |
|
00980 |
|
CP |
255 |
|
00990 |
|
JR |
NZ,LP2 |
|
01000 |
|
POP |
HL |
|
01010 |
|
RET |
|
|
01020 |
FNAME |
LD |
C,10 |
|
01030 |
|
CALL |
15635 |
|
01040 |
|
LD |
A, (23823 |
|
01050 |
|
RET |
|
|
01060 |
ERR |
CALL |
#E4E3 |
|
01070 |
|
DEFB |
13 |
|
01080 |
|
DEFM |
/Error / |
|
01090 |
BUF |
DEFB |
0,13,0 |
|
01100 |
|
JP |
#F1B3 |
|
01110 |
FILL |
LD |
HL,23773 |
|
01120 |
|
PUSH |
HL |
|
01130 |
|
PUSH |
HL |
|
01140 |
|
POP |
DE |
|
01150 |
|
INC |
DE |
|
01160 |
|
LD |
(HL),32 |
|
01170 |
|
LD |
BC, 8 |
|
01180 |
|
LDIR |
|
|
01190 |
|
LD |
(HL),67 |
|
01200 |
|
POP |
DE |
|
01210 |
|
RET |
|
|
01220 |
SAVEC |
CALL |
NAME |
|
01230 |
|
JP |
C, END |
|
01240 |
CODE |
CALL |
#E4E3 |
|
01250 |
|
DFEM |
/ Code:/ |
|
01260 |
|
DEFB |
0 |
|
01270 |
|
CALL |
NUM |
|
01280 |
|
JR |
C,LEND2 |
|
01290 |
|
LD |
H, A |
|
01300 |
|
CP |
#E0 |
|
01310 |
|
LD |
A,51 |
|
01320 |
|
LD |
(BUF),A |
|
01330 |
|
JP |
NC,ERR |
|
01340 |
|
CALL |
NUM |
|
01350 |
LEND2 |
JP |
C, END |
|
01360 |
|
LD |
L,A |
|
01370 |
|
CALL |
#F652 |
|
01380 |
|
CP |
13 |
|
01390 |
|
LD |
A,13 |
|
01400 |
|
CALL |
#F503 |
|
01410 |
|
CALL |
NZ,#F252 |
|
01420 |
|
JR |
NZ,CODE |
|
01430 |
|
PUSH |
HL |
|
01440 |
|
POP |
DE |
|
01450 |
|
CALL |
DLINA |
|
01460 |
|
LD |
A,53 |
|
01470 |
|
LD |
(BUF),A |
|
01480 |
|
JR |
NZ,ERR |
|
01490 |
|
PUSH |
HL |
|
01500 |
|
PUSH |
DE |
|
01510 |
|
LD |
A,54 |
|
01520 |
|
LD |
(BUF),A |
|
01530 |
|
CALL |
FNAME |
|
01540 |
|
CP |
255 |
|
01550 |
|
POP |
DE |
|
01560 |
|
POP |
HL |
|
01570 |
|
JR |
NZ,ERR |
|
01580 |
|
JR |
WHOD |
|
01590 |
NUM |
CALL |
#F652 |
|
01600 |
|
CP |
8 |
|
01610 |
|
RET |
C |
|
01620 |
|
CALL |
SRAW |
|
01630 |
|
AND |
A |
|
01640 |
|
JR |
Z,EXIT |
|
01650 |
|
LD |
D,A |
|
01660 |
|
CALL |
#F503 |
|
01670 |
|
LD |
A, D |
|
01680 |
|
CALL |
LA |
|
01690 |
|
RLCA |
|
|
01700 |
|
RLCA |
|
|
01710 |
|
RLCA |
|
|
01720 |
|
RLCA |
|
|
01730 |
|
LD |
D,A |
|
01740 |
|
CALL |
#F652 |
|
01750 |
|
CP |
8 |
|
01760 |
|
RET |
C |
|
01770 |
|
CALL |
SRAW |
|
01780 |
|
AND |
A |
|
01790 |
|
JR |
Z,EXIT |
|
01800 |
|
LD |
E,A |
|
01810 |
|
CALL |
#F503 |
|
01820 |
|
LD |
A, E |
|
01830 |
|
CALL |
LA |
|
01840 |
|
OR |
D |
|
01850 |
|
RET |
|
|
01860 |
LA |
SUB |
48 |
|
01870 |
|
CP |
10 |
|
01880 |
|
RET |
C |
|
01890 |
|
SUB |
7 |
|
01900 |
|
RET |
|
|
01910 |
SRAW |
CP |
48 |
|
01920 |
|
JR |
C, LER |
|
01930 |
|
CP |
58 |
|
01940 |
|
RET |
C |
|
01950 |
|
CP |
65 |
|
01960 |
|
JR |
C, LER |
|
01970 |
|
CP |
71 |
|
01980 |
|
RET |
C |
|
01990 |
LER |
CP |
7 |
|
02000 |
|
RET |
Z |
|
02010 |
|
XOR |
A |
|
02020 |
|
RET |
|
|
02030 |
EXIT |
POP |
HL |
|
02040 |
|
LD |
A,13 |
|
02050 |
|
CALL |
#F503 |
|
02060 |
|
CALL |
#F2 7 6 |
|
02070 |
|
JP |
CODE |
|
02080 |
DLINA |
PUSH |
HL |
|
02090 |
|
POP |
BC |
|
02100 |
|
PUSH |
HL |
|
02110 |
|
LD |
HL,573 |
|
02120 |
|
SBC |
HL, BC |
|
02130 |
|
PUSH |
HL |
|
02140 |
|
POP |
BC |
|
02150 |
|
POP |
HL |
|
02160 |
L8 |
LD |
A,101 |
|
02170 |
|
CPIR |
|
|
02180 |
|
RET |
NZ |
|
02190 |
|
LD |
A,(HL) |
|
02200 |
|
CP |
78 |
|
02210 |
|
JR |
NZ, L8 |
|
02220 |
|
INC |
HL |
|
02230 |
|
LD |
A,(HL) |
|
02240 |
|
CP |
68 |
|
02250 |
|
JR |
Z,L9 |
|
02260 |
|
DEC |
HL |
|
02270 |
|
JR |
L8 |
|
02280 |
L9 |
DEC |
HL |
|
02290 |
|
DEC |
HL |
|
02300 |
|
RET |
|
|
02310 |
DISK |
CALL |
#E4E3 |
|
02320 |
|
DEFM |
/a or : |
|
02330 |
|
DEFB |
0 |
|
02340 |
|
CALL |
#F652 |
|
02350 |
|
SUB |
65 |
|
02360 |
|
AND |
A |
|
02370 |
|
JR |
Z, DA |
|
02380 |
|
CP |
1 |
|
02390 |
|
JR |
Z, DA |
|
02400 |
|
JP |
#F1B3 |
|
02410 |
DA |
LD |
C,1 |
|
02420 |
|
LD |
(#5D19),A |
|
02430 |
|
JR |
LP5 |
|
02440 |
CAT |
LD |
C,24 |
|
02450 |
|
CALL |
15635 |
|
02460 |
|
LD |
A,2 |
|
02470 |
|
LD |
C,7 |
|
02480 |
LP5 |
CALL |
15635 |
|
02490 |
|
LD |
A,3 |
|
02500 |
|
CALL |
#1601 |
|
02510 |
LP 6 |
CALL |
#F652 |
|
02520 |
|
CP |
13 |
|
02530 |
|
JR |
C, LP6 |
|
02540 |
|
LD |
A,15 |
|
02550 |
|
CALL |
#F503 |
|
02560 |
|
JP |
END |
|
02570 |
P0 |
SUB |
79 |
|
02580 |
|
PUSH |
AF |
|
02590 |
|
LD |
A,27 |
|
02600 |
|
CALL |
#F95A |
|
02610 |
|
CALL |
A,108 |
|
02620 |
|
CALL |
#F95A |
|
02630 |
|
POP |
AF |
|
02640 |
|
CP |
40 |
|
02650 |
|
JR |
Z,P1 |
|
02660 |
|
XOR |
A |
|
02670 |
P1 |
CALL |
#F95A |
|
02680 |
|
RET |
|
После модернизации программы у Вас появятся несколько новых возможных сообщений об ошибках: 3 - адрес при записи на диск больше #Е000.
5 - нет метки (см. ниже).
6 - файл уже есть.
9 - нет файла на диске.
По поводу ошибки "5". В режиме SAVE CODE программа ищет байты 101, 78, 68 и по ним определяет длину блока. Например:
ORG LD OUT RET DEFM 101,78,
40000 A, 2 (254),
A
/eND/; )
Блок кодов будет загружен с адреса 40000 до "eND".
В заключение скажем несколько слов относительно поддержки Вашего принтера. Строки 2570...2680 выполняют действия, аналогичные строке Бейсика:
LPRINT CHR$ 2 7+"l"+CHR$ 40. Если Вас не устраивает значение "40", то Вам нужно будет поставить свой код управления табуляцией. Если у Вас "Скорпион-256", то можете просто набрать драйвер "1р 256", приведенный ниже. Иначе придется использовать (может быть писать или подбирать) свой драйвер.
|
|
|
"Ip256" |
for |
"SCORPION-256" |
|
|
|
F880 |
F5 |
3E |
85 |
32 |
7F |
5C |
3E |
00 |
|
F888 |
32 |
7B |
F9 |
F1 |
2A |
53 |
5C |
2B |
|
F890 |
2B |
2B |
2B |
2B |
11 |
E1 |
F8 |
72 |
|
F898 |
2B |
73 |
21 |
3C |
00 |
22 |
7C |
F9 |
|
F8A0 |
AF |
32 |
7E |
F9 |
3E |
98 |
00 |
00 |
|
F8A8 |
00 |
00 |
00 |
00 |
00 |
00 |
C9 |
CD |
|
F8B0 |
00 |
F9 |
7E |
E6 |
0F |
20 |
F8 |
C9 |
|
F8B8 |
2B |
CB |
FE |
2B |
CB |
FE |
C9 |
3E |
|
F8C0 |
20 |
18 |
42 |
FE |
40 |
38 |
02 |
D6 |
|
F8C8 |
07 |
E6 |
0F |
CB |
7E |
28 |
06 |
17 |
|
F8D0 |
17 |
17 |
17 |
77 |
C9 |
86 |
2B |
CB |
|
F8D8 |
BE |
18 |
2A |
CD |
4D |
F9 |
36 |
00 |
|
F8E0 |
C9 |
21 |
7C |
F9 |
CB |
7E |
23 |
20 |
|
F8E8 |
DA |
FE |
06 |
23 |
28 |
C1 |
FE |
0D |
|
F8F0 |
28 |
E9 |
FE |
20 |
00 |
FE |
7F |
28 |
|
F8F8 |
C6 |
38 |
07 |
D6 |
A5 |
C3 |
10 |
0C |
|
F900 |
3E |
20 |
F5 |
34 |
F1 |
CD |
1D |
F9 |
|
F908 |
18 |
50 |
00 |
00 |
0E |
FE |
ED |
78 |
|
F910 |
17 |
38 |
FB |
16 |
FE |
00 |
00 |
15 |
|
F918 |
20 |
FD |
00 |
00 |
C9 |
FE |
0E |
DA |
|
F920 |
42 |
F9 |
F5 |
DD |
21 |
7B |
F9 |
DD |
|
F928 |
7E |
00 |
DD |
34 |
00 |
DD |
21 |
7F |
|
F930 |
5C |
DD |
BE |
00 |
DA |
4B |
F9 |
3E |
|
F938 |
0D |
CD |
08 |
F9 |
3E |
00 |
CD |
08 |
|
F940 |
F9 |
F1 |
DD |
21 |
7B |
F9 |
DD |
36 |
|
F948 |
00 |
00 |
C9 |
F1 |
C9 |
3E |
0D |
CD |
|
F950 |
05 |
F9 |
3E |
00 |
C3 |
05 |
F9 |
00 |
|
F958 |
00 |
00 |
F5 |
CD |
54 |
1F |
D2 |
00 |
|
F960 |
0D |
DB |
FE |
E6 |
80 |
20 |
F4 |
F1 |
|
F968 |
01 |
DD |
FF |
ED |
79 |
F5 |
01 |
FD |
|
F970 |
1F |
AF |
CB |
EF |
ED |
79 |
AF |
ED |
|
F978 |
79 |
F1 |
C9 |
0E |
3C |
00 |
17 |
00 |
При подборе своего драйвера учтите возможное изменение адресов в строках 2600, 2620 и 2670. Эти строки должны адресоваться в блок кодов, аналогичный приведенному в Листинге_2.
Листинг_2.
|
00005 |
ORG |
#F95A |
|
00010 |
PUSH |
AF |
|
00020 L1 |
CALL |
#1F54 |
|
00030 |
JP |
NC,#0D00 |
|
00040 |
IN |
A, (254) |
|
00050 |
AND |
128 |
|
00060 |
JR |
NZ . L1 |
|
00070 |
POP |
AF |
|
00080 |
LD |
BC,FFDD |
|
00090 |
OUT |
(C) , A |
|
00100 |
PUSH |
AF |
|
00110 |
LD |
BC,#1FFD |
|
00120 |
XOR |
A |
|
00130 |
SET |
5,A |
|
00140 |
OUT |
(C) , A |
|
00150 |
XOR |
A |
|
00160 |
OUT |
(C) , A |
|
00170 |
POP |
AF |
|
00180 |
RET |
|
При желании можно вообще убрать всякое упоминание о принтере: удалите строки 2570-2680; 110-160; и измените строки 20-30 на: 20 CP 83
30 JP Z, SAVE
ИФК: Заканчивая эту статью, мы не заканчиваем эту тему. Пользовательская адаптация программ под TR-
DOS - это один из самых интересных и важных вопросов.
* * *
|
|