User Tag List

Страница 104 из 113 ПерваяПервая ... 100101102103104105106107108 ... ПоследняяПоследняя
Показано с 1,031 по 1,040 из 1128

Тема: ЭТЮДЫ

  1. #1031

    Регистрация
    01.03.2005
    Адрес
    Новосибирск
    Сообщений
    2,080
    Спасибо Благодарностей отдано 
    87
    Спасибо Благодарностей получено 
    479
    Поблагодарили
    145 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    0xDEAD, как вариант...
    Код:
    S42_PRN LD	L,A
            LD	H,FONT42
            LD	DE,(SCP_ADR)
    PRN_MOV LD	A,0
            INC	A
            AND	3
            LD	(PRN_MOV+1),A
            AND	A
            JP	Z,S42_1
            DEC	A
            JP	Z,S42_2
            DEC	A
            JP	Z,S42_3
    S42_4   PUSH	HL
            PUSH	DE
            DUP	7
            LD	A,(DE)
            LD	C,(HL)
            SRA	C
            SRA	C
            OR	C
            LD	(DE),A
            INC	D
            INC	H
            EDUP	
            LD	A,(DE)
            LD	C,(HL)
            SRA	C
            SRA	C
            OR	C
            LD	(DE),A
            POP	DE
            POP	HL
            INC	E
            DUP	7
            LD	A,(HL)
            DUP	6
            ADD	A,A
            EDUP	
            LD	(DE),A
            INC	D
            INC	H
            EDUP	
            LD	A,(HL)
            DUP	6
            ADD	A,A
            EDUP	
            LD	(DE),A
            LD	HL,SCP_ADR
            INC	(HL)
            RET	
    S42_1   DUP	7
            LD	A,(DE)
            OR	(HL)
            LD	(DE),A
            INC	D
            INC	H
            EDUP	
            LD	A,(DE)
            OR	(HL)
            LD	(DE),A
            LD	HL,SCP_ADR
            INC	(HL)
            RET	
    S42_2   DUP	7
            LD	A,(HL)
            ADD	A,A
            ADD	A,A
            LD	(DE),A
            INC	D
            INC	H
            EDUP	
            LD	A,(HL)
            ADD	A,A
            ADD	A,A
            LD	(DE),A
            RET	
    S42_3   PUSH	HL
            PUSH	DE
            DUP	7
            LD	A,(DE)
            LD	C,(HL)
            DUP	4
            SRA	C
            EDUP	
            OR	C
            LD	(DE),A
            INC	D
            INC	H
            EDUP	
            LD	A,(DE)
            LD	C,(HL)
            DUP	4
            SRA	C
            EDUP	
            OR	C
            LD	(DE),A
            POP	DE
            POP	HL
            INC	E
            DUP	7
            LD	A,(HL)
            DUP	4
            ADD	A,A
            EDUP	
            LD	(DE),A
            INC	D
            INC	H
            EDUP	
            LD	A,(HL)
            DUP	4
            ADD	A,A
            EDUP	
            LD	(DE),A
            LD	HL,SCP_ADR
            INC	(HL)
            RET

  2. #1032

    Регистрация
    01.03.2005
    Адрес
    Новосибирск
    Сообщений
    2,080
    Спасибо Благодарностей отдано 
    87
    Спасибо Благодарностей получено 
    479
    Поблагодарили
    145 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Обрати внимание, что поскольку шрифт содержит 256 символов и занимает 2048 байт, то мы слегка меняем его формат чтобы выкинуть умножение при расчёте адреса символа. т.е. в шрифте идут начала первые строки всех 256 символов, затем вторые, итд... переход на следующую строку символа делается просто INC H Переменная SCP_ADR это адрес на экране.

    Этот пользователь поблагодарил drbars за это полезное сообщение:

    Barmaley_m(14.09.2021)

  3. #1033

    Регистрация
    08.01.2007
    Адрес
    г. Красноярск
    Сообщений
    1,355
    Спасибо Благодарностей отдано 
    347
    Спасибо Благодарностей получено 
    1,508
    Поблагодарили
    307 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от drbars Посмотреть сообщение
    0xDEAD, как вариант...
    Код:
    PRN_MOV LD	A,0
            INC	A
            AND	3
            LD	(PRN_MOV+1),A
            AND	A - лишняя команда
            JP	Z,S42_1
            DEC	A
            JP	Z,S42_2
            DEC	A
            JP	Z,S42_3
    !

  4. #1034

    Регистрация
    03.07.2021
    Адрес
    г. Кировск
    Сообщений
    922
    Спасибо Благодарностей отдано 
    87
    Спасибо Благодарностей получено 
    211
    Поблагодарили
    156 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    можно сократить еще на два байта =)

    Код:
    PRN_MOV LD	A,#88
            RLCA
            LD	(PRN_MOV+1),A
            JP	C,S42_1
            RLCA
            JP	C,S42_2
            RLCA
            JP	C,S42_3
    Т.к. счетчик в аккуме кратен четырем - достаточно циклической прокрутки байта и проверки флага C. Таким же образом можно делать счетчики на 2 и 8.
    Ну и, если хватает расстояния, можно позаменять JP на JR.

  5. #1035

    Регистрация
    18.07.2021
    Адрес
    г. Хмельницкий, Украина
    Сообщений
    105
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    33
    Поблагодарили
    25 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Спасибо, но уже недели две как сам написал. Даже практически то же самое получилось.
    Посмотрю, конечно.

    Почему add a, a, а не rla/rlca? По таймингам одинаково.
    Последний раз редактировалось 0xDEAD; 15.09.2021 в 02:31.

  6. #1036

    Регистрация
    26.03.2008
    Адрес
    Питкяранта
    Сообщений
    1,822
    Спасибо Благодарностей отдано 
    274
    Спасибо Благодарностей получено 
    122
    Поблагодарили
    95 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от 0xDEAD Посмотреть сообщение
    Почему add a, a, а не rla/rlca? По таймингам одинаково.
    В данном случае без разницы, но вообще rlca не трогает флаги кроме С, а add наоборот - выставляет все флаги как положено.
    Если на них нужно реагировать после сдвига то add, а если сохранить флаги "как было" то rlca

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

  8. #1037

    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,101
    Спасибо Благодарностей отдано 
    1,335
    Спасибо Благодарностей получено 
    322
    Поблагодарили
    151 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Если поменять функции HL и DE, то вместо
    Код:
      LD  С,(DE)
      ~ROLL С
      LD A,(HL)
      OR C
      LD (HL),A
    можно писать
    Код:
      LD  A,(DE)
      ~ROLL A
      OR (HL)
      LD (HL),A
    Так чуть короче, чуть быстрее, и регистр BC полностью свободен.

    Когда литеру шлёпаем в два знакоместа, то можно первое знакоместо проходить вниз, а второе вверх. Убираются PUSH POP, и сразу получаем адрес для следующего символа.

    Шесть сдвигов можно заменить двумя циклическими сдвигами в другую сторону с одним AND.

    Если размер важнее скорости, то можно свернуть все DUP-ы.

    А если скорость важнее размера, то можно как нибудь свести эти четыре варианта печати, чтобы они друг друга по очереди вызывали. Или если печатать не символ, а сразу строку, то вообще шли друг за другом по кольцу.
    Или может быть печатали сразу с двух литер в одно знакоместо.
    Или даже имели сразу сдвинутые шрифты.

  9. #1038

    Регистрация
    18.07.2021
    Адрес
    г. Хмельницкий, Украина
    Сообщений
    105
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    33
    Поблагодарили
    25 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Reobne Посмотреть сообщение
    Когда литеру шлёпаем в два знакоместа, то можно первое знакоместо проходить вниз, а второе вверх.
    О! И как бы просто, и попробуй догадайся.

    Цитата Сообщение от Reobne Посмотреть сообщение
    Или если печатать не символ, а сразу строку, то вообще шли друг за другом по кольцу
    Так я и сделал, собственно.

    Цитата Сообщение от Reobne Посмотреть сообщение
    Или может быть печатали сразу с двух литер в одно знакоместо.
    Если вторая литера будет символом конца строки или CRLF, то неудобно получится.

    Собственно, что у меня получилось:
    Код:
    @FONT	equ #d000
    
    OUT43	
    	call coords.BYTE_RC  ; вычислили адрес в экранной памяти по координатам знакоместа
    	ex de, hl		
    	push de		
    PRINT	
    	ld a, (bc)	
    	cp "\N"		; перевод строки?
    	jr NZ, .noCRLF1	
    	pop hl		
    	inc h		
    	inc bc		; take next symbol after \N
    	jp OUT43		
    .noCRLF1	or a		; EOL?
    	jp Z, exitSub		
    	push hl		
    .fnt1	ld d, FONT/256  	
    	ld e, a
    
    ;==================================================================================	
    ;       1st char
    
    	DUP 8	
    	ld a, (de)
    	ld (hl), a
    	inc h	
    	inc d	
    	EDUP
    	pop hl	
    	inc bc	
    ;==================================================================================	
    ;	2nd char
    	
    	ld a, (bc)
    	cp "\N"	
    	jr NZ, .noCRLF2
    	pop hl		
    	inc h		
    	inc bc		
    	jp OUT43	
    .noCRLF2	or a
    	jp Z, exitSub
    	push hl		
    .fnt2	ld d, FONT/256
    	ld e, a		
    	DUP 8		
    	ld a, (de)	
    	rlca
    	rlca		
    	push af
    	and %00000011
    	or (hl)		 
    	ld (hl), a	
    	pop af
    	and %11110000
    	inc hl
    	ld (hl), a	
    	dec hl
    	inc h		
    	inc d		
    	EDUP
    	pop hl		
    	inc bc		
    
    ;==================================================================================	
    ;	3rd char
    
    	ld a, (bc)
    	cp "\N"	
    	jr NZ, .noCRLF3	
    	pop hl		
    	inc h		
    	inc bc		
    	jp OUT43	
    .noCRLF3	or a
    	jp Z, exitSub
    	inc hl		
    	push hl		
    .fnt3	ld d, FONT/256
    	ld e, a		
    	DUP 8		
    	ld a, (de)	
    	DUP 4
    	rlca		
    	EDUP
    	push af
    	and %00001111		
    	or (hl)
    	ld (hl), a		
    	pop af
    	and %11000000	
    	inc hl
    	ld (hl), a		
    	dec hl
    	inc h		
    	inc d		
    	EDUP
    	pop hl		
    	inc bc		
    	
    ;==================================================================================	
    ;	last (4th) char
    
    	ld a, (bc)		
    	cp "\N"		
    	jr NZ, .noCRLF4	
    	pop hl		
    	inc h		
    	inc bc		
    	jp OUT43	
    .noCRLF4	or a
    	jp Z, exitSub
    	inc hl		
    	push hl		
    .fnt4	ld d, FONT/256
    	ld e, a		
    	DUP 8		
    	ld a, (de)	
    	rrca		
    	rrca
    	and %00111111
    	or (hl)
    	ld (hl), a	
    	inc h		
    	inc d		
    	EDUP
    	pop hl
    	inc bc		
    	inc hl		
    	jp PRINT	
    
    exitSub	
    	pop hl
    	ret
    Font1251	incbin "CP1251_42_B_converted.fnt",,2048
    На входе в HL координаты знакоместа, в BC - адрес первого символа строки.
    Пока ещё в состоянии proof of concept, надо оптимизировать, но печатает же ж. И явно быстрее того жуткого ужаса, который я написал в 1996 году, который, ну, в принципе, тоже ведь печатал...
    Последний раз редактировалось 0xDEAD; 18.09.2021 в 11:57.

    Этот пользователь поблагодарил 0xDEAD за это полезное сообщение:

    Reobne(17.09.2021)

  10. #1039

    Регистрация
    05.09.2007
    Адрес
    Орск
    Сообщений
    1,071
    Спасибо Благодарностей отдано 
    269
    Спасибо Благодарностей получено 
    1,245
    Поблагодарили
    370 сообщений
    Mentioned
    18 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Взываю к коллективному разуму.

    Постановка задачи следующая:
    Необходимо трехбайтное число (#000000..#7FFFFF) умножить на дробь формата #FFnn/#10000
    старший байт числителя дроби всегда равен #FF
    Допустима небольшая погрешность при вычислении.
    Основной критерий скорость вычисления, но размер п/п не должен превышать примерно килобайта. Доступна таблица квадратов.

  11. #1040

    Регистрация
    28.02.2005
    Адрес
    Великий Новгород
    Сообщений
    2,087
    Спасибо Благодарностей отдано 
    10
    Спасибо Благодарностей получено 
    230
    Поблагодарили
    98 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Код писать сейчас некогда, но вот идея: умножить исходное на ~#FFnn (aka #00xx), целую часть результата умножения - старшие 2 байта - вычесть из исходного.
    Все любят гипножабу

    Этот пользователь поблагодарил SAM style за это полезное сообщение:

    LW(16.12.2021)

Страница 104 из 113 ПерваяПервая ... 100101102103104105106107108 ... ПоследняяПоследняя

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

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

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

Похожие темы

  1. Этюды: как бы написать поизящнее.
    от AndTorp в разделе Программирование
    Ответов: 5
    Последнее: 17.03.2008, 00:43
  2. Ответов: 0
    Последнее: 18.08.2006, 22:40
  3. Этюды: печать шрифтом 5x5...
    от breeze в разделе Программирование
    Ответов: 12
    Последнее: 27.03.2005, 05:21

Метки этой темы

Ваши права

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