📄 smc_dtc_code0.fsm
字号:
;===================================================================
;
; SMART MEDIA CARD
;
;===================================================================
;--------------
; INIT SMC MODE
;--------------
:init_smc_play_mode
;------------------
LD MSB 0
LD LSB 15
LD DDR_PARALLEL
LD OR_PARALLEL
LD LSB 10
LD DR_PARALLEL
LD LSB 6
LD DDR_MPEG
LD OR_MPEG
NOP
LD LSB 0
LD DR_MPEG
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 LSB 1
LD MSB 0
LD X ; X<=1
LD MASK ; MASK = 1 ( used for XOR fct )
STATUS STOP ; end of INIT
;---------------------
; SMC_DTC_Dummy_Write
;---------------------
LD MSB 0
LD LSB 9 ; DATA_FLASH Port driven by FCI
LD CTRL_FCI ; PARALLEL Port driven by FCI
LD LSB 0
LD ADR_BUFFER01
LD LSB 14
LD MSB 15
LD ADR_BUFFER00
LD A DATA_BUFFER0
LD CMP00 ; load the even/odd bit
LD LSB 15
LD MSB 15
LD MASK
LD ADR_BUFFER00
LD A DATA_BUFFER0
LD Y ; load number of pages
DECY
:dummy_write
;-----------
LD A CMP00
XOR
LD CMP00 ; change the parity bit
BCLR1
JP :wait_buffer1_full
:wait_buffer0_full
LD A BUFFER_MNGT
BCLR3
JP :wait_buffer0_full
:release_buffer0
;---------------
LD A BUFFER_MNGT
BSET1
LD BUFFER_MNGT
CP ALWAYS
JP :update_buffer_flag
:wait_buffer1_full
LD A BUFFER_MNGT
BCLR4
JP :wait_buffer1_full
:release_buffer1
;---------------
LD A BUFFER_MNGT
BSET2
LD BUFFER_MNGT
:update_buffer_flag
;------------------
LD LSB 0 ; clear the buffer full flags
LD BUFFER_MNGT
LD A Y
LD DATA_BUFFER0
DECY
JP :dummy_write
STATUS STOP
;---------------------------------
;For Bad Cluster recognition
;---------------------------------
LD MSB 0
LD LSB 15
LD DDR_PARALLEL
LD OR_PARALLEL
LD MSB 15
LD MASK
XOR
LD BUFFER_MNGT ; Clear segment offset
LD ADR_BUFFER01
LD ADR_BUFFER10
LD CMP10
LD LSB 1
LD ADR_BUFFER11 ; buffer pointer 1 = 0x0100
LD LSB 5
LD CMP11 ; CMP1 = 0x0500
;-------------------------
; Output the command 0x50
;-------------------------
:start_read_spare_area
LD MSB 1 ;data_flash port = output
LD LSB 9 ;DATA_FLASH Port driven by FCI
LD CTRL_FCI ;PARALLEL Port driven by FCI
:pre_wait_card_ready
;---------------
LD A DR_PARALLEL
EXCHANGE
BCLR1 ; test busy line
JP :pre_wait_card_ready
;For 256mb
;-----------
LD MSB 0
LD LSB 0
LD DATA_FLASH
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
;------------------------------------
; Output the 3 or 4 or 5 bytes of address from 0xE5-0xE1
;------------------------------------
LD MSB 0
LD LSB 1
LD X ; X = 1
LD MSB 14
LD LSB 6
LD ADR_BUFFER00 ; buffer pointer 0 = 0x00E6
LD A DATA_BUFFER0 ; load the number of address bytes
LD Y
DECY
SUB16 ADR_BUFFER0 ; send address from high byte to low byte,256mb
:loop_send_address
;-----------------
LD A DATA_BUFFER0
LD DATA_FLASH
LD MSB 0
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
SUB16 ADR_BUFFER0
DECY
JP :loop_send_address
LD MSB 0
LD LSB 10
LD DR_PARALLEL ; ALE = 0, WE = 1
;---------------------------------------------------
;For 256 MB or 2K page send 0x30 command,
;---------------------------------------------------
;send 0x30 cmd
LD MSB 3
LD LSB 0
LD DATA_FLASH
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
;---------------
;End for 256mb
;---------------
:Read_Spare
;------------
LD MSB 0 ; data_flash port = intput
LD LSB 9 ; DATA_FLASH Port driven by FCI
LD CTRL_FCI ; PARALLEL Port driven by FCI
;---------------------
; Read the spare area
;---------------------
:init_read_spare
LD LSB 2
LD CMP00 ; CMP00 = 0x02 for toggling RD line
LD LSB 5
LD Y ; Y = 5
LD MSB 14
LD LSB 07
LD ADR_BUFFER00 ; ADR0 = 0x00E7, points to spare area
LD CMP01 ; save this address for later use
:wait_card_ready
;---------------
LD A DR_PARALLEL
EXCHANGE
BCLR1 ; test busy line
JP :wait_card_ready
; read_spare
;------------
:read_spare
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
ADDER16 ADR_BUFFER0
DECY
JP :read_spare
;-------------------------------
; Check the spare area is valid
;-------------------------------
LD A CMP01
LD ADR_BUFFER00 ; ADR0 = 0x00E7, points to spare area
LD MSB 0
LD LSB 5
LD Y ; 6 BYTES TO READ
:Check_first_6_bytes
;-------------------
LD A DATA_BUFFER0
XOR ; MASK = 0xFF
CP A=>X ; X = 1
JP :spare_area_error
ADDER16 ADR_BUFFER0 ; Increment pointer
DECY
JP :Check_first_6_bytes
:increase_page_address
;------------------------
LD MSB 14
LD LSB 4
LD Y
LD A <Y>
BCLR2 ; if first block is checked
JP :continue
STATUS STOP
:continue
DECY
LD A <Y> ; 0xe3 ->1st row address byte
BSET1 ; If pointer is at 2nd page of the cluster
JP :increse_cluster_address
LD <Y>
LD MSB 14
LD LSB 2
CP ALWAYS
BRANCH :check_next_page
:stop_it2
STATUS STOP ERROR
:spare_area_error
;----------------
; STATUS STOP ERROR
LD MSB 14
LD LSB 4
LD Y
LD A <Y>
BSET2 ;if first block is checked
JP :stop_it2
LD MSB 0
LD LSB 3
LD Y ;To save 4 adr bytes
LD MSB 14
LD LSB 1 ; Point to MSB of Physical Addr 0xE1
LD ADR_BUFFER00
:save_nxt_byte
LD A DATA_BUFFER0
LD DATA_BUFFER1
ADDER16 ADR_BUFFER1
ADDER16 ADR_BUFFER0
DECY
JP :save_nxt_byte
LD MSB 14
LD LSB 3
LD Y
:increse_cluster_address
LD A MASK
LD ADR_BUFFER00
LD A DATA_BUFFER0 ;0xff points to cluster size
LD X
CLC
LD A <Y>
BCLR1
ADDER8 X
LD <Y> ; byte 0 of the address
DECY ; Y = 0xE2
LD LSB 0
LD MSB 0
LD X ; clear X
LD A <Y>
ADDER8 X ; byte 1 of the address
LD <Y>
;Carry at 2nd Row byte -> End of Zone
CP CARRY
JP :nxt_zone
:check_next_page
;------------------
LD MSB 4
LD LSB 14
CP ALWAYS
BRANCH :start_read_spare_area
:stop_it
STATUS STOP
:nxt_zone
LD MSB 0
LD LSB 1
LD X
SUB16 ADR_BUFFER0 ; 0xfe =number of zones
LD A DATA_BUFFER0
CLC
SUB8 X
CP A<X
JP :stop_it
:increase_zone
LD DATA_BUFFER0
DECY ;Y = 0xE1 ->Zone adr Byte
LD A <Y>
CLC
ADDER8 X
LD <Y> ; Move to nxt zone
CP ALWAYS
JP :check_next_page
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -