📄 samsung_old.asm
字号:
; 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 + -