List p=18f4520
#include<pl8f4520. In>
CONFIG OSC = INTI067
CONFIG WDT = OFF
org 0x00
goto start
if_equals_to MACRO arg0, argl, else
MOVF argl, W
CPFSEQ argO
GOTO else
ENDM
if_less_than MACRO arg0, argl, else
MOVF argl, W
CPFSLT argO
GOTO else
ENDM
if_bigger_than MACRO argO, argl, else
MOVF argl, W
CPFSGT argO
GOTO else
ENDM
If_less_or_equal MACRO arg0, argl, UNIQUE_LABELl, else
if_bigger_than argO, argl, UNIQUE_LABELl
goto else
UNIQUE_LABELl:
ENDM
if_bigger_or_equal MACRO argO, argl, UNIQUE_LABEL2, else
if_less_than arg0, argl, UNIQUE_LABEL2
goto else
UNIQUE_LABEL2:
ENDM
elsestart MACRO else, else_end
goto else_end
else:
ENDM
elseend MACRO else_end
else_end:
ENDM
for MACRO i, n, loop_start_label, loop_end_label
CLRF i
loop_start_label:
MOVF n: W
CPFSLT i
goto loop_end_label
ENDM
endfor MACRO i, n, loop_start_label, loop_end_label
INCF i
goto loop_start_label
loop_end_label:
ENDM
—
break MACRO i, n, loop_start_label, loop_end_label
goto loop_end_label
ENDM
—
continue MACRO i, n, loop_start_label, loop_end_label
INCF i
goto loop_start_label
ENDM
—
一
while_true MACRO loop_start_labell, loop_end_labell
loop_start_labell:
ENDM
while_true_end MACRO loop_start_labell, loop_end_labell goto loopstartlabell
loop_end_labell:
ENDM
—
while_continue MACRO loop_start_labell, loopendlabell
goto loop_start_labell
ENDM
—
一
while_break MACRO loop_start_labell, loop_end_labell
goto loop_end_labell
ENDM
—
ans EQU 0x10
CBLOCK 0x20
n
m
input
ENDC
CBLOCK 0x40 i tmp findtmp a0 al ret merge_a0 merge_al ENDC
fa EQU 0x100
init: CLRF i LFSR 0, fa+1 for i, n, STARTLABELl, ENDLABELl MOVF i, W ADDLW 0x1
MOVWF POSTINC0
endfor i, n, STARTLABELl, ENDLABELl RETURN
getfa: LFSR 0, fa MOVF a0, W ADDWF FSR0L MOVLW 0x0 ADDWFC FSR0H MOVFF
INDF0, ret RETURN
setfa: LFSR 0, fa MOVF a0, W ADDWF FSR0L MOVLW 0x0 ADDWFC FSR0H MOVFF al,
INDF0 RETURN
find: while_true while_start_label2, while_end_label2 MOVFF a0, findtmp CALL getfa
ifequalsto ret, findtmp, else_label3 while_break while_start_label2, while_end_label2
elsestart else_label3, else_end_label3 elseend else_end_label3 MOVFF ret, a0while_true_end while_start_label2, while_end_label2 RETURN
merge: MOVFF merge_a0, a0 CALL find MOVFF ret, merge_a0 MOVFF merge_al, a0 CALL
find MOVFF ret, merge_al if_equals_to mergeaO, merge_al, else_label4 RETURN elsestart
else_label4, else_end_label4 elseend else_end_label4 MOVFF merge_a0, a0 MOVFF
merge_al, al CALL setfa RETURN
start: MOVLW 0x04 MOVWF n MOVLW 0x02 MOVWF m
MOVLW 0x01 MOVWF input MOVLW 0x02 MOVWF input+1 MOVLW 0x03 MOVWF
input+2 MOVLW 0x04 MOVWF input+3
CALL init LFSR 1, input for i, m, STARTLABELS, ENDLABEL5 MOVFF POSTINCI,
merge_a0 MOVFF POSTINCI, merge
二 al CALL merge
endfor i, m, STARTLABELS, ENDLABEL5 goto infinite_loop
infinite_loop: goto infinite_loop end