000001 0000                  ;	Main program
000002 0000                  ;
000003 0000                  ;	1424 min  1444 max  5 stack
000004 0000                  ;
000005 0000                  MAIN:
000006 0000 BD002A           	JSR	SIMPLE
000007 0003 BD002F           	JSR	FWDBRA
000008 0006 BD0044           	JSR	BCKBRA
000009 0009 BD005A           	JSR	SIMPLOOP
000010 000C BD0061           	JSR	BACKLOOP
000011 000F BD006A           	JSR	COMPLEX
000012 0012 BD0077           	JSR	INDJMP
000013 0015 BD007D           	JSR	INSTIME
000014 0018 BD0081           	JSR	ILLEGAL
000015 001B BD0085           	JSR	OUTLOOP
000016 001E BD0097           	JSR	TWOLOOP
000017 0021 BD00A5           	JSR	VARLOOP
000018 0024 CE002A           	LDX	#SIMPLE
000019 0027 AD00             	JSR	0,X	; Use 0 cycles 0 stack
000020 0029 39               	RTS

000021 002A                  ;	Simple subroutine
000022 002A                  ;
000023 002A                  ;	Contains no conditional branches.
000024 002A                  ;
000025 002A                  ;	11 min  11 max  0 stack
000026 002A                  ;
000027 002A                  SIMPLE:
000028 002A 40               	NEGA
000029 002B 48               	ASLA
000030 002C 8B05             	ADDA	#5
000031 002E 39               	RTS

000032 002F                  ;	Forward branches
000033 002F                  ;
000034 002F                  ;	Contains only forward branches.
000035 002F                  ;
000036 002F                  ;	16 min  26 max  0 stack
000037 002F                  ;
000038 002F                  FWDBRA:
000039 002F 47               	ASRA
000040 0030 2406             	BCC	FWD010
000041 0032 CE002A           	LDX	#SIMPLE
000042 0035 47               	ASRA
000043 0036 2405             	BCC	FWD020
000044 0038                  FWD010:
000045 0038 CE002F           	LDX	#FWDBRA
000046 003B 2006             	BRA	FWDRET
000047 003D                  FWD020:
000048 003D 47               	ASRA
000049 003E 2403             	BCC	FWDRET
000050 0040 CE0044           	LDX	#BCKBRA
000051 0043                  FWDRET:
000052 0043 39               	RTS

000053 0044                  ;	Backward normal branches
000054 0044                  ;
000055 0044                  ;	Contains only backward normal branches.
000056 0044                  ;
000057 0044                  ;	16 min  26 max  0 stack
000058 0044                  ;
000059 0044                  BCKBRA:
000060 0044 47               	ASRA
000061 0045 2407             	BCC	BCK010
000062 0047 CE002A           	LDX	#SIMPLE
000063 004A 47               	ASRA
000064 004B 2406             	BCC	BCK020
000065 004D                  BCKRET:
000066 004D 39               	RTS
000067 004E                  BCK010:
000068 004E CE002F           	LDX	#FWDBRA
000069 0051 20FA             	BRA	BCKRET
000070 0053                  BCK020:
000071 0053 47               	ASRA
000072 0054 24F7             	BCC	BCKRET
000073 0056 CE0044           	LDX	#BCKBRA
000074 0059 39               	RTS

000075 005A                  ;	Simple loop
000076 005A                  ;
000077 005A                  ;	A simple loop.
000078 005A                  ;
000079 005A                  ;	42 min  42 max  0 stack
000080 005A                  ;
000081 005A                  SIMPLOOP:
000082 005A 8605             	LDAA	#5
000083 005C                  SIMP010:
000084 005C 01               	NOP
000085 005D 4A               	DECA
000086 005E 26FC             	BNE	SIMP010		; TAKE 4
000087 0060 39               	RTS

000088 0061                  ;	Loop with backwards branch
000089 0061                  ;
000090 0061                  ;	A simple loop with a normal backwards
000091 0061                  ;	branch that terminates in the middle.
000092 0061                  ;
000093 0061                  ;	62 min  62 max  0 stack
000094 0061                  ;
000095 0061                  BACKLOOP:
000096 0061 8606             	LDAA	#6
000097 0063                  BACK010:
000098 0063 4A               	DECA
000099 0064 2703             	BEQ	BACKRET
000100 0066 01               	NOP
000101 0067 20FA             	BRA	BACK010
000102 0069                  BACKRET:
000103 0069 39               	RTS

000104 006A                  ;	Complex loop
000105 006A                  ;
000106 006A                  ;	A loop that will trigger the
000107 006A                  ;	complex loop message.
000108 006A                  ;
000109 006A                  ;	43 min  43 max  2 stack
000110 006A                  ;
000111 006A                  COMPLEX:
000112 006A 8605             	LDAA	#5
000113 006C                  COMPL1:
000114 006C 4A               	DECA
000115 006D 2704             	BEQ	COMPX1	; FALL 2
000116 006F 4A               	DECA
000117 0070 26FA             	BNE	COMPL1	; TAKE 2
000118 0072 39               	RTS
000119 0073                  COMPX1:
000120 0073 BD0076           	JSR	COMPX2
000121 0076                  COMPX2:
000122 0076 39               	RTS

000123 0077                  ;	Indirect jump test
000124 0077                  ;
000125 0077                  ;	Indirect jump that goes some place
000126 0077                  ;	and one that returns.
000127 0077                  ;
000128 0077                  ;	11 min  11 max  0 stack
000129 0077                  ;
000130 0077                  INDJMP:
000131 0077 6E00             	JMP	0,X	; Destination JMPRET
000132 0079 01               	NOP
000133 007A                  JMPRET:
000134 007A 38               	PULX		; Pull return address
000135 007B 6E00             	JMP	0,X	; Use indirect jump as RTS

000136 007D                  ;	Instructions that can not be timed
000137 007D                  ;
000138 007D                  ;	These instructions can not be timed.
000139 007D                  ;
000140 007D                  ;	8 min  8 max  0 stack
000141 007D                  ;
000142 007D                  INSTIME:
000143 007D 2701             	BEQ	INST010	; May be skipped
000144 007F CF               	STOP		; Stop instruction
000145 0080                  INST010:
000146 0080 39               	RTS

000147 0081                  ;	Illegal instructions
000148 0081                  ;
000149 0081                  ;	These are illegal in the demo.
000150 0081                  ;
000151 0081                  ;	8 min  8 max  0 stack
000152 0081                  ;
000153 0081                  ILLEGAL:
000154 0081 2701             	BEQ	ILL010	; May be skipped
000155 0083 3D               	MUL
000156 0084                  ILL010:
000157 0084 39               	RTS

000158 0085                  ;	Outer loop
000159 0085                  ;
000160 0085                  ;	The output loop of nested loops.
000161 0085                  ;
000162 0085                  ;	482 min  482 max  3 stack
000163 0085                  ;
000164 0085                  OUTLOOP:
000165 0085 8605             	LDAA	#5
000166 0087                  OUT010:
000167 0087 36               	PSHA
000168 0088 BD0090           	JSR	INLOOP
000169 008B 32               	PULA
000170 008C 4A               	DECA
000171 008D 26F8             	BNE	OUT010		; TAKE 4
000172 008F 39               	RTS

000173 0090                  ;	Inner loop
000174 0090                  ;
000175 0090                  ;	The inner loop of nested loops.
000176 0090                  ;
000177 0090                  ;	77 min  77 max  0 stack
000178 0090                  ;
000179 0090                  INLOOP:
000180 0090 860A             	LDAA	#10
000181 0092                  IN010:
000182 0092 01               	NOP
000183 0093 4A               	DECA
000184 0094 26FC             	BNE	IN010		; TAKE 9
000185 0096 39               	RTS

000186 0097                  ;	Two loops
000187 0097                  ;
000188 0097                  ;	Two loops in one.
000189 0097                  ;
000190 0097                  ;	436 min  436 max  0 stack
000191 0097                  ;
000192 0097                  TWOLOOP:
000193 0097 CE0005           	LDX	#5
000194 009A                  TWO010:
000195 009A 01               	NOP
000196 009B 860A             	LDAA	#10
000197 009D                  TWO020:
000198 009D 01               	NOP
000199 009E 4A               	DECA
000200 009F 26FC             	BNE	TWO020		; TAKE 49
000201 00A1                  ;
000202 00A1 09               	DEX
000203 00A2 26F6             	BNE	TWO010		; TAKE 4
000204 00A4                  ;
000205 00A4 39               	RTS

000206 00A5                  ;	Variable loops
000207 00A5                  ;
000208 00A5                  ;	Loops different number of times
000209 00A5                  ;
000210 00A5                  ;	211 min  211 max  2 stack
000211 00A5                  ;
000212 00A5                  VARLOOP:
000213 00A5 8605             	LDAA	#5
000214 00A7 BD00B4           	JSR	DIFSUB		; 30 cycles
000215 00AA 860A             	LDAA	#10
000216 00AC BD00B4           	JSR	DIFSUB		; 55 cycles
000217 00AF 8614             	LDAA	#20
000218 00B1 7E00B4           	JMP	DIFSUB
000219 00B4                  ;
000220 00B4                  DIFSUB:
000221 00B4 4A               	DECA
000222 00B5 26FD             	BNE	DIFSUB		; TAKE 19
000223 00B7 39               	RTS

000224 00B8                  ;	Stack Imbalance
000225 00B8                  ;
000226 00B8                  ;	Stack may become imbalanced
000227 00B8                  ;
000228 00B8                  ;	10 min  13 max  1 stack
000229 00B8                  ;
000230 00B8                  STKIMB:
000231 00B8 01               	NOP
000232 00B9 2601             	BNE	STK010
000233 00BB 36               	PSHA
000234 00BC                  STK010:
000235 00BC 39               	RTS
000236 00BD                  	.END

BACK010 =0063  
BACKLOOP=0061  
BACKRET =0069  
BCK010  =004E  
BCK020  =0053  
BCKBRA  =0044  
BCKRET  =004D  
COMPL1  =006C  
COMPLEX =006A  
COMPX1  =0073  
COMPX2  =0076  
DIFSUB  =00B4  
FWD010  =0038  
FWD020  =003D  
FWDBRA  =002F  
FWDRET  =0043  
ILL010  =0084  
ILLEGAL =0081  
IN010   =0092  
INDJMP  =0077  
INLOOP  =0090  
INST010 =0080  
INSTIME =007D  
JMPRET  =007A  
MAIN    =0000  
OUT010  =0087  
OUTLOOP =0085  
SIMP010 =005C  
SIMPLE  =002A  
SIMPLOOP=005A  
STK010  =00BC  
STKIMB  =00B8  
TWO010  =009A  
TWO020  =009D  
TWOLOOP =0097  
VARLOOP =00A5  
