90 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			90 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
 |