|
#include <Def2181.h> #include "constant.h"
.global FLASH_ByteWrite; .global FLASH_ByteRead; .global FLASH_Erase; .global BDMA_BootLoader;
.GLOBAL BDMA_Addr_Hi; .GLOBAL BDMA_Addr_Lo; .GLOBAL BDMA_ControlMask; .GLOBAL BDMA_ReadControlMask; .GLOBAL FLASH_XferWord; .GLOBAL BDMA_XferLength;
.section/data seg_data1; .GLOBAL BDMA_XferSpace; .VAR/CIRC BDMA_XferSpace[0x0800]; { 2048 16 bit locations }
.VAR BDMA_Addr_Hi; .VAR BDMA_Addr_Lo; .VAR BDMA_ReadControlMask = 0x0001; .VAR BDMA_ControlMask = 0x0001; {16 bit DM load from BM run during BDMA} .VAR FLASH_XferWord; .VAR BDMA_XferLength; .VAR BDMA_Ready = 1; {1=transfer complete, 0=transfer incomplete} .VAR BDMA_TempStorage;
.section/pm seg_code; FLASH_ByteRead: { set the BMWAIT value to 7 } AR = 0xFFFF; dm(Prog_Flag_Comp_Sel_Ctrl) = AR;
AR = 0xFFFF; DM(0x3FFE) = AR; { CHANGE WAIT STATE TO MAX WAITS } NOP; imask = 0x0008; ena ints;
{ send 0x00XX to address 0xXXXXXX } ar = FLASH_XferWord; dm(BDMA_Internal_Address) = ar; ar = dm(BDMA_Addr_Lo); dm(BDMA_External_Address) = ar;
{ mask off the top 8 bits } ar = DM(BDMA_Control); Ay0 = 0x00FF; ar = ar and ay0; DM(BDMA_Control) = AR; ar = dm(BDMA_Addr_Hi); /* ay0 = 0x0003; */ ay0 = dm(BDMA_ReadControlMask); SE = 8; SR = LSHIFT AR(LO); AR = SR0; ar = ar or ay0; dm(BDMA_Control) = ar;
ar = 0x0001; dm(BDMA_Word_Count) = ar; idle; imask = 0x001; ena ints;
rts;
{****************************************************************************** * FLASH_ByteWrite * * REGISTER USAGE SUMMARY: * input : none * update : none * output : none * destroy: * keep : none * memory : none * calls : none * ******************************************************************************} .section/pm seg_code; FLASH_ByteWrite: { set the BMWAIT value to 7 } AR = 0xFFFF; dm(Prog_Flag_Comp_Sel_Ctrl) = AR;
AR = 0xFFFF; DM(0x3FFE) = AR; { CHANGE WAIT STATE TO MAX WAITS } NOP;
imask = 0x0008; ena ints;
{ save the transfer word } ax0 = dm(FLASH_XferWord); { send 0x00AA to address 0x5555} { ar = FLASH_00AA; dm(FLASH_XferWord) = ar; ar = FLASH_XferWord; dm(BDMA_Internal_Address) = ar; ar = FLASH_5555_LO; dm(BDMA_External_Address) = ar; ar = FLASH_5555_HI; dm(BDMA_Control) = ar; ar = 0x0001; dm(BDMA_Word_Count) = ar; idle; } {send 0x0055 to address 0x2AAA} { ar = FLASH_0055; dm(FLASH_XferWord) = ar; ar = FLASH_XferWord; dm(BDMA_Internal_Address) = ar; ar = FLASH_2AAA_LO; dm(BDMA_External_Address) = ar; ar = FLASH_2AAA_HI; dm(BDMA_Control) = ar; ar = 0x0001; dm(BDMA_Word_Count) = ar; idle; } { send 0x00AA to address 0x5555 } { send 0x0055 to addresss 0x2AAA } call FLASH_Begin555_AA_2AAA_55;
{send 0x00A0 to address 0x5555} ar = FLASH_00A0; dm(FLASH_XferWord) = ar; ar = FLASH_XferWord; dm(BDMA_Internal_Address) = ar; ar = FLASH_5555_LO; dm(BDMA_External_Address) = ar; ar = FLASH_5555_HI; dm(BDMA_Control) = ar; ar = 0x0001; dm(BDMA_Word_Count) = ar; idle; { send 0x00XX to address 0xXXXXXX } dm(FLASH_XferWord) = ax0; ar = FLASH_XferWord; dm(BDMA_Internal_Address) = ar; ar = dm(BDMA_Addr_Lo); dm(BDMA_External_Address) = ar; ar = dm(BDMA_Addr_Hi); ay0 = 0x0007; SE = 8; SR = LSHIFT AR (LO); AR = SR0; ar = ar or ay0; dm(BDMA_Control) = ar; ar = 0x0001; dm(BDMA_Word_Count) = ar; idle; cntr = 0x00FF; do FLASH_CommandWrite0 until ce; nop; cntr = 0x00FF; do FLASH_CommandWrite1 until ce; nop; nop; FLASH_CommandWrite1: nop; nop; FLASH_CommandWrite0: nop; imask = 0x001; ena ints; rts;
{****************************************************************************** * BDMA_Resolve * * REGISTER USAGE SUMMARY: * input : none * update : none * output : none * destroy: AX0, AY0, AR * keep : none * memory : none * calls : none * ******************************************************************************} .section/pm seg_code; FLASH_Erase: { set the BMWAIT value to 7 } AR = 0xFFFF; dm(Prog_Flag_Comp_Sel_Ctrl) = AR;
AR = 0xFFFF; DM(0x3FFE) = AR; { CHANGE WAIT STATE TO MAX WAITS } NOP; imask = 0x0008; ena ints;
{ send 0x00AA to address 0x5555} { ar = FLASH_00AA; dm(FLASH_XferWord) = ar; ar = FLASH_XferWord; dm(BDMA_Internal_Address) = ar; ar = FLASH_5555_LO; dm(BDMA_External_Address) = ar; ar = FLASH_5555_HI; dm(BDMA_Control) = ar; ar = 0x0001; dm(BDMA_Word_Count) = ar; idle; } {send 0x0055 to address 0x2AAA} { ar = FLASH_0055; dm(FLASH_XferWord) = ar; ar = FLASH_XferWord; dm(BDMA_Internal_Address) = ar; ar = FLASH_2AAA_LO; dm(BDMA_External_Address) = ar; ar = FLASH_2AAA_HI; dm(BDMA_Control) = ar; ar = 0x0001; dm(BDMA_Word_Count) = ar; idle;} { send 0x00AA to address 0x5555 } { send 0x0055 to addresss 0x2AAA } call FLASH_Begin555_AA_2AAA_55;
{send 0x0080 to address 0x5555} ar = 0x0080; dm(FLASH_XferWord) = ar; ar = FLASH_XferWord; dm(BDMA_Internal_Address) = ar; ar = FLASH_5555_LO; dm(BDMA_External_Address) = ar; ar = FLASH_5555_HI; dm(BDMA_Control) = ar; ar = 0x0001; dm(BDMA_Word_Count) = ar; idle;
{ send 0x00AA to address 0x5555 } { ar = FLASH_00AA; dm(FLASH_XferWord) = ar; ar = FLASH_XferWord; dm(BDMA_Internal_Address) = ar; ar = FLASH_5555_LO; dm(BDMA_External_Address) = ar; ar = FLASH_5555_HI; dm(BDMA_Control) = ar; ar = 0x0001; dm(BDMA_Word_Count) = ar; idle; }
{send 0x0055 to address 0x2AAA} { ar = FLASH_0055; dm(FLASH_XferWord) = ar; ar = FLASH_XferWord; dm(BDMA_Internal_Address) = ar; ar = FLASH_2AAA_LO; dm(BDMA_External_Address) = ar; ar = FLASH_2AAA_HI; dm(BDMA_Control) = ar; ar = 0x0001; dm(BDMA_Word_Count) = ar; idle; }
{ send 0x00AA to address 0x5555 } { send 0x0055 to addresss 0x2AAA } call FLASH_Begin555_AA_2AAA_55;
{ send 0x0010 to address 0x5555} ar = 0x0010; dm(FLASH_XferWord) = ar; ar = FLASH_XferWord; dm(BDMA_Internal_Address) = ar; ar = FLASH_5555_LO; dm(BDMA_External_Address) = ar; ar = FLASH_5555_HI; dm(BDMA_Control) = ar; ar = 0x0001; dm(BDMA_Word_Count) = ar; idle;
{ about 10 seconds of delay here } cntr = 0x3FFF; do FLASH_EraseDelay0 until ce; nop; cntr = 0x2FFF; do FLASH_EraseDelay1 until ce; nop; nop; FLASH_EraseDelay1: nop; nop; FLASH_EraseDelay0: nop;
imask = 0x001; ena ints;
rts;
{****************************************************************************** * BDMA_BootLoader: * * REGISTER USAGE SUMMARY: * input : none * update : none * output : none * destroy: ALL * keep : none * memory : none * calls : none * ******************************************************************************} .section/pm seg_code; BDMA_BootLoader: { enter not pressed start BDMA load } { by loading 32 words starting from 0x0400 } { the begining of the unprotected flash space } { if the EZ-KIT is default from the factory...} { there will be a monitor program located here } { if the user has overwritten it, there will be a } { user program located here. } { disable all interrupts } IMASK = 0x0000; { clear all pending interrupts } IFC = 0x00FF; AR = 0xFFFF; DM(0x3FFE) = AR; { CHANGE WAIT STATE TO MAX WAITS } NOP; { set BWCOUNT to 32 } { BDIR, BMPAGE, BEAD, BIAD, BTYPE = 0 } { BCR = 1 } { BMWAIT = 7 } ax0 = 0x0000; dm(BDMA_Internal_Address) = ax0; { load to PM 0x000000 } ax0 = 0x0000; dm(BDMA_External_Address) = ax0; { load from 0x01000 holds bits 0 - 13 } {ax0 = 0x0100;} {ax0 = b#0000010001000;} ax0 = b#0000000100001000; dm(BDMA_Control) = ax0; { load from 0x04000 upper byte is bits 14 - 21 } { set the BMWAIT value to 7 } ax0 = 0xFFFF; dm(Prog_Flag_Comp_Sel_Ctrl) = ax0;
{ load BDMA count which will start the transfer } ax0 = 32; dm(BDMA_Word_Count) = ax0;
{enable BDMA interrupt } IMASK = 0x008; nop; idle; nop; {should never get this far } jump 0x000000; {jump and start executing the loader } rts;
.global BDMA_DoIt; .section/pm seg_code; BDMA_DoIt: dm(BDMA_Internal_Address) = ar; dm(BDMA_External_Address) = ax1; dm(BDMA_Control) = ay0; dm(BDMA_Word_Count) = ay1; idle; rts;
.global FLASH_Begin555_AA_2AAA_55; .section/pm seg_code; FLASH_Begin555_AA_2AAA_55: { send 0x00AA to address 0x5555} ar = FLASH_00AA; dm(FLASH_XferWord) = ar; ar = FLASH_XferWord; ax1 = FLASH_5555_LO; ay0 = FLASH_5555_HI; ay1 = 0x0001; call BDMA_DoIt;
{send 0x0055 to address 0x2AAA} ar = FLASH_0055; dm(FLASH_XferWord) = ar; ar = FLASH_XferWord; ax1 = FLASH_2AAA_LO; ay0 = FLASH_2AAA_HI; ay1 = 0x0001; call BDMA_DoIt; rts;
|