|
Nicron
#26
27 марта 1997 |
|
Программирование - ассемблер Z80 от Russos.

(c) RUSSOS
Устранение одного глюка
приводит к появлению дру-
гого, более тяжелого...
(прокодированное...)
Привет всем! В раньних выпусках NICRON'а был цикл статей про
асемблер Z-80. Там был дан список команд и их назначение. В этом
цикле статей будет продолжена эта тема и будут рассмотрены уже
различные процедуры (печать, работа с окнами и др.). В основном
я буду рассказывать о процедурах, которые я написал для своего
boot'а (STATION CONTROL). Конечно, я не утверждаю, что это прог-
рамки являются идеальными. Нет. Этот материал дан скорее всего,
для начинающих, т.к. посмотрев на очередное мое творение, он бы
сказал: "А я могу лучше!" Ну и пожалуйста! Делай лучше! Переде-
лывай мои процедуры, изучай их и создовай свои! Ну и может быть
и какой-нибудь кодер возьмет эти процедуры в свою библиотеку...
Что делать с этими процедурами? Т.к. я не знаю в каком асемб-
лере Вы работаете, то приведу лишь пример для перевода в Masm,
где я работаю.
Для начала выгрузите текст из газеты на диск, потом загрузите
его в Word и удалите весь текст, оставив только текст программы.
Также удалите все комментарии в процедуре. К сожалению Masm не
понимает альтернативной кодировки и вместо текста будет бред(ал-
тернативную кодировку понимает ALASM, но я в нем не работаю!) и
в конце программы поставте значок (EXT MODE + набрать номер
26) это нужно для перевода в формат TASM 2. Далее выгрузете свое
творение на диск и загрузите TASM 4. Там нажмите клавишу 'I' и
на запрос наберите имя своего файла (выгружать его надо с расши-
рением 'C'!) и дождитесь перевода в формат TASM 4. Выгрузив свой
текст на диск, гризите Masm и нажмите кнопочку 'I'. Появится
список файлов в фотмате TASM 4. Выберете нужный и конвертируйте
его. Все! У вас есть текст в формате Masm. Теперь вы можете его
редакторовать и отлаживать в STS в любой его версии (у меня 5.2)
Для начала я покажу процедуру печати на экран. К ее достоинс-
твам следует отнести высокую скорость, понимание альтернативной
кодировки и достаточно простой структурой. А к недостаткам: об-
работка только одного управляющего кода '22'. Другие не были ре-
ализованы за ненадобностью. Сейчас я приведу текст процедуры, а
после ее примеры ее использования и рекомендации по доработке.
;----------------
;Печать строк.
;HL-начало строки.
;В строке: 22-новая координата печати, потом два байта-сами ко-
;рдинаты: 1'ый - X, 2'ой Y, 0 - конец строки
;----------------
PRINT LD A,(HL) ;прием очередного байта.
CP #00 ;проверка на 0.
RET Z ;выход, если строка закончилась.
CP #16 ;подготовка к установки новой
CALL Z,UPR_22 ;координате: D-x, E-y.
CALL PRINT_1 ;печать символа.
INC HL ;увеличение и
JR PRINT ;переход к новому символу.
;--------
UPR_22 INC HL ;║установка в регистрах D коор-
LD D,(HL) ;║динаты x, а в E - y.
INC HL ;║
LD E,(HL) ;║
RET ;║
;--------
PRINT_1 PUSH AF ;║сохранение на стеке всех реги-
PUSH BC ;║стров.
PUSH DE ;║
PUSH HL ;║
CP #16
JR Z,UPR1_22 ;установка новой координаты.
LD L,A ;║расчет адреса верхней линии
LD H,#00 ;║симвла в шрифте.
ADD HL,HL ;║FONT-адрес начала шрифта-#100
ADD HL,HL ;║
ADD HL,HL ;║
LD DE,FONT ;║
ADD HL,DE ;║
LD DE,(COOR) ;в DE адрес верхней линии знако-
;места.
;--------
;Далее идет печать символа на экране из шрифта в знакоместо
;с адресом, находящимся в COOR. Если вам не нужна скорость,
;то можете этот фрагмент заменить другой програмкой:
; ...
; LD B,8
;LOOP LD А,(HL)
; LD (DE),A
; INC HL
; INC D
; DJNZ LOOP
; ...
;--------
;начало фтагмента
;--------
LD A,(HL)
LD (DE),A
INC HL
INC D
LD A,(HL)
LD (DE),A
INC HL
INC D
LD A,(HL)
LD (DE),A
INC HL
INC D
LD A,(HL)
LD (DE),A
INC HL
INC D
LD A,(HL)
LD (DE),A
INC HL
INC D
LD A,(HL)
LD (DE),A
INC HL
INC D
LD A,(HL)
LD (DE),A
INC HL
INC D
LD A,(HL)
LD (DE),A
INC HL
INC D
;--------
;конец фрагмента
;--------
LD DE,(COOR) ;загрузка в DE адреса знакоместа
INC DE ;увеличить адрес знакоместа.
LD A,D
CP #41 ;║проверка на переход через гра-
JR Z,PR_L1 ;║ницу 1'ого и 2'ого сегмента
CP #49 ;║
JR Z,PR_L2 ;║
LD (COOR),DE ;запоминания адреса знакоместа
JR PR_L0
PR_L1 LD DE,#4800 ;║коррекция адресов
LD (COOR),DE ;║
JR PR_L0 ;║
PR_L2 LD DE,#5000 ;║
LD (COOR),DE ;║
;--------
PR_L0 POP HL ;║востановление регистров и воз-
POP DE ;║врат.
POP BC ;║
POP AF ;║
RET ;║
;--------
;стандартная процедура расчета адреса в дисплейном файле
;по знакомвстам.
;--------
UPR1_22 LD A,E
AND #18
OR #40
LD H,A
LD A,E
AND #07
OR A
RRA
RRA
RRA
RRA
ADD A,D
LD L,A
LD (COOR),HL
JR PR_L0
;--------
COOR DEFW #4000 ;адрес знакоместа.
;----------------
Вот и процедура. Надеюсь Вам понятно,как она действует. А те-
перь примеры ее использования.
ПРИМЕР ПЕРВЫЙ.
Надо напечатать строку по координатам 2(X) и 1(Y).
LD HL,TXT
CALL PRINT
RET
;----------------
PRINT ...
;----------------
TXT DEFB 22,2,1,"NICRON - THE BEST!"
DEFB 0 ;конец строки.
ПРИМЕР ВТОРОЙ.
Надо напечатать любой символ (хоть '╬') в заданных координа-
тах (2,3)
LD А,22
LD DE,#0203
CALL PRINT_1 ;установка нужной позиции печати
LD А,#CE ;код символа '╬'.
CALL PRINT_1 ;печать.
RET
;----------------
PRINT_1 ...
;----------------
При желании Вы можете легко модифицировать эту процедуру,
что бы она понимала другие управляющие коды. На до добавить про-
верку регистра A и производить действия, соотвествующие упр. ко-
ду. Если Вы добавляете цвет, то нужно добавить процедуру рассче-
та адреса в файле атрибутов по знакоместам
Если у Вас что-то не работает, то позвоните мне, и я помогу.
По всем вопросам и пожеланиям тоже звоните мне - поболтаем.
Хотелось бы знать Ваше мнение: нужны ли такие статье в дальне-
йшим? Свое мнение можете сказать мне по телефону или оставить
письмо на BBS, которые принимают почту для NICRON'а.
(c)RUSSOS
461-84-81 (Саша)
с 16.00 до 23.00
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Другие статьи номера:
Похожие статьи:
В этот день... 25 октября