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 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября