это сложнее
разложи на 2 этапа
прибавление смещения вниз
прибавление смещения вправо
иначе будут проблемы с третями
Вид для печати
Спасибо!!!!! Вот что вышло и работает, переделал на 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
Кучу разных перебрал, но всё равно лажают, ибо заточены и подрезаны под конкретные задачи.
А нужно просто деление регистровой пары на пару с учётом знаков.
(ну или на крайняк - без знаков, но чтоб не лажала)
Есть у кого варианты?
Код:;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