71 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
.define Mul4
 | 
						|
.sect .text
 | 
						|
.sect .rom
 | 
						|
.sect .data
 | 
						|
.sect .bss
 | 
						|
.sect .text
 | 
						|
 | 
						|
! This subroutine multiplies two fourbyte signed integers.
 | 
						|
! For more details see mli.s
 | 
						|
! The only difference is that zeropage locations are twice as big.
 | 
						|
 | 
						|
 | 
						|
Mul4:
 | 
						|
    3:	lda #0
 | 
						|
	sta ARTH+8
 | 
						|
	sta ARTH+9
 | 
						|
	sta ARTH+10
 | 
						|
	sta ARTH+11
 | 
						|
	sta ARTH+12
 | 
						|
	sta ARTH+13
 | 
						|
	sta ARTH+14
 | 
						|
	sta ARTH+15	! clear accumulator
 | 
						|
    	ldy #32
 | 
						|
    1:	lda #0x01
 | 
						|
	bit ARTH
 | 
						|
	beq 2f		! multiplying by zero: no addition
 | 
						|
	clc
 | 
						|
	lda ARTH+12
 | 
						|
	adc ARTH+4
 | 
						|
	sta ARTH+12
 | 
						|
	lda ARTH+13
 | 
						|
	adc ARTH+5
 | 
						|
	sta ARTH+13
 | 
						|
	lda ARTH+14
 | 
						|
	adc ARTH+6
 | 
						|
	sta ARTH+14
 | 
						|
	lda ARTH+15
 | 
						|
	adc ARTH+7
 | 
						|
	sta ARTH+15
 | 
						|
    2:	lsr ARTH+3
 | 
						|
	ror ARTH+2
 | 
						|
	ror ARTH+1
 | 
						|
	ror ARTH	! shift multiplier
 | 
						|
	lsr ARTH+15
 | 
						|
	ror ARTH+14
 | 
						|
	ror ARTH+13
 | 
						|
	ror ARTH+12
 | 
						|
	ror ARTH+11
 | 
						|
	ror ARTH+10
 | 
						|
	ror ARTH+9
 | 
						|
	ror ARTH+8	! shift accumulator
 | 
						|
	lda UNSIGN
 | 
						|
	beq 3f		! it's unsigned: so no shift in of signbit
 | 
						|
	lda ARTH+7
 | 
						|
	bpl 3f
 | 
						|
	lda #0x40
 | 
						|
	bit ARTH+15
 | 
						|
	beq 3f
 | 
						|
	lda ARTH+15
 | 
						|
	ora #0x80
 | 
						|
	sta ARTH+15
 | 
						|
    3:	dey
 | 
						|
	bne 1b
 | 
						|
	ldx ARTH+10
 | 
						|
	lda ARTH+11
 | 
						|
	jsr Push
 | 
						|
	ldx ARTH+8
 | 
						|
	lda ARTH+9
 | 
						|
	jmp Push
 | 
						|
 | 
						|
 |