91 lines
1 KiB
ArmAsm
91 lines
1 KiB
ArmAsm
.define .dvi4
|
|
.sect .text
|
|
.sect .rom
|
|
.sect .data
|
|
.sect .bss
|
|
.sect .text
|
|
|
|
! 4-byte divide routine for z80
|
|
! parameters:
|
|
! stack: divisor
|
|
! dividend
|
|
! stack: quotient (out)
|
|
! bc de: remainder (out) (high part in bc)
|
|
|
|
|
|
|
|
.dvi4:
|
|
pop hl
|
|
ld (retaddr),hl
|
|
xor a
|
|
ld (.flag1),a
|
|
ld (.flag2),a
|
|
ld ix,0
|
|
add ix,sp
|
|
ld b,(ix+7) ! dividend
|
|
bit 7,b
|
|
jr z,1f
|
|
ld c,(ix+6)
|
|
ld d,(ix+5)
|
|
ld e,(ix+4)
|
|
call .negbd
|
|
ld (ix+7),b
|
|
ld (ix+6),c
|
|
ld (ix+5),d
|
|
ld (ix+4),e
|
|
ld a,1
|
|
ld (.flag1),a
|
|
1:
|
|
ld b,(ix+3)
|
|
bit 7,b
|
|
jr z,2f
|
|
call .negst
|
|
ld a,1
|
|
ld (.flag2),a
|
|
2:
|
|
call .dvu4
|
|
ld a,(.flag1)
|
|
or a
|
|
jr z,3f
|
|
call .negbd
|
|
3:
|
|
ld (.savebc),bc
|
|
ld (.savede),de
|
|
ld a,(.flag2)
|
|
ld b,a
|
|
ld a,(.flag1)
|
|
xor b
|
|
jr z,4f
|
|
call .negst
|
|
4:
|
|
ld bc,(.savebc)
|
|
ld de,(.savede)
|
|
ld hl,(retaddr)
|
|
jp (hl)
|
|
.negbd:
|
|
xor a
|
|
ld h,a
|
|
ld l,a
|
|
sbc hl,de
|
|
ex de,hl
|
|
ld h,a
|
|
ld l,a
|
|
sbc hl,bc
|
|
ld b,h
|
|
ld c,l
|
|
ret
|
|
.negst:
|
|
pop ix
|
|
pop de
|
|
pop bc
|
|
call .negbd
|
|
push bc
|
|
push de
|
|
jp (ix)
|
|
.sect .data
|
|
.flag1: .data1 0
|
|
.flag2: .data1 0
|
|
retaddr:.data2 0
|
|
.savebc: .data2 0
|
|
.savede: .data2 0
|