<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Flashing Made Simple Min Ram Version in 8-bit Microcontrollers</title>
    <link>https://community.nxp.com/t5/8-bit-Microcontrollers/Flashing-Made-Simple-Min-Ram-Version-MC9S08QG4/m-p/195718#M15650</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;Hello Tony,&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;I was originally thinking that the flag clearing required read-modify-write, as with many other flags.&amp;nbsp; However, on checking with the data sheet, these flags only require a write to clear them.&amp;nbsp; This is explicitly stated within the description for each flag.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;FSTAT = 0x30;&amp;nbsp; // This should work if flags are set, and have no effect if flags are clear.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;JimD,&lt;/DIV&gt;&lt;DIV&gt;With the interrupt control process within the erase and program functions, I see that you are creating a local variable (on the stack), and then writing to it using inline assembly.&amp;nbsp; Probably better to directly push the value on the stack.&amp;nbsp; So your functions might look like this.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;byte FlashErasePage( word page)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; volatile byte temp;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp; asm {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TPA&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PSHA&amp;nbsp;&amp;nbsp;&amp;nbsp; // Save current status&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SEI&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Disable interrupts&lt;BR /&gt;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&amp;nbsp;&amp;nbsp; FSTAT = 0x30;&amp;nbsp; // Clear FACCERR &amp;amp; FPVIOL flags&lt;BR /&gt;&amp;nbsp;&amp;nbsp; temp = Page_Erase( page, 0);&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; asm {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PULA&amp;nbsp;&amp;nbsp; // Restore previous status&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TAP&lt;BR /&gt;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&amp;nbsp;&amp;nbsp; return temp;&lt;BR /&gt;}&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;byte FlashProgramByte( word address, byte data)&lt;BR /&gt;{&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; volatile byte temp;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp; asm {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TPA&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PSHA&amp;nbsp;&amp;nbsp;&amp;nbsp; ; Save current status&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SEI&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; Disable interrupts&lt;BR /&gt;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&amp;nbsp;&amp;nbsp; FSTAT = 0x30;&amp;nbsp; // Clear FACCERR &amp;amp; FPVIOL flags&lt;BR /&gt;&amp;nbsp;&amp;nbsp; temp = Program_Byte(address, data);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; asm {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PULA&amp;nbsp;&amp;nbsp; ; Restore previous status&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TAP&lt;BR /&gt;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&amp;nbsp;&amp;nbsp; return temp;&lt;BR /&gt;}&lt;BR /&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;However, since assembly is being used, why not stick entirely with assembly, and also avoid the need for the complex incantations within the macros - well I find them complex.&amp;nbsp; The following might be a possibility.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;byte FlashErasePage( word page)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; volatile byte temp;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp; asm {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TPA&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PSHA&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; Save current status&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SEI&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; Disable interrupts&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LDA&amp;nbsp;&amp;nbsp; #0x30&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; STA&amp;nbsp;&amp;nbsp; FSTAT ; Clear FACCERR &amp;amp; FPVIOL flags&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LDA&amp;nbsp;&amp;nbsp; #0x40 ; ERASE command&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; STA&amp;nbsp;&amp;nbsp; PGM:2&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LDHX&amp;nbsp; page&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; JSR&amp;nbsp;&amp;nbsp; PGM&amp;nbsp;&amp;nbsp; ; Execute RAM routine&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; STA&amp;nbsp;&amp;nbsp; temp&amp;nbsp; ; Return value&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PULA&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; Restore previous status&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TAP&lt;BR /&gt;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&amp;nbsp;&amp;nbsp; return temp;&lt;BR /&gt;}&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;byte FlashProgramByte( word address, byte data)&lt;BR /&gt;{&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; volatile byte temp;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp; asm {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TPA&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PSHA&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; Save current status&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SEI&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; Disable interrupts&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LDA&amp;nbsp;&amp;nbsp; #0x30&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; STA&amp;nbsp;&amp;nbsp; FSTAT ; Clear FACCERR &amp;amp; FPVIOL flags&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LDA&amp;nbsp;&amp;nbsp; #0x20 ; PROGRAM command&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; STA&amp;nbsp;&amp;nbsp; PGM:2&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LDHX&amp;nbsp; address&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LDA&amp;nbsp;&amp;nbsp; data&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; JSR&amp;nbsp;&amp;nbsp; PGM&amp;nbsp;&amp;nbsp; ; Execute RAM routine&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; STA&amp;nbsp;&amp;nbsp; temp&amp;nbsp; ; Return value&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PULA&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; Restore previous status&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TAP&lt;BR /&gt;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&amp;nbsp;&amp;nbsp; return temp;&lt;BR /&gt;}&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Finally, on the subject of "padding" delays, a benign, single byte instruction is TST&amp;nbsp; ,X.&amp;nbsp; This provides a delay of 3 cycles for the 9S08.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Probably not relevant here, but a very simple way to generate much longer delays using 4 bytes&amp;nbsp;-&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp; lda&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;lt;delay_value&amp;gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp; dbnza&amp;nbsp;*&amp;nbsp;&amp;nbsp; ; 4 cycles per loop&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Regards,&lt;/DIV&gt;&lt;DIV&gt;Mac&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;BR /&gt;&lt;BR /&gt;Message Edited by bigmac on &lt;SPAN class="date_text"&gt;2008-02-26&lt;/SPAN&gt; &lt;SPAN class="time_text"&gt;07:28 AM&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Tue, 26 Feb 2008 04:03:32 GMT</pubDate>
    <dc:creator>bigmac</dc:creator>
    <dc:date>2008-02-26T04:03:32Z</dc:date>
    <item>
      <title>Flashing Made Simple Min Ram Version - MC9S08QG4</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/Flashing-Made-Simple-Min-Ram-Version-MC9S08QG4/m-p/195711#M15643</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt; &lt;/DIV&gt;&lt;DIV&gt; &lt;/DIV&gt;&lt;DIV&gt; &lt;/DIV&gt;&lt;DIV&gt; &lt;/DIV&gt;&lt;DIV&gt; &lt;/DIV&gt;&lt;SPAN&gt;This subject has pretty much been beat to death, but I think this code has some appeal to it, and has some ideas that make it nice for a lib.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Advantages:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Handles interrupts in the only way I see as acceptable for a lib. The user should not have to worry about this, but should be aware of the lock out. This code leaves the IM flag the way it found it.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Uses a minimum of ram - 35 bytes. I use this code on QG4 project where I only have 256 byte of RAM, so this is a big consideration.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;No changes required to the PRM file and no special pragmas used, and no worries about other ram variables overlaying it.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;And it is darned simple.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;If you need to, you can reuse the ram space and copy it back later. Once you have committed to a stack size you are stuck with it, and I really don't like stressing the stack on little ones like this.&amp;nbsp; Plus, in a library this could be a hidden nasty surprise. The map file will reflect the usage with this method.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;This was adapted from HCS08RUG.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Disadvantages:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Does not use burst mode to program. According to the QG8/4 spec sheet if you set the clock to 200Khz, it takes 45 us in single mode and 20us in burst mode. While this is a 2x difference, if you only need a few bytes of config data it is no big deal. Thats 23ms for a 512 byte sector - interestingly enough just about as long as it take the erase a sector. If this is an issue, it&amp;nbsp; would be easy enough to make a tweaked burst version, but you won't get away with using the same code for erasing and writing as easily.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I normally don't use asm language, but this is a just cause. In theory, this should work with all HCS08, and I will try other chips. I have done a fair amount of testing, and it seems fine.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Debugging Advice:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Hiwave will not read back flash unless you pretend to write in it, unless you set the region to R/W and check "refresh memory when halting" you should also check "no memory access while running". This is in the "Debugging Memory Map" dialog. I had not troubles at all stepping thru the code and watching memory change - I did not step through the actual command execution code.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;
#define Page_Erase&amp;nbsp;&amp;nbsp; PGM[2]=0x40; temp = ((unsigned char(*)(unsigned int, unsigned char))(PGM))
#define Program_Byte PGM[2]=0x20; temp = ((unsigned char(*)(unsigned int, unsigned char))(PGM))

//Array of opcode instructions of the Erase/Program function in the HCS08 family// A = data, X = Address.

volatile unsigned char PGM[35]&amp;nbsp; = {&amp;nbsp; 0xF7,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // STA ,X&amp;nbsp;&amp;nbsp; Save the data byte into the address. 0xA6,0x00,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp; LDA cmd (Filled in before calling)0xC7,0x18,0x26,&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp; STA&amp;nbsp;&amp;nbsp; _FCMD0x45,0x18,0x25,&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp; LDHX&amp;nbsp; @_FSTAT0xF6,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // LDA&amp;nbsp;&amp;nbsp; ,X0xAA,0x80,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ORA&amp;nbsp;&amp;nbsp; #$800xF7,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // STA&amp;nbsp;&amp;nbsp; ,X0x9D,0x9D,0x9D,0x9D, // NOP, NOP,NOP,NOP0xC6,0x18,0x25,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // LDA&amp;nbsp;&amp;nbsp; _FSTAT0xA5,0x30,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // BIT&amp;nbsp;&amp;nbsp; #$300x27,0x03,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // BEQ&amp;nbsp;&amp;nbsp; *+5 (Label1)0xa6,0xff,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // RTS
0x81,
// Label1:
0xC6,0x18,0x25,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // LDA&amp;nbsp;&amp;nbsp; _FSTAT
0xa5,0x40,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // BIT #$40
0x27,0xF9,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // BEQ *-5 (Label)
0x81,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // RTS
};
byte FlashErasePage(word page)
{
&amp;nbsp;&amp;nbsp; volatile unsigned char temp ;
&amp;nbsp;&amp;nbsp; byte im;
&amp;nbsp;&amp;nbsp; asm TPA;&amp;nbsp;&amp;nbsp;&amp;nbsp; // get the flags
&amp;nbsp;&amp;nbsp; asm STA im&amp;nbsp; // save them
&amp;nbsp;&amp;nbsp; asm SEI&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // clear the im bit

&amp;nbsp;&amp;nbsp; if (FSTAT&amp;amp;0x30){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Check to see if FACCERR or FPVIOL is set
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FSTAT = FSTAT | 0x30;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //write a 1 to clear
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp; temp = Page_Erase(page,0);
&amp;nbsp;&amp;nbsp; asm LDA im&amp;nbsp;&amp;nbsp; // get the flags back
&amp;nbsp;&amp;nbsp; asm TAP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // restore the im bit.
&amp;nbsp;&amp;nbsp; return temp; 
 
}
byte FlashProgramByte(word address, byte data)
{
&amp;nbsp; volatile unsigned char temp;
&amp;nbsp;&amp;nbsp; byte im;
&amp;nbsp;&amp;nbsp; asm TPA;
&amp;nbsp;&amp;nbsp; asm STA im
&amp;nbsp;&amp;nbsp; asm SEI
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (FSTAT&amp;amp;0x30){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Check to see if FACCERR or FPVIOL is set
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FSTAT = FSTAT | 0x30;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //write a 1 to&amp;nbsp; clear
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp; temp = Program_Byte(address, data);
&amp;nbsp;&amp;nbsp; asm LDA im
&amp;nbsp;&amp;nbsp; asm TAP
&amp;nbsp; return temp; 
}

&lt;/PRE&gt;&lt;/DIV&gt;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;DIV&gt; &lt;/DIV&gt;&lt;P&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN class="time_text"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN class="time_text"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;Message Edited by JimDon on &lt;SPAN class="date_text"&gt;2008-02-25&lt;/SPAN&gt; &lt;SPAN class="time_text"&gt;01:24 AM&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="time_text"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="time_text"&gt;Added p/n to subject.&lt;/SPAN&gt;&lt;/P&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Message Edited by NLFSJ on &lt;/SPAN&gt;&lt;SPAN class="date_text"&gt;2008-02-25&lt;/SPAN&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;SPAN class="time_text"&gt;07:29 AM&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 29 Oct 2020 09:50:45 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/Flashing-Made-Simple-Min-Ram-Version-MC9S08QG4/m-p/195711#M15643</guid>
      <dc:creator>JimDon</dc:creator>
      <dc:date>2020-10-29T09:50:45Z</dc:date>
    </item>
    <item>
      <title>Re: Flashing Made Simple Min Ram Version</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/Flashing-Made-Simple-Min-Ram-Version-MC9S08QG4/m-p/195712#M15644</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;Small optimization, using the loaded FSTAT address 5 bytes can be saved.&lt;BR /&gt;If the C code would report the error by reading FSTAT, the routine could be 2 another bytes smaller.&lt;BR /&gt;&lt;BR /&gt;Daniel&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt; include "mc9s08qg4.inc"cmd:      EQU 0; dummyPGM_SEC:  SECTION          XDEF PGMPGM:  STA   ,X  ; Save the data byte into the address.   LDA   #cmd ;(Filled in before calling)  LDHX  #FSTAT  STA   FCMD-FSTAT,X ; FCMD  LDA   ,X  ORA   #$80  STA   ,X  NOP  NOP  NOP  NOP  LDA   ,X ; FSTAT  BIT   #$30  BEQ   Label1  LDA   #-1 ; needed?  RTSLabel1:  LDA   ,X ; FSTAT  BIT #$40  BEQ Label1  RTS&lt;/PRE&gt;&lt;/DIV&gt;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 29 Oct 2020 09:50:47 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/Flashing-Made-Simple-Min-Ram-Version-MC9S08QG4/m-p/195712#M15644</guid>
      <dc:creator>CompilerGuru</dc:creator>
      <dc:date>2020-10-29T09:50:47Z</dc:date>
    </item>
    <item>
      <title>Re: Flashing Made Simple Min Ram Version</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/Flashing-Made-Simple-Min-Ram-Version-MC9S08QG4/m-p/195713#M15645</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;Optimizations:&lt;BR /&gt;&lt;BR /&gt;If the bit mask is loaded before reading FSTAT, the min. cycle requirement between writing and reading FSTAT can still be met while saving a few NOPs (the delay is now in the LDA instruction), for example:&lt;BR /&gt;&lt;/FONT&gt;&lt;PRE&gt;&lt;FONT face="Courier New"&gt;STA   ,X
  NOP

  LDA   #$30
  BIT   ,X ; FSTAT

And, is there a reason (bug workaround, compatibility, etc.) for this:

 LDA ,X
 ORA #$80
 STA ,X

instead of this shorter version?
(AFAIK, the remaining FSTAT bits are indifferent at this stage):

 LDA #$80
 STA ,X

&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;I still find &lt;A href="http://forums.freescale.com/freescale/board/message?board.id=8BITCOMM&amp;amp;message.id=887&amp;amp;query.id=777292#M887" rel="nofollow noopener noreferrer noopener noreferrer" target="_blank"&gt;this version&lt;/A&gt; to use less RAM.&lt;/FONT&gt;&lt;/PRE&gt;&lt;/DIV&gt;&lt;FONT face="Courier New"&gt;&lt;SPAN class="time_text"&gt;&lt;/SPAN&gt;&lt;SPAN class="time_text"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN class="time_text"&gt;&lt;/SPAN&gt;&lt;SPAN class="time_text"&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;Message Edited by tonyp on &lt;SPAN class="date_text"&gt;2008-02-25&lt;/SPAN&gt; &lt;SPAN class="time_text"&gt;02:55 PM&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 29 Oct 2020 09:50:49 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/Flashing-Made-Simple-Min-Ram-Version-MC9S08QG4/m-p/195713#M15645</guid>
      <dc:creator>tonyp</dc:creator>
      <dc:date>2020-10-29T09:50:49Z</dc:date>
    </item>
    <item>
      <title>Re: Flashing Made Simple Min Ram Version</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/Flashing-Made-Simple-Min-Ram-Version-MC9S08QG4/m-p/195714#M15646</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;&lt;/DIV&gt;Thanks guys !!!!&lt;BR /&gt;&lt;BR /&gt;Well, for one thing I used a variation of the code from an app. note to be safe.&lt;BR /&gt;&lt;BR /&gt;The loop will terminate if if there is an error? I had thought that the code was so as it was not assured of loop exit if error, but it seems not, so great.&lt;BR /&gt;I admit I am not familar enough with 08 asm language to quickly see these tweaks, plus I try not to write obfuscated code but in a case like this, it is perfectly fine! This code is short and should not require maintenance.&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;DIV class="msg_source_code"&gt;&lt;DIV class="text_smallest"&gt;Code:&lt;/DIV&gt;&lt;PRE&gt;#define Page_Erase   PGM[2]=0x40; ((void(*)(unsigned int, unsigned char))(PGM))
#define Program_Byte PGM[2]=0x20; ((void(*)(unsigned int, unsigned char))(PGM))

//Array of opcode instructions of the Erase/Program function in the HCS08 family
// A = data, X = Address.
volatile unsigned char PGM[18]  = { 
0xF7,              // STA ,X   Save the data byte into the address.
0xA6,0x00,         // LDA cmd
0xC7,0x18,0x26,    // STA   _FCMD
0xA6,0x80,         // LDA    FCBEF bit
0xc7,0x18,0x25,    // sta       FSTAT 
0x44,              // lsra - one byte - longer delay than nop
0xc5,0x18,0x25,    // Bit fstat
0x27,0xfb,         // BEQ *-3
0x81               // RTS
};
byte FlashErasePage(word page)
{
  
   byte im;
   asm TPA         // get that flags
   asm STA im      // save the flags
   asm SEI         // kill IM bit

   if (FSTAT&amp;amp;0x30){                    //Check to see if FACCERR is set
      FSTAT = FSTAT | 0x30;            //write a 1 to FACCERR to clear
   }

   Page_Erase(page,0);
  
   asm LDA im                          // put the im bit bak
   asm TAP

   if (FSTAT&amp;amp;0x30){                     //check to see if FACCERR or FVIOL are set
     return 0xFF;                       //if so, error.
   }
  
   return 0; 
 
}
byte FlashProgramByte(word address, byte data)
{
   byte im;
   asm TPA
   asm STA im
   asm SEI

   if (FSTAT&amp;amp;0x30){                    
      FSTAT = FSTAT | 0x30;           
    }

   Program_Byte(address, data);
  
   asm LDA im
   asm TAP
   if (FSTAT&amp;amp;0x30){                     //check to see if FACCERR or FVIOL are set
     return 0xFF;                       //if so, error.
   }
  
   return 0; 
 
}&lt;/PRE&gt;&lt;/DIV&gt;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 29 Oct 2020 09:50:50 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/Flashing-Made-Simple-Min-Ram-Version-MC9S08QG4/m-p/195714#M15646</guid>
      <dc:creator>JimDon</dc:creator>
      <dc:date>2020-10-29T09:50:50Z</dc:date>
    </item>
    <item>
      <title>Re: Flashing Made Simple Min Ram Version</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/Flashing-Made-Simple-Min-Ram-Version-MC9S08QG4/m-p/195715#M15647</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;DIV&gt;Hello Jim,&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;While it does not influence the amount of RAM used, and may be a relatively minor point,&amp;nbsp;I see that you have consistly used the statement -&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;if (FSTAT &amp;amp; 0x30){&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;FSTAT = FSTAT | 0x30;&lt;BR /&gt;}&lt;BR /&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Is it not sufficient to simply use the following?&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;FSTAT = FSTAT | 0x30;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Why bother testing FSTAT - simply clear the flags.&amp;nbsp; If they are already clear, nothing will happen.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Regards,&lt;/DIV&gt;&lt;DIV&gt;Mac&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 26 Feb 2008 01:09:01 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/Flashing-Made-Simple-Min-Ram-Version-MC9S08QG4/m-p/195715#M15647</guid>
      <dc:creator>bigmac</dc:creator>
      <dc:date>2008-02-26T01:09:01Z</dc:date>
    </item>
    <item>
      <title>Re: Flashing Made Simple Min Ram Version</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/Flashing-Made-Simple-Min-Ram-Version-MC9S08QG4/m-p/195716#M15648</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;I had the same thought, but again this is from Freescale sample code.&lt;BR /&gt;I seems like it should be ok to do that.&lt;BR /&gt;&lt;BR /&gt;Couldn't all this code be in flash as well?&lt;BR /&gt;&lt;PRE&gt;0xF7,              // STA ,X   Save the data byte into the address.
0xA6,0x00,         // LDA cmd
0xC7,0x18,0x26,    // STA   _FCMD
0xA6,0x80,         // LDA    FCBEF bit
&lt;/PRE&gt;&lt;BR /&gt;&lt;BR /&gt;In my world I don't even get the error return, as if the burn code is correct, it means either you have a bug (trying to write some where that is not flash) or the part is cooked, meaning once the code is verified correct, this&amp;nbsp; should never happen in any recoverable way.&lt;BR /&gt;&lt;BR /&gt;Besides, who are you going to report the bad return to?&lt;BR /&gt;&lt;BR /&gt;Tonight I will write a stack version - 18 bytes is not enough to be a nasty surprise.&lt;BR /&gt;&lt;BR /&gt;In the future, see if you can get FSL to post the sample code here before publishing :--)&lt;BR /&gt;&lt;BR /&gt;The "red ink" would do us all some good.&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;SPAN class="time_text"&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;Message Edited by JimDon on &lt;SPAN class="date_text"&gt;2008-02-25&lt;/SPAN&gt; &lt;SPAN class="time_text"&gt;12:25 PM&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;Message Edited by JimDon on &lt;SPAN class="date_text"&gt;2008-02-25&lt;/SPAN&gt; &lt;SPAN class="time_text"&gt;12:27 PM&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 29 Oct 2020 09:50:52 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/Flashing-Made-Simple-Min-Ram-Version-MC9S08QG4/m-p/195716#M15648</guid>
      <dc:creator>JimDon</dc:creator>
      <dc:date>2020-10-29T09:50:52Z</dc:date>
    </item>
    <item>
      <title>Re: Flashing Made Simple Min Ram Version</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/Flashing-Made-Simple-Min-Ram-Version-MC9S08QG4/m-p/195717#M15649</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;BLOCKQUOTE&gt;&lt;HR /&gt;bigmac wrote:&lt;BR /&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;DIV&gt;Why bother testing FSTAT - simply clear the flags.&amp;nbsp; If they are already clear, nothing will happen.&lt;/DIV&gt;&lt;/DIV&gt;&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;&lt;BR /&gt;As bigmac says, a direct write works perfectly.&lt;BR /&gt;&lt;BR /&gt;Unfortunately, the flowchart offered by Freescale is misleading in that it clears the flags only if these are set.&amp;nbsp; This is certainly incorrect, as writing ones to those bits will not set them into error state, or else my current working code would fail.&lt;BR /&gt;&lt;BR /&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 26 Feb 2008 01:41:36 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/Flashing-Made-Simple-Min-Ram-Version-MC9S08QG4/m-p/195717#M15649</guid>
      <dc:creator>tonyp</dc:creator>
      <dc:date>2008-02-26T01:41:36Z</dc:date>
    </item>
    <item>
      <title>Re: Flashing Made Simple Min Ram Version</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/Flashing-Made-Simple-Min-Ram-Version-MC9S08QG4/m-p/195718#M15650</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;Hello Tony,&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;I was originally thinking that the flag clearing required read-modify-write, as with many other flags.&amp;nbsp; However, on checking with the data sheet, these flags only require a write to clear them.&amp;nbsp; This is explicitly stated within the description for each flag.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;FSTAT = 0x30;&amp;nbsp; // This should work if flags are set, and have no effect if flags are clear.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;JimD,&lt;/DIV&gt;&lt;DIV&gt;With the interrupt control process within the erase and program functions, I see that you are creating a local variable (on the stack), and then writing to it using inline assembly.&amp;nbsp; Probably better to directly push the value on the stack.&amp;nbsp; So your functions might look like this.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;byte FlashErasePage( word page)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; volatile byte temp;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp; asm {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TPA&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PSHA&amp;nbsp;&amp;nbsp;&amp;nbsp; // Save current status&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SEI&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Disable interrupts&lt;BR /&gt;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&amp;nbsp;&amp;nbsp; FSTAT = 0x30;&amp;nbsp; // Clear FACCERR &amp;amp; FPVIOL flags&lt;BR /&gt;&amp;nbsp;&amp;nbsp; temp = Page_Erase( page, 0);&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; asm {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PULA&amp;nbsp;&amp;nbsp; // Restore previous status&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TAP&lt;BR /&gt;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&amp;nbsp;&amp;nbsp; return temp;&lt;BR /&gt;}&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;byte FlashProgramByte( word address, byte data)&lt;BR /&gt;{&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; volatile byte temp;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp; asm {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TPA&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PSHA&amp;nbsp;&amp;nbsp;&amp;nbsp; ; Save current status&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SEI&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; Disable interrupts&lt;BR /&gt;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&amp;nbsp;&amp;nbsp; FSTAT = 0x30;&amp;nbsp; // Clear FACCERR &amp;amp; FPVIOL flags&lt;BR /&gt;&amp;nbsp;&amp;nbsp; temp = Program_Byte(address, data);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; asm {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PULA&amp;nbsp;&amp;nbsp; ; Restore previous status&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TAP&lt;BR /&gt;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&amp;nbsp;&amp;nbsp; return temp;&lt;BR /&gt;}&lt;BR /&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;However, since assembly is being used, why not stick entirely with assembly, and also avoid the need for the complex incantations within the macros - well I find them complex.&amp;nbsp; The following might be a possibility.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;byte FlashErasePage( word page)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; volatile byte temp;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp; asm {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TPA&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PSHA&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; Save current status&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SEI&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; Disable interrupts&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LDA&amp;nbsp;&amp;nbsp; #0x30&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; STA&amp;nbsp;&amp;nbsp; FSTAT ; Clear FACCERR &amp;amp; FPVIOL flags&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LDA&amp;nbsp;&amp;nbsp; #0x40 ; ERASE command&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; STA&amp;nbsp;&amp;nbsp; PGM:2&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LDHX&amp;nbsp; page&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; JSR&amp;nbsp;&amp;nbsp; PGM&amp;nbsp;&amp;nbsp; ; Execute RAM routine&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; STA&amp;nbsp;&amp;nbsp; temp&amp;nbsp; ; Return value&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PULA&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; Restore previous status&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TAP&lt;BR /&gt;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&amp;nbsp;&amp;nbsp; return temp;&lt;BR /&gt;}&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;byte FlashProgramByte( word address, byte data)&lt;BR /&gt;{&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; volatile byte temp;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp; asm {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TPA&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PSHA&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; Save current status&amp;nbsp;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SEI&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; Disable interrupts&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LDA&amp;nbsp;&amp;nbsp; #0x30&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; STA&amp;nbsp;&amp;nbsp; FSTAT ; Clear FACCERR &amp;amp; FPVIOL flags&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LDA&amp;nbsp;&amp;nbsp; #0x20 ; PROGRAM command&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; STA&amp;nbsp;&amp;nbsp; PGM:2&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LDHX&amp;nbsp; address&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LDA&amp;nbsp;&amp;nbsp; data&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; JSR&amp;nbsp;&amp;nbsp; PGM&amp;nbsp;&amp;nbsp; ; Execute RAM routine&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; STA&amp;nbsp;&amp;nbsp; temp&amp;nbsp; ; Return value&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PULA&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; Restore previous status&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TAP&lt;BR /&gt;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&amp;nbsp;&amp;nbsp; return temp;&lt;BR /&gt;}&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Finally, on the subject of "padding" delays, a benign, single byte instruction is TST&amp;nbsp; ,X.&amp;nbsp; This provides a delay of 3 cycles for the 9S08.&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Probably not relevant here, but a very simple way to generate much longer delays using 4 bytes&amp;nbsp;-&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp; lda&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;lt;delay_value&amp;gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp; dbnza&amp;nbsp;*&amp;nbsp;&amp;nbsp; ; 4 cycles per loop&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Regards,&lt;/DIV&gt;&lt;DIV&gt;Mac&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;BR /&gt;&lt;BR /&gt;Message Edited by bigmac on &lt;SPAN class="date_text"&gt;2008-02-26&lt;/SPAN&gt; &lt;SPAN class="time_text"&gt;07:28 AM&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 26 Feb 2008 04:03:32 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/Flashing-Made-Simple-Min-Ram-Version-MC9S08QG4/m-p/195718#M15650</guid>
      <dc:creator>bigmac</dc:creator>
      <dc:date>2008-02-26T04:03:32Z</dc:date>
    </item>
  </channel>
</rss>

