И наконец - хочу привести усовершенствованную версию 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.