⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jumptest.asm

📁 risc5x源代码。介绍了一般微处理器核的设计原理、基本概念和方法.
💻 ASM
字号:
;
	LIST    p=16C58 ; PIC16C58 is the target processor


;
; Core Sanity Test
;
; JUMPTEST.ASM
;
; test some jumps
; NEW in rev 1.1, test indirect addressing
; test some inc & decs
; sit in loop multiplying port A with a constant
; output 16 bit result on ports C & B
;

CARRY   equ     H'00'   ; Carry bit in STATUS register
DC      equ     H'01'   ; DC    bit in STATUS register
ZERO    equ     H'02'   ; Zero  bit in STATUS register
W       equ     H'00'   ; W indicator for many instruction (not the address!)

INDF    equ     H'00'   ; Magic register that uses INDIRECT register
TIMER0  equ     H'01'   ; Timer register
PC      equ     H'02'   ; PC
STATUS  equ     H'03'   ; STATUS register F3
FSR     equ     H'04'   ; INDIRECT Pointer Register
porta   equ     H'05'   ; I/O register F5
portb   equ     H'06'   ; I/O register F6
portc   equ     H'07'   ; I/O register F7
x       equ     H'09'   ; scratch
y       equ     H'0A'   ; scratch
rh      equ     H'0B'   ; result h
rl      equ     H'0C'   ; result l

mult    MACRO   bit
	btfsc   y,bit
	addwf   rh,1
	rrf     rh,1
	rrf     rl,1
	ENDM

start:  movlw   H'ff'
	tris    porta   ; PORTA is Input
	clrw
	tris    portb   ; PORTB is Output
	tris    portc   ; PORTC is Output
	movwf   portb   ; PORTB <= 00

	movlw   h'0B'
	movwf   PC      ; move to pc (jump1)

	movlw   h'F0'   ; fail 0
	movwf   portb
	goto fail

jump1:  movlw   h'05'
	addwf   PC,f   ; jump forward to jump2
	movlw   h'F1'   ; fail 1
	movwf   portb
	goto fail

jump3:  goto    jump4   ; continue
	nop

jump2:  movlw   h'04'
	subwf   PC, f   ; jump back to jump 3

	movlw   h'F2'   ; fail 2
	movwf   portb
	goto fail

jump4:  
	movlw	h'10'	; set locations 10-1F to xFF
	movwf	FSR
	movlw	h'ff'
clrlp:	movwf	INDF
	incf	FSR,F
	btfsc	FSR,4
	goto clrlp

	movlw	h'10'
	movwf	x
	movlw	h'20'
	movwf	y
	
	movlw	x
	movwf	FSR	; point FSR at x

	movf	FSR,w
	xorlw	h'89'   ; check its x (note bit 7 set always)
	btfss   STATUS,ZERO
        goto 	fail
	movf	INDF,w
	xorlw	h'10'	; check its 10
	btfss   STATUS,ZERO
        goto 	fail
	
	movlw	h'15'	; write 15 to x using INDF
	movwf	INDF
	movf	x,w	; read x
	xorlw	h'15'	; check its 15
	btfss   STATUS,ZERO
        goto 	fail

	incf	FSR,F
	movf	INDF,w
	xorlw	h'20'	; check its 20
	btfss   STATUS,ZERO
        goto 	fail

	movlw	h'00'
	movwf	FSR
	movlw	h'A5'	; paranoid !
	movf	INDF,w	; reading INDR itself should = 0
	xorlw	h'00'	; check
	btfss	STATUS,ZERO
	goto 	fail
	
	; check banking 	
	; locations 20-2F, 40-4F, 60-6F all map to 0-0F
	; locations 10-1F, 30-3F, 50-5F, 70-7F are real


	movlw	h'00'
	movwf	FSR	; set bank 0
	movlw 	h'1F'
	movwf	h'1F'

	movlw	h'20'
	movwf	FSR	; set bank 1
	movlw	h'3F'
	movwf	h'1F'

	movlw	h'40'
	movwf	FSR	; set bank 2
	movlw	h'5F'
	movwf	h'1F'

	movlw	h'60'
	movwf	FSR	; set bank 3
	movlw	h'7F'
	movwf	h'1F'
	; check

	movlw	h'00'
	movwf	FSR	; set bank 0
	movf	h'1F',w
	xorlw	h'1F'
	btfss   STATUS,ZERO
        goto 	fail

	movlw	h'20'
	movwf	FSR	; set bank 1
	movf	h'1F',w
	xorlw	h'3F'
	btfss   STATUS,ZERO
        goto 	fail

	movlw	h'40'
	movwf	FSR	; set bank 2
	movf	h'1F',w	
	xorlw	h'5F'
	btfss   STATUS,ZERO
        goto 	fail

	movlw	h'60'
	movwf	FSR	; set bank 3
	movf	h'1F',w
	xorlw	h'7F'
	btfss   STATUS,ZERO
        goto 	fail
	
	movlw	h'00'
	movwf	FSR	; set bank 0
	
	movlw	h'45'
	movwf	h'0F'
	
	movlw	h'60'
	movwf	FSR	; set bank 3
	movlw	h'54'
	movwf	h'0F'

	movlw	h'40'
	movwf	FSR	; set bank 2	
	movf	h'0f',w	; w should contain 54
	
	xorlw	h'54'
	btfsc   STATUS,ZERO
        goto test1

	movlw   h'F3'   ; fail 3
	movwf   portb
	
	goto fail

test1:	movlw	h'00'
	movwf	FSR	; set bank 0
	movlw   h'04'   ; w <= 04
	movwf   x
	decf    x,f     ; x <= 03
	decf    x,f     ; x <= 02
	decf    x,f     ; x <= 01
	decf    x,f     ; x <= 00
	decf    x,f     ; x <= FF
	movf    x,w
	xorlw   h'FF'   ; does w = ff ?
	btfss   STATUS,ZERO ; skip if clear
	goto    fail
	incf    x,f     ; x <= 00
	incf    x,f     ; x <= 01
	movf    x,w
	xorlw   h'01'   ; does w = 01
	btfss   STATUS,ZERO
	goto    fail

	; test logic

	clrf	x 	; x <= 00
	movlw   h'a5'
	iorwf	x,f 	; x <= a5
	swapf	x,f	; x <= 5a
        movlw	h'f0'
	andwf	x,f	; x <= 50
	comf	x,f 	; x <= af
	movlw	h'5a'
	xorwf	x,f	; x <= f5
	
	;check
	movfw	x
	xorlw	h'f5'
	btfsc   STATUS,ZERO
        goto test2
	movlw   h'F4'   ; fail 4
	movwf   portb
	goto fail
        
test2:	movlw	h'23'
	movwf	x	; x <= 23
	movlw	h'e1'	; w <= e1
	addwf	x,f	; x <= 04
	btfss	STATUS,CARRY 
	goto	fail	; carry should be set
	movlw	h'02'	; w <= 02
	subwf	x,f	; x <= 02
	btfss	STATUS,CARRY 
	goto	fail	; borrow should be clear

	movlw	h'34'	; w <= 34
	subwf	x,f	; x <= ce
	btfsc	STATUS,CARRY 
	goto	fail	; borrow should be set

	movf	x,w
	xorlw	h'CE'
	btfss	STATUS,ZERO
 	goto	fail	; x /= ce

test3:	movlw	h'34'	; test dc flag
	movwf	x
	movlw	h'0F'
	addwf	x,f	; x <= 43
	btfsc	STATUS,CARRY
	goto	fail	; carry should be clear
	btfss	STATUS,DC
	goto	fail	; dc should be set
	movlw	h'01'
	subwf	x,f	; x <= 42
	btfss	STATUS,CARRY
	goto	fail	; borrow should be clear
	btfss	STATUS,DC
	goto	fail	; dc borrow should be clear
	movlw	h'FF'
	subwf	x,f
	btfsc	STATUS,CARRY
	goto	fail	; borrow should be set
	btfsc  STATUS,DC
	goto	fail	; dc borrow should be set

	movf	x,w
	xorlw	h'43'	; final check
	btfss	STATUS,ZERO
 	goto	fail	; x /= 43
	movlw   h'E0'   ; ok
	movwf   portb

loop1:                  ; mult x by y
	movf    porta,W
	movwf   x
	movlw   h'23'
	movwf   y

	clrf    rh
	clrf    rl
	movf    x,w
	bcf     STATUS,CARRY
	mult    0
	mult    1
	mult    2
	mult    3
	mult    4
	mult    5
	mult    6
	mult    7

	movf    rl,w
	movwf   portb   ; on port b low result
	movf    rh,w
	movwf   portc   ; on port c high result
	goto    loop1

fail:   goto    fail 
	end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -