⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flashstr.asm

📁 Utils and test SD card read write cycles
💻 ASM
📖 第 1 页 / 共 2 页
字号:
   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 + -