mirror of
https://github.com/Pecusx/jataricart.git
synced 2026-05-20 22:33:22 +02:00
working memory recognition
This commit is contained in:
+51
-40
@@ -4,8 +4,8 @@
|
||||
|
||||
icl "lib_28sf0x0.asm"
|
||||
icl "lib_29f0x0.asm"
|
||||
icl "lib_29sf0x0.asm"
|
||||
icl "lib_39sf0x0.asm"
|
||||
num_mems = 3
|
||||
|
||||
; CONSTANTS
|
||||
m_offsets
|
||||
@@ -24,29 +24,36 @@ m_kind .byte 0
|
||||
m_iter .byte 0
|
||||
|
||||
; ro section again
|
||||
; Protocols for known kinds of memory:
|
||||
; 28sf0x0 protokol unlock/write
|
||||
; 39sf0x0 protokol 5555/AA;2aaa/55
|
||||
; 29f0x0 protokol 555/AA;2aa/55
|
||||
; Working scan order; scanning from the end;
|
||||
M_CHECK_VECS .word M_VECTORS_29F, M_VECTORS_39SF, M_VECTORS_28SF
|
||||
|
||||
M_CHECK_VECS .word M_VECTORS_28SF, M_VECTORS_29F, M_VECTORS_29SF, M_VECTORS_39SF
|
||||
;Problems with writing:
|
||||
; --------------------------------------------------------------------
|
||||
;Problems to solve with writing:
|
||||
; - check flash presence
|
||||
; - flash protocol
|
||||
; - size of flash 1,2
|
||||
; - size of sector in some cases
|
||||
; - number of flashes (easy, they do not overlap)
|
||||
; All can be read by erasing memory, writing several bytes and reading them
|
||||
; For flash recognition
|
||||
; All can be read by erasing memory, writing several bytes and reading them;
|
||||
; But we will rely rather on user's choice not to wear memory
|
||||
|
||||
; First detection is to read raw memory and id and compare results. However, we do not want to keep all those ids to recognise.
|
||||
; Second detection is to compare contents. But not very reliable as contents may repeat.
|
||||
; And ome issues may occur when no memory inserted.
|
||||
; Eventually, for flash recognition
|
||||
; - format,
|
||||
; - write 128 kbytes, read more -> if not ff, flash is 128k
|
||||
; - write additional 128KB, read more ->if not ff flash is 256kB, else is 512kb
|
||||
; - write 128k-1 byte, read 2*128k-1 -> if not ff flash is 128k
|
||||
; - write 256k-1 byte, read 2*256k-1 -> if not ff flash is 256kB, else is 512kb
|
||||
;
|
||||
; First detection is to read raw memory and id and compare results. Some issues may occur when no memory inserted.
|
||||
|
||||
;flash_detect_protocol:
|
||||
; lda #ID_MODE
|
||||
; jsr flashoppreamble_5555_2aaa
|
||||
|
||||
; c parameter as format/writebyte
|
||||
; for compatibility, 5555_2aaa only
|
||||
; ??? c parameter as format/writebyte
|
||||
; ??? for compatibility, 5555_2aaa only
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; --------------------------
|
||||
; PROCEDURE
|
||||
; x = 0 or 0x40 - flash chip address.
|
||||
@@ -54,10 +61,11 @@ M_CHECK_VECS .word M_VECTORS_28SF, M_VECTORS_29F, M_VECTORS_29SF, M_VECTORS_39SF
|
||||
; this fails only when somebody stores vendor and product bytes
|
||||
; at the proper cells.
|
||||
;
|
||||
; then in the code we call lda #offset/jsr jsrtoproc
|
||||
; then in the code we call lda #offset/jsr jsrtovetorproc
|
||||
check_type
|
||||
ldy #0-2
|
||||
ldy #(2*(num_mems-1))
|
||||
?again
|
||||
sty m_iter
|
||||
; store default values
|
||||
sta $d500,x
|
||||
lda $a000
|
||||
@@ -65,34 +73,34 @@ check_type
|
||||
lda $a001
|
||||
sta m_kind
|
||||
|
||||
iny
|
||||
iny
|
||||
sty m_iter
|
||||
|
||||
jsr jsrtosoftidentry
|
||||
|
||||
sta $d500,x
|
||||
lda $a000 ; vendor
|
||||
cmp m_vendor
|
||||
bne OK
|
||||
sta m_vendor
|
||||
beq ?next
|
||||
lda $a001 ; id
|
||||
cmp m_kind
|
||||
sta m_kind
|
||||
beq ?next
|
||||
bne ?OK
|
||||
|
||||
?next
|
||||
ldy m_iter
|
||||
cpy #$6
|
||||
bne ?again
|
||||
dey
|
||||
dey
|
||||
bpl ?again
|
||||
; error
|
||||
sec
|
||||
rts
|
||||
?OK
|
||||
lda M_CHECK_VECS+1,y
|
||||
sta M_VECTORS+1
|
||||
sta M_VECTOR+1
|
||||
lda M_CHECK_VECS,y
|
||||
sta M_VECTORS
|
||||
sta M_VECTOR
|
||||
|
||||
lda #softid_exit
|
||||
jsr jsrtoproc
|
||||
jsr jsrtovetorproc
|
||||
clc
|
||||
rts
|
||||
|
||||
@@ -106,12 +114,12 @@ jsrtosoftidentry
|
||||
; PROCEDURE
|
||||
; performs jump to vector table at offset in A provided
|
||||
; y passed to the procedure called
|
||||
jsrtoproc
|
||||
jsrtovetorproc
|
||||
php ; preserve C
|
||||
clc
|
||||
adc M_VECTORS
|
||||
adc M_VECTOR
|
||||
sta tmpa
|
||||
lda M_VECTORS+1
|
||||
lda M_VECTOR+1
|
||||
adc #0
|
||||
plp ; restore C
|
||||
pha
|
||||
@@ -133,12 +141,14 @@ flashformatchip
|
||||
|
||||
sei
|
||||
stx store_x
|
||||
lda #C_FORMAT
|
||||
jsr flashoppreamble_acc ; does not touch A
|
||||
sta $d502,x
|
||||
; lda #C_FORMAT
|
||||
sec
|
||||
lda #flashoppreamble
|
||||
jsr jsrtovetorproc ; does not touch A
|
||||
;sta $d502,x
|
||||
; !!!!!!!!!!!!!!!!!!! CHECK THIS !!!!!!!!!!!!!!!!!!!!
|
||||
lda #TRIGGER_FORMAT
|
||||
sta $b555 ; FORMAT HERE TRIGGERED!
|
||||
;lda #TRIGGER_FORMAT
|
||||
;sta $b555 ; FORMAT HERE TRIGGERED!
|
||||
; not needed to mva $ff flashcmp
|
||||
jsr wait4flashcheckresult ; waits for format finished
|
||||
; then check number of banks for FFs
|
||||
@@ -185,9 +195,9 @@ flashformatsector
|
||||
flashformatstorex equ * + 1
|
||||
ldx #0 ; filled before
|
||||
; check least sector bit
|
||||
|
||||
lda #C_FORMAT
|
||||
jsr flashoppreamble_acc ; does not touch A,X
|
||||
sec
|
||||
lda #flashoppreamble ; does not touch A,X
|
||||
jsr jsrtovetorproc
|
||||
sta $D500,x
|
||||
; A must be either $A0 or $B0
|
||||
flashformatstorea equ * + 1
|
||||
@@ -255,8 +265,9 @@ byte_differs
|
||||
sta flashcmp
|
||||
sei
|
||||
pha
|
||||
lda #C_BYTE_PROG
|
||||
jsr flashoppreamble_acc ; preserves A,X
|
||||
clc ; byte preamble
|
||||
lda #flashoppreamble ; preserves A,X
|
||||
jsr jsrtovetorproc
|
||||
pla
|
||||
; set right bank
|
||||
sta $D500,x
|
||||
|
||||
+17
-11
@@ -9,11 +9,12 @@ M_VECTORS_28SF
|
||||
jmp flashoppreamble_28SF
|
||||
jmp flash_lockchip_28SF
|
||||
jmp flash_unlockchip_28SF
|
||||
.byte "28SF0x0",0
|
||||
dta c'28SF0x0',0
|
||||
|
||||
flashoppreamble_28SF
|
||||
lda #C_BYTE_PROG_28SF
|
||||
bcc flashoppreamble_acc_28SF
|
||||
jsr flash_unlockchip_28SF
|
||||
lda #C_FORMAT_28SF ; only if c set
|
||||
sta $d500,x ; can be any address
|
||||
sta $a000; command select: FORMAT/ID_MODE/BYTE_PROG, any address
|
||||
@@ -23,16 +24,15 @@ flashoppreamble_acc_28SF ; 28SF0x0
|
||||
sta $d500,x
|
||||
sta $a000
|
||||
rts
|
||||
read_manufacturer_28SF
|
||||
sta D500,x ; x=0 or $40 else will read wrong
|
||||
lda $a000
|
||||
rts
|
||||
read_product_28SF
|
||||
sta D500,x ; x=0 or $40 else will read wrong
|
||||
lda $a001
|
||||
rts
|
||||
;read_manufacturer_28SF
|
||||
; sta $D500,x ; x=0 or $40 else will read wrong
|
||||
; lda $a000
|
||||
; rts
|
||||
;read_product_28SF
|
||||
; sta $D500,x ; x=0 or $40 else will read wrong
|
||||
; lda $a001
|
||||
; rts
|
||||
|
||||
softid_entry_28SF
|
||||
flash_unlockchip_28SF
|
||||
sta $D500,x ; x =0 or $40, else will not unlock
|
||||
; read from 1823H, 1820H, 1822H, 0418H, 041BH, 0419H, 041AH
|
||||
@@ -40,7 +40,13 @@ flash_unlockchip_28SF
|
||||
lda $A41A
|
||||
rts
|
||||
|
||||
softid_xit_28SF
|
||||
softid_entry_28SF
|
||||
sta $d500,x
|
||||
lda #$90
|
||||
sta $a000
|
||||
rts
|
||||
|
||||
softid_exit_28SF
|
||||
flash_lockchip_28SF
|
||||
sta $D500,x ; x =0 or $40, else will not unlock
|
||||
jsr flash_lock_preamb_28SF
|
||||
|
||||
+9
-8
@@ -2,7 +2,7 @@ TRIGGER_FORMAT_29F equ $10
|
||||
C_FORMAT_29F equ $80
|
||||
C_BYTE_PROG_29F equ $a0
|
||||
M_SSIZE_29F equ $10000 ; sector size; MAXFlash, protocol compatible with 39sf0x0
|
||||
command_ZP = $f0
|
||||
command_ZP_29F = $f0
|
||||
|
||||
M_VECTORS_29F
|
||||
jmp softid_entry_29F
|
||||
@@ -10,18 +10,18 @@ M_VECTORS_29F
|
||||
jmp flashoppreamble_29F
|
||||
jmp flash_lockchip_29F
|
||||
jmp flash_unlockchip_29F
|
||||
.byte "29F0x0",0
|
||||
dta c'29F0x0',0
|
||||
|
||||
flashoppreamble_29F
|
||||
pha
|
||||
lda #C_BYTE_PROG_29F
|
||||
scc
|
||||
lda #C_FORMAT_29F ; only if c set
|
||||
sta command_ZP
|
||||
sta command_ZP_29F
|
||||
pla
|
||||
.byte {bit.w}
|
||||
flashoppreamble_acc_29F ; 39sf0x0, 29F040
|
||||
sta command_ZP
|
||||
sta command_ZP_29F
|
||||
txa
|
||||
pha
|
||||
; when write byte x must be set to either 0 or 40 temporarily
|
||||
@@ -33,7 +33,7 @@ flashoppreamble_acc_29F ; 39sf0x0, 29F040
|
||||
mva #$55 $aaaa ; $2aaa<$55
|
||||
; $5555<$80
|
||||
sta $d502,x
|
||||
mva command_ZP $b555; will become command: FORMAT/ID_MODE/BYTE_PROG
|
||||
mva command_ZP_29F $b555; will become command: FORMAT/ID_MODE/BYTE_PROG
|
||||
cmp #C_FORMAT_29F
|
||||
bne @+ ; if not FORMAT, procedure finishes
|
||||
; FORMAT part, more to write
|
||||
@@ -43,22 +43,23 @@ flashoppreamble_acc_29F ; 39sf0x0, 29F040
|
||||
mva #$55 $aaaa ; $2aaa<$55
|
||||
@ pla
|
||||
tax
|
||||
flash_lockchip_29F
|
||||
flash_unlockchip_29F
|
||||
rts
|
||||
|
||||
;read_manufacturer_29F
|
||||
; sta D500,x ; x=0 or $40 else will read wrong
|
||||
; sta $D500,x ; x=0 or $40 else will read wrong
|
||||
; lda $a000
|
||||
; rts
|
||||
|
||||
;read_product_29F
|
||||
; sta D500,x ; x=0 or $40 else will read wrong
|
||||
; sta $D500,x ; x=0 or $40 else will read wrong
|
||||
; lda $a001
|
||||
; rts
|
||||
|
||||
|
||||
softid_exit_29F
|
||||
sta D500,x ; x=0 or $40 else will read wrong
|
||||
sta $D500,x ; x=0 or $40 else will read wrong
|
||||
lda #$f0
|
||||
sta $a000
|
||||
rts
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
C_FORMAT_29SF equ $80
|
||||
C_BYTE_PROG_29SF equ $a0
|
||||
M_SSIZE_29SF equ $0080 ; sector size
|
||||
command_ZP = $f0
|
||||
|
||||
M_VECTORS_29SF
|
||||
jmp softid_entry_29SF
|
||||
jmp softid_exit_29SF
|
||||
jmp flashoppreamble_29SF
|
||||
jmp flash_lockchip_29SF
|
||||
jmp flash_unlockchip_29SF
|
||||
.byte "29SF0x0",0
|
||||
|
||||
flashoppreamble_29SF
|
||||
pha
|
||||
lda #C_BYTE_PROG_29SF
|
||||
scc
|
||||
lda #C_FORMAT_29SF ; only if c set
|
||||
sta command_ZP
|
||||
pla
|
||||
.byte {bit.w}
|
||||
flashoppreamble_acc_29SF ; 29sf040
|
||||
sta command_ZP
|
||||
txa
|
||||
pha
|
||||
; when write byte x must be set to either 0 or 40 temporarily
|
||||
and #$40
|
||||
tax
|
||||
sta $d500,x
|
||||
mva #$aa $a555 ; $555<$aa
|
||||
mva #$55 $a2aa ; $2aa<$55
|
||||
; $555<command
|
||||
mva command_ZPff $a555; will become command: FORMAT/ID_MODE/BYTE_PROG
|
||||
cmp #C_FORMAT_29SF
|
||||
bne @+ ; if not FORMAT, procedure finishes
|
||||
; FORMAT part, more to write
|
||||
mva #$aa $a555 ; $555<$aa
|
||||
mva #$55 $a2aa ; $2aa<$55
|
||||
; PREPARE FOR SECTOR TO ERASE
|
||||
@ pla
|
||||
tax
|
||||
flash_unlockchip_29SF
|
||||
rts
|
||||
|
||||
;read_manufacturer_29SF
|
||||
; sta D500,x ; x=0 or $40 else will read wrong
|
||||
; lda $a000
|
||||
; rts
|
||||
|
||||
;read_product_29SF
|
||||
; sta D500,x ; x=0 or $40 else will read wrong
|
||||
; lda $a001
|
||||
; rts
|
||||
|
||||
softid_exit_29SF
|
||||
sta D500,x ; x=0 or $40 else will read wrong
|
||||
lda #$f0
|
||||
sta $a000
|
||||
rts
|
||||
|
||||
|
||||
softid_entry_29SF
|
||||
lda #$90
|
||||
bne flashoppreamble_acc_29SF
|
||||
|
||||
+11
-8
@@ -2,7 +2,7 @@ TRIGGER_FORMAT_39SF equ $10
|
||||
C_FORMAT_39SF equ $80
|
||||
C_BYTE_PROG_39SF equ $a0
|
||||
M_SSIZE_39SF equ $1000 ; sector size
|
||||
command_ZP = $f0
|
||||
command_ZP_39SF = $f0
|
||||
|
||||
M_VECTORS_39SF
|
||||
jmp softid_entry_39SF
|
||||
@@ -10,18 +10,18 @@ M_VECTORS_39SF
|
||||
jmp flashoppreamble_39SF
|
||||
jmp flash_lockchip_39SF
|
||||
jmp flash_unlockchip_39SF
|
||||
.byte "39SF0x0",0
|
||||
dta c'39SF0x0',0
|
||||
|
||||
flashoppreamble_39SF
|
||||
pha
|
||||
lda #C_BYTE_PROG_39SF
|
||||
scc
|
||||
lda #C_FORMAT_39SF ; only if c set
|
||||
sta command_ZP
|
||||
sta command_ZP_39SF
|
||||
pla
|
||||
.byte {bit.w}
|
||||
flashoppreamble_acc_39SF ; 39sf0x0, 29F040
|
||||
sta command_ZP
|
||||
sta command_ZP_39SF
|
||||
txa
|
||||
pha
|
||||
; when write byte x must be set to either 0 or 40 temporarily
|
||||
@@ -33,7 +33,7 @@ flashoppreamble_acc_39SF ; 39sf0x0, 29F040
|
||||
mva #$55 $aaaa ; $2aaa<$55
|
||||
; $5555<$80
|
||||
sta $d502,x
|
||||
mva command_ZP $b555; will become command: FORMAT/ID_MODE/BYTE_PROG
|
||||
mva command_ZP_39SF $b555; will become command: FORMAT/ID_MODE/BYTE_PROG
|
||||
cmp #C_FORMAT_39SF
|
||||
bne @+ ; if not FORMAT, procedure finishes
|
||||
; FORMAT part, more to write
|
||||
@@ -41,23 +41,26 @@ flashoppreamble_acc_39SF ; 39sf0x0, 29F040
|
||||
mva #$aa $b555 ; $5555<$aa
|
||||
sta $d501,x
|
||||
mva #$55 $aaaa ; $2aaa<$55
|
||||
sta $d502,x
|
||||
mva #$10 $b555 ; $5555<$10
|
||||
@ pla
|
||||
tax
|
||||
flash_lockchip_39SF
|
||||
flash_unlockchip_39SF
|
||||
rts
|
||||
|
||||
;read_manufacturer_39SF
|
||||
; sta D500,x ; x=0 or $40 else will read wrong
|
||||
; sta $D500,x ; x=0 or $40 else will read wrong
|
||||
; lda $a000
|
||||
; rts
|
||||
|
||||
;read_product_39SF
|
||||
; sta D500,x ; x=0 or $40 else will read wrong
|
||||
; sta $D500,x ; x=0 or $40 else will read wrong
|
||||
; lda $a001
|
||||
; rts
|
||||
|
||||
softid_exit_39SF
|
||||
sta D500,x ; x=0 or $40 else will read wrong
|
||||
sta $D500,x ; x=0 or $40 else will read wrong
|
||||
lda #$f0
|
||||
sta $a000
|
||||
rts
|
||||
|
||||
Reference in New Issue
Block a user