С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Спасибо!!!!! Вот что вышло и работает, переделал на ixl все регистры занятыКод:ddd1 ld a,e add a,96 ld e,a jr nc,ddd2 ld a,d add a,8 ld d,a ddd2 ld a,e and 224 ld ixl,a inc e inc e ld a,e and 31 or ixl ld e,a ret
Нужна процедура деления.
Вида: (+-)16/16=16.16
Кучу разных перебрал, но всё равно лажают, ибо заточены и подрезаны под конкретные задачи.
А нужно просто деление регистровой пары на пару с учётом знаков.
(ну или на крайняк - без знаков, но чтоб не лажала)
Есть у кого варианты?
Последний раз редактировалось Destr; 10.02.2014 в 21:58.
Код:;HL/DE=BC,HL-ОСТАТОК DIVW LD A,E:OR D RET Z XOR A LD C,A,B,A EX DE,HL DIVW1 INC B BIT 7,H JR NZ,DIVW2 ADD HL,HL JP DIVW1 DIVW2 EX DE,HL DIVW3 OR A SBC HL,DE JR NC,DIVW4 ADD HL,DE DIVW4 CCF RL C:RL A RR D,E DJNZ DIVW3 LD B,A RET
GM BIT, что-то не работает как надо.
Пробую делить 1234 на 5678.
Должно получится: #000037A2 а получается #000004D2 (т.е. HL остаётся как был)
Вот такая у меня в Эйфории пашет безотказно:
Код:; функция 16-разрядного беззнакового деления ; (C) Aleksey Malov aka Vivid ; little optimized by Vitaly Vidmirov ; hl = de/bc de = de%bc ~840 takts. ; hl = 65535, de = de(dividend) if bc(divisor) == 0. div ld hl,65535 ld a,b or c ret z ; если bс=0 xor a ;меняем знак sub c ; у делителя ld c, a sbc a, b sub c ld b, a ld hl,0 ;обнулили новое делимое ld a,d ;сначала двигаем rla ;старший байт делимого ;t=18 ; REPEAT 8 rl l ; add hl,bc ; jr c,$+4 ;8 раз sbc hl,bc ; rla ; t=8*45=360 rl l add hl,bc jr c,$+4 sbc hl,bc rla rl l add hl,bc jr c,$+4 sbc hl,bc rla rl l add hl,bc jr c,$+4 sbc hl,bc rla rl l add hl,bc jr c,$+4 sbc hl,bc rla rl l add hl,bc jr c,$+4 sbc hl,bc rla rl l add hl,bc jr c,$+4 sbc hl,bc rla rl l add hl,bc jr c,$+4 sbc hl,bc rla ; ENDR ld d,a ;ст. байт результата ld a,e ;теперь двигаем rla ;младший байт t=12 ; REPEAT 8 adc hl,hl ; add hl,bc ; jr c,$+4 ;8 раз sbc hl,bc ; rla ; t=8*52=416 adc hl,hl add hl,bc jr c,$+4 sbc hl,bc rla adc hl,hl add hl,bc jr c,$+4 sbc hl,bc rla adc hl,hl add hl,bc jr c,$+4 sbc hl,bc rla adc hl,hl add hl,bc jr c,$+4 sbc hl,bc rla adc hl,hl add hl,bc jr c,$+4 sbc hl,bc rla adc hl,hl add hl,bc jr c,$+4 sbc hl,bc rla adc hl,hl add hl,bc jr c,$+4 sbc hl,bc rla ; ENDR ld e,a ;мл. байт результата ;hl-остаток от деления ;t=4 ex de, hl ret
Тоже врёт.
Или я что-то не так делаю?
Код:DEVICE ZXSPECTRUM128 STARTFORSNA EQU #8C22 ORG STARTFORSNA LD SP,#5C00 LD DE,1234 LD BC,5678 CALL div ; должно быть #37A2 JR $ ; Andrew771 ; функция 16-разрядного беззнакового деления ; (C) Aleksey Malov aka Vivid ; little optimized by Vitaly Vidmirov ; hl = de/bc de = de%bc ~840 takts. ; hl = 65535, de = de(dividend) if bc(divisor) == 0. div ld hl,65535 ld a,b or c ret z ; если bс=0 xor a ;меняем знак sub c ; у делителя ld c, a sbc a, b sub c ld b, a ld hl,0 ;обнулили новое делимое ld a,d ;сначала двигаем rla ;старший байт делимого ;t=18 ; REPEAT 8 rl l ; add hl,bc ; jr c,$+4 ;8 раз sbc hl,bc ; rla ; t=8*45=360 rl l add hl,bc jr c,$+4 sbc hl,bc rla rl l add hl,bc jr c,$+4 sbc hl,bc rla rl l add hl,bc jr c,$+4 sbc hl,bc rla rl l add hl,bc jr c,$+4 sbc hl,bc rla rl l add hl,bc jr c,$+4 sbc hl,bc rla rl l add hl,bc jr c,$+4 sbc hl,bc rla rl l add hl,bc jr c,$+4 sbc hl,bc rla ; ENDR ld d,a ;ст. байт результата ld a,e ;теперь двигаем rla ;младший байт t=12 ; REPEAT 8 adc hl,hl ; add hl,bc ; jr c,$+4 ;8 раз sbc hl,bc ; rla ; t=8*52=416 adc hl,hl add hl,bc jr c,$+4 sbc hl,bc rla adc hl,hl add hl,bc jr c,$+4 sbc hl,bc rla adc hl,hl add hl,bc jr c,$+4 sbc hl,bc rla adc hl,hl add hl,bc jr c,$+4 sbc hl,bc rla adc hl,hl add hl,bc jr c,$+4 sbc hl,bc rla adc hl,hl add hl,bc jr c,$+4 sbc hl,bc rla adc hl,hl add hl,bc jr c,$+4 sbc hl,bc rla ; ENDR ld e,a ;мл. байт результата ;hl-остаток от деления ;t=4 ex de, hl ret ; GM BIT ; HL/DE=BC,HL-ОСТАТОК DIVW LD A,E:OR D RET Z XOR A LD C,A,B,A EX DE,HL DIVW1 INC B BIT 7,H JR NZ,DIVW2 ADD HL,HL JP DIVW1 DIVW2 EX DE,HL DIVW3 OR A SBC HL,DE JR NC,DIVW4 ADD HL,DE DIVW4 CCF RL C:RL A RR D,E DJNZ DIVW3 LD B,A RET SAVESNA "test.sna",STARTFORSNA
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)