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

📄 new_smc_dtc_markpages256.fsm

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

                      ;----------------------
                      ; dtc_smc_mark_page.fsm
                      ;----------------------

;--------------------------
;init_write_number_of_block
;--------------------------

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

;-----------------
;init_dtc_ctrl_reg
;-----------------

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

;-------------------------------
;command_latch_cycle (Read2 CMD)
;-------------------------------
;for 256mb
;----------
      LD MSB 0
      LD LSB 0
      LD ADR_BUFFER01
      LD BUFFER_MNGT

      LD MSB 13
      LD ADR_BUFFER00	;send first write command (0x80) from 0xd0
      LD A DATA_BUFFER0
      LD DATA_FLASH

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

;for 256mb
;----------
      LD MSB 12		;Set a Flag at 0xc0= 0x00 for the card with 2K page
      LD LSB 0
      LD Y
      LD A <Y>
      BCLR1		;if 256mb no second cmd is required, is 0 JP
;      LD Y
;      DECY
      JP :send_address

;send 0x80 cmd for other FLash

:process_continue1
;------------------
      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 8
      LD LSB 0
      LD DATA_FLASH
:send_nxt_cmd
;-------------
      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

;-----------------
;init_dtc_ctrl_reg
;-----------------

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

:send_address
      LD MSB 0
      LD LSB 0
      LD ADR_BUFFER01
      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,for 256mb
;      LD ADR_BUFFER10	; clear low byte of ADR1
;      LD CMP10		; clear low byte of CMP1
;      LD BUFFER_MNGT	; clear SEGment offset for using Y on ECC check 
      SUB16 ADR_BUFFER0	; send address from high byte to low byte

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

;      SUB16 ADR_BUFFER0	; send address from high byte to low byte
      LD A DATA_BUFFER0
      LD DATA_FLASH	; Output the address bytes
      LD A CMP01
      LD DR_PARALLEL	; ALE = 1, WE = 0
      LD LSB 14
      LD DR_PARALLEL	; ALE = 1, WE = 1
      
      SUB16 ADR_BUFFER0	; send address from high byte to low byte
;      LD A DATA_BUFFER0

      DECY
      JP :loop_send_address

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

;---------------------
;wait_sdi_addr_ready
;---------------------

:init_timeout
;------------
;      LD LSB 00
;      LD ADR_BUFFER01		; buffer 0 address ( 8..15 )
;      LD ADR_BUFFER00		; buffer 0 address ( 0..7 )
;      LD CMP00
;      LD MSB 15
;      LD CMP01

:wait_sdi_addr_ready
;---------------------
;      ADDER16 ADR_BUFFER0
;      CP ADR_BUFFER0<CMP0
;      JP :sdi_addr_no_timeout
;      STATUS STOP ERROR   ; timeout >20ms

:sdi_addr_no_timeout
;---------------------
;      LD A DR_PARALLEL
;      EXCHANGE
;      BCLR1 //test R/B
;      JP :wait_sdi_addr_ready

;------------
; write_spare
;------------

;init_write_spare
;----------------

      LD MSB 0
      LD LSB 0
      LD ADR_BUFFER01		; buffer 0 address ( 15..8 )
      LD CMP01

      LD MSB 14
      LD LSB 07
      LD ADR_BUFFER00

      LD MSB 15
      LD CMP00

:write_spare
;-----------

      LD A DATA_BUFFER0
      LD DATA_FLASH

      LD MSB 0
      LD LSB 8
      LD DR_PARALLEL

      LD LSB 10
      LD DR_PARALLEL

      ADDER16 ADR_BUFFER0
      CP ADR_BUFFER0<CMP0
      JP :write_spare

      LD MSB 15
      LD LSB 15
      LD ADR_BUFFER00		;point to 0xff

      LD A DATA_BUFFER0
      CLC
      SUB8 X
      LD DATA_BUFFER0
      CP A<X			;changed for bug
      LD MSB 9
      LD LSB 15
      BRANCH :program_page

      LD MSB 12
      LD LSB 0
      LD ADR_BUFFER00
      LD A DATA_BUFFER0
      BSET1

;      JP :program_page
      LD MSB 9
      LD LSB 15
:program_page1
      BRANCH :program_page

      LD MSB 14
      LD LSB 4
      LD ADR_BUFFER00

      LD MSB 0
      LD LSB 2
      LD Y

      LD A DATA_BUFFER0
      CLC
      ADDER8 Y
      LD DATA_BUFFER0

      LD MSB 1
      LD LSB 0
      LD Y

;      LD MSB 14
;      LD LSB 5
      ADDER16 ADR_BUFFER0
;      LD ADR_BUFFER00
      LD A DATA_BUFFER0
      CLC
      ADDER8 Y
      LD DATA_BUFFER0
      EXCHANGE
      BSET3
      JP :next_page

      LD MSB 14
      LD LSB 6
      LD ADR_BUFFER00
;      LD MSB 13
;      LD LSB 2			;reload address bytes into 0xd2
;      LD Y
;      LD A DATA_BUFFER0
;      LD <Y>

      LD MSB 0
      LD LSB 2
      LD DATA_BUFFER0		;load 2 in 0xe6 to change number of add bytes
      
;send 0x85 command for random data output
;----------------------------------------

       LD MSB 8
       LD LSB 5
       LD DATA_FLASH
       LD MSB 2
       LD LSB 5
       CP ALWAYS
       BRANCH :send_nxt_cmd

;      LD MSB 6
;      LD LSB 9
;      BRANCH :write_next_col

:next_page
      LD MSB 13
      LD LSB 2
      LD Y    
      LD MSB 14
      LD LSB 6
      LD ADR_BUFFER00
      LD A <Y>
      LD DATA_BUFFER0		;reload again the number of address bytes

;      LD MSB 14
;      LD LSB 5
      SUB16 ADR_BUFFER0
      LD A ADR_BUFFER01
      LD DATA_BUFFER0
      SUB16 ADR_BUFFER0
      LD LSB 2
      LD DATA_BUFFER0

;----------------------------
:Page_Pgm_command_latch_cycle
;----------------------------
:program_page
;-------------

      LD MSB 1
      LD LSB 0
      LD DATA_FLASH

      LD MSB 0
      LD LSB 10
      LD DR_PARALLEL
      LD LSB 11
      LD DR_PARALLEL
      LD LSB 9
      LD DR_PARALLEL
      LD LSB 11
      LD DR_PARALLEL
      LD LSB 10
      LD DR_PARALLEL

;---------------------------
; read_status & check_status
;---------------------------

;wait_card_ready
;---------------

;init_timeout
;------------
      LD LSB 00
      LD ADR_BUFFER01
      LD ADR_BUFFER00
      LD CMP00
      LD MSB 15
      LD CMP01

:wait_card_ready
;---------------
      ADDER16 ADR_BUFFER0
      CP ADR_BUFFER0<CMP0
      JP :no_timeout
      STATUS STOP ERROR		; timeout 20ms

:no_timeout
;----------
      LD A DR_PARALLEL
      EXCHANGE
      BCLR1 //test R/B
      JP :wait_card_ready

:read_status_command_latch_cycle
;-------------------------------

      LD MSB 7
      LD LSB 0
      LD DATA_FLASH

      LD MSB 0
      LD LSB 10
      LD DR_PARALLEL
      LD LSB 11
      LD DR_PARALLEL
      LD LSB 9
      LD DR_PARALLEL
      LD LSB 11
      LD DR_PARALLEL
      LD LSB 10
      LD DR_PARALLEL

:init_read_status_seq
;---------------------

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

:read_status_seq
;----------------

      LD MSB 0
      LD LSB 2
      LD DR_PARALLEL
      NOP
      LD A DATA_FLASH		; load DATA_FLASH
 
: check_status
;-------------
;      EXCHANGE
;      BCLR3
;      JP :error_status
;      BCLR4
;      JP :error_status
;      CP A<X
      BCLR1
      JP :no_error

:error_status
;------------
      STATUS STOP

:no_error
;--------
      LD MSB 0
      LD LSB 10
      LD DR_PARALLEL

;------------
;end_of_block
;------------

;inc_addr
;-------- 
;for 256mb

      LD LSB 0
      LD MSB 0
      LD ADR_BUFFER01		; buffer 0 address ( 8..15 )

      LD MSB 15
      LD LSB 15
      LD ADR_BUFFER00

      LD A DATA_BUFFER0
      CP A=>X
      JP :inc_page_addr
      STATUS STOP

:inc_page_addr
;-------------

      LD MSB 12
      LD LSB 0
      LD ADR_BUFFER00

      LD A DATA_BUFFER0
      BSET1
      JP :512bytes_page

      LD MSB 14
      LD LSB 03
      LD ADR_BUFFER00		; buffer 0 address ( 0..7 )
      CP ALWAYS
      JP :process_continue

:512bytes_page
;-------------
      LD MSB 14
      LD LSB 04
      LD ADR_BUFFER00

:process_continue
;-----------------
      LD A DATA_BUFFER0
      CLC
      ADDER8 X
      LD DATA_BUFFER0

      LD MSB 1
      LD LSB 15
;      LD Y
;      LD A <Y>
      CP ALWAYS
      BRANCH :repeat

⌨️ 快捷键说明

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