diff --git a/various_flashers/1MBOnEscape/OnEscapeflashwrite.xex b/various_flashers/1MBOnEscape/OnEscapeflashwrite.xex new file mode 100644 index 0000000..af7e661 Binary files /dev/null and b/various_flashers/1MBOnEscape/OnEscapeflashwrite.xex differ diff --git a/various_flashers/1MBOnEscape/flashwrite.asx b/various_flashers/1MBOnEscape/flashwrite.asx new file mode 100644 index 0000000..2f3640e --- /dev/null +++ b/various_flashers/1MBOnEscape/flashwrite.asx @@ -0,0 +1,383 @@ +; JatariCart256 Action!3.6 flasher +; by Jakub Husak , 04.01.2020 +; All Rights Reserved. +; +; JatariCart256 is free software: you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation, either version 3 of the License, or +; (at your option) any later version. +; +; JatariCart256 is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with JatariCart256. If not, see . +; + icl '../../lib/atari.hea' +; uncomment when flashing all cart or want to check all blocks written so far. +;.def compareall +.def TWOCHIPS +BankNum equ $88 +Counter equ $89 +operation equ $8a +start equ 6 ; format chip and program +select equ 5 ; ferify and format sectors +option equ 3 ; verify +outchar equ $F2B0 +memtop equ $2e5 +dmactls equ $22f + +_SOURCE equ $6000 +_DEST equ $A000 + +; test code + org $2000 + mva #$A0 106 + jsr opened + lda 20 +@ cmp 20 + beq @- +@ lda #$1 + sta 66 + ; waiting for cart to be inserted + jsr print + dta c'Insert cartridge...',0 + sta $D500 +@ lda $D013 + lsr + bcc @- + jsr print + dta c' inserted.',$9b,0 + + ; cart inserted, fake it was not changed + lda $d013 + sta $3fa + + ;lda #$ff + ;sta $d301 + + jsr print + dta c'Press:',$9b + dta c'START - format cart and programm',$9b + dta c'SELECT - verify; repair bad blocks.',$9b + dta c'OPTION - verify only',$9b,0 +@ lda 53279 + cmp #7 + beq @- + sta operation + + cmp #select + beq VERIFYREPAIR + + cmp #option + jeq CHECKONLY + ; start +FORMAT + jsr printformatting + jsr print + dta c'1...',0 + ldx #0 + jsr flashformatchip + bcs formatfailed + .if .def TWOCHIPS + jsr printdone + jsr printformatting + jsr print + dta c'2...',0 + ldx #$40 + jsr flashformatchip + bcs formatfailed + .endif +printdone jsr print + dta c'done:)',$9b,0 + rts + +printformatting + jsr print + dta c'Formatting cart chip ',0 + rts + +formatfailed + jsr print + dta c'failed:(',$9b,'Waiting for reboot...',$9b,0 + jmp * +VERIFYREPAIR + jsr print + dta c'Verify and ',0 +CHECKONLY + jsr print + dta c'Compare.',$9b,0 + rts +crcsums + :128 dta 0,0 +opened + ldx #0 + lda #12 + jsr icio + mwa #name icbufa,x + mva #$0c icax1,x + mva #$0 icax2,x + lda #3 +icio sta iccmd,x + jmp $e456 +name dta 'E:',$9b + +CHECKINIT + mwa #_SOURCE _csrc + mwa #_DEST _cdst + sei +CHECK + + mva #0 badcompare_counter + sta badcompare_counter+1 + ldx BankNum + sta $d500,x +checkloop +_csrc equ * + 1 + lda $6000 ; src +_cdst equ * + 1 + cmp $A000 ; dst + beq @+ + lda _csrc + ldx _csrc+1 + jsr BADCOMPARE +@ inw _csrc + inw _cdst + lda _csrc+1 + cmp #>_SOURCE+$20 + bne checkloop + cpw #0 badcompare_counter + beq @+ + sta $d580 + lda $d013 + sta $3fa + cli + jsr print + dta c'non-match byte#:',0 + lda badcompare_counter+1 + jsr printhex + lda badcompare_counter + jsr printhex + jsr printnl + sec + rts +@ sta $d580 + lda $d013 + sta $3fa + cli + lda #'o' + jsr outchar +@ clc +dmaon mva #34 dmactls + sta dmactl + rts +VERIFY + ;mwa #_SOURCE _csrc + ;mwa #_DEST _cdst + jsr CHECKINIT + bcc v_rts + lda #'f' + jsr outchar + ldx BankNum + lda #$a0 + jsr flashformatsector + ldx BankNum + lda #$b0 + jsr flashformatsector + jsr FORMATTED + dec Counter + bne VERIFY +v_rts jmp dmaon + +COMPARE_CRC16_DEST_ALL + lda BankNum + sta _tbanknum +@ sei +_tbanknum equ * + 1 + sta $D500 + clc + mva _tbanknum calccrc_bank + jsr CALCCRC_DEST + jsr status_crc + .ifdef compareall + dec _tbanknum + bpl @- + .endif + sta $D580 + lda $d013 + sta $3fa + cli + rts +status_crc + php + jsr printBank_t + plp + php + sne + lda #'o' + plp + seq + lda #'!' + jsr outchar + lda #',' + jmp outchar + + +CALCCRC_DEST + php + mwa #_DEST _tsrc + bne crccont + +CALCCRC ; c=1 - write; c=0 - check + php + mwa #_SOURCE _tsrc + mwa #$2000 _tcnt +crccont mwa #$ffff crc16.crc +_tsrc equ * + 1 + lda $ffff + jsr crc16.updCRC + inw _tsrc + dew _tcnt + bne _tsrc -1 +calccrc_bank equ * +1 + lda #$ba ; nk number + asl + tax + plp + bcc crccheck + mwa crc16.crc crcsums,x + rts +_tcnt :2 dta 0 +crccheck + cpw crc16.crc crcsums,x + rts + + +printBank_t + lda _tbanknum + bpl @+ +printBank + jsr printnl + lda BankNum +@ pha + lda #'B' + jsr outchar + pla + jsr printhex + lda #':' + jmp outchar + +MAIN_PROCESS + ;mva #0 dmactls + ;sta dmactl + sec + mva BankNum calccrc_bank + jsr CALCCRC + mwa #_DEST flashaddr + jsr printBank + + lda operation + cmp #select + jeq VERIFY + + cmp #option + jeq CHECKINIT + +FORMATTED + mwa #_SOURCE _writeaddr + lda _writeaddr+1 + clc + adc #$20 + sta _cmpaddr ; only hi byte + mwa #_DEST flashaddr + ; sec +formatted_next + ldx BankNum +formatted_next2 +_writeaddr equ *+1 + lda $ffff + jsr flashwritebyte + jsr flashincaddr + inw _writeaddr +_cmpaddr equ * + 1 + lda #$ff + cmp _writeaddr+1 + bne formatted_next2 + + jmp COMPARE_CRC16_DEST_ALL + +FINISH_PROCESS + jsr print + dta $9b,'Finished',0 + jmp * + rts +badcompare_counter dta 0,0 +BADCOMPARE + ldy 53279 + cpy #7 + beq @+ + pha + txa + pha + lda #'!' + jsr outchar + pla + jsr printhex + pla + jsr printhex + lda #':' + jsr outchar + mwa _csrc badcompare_tmp1 +badcompare_tmp1 equ * +1 + lda $ffff + jsr printhex + lda #'/' + jsr outchar + mwa _cdst badcompare_tmp2 +badcompare_tmp2 equ * +1 + lda $ffff + jsr printhex + jsr printnl +@ inw badcompare_counter + sec + jmp dmaon +; ------- + icl '../../lib/flashwritelib.asx' + + icl '../../lib/crc16_v2.asm' + + ;jsr print + ;dta c'AlaMaKota.',$9b,0 + ;lda #$55 + ;jsr printhex + ;lda #$aa + ;jsr printhex + ;jmp * + icl '../../lib/print2.asx' + org $2e2 + dta a($2000) +; --------------------------------------- +; blocks for every 8kb bank +.rept 128, # + .print "A :1" + .local block:1 +;------------ + org BankNum + dta b(:1) + dta b(1) ; Counter +;------------ + org _SOURCE + ins "onEscape (14.12. 2022).rom",+:1*8192,8192 +;------------ + org $2e2 + dta a(MAIN_PROCESS) +;------------ + .endl + .endr +;------------ + org $2e2 + dta a(FINISH_PROCESS) + + diff --git a/various_flashers/1MBOnEscape/flashwritelib.asx b/various_flashers/1MBOnEscape/flashwritelib.asx new file mode 100644 index 0000000..1907bd0 --- /dev/null +++ b/various_flashers/1MBOnEscape/flashwritelib.asx @@ -0,0 +1,303 @@ +; 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 + + pha + 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 $d501,x + lda #$55 + sta $aaaa + ; $5555<$80 + sta $d502,x + ; sector format: carry set + scc + lda #$80 ; sector erase + scs + lda #$a0 ; byte programm + sta $b555 + bcc @+ + ; $5555<$aa + sta $d502,x + lda #$aa + sta $b555 + ; $2aaa<$55 + sta $d501,x + lda #$55 + sta $aaaa + + ; PREPARE FOR SECTOR TO ERASE + + ; set upper bank bits +@ pla + tax + pla + rts + +; -------------------------- +; PROCEDURE +; x = 0 or 0x40 - flash chip address. +store_x dta 0 +flashformatchip2 + ldx #$40 + dta { bit.w } +flashformatchip + + sei + stx store_x + sec ; format preamble + jsr flashoppreamble ; 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 + sta flashformatcounter +@ sei + ldx store_x +flashformatcounter equ*+1 + sta $d5FF,x ; set chip (x) and bank + ; set pages count + ldy #$20 + ; reset address + lda #$a0 + sta flashformataddrcheck + 2 + ; check whole sector against 0xff + jsr flashchecksectorformatted_bare ; destroys x + bcs @+ ; format error + dec flashformatcounter + bpl @- +@ jmp flashcartoff ; preserves C + + +; -------------------------- +; PROCEDURE +flashformatsector +; x - even sector 00 - 7f +; a - erase 4KB from $B000 if A=$B0, FROM $A000 IF A=$A0 +; format 4kb evensector +; strange form - easily maps to cartridge banks +; to format bank, must format sector (x<<1) and (x<<1) +1 + ; first check if all ff + ; this is to avoid wear + stx flashformatstorex + sta flashformatstorea + sei + sta $d500,x + 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 + sta $D500,x + ; A must be either $A0 or $B0 + sta flashtmpaddr+1 + sta flashformataddrcheck + 2 + + lda #$30 +flashtmpaddr equ *+1 + sta $a000 ; Format! + jsr flashcheckresult + sei + + lda flashformatstorea + sta flashformataddrcheck+2 + + ldx flashformatstorex + sta $d500,x + + ; check if all data in sector is $ff +flashchecksectorformatted + ldy #$10 +flashchecksectorformatted_bare + lda #$ff + ldx #0 +flashformataddrcheck + cmp $a000,x + bne flashsectorformaterror + inx + bne flashformataddrcheck + inc flashformataddrcheck + 2 + dey + bne flashformataddrcheck + +flashsectorformatgood + jsr flashcartoff + clc + rts + +flashsectorformaterror + jsr flashcartoff + sec + rts + + +; --------------------- +; PROCEDURE + +flashwritebyte + +; a - byte to write +; x - 8kb bank to switch, $00 to $7f, also chip select +; flashaddr - addres in flash - must be a000-offset + ; do not programm byte if already good + sei + sta $D500,x ; select bank, chip + ldy #{ cmp.w } + jsr flashprocessbyte + bne @+ + ;clc + ;jmp flashcartoff + sta $D580 + cli + clc + rts +@ sta flashcmp + + sei + clc ; write byte preamble + jsr flashoppreamble ; preserves A,X + + sta $D500,x + + ldy #{ sta.w } + ; WRITE BYTE ! + jsr flashprocessbyte + +flashcheckresult ; sei mode + mva #0 flashcnt + ldy #5 ; first time wait short first turn to speed up byte write. + bne @+ + +flashwaitfordone + ; approx 100ms in overall for chip erase: + ; as many cycles needed, as 256*cycles >100ms * (1+epsilon) + ; 100 ms is 180000 cycles + ; so max 256 rough loops must last longer + ; 180000 / 256 = 703 + ; 700 cycles by 6 cycles loop lasts = 116. + ; so flipipng values, and adding margin, + ; we count 128*6 cycles in inner loop. + ; max sector erase by datasheet: 25 ms + ; max chip erase by datasheet: 100 ms + ldy#250 +@ dey + nop + bne @- + +@ ldy #{ lda.w } + jsr flashprocessbyte + ldy #{ eor.w } + jsr flashprocessbyte + inc flashcnt + bne @+ + jsr flashcartoff + 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 +flashcmp equ *+1 + cmp #0 +; when non zero = error + rts + +flashcnt + dta 0 +; ---------------------- +; PROCEDURE + +flashprocessbyte + +; y - byteop for cpu to do with byte +; flashaddr - stored address + sty flashbyteop +flashaddr equ *+1 +flashbyteop + sta $aaaa + rts + +flashincaddr + inw flashaddr + rts + +flashsetaddr + stx flashaddr + sty flashaddr+1 + rts + +flashcartoff + pha + sta $d580 + lda $d013 + sta $3fa + cli + 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/1MBOnEscape/makeflashwrite.sh b/various_flashers/1MBOnEscape/makeflashwrite.sh new file mode 100755 index 0000000..4fa1978 --- /dev/null +++ b/various_flashers/1MBOnEscape/makeflashwrite.sh @@ -0,0 +1,2 @@ +mads flashwrite.asx -o:OnEscapeflashwrite.xex + diff --git a/various_flashers/1MBOnEscape/onEscape (14.12. 2022).rom b/various_flashers/1MBOnEscape/onEscape (14.12. 2022).rom new file mode 100755 index 0000000..998b2c3 Binary files /dev/null and b/various_flashers/1MBOnEscape/onEscape (14.12. 2022).rom differ diff --git a/various_flashers/1MBOnEscape/readme b/various_flashers/1MBOnEscape/readme new file mode 100644 index 0000000..d3baba8 --- /dev/null +++ b/various_flashers/1MBOnEscape/readme @@ -0,0 +1,2 @@ +The SV2022WE game which took first place. With bugfixes from 14.12.2022. +