📄 flashstr.asm
字号:
movi L6, READ_WRITE_LONG
movi L7, $12345678
call L8, 0, #_WriteSector
endif
endif
ForEver: BR ForEver
if !ROM_ACTIVE
;============================================================================;
; Function : PowerDown/SleepMode ;
; ;
; Registers : L0 : Flags to test against BreakFlags ;
; L1 : Return-PC ;
; L2 : Return-SR ;
; L3 : MCR Shadow ;
;============================================================================;
PowerDown: FRAME L4, L1
ANDNI BreakFlag, AllInt ; Clear BreakFlags
CMPBI L0, TimerInt ; came from WaitGuardMax ?
BE SleepmodeLoop ; No:-->branch
MOV L3, MCRValue ; Load MCRValue
FETCH 16
PowerDownLoop:
ORI L3, 1 << 22 ;
ORI SR, HFLAG ;
MOV MCR, L3 ; Set PowerDownBit := Active
ANDNI L3, 1 << 22 ;
ORI SR, LFLAG ; Lock Interrupts
CMPB BreakFlag, L0 ; PowerDownBreakFlag & Mask
BNE PowerDownFinished ; if != 0 break
ORI SR, HFLAG ;
MOV MCR, L3 ; Set Power-Down now !
ANDNI SR, LFLAG ; Allow Interrupts
BR PowerDownLoop ; if != 0 break
PowerDownFinished:
RET PC, L1
SleepmodeLoop:
ANDNI SR, LFLAG ; Allow Interrupts
ORI SR, LFLAG ; Lock Interrupts
CMPB BreakFlag, L0 ; PowerDownBreakFlag & Mask
BNE PowerDownFinished ; if != 0 break
FETCH 8 ; ensure BNZ below are fetched
STW.IOA 0, 0, ClockDownIO ; switch off clock
BNZ SleepmodeLoop ; not taken - inhibit fetch
BNZ SleepmodeLoop ; not taken - inhibit fetch
BNZ SleepmodeLoop ; not taken - inhibit fetch
BR SleepmodeLoop
;============================================================================;
; Function : TimerInterrupt ;
; ;
; Registers : L0 : Return-PC ;
; L1 : Return-SR ;
; L2 : UpdateFCR Param1 ;
; L3 : UpdateFCR Param2 ;
;============================================================================;
TimerInterruptEntry:
FRAME L4, L0
MOVI L2, TimerEnableBit ; Disable Timer-Interrupt
MOVI L3, 0
UpdateFCR
ORI BreakFlag, TimerInt ; Interruptsource = TimerInt
RET PC, L0
endif
;============================================================================;
; Function : WaitGuard ;
; ;
; Registers : L0 : Flags to test against BreakFlags ;
; L1 : Return-PC ;
; L2 : Return-SR ;
; L3 : Param for PowerDown ;
;============================================================================;
xdef WaitGuardEntry
WaitGuardEntry:
FRAME L4, L1
WaitGuardLoop:
CMPB BreakFlag, L0 ; EVENT(PCEvent) != 0
BE WaitGuardSleepmodeLoop ; No: --> Wait
RET PC, L1
WaitGuardSleepmodeLoop:
ANDNI SR, LFLAG ; Allow Interrupts
ORI SR, LFLAG ; Lock Interrupts
CMPB BreakFlag, L0 ; PowerDownBreakFlag & Mask
BNE WaitGuardFinished ; if != 0 break
FETCH 8 ; ensure BNZ below are fetched
STW.IOA 0, 0, ClockDownIO ; switch off clock
BNZ WaitGuardSleepmodeLoop ; not taken - inhibit fetch
BNZ WaitGuardSleepmodeLoop ; not taken - inhibit fetch
BNZ WaitGuardSleepmodeLoop ; not taken - inhibit fetch
BR WaitGuardSleepmodeLoop ; if == 0 loop
WaitGuardFinished:
RET PC, L1
if !ROM_ACTIVE
;============================================================================;
; Function : WaitGuardMax ;
; ;
; Registers : L0 : Flags to test against BreakFlags ;
; L1 : Timeout-Time ;
; L2 : Return-PC ;
; L3 : Return-SR ;
; L4 : Param for SetTimer/PowerDown ;
;============================================================================;
xdef WaitGuardMaxEntry
WaitGuardMaxEntry:
FRAME L6, L2 ;
CMPB BreakFlag, L0 ; EVENT(PCEvent) != 0
BE WaitForClearGuardMax ; No: --> Branch
RET PC, L2 ; Yes:--> Exit
WaitForClearGuardMax:
CMPI L1, 0 ; DelayTime == 0?
BNE WaitForClearGuardMax1 ; No: --> Branch
RET PC, L2 ; Yes:--> Exit
WaitForClearGuardMax1:
MOV L4, L1 ; DelayTime
CALL L5, 0, #_SetTimer ; Timer
WaitAgain:
MOVI L4, TimerInt+ClearGuardInt ;
CALL L5, PC, #PowerDown - PC ; Wait for Timer or ClearGuard
CMPB BreakFlag, L0 ; EVENT(PCEvent) != 0
BNE WaitGuardMaxExit ; Yes: --> Branch
CMPBI BreakFlag, TimerInt ; TimeOut?
BE WaitAgain ; No -> Wait again
RET PC, L2 ; Exit with TimeOut
WaitGuardMaxExit:
MOVI L4, TimerEnableBit ; Disable Timer-Interrupt
MOVI L5, 0 ;
UpdateFCR
RET PC, L2 ; Exit without TimeOut
;============================================================================;
; Function : DelayBy ;
; ;
; Registers : L0 : DelayTime ;
; L1 : Return-PC ;
; L2 : Return-SR ;
; L3 : Param for SetTimer/PowerDown ;
;============================================================================;
xdef DelayByTrapEntry
DelayByTrapEntry:
FRAME L4, L1
MOV L3, L0
CALL L4, 0, #_SetTimer ;
MOVI L3, TimerInt
CALL L4, PC, #PowerDown - PC ; Wait for Timer Interrupt
RET PC, L1
;============================================================================;
; Function : UpdateBCR ;
; ;
; Registers : L0 : SetBits ;
; L1 : ClearBits ;
; L2 : Return-PC ;
; L3 : Return-SR ;
; L4 : BCRShadowReg ;
;============================================================================;
_UpdateBCRTrapEntry:
FRAME L5, L2
AND L1, BCRShadowReg
OR BCRShadowReg, L0
ANDN BCRShadowReg, L1
MOV L4, BCRShadowReg
ORI SR, HFLAG
MOV BCR, L4
RET PC, L2
endif
;============================================================================;
; Function : Copy2Buffer ;
; ;
; Registers : L0 : DestinationBuffer ;
; L1 : SourceBuffer ;
; L2 : BufferSize ;
; L3 : Return-PC ;
; L4 : Return-SR ;
; L5 : Temp ;
;============================================================================;
xdef _Copy2Buffer
_Copy2Buffer:
FRAME L6, L3
CMPI L2, 0
BE COPY_END
LDHU.N L1, L5, 2 ; SourceBuffer
COPY_LOOP: STHU.N L0, L5, 2 ; DestinationBuffer
ADDI L2, -2
DBNE COPY_LOOP
LDHU.N L1, L5, 2 ; SourceBuffer
COPY_END: RET PC, L3
SEGMENT trapcode
if 0
XDEF _clock
_clock: FRAME L3, L1
ORI SR, $20 ; set high global flag
MOV L0, G7 ; read timer register
RET PC, L1
endif
;***************************************************************************
; Main
;***************************************************************************
SEGMENT InitCode
Main: FRAME L6, L1 ;
ORI SR, HFLAG ;
MOVI SP, Stack ; Set Stack-Pointer SP
ORI SR, HFLAG ;
MOVI UB, StackEnd ; Set Stack Upper Bound
if 1
MOVI L2, $C8001000 ; Address ofAnchorBuffer
LDW.R L2, L4 ; Load MagicNumber
CMPI L4, $12345678 ; is AnchorBuffer?
BNE SkipAnchorBlock ; No: --> branch
LDW.D L2, L4, 20 ; Load PrescalerValue
SUM L2, PC, #PrescalerValue - PC;
STW.R L2, L4 ; Store to SysDefSegment
SkipAnchorBlock:
endif
SUM L2, PC, #PrescalerValue - PC;
if defined(SAMS3)
LDW.R L2, L4 ; Load PrescalerValue
ADDI L4, (-4)<<16 ;
STW.P L2, L4 ; Store PrescalerValue - 4Mhz
else
LDW.P L2, L4 ; Load PrescalerValue
endif
FETCH 4 ;
ORI SR, HFLAG ;
MOV TPR, L4 ; Set PrescalerRegister
ORI SR, HFLAG ;
MOVI TR, 0 ; Set TimerRegister
LDD.P L2, L4 ; Load BCRValue, MCRValue
ORI SR, HFLAG ;
MOV BCR, L4 ; set BCR
MOV BCRValue, L4 ; Copy BCRValue into ShadowReg
MASK MCRValue, MCRValue, MCR_MASK; Keep Bits from Rom
ANDNI L5, MCR_MASK ; Keep Bits from SysDef
OR L5, MCRValue ;
ORI L5, PCMCIA_OUTVOLTAGE ; Set PCMCIA-OutputVoltage
; to RailToRail
ANDNI L5, PCMCIA_THRESHOLD ; Set PCMCIA-Threshold
; according to VDD=3.3V
ORI SR, HFLAG ;
MOV MCR, L5 ; set MCR
MOV MCRValue, L5 ; Copy MCRValue into ShadowReg
MOVI G7, G7Base ; Set new RomPtr
MOVI G8, G8Base ; Set new IRAMPtr
MOVI L3, Stack ; L3 = Stack Begin
ANDNI L3, ~$1FC ; Frame Pointer for Stack
SHLI L3, 23 ; LockBit cleared
SUM L2, PC, _main - PC ; Return-Address := _main
ORI L2, 1 ; return with supervisormode
RET PC, L2 ; --> _main
SEGMENT SysDefSegment
SysDefBaseAddress:
DownLoadMode: D.BU 0 ; 0 = DPR, 1 = EPROM
BoardType: D.BU 0 ; 2 = Reload
BoardRevisionNo: D.BU 0 ;
SysDriverPriority: D.BU 0 ;
PrescalerValue: D.WU 0 ;
BCRValue1: D.WU 0 ;
MCRValue1: D.WU 0 ;
FCRValue1: D.WU 0 ;
END Main ; end of startup code
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -