ZXNet эхоконференция «code.zx»


тема: new_print64+font_1k



от: Mihail Zharov
кому: All
дата: 02 Feb 2001
Привет, All! Вот. Может пригодиться для экономии памяти. Фонт на 1к меньше... и быстро/мало: односимвольная печать - 530 тактов/61 байт двухсимвольная печать - 311 тактов/56 байт ╒═══< Begin file: pr64_1k.asm >═══════════ ;односимвольная печать (C) 2000 JAM ;*************************************** ;ПЕЧАТЬ СИМВОЛА [a] В ЭКРАH (de) ;*************************************** ; IN: a - номер символа для печати ; de - адрес в экране для печати ; cy - позиция в знакоместе PR64_A ld h,FONT/256 ;ст.адрес фонта ld l,a ;мл.адрес фонта ld b,4 ;счетчик для djnz jr c,PR64R_A ;правая печать? ;PR64L_A ;печать в левую часть знакоместа ; - обработка левых 4-х битов из фонта ld a,(hl) ;байт из фонта and %11110000 ld c,a ld a,(de) ;байт из экрана and %00001111 or c ld (de),a ;байт в экран inc d ; - обработка правых 4-х битов из фонта ld a,(hl) ;байт из фонта and %00001111 rrca : rrca rrca : rrca ld c,a ld a,(de) ;байт из экрана and %00001111 or c ld (de),a ;байт в экран inc d inc h ;след.байт фонта djnz PR64L_A ;4 цикла ret PR64R_A ;печать в правую часть знакоместа ; - обработка левых 4-х битов из фонта ld a,(hl) ;байт из фонта and %11110000 rrca : rrca rrca : rrca ld c,a ld a,(de) ;байт из экрана and %11110000 or c ld (de),a ;байт в экран inc d ; - обработка правых 4-х битов из фонта ld a,(hl) ;байт из фонта and %00001111 ld c,a ld a,(de) ;байт из экрана and %11110000 or c ld (de),a ;байт в экран inc d inc h djnz PR64R_A ret ;27+503=530() тактов - выполняется только ; один из потоков... ;7+27*2=61 байт - оба потока. ;============================================================== ;_двухсимвольная_ печать (C) 2001 JAM ;***************************************** ;ПЕЧАТЬ СИМВОЛОВ [e] И [c] В ЭКРАH (hl) ;***************************************** ;IN: hl - адрес в экране для печати ; e - первый/левый символ для печати ; c - второй/правый символ для печати PR64_EC ld d,FONT/256 ;de-font ld b,d ;bc-font ;-0 ld a,(bc) ;in fnt ld (hl),a ;out scr ld a,(de) ;in fnt rrca : rrca : rrca : rrca rrd ;))) inc h : ld (hl),a ;out scr inc h : inc d : inc b ;init ;-1 ld a,(bc) ld (hl),a ld a,(de) rrca : rrca : rrca : rrca rrd inc h : ld (hl),a inc h : inc d : inc b ;-2 ld a,(bc) ld (hl),a ld a,(de) rrca : rrca : rrca : rrca rrd inc h : ld (hl),a inc h : inc d : inc b ;-3 ld a,(bc) ld (hl),a ld a,(de) rrca : rrca : rrca : rrca rrd inc h : ld (hl),a ; inc h : inc d : inc b ;-4 ret ;11+78*3+66=311 тактов на _два_ символа ;3+14*3+11=56 байт ;============================================================== ;пример расчета адреса в экране ;для п/п PR64_A -> CY - L/R печать. ;*************************************** ;РАСЧЕТ АДРЕСА ПО КООРДИHАТАМ ЗHАКОМЕСТ. ;*************************************** ; IN: de - XY-координаты (0-63/0-23) ;OUT: de - адрес в экране 1-го байта ; !!! cy - позиция в знакоместе экрана srl d ;/2->CY=0/1 - L/R push af ;сохранили A и CY ld a,e ;a=Y-координата and %00000111 ;ном.строки в 1/3 rrca:rrca:rrca add a,d ld d,a ld a,e and %00011000 ;в какой 1/3 экрана add a,#40 ;ст.б.адреса ld e,d ;e=мл.б.адреса ld d,a ;d=ст.б.адреса pop af ;востановили A и CY ret ;**************************************** ╘═══< End file: pr64_1k.asm >═════════════ Коммент: - в односимвольной печаталке все банально, я возможно "изобрел велосипед" ;) А вот двухсимвольная печаталка думаю оригинальна. Изврат еще тот... ;))) - можно на основе двухсимвольной, переписать односимвольную. (второй символ брать прямо с экрана как матрицу из фонта... ;) - фонт в памяти конечно по ровному адресу(кратно 256 байтам) - формат фонта: берем обычный(no fast) фонт 2к для 64-x, складываем до 1к - убираем каждые 4 _бита_(%0000). Потом раскидываем байты символа через 256 байт - делаем фаст-фонт. Полученный фонт и используем для этих п/п печати. Вот фонт, который я использовал: ╒═══< Begin file: fnt64/2f.fnt >══════════ section 1 of 1 of file fnt64/2f.fnt begin 644 fnt64/2f.fnt M``8&"0('`@`/!@8'`@('"00!`@4'!P`"`@(``````````@```@4$`@($```` M```!!P("!P0'`P<"`@```````@("!@,&!P<"!0════════════ Как мнение Алл'а - полезный код? ;-) Можно ли для этого формата фонта еще быстрее без _существенного_ увеличения в обьеме? К примеру в односимвольной печаталке можно раскрыть циклы и некоторые константы использовать в освободившемся регистре, но... скорость мало возрастет по сравнению с обьемом в байтах. Хочется мало и в меру быстро ;) Счастливо. Михаил.




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
От авторов - Доброе воскресение всем тем, кто читает нашу газету!
Обозрение - O компьютере "Silicon Graphics" (продолжение).
Конкурс - конкурс на лучшее Intro.
Реклама - Реклама и объявления.
Реклама - Реклама и объявления.

В этот день...   8 мая