Speccy
#05
30 апреля 1996 |
|
Программирование - Как сделать бегущую строчку.
╒══════════════════════════════╕ │░░░░░ ПРОГРАММИРОВАНИЕ ░░░░░│ ╘══════════════════════════════╛ Кузнецов Владимир ───────────────── Каждый начинающий программист хочет сделать бегущую строчку. Но с чего начать? Может ее у кого- нибудь "выта- щить"? Ответ на вопрос очень прост: обратиться к тому, кто ее уже сделал сам! Ко мне многие обращались с просьбой о помощи и я решил опубликовать несколько конкретных примеров. И так, приступим... 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 тактов!!! * * *
Другие статьи номера:
Похожие статьи:
В этот день... 9 декабря