📄 samsung_old.asm
字号:
MOVI L4, $FFFFFFFF ; WriteValue
ClearSectorLoop:
STW.R L0, L4 ; Write to Flash
ADDI L3, -4 ; LoopCount != 0?
BNE ClearSectorLoop ; No: --> branch
RET PC, L1 ;
if (ROM_ACTIVE==0) || defined(INF3)
;============================================================================;
; Function : ReadDeviceID ;
; ;
; Registers : L0 : SectorNo / DeviceID ;
; L1 : Return-PC ;
; L2 : Return-SR ;
; L3 : Opc ;
; L4 : alternate ReturnAddr ;
; L5 : Sector# --> ChipSelect ;
;============================================================================;
XDEF _ReadDeviceID
_ReadDeviceID:
FRAME L6, L1
MOVI L3, READ_DEVICE_ID_OPC ; Par1: Opc
SUM L4, PC, #ReadDeviceIdContinue-PC+1
; Par2: alternate ReturnAddr
MOV L5, L0 ; Par3:Sector# -> ChipSelect
ChipSelect
if defined(INF3)
ReadStatus ; to Reset ID-counter
; (bug in Samsung Chip)
MOV L5, L0 ; Par3:Sector# -> ChipSelect
ChipSelect
endif
ReadDeviceIdContinue: ; Par1: Opc
MOV L4, L0 ; Par2: Sector#
; Par3: ChipSelect
SetOpc
; Par1: ChipSelect
ReadDeviceId
MOV L3, L5 ; Save DeviceId
MOV L5, L0 ; Par1: Sector#
FlashIdle
MOV L0, L3 ; L0 = DeviceId
RET PC, L1 ;
endif
if ROM_ACTIVE==0
;============================================================================;
; Function : RecalculateCRC ;
; ;
; Registers : L0 : BufferAddress ;
; L1 : BufferSize-4 ;
; L2 : ChipSelect ;
; L3 : Return-PC ;
; L4 : Return-SR ;
; L5 : Data ;
; L6 : Data ;
;============================================================================;
_RecalculateCRC:
FRAME L7, L3 ;
ORI L2, FLASH_INHIBIT|FLASH_SM_ENABLE
STW.IOA 0, 0, SM_RESET_PARITY ; Clear SM Paritybytes
LDW.P L0, L5 ; first read
LDW.P L0, L6 ; first read
ADDI L1, -8 ; decrement counter
BE CRCLastBytes ;
CRCLoop: STW.R L2, L5 ;
LDW.P L0, L5 ;
ADDI L1, -8 ; decrement counter
STW.R L2, L6 ;
DBNE CRCLoop ; ready?
LDW.P L0, L6 ;
CRCLastBytes: ;
STW.R L2, L5 ; store last bytes
STW.R L2, L6 ; store last bytes
LDHU.N L0, L5, 2 ; Load Paritybytes from Buffer
LDHU.N L0, L6, 2 ;
STHU.D L2, L5, 0 ; Store Paritybytes b3, b2
STHU.D L2, L6, 0 ; Store Paritybytes b1, b0
RET PC, L3 ;
;============================================================================;
; Function : EraseBlockRom ;
; ;
; Registers : L0 : SectorNo / Status ;
; L1 : Flags ;
; L2 : Return-PC ;
; L3 : Return-SR ;
; L4 : FlashMemAddres ;
; L5 : Temp ;
;============================================================================;
_EraseBlockRom:
FRAME L7, L2
MOVI L4, ERASE_BLOCK_OPC ; Par1: Opc
SUM L5, PC, #AbortErase-PC+1 ; BackGroundErase && PC_EVENT
; Par2: alternate ReturnAddr
MOV L6, L0 ; Par3: Sector# -> ChipSelect
ChipSelect
MOV L0, L5 ; ActPage#
; Par2: Sector#
; Par3: ChipSelect
SetOpc
; Par1: Opc
; Par2: Sector#
; Par3: ChipSelect
SetAddr
CMPBI L1, SKIP_ERASE ; MultiPlane Erase?
BNE ExitErase ; Yes: --> branch
MOVI L4, ERASE_BLOCK1_OPC ; Par1: Opc
MOV L5, L0 ; Par2: Sector#
; Par3: ChipSelect
SetOpc
MOV L4, L6 ; Save ChipSelect
CMPBI L1, OVERLAPPED ; Overlapped Erase?
DBNE EraseOverlapped ; Yes: --> branch
MOV L6, L0 ; Par1: Sector#
WaitForReady
MOV L6, L4 ; Par1: ChipSelect
ReadStatus
MOV L4, L6 ; Save Status
MOV L6, L0 ; Sector#
FlashIdle
MOV L0, L4 ; L0 = Status
RET PC, L2 ;
EraseOverlapped:
; Par1: Sector#
SetOverlapped
MOVI L6, -1 ; Par1: -1 --> Enable IO1 Int
WaitForReady
ExitErase:
MOVI L0, 0 ; Status = NoError
RET PC, L2 ;
AbortErase:
MOVI L0, -1 ; Status = Aborted
RET PC, L2 ;
;============================================================================;
; Function : ReadOverheadFromFlash ;
; ;
; Description: Reads 32 Bit OverheadArea from a sector ;
; ;
; Registers : L0 : SectorNo / EraseCount ;
; L1 : Return-PC ;
; L2 : Return-SR ;
; L3 : FlashMemAddres ;
; L4 : Temp ;
;============================================================================;
_ReadOverheadFromFlash:
FRAME L6, L1
MOVI L3, READ_OVERHEAD_OPC ; Par1: Opc
SUM L4, PC, #ReadOverheadWithinSamePage-PC+1
; Par2: alternate ReturnAddr
MOV L5, L0 ; Sector# -> ChipSelect
ChipSelect
MOV L0, L4 ; ActPage#
; Par1: Opc
; Par2: Sector#
; Par3: ChipSelect
SetOpc
; Par1: Opc
; Par2: Sector#
; Par3: ChipSelect
SetAddr
MOVI L3, READ_CONFIRM_OPC|DONT_SAVE_OPC
; Par1: Opc
MOV L4, L0 ; Par2: Sector#
; Par3: ChipSelect
SetOpc
PollForReady ; Par1: ChipSelect
ReadOverheadBehindPoll:
; Par1: Bufferaddr not used
MOVI L4, 0 ; Par2: Flags no store in Buffer
ReadWord ; Par3: ChipSelect
MOV L3, L5 ; Save ResultWord
MOV L5, L0 ; Par1: Sector#
FlashIdle
MOV L0, L3 ; L0 = ResultWord
RET PC, L1 ;
ReadOverheadWithinSamePage:
MOV L0, L4 ; ActPage#
MOVI L3, RANDOM_DATA_OUTPUT_OPC|DONT_SAVE_OPC
; Par1: Opc
; Par2: Sector#
; Par3: ChipSelect
SetOpc
; Par1: Opc
; Par2: Sector#
; Par3: ChipSelect
SetAddr
MOVI L3, RANDOM_DATA_OUTPUT1_OPC|DONT_SAVE_OPC
; Par1: Opc
; Par2: Sector#
; Par3: ChipSelect
SetOpc
BR ReadOverheadBehindPoll ;
;============================================================================;
; Function : WriteOverhead ;
; ;
; Registers : L0 : SectorNo / Status ;
; L1 : Overhead ;
; L2 : Flags ;
; L3 : Return-PC ;
; L4 : Return-SR ;
; L5 : Opc ;
; L6 : Sector# ;
; L7 : ChipSelect ;
;============================================================================;
_WriteOverhead:
FRAME L8, L3
MOVI L5, WRITE_OVERHEAD_OPC ; Par1: Opc
SUM L6, PC, #WriteOverheadWithinSamePage-PC+1
; Par2: alternate ReturnAddr
MOV L7, L0 ; Sector# -> ChipSelect
ChipSelect
MOV L0, L6 ; ActPage#
; Par2: Sector#
; Par3: ChipSelect
SetOpc
; Par1: Opc
; Par2: Sector#
; Par3: ChipSelect
SetAddr
WriteOverheadWord:
MOV L5, L2 ; Par1: Flags
MOV L6, L1 ; Par2: Word
; Par3: ChipSelect
WriteWord
MOV L2, L5 ; Flags may be modified
CMPBI L2, SKIP_PROGRAM ; for multiSector pages
BNE WriteOverheadExit ;
MOVI L5, PROGRAM_SECTOR_OPC ; Par1: Opc
MOV L6, L0 ; Par2: Sector#
; Par3: ChipSelect
SetOpc
MOV L5, L7 ; Save ChipSelect
CMPBI L2, OVERLAPPED ; Overlapped Erase?
DBNE WriteOverheadOverlapped ; Yes: --> branch
MOV L7, L0 ; Par1: Sector#
WaitForReady
MOV L7, L5 ; Par1: ChipSelect
ReadStatus
MOV L5, L7 ; Save Status
MOV L7, L0 ; Par1: Sector#
FlashIdle
MOV L0, L5 ; L0 = Status
RET PC, L3 ;
WriteOverheadOverlapped:
; Par1: Sector#
SetOverlapped
MOVI L7, -1 ; Par1: -1 --> Enable IO1 Int
WaitForReady
WriteOverheadExit:
MOVI L0, 0 ; Status = NoError
RET PC, L3 ;
WriteOverheadWithinSamePage:
MOV L0, L6 ; ActPage#
MOVI L5, RANDOM_DATA_INPUT_OPC|DONT_SAVE_OPC
; Par1: Opc
; Par2: Sector#
; Par3: ChipSelect
SetOpc
; Par1: Opc
; Par2: Sector#
; Par3: ChipSelect
SetAddr
BR WriteOverheadWord
;============================================================================;
; Function : WriteSector ;
; ;
; Registers : L0 : SectorNo / Status ;
; L1 : BufferAddress ;
; L2 : ChunkTableAddress ;
; L3 : Flags ;
; L4 : Overhead ;
; L5 : Return-PC ;
; L6 : Return-SR ;
; L7 : BufferAddress ;
; L8 : Opc/ChunkLength ;
; L9 : Sector#/Flags ;
; L10: ChipSelect ;
;============================================================================;
_WriteSector:
FRAME L11, L5
MOVI L8, WRITE_SECTOR_OPC ; Par1: Opc
SUM L9, PC, #WriteWithinSamePage-PC+1
; Par2: alternate ReturnAddr
MOV L10, L0 ; Par3: Sector# -> ChipSelect
ChipSelect
MOV L0, L9 ; ActPage#
; Par1: Opc
; Par2: Sector#
; Par3: ChipSelect
SetOpc
; Par1: Opc
; Par2: Sector#
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -