<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.mcselec.com/bavr/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://wiki.mcselec.com/bavr/index.php?action=history&amp;feed=atom&amp;title=STCHECK%2Fde</id>
		<title>STCHECK/de - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.mcselec.com/bavr/index.php?action=history&amp;feed=atom&amp;title=STCHECK%2Fde"/>
		<link rel="alternate" type="text/html" href="http://wiki.mcselec.com/bavr/index.php?title=STCHECK/de&amp;action=history"/>
		<updated>2026-04-22T16:06:17Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.18.6</generator>

	<entry>
		<id>http://wiki.mcselec.com/bavr/index.php?title=STCHECK/de&amp;diff=2739&amp;oldid=prev</id>
		<title>Admin: 1 revision</title>
		<link rel="alternate" type="text/html" href="http://wiki.mcselec.com/bavr/index.php?title=STCHECK/de&amp;diff=2739&amp;oldid=prev"/>
				<updated>2013-02-15T19:16:15Z</updated>
		
		<summary type="html">&lt;p&gt;1 revision&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
		&lt;tr valign='top'&gt;
		&lt;td colspan='1' style=&quot;background-color: white; color:black;&quot;&gt;← Older revision&lt;/td&gt;
		&lt;td colspan='1' style=&quot;background-color: white; color:black;&quot;&gt;Revision as of 19:16, 15 February 2013&lt;/td&gt;
		&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://wiki.mcselec.com/bavr/index.php?title=STCHECK/de&amp;diff=2738&amp;oldid=prev</id>
		<title>Admin: Created page with &quot;= &lt;span class=&quot;f_Header&quot;&gt;Action&lt;/span&gt; =  Calls a routine to check for various stack overflows. This routine is intended for debug purposes.  &lt;span style=&quot;font-family: Arial;&quot;...&quot;</title>
		<link rel="alternate" type="text/html" href="http://wiki.mcselec.com/bavr/index.php?title=STCHECK/de&amp;diff=2738&amp;oldid=prev"/>
				<updated>2013-02-12T17:36:21Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;= &amp;lt;span class=&amp;quot;f_Header&amp;quot;&amp;gt;Action&amp;lt;/span&amp;gt; =  Calls a routine to check for various stack overflows. This routine is intended for debug purposes.  &amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== (**COPIED FROM ENGLISH PAGE**) === &amp;lt;span class=&amp;quot;f_Header&amp;quot;&amp;gt;Action&amp;lt;/span&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Calls a routine to check for various stack overflows. This routine is intended for debug purposes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;span class=&amp;quot;f_Header&amp;quot;&amp;gt;Syntax&amp;lt;/span&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;f_Syntax&amp;quot;&amp;gt;STCHECK&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;span class=&amp;quot;f_Header&amp;quot;&amp;gt;Remarks&amp;lt;/span&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
The different stack spaces used by BASCOM-AVR lead to lots of questions about them.&lt;br /&gt;
&lt;br /&gt;
The STCHECK routine can help to determine if the stack size are trashed by your program. The program STACK.BAS is used to explain the different settings.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that STCHECK should be removed form your final program. That is once you tested your program and found out is works fine, you can remove the call to STCHECK since it costs time and code space.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The settings used are&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
HW stack 8&lt;br /&gt;
&lt;br /&gt;
Soft stack 2&lt;br /&gt;
&lt;br /&gt;
Frame size 14&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Below is a part of the memory of the 90S2313 used for the example:&lt;br /&gt;
&lt;br /&gt;
C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF&lt;br /&gt;
&lt;br /&gt;
D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF&lt;br /&gt;
&lt;br /&gt;
FR FR FR FR FR FR FR FR&lt;br /&gt;
&lt;br /&gt;
FR FR FR FR FR FR YY YY SP SP SP SP SP SP SP SP&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since the last memory in SRAM is DF, the hardware stack is occupied by D8-DF(8 bytes)&lt;br /&gt;
&lt;br /&gt;
When a call is made or a push is used the data is saved at the position the hardware stack pointer is pointing to. After this the stack pointer is decreased.&lt;br /&gt;
&lt;br /&gt;
A call uses 2 bytes so SP will be SP-2. (DF-2) =DD&lt;br /&gt;
&lt;br /&gt;
When 8 bytes are stored the SP will point to D7. Another call or push will thus destroy memory position D7 which is occupied by the soft stack.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The soft stack begins directly after the hardware stack and is also growing down.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Y pointer(r28+r29) is used to point to this data.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since the Y pointer is decreased first and then the data is saved, the pointer must point at start up to a position higher. That is D8, the end of the hardware space.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
St -y,r24 will point to D8-1=D7 and will store R24 at location D7.&lt;br /&gt;
&lt;br /&gt;
Since 2 bytes were allocated in this example we use D7 and D6 to store the data.&lt;br /&gt;
&lt;br /&gt;
When the pointer is at D6 and another St -y,r24 is used, it will write to position D5 which is the end of the frame space that is used as temporarily memory.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The frame starts at C8 and ends at D5. Writing beyond will overwrite the soft stack.&lt;br /&gt;
&lt;br /&gt;
And when there is no soft stack needed, it will overwrite the hardware stack space.&lt;br /&gt;
&lt;br /&gt;
The map above shows FR(frame), YY(soft stack data) and SP(hardware stack space)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
How to determine the right values?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The stack check routine can be used to determine if there is an overflow.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It will check&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
-if SP is below it's size. In this case below D8.&lt;br /&gt;
&lt;br /&gt;
-if YY is below it’s size in this case when it is D5&lt;br /&gt;
&lt;br /&gt;
-if the frame is above its size in this case D6&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When is YY(soft stack) used? When you use a LOCAL variable inside a SUB or function. Each local variable will use 2 bytes.&lt;br /&gt;
&lt;br /&gt;
When you pass variables to user Subroutines or functions it uses 2 bytes for each parameter.&lt;br /&gt;
&lt;br /&gt;
call mysub(x,y) will use 2 * 2 = 4 bytes.&lt;br /&gt;
&lt;br /&gt;
local z as byte ' will use another 2 bytes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This space is freed when the routine ends.&lt;br /&gt;
&lt;br /&gt;
But when you call another sub inside the sub, you need more space.&lt;br /&gt;
&lt;br /&gt;
sub mysub(x as byte,y as byte)&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp; &amp;amp;nbsp;call testsub(r as byte) ' we must add another 2 bytes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When you use empty(no params) call like&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
call mytest() , No space is used.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When do you need frame space?&lt;br /&gt;
&lt;br /&gt;
When ever you use a num&amp;lt;&amp;gt;string conversion routine like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Print b (where b is a byte variable)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bytes will use 4 bytes max (123+0)&lt;br /&gt;
&lt;br /&gt;
Integer will use 7 bytes max (-12345+0)c&lt;br /&gt;
&lt;br /&gt;
Longs will use 16 bytes max&lt;br /&gt;
&lt;br /&gt;
And the single will use 24 bytes max&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When you add strings and use the original the value must be remembered by the compiler.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Consider this&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
s$ = &amp;quot;abcd&amp;quot; + s$&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here you give s$ a new value. But you append the original value so the original value must be remembered until the operation has completed. This copy is stored in the frame too.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So when string s$ was dimmed with a length of 20, you need a frame space of 20+1(null byte)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When you pass a variable by VALUE (BYVAL) then you actually pass a copy of the variable.&lt;br /&gt;
&lt;br /&gt;
When you pass a byte, 1 byte of frame space is used, a long will take 4 bytes.&lt;br /&gt;
&lt;br /&gt;
When you use a LOCAL LONG, you also need 4 bytes of frame space to store the local long.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The frame space is reused and so is the soft stack space and hardware stack space.&lt;br /&gt;
&lt;br /&gt;
So the hard part is to determine the right sizes!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The stack check routine must be called inside the deepest nested sub or function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gosub test&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
test:&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;gosub test1&lt;br /&gt;
&lt;br /&gt;
return&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
test1:&lt;br /&gt;
&lt;br /&gt;
' this is the deepest level so check the stack here&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;stcheck&lt;br /&gt;
&lt;br /&gt;
return&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stcheck will use 1 variable named ERROR. You must dimension it yourself.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dim Error As Byte&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Error will be set to&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1: if hardware stack grows down into the soft stack space&lt;br /&gt;
&lt;br /&gt;
2: if the soft stack space grows down into the frame space&lt;br /&gt;
&lt;br /&gt;
3: if the frame space grows up into the soft stack space.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The last 2 errors are not necessarily bad when you consider that when the soft stack is not used for passing data, it may be used by the frame space to store data. Confusing right.?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Notice.jpg|left|Notice.jpg]]&amp;amp;nbsp;It is advised to use the simpler DBG/$DBG method. This requires that you can simulate your program.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;span class=&amp;quot;f_Header&amp;quot;&amp;gt;ASM&amp;lt;/span&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Routines called by STCHECK&amp;amp;nbsp;:&lt;br /&gt;
&lt;br /&gt;
_StackCheck&amp;amp;nbsp;: uses R24 and R25 but these are saved and restored.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Because the call uses 2 bytes of hardware stack space and the saving of R24 and R25 also costs 2 bytes, it uses 4 more bytes of hardware stack space than your final program would do that f course does not need to use STCHECK.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;span class=&amp;quot;f_Header&amp;quot;&amp;gt;Example&amp;lt;/span&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;source lang=&amp;quot;bascomavr&amp;quot;&amp;gt;&lt;br /&gt;
'-----------------------------------------------------------------------------------------&lt;br /&gt;
'name : stack.bas&lt;br /&gt;
'copyright : (c) 1995-2005, MCS Electronics&lt;br /&gt;
'purpose : shows how to check for the stack sizes&lt;br /&gt;
'micro : Mega48&lt;br /&gt;
'suited for demo : yes&lt;br /&gt;
'commercial addon needed : no&lt;br /&gt;
'-----------------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
$regfile = &amp;quot;m48def.dat&amp;quot; ' specify the used micro&lt;br /&gt;
$crystal = 4000000 ' used crystal frequency&lt;br /&gt;
$baud = 19200 ' use baud rate&lt;br /&gt;
$hwstack = 8 ' default use 32 for the hardware stack&lt;br /&gt;
$swstack = 2 ' default use 10 for the SW stack&lt;br /&gt;
$framesize = 14 ' default use 40 for the frame space&lt;br /&gt;
'settings must be :&lt;br /&gt;
 &lt;br /&gt;
'HW Stack : 8&lt;br /&gt;
'Soft Stack : 2&lt;br /&gt;
'Frame size : 14&lt;br /&gt;
 &lt;br /&gt;
'note that the called routine (_STACKCHECK) will use 4 bytes&lt;br /&gt;
'ofhardware stack space&lt;br /&gt;
'So when your program works, you may subtract the 4 bytes of the needed hardware stack size&lt;br /&gt;
'in your final program that does not include the STCHECK&lt;br /&gt;
 &lt;br /&gt;
'testmode =0 will work&lt;br /&gt;
'testmode =1 will use too much hardware stack&lt;br /&gt;
'testmode =2 will use too much soft stack space&lt;br /&gt;
'testmode =3 will use too much frame space&lt;br /&gt;
Const Testmode = 0&lt;br /&gt;
'compile and test the program with testmode from 0-3&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
'you need to dim the ERROR byte !!&lt;br /&gt;
Dim Error As Byte&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
#if Testmode = 2&lt;br /&gt;
Declare Sub Pass(z As Long , Byval K As Long)&lt;br /&gt;
#else&lt;br /&gt;
Declare Sub Pass()&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
Dim I As Long&lt;br /&gt;
I = 2&lt;br /&gt;
Print I&lt;br /&gt;
'call the sub in your code at the deepest level&lt;br /&gt;
'normally within a function or sub&lt;br /&gt;
 &lt;br /&gt;
#if Testmode = 2&lt;br /&gt;
Call Pass(i , 1)&lt;br /&gt;
#else&lt;br /&gt;
Call Pass()&lt;br /&gt;
#endif&lt;br /&gt;
End&lt;br /&gt;
 &lt;br /&gt;
#if Testmode = 2&lt;br /&gt;
Sub Pass(z As Long , Byval K As Long)&lt;br /&gt;
#else&lt;br /&gt;
Sub Pass()&lt;br /&gt;
#endif&lt;br /&gt;
 #if Testmode = 3&lt;br /&gt;
 Local S As String * 13&lt;br /&gt;
 #else&lt;br /&gt;
 Local S As String * 8&lt;br /&gt;
 #endif&lt;br /&gt;
 &lt;br /&gt;
 Print I&lt;br /&gt;
 Gosub Test&lt;br /&gt;
End Sub&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
Test:&lt;br /&gt;
#if Testmode = 1&lt;br /&gt;
push r0 ; eat some hardware stack space&lt;br /&gt;
push r1&lt;br /&gt;
push r2&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
' *** here we call the routine ***&lt;br /&gt;
Stcheck&lt;br /&gt;
' *** when error &amp;lt;&amp;gt;0 then there is a problem ***&lt;br /&gt;
#if Testmode = 1&lt;br /&gt;
pop r2&lt;br /&gt;
pop r1&lt;br /&gt;
pop r0&lt;br /&gt;
#endif&lt;br /&gt;
Return&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br/&amp;gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
[[Category:BASCOM Language Reference/de]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	</feed>