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




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

Похожие статьи:
За бугром - Интервью с Джоном Ритманом.
Вступление - В этой газете вы найдете отборный юмор мировых компьютерных сетей, а также всякие прикольные ситуации приключившиеся в нашей гродненской сети.
Credits - список авторов музыки и графики использованной в предыдущих номерах.
О разном - спектрум умирает, а виноваты мы сами?
Вступление - содержание номера.

В этот день...   8 мая