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

📄 smc_dtc_play256.fsm

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

;-------------
; smc_dtc_play
;-------------

;------------------------------------------------------------------
;		START ADDRESS FOR read data to Buffer_0
;------------------------------------------------------------------
:read_buffer_0
LD	LSB 1
CP	ALWAYS
JP :init_read_command

;------------------------------------------------------------------
;		START ADDRESS FOR read data to Buffer_1
;------------------------------------------------------------------
:read_buffer_1
LD	LSB 3

:init_read_command
LD	MSB 0
LD	ADR_BUFFER11

;LD	MSB 0		; data_flash port = intput   
LD	LSB 9		; DATA_FLASH Port driven by FCI 
LD	CTRL_FCI	; PARALLEL Port driven by FCI 
LD	MSB 2		; ECC Mode & Reset TMP Reg
LD	CTRL_FCI	; PARALLEL Port driven by FCI

:init_read_page
;--------------
LD	A ADR_BUFFER01	; It must be zero
LD	ADR_BUFFER10	; clear low byte of pointer 1 for reading
LD	CMP01
LD	LSB 2
LD	CMP00		; CMP0 = 0x0002, will use for RD toggling
  LD	ADR_BUFFER00	; buffer pointer 0 = 0x0002

:wait_read_ready
;---------------
  ADDER16	ADR_BUFFER0
  CP	ADR_BUFFER0=>CMP0
  JP :test_busy_line
  NOP			; the waiting loop is timeout
  STATUS STOP ERROR	; return with error

:test_busy_line
;--------------
LD	A DR_PARALLEL
EXCHANGE
BCLR1
JP :wait_read_ready

LD	A ADR_BUFFER10
LD	ADR_BUFFER01	; clear high byte of pointer 0
LD	Y		; clear Y, Y = 256
LD	MSB 15
LD	LSB 8
LD	ADR_BUFFER00	; buffer pointer 0 = 0x00F8, points the ECC memory

:read_256_bytes
;--------------

:read_dat_sec
;-------------

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_BUFFER1
  
LD	ECC_CRC		; load ECC_CRC REG
CLC			; Clear carry
XOR			; Update carry
LD	A ECC_CRC	; AUTO UPDATE OF Line PARITY 1
LD	A ECC_CRC	; AUTO UPDATE OF Line PARITY 2
LD	A ECC_CRC	; AUTO UPDATE OF column PARITY 
  
ADDER16	ADR_BUFFER1
INCY
JP :read_dat_sec
  
;-------------------
; routine ecc_calcul
;-------------------
:read_ecc_calcul
  
LD	A TMP_ECC	; first read (Line parity 1)
LD	DATA_BUFFER0
LD	A ECC_CRC	; -- INCR CRC_ECC_STATE --
ADDER16 ADR_BUFFER0

LD	A TMP_ECC	; second read (Line parity 2)
LD	DATA_BUFFER0
LD	A ECC_CRC	; -- INCR CRC_ECC_STATE --
ADDER16 ADR_BUFFER0

LD	A TMP_ECC	; third read ( column parity)
LD	DATA_BUFFER0
ADDER16	ADR_BUFFER0

LD	A ADR_BUFFER11
BCLR1
JP :read_dat_sec

;------------------------------
; START ADDRESS FOR read_spare
;------------------------------
:init_read_spare

LD	LSB 15
LD	Y		; Y = 15
LD	MSB 14
LD	LSB 06
LD	ADR_BUFFER00	; buffer pointer0 = 0x00E6,
			; points to one byte before spare area
; read_spare
;-----------
:read_spare
ADDER16 ADR_BUFFER0

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

DECY
JP :read_spare

STATUS	STOP

;------------------------------------------------------------------
;------------------------------------------------------------------
;------------------------------------------------------------------
;		START ADDRESS FOR write data from Buffer_0
;------------------------------------------------------------------
:write_buffer_0
LD	LSB 1
CP	ALWAYS
JP :init_write_command

;------------------------------------------------------------------
;		START ADDRESS FOR write data from Buffer_1
;------------------------------------------------------------------
:write_buffer_1
LD	LSB 3

:init_write_command
LD	MSB 0
LD	ADR_BUFFER11

LD	LSB 8
LD	CMP00		; CMP00 = 0x08, will be used for toggling WE line
LD	LSB 0 
LD	Y		; Y = 0
LD	ADR_BUFFER10	; Low byte of the pointer 1 is used in the ECC calculate

LD	MSB 3		; ECC Mode & Reset TMP Reg, data_flash port = output
LD	LSB 9		; DATA_FLASH Port driven by FCI 
LD	CTRL_FCI	; PARALLEL Port driven by FCI

LD	MSB 15
LD	LSB 4
LD	ADR_BUFFER00	; ADR0 = 0x00F4, address of ECC1

;--------------------------
; Write one page to the SMC
;--------------------------
:write_data_page
LD	A DATA_BUFFER1
LD	DATA_FLASH

LD	ECC_CRC		; load ECC_CRC REG
CLC			; Clear carry
XOR			; Update carry
LD	A ECC_CRC	; AUTO UPDATE OF Line PARITY 1
LD	A ECC_CRC	; AUTO UPDATE OF Line PARITY 2
LD	A ECC_CRC	; AUTO UPDATE OF column PARITY 

LD	A CMP00
LD	DR_PARALLEL
LD	LSB 10
LD	DR_PARALLEL

ADDER16	ADR_BUFFER1	; Low byte of the pointer1 is using on ECC calculate
			; I have to increase it after ECC calculate
INCY
JP :write_data_page

;------------------
; Save the ECC code
;------------------
LD	A TMP_ECC	; first read (Line parity 1)
LD	DATA_BUFFER0
LD	A ECC_CRC	; -- INCR CRC_ECC_STATE --
ADDER16	ADR_BUFFER0

LD	A TMP_ECC	; second read (Line parity 2)
LD	DATA_BUFFER0
LD	A ECC_CRC	; -- INCR CRC_ECC_STATE --
ADDER16	ADR_BUFFER0

LD	A TMP_ECC	; third read ( column parity)
LD	DATA_BUFFER0

;------------------------------------------------------------------------------
; 256 bytes written to the SMC, goint to write the next 256 bytes
; ADR_BUFFER11 will change	from 0001 -> 0010 -> 0011 when writing buffer0
;				from 0011 -> 0100 -> 0101 when writing buffer1
;------------------------------------------------------------------------------
LD	MSB 14
LD	LSB 15
LD	ADR_BUFFER00	; ADR0 = 0x00EF, points to ECC2

LD	A ADR_BUFFER11
BCLR1
JP :write_data_page

:init_write_spare_area
;---------------------
LD	MSB 14
LD	LSB 7
LD	ADR_BUFFER00	; ADR0 = 0x00E7, points to the spare area

LD	MSB 0
LD	LSB 15
LD	Y		; Y = 0x0F

;-------------------------
; Write the redundant area
;-------------------------
:write_spare_area
LD	A DATA_BUFFER0
LD	DATA_FLASH
ADDER16	ADR_BUFFER0

LD	A CMP00
LD	DR_PARALLEL
LD	LSB 10
LD	DR_PARALLEL

DECY
JP :write_spare_area

STATUS STOP

;------------------------------------------------------------------
;		START ADDRESS OF SMC_DTC_SEND_CMD
;	0x1630 = The command to be sent
;------------------------------------------------------------------
LD	MSB 1     ;data_flash port = output
LD	LSB 9     ;DATA_FLASH Port driven by FCI  
LD	CTRL_FCI  ;PARALLEL Port driven by FCI

LD	MSB 15
LD	LSB 15
LD	MASK
XOR
LD	ADR_BUFFER01
LD	MSB 14
LD	ADR_BUFFER00	; buffer pointer 0 = 0x00E0
LD	A DATA_BUFFER0	; load the command

LD	DATA_FLASH	; send the command

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

LD	LSB 1
LD	X		; initialize X = 1

STATUS	STOP

;--------------------------------------------------
;             START ADDRESS FOR SMC_DTC_SEND_ADDR
;	ST7: Give a 3 or 4 bytes address
;	0x1632 - 0x1635 = The address, big endien (0x00E2-0x00E5)
;-------------------------------------------------- 
      LD	LSB 14
      LD	DR_PARALLEL	; ALE = 1, WE = 1 
      LD	MSB 14
      LD	LSB 6
      LD	ADR_BUFFER00	; ADR0 = 0x00E6; points to "Num of address"

      LD	A DATA_BUFFER0
      LD	Y		; Load number of addres bytes
      SUB16	ADR_BUFFER0

      DECY

:Send_Address_Bytes
;------------------
      LD	A DATA_BUFFER0
      SUB16	ADR_BUFFER0
      LD	DATA_FLASH	; Send the address byte
      LD	LSB 12
      LD	DR_PARALLEL	; WE = 0, ALE = 1
      LD	LSB 14
      LD	DR_PARALLEL	; WE = 1, ALE = 1
:Next_Address_Byte
;-----------------          
      DECY
      JP :Send_Address_Bytes

      LD	LSB 10
      LD	DR_PARALLEL	; WE = 1, CLE = 0, ALE = 0, RD = 1
      
      STATUS STOP


;LD	MSB 1     ;data_flash port = output
;LD	LSB 9     ;DATA_FLASH Port driven by FCI  
;LD	CTRL_FCI  ;PARALLEL Port driven by FCI

;LD	MSB 14
;LD	LSB 06
;LD	ADR_BUFFER00	; buffer pointer 0 = 0x00E6
;LD	A DATA_BUFFER0
;LD	Y		; Y = number of address bytes
;DECY
;LD	LSB 12
;LD	CMP01		; CMP01 = 12, for send address toggling lines
;LD	LSB 14
;LD	DR_PARALLEL	; ALE = 1, WE = 1

;LD	A ADR_BUFFER01	; clear A as the first byte, it is always 0

; loop_send_address
; -----------------
;:loop_send_address

;SUB16	ADR_BUFFER0	; send address from high byte to low byte

;LD	DATA_FLASH
;LD	A CMP01
;LD	DR_PARALLEL	; ALE = 1, WE = 0
;LD	LSB 14
;LD	DR_PARALLEL	; ALE = 1, WE = 1

;LD	A DATA_BUFFER0

;DECY
;JP :loop_send_address

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

;STATUS	STOP

;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
;		Read Card ID
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
;-------------------------------------
;        START ADDRESS FOR Read_ID, store the no. of cycles of ReadID at 0xFC
;store the codes from 0xf0
;-------------------------------------
LD	A ADR_BUFFER01
LD	BUFFER_MNGT	; clear segment offset

LD	DATA_FLASH	; output the address

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
LD	LSB 10
LD	DR_PARALLEL	; ALE = 0, WE = 1, CLE = 0


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	MSB 15
LD	LSB 12
LD	Y		; Y = 0xFC
LD LSB 0
LD ADR_BUFFER00 ;Start add for storing the REadID o/p ADR0 = 0x00F0

;for 256mb
;-----------
LD    A  <Y>   ; store the no. of cycles of ReadID 
LD Y
DECY
:Readnext_cycle
;---------------
LD	MSB 0
LD	LSB 2
LD	DR_PARALLEL	; RD = 0
LD	LSB 10
LD	DR_PARALLEL	; RD = 1
LD	A DATA_FLASH
LD	DATA_BUFFER0		; save the codes, 256mb
ADDER16	ADR_BUFFER0
DECY
JP :Readnext_cycle

;--------------------------


;INCY
;LD	MSB 0
;LD	LSB 2
;LD	DR_PARALLEL	; RD = 0
;LD	LSB 10
;LD	DR_PARALLEL	; RD = 1
;LD	A DATA_FLASH
;LD	<Y>		; save the device code

STATUS	STOP


;-------------------------------------
;        START ADDRESS FOR Read_Status
;-------------------------------------
LD	A ADR_BUFFER01
LD	BUFFER_MNGT	; clear segment offset
LD	ADR_BUFFER10
LD	ADR_BUFFER11	; Buffer pointer 1 = 0x0000
LD	CMP11
LD	LSB 1
LD	CMP10		; CMP1 = 0x0001

:read_status_loop
ADDER16	ADR_BUFFER1
CP	ADR_BUFFER1<CMP1
JP :read_status_return

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

LD	LSB 2
LD	DR_PARALLEL

LD	MSB 15
LD	LSB 14
LD	Y
LD	A DATA_FLASH	; Get the status byte
LD	<Y>

LD	MSB 0
LD	LSB 10
LD	DR_PARALLEL

LD	A <Y>
EXCHANGE
BCLR3			; Check busy bit?
JP :read_status_loop

:read_status_return
;------------------
STATUS	STOP

⌨️ 快捷键说明

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