dv336.asm

来自「基于VC33的关于铁路信号发送和处理的程序」· 汇编 代码 · 共 2,446 行 · 第 1/5 页

ASM
2,446
字号
        subrf   1.5,r2
        mpyf    r2,r1
        rnd     r1,r1
        mpyf3   r1,r1,r2
        mpyf    r0,r2
        subrf   1.5,r2
        mpyf    r2,r1
        rnd     r1,r1
        mpyf3   r1,r1,r2
        mpyf    r0,r2
        subrf   1.5,r2
        mpyf    r2,r1
        rnd     r1,r0
        mpyf    r3,r0
        rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sub7: test_ ram
test_ram:
        ldi     2000h,ar0
        ldi     0,r0
        ldi     @FFFF,r1
	lsh     16,r1
        addi    @FFFF,r1
        ldi     1900h,rc
        lsh     4,rc
        rptb    testr
        ldi     *ar0,r3
        push    r3

        sti     r1,*ar0
        ldi     *ar0,r2
	cmpi    r1,r2
        bne     teste
	sti     r0,*ar0
        ldi     *ar0,r2
	cmpi    r0,r2
        bne     teste
        pop     r3
        sti     r3,*ar0++

testr:  nop
        br      testg
teste:
        ldi     1,ar6
        br      stop
testg:
        rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;comm subG: write_frequency
wfreq:                                 ;input: r7 float; ar7 word num.
                                       ;write addr. ar1; ar4 mpyf num.
        float   ar4,r6                 ;point position:ar5
        mpyf    r6,r7                  ;work unit:ar6,r6,r5
        addf    0.5,r7                 ;ar7,ar4,ar5 may continus use
        fix     r7
        ldi     0ffh,ar6
        and3    ar6,r7,r6              ;r6=low 8 bit
        lsh     8,ar6
        and3    ar6,r7,r5              ;r5=middle 8 bit
        lsh     -8,r5
        lsh     8,ar6
        and     ar6,r7
        lsh     -16,r7                 ;r7=hifh 8 bits

        sti     r6,*ar1++
        sti     r5,*ar1++
        cmpi    2,ar7
        beq     wfreq0
        sti     r7,*ar1++
wfreq0:
        sti     ar5,*ar1++
        rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;comm subH: write_amplitude
wamp:                                  ;input: r7 float; ar7 word num.
                                       ;write addr. ar1;
    	call    sqrt
        ldf     @XNUM,r6
    	mpyf    r6,r0
    	cmpi    1,r7
        beq     wamp0
        mpyf    r6,r0
        mpyf    2,r0
wamp0:  mpyf    1.2,r0
        fix     r0
        ldi     0ffh,ar4
        and3    ar4,r0,r1              ;r1=low 8 bit
        and     0ff00h,r0              ;r0=high 8 bit
        lsh     -8,r0
        sti     r1,*ar1++
        sti     r0,*ar1++
        rets
;--------------------------------------------------------------jljs
;--------------------------------------------------------------jljs
; 1: rdata   2: jfirlp  3: jprc   4: ifftj   5: half    6: jproc
; 7: jlimit  8: jrule   9: jddata A: jfindf  B: move    C: jdata
; D: jljsf   E: jamplh  F: jljs   G: jtest   H: jcode   I: jinit
; J: jljsdc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;jljs sub1:cjljs
cjljs:  ldi     @JSDATA,ar0
        ldi     1536,rc
        ldf     0,r0
        rptb    cjljs0
cjljs0: stf     r0,*ar0++

        ldi     @JDATAS0,ar0
        ldi     8190,rc
        ldi     0,r0
        rptb    cjljs1
cjljs1: sti     r0,*ar0++
        rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;comm sub2: msamp
rdata:  ldi     @SAMNUM,BK
        ldi     @TDATA,ar2
        ldi     @CHNUM,ar0
        ldi     *ar0,r0
        subi    1,r0
        mpyi    4000h,r0
        addi    r0,ar6
        ldi     ar6,ar1

        ldi     1000h,ir0
        nop     *ar1--(ir0)%

        ldi     4094,rc
        float   *ar1++%,r0
        rptb    jsamp0
jsamp0: float   *ar1++%,r0
||      stf     r0,*ar2++
        stf     r0,*ar2
        rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;jljs sub3: jfirlp
jfirlp: ldi     @JSDATA,ar1
        ldi     @JINADDR,ar3
        ldi     1534,rc                ;2048-512-2=1534
	ldf     *ar1++,r0
        rptb    jfetc0
jfetc0: ldf     *ar1++,r0
||      stf     r0,*ar3++
        stf     r0,*ar3++

        ldi     N46,BK
        ldi     @SAR46,ar0
        ldi     *ar0,ar1
        ldi     ar1,ar7                ;57*9=513,data number=512
        ldi     6,ir0
        nop     *ar1++(ir0)%,
        sti     ar1,*ar0
        ldi     ar7,ar1
        ldi     @TDATA,ar2
        ldi     ar2,ar7
        addi    4096,ar7
        ldi     @H46,ar0
jfir0:  ldf     *ar2++,r0              ;use  ar2,ar7,ar0,ar1
        cmpi    ar2,ar7
        blt     jfir2
        stf     r0,*ar1++%
        ldi     @JPOINT,ar4  
        ldi     *ar4,r0
	addi    1,r0
        sti     r0,*ar4
	cmpi    1,r0
        beq     jfir1
        cmpi    JFNUM,r0
        ldige   0,r0
        sti     r0,*ar4
        br      jfir0

jfir1:  ldf     0,r0
        ldf     0,r2
        rpts    N46-1
	mpyf3   *ar0++(1)%,*ar1++(1)%,r0
||      addf    r0,r2
	addf    r0,r2   
        stf     r2,*ar3++
        br      jfir0

jfir2:  ldf     0,r0                 
        ldi     2047,rc                 
        rptb    jfetc3
jfetc3: stf     r0,*ar3++               ;IMAG PART CLEAR end

        ldi     @JINADDR,ar1
        addi    512,ar1
        ldi     @JSDATA,ar3
        ldi     1534,rc
	ldf     *ar1++,r0
        rptb    jfetc2
jfetc2: ldf     *ar1++,r0
||      stf     r0,*ar3++
        stf     r0,*ar3
        rets
;SUB12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;jljs sub4: jrcout
jrcout: ldi     @MCTL,ar3              ;INIT MAIN BUS
        ldi     MBUS3,ar1
        sti     ar1,*ar3
        ldi     @MCTLS,ar0
        sti     ar1,*ar0

        ldi     @PORT232,ar1
        addi    1,ar1
        ldi     35,r0
        sti     r0,*ar1++              ;1
        ldi     @RAX,ar0
        ldi     *ar0,r0
        sti     r0,*ar1++              ;2

        ldi     @SMODE,ar0
        ldi     *ar0,r1
        ldi     @GMODE,ar0
        ldi     *ar0,r0
        lsh     4,r0
        or      r1,r0
        sti     r0,*ar1++              ;3

        ldi     @JSORT,ar0
        ldi     *ar0,r6
        sti     r6,*ar1++              ;4

        ldi     @JLFLAG,ar0
        ldi     *ar0,r0
        sti     r0,*ar1++              ;5    F0

        ldi     0ffh,r1
        ldi     0ff00h,r2
        ldi     @JSUM,ar0              ;6-7
        ldf     *ar0,r0
        mpyf    10.0,r0
        addf    0.5,r0
        fix     r0
        and3    r1,r0,r4
        and3    r2,r0,r5
        lsh     -8,r5
        sti     r4,*ar1++
        sti     r5,*ar1++
        ;----------------------------------
        ldi     @JCYSUMZ,ar3
        ldi     *ar3,r1
        lsh     -1,r1
        ldi     0ffh,r4
        ldi     0ff00h,r5
	and3    r4,r1,r6
	and     r5,r1
	lsh     -8,r1
        sti     r6,*ar1++              ;8
        sti     r1,*ar1++              ;9
	
        ldi     ar2,ar0
        ldi     *ar0++,r1
        sti     r1,*ar1++              ;10  first code "1" or "0"
jtemp1: ldi     11,rc                  ;11-34  12*2=24
        rptb    jrcout0
        ldi     *ar0++(2),r1
	and3    r4,r1,r6               ;r6=low 8 bit
	and     r5,r1                  ;r1=high 8 bit
	lsh     -8,r1
        sti     r6,*ar1++              
jrcout0:sti     r1,*ar1++
;--------------------------------------
        ldi     @CHNUM,ar0
        ldi     *ar0,r1
        sti     r1,*ar1++              ;35

        ldi     @PORT232,ar1
        ldi     55h,r0
        sti     r0,*ar1

        ldi     @MCTL,ar3
        ldi     MBUS1,ar1
        sti     ar1,*ar3
        ldi     @MCTLS,ar3
        sti     ar1,*ar3
        rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;subA: save data of 25,50 and 75hz
move:   ldi     @JINADDR,ar0           ;move fft data from 20 to 171
        ldi     @SAVE,ar1
	addi    20,ar0
        ldi     ar0,ar2
	addi    20,ar1
        ldi     ar1,ar3
        ldi     151,rc
	rptb    move1
	ldf     *ar0++,r1
move1:  stf     r1,*ar1++
        addi    JDLENTH,ar2
	addi    100h,ar3
        ldi     151,rc
	rptb    move2
	ldf     *ar2++,r1
move2:  stf     r1,*ar3++
	rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sub9: find f0
jfindf:
        ldi     J_S1,r4
        ldi     J_S2,ar7
        subi    r4,ar7
        ldi     @PWADDR,ar0
        ldi     J_R5,r5
        ldi     @JRESULT,ar2
        ldi     ar2,ar6
        addi    2,ar6                 
	ldf     0,r2                  
jcomp0  ldi     ar0,ar5               ;ar0 is pwaddr,input data first addr.
        ldi     ar7,rc                ;use init value: ar2 ar0 ar7 
	subi    1,rc                  ;ar2 is result addr.
	ldf     *ar5++,r0             ;ar7 data number
        ldi     ar5,r1                ;ar6 result end addr.
	rptb    jcomp1                ;ar5 save ar0
	cmpf    *ar5++,r0             
	ldflt   *-ar5(1),r0           ;r1 save active addr.
jcomp1  ldilt   ar5,r1
	subi    1,r1
        ldi     r1,ar5
	subi    r5,ar5
        ldi     r5,rc
	lsh     1,rc                  
	rptb    jcomp2
jcomp2: stf     r2,*ar5++
	subi    ar0,r1               
	addi    r4,r1                  ;r4=first f
        lsh     -1,r1
	sti     r1,*ar2++
	cmpi    ar6,ar2
	blt     jcomp0
	rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sub2: jprc
jprc:   call    ifftj
        call    half
        call    jproc
        call    jlimit
        call    jrule
        call    jddata
        call    jdata
        call    jamplh
        call    jljs
        rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sub3: ifftj
ifftj:
        ldi     JS25,r0
        ldi     @JINADDR,ar1
        ldi     JDLENTH,rc
	ldf     0,r2
	lsh     1,rc
	subi    1,rc
	rptb    ift0
ift0:   stf     r2,*ar1++

        ldi     @SAVE,ar0
        ldi     @JINADDR,ar1
        ldi     JDLENTH,r1
	addi3   r1,ar1,ar2
	subi    r0,ar2
	addi    r0,ar0
	addi    r0,ar1
	
        ldi     25,r6  
        ldi     r6,rc
	rptb    ift1
	ldf     *ar0++,r1
	stf     r1,*ar1++
ift1:   stf     r1,*ar2--

        ldi     @SAVE,ar0
        ldi     @JINADDR,ar1
	addi    r0,ar0
	addi    100h,ar0
        ldi     JDLENTH,r1
	addi    r1,ar1
	addi3   r1,ar1,ar2
	subi    r0,ar2
	addi    r0,ar1
        ldi     r6,rc
	rptb    ift2
	ldf     *ar0++,r1
	negf    r1,r2
	stf     r1,*ar1++
ift2:   stf     r2,*ar2--

        ldi     @INADDRD,ar0
        ldi     @JINADDR,r0     
	sti     r0,*ar0
        ldi     @LOGFFT,ar0           ;ar0 save 09--512,0b--2048
        ldi     JLOGNUM,r0
	sti     r0,*ar0

	call    ifft
	rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sub4: half
half:
        ldi     @JINADDR,ar1
        ldi     2047,rc                 
	ldf     0,r3
        rptb    half0
	ldf     *ar1++,r2
half0:  addf    r2,r3
        mpyf    @XNUM,r3
	
        ldi     @JINADDR,ar1
        ldi     JDLENTH,rc
	subi    1,rc
        rptb    half1
	ldf     *ar1,r2
        subf    r3,r2                  ;r2=r2+m(i)
        cmpf    0,r2
        ldflt   0,r2
half1:  stf     r2,*ar1++
        rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sub5: jproc
jproc:
        ldi     @JINADDR,ar1
        ldi     @JINADDR,ar0
        ldi     0,r6
jproc0:
        ldf     *ar1++,r0
        ldi     44,rc
        rptb    jproc1
jproc1: addf    *ar1++,r0
        mpyf    JX45,r0
        stf     r0,*ar0++
        ldi     ar0,ar1
        addi    1,r6
        cmpi    2003,r6
        blt     jproc0

        ldi     @JINADDR,ar1
        ldi     @JINADDR,ar0
        ldi     0,r6
jproc2:
        ldf     *ar1++,r0
        ldi     44,rc
        rptb    jproc3
jproc3: addf    *ar1++,r0
        mpyf    JX45,r0
        stf     r0,*ar0++
        ldi     ar0,ar1
        addi    1,r6
        cmpi    1958,r6
        blt     jproc2
        rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sub6: jlimit
jlimit:
        ldi     @JINADDR,ar1
        ldi     1957,rc                 
        ldf     0,r4
        rptb    jlimi0
jlimi0: addf    *ar1++,r4
        mpyf    @XNUM,r4

        ldf     0,r5
        ldf     0,r0
        ldi     @JINADDR,ar1
	ldf     *ar1++,r2
        ldi     1957,rc
        rptb    jlimi1
	cmpf    r4,r2
        ble     jlimi1
	addf    r2,r5
        addf    1.0,r0
jlimi1: ldf     *ar1++,r2
	call    invf
	mpyf    r0,r5
        subf3   r4,r5,r0
        mpyf    JCIFF,r0
        addf    r0,r4
        ldi     @JLIANG,ar0
        stf     r4,*ar0
        rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sub7: jrule
jrule:
        ldi     @JDATAS0,ar1
        ldi     @JDATAD,ar0
        ldi     *ar1++,r0
        ldi     5117,rc                ;1024X7=7168, 7168-2048-1=5119
        rptb    jrule0
jrule0: ldi     *ar1++,r0
||      sti     r0,*ar0++
        sti     r0,*ar0++

        ldi     @JLIANG,ar1
        ldf     *ar1,r7

        ldi     @JINADDR,ar2           ;5120+1958=7078
        ldi     1957,rc
        rptb    jrule1
        ldi     0,r0
        cmpf    *ar2++,r7
        ldile   1,r0
jrule1: sti     r0,*ar0++

        ldi     @JDATAS0,ar1
        ldi     @JDATAD,ar0
        addi    512,ar0
        ldi     *ar0++,r0

⌨️ 快捷键说明

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