From 97a86cd876653ec56c12b4f33b7148bc7a44b99d Mon Sep 17 00:00:00 2001 From: Kuba Date: Wed, 25 Nov 2020 17:46:51 +0100 Subject: [PATCH] updated flashlib --- lib/flashwritelib.asx | 350 ++++++++++++------ .../ACTION36flashwrite.xex | Bin 26277 -> 26321 bytes .../MAC65DDTflashwrite.xex | Bin 26277 -> 26321 bytes .../8kB_PILOT/PILOTflashwrite.xex | Bin 9861 -> 9905 bytes various_flashers/8kB_WSFN/WSFNflashwrite.xex | Bin 9861 -> 9905 bytes .../M091ACTION36flashwrite.xex | Bin 26282 -> 26321 bytes .../M091_BASICXE41/BASICXEflashwrite.xex | Bin 26277 -> 26321 bytes .../M091_OSSBasicXL103/BASICXLflashwrite.xex | Bin 26277 -> 26321 bytes .../flashwriteexample/flashwrite.xex | Bin 0 -> 9905 bytes 9 files changed, 239 insertions(+), 111 deletions(-) create mode 100644 various_flashers/flashwriteexample/flashwrite.xex 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 d7d75a6cdad75981498f6cf8cb6136c6bb234c49..b3b6e8394879a319ace2b1732de8e76efc47964a 100644 GIT binary patch delta 801 zcmYLHL1+^}6rD{>p{>+dL3gti+zlpskDl}ZmiOl)H}2NOwy-S*Oe zmk>IkB_K!*EP)m#xFt}k;Kg2hh-{H~5k(N8S{iDqAfl{)jo=>spa0(f@BjTX8#QUa zCUsjD!Uc-)H$!^8_xrdHD{I{YlCl=McwV76k(`gGGx1sfIx^0g{HGJ>^aGzl$5QEg zu}mhBoWnD*bO!tVeuUde^)y!KY$_QK`qmM{O7W~j+zP!NPbcm!;#hJPBdlzXNh#^F zLX)ZF0Eo<}_|9S`?hPViNX9BP25pP;#W#*C?W1HfC#raq6g!+rM>j1lIfqG}Zsfw^ z2Cg<$$P~dywHesR@w^w`@(RS8MCkma_}1Ci+d7iKX3nrI{D|Q1q|qUp&PJy!tXijR z9z?plFlPTL&$3EeY9MQ*Jev-z+T#Y4psr8hXq(U)L%wgVT6b*l-jCp=zw1k$mk{7 z)(9zCbsfWEvIH-Ys_RuRaUVon6cr{2pC(#q8P#o0Bdfz&8MS0k9Xihuz{NEf1LQPg z+77oSND0+-x3J3S9n#IN1M^2COLArtyJ!ys6JVO1QNs;lw()Fzs)zAIqQQn>KGmi; zP#}Lqbjft+KO?y><}cjrT7A(b5z55S?V@f@a)+ z>QNGB8j)!AC|oY^#Q@w67=&+9L-2Cxqr2~7b4bHm1=F@+l)_8e@T!)((XJYHtzESa zq8$O;=9M$b{19u>5Nl=>uB+xlg~wE<5Er@X$XSIyR?S(3=l{wu$r>StH>ifAUzDP& zE-J!9^Iu&9?HEmzeeilK|fu-p5Gt_ad3{-O`Vc!9IIz&-t;=@ zYY#;Wfj-0jM1<9GVEt@_Xu&#yUD~D3V+`vKQPeQ%A zL{j&Fwx~VVoHu=ytRye#p3~e2{!>a9S_dM2mP`?@FnkrO%~Y6X`kAKVoQ9tvTw&H% Z9Yz_y$re#GZ2TJ9Eo^Xi`)TW#{s%(;GNJ$g diff --git a/various_flashers/034M_Mac65_1.02_DDT/MAC65DDTflashwrite.xex b/various_flashers/034M_Mac65_1.02_DDT/MAC65DDTflashwrite.xex index bb5f207e5376e1a94e8adfdc324b6f8af9811dad..be28d8f110632f11109d32f1f930bc35d673339b 100644 GIT binary patch delta 801 zcmYLHL1+^}6rD{>p{>+dL3gti+zlpskDl}ZmiOl)H}2NOwy-S*Oe zmk>IkB_K!*EP)m#xFt}k;Kg2hh-{H~5k(N8S{iDqAfl{)jo=>spa0(f@BjTX8#QUa zCUsjD!Uc-)H$!^8_xrdHD{I{YlCl=McwV76k(`gGGx1sfIx^0g{HGJ>^aGzl$5QEg zu}mhBoWnD*bO!tVeuUde^)y!KY$_QK`qmM{O7W~j+zP!NPbcm!;#hJPBdlzXNh#^F zLX)ZF0Eo<}_|9S`?hPViNX9BP25pP;#W#*C?W1HfC#raq6g!+rM>j1lIfqG}Zsfw^ z2Cg<$$P~dywHesR@w^w`@(RS8MCkma_}1Ci+d7iKX3nrI{D|Q1q|qUp&PJy!tXijR z9z?plFlPTL&$3EeY9MQ*Jev-z+T#Y4psr8hXq(U)L%wgVT6b*l-jCp=zw1k$mk{7 z)(9zCbsfWEvIH-Ys_RuRaUVon6cr{2pC(#q8P#o0Bdfz&8MS0k9Xihuz{NEf1LQPg z+77oSND0+-x3J3S9n#IN1M^2COLArtyJ!ys6JVO1QNs;lw()Fzs)zAIqQQn>KGmi; zP#}Lqbjft+KO?y><}cjrT7A(b5z55S?V@f@a)+ z>QNGB8j)!AC|oY^#Q@w67=&+9L-2Cxqr2~7b4bHm1=F@+l)_8e@T!)((XJYHtzESa zq8$O;=9M$b{19u>5Nl=>uB+xlg~wE<5Er@X$XSIyR?S(3=l{wu$r>StH>ifAUzDP& zE-J!9^Iu&9?HEmzeeilK|fu-p5Gt_ad3{-O`Vc!9IIz&-t;=@ zYY#;Wfj-0jM1<9GVEt@_Xu&#yUD~D3V+`vKQPeQ%A zL{j&Fwx~VVoHu=ytRye#p3~e2{!>a9S_dM2mP`?@FnkrO%~Y6X`kAKVoQ9tvTw&H% Z9Yz_y$re#GZ2TJ9Eo^Xi`)TW#{s%(;GNJ$g diff --git a/various_flashers/8kB_PILOT/PILOTflashwrite.xex b/various_flashers/8kB_PILOT/PILOTflashwrite.xex index d151c84b690fe718e0f726b2428216c496246f72..5023e403fb106cb21352b0b732a40fa414d8a077 100644 GIT binary patch delta 799 zcmYLHL1+^}6rD{>p{>+dL3gti+zlpskDl}ZmiY;0pU2RD)iyX~a` z5klyMmVh8NumoC|;Fd_Kf){)3p|T?JB8nhFwREYef)r)_YXtZ3|NQsCBx( zHk(ps@Khp`#lc_@;Z{;Ri6uInR+HhtDw45OIxP^dL~kZDsoV27p-y9jrOgo`EnJkS znpXQjWJg*Med)=2x9EE;!xEFn6D(B!fMXMAiC!wfY^s0WlQ&b%Ovx5`4DkF)CE*oJr~XL|p0i%n9g$}-~1_>s7Q^e2MO z4;j+or(TO6Uz+E(w@ep5wfzk2h3)5HB_O)wkX(uMR*+U4B0LABj;a?r;1>ikx{0Ty#i1Bb zAb&t~!F1`zvHVx_mu>*az7RbQ-a2TOa$62W%nu;K(GHT)(l-KIl&uDV#UBy5*dR;b zqL9#hq!UVM-*Yt_r%DR3Q3^L`wi=@}YQ$+&hI_Q)6e>rl`B}zul+DrtfZT>>6uk}~ LzP~xq(ue;5OwUs+ delta 755 zcmZ9K-%FEG7{|}HlsQ9|FO(O8&)&V~l-5=tld-&zF6<@eRajoh>yOn2w#6JZyU~k+ zVLPJiCJ^yp&N_oP79!sC4|rj`5bL7oBBGKmhKLs-#oP0`=%RD+ob!CY=lPtUuZN!u zx7#*>2?lUvy58;nKIj2uxjp1kmIpe|DhyKTnM5|1mGZiNkIviHVw zxm5ZtOpa%B5Dte4ywR$sL19ywbRyQhLJUw!XI#{;uv>|2>dq{Tr>B5`vNh<+xB?1G zXVM{rOeSGsHkSy-h}ow>KQkjvgt5|l_r;bYZL=V&aHN%dp0xWLEj{w|(=k>q=<*s= z50f}k#^Tk(Xt}@_f^ah^3E!Yn@N(&+r{{cQNTZtt)3#xV!V6mWX_lwns!4mVRkQZv zZ9&}TrBmu$KWoqsYi3k#Xy$#Dk84gLE^^tCvnqe6nKLTS|CM2k)gunCPm9LCs6}^8 zREi_pMORIX6e|_Xm)v5$>J|dkCIA1vk&nVtjk{~o&*w(ArOj6S>xceNOty zOVL80U)rCDu-f*mpY;eWSckAfJB&GuQNtmMJrLAt=JU1D4g+_T?`Tj3M;-5Xjfy7A zEshI6tY5-JO$=kGuVD=`q-}H$Sf5V}Om~Sviq9#pRE+ut#hWTqV{wBPvD0yd#;+Pp z8eY&B^k=&BrZ1C~jHx^*Y6yYkvSFu`5mFZ@H=?2cJ2N=RtW_>ka Xi1F)e0Yz!!*U)cZgWFq=n?vviiZC$% diff --git a/various_flashers/8kB_WSFN/WSFNflashwrite.xex b/various_flashers/8kB_WSFN/WSFNflashwrite.xex index 01fd33327d6650687dfa093a2bd52ef4cf666d19..0260f60d974bafd5229cc1619fccb34c484edc93 100644 GIT binary patch delta 799 zcmYLHL1+^}6rD{>p{>+dL3gti+zlpskDl}ZmiY;0pU2RD)iyX~a` z5klyMmVh8NumoC|;Fd_Kf){)3p|T?JB8nhFwREYef)r)_YXtZ3|NQsCBx( zHk(ps@Khp`#lc_@;Z{;Ri6uInR+HhtDw45OIxP^dL~kZDsoV27p-y9jrOgo`EnJkS znpXQjWJg*Med)=2x9EE;!xEFn6D(B!fMXMAiC!wfY^s0WlQ&b%Ovx5`4DkF)CE*oJr~XL|p0i%n9g$}-~1_>s7Q^e2MO z4;j+or(TO6Uz+E(w@ep5wfzk2h3)5HB_O)wkX(uMR*+U4B0LABj;a?r;1>ikx{0Ty#i1Bb zAb&t~!F1`zvHVx_mu>*az7RbQ-a2TOa$62W%nu;K(GHT)(l-KIl&uDV#UBy5*dR;b zqL9#hq!UVM-*Yt_r%DR3Q3^L`wi=@}YQ$+&hI_Q)6e>rl`B}zul+DrtfZT>>6uk}~ LzP~xq(ue;5OwUs+ delta 755 zcmZ9K-%FEG7{|}HlsQ9|FO(O8&)&V~l-5=tld-&zF6<@eRajoh>yOn2w#6JZyU~k+ zVLPJiCJ^yp&N_oP79!sC4|rj`5bL7oBBGKmhKLs-#oP0`=%RD+ob!CY=lPtUuZN!u zx7#*>2?lUvy58;nKIj2uxjp1kmIpe|DhyKTnM5|1mGZiNkIviHVw zxm5ZtOpa%B5Dte4ywR$sL19ywbRyQhLJUw!XI#{;uv>|2>dq{Tr>B5`vNh<+xB?1G zXVM{rOeSGsHkSy-h}ow>KQkjvgt5|l_r;bYZL=V&aHN%dp0xWLEj{w|(=k>q=<*s= z50f}k#^Tk(Xt}@_f^ah^3E!Yn@N(&+r{{cQNTZtt)3#xV!V6mWX_lwns!4mVRkQZv zZ9&}TrBmu$KWoqsYi3k#Xy$#Dk84gLE^^tCvnqe6nKLTS|CM2k)gunCPm9LCs6}^8 zREi_pMORIX6e|_Xm)v5$>J|dkCIA1vk&nVtjk{~o&*w(ArOj6S>xceNOty zOVL80U)rCDu-f*mpY;eWSckAfJB&GuQNtmMJrLAt=JU1D4g+_T?`Tj3M;-5Xjfy7A zEshI6tY5-JO$=kGuVD=`q-}H$Sf5V}Om~Sviq9#pRE+ut#hWTqV{wBPvD0yd#;+Pp z8eY&B^k=&BrZ1C~jHx^*Y6yYkvSFu`5mFZ@H=?2cJ2N=RtW_>ka Xi1F)e0Yz!!*U)cZgWFq=n?vviiZC$% diff --git a/various_flashers/M091_Action36ACS_orig/M091ACTION36flashwrite.xex b/various_flashers/M091_Action36ACS_orig/M091ACTION36flashwrite.xex index 3f21eb1da78df879cbf3072e28e34b6c65d65d04..81c3a0b75cdcf5035ab9ea64a074e7416f276c05 100644 GIT binary patch delta 801 zcmYLHL1+^}6rD|s&{k@!pgjnV$zvx4ksr zC4^3B2?$aHOQ3}bZV8ksc(K}NVZw)c56wgS+t!phdDl#(tf zG?_~FgUGas?<{2E-XJmtWvo(Tz_vJFeB-#>HbORXqKZdIvE7+;bkX9XbBN^WdM+%k z<7!idOc9J!n}PKl&wKGruRy#>gwBtOZ=Jn8ts@C+f!EUC1m2C_!V!kZ0*$VX3D z=qnD9<=e6vc_M?$hkc<+$x#;-KCxYr>SBUd{>B!>yIIrypId5?YK1W*R`6qa6X{PS zT^w?x!%ywWA6}a0ceYK3IKA@>?8TkuU=<*`S%8&8ePyH-hKa~RsjcdU4)_Iuj2@zG z4wI5q*D)+6OYkD8x?c4V_kP4hQDL0$DWa8@P~GM~M3Olu%uF3#*LYA>HiUH-9#=Bxg3Ui*_?G0jAj*HQXTPNuI4wb~FB!Xs{uePqiry z6v!VCT{0c|aU}P}{G}TJ^3Oz%f^QtON`=LIA@e%Qku=pdw3Qe*M zE({5+M>?q%4_()SQK}{oAER)CW}7ia!$y>b8QfzdN}+O$nx7b+r+kj)0TdQIqwo#* L@WZX!C!_2SP101| delta 762 zcmZ9KPe>F|9LL}6rlh8B1~rGkpS$zkrs)=ivTPl+gAB2P5Qc{iv#p!Ehjw#aYV4wi z4vXy*WiNpQ!=mCFnphBTLT3*f6R}+)BqEZ6L8L=UG5toRL+|i=@Av(_-{<{(SCh<| z)Zw}WCKKyEZESFF<5}Z~_7}@LHP!$C diff --git a/various_flashers/M091_BASICXE41/BASICXEflashwrite.xex b/various_flashers/M091_BASICXE41/BASICXEflashwrite.xex index fd86e9e30dfbd24e93e0f67480d0603c180275f4..820e1d5c56721cdc8f426d946c857505aaa86e73 100644 GIT binary patch delta 801 zcmYLHL1+^}6rD{>p{>+dL3gti+zlpskDl}ZmiOl)H}2NOwy-S*Oe zmk>IkB_K!*EP)m#xFt}k;Kg2hh-{H~5k(N8S{iDqAfl{)jo=>spa0(f@BjTX8#QUa zCUsjD!Uc-)H$!^8_xrdHD{I{YlCl=McwV76k(`gGGx1sfIx^0g{HGJ>^aGzl$5QEg zu}mhBoWnD*bO!tVeuUde^)y!KY$_QK`qmM{O7W~j+zP!NPbcm!;#hJPBdlzXNh#^F zLX)ZF0Eo<}_|9S`?hPViNX9BP25pP;#W#*C?W1HfC#raq6g!+rM>j1lIfqG}Zsfw^ z2Cg<$$P~dywHesR@w^w`@(RS8MCkma_}1Ci+d7iKX3nrI{D|Q1q|qUp&PJy!tXijR z9z?plFlPTL&$3EeY9MQ*Jev-z+T#Y4psr8hXq(U)L%wgVT6b*l-jCp=zw1k$mk{7 z)(9zCbsfWEvIH-Ys_RuRaUVon6cr{2pC(#q8P#o0Bdfz&8MS0k9Xihuz{NEf1LQPg z+77oSND0+-x3J3S9n#IN1M^2COLArtyJ!ys6JVO1QNs;lw()Fzs)zAIqQQn>KGmi; zP#}Lqbjft+KO?y><}cjrT7A(b5z55S?V@f@a)+ z>QNGB8j)!AC|oY^#Q@w67=&+9L-2Cxqr2~7b4bHm1=F@+l)_8e@T!)((XJYHtzESa zq8$O;=9M$b{19u>5Nl=>uB+xlg~wE<5Er@X$XSIyR?S(3=l{wu$r>StH>ifAUzDP& zE-J!9^Iu&9?HEmzeeilK|fu-p5Gt_ad3{-O`Vc!9IIz&-t;=@ zYY#;Wfj-0jM1<9GVEt@_Xu&#yUD~D3V+`vKQPeQ%A zL{j&Fwx~VVoHu=ytRye#p3~e2{!>a9S_dM2mP`?@FnkrO%~Y6X`kAKVoQ9tvTw&H% Z9Yz_y$re#GZ2TJ9Eo^Xi`)TW#{s%(;GNJ$g diff --git a/various_flashers/M091_OSSBasicXL103/BASICXLflashwrite.xex b/various_flashers/M091_OSSBasicXL103/BASICXLflashwrite.xex index 7599810db71b55696419bb5bdfbdb7d7ce6b58eb..c8a992eafaee91db96b960f16c0ee7b798b55b9e 100644 GIT binary patch delta 801 zcmYLHL1+^}6rD{>p{>+dL3gti+zlpskDl}ZmiOl)H}2NOwy-S*Oe zmk>IkB_K!*EP)m#xFt}k;Kg2hh-{H~5k(N8S{iDqAfl{)jo=>spa0(f@BjTX8#QUa zCUsjD!Uc-)H$!^8_xrdHD{I{YlCl=McwV76k(`gGGx1sfIx^0g{HGJ>^aGzl$5QEg zu}mhBoWnD*bO!tVeuUde^)y!KY$_QK`qmM{O7W~j+zP!NPbcm!;#hJPBdlzXNh#^F zLX)ZF0Eo<}_|9S`?hPViNX9BP25pP;#W#*C?W1HfC#raq6g!+rM>j1lIfqG}Zsfw^ z2Cg<$$P~dywHesR@w^w`@(RS8MCkma_}1Ci+d7iKX3nrI{D|Q1q|qUp&PJy!tXijR z9z?plFlPTL&$3EeY9MQ*Jev-z+T#Y4psr8hXq(U)L%wgVT6b*l-jCp=zw1k$mk{7 z)(9zCbsfWEvIH-Ys_RuRaUVon6cr{2pC(#q8P#o0Bdfz&8MS0k9Xihuz{NEf1LQPg z+77oSND0+-x3J3S9n#IN1M^2COLArtyJ!ys6JVO1QNs;lw()Fzs)zAIqQQn>KGmi; zP#}Lqbjft+KO?y><}cjrT7A(b5z55S?V@f@a)+ z>QNGB8j)!AC|oY^#Q@w67=&+9L-2Cxqr2~7b4bHm1=F@+l)_8e@T!)((XJYHtzESa zq8$O;=9M$b{19u>5Nl=>uB+xlg~wE<5Er@X$XSIyR?S(3=l{wu$r>StH>ifAUzDP& zE-J!9^Iu&9?HEmzeeilK|fu-p5Gt_ad3{-O`Vc!9IIz&-t;=@ zYY#;Wfj-0jM1<9GVEt@_Xu&#yUD~D3V+`vKQPeQ%A zL{j&Fwx~VVoHu=ytRye#p3~e2{!>a9S_dM2mP`?@FnkrO%~Y6X`kAKVoQ9tvTw&H% Z9Yz_y$re#GZ2TJ9Eo^Xi`)TW#{s%(;GNJ$g diff --git a/various_flashers/flashwriteexample/flashwrite.xex b/various_flashers/flashwriteexample/flashwrite.xex new file mode 100644 index 0000000000000000000000000000000000000000..d610acb182efec956b8c5e040fad8f78c4f205d6 GIT binary patch literal 9905 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 Y-}|a3?I?oCjXUxG2k5B4*UHNO1qZngGynhq literal 0 HcmV?d00001