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

📄 smc_dtc_copypages256_old.fsm

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

                      ;----------------------
                      ; dtc_smc_copy_page.fsm
                      ;----------------------

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

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

LD LSB 0
LD ADR_BUFFER01
LD CMP00
LD BUFFER_MNGT

;-----------------
;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 (Read1 CMD)
;-------------------------------

;LD MSB 0
;LD LSB 0
LD A ADR_BUFFER01
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

;send address, set ALE high
;------------------------------
LD LSB 14
LD DR_PARALLEL

;-------------------------
; read_address_latch_cycle
;-------------------------

;read_address_latch_cycle_nb_Bytes
;--------------------------------- 

      LD	MSB 14
      LD	LSB 06
      LD	ADR_BUFFER00	; buffer pointer 0 = 0x00E6
      LD	A DATA_BUFFER0
      LD	Y		; Y = number of address bytes
;      LD CMP10  ;save 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

      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	LSB 12
      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
;end of send address      
;---------------------
;wait_read1_addr_ready
;---------------------
LD MSB 3
LD LSB 5
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 


;removed time-out for optimizing
;-------------------------------- 
;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_read1_addr_ready
;---------------------
;ADDER16 ADR_BUFFER0
;CP ADR_BUFFER0<CMP0
;JP :read1_addr_no_timeout
;STATUS STOP ERROR   ; timeout >20ms

;NOP
;NOP
NOP
NOP

;:read1_addr_no_timeout
;---------------------
LD A DR_PARALLEL
EXCHANGE
BCLR1 //test R/B
JP :wait_read1_addr_ready

;send next command for copy operation 0x85
;-------------------------------------------
LD MSB 8
LD LSB 5
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

;send address bytes
LD LSB 14
LD DR_PARALLEL

;send the address of destination block
;--------------------------------------
:send_address
;-------------
      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

      ADDER16	ADR_BUFFER0	; send address from high byte to low byte

:loop_send_address1
;-----------------

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

      DECY
      JP :loop_send_address1

;      LD	MSB 0
      LD	LSB 10
      LD	DR_PARALLEL	; ALE = 0, WE = 1
;end of send address      
;---------------------


;chk if the first page is not from the start of coloumn
;-------------------------------------------------------
;chk the flag set in the 0xfd to get the no. of blocks
;-------------------------------------------------------

LD MSB 15
LD LSB 13
LD ADR_BUFFER00
                                 
LD A ADR_BUFFER01
LD ADR_BUFFER11
LD ADR_BUFFER10   ;ADR1 = 0x0000

LD A DATA_BUFFER0
ADDER16 ADR_BUFFER0
ADDER16 ADR_BUFFER0      ;point ADR0 = 0x00ff
BSET1
JP :chk_nxt_bit

BSET2
JP :2_block_ff

CP ALWAYS
JP :start_pgm_cycle

:chk_nxt_bit
BSET2
JP :3_block_ff

:1_block_ff
;--------------
LD LSB 2
LD CMP11      ;only one block so CMP1 = 0x210 = 528 bytes

LD MSB 1

CP ALWAYS
JP :send_ff

:2_block_ff
;------------
LD LSB 4
LD CMP11

LD MSB 2
;CP ALWAYS
JP :send_ff

:3_block_ff
;-----------
LD LSB 6
LD CMP11

LD MSB 3             ;CMP1 = 0x630

:send_ff
LD LSB 0
LD CMP10   
 

;write data on to page, generate 528 write pulses
;------------------------------------------------
;:gen_more_pulses
;---------------

:write_dat_sec
;-------------

 LD	A ADR_BUFFER00
 LD	DATA_FLASH

LD LSB 8
LD DR_PARALLEL

LD LSB 10
LD DR_PARALLEL

ADDER16 ADR_BUFFER1
CP ADR_BUFFER1<CMP1
JP :write_dat_sec

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

:start_pgm_cycle
;----------------
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_BUFFER11
;LD ADR_BUFFER10
;LD CMP10
;LD MSB 15
;LD CMP11

:wait_card_ready
;---------------
;ADDER16 ADR_BUFFER1
;CP ADR_BUFFER1<CMP1
;JP :no_timeout
;STATUS STOP ERROR   ; timeout 20ms

;:no_timeout
;----------
NOP
NOP
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 LSB 10
LD DR_PARALLEL
LD A DATA_FLASH         ; load DATA_FLASH
 
:check_status
;-------------
;EXCHANGE
BCLR1
JP :no_error
;BCLR4
;JP :error_status
;CP A<X
;JP :no_error

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

:no_error
;--------
;LD MSB 0


;------------
;end_of_block
;------------
      
;For 256mb
     
     LD A DATA_BUFFER0  ;ADR0 = 0x00ff, contains 2K page pointer
     CP A=>X     
    JP :dec_512_page

:stop
     STATUS STOP ;if 0 then stop

:dec_512_page
;---------------- 
LD MSB 0
LD LSB 4
LD Y

SUB16 ADR_BUFFER0
LD A DATA_BUFFER0
CLC
SUB8 Y                  ;decrement by 4
LD DATA_BUFFER0


;add new
;-------------------------------------------------
;:increment_page
;--------------- 
;; Decrease the page number and increase the page address
      LD MSB 14
      LD LSB 3
      LD Y
            
:next_page
;-----------------------------------
      LD A <Y>
      CLC
      ADDER8	X
      LD	<Y>	; Increase the page address and save it back
      
      LD MSB 14
      LD LSB 9
      LD Y
      LD A <Y>
      CLC
      ADDER8 X
      LD <Y>
      
      DECY   ;Y = 0xe8
;      LD MSB 0
;      LD LSB 0
;      BRANCH
      JP :end_of_page
     
:last_page
;---------------
SUB16 ADR_BUFFER0    ;ADR0 =0xfe
LD A DATA_BUFFER0

;CP A=>X
CP A<X

;JP :partial_page_pgm
JP :stop

;STATUS STOP      


:partial_page_pgm
;-----------------
SUB16 ADR_BUFFER0 ;ADR0 = 0xfd
BSET1
JP :chk_nxtbit

BSET2
JP :2_block_extra

:chk_nxtbit
BSET2
JP :1_block_extra

:3_block_extra
LD LSB 3
LD DATA_BUFFER0

LD LSB 2
LD CMP11        ;col 1

LD MSB 1
CP ALWAYS
JP :end1

:2_block_extra
LD LSB 2
LD DATA_BUFFER0   ;

LD LSB 4
LD CMP11        ;col 1

LD MSB 2
;CP ALWAYS  ;if, then else
:end1
JP :end

:1_block_extra
LD LSB 1
LD DATA_BUFFER0

LD LSB 6
LD CMP11        ;col 1

LD MSB 3

;new
;CP ALWAYS    ;commented for if then else
JP :end

;:end
;LD LSB 0
;LD CMP10
;LD A CMP11
;LD <Y>
;DECY
;LD A CMP10
;LD <Y>
;ADDER16 ADR_BUFFER0  ;0xfe need not to be reseted now
;CP ALWAYS
;JP :process_continue
     
:end_of_page
;-------------
ADDER16 ADR_BUFFER0
LD A DATA_BUFFER0
CLC
SUB8 X
LD DATA_BUFFER0           ;decrement 0xff by 1 => decrement of 2k page no.
CP A<X
LD MSB 12
LD LSB 5
BRANCH
;JP :last_page

LD A ADR_BUFFER01     ;0xe8, col add2
LD <Y> 

DECY
LD <Y>              ;Y=0xe7, col add1
   
SUB16 ADR_BUFFER0       ; ADR0 = 0xfd, flag for col. no.
SUB16 ADR_BUFFER0       ; ADR0 = 0xfe, flag for col. no.

:process_continue
LD A ADR_BUFFER01
LD DATA_BUFFER0         ;reset it to 0

CP ALWAYS
BRANCH :start

:end
LD LSB 0
LD CMP10
LD A CMP11
LD <Y>
DECY
LD A CMP10
LD <Y>
ADDER16 ADR_BUFFER0  ;0xfe need not to be reseted now
CP ALWAYS
JP :process_continue
                            

⌨️ 快捷键说明

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