(С) Михаил Бульканов,
Московская обл., 1995.
Предлагаю несколько небольших
программ на ассемблере, которые я
сам придумал. Каждую из них я от-
лаживал и старался сделать как
можно короче.
1. Эта программа распечатывает
двухбайтовое шестнадцатиричное
число (#0000...#FFFF), которое
задается в регистре HL на входе в
процедуру. Печать выполняется при
помощи RST 16, поэтому перед ее
использованием должен быть открыт
канал печати (для экрана: LD A,2:
CALL #1601).
00010 PRH LD C,#04
00020 PH0 LD B,#04
00030 XOR A
00040 PH1 RL L
00050 RL H
00060 RLA
00070 DJNZ PH1
00080 CP #0A
00090 JR C,PH2
00100 ADD A,#07
00110 PH2 ADD A,#30
00120 RST 16
00130 DEC C
00140 JR NZ,PH0
00150 RET
2. Эта программа печатает
строку символов, причем с диск-
ретностью в 1 пиксел по Y-коорди-
нате. Символ может быть как стан-
дартным (непосредственно из сим-
вольного набора), так и сформиро-
ванный самой процедурой в процес-
се вывода.
00010 ORG 40000
00020 PRT LD A,(HL)
00030 OR A
00040 RET Z
00050 DEC A
00060 JR NZ,PT1
00070 INC HL
00080 LD E,(HL)
00090 INC HL
00100 LD A,(HL)
00110 INC HL
00120 CP #58
00130 JR NC,PT1
00140 LD D,A
00150 PT1 PUSH HL
00160 LD L,(HL)
00170 CALL PRS
00180 POP HL
00190 INC E
00200 INC HL
00210 JR PRT
00220 PRS PUSH DE
00230 LD H,0
00240 ADD HL,HL
00250 ADD HL,HL
00260 ADD HL,HL
00270 LD BC,#3C00
00280 ADD HL,BC
00290 LD B,8
00300 PSL LD A,(HL)
00310 RRCA
00320 OR (HL)
00330 RRA
00340 OR (HL)
00350 LD (DE),A
00360 CALL YINC
00370 INC HL
00380 DJNZ PSL
00390 POP DE
00400 RET
00410 YINC INC D
00420 LD A,D
00430 AND 7
00440 RET NZ
00450 LD A,E
00460 ADD A,#20
00470 LD E,A
00480 RET C
00490 LD A,D
00500 SUB 8
00510 LD D,A
00520 RET
На входе в процедуру в регист-
ре HL должен быть задан адрес на-
чала строки текста, а в регистре
DE - адрес в дисплейном файле,
соответствующий верхней пиксель-
ной линии первого символа строки.
Для упрощения процедуры расчет
этого адреса исключен, хотя, в
принципе может быть выполнен (см.
например, ZX-РЕВЮ-94,N3,стр.44).
Строка текста должна завер-
шаться нулевым символом.
Еще в процедуре предусмотрен
код для изменения позиции печати.
Если в строке встретился код #01,
то следом за ним должен находить-
ся новый адрес в дисплейном файле
(2 байта для регистра DE).
Блок строк с 330 по 350 может
иметь несколько вариантов для по-
лучения различных модификаций
шрифтов. Например такой:
00330 BIT 2,B
00335 JR NZ,PSM
00340 RRA
00345 OR (HL)
00350 PSM LD (DE),A
Или такой:
00330 BIT 1,B
00335 JR Z,PSM
00340 RRA
00345 OR (HL)
00350 PSM LD (DE),A
Кроме того, если Вы добавите
несколько новых строк, то получи-
те двукратное увеличение символов
по высоте:
00355 LD C,A
00356 CALL YINC
00357 LD A,C
00358 LD (DE),A
А следующая замена позволит
сделать символы удвоенной высоты
"полосатыми":
00355 ;
00356 CALL YINC
00357 XOR A
00358 LD (DE),A
3. Следующая программа доволь-
но красиво выводит на экран кар-
тинку, предварительно помещенную
в буфер (по адресу BUFF). Картин-
ка выводится вместе с атрибутами.
Причем программа имеет особен-
ность: изменяя число в строке 40,
вывод картинки будет происходить
новым способом, то есть эта прог-
рамма является малодетерминиро-
ванной. Для этого надо генериро-
вать это число случайным образом
- это значительно повышает инте-
рес к процедуре. Число должно
быть в диапазоне от 1 до 6911,
оно должно быть нечетным и не
кратным трем (например, 5, 7,
11...), иначе вывод "зацикливает-
ся" на некоторых байтах. Искомое
число Х можно найти по формуле:
X=(INT(N/2)+N)*2-1
где N лежит в диапазоне от 1 до
2304 (то есть возможно 2304 вари-
анта вывода картинки).
00010 BUFF EQU 41000
00020 ORG 40000
00030 ENT
00040 LD HL,#4000
00050 LD BC,#1B00
00060 SC1 LD DE,701
00070 ADD HL,DE
00080 LD A,H
00090 CP #5B
00100 JR C,SC2
00110 LD DE,#E500
00120 ADD HL,DE
00130 SC2 PUSH HL
00140 LD DE,BUFF-#4000
00150 ADD HL,DE
00160 EX DE,HL
00170 LD L,#20
00180 SC3 DEC L
00190 JR NZ,SC3
00200 POP HL
00210 LD A,(DE)
00220 LD (HL),A
00230 DEC BC
00240 LD A,B
00250 OR C
00260 JR NZ,SC1
00270 RET
Start of object: #9C40 (40000)
Length : #0027 (00039)
Executes : #9C40 (40000)
9C40: 21 00 40 01 00 1B 11 BD :27
9C48: 02 19 7C FE 5B 38 04 11 :21
9C50: 00 E5 19 E5 11 28 60 19 :81
9C58: EB 2E 20 2D 20 FD E1 1A :72
9C60: 77 0B 78 B1 20 E0 C9 00 :70
Если загрузить картинку по ад-
ресу 41000, а сам блок кодов -
40000, то продемонстрировать его
работу поможет Бейсик-программа:
100 FOR n=1 TO 2304
110 LET x=(INT (n/2)+n)*2-1
120 RANDOMIZE x: POKE 40007,PEE
K 23670: POKE 40008,PEEK 23671
130 RANDOMIZE USR 40000: BEEP 0
.1,20: PAUSE 20: CLS : PAUSE 20:
NEXT n
От себя мы можем порекомендо-
вать воспользоваться этой Бей-
сик-программой для нахождения на-
иболее эффектных значений пара-
метра х, для последующего их ис-
пользования в этой процедуре.
А вообще, нам очень понрави-
лись программы, присланные Михаи-
лом. От всей души желаем автору
дальнейших успехов.
Теперь еще пара программ, вы-
полняющих действия с экраном.
(C) Евгений Сайфутдинов,
г.Усинск (Коми), 1995.
Программа выводит на экран
картинку, предварительно загру-
женную в память.
Эта программа, видимо, заимс-
твована из какой-то игры, поэтому
мы приводим ее с небольшими изме-
нениями, заключающимися в некото-
ром упрощении ее структуры (раск-
рытие операторов CALL).
Действие программы похоже на
программу "ВОТ ТАК!" (см. ZX-РЕ-
ВЮ-94, N3, стр.47 и N6, стр.47),
однако, немного отличается.
00010 ORG 40000
00020 ENT
00030 DI
00040 LD A,0
00050 OUT (254),A
00060 LD HL,16384
00070 LD DE,16385
00080 LD BC,6143
00090 LD (HL),0
00100 LDIR
00110 LD HL,22528
00120 LD DE,22529
00130 LD (HL),7
00140 LD BC,767
00150 LDIR
00160 LD A,1
00170 L1 PUSH AF
00180 LD HL,BUFF-1
00190 LD DE,16383
00200 L2 INC HL
00210 INC DE
00220 PUSH AF
00230 LD A,E
00240 CP 3
00250 JR NZ,L3
00260 POP AF
00270 JR L7
00280 L3 POP AF
00290 LD BC,2047
00300 PUSH HL
00310 PUSH DE
00320 L4 PUSH AF
00330 AND (HL)
00340 EX DE,HL
00350 OR (HL)
00360 EX DE,HL
00370 PUSH BC
00380 LD B,1
00390 L5 DJNZ L5
00400 POP BC
00410 LD (DE),A
00420 DEC BC
00430 LD A,B
00440 OR C
00450 JR Z,L6
00460 POP AF
00470 RLCA
00480 RLCA
00490 RLCA
00500 RLCA
00510 INC HL
00520 INC HL
00530 INC HL
00540 INC DE
00550 INC DE
00560 INC DE
00570 JR L4
00580 L6 POP AF
00590 POP DE
00600 POP HL
00610 JR L2
00620 L7 POP AF
00630 RLCA
00640 RLCA
00650 RLCA
00660 CP 1
00670 JR NZ,L1
00680 LD HL,BUFF+6144
00690 LD DE,22528
00700 LD BC,768
00710 LDIR
00720 EI
00730 RET
00740 BUFF DEFS 6912
00750 ; ADDRESS SCR=40113
Start of object: #9C40 (40000)
Length : #1B71 (07025)
Executes : #9C40 (40000)
Длина программы (7025 байтов)
указана с учетом картинки, нахо-
дящейся сразу же за ней (по адре-
су BUFF). Длина собственно прог-
раммы равна 113 байтов.
9C40: F3 3E 00 D3 FE 21 00 40 :3F
9C48: 11 01 40 01 FF 17 36 00 :83
9C50: ED B0 21 00 58 11 01 58 :6C
9C58: 36 07 01 FF 02 ED B0 3E :0E
9C60: 01 F5 21 B0 9C 11 FF 3F :AE
9C68: 23 13 F5 7B FE 03 20 03 :CE
9C70: F1 18 29 F1 01 FF 07 E5 :1B
9C78: D5 F5 A6 EB B6 EB C5 06 :DB
9C80: 01 10 FE C1 12 0B 78 B1 :32
9C88: 28 0D F1 07 07 07 07 23 :89
9C90: 23 23 13 13 13 18 E2 F1 :96
9C98: D1 E1 18 CC F1 07 07 07 :D0
9CA0: FE 01 20 BD 21 B1 B4 11 :AF
9CA8: 00 58 01 00 03 ED B0 FB :38
9CB0: C9 00 00 00 00 00 00 00 :15
С адреса 40113 (#9СВ1) разме-
щается картинка.
Следующая процедура взята из
программы CRYSTAL QUEST. При ее
вызове по экрану сверху вниз про-
бегает полоса шириной в 1 пиксел,
стирая находящееся на экране
изображение.
Программа также приводится с
небольшими изменениями.
00010 ORG 40000
00020 ENT
00030 LD HL,16384
00040 LD A,191
00050 L1 HALT
00180 EX AF,AF'
00190 PUSH HL
00200 LD D,H
00210 LD E,L
00220 INC E
00230 LD BC,31
00240 LD (HL),B
00250 LDIR
00260 POP HL
00270 PUSH HL
00280 CALL L2
00290 LD D,H
00300 LD E,L
00310 INC E
00320 LD BC,31
00330 LD (HL),85
00340 LDIR
00350 POP HL
00360 CALL L2
00370 EX AF,AF'
00380 DEC A
00390 JR NZ,L1
00400 LD HL,22496
00410 LD DE,22497
00420 LD BC,31
00430 LD (HL),0
00440 LDIR
00450 LD HL,22528
00460 LD DE,22529
00470 LD BC,767
00480 LD (HL),0
00490 LDIR
00550 RET
00560 L2 INC H
00570 LD A,H
00580 AND 7
00590 RET NZ
00600 LD A,H
00610 SUB 8
00620 LD H,A
00630 LD A,L
00640 ADD A,32
00650 LD L,A
00660 RET NC
00670 LD A,H
00680 ADD A,8
00690 LD H,A
00700 RET
Start of object: #9C40 (40000)
Length : #0056 (00086)
Executes : #9C40 (40000)
9C40: 21 00 40 3E BF 76 08 E5 :9D
9C48: 54 5D 1C 01 1F 00 70 ED :2E
9C50: B0 E1 E5 CD 83 9C 54 5D :FF
9C58: 1C 01 1F 00 36 55 ED B0 :58
9C60: E1 CD 83 9C 08 3D 20 DD :0B
9C68: 21 E0 57 11 E1 57 01 1F :C5
9C70: 00 36 00 ED B0 21 00 58 :58
9C78: 11 01 58 01 FF 02 36 00 :B6
9C80: ED B0 C9 24 7C E6 07 C0 :CF
9C88: 7C D6 08 67 7D C6 20 6F :B7
9C90: D0 7C C6 08 67 C9 00 00 :76
* * *
В последнем номере РЕВЮ за
прошлый год мы немного "подзадо-
рили" наших отечественных прог-
раммистов - предложили побить ре-
корд длины процедуры плавного за-
тухания экрана (при помощи мани-
пуляции с атрибутами). Рекорд был
39 байтов (программа TERMINA-
TOR-2). С радостью можем сообщить
о том, что НАШИ программисты от-
реагировали молниеносно. Предос-
тавляем слово корреспонденту из
Нижегородской области.
(С) Владимир Зореев,
г.Заволжье, 1995.
Вот Вам релоцируемая процедура
гашения экрана длиной в 33 байта,
а достиг этого я благодаря вашей
книге "Элементарная графика", там
в описании процедуры расчета ад-
реса в дисплейном файле есть объ-
яснение логической конструкции
"XOR-AND-XOR", которую я и приме-
нил в своей процедуре. Советую
всем почаще заглядывать в книги
ИНФОРКОМА!
00010 ; (C) ULTRASOFT
00020 ORG 40000
00030 ENT
00040 EI
00050 LD E,255
00060 L1 LD HL,22528
00070 LD BC,768
00080 AND A
00090 RR E
00100 L2 LD A,(HL)
00110 XOR E
00120 AND E
00130 XOR E
00140 LD (HL),A
00150 INC HL
00160 DEC BC
00170 LD A,B
00180 OR C
00190 JR NZ,L2
00200 LD B,4
00210 L3 HALT
00220 DJNZ L3
00230 XOR A
00240 CP E
00250 JR NZ,L1
00260 RET
Start of object: #9C40 (40000)
Length : #0021 (00033)
Executes : #9C40 (40000)
9C40: FB 1E FF 21 00 58 01 00 :6E
9C48: 03 A7 CB 1B 7E AB A3 AB :EB
9C50: 77 23 0B 78 B1 20 F5 06 :D5
9C58: 04 76 10 FD AF BB 20 E3 :E8
9C60: C9 00 00 00 00 00 00 00 :C5
В строке 50 в регистр Е поме-
щается маска. Строка 80 обеспечи-
вает сброс флага переноса. Строка
90 выключает по-очереди биты в
маске с 7 по 0. Строки 110-130
образуют ту самую вышеупомянутую
конструкцию - обмен битов, замас-
кированных нулями при операции
AND маски с аккумулятором А. Па-
раметр в строке 200 задает вре-
менную задержку, определяющую
скорость эффекта.
Что скрывать, всегда приятно
услышать высокую оценку своего
труда. Приятно, что наши читатели
пошли дальше нас - так всегда и
должно быть. Спасибо, Владимир,
за письмо, и успехов тебе.
И еще одна программа, посвя-
щенная очистке экрана.
(C) Олег Лобов, С.Петербург,1995.
Предлагаю небольшую, но эф-
фектную программку для очистки
экрана, нередко используемую в
различных играх.
00010 ORG 40000
00020 ENT
00030 LD HL,#5800
00040 LD DE,#5801
00050 LD (HL),#47
00060 LD BC,#02FF
00070 LDIR
00080 XOR A
00090 OUT (#FE),A
00100 LOOP LD D,0
00110 LD BC,#1800
00120 LD HL,#4000
00130 LOOP2 LD A,R
00140 AND (HL)
00150 RRA
00160 LD (HL),A
00170 INC HL
00180 AND A
00190 JR Z,LOOP1
00200 LD D,#FE
00210 LOOP1 DEC BC
00220 LD A,B
00230 OR C
00240 JR NZ,LOOP2
00250 LD A,D
00260 AND A
00270 JR NZ,LOOP
00280 RET
Start of object: #9C40 (40000)
Length : #002D (00045)
Executes : #9C40 (40000)
9C40: 21 00 58 11 01 58 36 47 :3C
9C48: 01 FF 02 ED B0 AF D3 FE :03
9C50: 16 00 01 00 18 21 00 40 :7C
9C58: ED 5F A6 1F 77 23 A7 28 :6E
9C60: 02 16 FE 0B 78 B1 20 F0 :56
9C68: 7A A7 20 E4 C9 00 00 00 :F2
Вначале устанавливаются атри-
буты: черный бордюр, черный PA-
PER, яркий белый INK, затем изоб-
ражение плавно и попиксельно ис-
чезает.
* * *
Теперь от графики переходим к
тексту. Перед нами лежат несколь-
ко писем с процедурами печати,
которые могут использоваться в
Ваших програмах.
(С) Игорь Комаров, Иркутск, 1995.
В ZX-РЕВЮ-94, N3 (стр.45), бы-
ла опубликована программа В.Ако-
пова, которая печатает до 32 сим-
волов двойной высоты. Предлагаю
другую версию процедуры. Я ис-
пользую ее в своих загрузчиках.
Она распечатывает текст, находя-
щийся в начальной Бейсик-строке,
сразу же за REM. Например:
1 REM IRKUTSK HOUSE & MEGA ART
S'94
10 ...
00010 ORG 40000
00020 ENT
00030 LD HL,(23635)
00040 INC HL
00050 INC HL
00060 INC HL
00070 INC HL
00080 INC HL
00090 PUSH HL
00100 LD B,32
00110 L1 LD A,(HL)
00120 CP 13
00130 JR Z,L2
00140 INC HL
00150 DJNZ L1
00160 L2 LD A,32
00170 SUB B
00180 LD B,A
00190 LD A,32
00200 SUB B
00210 SRL A
00220 LD D,A
00230 LD E,22
00240 LD A,E
00250 AND #18
00260 ADD A,#40
00270 LD H,A
00280 LD A,E
00290 AND 7
00300 RRCA
00310 RRCA
00320 RRCA
00330 ADD A,D
00340 LD L,A
00350 LD D,H
00360 LD E,L
00370 POP HL
00380 KRUG LD A,(HL)
00390 CP 13
00400 RET Z
00410 PUSH HL
00420 PUSH DE
00430 PUSH DE
00440 POP IX
00450 LD L,A
00460 LD H,0
00470 ADD HL,HL
00480 ADD HL,HL
00490 ADD HL,HL
00500 LD B,H
00510 LD C,L
00520 LD HL,(23606)
00530 ADD HL,BC
00540 CALL PRINT
00550 LD BC,32
00560 ADD IX,BC
00570 PUSH IX
00580 POP DE
00590 CALL PRINT
00600 POP DE
00610 INC E
00620 POP HL
00630 INC HL
00640 JR KRUG
00650 PRINT LD B,4
00660 L3 LD A,(HL)
00670 INC HL
00680 LD (DE),A
00690 INC D
00700 LD (DE),A
00710 INC D
00720 DJNZ L3
00730 RET
Start of object: #9C40 (40000)
Length : #0064 (00100)
Executes : #9C40 (40000)
9C40: 2A 53 5C 23 23 23 23 23 :64
9C48: E5 06 20 7E FE 0D 28 03 :A3
9C50: 23 10 F8 3E 20 90 47 3E :8A
9C58: 20 90 CB 3F 57 1E 16 7B :B4
9C60: E6 18 C6 40 67 7B E6 07 :CF
9C68: 0F 0F 0F 82 6F 54 5D E1 :B4
9C70: 7E FE 0D C8 E5 D5 D5 DD :C9
9C78: E1 6F 26 00 29 29 29 44 :49
9C80: 4D 2A 36 5C 09 CD 99 9C :30
9C88: 01 20 00 DD 09 DD E5 D1 :BE
9C90: CD 99 9C D1 1C E1 23 18 :37
9C98: D7 06 04 7E 23 12 14 12 :EE
9CA0: 14 10 F8 C9 00 00 00 00 :21
Программа может работать как с
подключенным дисковым интерфей-
сом, так и без него, так как на-
чальный адрес текстового сообще-
ния рассчитывается строками
30-80. Если Вы захотите располо-
жить текст в другом месте, изме-
ните эти строки, задав адрес в
HL.
Y-координата для печати зада-
ется в строке 230 и может иметь
значение от 0 по 22. Процедура
сама рассчитывает X-координату,
стараясь расположить текстовое
сообщение посередине экрана.
В загрузчиках, написанных PHO-
NEX'ом, символы имеют еще и двой-
ную толщину линий. Получить такой
эффект можно, введя дополнитель-
ные строки:
00662 RRA
00664 OR (HL)
У PHONEX'а встречается еще и
такой эффект:
00675 OR (HL)
Программу можно использовать и
с загружаемым символьным набором,
изменив строку 520.
* * *
(C) Роман Торбан,
С.Петербург, 1995.
Предлагаю программку-знакоге-
нератор, печатающую символы раз-
мером 2х2 знакоместа с заполнени-
ем их текстурой.
00010 ORG 40000
00020 ENT
00030 LD A,(LETTER)
00040 LD L,A
00050 LD H,0
00060 ADD HL,HL
00070 ADD HL,HL
00080 ADD HL,HL
00090 LD BC,(23606)
00100 ADD HL,BC
00110 EX DE,HL
00120 LD HL,(ROW)
00130 CALL VADDR
00140 LD B,4
00150 BIG1 PUSH BC
00160 CALL BIG
00170 INC DE
00180 POP BC
00190 DJNZ BIG1
00200 LD HL,(ROW)
00210 INC L
00220 CALL VADDR
00230 LD B,4
00240 BIG2 PUSH BC
00250 CALL BIG
00260 INC DE
00270 POP BC
00280 DJNZ BIG2
00290 RET
00300 BIG LD A,(DE)
00310 LD C,2
00320 BIG3 LD B,4
00330 BIGLIN RLA
00340 RL (HL)
00350 SCF
00360 CCF
00370 RL (HL)
00380 DJNZ BIGLIN
00390 INC HL
00400 DEC C
00410 JR NZ,BIG3
00420 DEC HL
00430 DEC HL
00440 LD A,(HL)
00450 INC H
00460 RRA
00470 LD (HL),A
00480 PUSH AF
00490 DEC H
00500 INC HL
00510 LD B,(HL)
00520 INC H
00530 POP AF
00540 LD A,B
00550 RRA
00560 LD (HL),A
00570 DEC HL
00580 INC H
00590 RET
00600 VADDR LD A,L
00610 AND 7
00620 RRCA
00630 RRCA
00640 RRCA
00650 ADD A,H
00660 LD H,L
00670 LD L,A
00680 LD A,H
00690 AND #18
00700 OR #40
00710 LD H,A
00720 RET
00730 ROW DEFB 10
00740 COL DEFB 10
00750 LETTER DEFM "A"
Start of object: #9C40 (40000)
Length : #0068 (00104)
Executes : #9C40 (40000)
9C40: 3A A7 9C 6F 26 00 29 29 :40
9C48: 29 ED 4B 36 5C 09 EB 2A :F5
9C50: A5 9C CD 95 9C 06 04 C5 :FA
9C58: CD 71 9C 13 C1 10 F8 2A :D4
9C60: A5 9C 2C CD 95 9C 06 04 :71
9C68: C5 CD 71 9C 13 C1 10 F8 :7F
9C70: C9 1A 0E 02 06 04 17 CB :EB
9C78: 16 37 3F CB 16 10 F7 23 :AB
9C80: 0D 20 F1 2B 2B 7E 24 1F :51
9C88: 77 F5 25 23 46 24 F1 78 :AB
9C90: 1F 77 2B 24 C9 7D E6 07 :44
9C98: 0F 0F 0F 84 65 6F 7C E6 :1B
9CA0: 18 F6 40 67 C9 0A 0A 41 :0F
Вот для примера символ "А",
распечатанный этой процедурой:
1
Печатаемый символ задан в ак-
кумуляторе. Это позволяет легко
модифицировать программу для
подключения ее к собственному по-
току, что позволит выполнять пе-
чать привычным способом при помо-
щи RST #10 (и с помощью всех про-
цедур для этого предназначенных,
например, для печати строки текс-
та PR_STRING #203C), открыв пред-
варительно этот новый поток.
* * *
Вы уже прочитали, наверное, в
этом номере РЕВЮ статью Лыхина
Д.В., посвященную модернизации
шрифта. А сейчас предлагаем вни-
манию читателей несколько практи-
ческих программ, полученных нами
от начинающих программистов.
(С) Андрей Рубин, г.Энгельс,1995.
Программы, приводимые ниже,
создают символьный набор с адреса
41000 (задается в строке 10). Для
этого вначале символьный набор
перебрасывается в эту область.
Затем с ним выполняются преобра-
зования. В конце CHARS переключа-
ется на полученный символьный на-
бор (можно сделать при помощи PO-
KE 23606,40: POKE 23607,159).
Первая программа позволяет
создать шрифт с утолщенной только
левой частью:
00010 FONT EQU 41000
00020 ORG 40000
00030 ENT
00040 LD HL,(#5C36)
00050 INC H
00060 LD DE,FONT
00070 LD BC,768
00080 PUSH BC
00090 PUSH DE
00100 PUSH HL
00110 LDIR
00120 POP DE
00130 POP HL
00140 POP BC
00150 LABEL LD A,(HL)
00160 SLA A
00170 AND #F0
00180 EX DE,HL
00190 OR (HL)
00200 EX DE,HL
00210 LD (HL),A
00220 INC HL
00230 INC DE
00240 DEC BC
00250 LD A,B
00260 OR C
00270 JR NZ,LABEL
00280 LD HL,FONT-256
00290 LD (#5C36),HL
00300 RET
Start of object: #9C40 (40000)
Length : #0029 (00041)
Executes : #9C40 (40000)
9C40: 2A 36 5C 24 11 28 A0 01 :96
9C48: 00 03 C5 D5 E5 ED B0 D1 :D4
9C50: E1 C1 7E CB 27 E6 F0 EB :BF
9C58: B6 EB 77 23 13 0B 78 B1 :76
9C60: 20 F0 21 28 9F 22 36 5C :A8
9C68: C9 00 00 00 00 00 00 00 :CD
Можно также выполнить модифи-
кацию:
00160 SRL A
00170 AND #0F
Следующая программа создает
шрифт, похожий на тот, который
приведен в ZX-РЕВЮ-94, N4,
стр.37, однако немного отличаю-
щийся:
00010 FONT EQU 41000
00020 ORG 40000
00030 ENT
00040 LD HL,15616
00050 LD DE,FONT
00060 LD BC,768
00070 LDIR
00080 LD HL,FONT
00090 LD DE,768
00100 LOOP INC HL
00110 INC HL
00120 INC HL
00130 INC HL
00140 LD B,4
00150 LOOP1 LD A,(HL)
00160 SRA A
00170 LD (HL),A
00180 SLA A
00190 SLA A
00200 OR (HL)
00210 LD (HL),A
00220 INC HL
00230 DEC DE
00240 DJNZ LOOP1
00250 LD A,D
00260 OR E
00270 JR NZ,LOOP
00280 LD HL,FONT-256
00290 LD (#5C36),HL
00300 RET
Start of object: #9C40 (40000)
Length : #0030 (00048)
Executes : #9C40 (40000)
9C40: 21 00 3D 11 28 A0 01 00 :14
9C48: 03 ED B0 21 28 A0 11 00 :7E
9C50: 03 23 23 23 23 06 04 7E :03
9C58: CB 2F 77 CB 27 CB 27 B6 :FF
9C60: 77 23 1B 10 F2 7A B3 20 :00
9C68: E8 21 28 9F 22 36 5C C9 :51
Оригинальный шрифт получается
при помощи следующей программы.
Попробуйте, - не пожалеете:
00010 FONT EQU 41000
00020 ORG 40000
00030 ENT
00040 LD HL,15616
00050 LD DE,FONT
00060 LD BC,768
00070 LDIR
00080 LD HL,FONT
00090 LD B,0
00100 LOOP2 CALL LOOP
00110 CALL LOOP
00120 INC HL
00130 INC HL
00140 INC HL
00150 INC HL
00160 CALL LOOP
00170 CALL LOOP
00180 DJNZ LOOP2
00190 LD DE,768
00200 LD HL,FONT
00210 JR LOOP5
00220 LOOP LD A,(HL)
00230 SRL A
00240 LOOP4 LD (HL),A
00250 INC HL
00260 RET
00270 LOOP5 LD A,(HL)
00280 LD C,A
00290 SRL A
00300 OR C
00310 CALL LOOP4
00320 DEC DE
00330 LD A,D
00340 OR E
00350 JR NZ,LOOP5
00360 LD HL,FONT-256
00370 LD (#5C36),HL
00380 RET
Start of object: #9C40 (40000)
Length : #0044 (00068)
Executes : #9C40 (40000)
9C40: 21 00 3D 11 28 A0 01 00 :14
9C48: 03 ED B0 21 28 A0 06 00 :73
9C50: CD 6A 9C CD 6A 9C 23 23 :D8
9C58: 23 23 CD 6A 9C CD 6A 9C :E0
9C60: 10 EE 11 00 03 21 28 A0 :F7
9C68: 18 06 7E CB 3F 77 23 C9 :0D
9C70: 7E 4F CB 3F B1 CD 6D 9C :6A
9C78: 1B 7A B3 20 F3 21 28 9F :57
9C80: 22 36 5C C9 00 00 00 00 :99
Возможна замена в строках 230
и 290 SRL A на SLA A.
(С) Артур Привалов (ART PRI),
Иркутская обл., 1995.
Предлагаю программу из серии
модификации шрифтов.
Нижеприведенная программа выт-
воряет следующее: сдвигает 4
верхних байта символа вправо и
объединяет (по ИЛИ) с тем, что
было. То же самое делается с че-
тырьмя нижними байтами, но со
сдвигом влево. Получается прият-
ный на вид утолщенный наклонный
шрифт.
00010 FONT EQU 41000
00020 ORG 40000
00030 ENT
00040 LD HL,#3D00
00050 LD DE,FONT
00060 LD BC,#0300
00070 LDIR
00080 LD HL,FONT
00090 LD B,#60
00100 ONE PUSH BC
00110 LD B,4
00120 TWO LD A,(HL)
00130 LD C,A
00140 SRL A
00150 OR C
00160 LD (HL),A
00170 INC HL
00180 DJNZ TWO
00190 LD B,4
00200 THREE LD A,(HL)
00210 LD C,A
00220 SLA A
00230 OR C
00240 LD (HL),A
00250 INC HL
00260 DJNZ THREE
00270 POP BC
00280 DJNZ ONE
00290 LD HL,FONT-256
00300 LD (#5C36),HL
00310 RET
Start of object: #9C40 (40000)
Length : #0031 (00049)
Executes : #9C40 (40000)
9C40: 21 00 3D 11 28 A0 01 00 :14
9C48: 03 ED B0 21 28 A0 06 60 :D3
9C50: C5 06 04 7E 4F CB 3F B1 :43
9C58: 77 23 10 F7 06 04 7E 4F :6C
9C60: CB 27 B1 77 23 10 F7 C1 :01
9C68: 10 E6 21 28 9F 22 36 5C :96
9C70: C9 00 00 00 00 00 00 00 :D5