<?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=ADR</id>
		<title>ADR - 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=ADR"/>
		<link rel="alternate" type="text/html" href="http://wiki.mcselec.com/bavr/index.php?title=ADR&amp;action=history"/>
		<updated>2026-04-29T21:03:29Z</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=ADR&amp;diff=367&amp;oldid=prev</id>
		<title>Admin: Created page with &quot;= &lt;span class=&quot;f_Header&quot;&gt;Action&lt;/span&gt; =  Create label address.  &lt;span style=&quot;font-family: Arial;&quot;&gt;&amp;nbsp;&lt;/span&gt;  &lt;span style=&quot;font-family: Arial;&quot;&gt;&amp;nbsp;&lt;/span&gt;  = &lt;span clas...&quot;</title>
		<link rel="alternate" type="text/html" href="http://wiki.mcselec.com/bavr/index.php?title=ADR&amp;diff=367&amp;oldid=prev"/>
				<updated>2013-02-06T22:32:10Z</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; =  Create label address.  &amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;  &amp;lt;span style=&amp;quot;font-family: Arial;&amp;quot;&amp;gt; &amp;lt;/span&amp;gt;  = &amp;lt;span clas...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= &amp;lt;span class=&amp;quot;f_Header&amp;quot;&amp;gt;Action&amp;lt;/span&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
Create label address.&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;ADR&amp;amp;nbsp;&amp;lt;/span&amp;gt;&amp;amp;nbsp;label&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span class=&amp;quot;f_Syntax&amp;quot;&amp;gt;ADR2&amp;amp;nbsp;&amp;lt;/span&amp;gt;&amp;amp;nbsp;label&lt;br /&gt;
&lt;br /&gt;
&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;
&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;
&amp;lt;div style=&amp;quot;padding: 0px; margin: 0px 0px 0px 4px;&amp;quot;&amp;gt;&lt;br /&gt;
{| width=&amp;quot;539&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 2px solid rgb(0, 0, 0); border-spacing: 0px; border-collapse: collapse;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;vertical-align: top;&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;10%&amp;quot; style=&amp;quot;width: 50px; border: 1px solid rgb(0, 0, 0);&amp;quot; | &lt;br /&gt;
label&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; width=&amp;quot;100%&amp;quot; style=&amp;quot;width: 480px; border: 1px solid rgb(0, 0, 0);&amp;quot; | &lt;br /&gt;
The name of a label.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;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 AVR uses WORD addresses. ADR will create the word address. To find a byte in memory, you need to multiply by 2. For this purpose ADR2 is available. It will create the address of the label multiplied by 2.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
Using ADR2 you can use tables. The sample program demonstrates this together with some more advanced ASM code.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
The sample includes ADR2.LIB. This lib contains a special version of &amp;amp;nbsp;_MoveConst2String .&lt;br /&gt;
&lt;br /&gt;
The normal routine in MCS.LIB will stop printing once a null byte (zero) is encountered that indicates the end of a string.&lt;br /&gt;
&lt;br /&gt;
But for the sample program, we may not change the address, so the address is restored when the null byte is found.&lt;br /&gt;
&lt;br /&gt;
&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;
= &amp;lt;span class=&amp;quot;f_Header&amp;quot;&amp;gt;See Also&amp;lt;/span&amp;gt; =&lt;br /&gt;
&lt;br /&gt;
NONE&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&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;
' This is an example of how to create an interactive menu system supporting&lt;br /&gt;
' sub-menus and support routines using the !ADR and !ADR2 statements&lt;br /&gt;
'===============================================================================&lt;br /&gt;
 &lt;br /&gt;
$regfile = &amp;quot;M644def.dat&amp;quot;&lt;br /&gt;
$crystal = 8000000&lt;br /&gt;
 &lt;br /&gt;
$hwstack = 64 ' specify the hardware stack depth&lt;br /&gt;
$swstack = 64 ' specify the software stack depth&lt;br /&gt;
$framesize = 64 ' specify the framesize (local stack depth)&lt;br /&gt;
 &lt;br /&gt;
$lib &amp;quot;adr2.lib&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
'-------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
Dim Menupointer As Word&lt;br /&gt;
Dim Actionpointer As Word&lt;br /&gt;
 &lt;br /&gt;
Dim Entries As Byte&lt;br /&gt;
Dim Dummy As Byte&lt;br /&gt;
Dim Message As String * 32&lt;br /&gt;
 &lt;br /&gt;
Dim Local1 As Byte&lt;br /&gt;
Dim Local_loop1 As Byte&lt;br /&gt;
 &lt;br /&gt;
Const Menu_id = &amp;amp;HAA ' sub-menu ID byte&lt;br /&gt;
Const Routine_id = &amp;amp;H55 ' service routine ID byte&lt;br /&gt;
 &lt;br /&gt;
'-------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
 Restore Main_menu ' point to the start of the 'main' menu&lt;br /&gt;
 sts {MenuPointer}, R8 ' }&lt;br /&gt;
 sts {MenuPointer + 1}, R9 ' } store the pointer to the start of the menu&lt;br /&gt;
 &lt;br /&gt;
Display_new_menu:&lt;br /&gt;
 &lt;br /&gt;
 lds R8, {MenuPointer} ' }&lt;br /&gt;
 lds R9, {MenuPointer + 1} ' } restore the pointer to the start of the menu&lt;br /&gt;
 &lt;br /&gt;
 Read Entries ' get the number of entries in the menu including the title&lt;br /&gt;
 Print&lt;br /&gt;
 For Local_loop1 = 1 To Entries&lt;br /&gt;
 Read Message ' read the message&lt;br /&gt;
 Print Message ' send it to the console&lt;br /&gt;
 Next&lt;br /&gt;
 &lt;br /&gt;
 Read Dataptr ' get the pointer to the menu's action table&lt;br /&gt;
 sts {ActionPointer}, R8 ' }&lt;br /&gt;
 sts {ActionPointer + 1}, R9 ' } store the pointer to the start of the menu's action list&lt;br /&gt;
 &lt;br /&gt;
 Input &amp;quot;Entry ? &amp;quot; , Local1 ' ask the user which menu entry&lt;br /&gt;
 If Local1 = 0 Then ' is it valid ?&lt;br /&gt;
 Goto Display_new_menu ' if not, re-display the menu&lt;br /&gt;
 End If&lt;br /&gt;
 If Local1 =&amp;gt; Entries Then ' is it valid ?&lt;br /&gt;
 Goto Display_new_menu ' if not, re-display the menu&lt;br /&gt;
 End If&lt;br /&gt;
 &lt;br /&gt;
 lds R8,{ActionPointer} ' }&lt;br /&gt;
 lds R9,{ActionPointer + 1} ' } restore the pointer to the menu's action list&lt;br /&gt;
 &lt;br /&gt;
 If Local1 &amp;lt;&amp;gt; 1 Then&lt;br /&gt;
 For Local_loop1 = 2 To Local1 '&lt;br /&gt;
 ldI R30,4 ' }&lt;br /&gt;
 clr R1 ' }&lt;br /&gt;
 add R8,R30 ' }&lt;br /&gt;
 adc R9,R1 ' }&lt;br /&gt;
 Next ' } calculate the location of the selected entry's function ID&lt;br /&gt;
 End If&lt;br /&gt;
 &lt;br /&gt;
 Read Local1 ' get the menu entry's function ID&lt;br /&gt;
 Read Dummy ' to handle the uP expecting WORDS in DATA statements&lt;br /&gt;
 &lt;br /&gt;
 If Local1 = Menu_id Then ' did the user select an entry that points to another menu ?&lt;br /&gt;
 Read Dataptr&lt;br /&gt;
 sts {MenuPointer}, R8 ' }&lt;br /&gt;
 sts {MenuPointer + 1}, R9 ' } store the start of the menu&lt;br /&gt;
 Goto Display_new_menu&lt;br /&gt;
 End If&lt;br /&gt;
 &lt;br /&gt;
 Read Dataptr ' get the address of this entry's support routine&lt;br /&gt;
 movw R30,R8&lt;br /&gt;
 icall ' pass control to the entry's support routine&lt;br /&gt;
 &lt;br /&gt;
 Goto Display_new_menu ' re-display the last menu displayed&lt;br /&gt;
 &lt;br /&gt;
'-------------------------------------------------------------------------------&lt;br /&gt;
' Test support routines&lt;br /&gt;
'-------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
Hello_message:&lt;br /&gt;
 &lt;br /&gt;
 Print&lt;br /&gt;
 Print &amp;quot;You asked to print 'Hello'&amp;quot; ' confirmation that Menu Entry 3 was selected&lt;br /&gt;
 Return&lt;br /&gt;
 &lt;br /&gt;
2nd_menu_1st_entry_routine:&lt;br /&gt;
 &lt;br /&gt;
 Print&lt;br /&gt;
 Print &amp;quot;You selected Entry 1 of the 2nd menu&amp;quot; ' confirmation that Menu Entry 1 was selected&lt;br /&gt;
 Return&lt;br /&gt;
 &lt;br /&gt;
2nd_menu_2nd_entry_routine:&lt;br /&gt;
 &lt;br /&gt;
 Print&lt;br /&gt;
 Print &amp;quot;You selected Entry 2 of the 2nd menu&amp;quot; ' confirmation that Menu Entry 2 was selected&lt;br /&gt;
 Return&lt;br /&gt;
 &lt;br /&gt;
3rd_menu_1st_entry_routine:&lt;br /&gt;
 &lt;br /&gt;
 Print&lt;br /&gt;
 Print &amp;quot;You selected Entry 1 of the 3rd menu&amp;quot; ' confirmation that Menu Entry 1 was selected&lt;br /&gt;
 Return&lt;br /&gt;
 &lt;br /&gt;
3rd_menu_2nd_entry_routine:&lt;br /&gt;
 &lt;br /&gt;
 Print&lt;br /&gt;
 Print &amp;quot;You selected Entry 2 of the 3rd menu&amp;quot; ' confirmation the Menu Entry 2 was selected&lt;br /&gt;
 Return&lt;br /&gt;
 &lt;br /&gt;
 End&lt;br /&gt;
 &lt;br /&gt;
'===============================================================================&lt;br /&gt;
' Data Statements&lt;br /&gt;
'===============================================================================&lt;br /&gt;
 &lt;br /&gt;
$data&lt;br /&gt;
 &lt;br /&gt;
'-------------------------------------------------------------------------------&lt;br /&gt;
' Main Menu&lt;br /&gt;
'-------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
Main_menu:&lt;br /&gt;
 &lt;br /&gt;
 Data 4 ' number of entries in the menu including title&lt;br /&gt;
 &lt;br /&gt;
 Data &amp;quot;MAIN MENU&amp;quot; ' } menu title&lt;br /&gt;
 Data &amp;quot;1. Go to Menu 2&amp;quot; ' } 1st menu entry&lt;br /&gt;
 Data &amp;quot;2. Go to Menu 3&amp;quot; ' } 2nd menu entry&lt;br /&gt;
 Data &amp;quot;3. Print 'Hello' message&amp;quot; ' } 3rd menu entry&lt;br /&gt;
 &lt;br /&gt;
 Adr2 Mainmenu_supporttable ' point to this menu support table&lt;br /&gt;
 &lt;br /&gt;
'-------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
Mainmenu_supporttable:&lt;br /&gt;
 &lt;br /&gt;
 Data Menu_id ' identify this menu entry as a menu&lt;br /&gt;
 Adr2 Second_menu ' address of next menu&lt;br /&gt;
 &lt;br /&gt;
 Data Menu_id ' identify this menu entry as a menu&lt;br /&gt;
 Adr2 Third_menu ' address of next menu&lt;br /&gt;
 &lt;br /&gt;
 Data Routine_id ' identify this menu entry as support routine&lt;br /&gt;
 Adr Hello_message ' address of the support routine&lt;br /&gt;
 &lt;br /&gt;
'-------------------------------------------------------------------------------&lt;br /&gt;
' Second Menu&lt;br /&gt;
'-------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
Second_menu:&lt;br /&gt;
 &lt;br /&gt;
 Data 4 ' number of entries in the menu&lt;br /&gt;
 &lt;br /&gt;
 Data &amp;quot;SECOND MENU&amp;quot; ' } menu title&lt;br /&gt;
 Data &amp;quot;1. 2nd Menu Entry #1&amp;quot; ' } 1st menu entry&lt;br /&gt;
 Data &amp;quot;2. 2nd Menu Entry #2&amp;quot; ' } 2nd menu entry&lt;br /&gt;
 Data &amp;quot;3. Go to previous menu&amp;quot; ' } 3rd menu entry&lt;br /&gt;
 &lt;br /&gt;
 Adr2 Secondmenu_supporttable ' point to this menu support table&lt;br /&gt;
 &lt;br /&gt;
'-------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
Secondmenu_supporttable:&lt;br /&gt;
 &lt;br /&gt;
 Data Routine_id ' identify this menu entry as a support routine&lt;br /&gt;
 Adr 2nd_menu_1st_entry_routine ' support routine for 1st menu entry&lt;br /&gt;
 &lt;br /&gt;
 Data Routine_id ' identify this menu entry as a support routine&lt;br /&gt;
 Adr 2nd_menu_2nd_entry_routine ' support routine for 2nd menu entry&lt;br /&gt;
 &lt;br /&gt;
 Data Menu_id ' identify this menu entry as a menu&lt;br /&gt;
 Adr2 Main_menu ' support routine for 3rd menu entry&lt;br /&gt;
 &lt;br /&gt;
'-------------------------------------------------------------------------------&lt;br /&gt;
' Third Menu&lt;br /&gt;
'-------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
Third_menu:&lt;br /&gt;
 &lt;br /&gt;
 Data 4 ' number of entries in the menu&lt;br /&gt;
 &lt;br /&gt;
 Data &amp;quot;THIRD MENU&amp;quot; ' } menu title&lt;br /&gt;
 Data &amp;quot;1. 3rd Menu Entry #1&amp;quot; ' } 1st menu entry&lt;br /&gt;
 Data &amp;quot;2. 3rd Menu Entry #2&amp;quot; ' } 2nd menu entry&lt;br /&gt;
 Data &amp;quot;3. Go to previous menu&amp;quot; ' } 3rd menu entry&lt;br /&gt;
 &lt;br /&gt;
 Adr2 Thirdmenu_supporttable ' point to this menu support table&lt;br /&gt;
 &lt;br /&gt;
'-------------------------------------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
Thirdmenu_supporttable:&lt;br /&gt;
 &lt;br /&gt;
 Data Routine_id ' identify this menu entry as a support routine&lt;br /&gt;
 Adr 3rd_menu_1st_entry_routine ' support routine for 1st menu entry&lt;br /&gt;
 &lt;br /&gt;
 Data Routine_id ' identify this menu entry as a support routine&lt;br /&gt;
 Adr 3rd_menu_2nd_entry_routine ' support routine for 2nd menu entry&lt;br /&gt;
 &lt;br /&gt;
 Data Menu_id ' identify this menu entry as a menu&lt;br /&gt;
 Adr2 Main_menu &lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;br/&amp;gt;{{Languages}}&lt;br /&gt;
&lt;br /&gt;
[[Category:BASCOM_Language_Reference]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	</feed>