Код:
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