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════════════
Как мнение Алл'а - полезный код? ;-)
Можно ли для этого формата фонта еще
быстрее без _существенного_ увеличения
в обьеме?
К примеру в односимвольной печаталке можно
раскрыть циклы и некоторые константы
использовать в освободившемся регистре,
но... скорость мало возрастет по сравнению
с обьемом в байтах.
Хочется мало и в меру быстро ;)
Счастливо. Михаил.
|