|
Секреты 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 - это один из самых интересных и важных вопросов.
* * *
|
|