Важная информация

User Tag List

Показано с 1 по 8 из 8

Тема: Быстро вывести число 0-255 на экран

  1. #1
    Activist
    Регистрация
    17.01.2005
    Адрес
    Belarus, Minsk
    Сообщений
    402
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    Question Быстро вывести число 0-255 на экран

    Задача: вывести число 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
    Последний раз редактировалось Aprisobal; 25.01.2005 в 17:40. Причина: очепятка в коде
    ATW4GS / BIN2SNA / SquareMania <ТИ-3> / Ужасм+
    ATM-Turbo 512 v4.50, Commodore 64G + TAC-2, Retro-Bit Super Retro TRIO

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Member Аватар для MadCat!
    Регистрация
    17.01.2005
    Адрес
    Россия, Белгород
    Сообщений
    65
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Talking crazy variant

    Цитата Сообщение от aprisobal
    Задача: вывести число 0-255 на экран как можно быстрее (имхо краткость кода уже нужна только писателям 512b интро).
    если совсем быстро и совсем "некратко", то можно сделать:
    Код:
    tbl1 db 0,1,2,3,... ;цифры младших разрядов (256 штук)
    tbl2 db 0,0,..(10 нулей)..,0,1,1,... ; цифры десятков
    для сотен, можно так не загоняться


    но это, конечно, сабж
    Последний раз редактировалось MadCat!; 25.01.2005 в 17:49.
    МультиАватар есть здесь

  4. #3
    Member Аватар для MadCat!
    Регистрация
    17.01.2005
    Адрес
    Россия, Белгород
    Сообщений
    65
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от aprisobal
    Код:
    ...
    	INC H
    	LD A,H
    	AND 7
    	JR NZ,$+12
    здесь всегда Z
    у табя что, шрифт 8x16 ?
    вобщем, в этом месте можно упростить.

    ... вот блин, когда ты успел исправить???
    Последний раз редактировалось MadCat!; 25.01.2005 в 17:42. Причина: очепятка в исходном сообщении ;)
    МультиАватар есть здесь

  5. #4
    Veteran Аватар для lvd
    Регистрация
    23.01.2005
    Сообщений
    1,113
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию ага?

    Цитата Сообщение от aprisobal
    Код:
    --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 вообще? =)

  6. #5
    Veteran Аватар для lvd
    Регистрация
    23.01.2005
    Сообщений
    1,113
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от MadCat!
    если совсем быстро и совсем "некратко", то можно сделать:
    Код:
    tbl1 db 0,1,2,3,... ;цифры младших разрядов (256 штук)
    tbl2 db 0,0,..(10 нулей)..,0,1,1,... ; цифры десятков
    В качестве компромисса - десятки и единицы загоняются в такую 1 табличку в BCD.

  7. #6
    Activist
    Регистрация
    17.01.2005
    Адрес
    Belarus, Minsk
    Сообщений
    402
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    Cool

    Спасибо за ответы!
    Цитата Сообщение от MadCat
    ... вот блин, когда ты успел исправить???
    Попало же так - исправил в 16:40, и ты запостил в 16:40
    Просто изначально процедура предназначлась для шрифта двойного размера.
    Цитата Сообщение от MadCat
    здесь всегда Z
    Дало чуть-чуть драгоценных тактов
    Цитата Сообщение от lvd
    Собсна вот - раз уж сделал процедурку, то зачем париться с .dectb? Раскрыть цикл djnz - и меньше парки с регистрами заодно будет. А если хочется djnz - то зачем тогда call вообще? =)
    Нужно хоть чем-то напрягать ленивые мозги спектрумистов

    Может ещё чего предложите?
    ATW4GS / BIN2SNA / SquareMania <ТИ-3> / Ужасм+
    ATM-Turbo 512 v4.50, Commodore 64G + TAC-2, Retro-Bit Super Retro TRIO

  8. #7
    Activist
    Регистрация
    17.01.2005
    Адрес
    Belarus, Minsk
    Сообщений
    402
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    Arrow

    Также можно максимально ускорить вывод цифр вот такой комбинацией(только для цифр):
    Код:
    ...
    	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 такта на одну строку по сравнению со стеком Но экономия будет значительной если выводить много числовых данных.
    ATW4GS / BIN2SNA / SquareMania <ТИ-3> / Ужасм+
    ATM-Turbo 512 v4.50, Commodore 64G + TAC-2, Retro-Bit Super Retro TRIO

  9. #8
    Member Аватар для Corpsegrinder
    Регистрация
    19.01.2005
    Адрес
    Chelyabinsk
    Сообщений
    110
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию небольшая оптимизация осн. цикла

    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 такта на итерацию
    Последний раз редактировалось Corpsegrinder; 26.01.2005 в 08:09.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Быстро переместить 384b
    от Aprisobal в разделе Программирование
    Ответов: 6
    Последнее: 23.01.2005, 15:23

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •