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
|