User Tag List

Страница 103 из 113 ПерваяПервая ... 99100101102103104105106107 ... ПоследняяПоследняя
Показано с 1,021 по 1,030 из 1128

Тема: ЭТЮДЫ

  1. #1021

    Регистрация
    04.05.2006
    Адрес
    St.-Petersburg
    Сообщений
    2,234
    Спасибо Благодарностей отдано 
    490
    Спасибо Благодарностей получено 
    989
    Поблагодарили
    641 сообщений
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    Cool Деление на 102 с хвостиком)

    Намедни возникла нужда сделать вывод большого (более 65535) числа в десятичном виде, в Килобайтах и с одним знаком после запятой.
    Исходное число хранится в трёх байтах, т.о. оно может принимать значения от 0 до 16777216.
    Соответственно, при выводе требуется "разбить" исходное число как бы на две составляющие: целую часть и остаток.
    Тут всё просто, целая часть это старшие биты начиная с десятого и выше, а остаток это десять младших бит.

    Собственно задачка - преобразовать число остатка (0..1023) в соответствующие значения десятых (0..9).
    Тобишь значение 512 должно нам давать ",5" и т.д.
    Чисто математически решение сводится к делению значения остатка на константу 102,4.
    Для гуру это конечно же "не вопрос", а я традиционно люблю изобретать велосипед, поэтому на решение был убит очень нескучный вечер
    Но результатом я дико доволен, в связи с чем решил поделиться.

    Ранее у меня был исследован вопрос быстрого деления на 10, 100, 1000, и в хозяйстве были заготовки такого кода,
    который я и стал пытаться приспособить для решения данной задачи. Вроде бы 102 с хвостиком и 100 - это примерно одно и то же...
    Но не тут-то было, ошибка набегала столь фатальная, что такой вариант оказался абсолютно неприемлем.
    Были попытки предварительно "чуть подкрутить" делимое (а также результат), чтобы хотя бы явные значения типа 512->0,5 были некривые. Но в итоге получалось громоздко и некрасиво.
    В какой-то момент уже даже хотел сдаться, плюнуть, и сделать втупую сравнениями с переходными значениями и выдачей константы...
    Но вдруг осенило! Давно не получал такого удовлетворения от неожиданно найденного решения, если честно.

    Суть пока не рассказываю, просто готовый код


    Код:
    ; в [HL] остаток (0..1023)
    MOV D,H
    MOV E,L
    DAD H
    DAD H
    DAD H
    DAD D
    DAD D
    MOV A,H
    RRC
    RRC
    ANI 0Fh
    ; в [A] точное значение десятых (0..9)
    П.С. может кому-то даже пригодится)
    Критиковать - значит объяснять автору, что он делает не так, как делал бы я, если бы умел

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

  3. #1022

    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    8,393
    Спасибо Благодарностей отдано 
    763
    Спасибо Благодарностей получено 
    2,367
    Поблагодарили
    1,317 сообщений
    Mentioned
    39 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Код:
    ; в [HL] остаток (0..1023)
    MOV D,H
    MOV E,L
    DAD H
    DAD H
    DAD D
    MOV A,H
    RAR
    ; в [A] точное значение десятых (0..9)

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

    Denn(26.01.2021)

  4. #1023

    Регистрация
    19.10.2019
    Адрес
    г. Электроугли
    Сообщений
    54
    Спасибо Благодарностей отдано 
    23
    Спасибо Благодарностей получено 
    68
    Поблагодарили
    20 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Denn Посмотреть сообщение
    Суть пока не рассказываю, просто готовый код
    [точное значение десятых] = [остаток] * 10 / 1024
    либо:
    [точное значение десятых] = [остаток] * 5 / 512

  5. #1024

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

    По умолчанию

    Надо-же, нашёл в загашниках (ещё на дискете, на ZEUS писано было, потом уже под sjasm адаптировал)

    Скрытый текст


    Код:
    ; Проявлялка экрана
    	ORG #8000
    
    	LD SP,#8000
    	DI
    	
    	XOR A:OUT (#FE),A
    	CALL WAITKEY
    	CALL O_INIT
    START	EI:HALT:DI
    	CALL POPOLZ
    	XOR A:OUT (#FE),A
    
    	LD HL,TAKT:INC (HL)
    	
    	JR START
    POPOLZ	; 6883
    	EXX:LD H,#5A,BC,#0358,DE,32:EXX
    	XOR A
    POP2	LD E,A
    	EXA
    	LD D,0,HL,O_BUFF
    	ADD HL,DE
    	LD D,(HL)
    	LD A,E:ADD A,#C0:LD L,A,H,#57
    	LD A,(TAKT),C,A
    	ADD A,D:LD C,A
    	LD A,24:SUB C:JR C,POP0,Z,POP0
    	LD B,A
    	LD C,8
    POP1	LD A,L:ADD A,32:LD E,A:SBC A,A:AND C:ADD A,H:LD D,A
    
    	LD A,L:EXX:LD L,A:EXX
    	LD A,H:EXX:RRCA:RRCA:RRCA:AND B:OR C:LD H,A
    	LD A,(HL),(HL),0
    	ADD HL,DE
    	LD (HL),A
    	EXX
    
    	REPT 8
    		LD A,(HL),(DE),A:DEC H,D
    	ENDR
    	LD A,L:ADD A,-32:LD L,A:SBC A,A:AND C:ADD A,H:LD H,A
    	DJNZ POP1
    
    	XOR A
    	REPT 8
    		INC D:LD (DE),A
    	ENDR
    	
    POP0	EXA
    	INC A:CP 32:JR C,POP2
    	
    	RET
    RND_BYTE
    	LD A,53
    	ADD A,A
    	JR NC,$+4
    	XOR 57
    	LD (RND_BYTE+1),A
    	RET
    TAKT	DB 0
    O_BUFF	DS 32
    O_INIT	LD A,R:ADD A,50:LD (RND_BYTE+1),A
    	LD HL,O_BUFF,B,32
    O_I1	CALL RND_BYTE
    	AND 7:NEG
    	DEC HL:CP (HL):INC HL:JR Z,O_I1
    	LD (HL),A
    	INC HL,DE
    	DJNZ O_I1
    	RET
    WAITKEY	XOR A:IN A,(#FE):CPL:AND #1F:JR Z,WAITKEY
    WK	XOR A:IN A,(#FE):CPL:AND #1F:JR NZ,WK
    	RET
    
    	ORG #4000:INCBIN "1.scr";,0,#1800
    [свернуть]

    Это в молодости когда DOOM-2 увидел (первого вообще в наших краях никто в глаза не видал) - захотелось на спеке такой-же FADE-OUT - кривенько, но ностальжи (эх какой там год - уже не вспомнить, что-то дремучее 9х )

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

    zebest(14.06.2021)

  6. #1025

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

    По умолчанию

    Цитата Сообщение от zebest Посмотреть сообщение
    Я бы сказал - очистка экрана. А так да, работает
    Конечно очистка!
    Я просто оставил комменты те, старые!
    (вообще-то там должно было не чистый скрин оставлять, а новый типа, ну как в DOOM)

  7. #1026

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

    По умолчанию

    Граждане, а киньте, кому не жалко, каких-то процедурок печати 42 символов. Можно и 64, но, в первую очередь, 42 интересует.

  8. #1027

    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,681
    Спасибо Благодарностей отдано 
    2,716
    Спасибо Благодарностей получено 
    170
    Поблагодарили
    130 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию



    Не везде затирает фон под выводимыми буквами, нужно предварительно чистить какой-то другой процедурой.
    В комплекте процедура генерации шрифта 6x8 из ПЗУшного.
    На картинке кастомный шрифт.

    Код:
    MODULE TestOut6x8; (*$MAIN*)(*$866*)
    IMPORT SYSTEM, C := Out6x8, GrFonts, B := Basic;
    
    VAR
      n: INT8;
    BEGIN
      B.Init; B.CLS;
      C.font := SYSTEM.ADR(GrFonts.HalfSpaceRus6x8);
      C.At(0, 23); n := 1; REPEAT C.Ch(CHR(n)); INC(n) UNTIL n = -3;
      FOR n := 0 TO 16 DO C.At(n, n); C.Str("Привет, Савелий !!!") END;
      B.PAUSE(0);
      B.Quit
    END TestOut6x8.

  9. #1028

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

    По умолчанию

    Цитата Сообщение от 0xDEAD Посмотреть сообщение
    Граждане, а киньте, кому не жалко, каких-то процедурок печати 42 символов. Можно и 64, но, в первую очередь, 42 интересует.
    http://zxpress.ru/article.php?id=12845
    http://zxpress.ru/article.php?id=4800

  10. #1029

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

    По умолчанию

    Видел я это...
    Что такое, например, "LD В,'FONT42"? Видел в жизни всего два ассемблера - GENS и Sjasm. что за 'FONT42, который грузится в 8-бит регистр, не пойму.

  11. #1030

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

    По умолчанию

    Старший байт адреса шрифта.

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

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

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

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

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

Ваши права

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