| 
| |   | 
 Читатель - читателю - хочу предложить читателям свою программу "SYMBOL-NINJA". 
 
 | 
 
Процедура SYMBOL-NINJA © Дмитрий Глотов, г. Нижний Новгород, 1994 г. Я хочу предложить читателям свою программу "SYMBOL-NINJA". Эту небольшую процедуру можно использовать и для оформления программ, и для оформления загрузчика. Программа по одной букве, оригинальным образом выводит сообщение со звуковым сопровождением. Звуки я создавал с применением программы "SPECSOUND" и после программы привожу дисассемблер этих звуков. Программа выводит одну строку сообщения с одним звуком, а другую - с другим. Итак, программа. 
| 00010 | LEN | EQU | 63 | Полная длина сообщения. |  | 00020 | LEN1 | EQU | 32 | Половина длины сообщения. |  | 00030 | ADR | EQU | 22464 | Адрес в дисплейном файле. |  | 00040 |  | ORG | 40000 |  |  | 00050 |  | ENT |  |  |  | 00060 |  | LD | HL,LEN | B HL - длина сообщения. |  | 00070 |  | LD | (BUFF),HL | Пересылка ее в буфер. |  | 00080 |  | LD | BC,ADR | Место вывода сообщения на экран. |  | 00090 |  | LD | IY,DATA | B IY - адрес сообщения. |  | 00100 | SCROLL | LD | L, (IY) | Код первого символа сообщения. |  | 00110 |  | LD | H, 0 | Очистка Н. |  | 00120 |  | PUSH | IY | Сохранение регистров на стеке |  | 00130 |  | PUSH | BC | для последующих расчетов. |  | 00140 |  | LD | DE, (23606) | Расчет места |  | 00150 |  | ADD | HL, HL | шаблона символа |  | 00160 |  | ADD | HL, HL | в символьном |  | 00170 |  | ADD | HL, HL | наборе. |  | 00180 |  | ADD | HL, DE |  |  | 00190 |  | EX | DE, HL |  |  | 00200 |  | LD | H, B |  |  | 00210 |  | LD | L, C | B HL - адрес начала вывода символа. |  | 00220 |  | LD | A, 1 | Нач. количество выводимых линий символа |  | 00230 | LOOP | LD | B, A | Счетчик выводимых на экран линий. |  | 00240 |  | PUSH | DE | Адрес первой линии символа. |  | 00250 |  | PUSH | HL | Адрес начала вывода сообщения. |  | 00260 |  | PUSH | AF | в А - количество выводов на экран, для вывода всего символа - 8 повтор. |  | 00270 | LOOP1 | LD | A,(DE) | Переброска одной линии |  | 00280 |  | LD | (HL),A | символа на экран. |  | 00290 |  | PUSH | BC | Вызов |  | 00300 |  | CALL | WAIT | процедуры |  | 00310 |  | POP | BC | задержки. |  | 00320 |  | INC | DE | Переход к следующей линии символа. |  | 00330 |  | INC | H | Переход к месту печати следующей линии. |  | 00340 |  | DJNZ | LOOP1 | Повторение для всех 8 линий символа. |  | 00350 |  | POP | AF | Восстановление |  | 00360 |  | POP | HL | значений |  | 00370 |  | POP | DE | регистров. |  | 00380 |  | DEC | H | Переход для вывода на 1 линию выше. |  | 00390 |  |  |  | Увеличение счетчика числа выводов. |  | 00400 |  | CP | 9 | Если выведены все 8 линий (А=9), |  | 00410 |  | JR | Z,LOOP2 | то переход к выводу звука. |  | 00420 |  | JR | LOOP | Иначе - возврат и повторение. |  | 00430 | LOOP2 | CALL | SOUND | Вызов звука. |  | 00440 |  | POP | BC | Восстановление адреса вывода сообщения, |  | 00450 |  | POP | IY | Восстановление адреса хранения сообщени |  | 00460 |  | INC | BC | Переход к следующему знакоместу. |  | 00470 |  | INC | IY | Переход к следующему символу. |  | 00480 |  | LD | A, (IY) | B A - код символа. |  | 00490 |  | CP | 0 | Проверка на маркер конца (А=0). |  | 00500 |  | JR | Z, END | Если конец достигнут, завершение. |  | 00510 |  | JR | SCROLL | Иначе - вывод следующего символа. |  | 00520 | WAIT | LD | BC,500 | Время задержки. |  | 00530 | WAIT1 | DEC | BC | Уменьшение счетчика задержки. |  | 00540 |  | LD | A, B | Проверка содержимого |  
|  |  |  | ЧШСЯЖЕЛЪ |  |  | 00550 |  | OR | C | BC на ноль. |  | 00560 |  | OR | NZ,WAIT1 ; | Если нет, то повтор. |  | 00570 |  | RET |  | Иначе - возврат. |  | 00580 | END | LD | IY,23610 | Восстанов. IY для корректного завершения |  | 00590 |  | RET |  | Выход из процедуры. |  | 00600 | DATA | DEFM | " WRITTEN BY | Текст сообщения. |  | 00610 |  | DEFM | " (C)CRYSTAL |  |  | 00620 |  | DEFM | "SOFT 1994 ; |  |  | 00630 |  | DEFM | " N.NOVGOROD |  |  | 00640 |  | DEFM | " TEL. (8312) |  |  | 00650 |  | DEFM | "54-95-320 |  |  | 00660 |  | DEFB | 0 | Маркер конца сообщения. |  | 00670 | BUFF | DEFW | 0 | Буфер. |  | 00680 | SOUND | XOR | A | Обнуление А. |  | 00690 |  | LD | HL,(BUFF) | B HL - длина сообщения. |  | 00700 |  | DEC | L | Уменьшили на единицу. |  | 00710 |  | LD | (BUFF),HL | Зафиксировали новую длину. |  | 00720 |  | LD | A, L | Проверка достижения половины. |  | 00730 |  | CP | LEN1 ; | Половина сообщения достигнута? |  | 00740 |  | JR | CSOUND2 | Если да, то смена звука. |  | 00750 | SOUNDI | LD | C,1 ; | Процедура |  | 00760 | N1 | LD | B, 15 | "звук 1", |  | 00770 | N2 | LD | HL,100 | используется |  | 00780 |  | PUSH | BC | при выводе |  | 00790 |  | LD | DE,1 ; | первой |  | 00800 |  | PUSH | HL | ПОЛОВИНЫ |  | 00810 |  | CALL | #03B5 | сообщения. |  | 00820 |  | POP | HL |  |  | 00830 |  | LD | DE,100 ; |  |  | 00840 |  | ADC | HL, DE |  |  | 00850 |  | POP | BC |  |  | 00860 |  | DJNZ | N2 |  |  | 00870 |  | LD | A,2 ; |  |  | 00880 |  | INC | C |  |  | 00890 |  | LD | B, C |  |  | 00900 |  | CP | B |  |  | 00910 |  | OR | NZ, N1 |  |  | 00920 |  | RET |  |  |  | 00930 | SOUND2 | LD | C,1 ; | Процедура |  | 00940 | N3 | LD | B, 3 | "звук 2", |  | 00950 | N4 | LD | HL,300 | используется |  | 00960 |  | PUSH | BC | при выводе |  | 00970 |  | LD | DE,8 ; | второй |  | 00980 |  | PUSH | HL | половины |  | 00990 |  | CALL | #03B5 | сообщения. |  | 01000 |  | POP | HL |  |  | 01010 |  | LD | DE,300 ; |  |  | 01020 |  | ADC | HL, DE |  |  | 01030 |  | POP | BC |  |  | 01040 |  | DJNZ | N4 |  |  | 01050 |  | LD | A,2 ; |  |  | 01060 |  | INC | C |  |  | 01070 |  | LD | B, C |  |  | 01080 |  | CP | B |  |  | 01090 |  | JR | NZ, N3 |  |  | 01100 |  | RET |  |  |  | Start | of object: #9C40 | (40000) |  |  | Length | : #00EB | (00235) |  |  | Executes | : # 9C4 0 | (40000) |  |  Теперь, как обычно, приводим шестнадцатеричный дамп приведенной процедуры. Стартовый адрес -40000, длина - 235 байт: 
| 9C40 | 21 | 3F | 00 | 22 | DC | 9C | 01 | C0 |  | 97 |  | 9C48 | 57 | FD | 21 | 9C | 9C | FD | 6E | 00 |  | FC |  | 9C50 | 26 | 00 | FD | E5 | C5 | ED | 5B | 36 |  | 37 |  | 9C58 | 5C | 29 | 29 | 29 | 19 | EB | 60 | 69 |  | 98 |  | 9C60 | 3E | 01 | 47 | D5 | E5 | F5 | 1A | 77 |  | C2 |  | 9C68 | C5 | CD | 8E | 9C | C1 | 13 | 24 | 10 |  | C8 |  | 9C70 | F5 | F1 | E1 | D1 | 25 | 3C | FE | 09 |  | 0C |  | 9C78 | 28 | 02 | 18 | E6 | CD | DE | 9C | C1 |  | 44 |  | 9C80 | FD | E1 | 03 | FD | 23 | FD | 7E | 00 |  | 98 |  | 9C88 | FE | 00 | 28 | 0B | 18 | BF | 01 | F4 |  | 21 |  | 9C90 | 01 | 0B | 78 | B1 | 20 | FB | C9 | FD |  | 42 |  | 9C98 | 21 | 3A | 5C | C9 | 20 | 57 | 52 | 49 |  | C6 |  | 9CA0 | 54 | 54 | 45 | 4E | 20 | 42 | 59 | 20 |  | 52 |  | 9CA8 | 28 | 43 | 29 | 43 | 52 | 59 | 53 | 54 |  | 6D |  | 9CB0 | 41 | 4C | 53 | 4F | 46 | 54 | 20 | 31 |  | 66 |  | 9CB8 | 39 | 39 | 34 | 20 | 20 | 4E | 2E | 4E |  | 04 |  | 9CC0 | 4F | 56 | 47 | 4F | 52 | 4F | 44 | 20 |  | 9C |  | 9CC8 | 54 | 45 | 4C | 2E | 28 | 38 | 33 | 31 |  | 3B |  | 9CD0 | 32 | 29 | 35 | 34 | 2D | 39 | 35 | 2D |  | F8 |  | 9CD8 | 33 | 32 | 30 | 00 | 00 | 00 | AF | 2A |  | E2 |  | 9CE0 | DC | 9C | 2D | 22 | DC | 9C | 7D | FE |  | 36 |  | 9CE8 | 20 | 38 | 20 | 0E | 01 | 06 | 0F | 21 |  | 41 |  | 9CF0 | 64 | 00 | C5 | 11 | 01 | 00 | E5 | CD |  | 79 |  | 9CF8 | B5 | 03 | E1 | 11 | 64 | 00 | ED | 5A |  | E9 |  | 9D00 | C1 | 10 | EC | 3E | 02 | 0C | 41 | B8 |  | 9F |  | 9D08 | 20 | E3 | C9 | 0E | 01 | 06 | 03 | 21 |  | AA |  | 9D10 | 2C | 01 | C5 | 11 | 08 | 00 | E5 | CD |  | 6A |  | 9D18 | B5 | 03 | E1 | 11 | 2C | 01 | ED | 5A |  | D3 |  | 9D20 | C1 | 10 | EC | 3E | 02 | 0C | 41 | B8 |  | BF |  | 9D28 | 20 | E3 | C9 | 00 | 00 | 00 | 00 | 00 |  | 91 |  И еще несколько слов о процедурах звуковых эффектов, отмеченных в листинге метками SOUND1 и SOUND2. Те, кто хочет получить исчерпывающую информацию на эту тему, могут обратиться к материалу, подготовленному в свое время Андреем Алексеевым (см. РЕВЮ-92, № 11-12, стр. 241). * * * 
 
 |  
 
 |