╒══════════════════════════════╕
│░░░░░ ПРОГРАММИРОВАНИЕ ░░░░░│
╘══════════════════════════════╛
Кузнецов Владимир
─────────────────
Каждый начинающий
программист хочет
сделать бегущую
строчку. Но с чего
начать? Может ее у
кого- нибудь "выта-
щить"?
Ответ на вопрос очень прост:
обратиться к тому, кто ее уже
сделал сам! Ко мне многие
обращались с просьбой о помощи и
я решил опубликовать несколько
конкретных примеров. И так,
приступим...
ORG #8000
FONT EQU #3D00 ;Адрес начала
;шрифта
WBUF EQU #7E00 ;Адрес начала
;буфера
SCROL1: LD A,1
RRCA
LD (SCROL1+1),A
JR NC,SCROL5
Пытаемся вычислить местоположе-
ние в шрифте новой буквы...
SCROL3: LD HL,TEXT
LD A,(HL)
INC HL
SUB #20
JR NC,SCROL2
Конец текста - код меньше #20
LD HL,TEXT
XOR A
SCROL2: LD (SCROL3+1),HL
LD DE,FONT
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,DE
Переносим символ в рабочий буфер
LD B,8
LD DE,WBUF+32
SCROL4: PUSH BC
LDI
EX DE,HL
LD BC,32
ADD HL,BC
EX DE,HL
POP BC
DJNZ SCROL4
Скроллируем (сдвигаем) рабочий
буфер...
SCROL5: LD HL,WBUF+263
LD B,132
SCROL6: RL (HL)
DEC HL
RL (HL)
DEC HL
DJNZ SCROL6
Если вы пользуетесь TASM3.2 и
вам не жалко памяти (процедура
увеличивается в об'еме на 518
байт), то это можно записать
так:
SCROL5: LD HL,WBUF+263
DEFS 264,#CB,#16,#2B
Зато выигрыш во времени
составит 1586 тактов! Повысить
скорость работы можно еще на 264
такта:
SCROL5: LD HL,WBUF+263
DEFS 132,#CB,#16,#2B
DEFS #CB,#16,#2D
Далее выводим буфер на экран...
Это можно сделать традиционным
способом:
LD HL,WBUF
LD DE,#5000
LD B,8
SCROL7: PUSH BC
PUSH DE
LD BC,32
LDIR
POP DE
POP BC
INC HL
INC D
DJNZ SCROL7
RET
|гСкорость работы: 5968 тактов.
Но существуют более хитрые и
притом более быстрые способы
вывода.
Например вывод можно оформить
так:
LD HL,WBUF
LD DE,#5000
LD B,8
SCROL7: PUSH BC
PUSH DE
DEFS 32,#ED,#A0
POP DE
POP BC
INC HL
INC D
DJNZ SCROL7
RET
Скорость работы: 4688 тактов.
А "раскрыв" цикл, вы увеличите
скорость вывода до 4424 тактов!
Но лично мне более нравится
копирование с помощью стека:
DI
EXX
PUSH HL
LD (SAVESP+1),SP
LD SP,WBUF
POP AF
POP HL
POP DE
POP BC
EX AF,AF'
EXX
POP AF
POP HL
POP DE
POP BC
LD SP,#5010
PUSH BC
PUSH DE
PUSH HL
PUSH AF
EX AF,AF'
EXX
PUSH BC
PUSH DE
PUSH HL
PUSH AF
Далее повторяем этот блок, но
с изменениями:
LD SP,WBUF+16
POP AF
.....
LD SP,#5020
PUSH BC
.....
LD SP,WBUF+33
POP AF
.....
LD SP,#5110
PUSH BC
.....
LD SP,WBUF+49
POP AF
.....
LD SP,#5120
PUSH BC
.....
.....
.....
LD SP,#5720
PUSH BC
.....
SAVESP: LD SP,0
POP HL
EXX
EI
RET
Заметили алгоритм вычисления?
Если нет, то воспользуйтесь моей
программкой:
10 FOR I=0 TO 7
20 PRINT I*33,I*33+16
30 NEXT I
Полученные числа являются смеще-
ниями в рабочем буфере.
Экранные адреса вычисляются так:
10 FOR I=0 TO 7
20 PRINT I*256+16,I*256+32
30 NEXT I
Примечание: при работе со стеком
прерывания должны быть запрещены
(команда DI) и сохранена регист-
ровая пара HL' (альтернативная).
Скорость работы: 3520 тактов!!!
* * *