ADR

From MCS Wiki AVR
Jump to: navigation, search

Contents

Action

Create label address.

 

 

Syntax

ADR  label

ADR2  label

 

 

 

Remarks

label

The name of a label.

 

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.

 

Using ADR2 you can use tables. The sample program demonstrates this together with some more advanced ASM code.

 

The sample includes ADR2.LIB. This lib contains a special version of  _MoveConst2String .

The normal routine in MCS.LIB will stop printing once a null byte (zero) is encountered that indicates the end of a string.

But for the sample program, we may not change the address, so the address is restored when the null byte is found.

 

 

See Also

NONE

 

 

Example


'===============================================================================
' This is an example of how to create an interactive menu system supporting
' sub-menus and support routines using the !ADR and !ADR2 statements
'===============================================================================
 
$regfile = "M644def.dat"
$crystal = 8000000
 
$hwstack = 64 ' specify the hardware stack depth
$swstack = 64 ' specify the software stack depth
$framesize = 64 ' specify the framesize (local stack depth)
 
$lib "adr2.lib"
 
'-------------------------------------------------------------------------------
 
Dim Menupointer As Word
Dim Actionpointer As Word
 
Dim Entries As Byte
Dim Dummy As Byte
Dim Message As String * 32
 
Dim Local1 As Byte
Dim Local_loop1 As Byte
 
Const Menu_id = &HAA ' sub-menu ID byte
Const Routine_id = &H55 ' service routine ID byte
 
'-------------------------------------------------------------------------------
 
 Restore Main_menu ' point to the start of the 'main' menu
 sts {MenuPointer}, R8 ' }
 sts {MenuPointer + 1}, R9 ' } store the pointer to the start of the menu
 
Display_new_menu:
 
 lds R8, {MenuPointer} ' }
 lds R9, {MenuPointer + 1} ' } restore the pointer to the start of the menu
 
 Read Entries ' get the number of entries in the menu including the title
 Print
 For Local_loop1 = 1 To Entries
 Read Message ' read the message
 Print Message ' send it to the console
 Next
 
 Read Dataptr ' get the pointer to the menu's action table
 sts {ActionPointer}, R8 ' }
 sts {ActionPointer + 1}, R9 ' } store the pointer to the start of the menu's action list
 
 Input "Entry ? " , Local1 ' ask the user which menu entry
 If Local1 = 0 Then ' is it valid ?
 Goto Display_new_menu ' if not, re-display the menu
 End If
 If Local1 => Entries Then ' is it valid ?
 Goto Display_new_menu ' if not, re-display the menu
 End If
 
 lds R8,{ActionPointer} ' }
 lds R9,{ActionPointer + 1} ' } restore the pointer to the menu's action list
 
 If Local1 <> 1 Then
 For Local_loop1 = 2 To Local1 '
 ldI R30,4 ' }
 clr R1 ' }
 add R8,R30 ' }
 adc R9,R1 ' }
 Next ' } calculate the location of the selected entry's function ID
 End If
 
 Read Local1 ' get the menu entry's function ID
 Read Dummy ' to handle the uP expecting WORDS in DATA statements
 
 If Local1 = Menu_id Then ' did the user select an entry that points to another menu ?
 Read Dataptr
 sts {MenuPointer}, R8 ' }
 sts {MenuPointer + 1}, R9 ' } store the start of the menu
 Goto Display_new_menu
 End If
 
 Read Dataptr ' get the address of this entry's support routine
 movw R30,R8
 icall ' pass control to the entry's support routine
 
 Goto Display_new_menu ' re-display the last menu displayed
 
'-------------------------------------------------------------------------------
' Test support routines
'-------------------------------------------------------------------------------
 
Hello_message:
 
 Print
 Print "You asked to print 'Hello'" ' confirmation that Menu Entry 3 was selected
 Return
 
2nd_menu_1st_entry_routine:
 
 Print
 Print "You selected Entry 1 of the 2nd menu" ' confirmation that Menu Entry 1 was selected
 Return
 
2nd_menu_2nd_entry_routine:
 
 Print
 Print "You selected Entry 2 of the 2nd menu" ' confirmation that Menu Entry 2 was selected
 Return
 
3rd_menu_1st_entry_routine:
 
 Print
 Print "You selected Entry 1 of the 3rd menu" ' confirmation that Menu Entry 1 was selected
 Return
 
3rd_menu_2nd_entry_routine:
 
 Print
 Print "You selected Entry 2 of the 3rd menu" ' confirmation the Menu Entry 2 was selected
 Return
 
 End
 
'===============================================================================
' Data Statements
'===============================================================================
 
$data
 
'-------------------------------------------------------------------------------
' Main Menu
'-------------------------------------------------------------------------------
 
Main_menu:
 
 Data 4 ' number of entries in the menu including title
 
 Data "MAIN MENU" ' } menu title
 Data "1. Go to Menu 2" ' } 1st menu entry
 Data "2. Go to Menu 3" ' } 2nd menu entry
 Data "3. Print 'Hello' message" ' } 3rd menu entry
 
 Adr2 Mainmenu_supporttable ' point to this menu support table
 
'-------------------------------------------------------------------------------
 
Mainmenu_supporttable:
 
 Data Menu_id ' identify this menu entry as a menu
 Adr2 Second_menu ' address of next menu
 
 Data Menu_id ' identify this menu entry as a menu
 Adr2 Third_menu ' address of next menu
 
 Data Routine_id ' identify this menu entry as support routine
 Adr Hello_message ' address of the support routine
 
'-------------------------------------------------------------------------------
' Second Menu
'-------------------------------------------------------------------------------
 
Second_menu:
 
 Data 4 ' number of entries in the menu
 
 Data "SECOND MENU" ' } menu title
 Data "1. 2nd Menu Entry #1" ' } 1st menu entry
 Data "2. 2nd Menu Entry #2" ' } 2nd menu entry
 Data "3. Go to previous menu" ' } 3rd menu entry
 
 Adr2 Secondmenu_supporttable ' point to this menu support table
 
'-------------------------------------------------------------------------------
 
Secondmenu_supporttable:
 
 Data Routine_id ' identify this menu entry as a support routine
 Adr 2nd_menu_1st_entry_routine ' support routine for 1st menu entry
 
 Data Routine_id ' identify this menu entry as a support routine
 Adr 2nd_menu_2nd_entry_routine ' support routine for 2nd menu entry
 
 Data Menu_id ' identify this menu entry as a menu
 Adr2 Main_menu ' support routine for 3rd menu entry
 
'-------------------------------------------------------------------------------
' Third Menu
'-------------------------------------------------------------------------------
 
Third_menu:
 
 Data 4 ' number of entries in the menu
 
 Data "THIRD MENU" ' } menu title
 Data "1. 3rd Menu Entry #1" ' } 1st menu entry
 Data "2. 3rd Menu Entry #2" ' } 2nd menu entry
 Data "3. Go to previous menu" ' } 3rd menu entry
 
 Adr2 Thirdmenu_supporttable ' point to this menu support table
 
'-------------------------------------------------------------------------------
 
Thirdmenu_supporttable:
 
 Data Routine_id ' identify this menu entry as a support routine
 Adr 3rd_menu_1st_entry_routine ' support routine for 1st menu entry
 
 Data Routine_id ' identify this menu entry as a support routine
 Adr 3rd_menu_2nd_entry_routine ' support routine for 2nd menu entry
 
 Data Menu_id ' identify this menu entry as a menu
 Adr2 Main_menu

Languages   English Deutsch  
Personal tools
Namespaces
Variants
Actions
Navigation
In other languages
Language