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

User Tag List

Страница 104 из 104 ПерваяПервая ... 100101102103104
Показано с 1,031 по 1,038 из 1038

Тема: ЭТЮДЫ

  1. #1031
    Veteran
    Регистрация
    01.03.2005
    Адрес
    Новосибирск
    Сообщений
    1,821
    Спасибо Благодарностей отдано 
    30
    Спасибо Благодарностей получено 
    129
    Поблагодарили
    46 сообщений
    Mentioned
    4 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
    Veteran
    Регистрация
    01.03.2005
    Адрес
    Новосибирск
    Сообщений
    1,821
    Спасибо Благодарностей отдано 
    30
    Спасибо Благодарностей получено 
    129
    Поблагодарили
    46 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

    Barmaley_m (14.09.2021)

  4. #1033
    Veteran
    Регистрация
    08.01.2007
    Адрес
    г. Красноярск
    Сообщений
    1,107
    Спасибо Благодарностей отдано 
    161
    Спасибо Благодарностей получено 
    774
    Поблагодарили
    165 сообщений
    Mentioned
    5 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
    !

  5. #1034
    Activist
    Регистрация
    03.07.2021
    Адрес
    г. Кировск
    Сообщений
    213
    Спасибо Благодарностей отдано 
    13
    Спасибо Благодарностей получено 
    27
    Поблагодарили
    23 сообщений
    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.

  6. #1035
    Junior
    Регистрация
    18.07.2021
    Адрес
    г. Хмельницкий, Украина
    Сообщений
    15
    Спасибо Благодарностей отдано 
    1
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

  7. #1036
    Veteran Аватар для Destr
    Регистрация
    26.03.2008
    Адрес
    Питкяранта
    Сообщений
    1,725
    Спасибо Благодарностей отдано 
    138
    Спасибо Благодарностей получено 
    57
    Поблагодарили
    48 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

  9. #1037
    Master
    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    794
    Спасибо Благодарностей отдано 
    179
    Спасибо Благодарностей получено 
    50
    Поблагодарили
    37 сообщений
    Mentioned
    0 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-ы.

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

  10. #1038
    Junior
    Регистрация
    18.07.2021
    Адрес
    г. Хмельницкий, Украина
    Сообщений
    15
    Спасибо Благодарностей отдано 
    1
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    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.

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

    Reobne (17.09.2021)

Страница 104 из 104 ПерваяПервая ... 100101102103104

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

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

Эту тему просматривают: 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

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

Ваши права

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