diff --git a/lib/flashwritelib.asx b/lib/flashwritelib.asx index 1907bd0..f52007a 100644 --- a/lib/flashwritelib.asx +++ b/lib/flashwritelib.asx @@ -1,78 +1,243 @@ ; flash eeprom library ; by JHusak , 04.01.2020 ; free to use. -lstore_x dta 0 -; x - 0x0 or 0x40 - chip select -; c - 1 - format, 0 - write - ;.print flashcnt -flashoppreamble +; Nice to have procedures, because mads may exclude unused procedures (-x in cmdl) +;.def STRIPPED + +;.def FLASH_INCLUDE_ALL +;FLASH_TYPE equ M_TYPE_28SF +;FLASH_TYPE equ M_TYPE_29SF +FLASH_TYPE equ M_TYPE_39SF +;FLASH_TYPE equ M_TYPE_29F + +; x - 0x0 or 0x40 - chip select; +; a - $80 - format, $90 - enter id mode, $a0 - writebyte +C_ID_MODE equ $90 + +M_TYPE_28SF equ $88 +M_TYPE_29SF equ $89 +M_TYPE_39SF equ $99 +M_TYPE_29F equ $09 ; used in MaxFlash BM29F040 + +M_SSIZE_28SF equ $0100 ; sector size +M_SSIZE_29SF equ $0080 ; sector size +M_SSIZE_39SF equ $1000 ; sector size +M_SSIZE_29F equ $10000 ; sector size; MAXFlash, protocol compatible with 39sf0x0 +;Problems 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 +; - 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 +; +; 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 + +.IF (FLASH_TYPE = M_TYPE_39SF) .or .def FLASH_INCLUDE_ALL +TRIGGER_FORMAT equ $10 +C_FORMAT equ $80 +C_BYTE_PROG equ $a0 +flashoppreamble pha - txa + lda #C_BYTE_PROG + scc + lda #C_FORMAT ; only if c set + sta command + pla + jmp @+ +flashoppreamble_acc ; 39sf0x0, 29F040 + sta command +@ txa pha ; when write byte x must be set to either 0 or 40 temporarily and #$40 tax - ; $5555<$aa -@ sta $d502,x - lda #$aa - sta $b555 - ; $2aaa<$55 + sta $d502,x + mva #$aa $b555 ; $5555<$aa sta $d501,x - lda #$55 - sta $aaaa + mva #$55 $aaaa ; $2aaa<$55 ; $5555<$80 sta $d502,x - ; sector format: carry set - scc - lda #$80 ; sector erase - scs - lda #$a0 ; byte programm - sta $b555 - bcc @+ - ; $5555<$aa +command equ *+1 + mva #$ff $b555; will become command: FORMAT/ID_MODE/BYTE_PROG + cmp #C_FORMAT + bne @+ ; if not FORMAT, procedure finishes + ; FORMAT part, more to write sta $d502,x - lda #$aa - sta $b555 - ; $2aaa<$55 + mva #$aa $b555 ; $5555<$aa sta $d501,x - lda #$55 - sta $aaaa - - ; PREPARE FOR SECTOR TO ERASE - - ; set upper bank bits + mva #$55 $aaaa ; $2aaa<$55 @ pla tax - pla rts +.endif +.if (FLASH_TYPE=M_TYPE_29SF) .or .def FLASH_INCLUDE_ALL +TRIGGER_FORMAT equ $10 +C_FORMAT equ $80 +C_BYTE_PROG equ $a0 +flashoppreamble + pha + lda #C_BYTE_PROG + scc + lda #C_FORMAT ; only if c set + sta command + pla + jmp @+ +flashoppreamble_acc ; 29sf040 + sta command +@ 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 failed +; if c cleared, x=vendor, y=product code +; there are some memories which need multiple read, but we do not abuse them. +check_vendor + lda #C_ID_MODE + jsr flashoppreamble_acc + ldx $a000 ; vendor + ldy $a001 ; id + mva #$f0 $a000 ; exit read_id + mva #0 flash_size + + cpx #$BF; SST + bne next1 + ; nice to store that this is SST + cpy #$B5 + bne @+ + lda #$0f +@ cpy #$B6 + bne @+ + lda #$1f +@ cpy #$B7 + bne @+ + lda #$3f +@ sta flash_size + clc + rts +next1 +.if 0 + lda #C_ID_MODE + jsr flashoppreamble_acc + ldx $a000 ; vendor + ldy $a001 ; id + mva #$f0 $a000 ; exit read_id + mva #0 flash_size + + cpx #$BF; SST + bne cvexit + ; nice to store that this is SST + cpy #$24 + bne @+ + lda #$1f +@ cpy #$13 + bne @+ + lda #$3f +@ sta flash_size + clc + rts +.endif +cvexit + sec + rts +.endif + + + +; -------------------------- flashformatchip2 ldx #$40 dta { bit.w } +flashformatchip1 + ldx #$0 +; -------------------------- +; PROCEDURE +; x = 0 or 0x40 - flash chip address. flashformatchip sei stx store_x - sec ; format preamble - jsr flashoppreamble ; does not touch A + lda #C_FORMAT + jsr flashoppreamble_acc ; does not touch A sta $d502,x - lda #$10 - sta $b555 - lda #$ff - sta flashcmp - jsr flashcheckresult - beq @+ - ; cart is off and cli -; sec ; error -; rts -@ lda #$3f + 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 + lda #$3f ; this depends on flash size, $0f, $1f, $3f sta flashformatcounter -@ sei +flashbankloop sei ldx store_x flashformatcounter equ*+1 sta $d5FF,x ; set chip (x) and bank @@ -83,16 +248,16 @@ flashformatcounter equ*+1 sta flashformataddrcheck + 2 ; check whole sector against 0xff jsr flashchecksectorformatted_bare ; destroys x - bcs @+ ; format error + bcs flashformatexit ; format error if c set dec flashformatcounter - bpl @- -@ jmp flashcartoff ; preserves C - + bpl flashbankloop +flashformatexit jmp flashcartoff ; preserves C +store_x dta 0 ; -------------------------- ; PROCEDURE flashformatsector -; x - even sector 00 - 7f +; x - bank number 00 - 7f (even sector>>1) ; a - erase 4KB from $B000 if A=$B0, FROM $A000 IF A=$A0 ; format 4kb evensector ; strange form - easily maps to cartridge banks @@ -103,27 +268,28 @@ flashformatsector sta flashformatstorea sei sta $d500,x + ; store #$a0 or #$b0 sta flashformataddrcheck + 2 jsr flashchecksectorformatted bcc flashsectorformatgood sei flashformatstorex equ * + 1 ldx #0 ; filled before -flashformatstorea equ * + 1 - lda #0 ; filled before ; check least sector bit - sec ; format preamble - jsr flashoppreamble ; does not touch A,X + lda #C_FORMAT + jsr flashoppreamble_acc ; does not touch A,X sta $D500,x ; A must be either $A0 or $B0 +flashformatstorea equ * + 1 + lda #0 ; filled before sta flashtmpaddr+1 sta flashformataddrcheck + 2 lda #$30 flashtmpaddr equ *+1 - sta $a000 ; Format! - jsr flashcheckresult + sta $a000 ; SECTOR FORMAT INVOKED HERE! + jsr wait4flashcheckresult ; sei lda flashformatstorea @@ -171,28 +337,26 @@ flashwritebyte sta $D500,x ; select bank, chip ldy #{ cmp.w } jsr flashprocessbyte - bne @+ - ;clc - ;jmp flashcartoff + bne byte_differs sta $D580 cli clc rts -@ sta flashcmp - +byte_differs + sta flashcmp sei - clc ; write byte preamble - jsr flashoppreamble ; preserves A,X - + pha + lda #C_BYTE_PROG + jsr flashoppreamble_acc ; preserves A,X + pla + ; set right bank sta $D500,x - ldy #{ sta.w } - ; WRITE BYTE ! - jsr flashprocessbyte + jsr flashprocessbyte ; WRITE BYTE INVOKED ! -flashcheckresult ; sei mode +wait4flashcheckresult ; sei mode mva #0 flashcnt - ldy #5 ; first time wait short first turn to speed up byte write. + ldy #1 ; first time wait short first turn to speed up byte write. bne @+ flashwaitfordone @@ -213,23 +377,23 @@ flashwaitfordone @ ldy #{ lda.w } jsr flashprocessbyte + sta flashval ldy #{ eor.w } jsr flashprocessbyte inc flashcnt bne @+ - jsr flashcartoff + sta $d580 lda #$ff ; status rts @ and #$40 bne flashwaitfordone -; in acc will be mismatched byte - ldy #{ lda.w } - jsr flashprocessbyte - jsr flashcartoff ; preserves axy, not p + sta $d580 +flashval equ *+1 + lda #0 flashcmp equ *+1 cmp #0 -; when non zero = error +; when byte compare non zero = error rts flashcnt @@ -265,39 +429,3 @@ flashcartoff pla rts -; PROCEDURE -; Y-char to write -PRINTWHAT - php - pha - txa - pha - tya - pha - jsr $f2b0 - pla - tay - pla - tax - pla - plp - rts -PRINTDOT - php - pha - txa - pha - tya - pha - lda #'.' - jsr $f2b0 - pla - tay - pla - tax - pla - plp - rts -; ----------------------- IINT -; org $2e2 -; dta a($600) diff --git a/various_flashers/034M_Action36ACS_orig/ACTION36flashwrite.xex b/various_flashers/034M_Action36ACS_orig/ACTION36flashwrite.xex index d7d75a6..b3b6e83 100644 Binary files a/various_flashers/034M_Action36ACS_orig/ACTION36flashwrite.xex and b/various_flashers/034M_Action36ACS_orig/ACTION36flashwrite.xex differ diff --git a/various_flashers/034M_Mac65_1.02_DDT/MAC65DDTflashwrite.xex b/various_flashers/034M_Mac65_1.02_DDT/MAC65DDTflashwrite.xex index bb5f207..be28d8f 100644 Binary files a/various_flashers/034M_Mac65_1.02_DDT/MAC65DDTflashwrite.xex and b/various_flashers/034M_Mac65_1.02_DDT/MAC65DDTflashwrite.xex differ diff --git a/various_flashers/8kB_PILOT/PILOTflashwrite.xex b/various_flashers/8kB_PILOT/PILOTflashwrite.xex index d151c84..5023e40 100644 Binary files a/various_flashers/8kB_PILOT/PILOTflashwrite.xex and b/various_flashers/8kB_PILOT/PILOTflashwrite.xex differ diff --git a/various_flashers/8kB_WSFN/WSFNflashwrite.xex b/various_flashers/8kB_WSFN/WSFNflashwrite.xex index 01fd333..0260f60 100644 Binary files a/various_flashers/8kB_WSFN/WSFNflashwrite.xex and b/various_flashers/8kB_WSFN/WSFNflashwrite.xex differ diff --git a/various_flashers/M091_Action36ACS_orig/M091ACTION36flashwrite.xex b/various_flashers/M091_Action36ACS_orig/M091ACTION36flashwrite.xex index 3f21eb1..81c3a0b 100644 Binary files a/various_flashers/M091_Action36ACS_orig/M091ACTION36flashwrite.xex and b/various_flashers/M091_Action36ACS_orig/M091ACTION36flashwrite.xex differ diff --git a/various_flashers/M091_BASICXE41/BASICXEflashwrite.xex b/various_flashers/M091_BASICXE41/BASICXEflashwrite.xex index fd86e9e..820e1d5 100644 Binary files a/various_flashers/M091_BASICXE41/BASICXEflashwrite.xex and b/various_flashers/M091_BASICXE41/BASICXEflashwrite.xex differ diff --git a/various_flashers/M091_OSSBasicXL103/BASICXLflashwrite.xex b/various_flashers/M091_OSSBasicXL103/BASICXLflashwrite.xex index 7599810..c8a992e 100644 Binary files a/various_flashers/M091_OSSBasicXL103/BASICXLflashwrite.xex and b/various_flashers/M091_OSSBasicXL103/BASICXLflashwrite.xex differ diff --git a/various_flashers/flashwriteexample/flashwrite.xex b/various_flashers/flashwriteexample/flashwrite.xex new file mode 100644 index 0000000..d610acb Binary files /dev/null and b/various_flashers/flashwriteexample/flashwrite.xex differ