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

📄 samsung_old.asm

📁 Utils and test SD card read write cycles
💻 ASM
📖 第 1 页 / 共 5 页
字号:
						 ; Par3: ChipSelect
	    SetAddr
WriteChunks:
	    MOV      L7, L1                      ; BufferAddress
	    MOV      L9, L3                      ; Flags
WChunkLoop: LDBU.N   L2, L8, 1                   ; ChunkLength
	    CMPI     L8, 0                       ; ChunkLength == 0?
	    BE       ExitWriteLoop               ; Yes: --> branch
	    WriteChunk
	    BR       WChunkLoop                  ; Loop again
ExitWriteLoop:
	    MOV      L8, L3                      ; Par1: Flags
	    MOV      L9, L4                      ; Par2: Word
						 ; Par3: ChipSelect
	    WriteWord
	    MOV      L3, L8                      ; Flags may be modified
	    CMPBI    L3, SKIP_PROGRAM            ; for multiSector pages
	    BNE      WriteExit                   ;
	    MOVI     L8, PROGRAM_SECTOR_OPC      ; Par1: Opc
	    MOV      L9, L0                      ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetOpc
	    MOV      L8, L10                     ; Save ChipSelect
	    CMPBI    L3, OVERLAPPED              ; Overlapped Write?
	    DBNE     WriteOverlapped             ; Yes: --> branch
	    MOV      L10, L0                     ; Par1: Sector#
	    WaitForReady
	    MOV      L10, L8                     ; Par1: ChipSelect
	    ReadStatus
	    MOV      L8, L10                     ; Save Status
	    MOV      L10, L0                     ; Par1: Sector#
	    FlashIdle
	    MOV      L0, L8                      ; L0 = Status
	    RET      PC, L5
WriteOverlapped:
						 ; Par1: Sector#
	    SetOverlapped
	    MOVI     L10, -1                     ; Par1: -1 --> Enable IO1 Int
	    WaitForReady
WriteExit:  MOVI     L0, 0                       ; Status = NoError
	    RET      PC, L5                      ;

WriteWithinSamePage:
	    MOV      L0, L9                      ; ActPage#
	    MOVI     L8, RANDOM_DATA_INPUT_OPC|DONT_SAVE_OPC
						 ; Par1: Opc
						 ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetOpc
						 ; Par1: Opc
						 ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetAddr
	    BR       WriteChunks

;============================================================================;
; Function   : ProgramPage    						     ;
;									     ;
; Registers  : L0 : Opcode                                                   ;
;              L1 : Sector#                                                  ;
;              L2 : ChipSelect                                               ;
;              L3 : Return-PC						     ;
;	       L4 : Return-SR						     ;
;              L5 : SectorNo / Status                                        ;
;============================================================================;

_ProgramPage:
	    FRAME    L8, L3
	    MOVD     L5, L0                      ; Par1: Opc
						 ; Par2: Sector#
	    MOV	     L7, L2                      ; Par3: ChipSelect
	    SetOpc
	    MOV      L7, L1                      ; Par1: Sector#
	    WaitForReady
	    RET      PC, L3

;============================================================================;
; Function   : EraseOverlapped						     ;
;									     ;
; Registers  : L0 : Opcode                                                   ;
;              L1 : Sector#                                                  ;
;              L2 : ChipSelect                                               ;
;              L3 : Return-PC						     ;
;	       L4 : Return-SR						     ;
;              L5 : SectorNo / Status                                        ;
;============================================================================;

_EraseOverlapped:
	    FRAME    L8, L3
	    MOVD     L5, L0                      ; Par1: Opc
						 ; Par2: Sector#
	    MOV	     L7, L2                      ; Par3: ChipSelect
	    SetOpc
	    MOV      L7, L1			 ; Par1: Sector#
	    SetOverlapped
	    MOVI     L7, -1                      ; Par1: -1 --> Enable IO1 Int
	    WaitForReady
	    RET      PC, L3

;============================================================================;
; Function   : ReadSectorRom   						     ;
;									     ;
; Registers  : L0 : SectorNo / Status                                        ;
;              L1 : BufferAddress                                            ;
;              L2 : ChunkTableAddress                                        ;
;              L3 : Flags                                                    ;
;              L4 : Return-PC						     ;
;	       L5 : Return-SR						     ;
;              L6 : BufferAddress                                            ;
;	       L7 : Opc/ChunkLength     				     ;
;	       L8 : Sector#/Flags                                            ;
;	       L9 : ChipSelect						     ;
;============================================================================;

_ReadInvSectorRom:
	    FRAME    L10, L4
	    MOVI     L7, READ_OVERHEAD_ECC_OPC   ; Par1: Opc
	    BR       ReadSector1Rom

_ReadSectorRom:
	    FRAME    L10, L4
	    MOVI     L7, READ_SECTOR_OPC         ; Par1: Opc
ReadSector1Rom:
	    CMPBI    L3, READ_SKIP_OPC           ; Skip SetOpc/SetAddr?
	    BE       ReadWithOpcode              ; No:--> branch
	    MOV      L9, L0                      ; Par3: Sector# -> ChipSelect
	    ChipSelectSkipOpc
	    MOV      L0, L8                      ; ActPage#
	    BR       ReadPoll                    ;
ReadWithOpcode:
	    SUM      L8, PC, #ReadWithinSamePage-PC+1
						 ; Par2: alternate ReturnAddr
	    MOV      L9, L0                      ; Par3: Sector# -> ChipSelect
	    ChipSelect
	    MOV      L0, L8                      ; ActPage#
						 ; Par1: Opc
						 ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetOpc
						 ; Par1: Opc
						 ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetAddr
	    MOVI     L7, READ_CONFIRM_OPC|DONT_SAVE_OPC
						 ; Par1: Opc
	    MOV      L8, L0			 ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetOpc
ReadPoll:   PollForReady                         ; Par1: ChipSelect
ReadBehindPoll:
	    MOV      L6, L1                      ; Par1: BufferAddress
	    MOV      L8, L3                      ; Par3: Flags
RChunkLoop: LDBU.N   L2, L7, 1                   ; Par2: ChunkLength
	    CMPI     L7, 0                       ; ChunkLength == 0?
	    BE       ExitReadLoop                ; Yes: --> branch
	    ReadChunk
	    BR       RChunkLoop                  ; Loop again
ExitReadLoop:
	    MOV      L7, L6			 ; Par1: BufferAddress
	    MOV	     L8, L3			 ; Par2: Flags
						 ; Par3: ChipSelect
	    MOV      L6, L9                      ; save ChipSelect
	    ReadWord
	    CMPBI    L3, READ_AHEAD              ; Read Next Sector?
	    BE       ReadSkipIdle                ; No:--> branch
	    MOV      L9, L0                      ; Par1: Sector#
	    FlashIdle
						 ; Result: NextSector#
	    MOV	     L9, L6 	 		 ; Par2: ChipSelect
	    NextSector
	    MOVI     L7, READ_SECTOR_OPC         ; Par1: Opc
						 ; Par2: Sector#+1
						 ; Par3: ChipSelect
	    SetOpc
						 ; Par1: Opc
						 ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetAddr
						 ; Result: NextSector#
						 ; Par2: ChipSelect
	    NextSector
	    MOVI     L7, READ_CONFIRM_OPC|DONT_SAVE_OPC
						 ; Par1: Opc
						 ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetOpc
ReadSkipIdle:
	    CMPBI    L3, READ_SKIP_IDLE          ; Skip FlashIdle?
	    BNE      ExitRead                    ; Yes:--> branch
	    MOV      L9, L0                      ; Par1: Sector#
	    FlashIdle
ExitRead:   RET      PC, L4

ReadWithinSamePage:
	    MOV      L0, L8                      ; ActPage#
	    MOVI     L7, RANDOM_DATA_OUTPUT_OPC|DONT_SAVE_OPC
						 ; Par1: Opc
						 ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetOpc
						 ; Par1: Opc
						 ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetAddr
	    MOVI     L7, RANDOM_DATA_OUTPUT1_OPC|DONT_SAVE_OPC
						 ; Par1: Opc
						 ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetOpc
	    BR       ReadBehindPoll              ;

;============================================================================;
; Function   : CopyPageRom						     ;
;									     ;
; Registers  : L0 : DestinationSector#                                       ;
;              L1 : SourceSector#                                            ;
;              L2 : OverheadValue                                            ;
;              L3 : Flags                                                    ;
;              L4 : Return-PC						     ;
;	       L5 : Return-SR						     ;
;              L6 : Opc                                                      ;
;              L7 : Sector#                                                  ;
;              L8 : ChipSelect                                               ;
;============================================================================;

if !(defined(SAMS5) || defined(SAMS6) || defined(SAMS7)) || (NORTK==0)
_CopyPageRom:
	    FRAME    L9, L4
if CMD_COUNT
LDW.D PC, L8, #_CopyPageCmd-PC
ADDI  L8, 1
STW.D PC, L8, #_CopyPageCmd-PC
endif
	    MOVI     L6, READ_COPYBACK_OPC       ; Par1: Opc
						 ; Par2: alternate ReturnAddr
	    MOV      L8, L1                      ; Par3: Sector# -> ChipSelect
	    ChipSelect
						 ; Par1: Opc
						 ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetOpc
						 ; Par1: Opc
						 ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetAddr
	    MOVI     L6, READ_COPYBACK_CONFIRM_OPC
						 ; Par1: Opc
						 ; Par2: Sector#
						 ; Par3: ChipSelect
	    SetOpc
	    PollForReady                         ; Par1: ChipSelect
	    MOVI     L6, RANDOM_DATA_INPUT1_OPC  ; Par1: Opc
	    MOV      L7, L0			 ; Par2: Sector#-->Page#
						 ; Par3: ChipSelect
	    SectorToPage
	    MOV      L0, L7                      ; Save Page#
						 ; Par2: Page#
						 ; Par3: ChipSelect
	    SetOpc
						 ; Par1: Opc
						 ; Par2: Page#
						 ; Par3: ChipSelect
	    SetAddr
	    MOVI     L6, PROGRAM_SECTOR_OPC      ; Par1: Opc
	    MOV      L7, L0                      ; Par2: Page#
						 ; Par3: ChipSelect
	    SetOpc
	    MOV      L6, L8                      ; Save ChipSelect
	    CMPBI    L3, OVERLAPPED              ; Overlapped Write?
	    DBNE     CopyPageOverlapped          ; Yes: --> branch
	    MOV      L8, L0                      ; Par1: Page#
	    WaitForReady
	    MOV      L8, L6                      ; Par1: ChipSelect
	    ReadStatus
	    MOV      L6, L8                      ; Save Status
	    MOV      L8, L0                      ; Par1: Sector#
	    FlashIdle
	    MOV      L0, L6                      ; L0 = Status
	    RET      PC, L4

CopyPageOverlapped:
						 ; Par1: Sector#
	    SetOverlapped
	    MOVI     L8, -1                      ; Par1: -1 --> Enable IO1 Int
	    WaitForReady
	    MOVI     L0, 0                       ; Status = NoError
	    RET      PC, L4                      ;
endif

;============================================================================;
; Function   : PartialCopyPage						     ;
;									     ;
; Registers  : L0 : DestinationSector#                                       ;
;              L1 : SourceSector#                                            ;
;              L2 : OverheadValue                                            ;
;              L3 : PageMask                                                 ;
;              L4 : Flags                                                    ;
;              L5 : Return-PC						     ;
;	       L6 : Return-SR						     ;
;              L7 : PageMask                                                 ;
;              L8 : Opc                                              

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -