Code Example: REP
potatohead            
            
                Posts: 10,261            
            
                    Here is another one.  We may reverse the operands.  That has not happened yet, but the label based syntax has.  I came up with "FallThrough" as a way to get at that label ambiguity.  Feel free to post up bugs, errors, whatever.  I'll make the edits, and get a GitHUB doc started in the near future here.
If you have one you want to do, I suggest just using the same format. These are searchable in the forum easy.
REP - Repeat sequence of instructions as zero overhead loop
                            If you have one you want to do, I suggest just using the same format. These are searchable in the forum easy.
REP - Repeat sequence of instructions as zero overhead loop
CCCC 1100110 1LI DDDDDDDDD SSSSSSSSS        REP     D/#,S/#
CCCC - Condition Codes
Opcode = %1101011 
D = Value sourced from Destination COG address
S = Value sourced from Source COG address
L = Destination Address mode:  0 = Value sourced from COG Destination Register 
                     	       1 = Immediate "#", value sourced from D instruction bits
I = Source Address mode:       0 = Value sourced from COG Source Register 
                     	       1 = Immediate "#", value sourced from S instruction bits
# = D as immediate value $0-$1ff
## = works with AUGD, AUGS for large immediate values $0-$7F_FFFF****
	AUGD	#$7F_FFFF —> target D
        AUGS    #$7F_FFFF --->target S
target	REP	#D, #S
Examples:
Assembler will calculate proper values based on label:
		REP	#@.FallThrough, #6
		 shl  D, S	
		 add  D, S
.FallThrough    JMP	#elsewhere
The SHL and ADD instructions are executed 6 times, including the first time through the REP loop.  When REP is complete, it falls through to the next instruction identified by "@label" as shown with ".FallThrough" above.
Immediate Values, you write:
start		REP	#1, ##10000    'Assembler will insert AUGS at label “start”
		 shl  D, S		‘Instruction 0
		 add  D, S		‘Instruction 1, for a total of 2
		JMP	#elsewhere
PASM that results:
start		AUGS	#10000    	’23 bit immediate value —> modify REP
modify		REP	#1, #S		‘value comes from AUGS
		 shl  D, S		‘Instruction 0
		 add  D, S		‘Instruction 1, for a total of 2
		JMP	#elsewhere
The SHL and ADD instructions get executed 10000 times, including the first time through the REP loop.  When REP is complete, it falls through to the next instruction, JMP as shown above.
When computing the number of instructions to be repeated, start your count from 0.  Two instructions are shown above, for a count total of 1.  (number of instructions - 1)
Mixed Values:
		REP	#@.FallThrough, count
		 shl D, S	
		 add D, S
.FallThrough    JMP	#elsewhere
		[…]
count	long	5
The SHL and ADD instructions get executed 5 times, including the first time through the REP loop.  The COG register at label count contains the number of times REP instructions get executed.  When REP is complete, it falls through to the next instruction identified by "@label" as shown with ".FallThrough" above.
When a label is used, the assembler will calculate the correct value needed to include all the instructions BETWEEN the REP instruction and the fall through instruction, to be executed after REP has finished.
REP will terminate when a JMP instruction leaves the set of instructions included in the REP zero overhead loop:
		REP	#@.FallThrough, count
		 shl D, S			‘instruction 0
		 cmp D, S  WZ			
	   if_Z	 jmp #out			‘when taken, cancels REP entirely
		 add D, S	
.FallThrough    JMP	#elsewhere		‘executed when REP completes normally
		[…]
out		nop
		add D, S
		[…]
count	long	5
                
                            
Comments