📄 smc_dtc_format256_fsm.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 + -