50 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
.define Cii
 | 
						|
 | 
						|
! This subroutine converts integers to integers.
 | 
						|
! Convertions of integers with the same source size as destination
 | 
						|
! size aren't done, there just return the source.
 | 
						|
! A convertion from 4 bytes to 2 bytes just strips the two
 | 
						|
! most significant bytes.
 | 
						|
! A convertion from 2 bytes to 4 bytes tests the sign of the
 | 
						|
! source so that sign extentension takes place if neccesairy.
 | 
						|
 | 
						|
 | 
						|
Cii:
 | 
						|
	cpx #2
 | 
						|
	beq Cii_2	! a conversion from ? to 2
 | 
						|
	jsr Pop		! a conversion from 4 to ?
 | 
						|
	cpx #4
 | 
						|
	beq 8f		! a conversion 4 to 4 (skip)
 | 
						|
	jsr Pop
 | 
						|
	tay		! save A for sign test
 | 
						|
	pha		! save A 
 | 
						|
	txa
 | 
						|
	pha		! save X
 | 
						|
	tya		! test on negative
 | 
						|
	bmi 1f		! negative means sign extension
 | 
						|
	lda #0		! no sign extension here
 | 
						|
	tax
 | 
						|
	beq 2f
 | 
						|
    1:	lda #0FFh	! sign extension here
 | 
						|
	tax
 | 
						|
    2:	jsr Push	! push twobyte integer
 | 
						|
	pla
 | 
						|
	tax		! get X
 | 
						|
	pla		! get A
 | 
						|
	jmp Push
 | 
						|
Cii_2:			! a conversion from 2 to ?
 | 
						|
	jsr Pop
 | 
						|
	cpx #2
 | 
						|
	beq 8f		! a conversion from 2 to 2 (skip)
 | 
						|
	jsr Pop		! a conversion from 4 to 2
 | 
						|
	pha		! save A
 | 
						|
	txa
 | 
						|
	pha		! save X
 | 
						|
	jsr Pop		! strip most significant bytes
 | 
						|
	pla		! get X
 | 
						|
	tax
 | 
						|
	pla		! get A
 | 
						|
	jmp Push	! push result
 | 
						|
    8:	rts
 | 
						|
 | 
						|
 |