Просмотр полной версии : Быстро вывести число 0-255 на экран
Aprisobal
25.01.2005, 16:30
Задача: вывести число 0-255 на экран как можно быстрее (имхо краткость кода уже нужна только писателям 512b интро). Вот мой вариант:
prnnm: LD A,число
LD HL,.dectb
LD DE,адрес_на_экране
LD B,3
.loop1: LD C,"0"-1
.loop2: INC C
SUB (HL)
JR NC,.loop2
ADD A,(HL)
PUSH AF
LD A,C
CALL prnNUM ;вывод числа
POP AF
INC E
INC HL
DJNZ .loop1
RET
.dectb: DB 100,10,1
prnNUM: ;вывод числа через стек
;в DE - ADDR (на начале строки!)
;в A - число
PUSH BC,DE,HL
LD BC,адресшрифта
LD H,0
LD L,A
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,BC
LD (.savsp+1),SP
LD SP,HL
EX DE,HL
POP DE
LD (HL),E
INC H
LD (HL),D
INC H
POP DE
LD (HL),E
INC H
LD (HL),D
INC H
POP DE
LD (HL),E
INC H
LD (HL),D
INC H
POP DE
LD (HL),E
INC H
LD (HL),D
.savsp: LD SP,0
POP HL,DE,BC
RET
Задача: вывести число 0-255 на экран как можно быстрее (имхо краткость кода уже нужна только писателям 512b интро).
если совсем быстро и совсем "некратко", то можно сделать:
tbl1 db 0,1,2,3,... ;цифры младших разрядов (256 штук)
tbl2 db 0,0,..(10 нулей)..,0,1,1,... ; цифры десятков для сотен, можно так не загоняться ;)
но это, конечно, сабж :D
...
INC H
LD A,H
AND 7
JR NZ,$+12
здесь всегда Z ;)
у табя что, шрифт 8x16 ?
вобщем, в этом месте можно упростить.
... вот блин, когда ты успел исправить???
--skip--
LD HL,.dectb
--skip--
loop2: INC C
SUB (HL)
JR NC,.loop2
--skip--
CALL prnNUM ;вывод числа
--skip--
DJNZ .loop1
--skip--
.dectb: DB 100,10,1
prnNUM: ;вывод числа через стек
--skip--
RET
Собсна вот - раз уж сделал процедурку, то зачем париться с .dectb? Раскрыть цикл djnz - и меньше парки с регистрами заодно будет. А если хочется djnz - то зачем тогда call вообще? =)
если совсем быстро и совсем "некратко", то можно сделать:
tbl1 db 0,1,2,3,... ;цифры младших разрядов (256 штук)
tbl2 db 0,0,..(10 нулей)..,0,1,1,... ; цифры десятков
В качестве компромисса - десятки и единицы загоняются в такую 1 табличку в BCD.
Aprisobal
25.01.2005, 23:28
Спасибо за ответы!
... вот блин, когда ты успел исправить???Попало же так - исправил в 16:40, и ты запостил в 16:40 :eek:
Просто изначально процедура предназначлась для шрифта двойного размера.
здесь всегда ZДало чуть-чуть драгоценных тактов :)
Собсна вот - раз уж сделал процедурку, то зачем париться с .dectb? Раскрыть цикл djnz - и меньше парки с регистрами заодно будет. А если хочется djnz - то зачем тогда call вообще? =)Нужно хоть чем-то напрягать ленивые мозги спектрумистов ;)
Может ещё чего предложите? :D
Aprisobal
26.01.2005, 00:20
Также можно максимально ускорить вывод цифр вот такой комбинацией(только для цифр):
...
LD (HL),n1
INC H
LD (HL),n2
INC H
LD (HL),n3
INC H
LD (HL),n4
INC H
LD (HL),n5
INC H
и т.д.
Итого -2 такта на одну строку по сравнению со стеком ;) Но экономия будет значительной если выводить много числовых данных.
Corpsegrinder
26.01.2005, 08:05
prnnm: LD A,число
LD HL,.dectb
LD DE,адрес_на_экране
LD B,3
.loop1: LD C,"0"-1
.loop2: INC C
SUB (HL)
JR NC,.loop2
ADD A,(HL)
ex af,af' ;PUSH AF
LD A,C
CALL prnNUM ;вывод числа
ex af,af' ;POP AF
INC E
INC HL
DJNZ .loop1
RET
но это так чуть чуть... что-то вроде 12 тактов на итерацию
к тому же prNUM можно зацигачить инлайном - ещё 20 тактов на итерацию.
да ещё к тому же можно push hl,de,bc и поп hl,de,bc заменить на exx - ещё 52 такта на итерацию
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot