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
 |