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

📄 smc_dtc_code0.fsm

📁 HID-Ukey底层源码实现(st72651芯片) windows上层驱动
💻 FSM
字号:

;===================================================================
;
;			SMART MEDIA CARD
;
;===================================================================

;--------------
; INIT SMC MODE
;--------------

:init_smc_play_mode
;------------------
LD	MSB 0
LD	LSB 15
LD	DDR_PARALLEL

LD	OR_PARALLEL

LD	LSB 10
LD	DR_PARALLEL

LD	LSB 6
LD	DDR_MPEG

LD	OR_MPEG
NOP

LD	LSB 0
LD	DR_MPEG 

LD	LSB 9		; DATA_FLASH Port driven by FCI  
LD	MSB 0		; data_flash port = intput
LD	CTRL_FCI	; PARALLEL Port driven by FCI

LD	LSB 1
LD	MSB 0
LD	X		; X<=1

LD	MASK		; MASK = 1 ( used for XOR fct )

STATUS	STOP		; end of INIT

;---------------------
; SMC_DTC_Dummy_Write
;---------------------

LD	MSB 0
LD	LSB 9		; DATA_FLASH Port driven by FCI  
LD	CTRL_FCI	; PARALLEL Port driven by FCI

LD	LSB 0
LD	ADR_BUFFER01
LD	LSB 14
LD	MSB 15
LD	ADR_BUFFER00
LD	A DATA_BUFFER0
LD	CMP00		; load the even/odd bit
LD	LSB 15
LD	MSB 15
LD	MASK
LD	ADR_BUFFER00
LD	A DATA_BUFFER0
LD	Y		; load number of pages
DECY

:dummy_write
;-----------
LD	A CMP00
XOR
LD	CMP00		; change the parity bit
BCLR1
JP :wait_buffer1_full

:wait_buffer0_full
LD	A BUFFER_MNGT
BCLR3
JP :wait_buffer0_full

:release_buffer0
;---------------
LD	A BUFFER_MNGT
BSET1
LD	BUFFER_MNGT

CP	ALWAYS
JP :update_buffer_flag


:wait_buffer1_full
LD	A BUFFER_MNGT
BCLR4
JP :wait_buffer1_full

:release_buffer1
;---------------
LD	A BUFFER_MNGT
BSET2
LD	BUFFER_MNGT


:update_buffer_flag
;------------------
LD	LSB 0		; clear the buffer full flags
LD	BUFFER_MNGT

LD	A Y
LD	DATA_BUFFER0
DECY
JP :dummy_write

STATUS	STOP

;---------------------------------
;For Bad Cluster recognition
;---------------------------------
      LD	MSB 0
      LD	LSB 15
      LD	DDR_PARALLEL
      LD	OR_PARALLEL

      LD	MSB 15
      LD	MASK

      XOR
      LD	BUFFER_MNGT	; Clear segment offset
      LD	ADR_BUFFER01
      LD	ADR_BUFFER10
      LD	CMP10

      LD	LSB 1
      LD	ADR_BUFFER11	; buffer pointer 1 = 0x0100
      LD	LSB 5
      LD	CMP11		; CMP1 = 0x0500

;-------------------------
; Output the command 0x50
;-------------------------
:start_read_spare_area
      LD	MSB 1		;data_flash port = output
      LD	LSB 9		;DATA_FLASH Port driven by FCI
      LD	CTRL_FCI	;PARALLEL Port driven by FCI

:pre_wait_card_ready
;---------------
      LD	A DR_PARALLEL
      EXCHANGE
      BCLR1			; test busy line
      JP :pre_wait_card_ready
      
;For 256mb
;-----------
      LD	MSB 0
      LD	LSB 0
      LD	DATA_FLASH
      
      LD	LSB 10
      LD	DR_PARALLEL	; WE = 1, CLE = 0
      LD	LSB 11
      LD	DR_PARALLEL	; WE = 1, CLE = 1
      LD	LSB 9
      LD	DR_PARALLEL	; WE = 0, CLE = 1
      LD	LSB 11
      LD	DR_PARALLEL	; WE = 1, CLE = 1
      LD	LSB 10
      LD	DR_PARALLEL	; WE = 1, CLE = 0

;------------------------------------
; Output the 3 or 4 or 5 bytes of address from 0xE5-0xE1
;------------------------------------

      LD	MSB 0
      LD	LSB 1
      LD	X		; X = 1

      LD	MSB 14
      LD	LSB 6
      LD	ADR_BUFFER00	; buffer pointer 0 = 0x00E6
      LD	A DATA_BUFFER0	; load the number of address bytes
      LD	Y
      DECY
      SUB16	ADR_BUFFER0	; send address from high byte to low byte,256mb

:loop_send_address
;-----------------
      LD	A DATA_BUFFER0
      LD	DATA_FLASH
      LD	MSB 0
      LD	LSB 14
      LD	DR_PARALLEL	; ALE = 1, WE = 1
      LD	LSB 12
      LD	DR_PARALLEL	; ALE = 1, WE = 0
      LD	LSB 14
      LD	DR_PARALLEL	; ALE = 1, WE = 1
      SUB16 ADR_BUFFER0

      DECY
      JP :loop_send_address

      LD	MSB 0
      LD	LSB 10
      LD	DR_PARALLEL	; ALE = 0, WE = 1

;---------------------------------------------------
;For 256 MB or 2K page send 0x30 command,
;---------------------------------------------------

;send 0x30 cmd
      LD	MSB 3
      LD	LSB 0
      LD	DATA_FLASH

      LD	LSB 11
      LD	DR_PARALLEL	; WE = 1, CLE = 1
      LD	LSB 9
      LD	DR_PARALLEL	; WE = 0, CLE = 1
      LD	LSB 11
      LD	DR_PARALLEL	; WE = 1, CLE = 1
      LD	LSB 10
      LD	DR_PARALLEL	; WE = 1, CLE = 0
;---------------
;End for 256mb
;---------------
:Read_Spare
;------------
      LD	MSB 0		; data_flash port = intput   
      LD	LSB 9		; DATA_FLASH Port driven by FCI 
      LD	CTRL_FCI	; PARALLEL Port driven by FCI 

;---------------------
; Read the spare area
;---------------------
:init_read_spare
      LD	LSB 2
      LD	CMP00		; CMP00 = 0x02 for toggling RD line
      LD	LSB 5
      LD	Y		; Y = 5
      LD	MSB 14
      LD	LSB 07
      LD	ADR_BUFFER00	; ADR0 = 0x00E7, points to spare area
      LD	CMP01		; save this address for later use

:wait_card_ready
;---------------
      LD	A DR_PARALLEL
      EXCHANGE
      BCLR1			; test busy line
      JP :wait_card_ready

; read_spare
;------------
:read_spare
      LD	A CMP00
      LD	DR_PARALLEL	; RD = 0
      LD	LSB 10
      LD	DR_PARALLEL	; RD = 1

      LD	A DATA_FLASH	; load DATA_FLASH
      LD	DATA_BUFFER0
      ADDER16 ADR_BUFFER0

      DECY
      JP :read_spare

;-------------------------------
; Check the spare area is valid
;-------------------------------
      LD	A CMP01
      LD	ADR_BUFFER00	; ADR0 = 0x00E7, points to spare area

      LD	MSB 0
      LD	LSB 5
      LD	Y		; 6 BYTES TO READ

:Check_first_6_bytes
;-------------------
      LD	A DATA_BUFFER0
      XOR			; MASK = 0xFF
      CP	A=>X		; X = 1
      JP :spare_area_error

      ADDER16 ADR_BUFFER0	; Increment pointer

      DECY
      JP :Check_first_6_bytes

:increase_page_address
;------------------------
      LD	MSB 14
      LD	LSB 4
      LD	Y
      LD	A <Y>
      BCLR2			; if first block is checked
      JP :continue
      STATUS STOP

:continue
      DECY
      LD	A <Y>		; 0xe3 ->1st row address byte
      BSET1			; If pointer is at 2nd page of the cluster
      JP :increse_cluster_address
      LD	<Y>    
      LD	MSB 14
      LD	LSB 2
      CP	ALWAYS
      BRANCH :check_next_page

:stop_it2
STATUS STOP ERROR

:spare_area_error
;----------------
;      STATUS STOP ERROR

      LD	MSB 14
      LD	LSB 4
      LD	Y
      LD	A <Y>
      BSET2			;if first block is checked
      JP :stop_it2

      LD	MSB 0
      LD	LSB 3
      LD	Y		;To save 4 adr bytes

      LD	MSB 14
      LD	LSB 1		; Point to MSB of Physical Addr  0xE1
      LD	ADR_BUFFER00

:save_nxt_byte
      LD	A DATA_BUFFER0
      LD	DATA_BUFFER1
      ADDER16	ADR_BUFFER1
      ADDER16	ADR_BUFFER0
      DECY
      JP :save_nxt_byte
      
      LD	MSB 14
      LD	LSB 3
      LD	Y
:increse_cluster_address
      LD	A MASK
      LD	ADR_BUFFER00
      LD	A DATA_BUFFER0	;0xff points to cluster size
      LD	X
      
      CLC
      LD	A <Y>
      BCLR1
      ADDER8	X
      LD	<Y>		; byte 0 of the address
      DECY			; Y = 0xE2

      LD	LSB 0
      LD	MSB 0
      LD	X		 ; clear X
 
      LD	A <Y>
      ADDER8	X		; byte 1 of the address
      LD	<Y>

;Carry at 2nd Row byte -> End of Zone
      CP CARRY
      JP :nxt_zone

:check_next_page
;------------------
      LD	MSB 4
      LD	LSB 14
      CP	ALWAYS
      BRANCH	:start_read_spare_area


:stop_it
      STATUS STOP

:nxt_zone
      LD	MSB 0
      LD	LSB 1
      LD	X
      SUB16	ADR_BUFFER0	; 0xfe =number of zones
      LD	A DATA_BUFFER0
      CLC
      SUB8	X
      CP	A<X
      JP :stop_it

:increase_zone
      LD	DATA_BUFFER0
      DECY			;Y = 0xE1 ->Zone adr Byte
      LD	A <Y>
      CLC
      ADDER8	X
      LD	<Y>		; Move to nxt zone
      CP	ALWAYS
      JP :check_next_page

⌨️ 快捷键说明

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