И наконец - хочу привести усовершенствованную версию Advanced Drive FX, опубликованного в ZX РЕВЮ 95/5. Новая версия несколько более понятна, меньше по объему, позволяет оперировать со всеми дисководами от A до D и изменять скорость зажигания и затухания светодиода. Для зажигания необходимо вызвать процедуру F_IN, а для затухания - F_OUT. Подпрограммы работы с портами настроены на TR-DOS 5.03. Для работы с другими версиями нацо изменить адреса в строках 390-410. В строке 420 регулируется скорость эффекта, а в строке 430 задается дисковод.
10 |
ORG |
50000 |
|
|
|
|
2 0 F_IN |
LD |
E, 1 |
|
|
зажигание производится при изменении переменнс |
|
|
|
|
|
на +1 |
|
30 |
JR |
DO_FX |
|
|
переход на процедуру |
|
4 0 F_OUT |
LD |
E, 255 |
|
|
затухание производится при изменении |
|
|
|
|
|
переменной на -1 |
|
50 DO_FX |
XOR |
A |
|
|
подготовка аккумулятора |
|
60 LOOP1 |
ADD |
A, E |
|
|
изменяем переменную |
|
70 |
RET |
Z |
|
|
выход, если светодиод зажегся или полностью |
потух |
80 |
LD |
B,SPEED |
|
|
взяли скорость загорания (затухания) |
90 LOOP2 |
PUSH |
BC |
|
|
сохранили счетчик |
|
100 |
LD |
D,A |
|
|
сохранили указатель загорания (затухания) |
110 |
LD |
HL,OUT_FF |
|
адрес подпрограммы вывода регистра A в |
|
|
|
|
|
системным регистр (порт #FF) |
|
120 |
LD |
A,#3C |
|
|
в аккумуляторе необходимое число, |
которое |
|
|
|
|
|
указывает на номер дисковода: биты 0 и 1. |
130 |
CALL |
DOS |
|
|
заносим число в порт |
|
140 |
LD |
HL,OUT_1F |
|
выдаем команду контроллеру "Чтение |
|
|
|
|
|
адреса" |
|
150 |
LD |
A,#D0 |
|
|
|
|
160 |
CALL |
DOS |
|
|
|
|
17 0 WAIT |
LD |
HL,IN_1F |
|
; |
чтение регистра состояния |
|
180 |
CALL |
DOS |
|
|
|
|
190 |
XOR |
#80 |
|
; |
проверка готовности дисковода |
|
200 |
JR |
NZ,WAIT |
|
; |
если не готов, то ждать |
|
210 |
LD |
A,8 |
|
; |
выдаем команду "Восстановление" |
|
220 |
LD |
HL,OUT_1F |
|
|
|
230 |
CALL |
DOS |
|
|
|
|
240 |
LD |
B,D |
|
; |
задержка |
|
250 |
DJNZ |
$ |
|
|
|
|
260 |
LD |
HL,OUT_FF |
; |
выбираем нужный дисковод |
|
270 |
LD |
A,DRVNUM |
|
|
|
|
280 |
CALL |
DOS |
|
|
|
|
290 |
LD |
A, D |
|
; |
восстановили указатель |
|
300 |
NEG |
;изменили |
знак |
|
|
310 |
LD |
B,A |
|
; |
задержка |
|
320 |
DJNZ |
$ |
|
|
|
|
330 |
LD |
A, D |
|
; |
восстановили указатель |
|
340 |
POP |
BC |
|
; |
восстановили счетчик |
|
350 |
DJNZ |
LOOP2 |
|
; |
повтор, пока счетчик не обнулился |
360 |
JR |
LOOP1 |
|
; |
переход на начало процедуры |
|
370 DOS |
PUSH |
HL |
|
; |
процедура вызова подпрограмм из ПЗУ TR-DOS |
380 |
JP |
#3D2F |
|
|
|
|
390 IN_1F EQU |
#09BF |
|
; |
адрес подпрограммы чтения системного регистра |
|
|
|
|
; |
необходимо изменить под конкретным тип ПЗУ |
400 OUT_ |
1F EQU |
#2FC3 |
|
; |
выдача команды для контроллера |
|
410 OUT_ |
FF EQU |
#1FF3 |
|
; |
запись системного регистра |
|
420 SPEED EQU |
#08 |
|
; |
скорость эффектов |
|
430 DRVNUM EQU |
#00 |
|
; |
номер дисковода |
|
Ниже приводится дамп программы: |
|
|
|
C350 |
|
1E |
01 18 02 1E FF AF 83 |
9B |
|
|
C358 |
|
C8 |
06 08 C5 57 21 F3 1F |
40 |
|
|
C360 |
|
3E |
3C CD 96 C3 21 C3 2F |
D 6 |
|
|
C3 68 |
|
3E |
D0 CD 96 C3 21 BF 09 |
48 |
|
|
C37 0 |
|
CD |
96 C3 EE 80 20 F 6 3E |
1B |
|
|
C37 8 |
|
08 |
21 C3 2F CD 96 C3 42 |
BE |
|
|
C380 |
|
10 |
FE 21 F3 1F 3E 00 CD |
8F |
|
|
C388 |
|
96 |
C3 7 A ED 44 47 10 FE |
A4 |
|
|
C3 90 |
|
7A |
C1 10 C7 18 C1 E5 C3 |
E 6 |
C3 98 || 2F 3D 00 00 00 00 00 00 || C7
Не забудьте, что при использовании других версий TR-DOS надо изменить адрес в строке 390. Для того чтобы узнать, есть ли у Вас в ПЗУ такая подпрограмма, необходимо сначала выгрузить ПЗУ TR-DOS на диск. Для этого войдите в TR-DOS и наберите команду SAVE "TRDOS"CODE 0,16384.
Затем загрузите этот блок в память и наберите небольшую программку: 5 RANDOMIZE USR 15619: REM : LOAD "TRDOS" CODE 49152 10 FOR N=49152 TO 65535
20 IF PEEK N=219 AND PEEK (N+1)=31 AND PEEK (N+2)=201 THEN PRINT AT 10,10,"N-4 9152:PAUSE 0 30 NEXT N
В процессе работы программы на экран может быть выведен адрес, который необходимо подставить в строку 390. Если адрес не будет выведен, то нужно будет использовать другой доступ к системному регистру, например, как в предыдущей версии программы, которая была опубликована в ZX РЕВЮ 95/5.