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