techElder
Well-known member
These PUSH/POP macros are for M2 processors but work for any processor. Future development will occur by adding multibyte and multiword PUSH/POP since by using POKE/PEEK multiple statements are reduced with more efficiency.
There is a demo program in the next post. Combine the two posts to make a complete PUSH/POP macro testing program.
NOTE: Be aware that I've only tested this with the demo program which is not exactly a real world example.
There is a demo program in the next post. Combine the two posts to make a complete PUSH/POP macro testing program.
Code:
[color=Green]' Implementing PUSH/POP for M2/X2 processors (X2 has built in PUSH/POP and PUSHRAM/POPRAM) ; "2018-03-28 05:49:17"
' Creates a PUSH/POP stack at the highest RAM location (or anywhere else)
' Stack location and size is based on PICAXE processor model
' Handles stackpointer and upper/lower limits (STACKADDR, STACKSIZE) of RAM
' Stack limits are imposed, but no exceptions/errors are made. Perhaps a RESET should occur?
' Based on a PICAXE forum post by Tex (Texasclodhopper) with applied suggestions by hippy and lbenson
' http://www.picaxeforum.co.uk/showthread.php?30659-PUSH-and-POP-for-M2-Processors&p=318493&viewfull=1#post318493
' VERSION: 4 ; "2018-03-31 05:01:08" Added: sPush3B sPop3B STACKADDR3B STACKSIZE3B
' VERSION: 3 ; "2018-03-30 15:30:31" ADDED: sPush3W sPop3W STACKADDR3W and STACKSIZE3W (see post about continued development)
' VERSION: 2 ; "2018-03-29 09:17:48" CHANGED: STACKADDRW to -1 instead of -2
' VERSION: 1 ; "2018-03-28 05:49:17"
' NOTE: The following directives should be placed high up in the program.[/color]
[color=Navy]#picaxe [/color][color=Black]20X2 [/color][color=Green]; Set the compiler mode, also the equivalent of #define xxx.
'#picaxe 20M2 ; Set the compiler mode, also the equivalent of #define xxx.
'#picaxe 18M2 ; Set the compiler mode, also the equivalent of #define xxx.
' combine the following with "#picaxe xxxx". This compiles the correct code for X2 or M2 processors. ; "2018-03-24 11:27:20"
' NOTE that the underscore "_" was added in the PE6 version editor. Probably leave it off for PE5.[/color]
[color=Navy]#IFDEF [/color][color=Blue]_20X2 [/color][color=Green]; "2018-03-28 05:49:17"
[/color][color=Navy]#define [/color][color=Black]X2
[/color][color=Navy]#define [/color][color=Black]MAXRAMADDR [/color][color=Navy][b]127
[/b]#define [/color][color=Black]MINRAMADDR [/color][color=Navy][b]95[/b]
#ELSEIFDEF [/color][color=Blue]_28X2
[/color][color=Navy]#define [/color][color=Black]X2
[/color][color=Navy]#define [/color][color=Black]MAXRAMADDR [/color][color=Navy][b]255
[/b]#define [/color][color=Black]MINRAMADDR [/color][color=Navy][b]191[/b]
#ELSEIFDEF [/color][color=Blue]_40X2
[/color][color=Navy]#define [/color][color=Black]X2
[/color][color=Navy]#define [/color][color=Black]MAXRAMADDR [/color][color=Navy][b]255
[/b]#define [/color][color=Black]MINRAMADDR [/color][color=Navy][b]191[/b]
#ELSEIFDEF [/color][color=Blue]_08M2
[/color][color=Navy]#define [/color][color=Blue]M2
[/color][color=Navy]#define [/color][color=Black]MAXRAMADDR [/color][color=Navy][b]127
[/b]#define [/color][color=Black]MINRAMADDR [/color][color=Navy][b]95[/b]
#ELSEIFDEF [/color][color=Blue]_18M2
[/color][color=Navy]#define [/color][color=Blue]M2
[/color][color=Navy]#define [/color][color=Black]MAXRAMADDR [/color][color=Navy][b]511
[/b]#define [/color][color=Black]MINRAMADDR [/color][color=Navy][b]447[/b]
#ELSEIFDEF [/color][color=Blue]_14M2
[/color][color=Navy]#define [/color][color=Blue]M2
[/color][color=Navy]#define [/color][color=Black]MAXRAMADDR [/color][color=Navy][b]511
[/b]#define [/color][color=Black]MINRAMADDR [/color][color=Navy][b]447[/b]
#ELSEIFDEF [/color][color=Blue]_20M2
[/color][color=Navy]#define [/color][color=Blue]M2
[/color][color=Navy]#define [/color][color=Black]MAXRAMADDR [/color][color=Navy][b]511
[/b]#define [/color][color=Black]MINRAMADDR [/color][color=Navy][b]447[/b]
#ELSE
#error "Must define processor!"
#ENDIF[/color]
[color=Blue]symbol STACKADDR [/color][color=DarkCyan]= [/color][color=Black]MAXRAMADDR [/color][color=Green]; stack grows down from maximum RAM established in Directives[/color]
[color=Blue]symbol STACKSIZE [/color][color=DarkCyan]= [/color][color=Black]MINRAMADDR [/color][color=Green]; stack can grow down to this minimum RAM established in Directives[/color]
[color=Blue]symbol STACKADDRW [/color][color=DarkCyan]= [/color][color=Blue]STACKADDR [/color][color=DarkCyan]- [/color][color=Navy][b]1 [/b][/color][color=Green]; stack address for WORDs (changed from 2); "2018-03-29 13:56:55"[/color]
[color=Blue]symbol STACKSIZEW [/color][color=DarkCyan]= [/color][color=Blue]STACKSIZE [/color][color=DarkCyan]+ [/color][color=Navy][b]1 [/b][/color][color=Green]; stack size for WORDs[/color]
[color=Blue]symbol STACKADDR3W [/color][color=DarkCyan]= [/color][color=Blue]STACKADDR [/color][color=DarkCyan]- [/color][color=Navy][b]5 [/b][/color][color=Green]; stack address for 3 WORDs ; "2018-03-30 15:30:31"[/color]
[color=Blue]symbol STACKSIZE3W [/color][color=DarkCyan]= [/color][color=Blue]STACKSIZE [/color][color=DarkCyan]+ [/color][color=Navy][b]5 [/b][/color][color=Green]; stack size for 3 WORDs ; "2018-03-30 15:30:31"[/color]
[color=Blue]symbol STACKADDR3B [/color][color=DarkCyan]= [/color][color=Blue]STACKADDR [/color][color=DarkCyan]- [/color][color=Navy][b]2 [/b][/color][color=Green]; stack address for 3 BYTEs ; "2018-03-31 05:01:08"[/color]
[color=Blue]symbol STACKSIZE3B [/color][color=DarkCyan]= [/color][color=Blue]STACKSIZE [/color][color=DarkCyan]+ [/color][color=Navy][b]2 [/b][/color][color=Green]; stack size for 3 BYTEs ; "2018-03-31 05:01:08"[/color]
[color=Navy]#IFDEF [/color][color=Black]X2
[/color][color=Blue]symbol [/color][color=Purple]sPtr [/color][color=DarkCyan]= [/color][color=Purple]b55 [/color][color=Green]; highest BYTE variable[/color]
[color=Navy]#ENDIF
#IFDEF [/color][color=Blue]M2
symbol [/color][color=Purple]sPtr [/color][color=DarkCyan]= [/color][color=Purple]w13 [/color][color=Green]; highest WORD variable (due to 512 RAM locations)[/color]
[color=Navy]#ENDIF
#macro [/color][color=Black]sPushB[/color][color=Blue]([/color][color=Black]bVar[/color][color=Blue]) [/color][color=Green]; "2018-03-29 09:17:48"
[/color][color=Blue]if [/color][color=Purple]sPtr [/color][color=DarkCyan]> [/color][color=Blue]STACKSIZE then [/color][color=Green]; stack limit not reached
[/color][color=Blue]poke [/color][color=Purple]sPtr[/color][color=Black], bVar [/color][color=Green]; put the value into the stack
[/color][color=Blue]dec [/color][color=Purple]sPtr [/color][color=Green]; set the next stack pointer
'else
' what to do if sPtr <= STACKSIZE?????
[/color][color=Blue]endif[/color]
[color=Navy]#endm
#macro [/color][color=Black]sPushW[/color][color=Blue]([/color][color=Black]wVar[/color][color=Blue]) [/color][color=Green]; "2018-03-29 09:17:48"
[/color][color=Blue]if [/color][color=Purple]sPtr [/color][color=DarkCyan]> [/color][color=Blue]STACKSIZEW then [/color][color=Green]; stack limit not reached
[/color][color=Blue]dec [/color][color=Purple]sptr [/color][color=Green]; make room for WORD
[/color][color=Blue]poke [/color][color=Purple]sPtr[/color][color=Black], [/color][color=Blue]WORD [/color][color=Black]wVar [/color][color=Green]; put the value into the stack (LE)
[/color][color=Blue]dec [/color][color=Purple]sPtr [/color][color=Green]; set the next stack pointer after WORD
'else
' what to do if sPtr <= STACKSIZEW?????
[/color][color=Blue]endif[/color]
[color=Navy]#endm
#macro [/color][color=Black]sPopB[/color][color=Blue]([/color][color=Black]bVar[/color][color=Blue]) [/color][color=Green]; "2018-03-29 09:17:48"
[/color][color=Blue]if [/color][color=Purple]sPtr [/color][color=DarkCyan]< [/color][color=Blue]STACKADDR then [/color][color=Green]; stack start reached
[/color][color=Blue]inc [/color][color=Purple]sPtr
[/color][color=Blue]peek [/color][color=Purple]sPtr[/color][color=Black], bVar [/color][color=Green]; put the value into the variable
's_w0=$99:poke sPtr, s_w0 ; put the value into the variable
'else
' what to do if sPtr => STACKADDR?????
[/color][color=Blue]endif[/color]
[color=Navy]#endm
#macro [/color][color=Black]sPopW[/color][color=Blue]([/color][color=Black]wVar[/color][color=Blue]) [/color][color=Green]; "2018-03-29 09:17:48"
[/color][color=Blue]if [/color][color=Purple]sPtr [/color][color=DarkCyan]< [/color][color=Blue]STACKADDRW then [/color][color=Green]; stack start reached
[/color][color=Blue]inc [/color][color=Purple]sPtr [/color][color=Green]; set the stack pointer for WORD
[/color][color=Blue]peek [/color][color=Purple]sPtr[/color][color=Black], [/color][color=Blue]WORD [/color][color=Black]wVar [/color][color=Green]; put the value into the variable
[/color][color=Blue]inc [/color][color=Purple]sPtr [/color][color=Green]; set the next stack pointer after WORD
's_w0=$FFFF:poke sPtr, WORD s_w0 ; put the value into the variable
'else
' what to do if sPtr => STACKADDRW?????
[/color][color=Blue]endif[/color]
[color=Navy]#endm[/color]
Last edited: