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

📄 smc_dtc_format256_fsm.hex

📁 HID-Ukey底层源码实现(st72651芯片) windows上层驱动
💻 HEX
字号:
 ; *****************************************************************
 ; * NOTICE: The information contained in this file is proprietary *
 ; * to SGS-THOMSON Microelectronics and is being made available   *
 ; * to ST customers under strict non-disclosure agreements.       *
 ; * Use or disclosure of this information is permissible only     *
 ; * under the terms of the existing non-disclosure agreement.     *
 ; *****************************************************************

 ; Written by Christophe BRICOUT
 ; Created by MPmanCompiler.exe (v3.0) Sun Oct 09 11:14:07 2005


 ;===================================================================
 ;			SMART MEDIA CARD
 ;===================================================================
  
 ;---------------
 ; smc_dtc_format
 ;---------------
  
 ; Check spare area
 ;	call send_cmd_address with CMD 0x50 & 0x00
 ;	call init_read_spare without any param
 ;		on error, goto next cluster
 ; Erase the cluster
 ;	call send_cmd_address with CMD 0x60 & 0xD0
 ;	call read_status without any param
 ;		on error, mark this cluster as bad and goto next cluster
 ; Write all 0's to the cluster
 ;	call send_cmd_00 without any param
 ;	call write_zero_to_all_pages with CMD 0x80 & 0x10
 ; Read all 0's
 ;	call send_cmd_address with CMD 0x00 & 0x40
 ;		on error, mark this cluster as bad and goto next cluster
 ;	call read_check_cluster without any param
 ;		on error, mark this cluster as bad and goto next cluster
 ; Erase the cluster
 ;	call send_cmd_address with CMD 0x60 & 0xD0
 ;	call read_status without any param
 ;		on error, mark this cluster as bad and goto next cluster
  
 ;for 256MB
 ;------------
  
 ; :clear_cluster_pages
 ;-------------------
  
 0xae,   ;   0 LD	MSB 14
 0xb3,   ;   1 LD	LSB 3
 0x84,   ;   2 LD	ADR_BUFFER00	; buffer pointer 0 = 0x00E3
 0xdb,   ;   3 LD	A DATA_BUFFER0
 0x2,   ;   4 CLC
 0x25,   ;   5 ADDER8	X		; increase the page address
 0x9b,   ;   6 LD	DATA_BUFFER0	; and save it
  
 0xaf,   ;   7 LD	MSB 15
 0xbf,   ;   8 LD	LSB 15
 0x84,   ;   9 LD	ADR_BUFFER00
 0xdb,   ;   a LD	A DATA_BUFFER0
 0x2,   ;   b CLC
 0x24,   ;   c SUB8	X
 0x9b,   ;   d LD	DATA_BUFFER0
 0x8,   ;   e CP	A=>X		; check the page counter
 ; JP :chk_cmd
 0x42,   ;   f JP  2
  
 ; :time_to_go_home
 ;--------------- On this point:
  
 0x5,   ;  10 STATUS	STOP
  
 ; :chk_cmd
 ;--------
 0xca,   ;  11 LD	A CMP10
 0x33,   ;  12 EXCHANGE			;write 2nd cmd is 0x10 and read 2nd cmd is 0x30
 0x29,   ;  13 BCLR2
 ; JP :save_page_counter
 0x44,   ;  14 JP  4
  
 ;     LD	MSB 10
 ;     LD	LSB 10		;branch to next read page operation
 ;     BRANCH :loop_read_all_pages
 ; JP :time_to_go_home
 0x65,   ;  15 JP  -5
  
  
 ;entry point for read spare area and read all zeros
 ;---------------------------------------------------
 0xa0,   ;  16 LD	MSB 0		;<<entry point for read and check spare
 ;      CP	ALWAYS
 ; JP :load_cmd_read_spare1
 0x47,   ;  17 JP  7
  
 ;      LD	MSB 15		;<<entry point for write
 ;      LD	LSB 15
 ;      LD	ADR_BUFFER00
 ;      LD	A DATA_BUFFER0	;commented because CMP00 is used below
  
 ; :save_page_counter
 ;------------------
 ;      LD	CMP00
 0xa8,   ;  18 LD	MSB 8
 0xb0,   ;  19 LD	LSB 0
 0x8b,   ;  1a LD	CMP11
 0xa1,   ;  1b LD	MSB 1
 0xb,   ;  1c CP	ALWAYS
 ; JP :load_cmd_2
 0x49,   ;  1d JP  9
  
 ; :load_cmd_read_spare1
 0xb0,   ;  1e LD	LSB 0
 0x8b,   ;  1f LD	CMP11
 0xa3,   ;  20 LD	MSB 3
 ;      CP	ALWAYS		;commented for 2.1 version
 ; JP :load_cmd_2
 0x45,   ;  21 JP  5
  
 0xa6,   ;  22 LD	MSB 6		; <<entry point for erase
 0xb0,   ;  23 LD	LSB 0
 0x8b,   ;  24 LD	CMP11
 0xad,   ;  25 LD	MSB 13
  
 ; :load_cmd_2
 0x8a,   ;  26 LD	CMP10
  
 ; :send_address
 0xa0,   ;  27 LD	MSB 0
 0x85,   ;  28 LD	ADR_BUFFER01	; clear the high byte of the pointer 0
 0xb1,   ;  29 LD	LSB 1
 0x81,   ;  2a LD	X		; X = 1
 0xae,   ;  2b LD	MSB 14
 0xb6,   ;  2c LD	LSB 6
 0x84,   ;  2d LD	ADR_BUFFER00	; buffer pointer 0 = 0x00E6
  
 ; :save_addr_bytes
 ;-----------------
 0xdb,   ;  2e LD	A DATA_BUFFER0
 0x26,   ;  2f SUB16	ADR_BUFFER0
 0x82,   ;  30 LD	Y		; Load number of addres bytes
 0x3c,   ;  31 DECY
  
 0xa1,   ;  32 LD	MSB 1		;data_flash port = output
 0xb9,   ;  33 LD	LSB 9		;DATA_FLASH Port driven by FCI  
 0x8d,   ;  34 LD	CTRL_FCI	;PARALLEL Port driven by FCI
  
 0xcb,   ;  35 LD	A CMP11		; get the 1st command
  
 ; :send_cmd
 ;---------
 0x8c,   ;  36 LD	DATA_FLASH	; output the command
  
 0xa0,   ;  37 LD	MSB 0
 0xba,   ;  38 LD	LSB 10
 0x90,   ;  39 LD	DR_PARALLEL	; WE = 1, CLE = 0
 0xbb,   ;  3a LD	LSB 11
 0x90,   ;  3b LD	DR_PARALLEL	; WE = 1, CLE = 1
 0xb9,   ;  3c LD	LSB 9
 0x90,   ;  3d LD	DR_PARALLEL	; WE = 0, CLE = 1
 0xbb,   ;  3e LD	LSB 11
 0x90,   ;  3f LD	DR_PARALLEL	; WE = 1, CLE = 1
 0xba,   ;  40 LD	LSB 10
 0x90,   ;  41 LD	DR_PARALLEL	; WE = 1, CLE = 0
  
 ;      INCY
 ;      LD A Y
 ;      CP A=>X
 ;      JP :latch_address
  
 ;      CP ALWAYS
 ;      JP :end_of_second_cmd
  
 ; :latch_address
 ;; Send two byte less if this is an erase operation
 ;      DECY			;added for 2 cmd send
 0xca,   ;  42 LD	A CMP10
 0x33,   ;  43 EXCHANGE
 0x2b,   ;  44 BCLR4
 ; JP :Prepare_Send_Address_Bytes
 0x43,   ;  45 JP  3
 0x3c,   ;  46 DECY			;added for 256mb
 0x3c,   ;  47 DECY
 ; :Prepare_Send_Address_Bytes
 0xbe,   ;  48 LD	LSB 14
 0x90,   ;  49 LD	DR_PARALLEL	; WE = 1, ALE = 1
 ; :Send_Address_Bytes
 ;------------------
 0xdb,   ;  4a LD	A DATA_BUFFER0
 0x26,   ;  4b SUB16	ADR_BUFFER0
 0x8c,   ;  4c LD	DATA_FLASH	; Send the address byte
 0xbc,   ;  4d LD	LSB 12
 0x90,   ;  4e LD	DR_PARALLEL	; WE = 0, ALE = 1
 0xbe,   ;  4f LD	LSB 14
 0x90,   ;  50 LD	DR_PARALLEL	; WE = 1, ALE = 1
 ; :Next_Address_Byte
 ;-----------------
 0x3c,   ;  51 DECY
 ; JP :Send_Address_Bytes
 0x68,   ;  52 JP  -8
  
 0xba,   ;  53 LD	LSB 10
 0x90,   ;  54 LD	DR_PARALLEL	; WE = 1, CLE = 0, ALE = 0, RD = 1
  
 0xca,   ;  55 LD	A CMP10		;if it is a write cmd
 0x33,   ;  56 EXCHANGE
 0x29,   ;  57 BCLR2
 ; JP :chk_first_cmd
 0x45,   ;  58 JP  5
  
 ; :send_nxt_read_cmd
 ;------------------
 0xca,   ;  59 LD	A CMP10
 0xb,   ;  5a CP	ALWAYS
 ; JP :send_cmd2
 0x58,   ;  5b JP  24
  
 ; :end_of_second_cmd
 ;------------------
 0x5,   ;  5c STATUS STOP
  
 ; :chk_first_cmd
 ;--------------
 0xcb,   ;  5d LD	A CMP11
 0x33,   ;  5e EXCHANGE
 0x2b,   ;  5f BCLR4
 ; JP :end_of_second_cmd
 0x64,   ;  60 JP  -4
  
 ; :write_all_zeros
 ;---------------
 0xa4,   ;  61 LD	MSB 4
 0xb0,   ;  62 LD	LSB 0
 0x88,   ;  63 LD	CMP00		; CMP0 = 0x0840; CMP10 is the 2nd CMD
  
 0xa0,   ;  64 LD	MSB 0
 0x84,   ;  65 LD	ADR_BUFFER00	; buffer pointer 0 = 0x0000
 0x87,   ;  66 LD	ADR_BUFFER11
  
 0xb8,   ;  67 LD	LSB 8
 0x89,   ;  68 LD	CMP01
  
 ; :loop_write_zeros
 0xb0,   ;  69 LD	LSB 0
 0x8c,   ;  6a LD	DATA_FLASH
 0xb8,   ;  6b LD	LSB 8
 0x90,   ;  6c LD	DR_PARALLEL	; WE = 0
 0xba,   ;  6d LD	LSB 10
 0x90,   ;  6e LD	DR_PARALLEL	; WE = 1
 0x27,   ;  6f ADDER16	ADR_BUFFER0
 0xd,   ;  70 CP	ADR_BUFFER0<CMP0
 ; JP :loop_write_zeros
 0x68,   ;  71 JP  -8
  
 ;      SUB16 ADR_BUFFER0
 ;      LD ADR_BUFFER00		;point to 0xe0
  
 ;      LD A DATA_BUFFER0
 ;      LD DATA_BUFFER0
 ;      LD CMP00
  
 ; :send_write_erase_cmd
 0xca,   ;  72 LD	A CMP10		; get the 2nd CMD
  
 ; :send_cmd2
 ;-----------
 ;      LD Y			;save to chk the cmd
 0x8c,   ;  73 LD	DATA_FLASH
 0xa0,   ;  74 LD	MSB 0
 0xbb,   ;  75 LD	LSB 11
 0x90,   ;  76 LD	DR_PARALLEL	; WE = 1, CLE = 1
 0xb9,   ;  77 LD	LSB 9
 0x90,   ;  78 LD	DR_PARALLEL	; WE = 0, CLE = 1
 0xbb,   ;  79 LD	LSB 11
 0x90,   ;  7a LD	DR_PARALLEL	; WE = 1, CLE = 1
 0xba,   ;  7b LD	LSB 10
 0x90,   ;  7c LD	DR_PARALLEL	; WE = 1, CLE = 0
  
 0xca,   ;  7d LD A CMP10
 0x33,   ;  7e EXCHANGE
 0x39,   ;  7f BSET2			;if it was the 2nd read cmd,then stop
 ; JP :status_stop
 0x5d,   ;  80 JP  29
  
 0xc2,   ;  81 LD	A Y 
 0x33,   ;  82 EXCHANGE
 0x2b,   ;  83 BCLR4
 ; JP :end_of_cmd
 0x49,   ;  84 JP  9
  
 ; :wait_write_erase_busy
 ;---------------------
 0xd0,   ;  85 LD	A DR_PARALLEL
 0x33,   ;  86 EXCHANGE
 0x28,   ;  87 BCLR1
 ; JP :wait_write_erase_busy
 0x63,   ;  88 JP  -3
  
 0xa7,   ;  89 LD	MSB 7
 0xb0,   ;  8a LD	LSB 0
 0x82,   ;  8b LD	Y
 ;      CP	ALWAYS
 ; JP :send_cmd2
 0x79,   ;  8c JP  -25
  
 ; :end_of_cmd
 ;------------
 0xa0,   ;  8d LD	MSB 0		;data_flash port = input
 0xb9,   ;  8e LD	LSB 9		;DATA_FLASH Port driven by FCI  
 0x8d,   ;  8f LD	CTRL_FCI	;PARALLEL Port driven by FCI
  
 0xb2,   ;  90 LD	LSB 2
 0x90,   ;  91 LD	DR_PARALLEL
 0xba,   ;  92 LD	LSB 10
 0x90,   ;  93 LD	DR_PARALLEL
 0xcc,   ;  94 LD	A DATA_FLASH	; read the status
 0x28,   ;  95 BCLR1			; check the status bit,changed
 ; JP :erase_write_pass
 0x42,   ;  96 JP  2
  
 ; :cluster_read_write_error
 ;------------------------
 ;      NOP
 0x7,   ;  97 STATUS	STOP ERROR
  
 ; :erase_write_pass
 ;---------------- 
 0xca,   ;  98 LD	A CMP10
 0x33,   ;  99 EXCHANGE
 0x2b,   ;  9a BCLR4			;if erase cmd then 2nd cmd is 0xd0
 0xc7,   ;  9b LD	A ADR_BUFFER11	; ADR_BUFFER11 = 0x00
 0x60,   ;  9c BRANCH	:clear_cluster_pages
  
 ; :status_stop
 ;--------------
 0x5,   ;  9d STATUS STOP
  
 ;:cluster_read_write_error
 ;------------------------
 ;      NOP
 ;      STATUS	STOP ERROR
  
 ;:erase_write_pass
 ;---------------- 
 ;      LD	A CMP10
 ;      EXCHANGE
 ;      BCLR4			;if erase cmd then 2nd cmd is 0xd0
 ;      LD	A ADR_BUFFER01	; ADR_BUFFER01 = 0x00
 ;      BRANCH	:clear_cluster_pages
  
 ;:status_stop
 ;--------------
 ;      STATUS STOP
  
 ;--------------------------------------------------------
 ;	START ADDRESS FOR read and check all 0's
 ;--------------------------------------------------------
 ; :read_check_cluster
 ;------------------
 0xa0,   ;  9e LD	MSB 0		;data_flash port = input
 0xb9,   ;  9f LD	LSB 9		;DATA_FLASH Port driven by FCI  
 0x8d,   ;  a0 LD	CTRL_FCI	;PARALLEL Port driven by FCI
 0xb2,   ;  a1 LD	LSB 2
 0x8b,   ;  a2 LD	CMP11
 0xb8,   ;  a3 LD	LSB 8
 0x89,   ;  a4 LD	CMP01
 0xa4,   ;  a5 LD	MSB 4
 0xb0,   ;  a6 LD	LSB 0		;CMP1 = 0x840
 0x88,   ;  a7 LD	CMP00
  
 ;      LD	MSB 15
 ;      LD	LSB 15
 ;      LD	ADR_BUFFER00
  
 ;      LD	DATA_BUFFER0
 ;      LD	Y
 ;      DECY
  
 ; :loop_read_all_pages
 ;-------------------
 0xc5,   ;  a8 LD	A ADR_BUFFER01
 0x84,   ;  a9 LD	ADR_BUFFER00
 0x87,   ;  aa LD	ADR_BUFFER11	; ADR0 = 0x0000
  
 ; :wait_read_page
 0xd0,   ;  ab LD	A DR_PARALLEL
 0x33,   ;  ac EXCHANGE
 0x28,   ;  ad BCLR1
 ; JP :wait_read_page
 0x63,   ;  ae JP  -3
  
 ; :loop_read_page
 ;--------------
 0xcb,   ;  af LD	A CMP11
 0x90,   ;  b0 LD	DR_PARALLEL	; RD = 0
 0xba,   ;  b1 LD	LSB 10
 0x90,   ;  b2 LD	DR_PARALLEL	; RD = 1
 0xcc,   ;  b3 LD	A DATA_FLASH
 0x8,   ;  b4 CP	A=>X
 ; JP :cluster_read_write_error
 0x7e,   ;  b5 JP  -30
 0x27,   ;  b6 ADDER16	ADR_BUFFER0
 0xd,   ;  b7 CP	ADR_BUFFER0<CMP0
 ; JP :loop_read_page
 0x69,   ;  b8 JP  -9
 ;      DECY
 ;      CP	ALWAYS
 0xc7,   ;  b9 LD	A ADR_BUFFER11	;to be changed
 0x60,   ;  ba BRANCH :clear_cluster_pages
  
 ;:stop_or_error
 ;-------------
 ;      STATUS STOP
  
 ;---------------------------------------------------------------
 ;		START ADDRESS FOR read_spare & check_spare
 ; redundant area is read to address of 1F0-1FF
 ;------------------------------------------------------------------------------------------------
 ; 1F0 | 1F1 | 1F2 | 1F3 | 1F4 | 1F5 | 1F6 | 1F7 | 1F8 | 1F9 | 1FA | 1FB | 1FC | 1FD | 1FE | 1FF |
 ;    Reserved Field     | DAT | BLK |  Address1 |   ECC Field-2   |  Address2 |   ECC Field-1   |
 ;------------------------------------------------------------------------------------------------
 ; :init_read_spare
 ;---------------
 0xaf,   ;  bb LD	MSB 15
 0xb0,   ;  bc LD	LSB 0
 0x82,   ;  bd LD	Y		; Y = 0xF0
 0xa2,   ;  be LD	MSB 2
 0x9f,   ;  bf LD	BUFFER_MNGT	; segment offset = 1, going to use <Y> for reading spare area
 0x33,   ;  c0 EXCHANGE
 0x88,   ;  c1 LD	CMP00		; CMP00 = 0x02, used for toggling bit for reading
  
 ;      LD	MSB 0		; data_flash port = intput   
 0xb9,   ;  c2 LD	LSB 9		; DATA_FLASH Port driven by FCI 
 0x8d,   ;  c3 LD	CTRL_FCI	; PARALLEL Port driven by FCI 
  
 ; :test_busy_line
 ;--------------
 0xd0,   ;  c4 LD	A DR_PARALLEL
 0x33,   ;  c5 EXCHANGE
 0x28,   ;  c6 BCLR1
 ; JP :test_busy_line
 0x63,   ;  c7 JP  -3
  
 ; read_spare
 ;-----------
 ; :read_spare
 0xc8,   ;  c8 LD	A CMP00
 0x90,   ;  c9 LD	DR_PARALLEL	; RD = 0
 0xba,   ;  ca LD	LSB 10
 0x90,   ;  cb LD	DR_PARALLEL	; RD = 1
  
 0xcc,   ;  cc LD	A DATA_FLASH	; load DATA_FLASH
 0x80,   ;  cd LD	<Y>
 0x3d,   ;  ce INCY
 ; JP :read_spare
 0x67,   ;  cf JP  -7
  
 ;------------------------------------------
 ; check Block_Status has no more than one 0
 ;------------------------------------------
 0xc5,   ;  d0 LD	A ADR_BUFFER01
 0x89,   ;  d1 LD	CMP01
 0xc1,   ;  d2 LD	A X
 0x87,   ;  d3 LD	ADR_BUFFER11
 0x88,   ;  d4 LD	CMP00		; CMP0 = 0x0001
 0xb8,   ;  d5 LD	LSB 8		; Y = 0x08; points to a pattern array as following
 0x82,   ;  d6 LD	Y		; { ~0x00, ~0x01, ~0x02, ~0x04, ~0x08, ~0x10, ~0x20, ~0x40, ~0x80 }
 0xaf,   ;  d7 LD	MSB 15
 0xb5,   ;  d8 LD	LSB 5
 0x86,   ;  d9 LD	ADR_BUFFER10	; pointer 1 = 0x01F5, points to Block_Status of the redundant area
  
 ; :check_Block_Status
 ;------------------
 0xdc,   ;  da LD	A DATA_BUFFER1
 0x81,   ;  db LD	X
 0xc0,   ;  dc LD	A <Y>
 0x9,   ;  dd CP	A<X
 ; JP :check_Block_Status_next
 0x45,   ;  de JP  5
 0x81,   ;  df LD	X
 0xdc,   ;  e0 LD	A DATA_BUFFER1
 0x8,   ;  e1 CP	A=>X			; we found one match on the array
 ; JP :good_Block_Status
 0x44,   ;  e2 JP  4
 ; :check_Block_Status_next
 ;-----------------------
 0x3c,   ;  e3 DECY
 ; JP :check_Block_Status
 0x6a,   ;  e4 JP  -10
  
 ; :cluster_error
 ;-------------
 0x7,   ;  e5 STATUS	STOP ERROR
  
 ; :good_Block_Status
 ;-----------------
 0xc7,   ;  e6 LD	A ADR_BUFFER11
 0x81,   ;  e7 LD	X		; X = 1
 0x2f,   ;  e8 ADDER16	ADR_BUFFER1	; buffer pointer 1 = 0x01F6
 0xdc,   ;  e9 LD	A DATA_BUFFER1	; high byte of Address1
 0x85,   ;  ea LD	ADR_BUFFER01
 0x2f,   ;  eb ADDER16	ADR_BUFFER1
 0xdc,   ;  ec LD	A DATA_BUFFER1
 0x84,   ;  ed LD	ADR_BUFFER00	; ADR_BUFFER0 = Address1-Field
 0xd,   ;  ee CP	ADR_BUFFER0<CMP0; check with 0x0001, it may be a CIS
  
 ; JP :cluster_error
 0x6a,   ;  ef JP  -10
 0xaf,   ;  f0 LD	MSB 15
 0xbb,   ;  f1 LD	LSB 11
 0x86,   ;  f2 LD	ADR_BUFFER10	; skip the ECC Field-2
  
 0xdc,   ;  f3 LD	A DATA_BUFFER1
 0x89,   ;  f4 LD	CMP01
 0x2f,   ;  f5 ADDER16	ADR_BUFFER1
 0xdc,   ;  f6 LD	A DATA_BUFFER1
 0x88,   ;  f7 LD	CMP00		; CMP0 = Address2-Field
 0xd,   ;  f8 CP	ADR_BUFFER0<CMP0
 ; JP :cluster_error
 0x74,   ;  f9 JP  -20
 0x26,   ;  fa SUB16	ADR_BUFFER0
 0xc,   ;  fb CP	ADR_BUFFER0=>CMP0
 ; JP :cluster_error
 0x77,   ;  fc JP  -23
  
 0x5,   ;  fd STATUS	STOP

⌨️ 快捷键说明

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