ZXNet эхоконференция «code.zx»


тема: Про деление на 10



от: Paul Falcon
кому: Kirill Smelkow
дата: 06 Mar 1998
Сижу вот, читаю, и вдуг вижу Kirill Smelkow пишет к ALL...

Hi Kirill!

KS> Hе подскажет-ли кто алгоритм быстрого деления
KS> целых чисел на десять. Просто очень нужно, и я
KS> кое-что придумал, но выглядит довольно коряво,
KS> и значит скорее всего можно сделать лучше.

ld a,num
daa
rrca
rrca
rrca
rrca

вроде должно работать

▌█▐▐║▌█▐▐▌▐ W!7h 7he Be$7 W!$he$ fR0M CREATOR product
▌812/03.00▐ Powered by Cyrix 6x86L 200/16DIMM/S3TrV2 2Mb/SBPro/Q1.6Gb/USR33.6

от: 500:812/22.01
кому: Paul Falcon
дата: 07 Mar 1998

┌┐
CM07p├0 B┴┴py┌ 06-03-98, B 01:23:34 ├┤ekT0
Paul Falcon ┌┐│/│Cа/ k Kirill Smelkow ┌┐p0 Про деление на 10 :

├┤i Paul & Kirill !

KS>> Hе подскажет-ли кто алгоритм быстрого деления
KS>> целых чисел на десять. Просто очень нужно, и я
KS>> кое-что придумал, но выглядит довольно коряво,
KS>> и значит скорее всего можно сделать лучше.

PF> ld a,num
PF> daa
PF> rrca
PF> rrca
PF> rrca
PF> rrca

PF> вроде должно работать

Я еще раз подумал и окончаельно решил - это дезинформация!
Работать оно никогда не будет, даже после LSD.

Здесь 2 ошибки : после RRCA надо AND #0F и DAA...

Самым быстрым способом будет табличка на 256 байт для чисел
в диапазоне 0..255. Если используются 16 битные операнды, то
табличка может занять 4 страницы :(

Перевод из BIN->BCD командой DAA не осуществляется !
Для перевода 1 байтного числа необходимо добавить к значению 6,
если младшая тетрада больше 9 и еще по 6 для каждой единицы
из старшей тетрады. Т.е. число #3A конвертироваться в BCD формат
будет следующим образом: т.к. младшая тетрада > 9 то добавляется

6 и еще добавляется 6*3=18, в сумме #58.


2All: кто может предложить _нормальный_ алгоритм перевода BIN<->BCD
пишите...


Wi7h be57 Wi5he5, FK0.

-+- BASIC_48 AND POKES

от: 500:812/06.06
кому: Kirill Smelkow
дата: 09 Mar 1998

05-03-98, в 01:02 Kirill Frolov написал to Kirill Smelkow на тему Про
деление на 10 и я решил
присоединиться...

Рад приветствовать тебя,Kirill !!!

KS>> Hе подскажет-ли кто алгоритм быстрого деления
KS>> целых чисел на десять. Просто очень нужно, и я

Даже не тока алгоритм,готовую процедуру можно дать:

;L=C/10

LD B,10
XOR A
LD L,1
D1 RL C
RLA
CP B
JR C,ZER
SUB B
SLI L
JP NC,D1
RET
ZER SLA L
JP NC,D1
RET

Скорость:от 388 до 396 тактов,24 байта.Взято из пятого Формата.

С уважением,DMA from GRENNFORT INC.

-+- SMM version 1.08

от: 500:812/22.01
кому: Paul Falcon
дата: 11 Mar 1998

┌┐
CM07p├0 B┴┴py┌ 06-03-98, B 01:23:34 ├┤ekT0
Paul Falcon ┌┐│/│Cа/ k Kirill Smelkow ┌┐p0 Про деление на 10 :

├┤i Paul & Kirill !

KS>> Hе подскажет-ли кто алгоритм быстрого деления
KS>> целых чисел на десять. Просто очень нужно, и я
KS>> кое-что придумал, но выглядит довольно коряво,
KS>> и значит скорее всего можно сделать лучше.

PF> ld a,num
PF> daa
PF> rrca
PF> rrca
PF> rrca
PF> rrca

PF> вроде должно работать


DAA - десятичная коррекция аккамулятора, используется после
сложения либо вычитания чисел в BCD формате....


...После сложения действует следующим образом:

1).Если содержимое младшей тетрады A больше 9 или H=1,
то к аккамулятору добавляется число 6.
2).Если содержимое старшей тетрады A стало после этого
стало больше 9 или C=1, то 6 добавляется и к старшей
тетраде аккамулятора.

После вычитания:

1).Если H=1, то от аккамулятора вычитается число 6.
2).Если C=1, то число 6 вычитаетсЯ и из старшей тетрады
аккамулятора.


Фляги: C - carry флаг переноса...

H - halfcarry флаг полупереноса
Комманды сложения, вычитания, инкремента,
декремента и сравнения 8 битных операндов
устанавливают флаг H когда был перенос из
третьего бита результата в четвертый, или
был заем от четвертого бита к третьему.
этим он указывает команде DAA требует ли
результат десятичной коррекции.

N - addition/subtraction флаг сложения/вычитания
Команды сложения, инкремента и логические
операции обнуляют флаг N, а команды вычитания,
декремента, сравнения и инвертирования его
устанавливают.
Состояние флага N используется командой
DAA т.к. алгоритк корректировки различен
при сложении и вычитании, этот фляг показывает,
какое именно действие происходило перед этим.


Влияние выполнения различных команд на флаги :

C Z P S N H
LD R,N . . . . . . . - не меняется
? - неопределен
DAA ? ? P ? . ? 0 - сбрасывается
P - четный результат
RRCA ? . . . 0 0


это были куски книжки.
А теперь по существу стоящего вопроса - алгоритм бредовый.
Флаги неопределены и результат соответствующий. Для его
нормальной работы необходимо вначале установить в соответствующее
состояние фляги C,H,N. И еще будет ли он после этого работать
я затрудняюсь. Может и будет, а может и нет.


Wi7h be57 Wi5he5, FK0.

-+- SMM version 1.08

от: 500:812/22.01
кому: Paul Falcon
дата: 11 Mar 1998

┌┐
CM07p├0 B┴┴py┌ 06-03-98, B 01:23:34 ├┤ekT0
Paul Falcon ┌┐│/│Cа/ k Kirill Smelkow ┌┐p0 Про деление на 10 :

├┤i Paul & Kirill !

KS>> Hе подскажет-ли кто алгоритм быстрого деления
KS>> целых чисел на десять. Просто очень нужно, и я
KS>> кое-что придумал, но выглядит довольно коряво,
KS>> и значит скорее всего можно сделать лучше.

PF> ld a,num
PF> daa
PF> rrca
PF> rrca
PF> rrca
PF> rrca

PF> вроде должно работать


DAA - десятичная коррекция аккамулятора, используется после
сложения либо вычитания чисел в BCD формате....


...После сложения действует следующим образом:

1).Если содержимое младшей тетрады A больше 9 или H=1,
то к аккамулятору добавляется число 6.
2).Если содержимое старшей тетрады A стало после этого
стало больше 9 или C=1, то 6 добавляется и к старшей
тетраде аккамулятора.

После вычитания:

1).Если H=1, то от аккамулятора вычитается число 6.
2).Если C=1, то число 6 вычитаетсЯ и из старшей тетрады
аккамулятора.


Фляги: C - carry флаг переноса...

H - halfcarry флаг полупереноса
Комманды сложения, вычитания, инкремента,
декремента и сравнения 8 битных операндов
устанавливают флаг H когда был перенос из
третьего бита результата в четвертый, или
был заем от четвертого бита к третьему.
этим он указывает команде DAA требует ли
результат десятичной коррекции.

N - addition/subtraction флаг сложения/вычитания
Команды сложения, инкремента и логические
операции обнуляют флаг N, а команды вычитания,
декремента, сравнения и инвертирования его
устанавливают.
Состояние флага N используется командой
DAA т.к. алгоритк корректировки различен
при сложении и вычитании, этот фляг показывает,
какое именно действие происходило перед этим.


Влияние выполнения различных команд на флаги :

C Z P S N H
LD R,N . . . . . . . - не меняется
? - неопределен
DAA ? ? P ? . ? 0 - сбрасывается
P - четный результат
RRCA ? . . . 0 0


это были куски книжки.
А теперь по существу стоящего вопроса - алгоритм бредовый.
Флаги неопределены и результат соответствующий. Для его
нормальной работы необходимо вначале установить в соответствующее
состояние фляги C,H,N. И еще будет ли он после этого работать
я затрудняюсь. Может и будет, а может и нет.


Wi7h be57 Wi5he5, FK0.

-+- SMM version 1.08

от: 500:812/08.14
кому: Kirill Smelkow
дата: 11 Mar 1998

Hi, Kirill !


KS> Вообще-то нужно для следующих вариантов:
KS> беззнаковое целое #00..#FF
KS> целое со знаком -128..+127
KS> то же самое для целых состоящих из двух байт.

хе-хе... щас буду рожать...

Самое простое - метод вычитания.

;очень долгий метод
;X/Y=N.M, где X=N*Y+M
;A/C=B.A < регистры проца на входе и выходе
DIV INC C
DEC C
JR Z,...; DIVIDE BY ZERO
LD B,#FF
M0 INC B
SUB C
JR NC,M0
ADD A,C
RET

; со знаком
; A/C=B.A
DIVS ADD A,A
PUSH AF
RRCA
CALL DIV
LD D,A
SLA B
POP AF
RR B
LD A,D
RET

метод пригоден для небыстрых задач.
можно поступать так же для деления слов,
но при делении, скажем, 65525/2 это займет
секунду...

нормальный метод:
;DE/BC=DE.HL
DIV16 LD HL,0
LD HX,16
DIV0 SLI E
RL D
ADC HL,HL
SBC HL,BC
JR NC,DIV1
ADD HL,BC
DEC E
DIV1 DEC HX
JR NZ,DIV0
RET

Со знаком сам придумаешь...

теперь перевод HEX to BCD

;DE-hex
;C(3..0),H(7..4),H(3..0),L(7..4),L(3..0)-bcd
HTOBCD XOR A
LD H,A:LD L,A:LD C,A
LD B,16
HTB0 RL E:RL D
LD A,L:ADC A,L:DAA:LD L,A
LD A,H:ADC A,H:DAA:LD H,A
LD A,C:ADC A,C:DAA:LD C,A
DJNZ HTB0
RET

и наоборот...
;DE-адрес стринга, в конце - #00
;HL-hex
BCDTH LD HL,0
LD HX,5
BCDTH0 ADD HL,HL
LD B,H:LD C,L
ADD HL,HL
ADD HL,HL
ADD HL,BC
LD A,(DE):INC DE
SUB "0":RET C
ADD A,L:LD L,A
JR BCDTH0


Всего хорошего.

Дмитрий aka -=LD=- / X-TRADE GROUP.

-+- SMM version 1.08

от: 500:812/08.29
кому: Kirill Smelkow
дата: 11 Mar 1998


Hi All !

KS>> Hе подскажет-ли кто .....

Мне этот вопрос показался интересным
и вот что я сочинил:

; !!! ДЕЛЕHИЕ HА 10 !!!
;
; A = A / 10
; ВРЕМЯ В ТАКТАХ
;
LD BC,#A007 ; 10
; ────┐
METKA CP B ; 4 │
JR C,$+3 ; 8/13 │
SUB B ; 4/ \n
RL C ; 8 > 5 раз
SRL B ; 8 /
BIT 0,B ; 8 │
JR Z,METKA ; 8/13 │-4раза=13
; ────┘-1раз =8
LD A,C ; 4
CPL ; 4
RET ; 10

ИТОГО МАКСИМАЛЬHОЕ КОЛ-ВО ТАКТОВ:

; 10+20+65+40+40+40+60+18 = 293 ТАКТА

ДЛИHА = 18 БАЙТ

Если скорость очень важна, то цикл
можно развернуть выиграв при этом
около 100 тактов...

-+- ZX-ASM




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Страницы истории - Толкин: окончание рассказа о культовом писателе.
Последняя страница - авторы номера.
Проходилка - прохождение игры Crime Santa Claus.

В этот день...   23 августа