diff --git a/lib/flashwrite.asx b/lib/flashwrite.asx new file mode 100644 index 0000000..b2b0274 --- /dev/null +++ b/lib/flashwrite.asx @@ -0,0 +1,478 @@ +; JatariCart flasher +; by Jakub Husak , 04.01.2020 +; All Rights Reserved. +; +; JatariCart 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. +; +; JatariCart 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 'atari.hea' +; flash image is included at the end of file +; uncomment when flashing all cart or want to check all blocks written so far. +;.def compareall + +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 +STARTFLASHWRITE + mva #$A0 106 + jsr opened + lda 20 +@ cmp 20 + beq @- +@ lda #$1 + sta 66 + ; waiting for cart to be inserted + jsr print + TITLE+128 + dta $9b,c'JatariCart/MaxFlash flasher' + dta $9b + dta c'by JHusak, I.2023' + dta $9b + dta c'JatariCart of size ' + CARTSIZE+128 + dta c' kB needed',$9b,$9b + dta c'Insert JatariCart of ' + CARTSIZE+128 + dta c' kB...',0 + + sta $D500 +?wloop lda $D013 + lsr + bcc ?wloop + + ldx #$25 +?lloop + bit VCOUNT + bmi *-3 + bit VCOUNT + bpl *-3 + dex + bne ?lloop + + jsr print + dta c' inserted.',$9b,0 + + ; cart inserted, fake it was not changed + lda $d013 + sta $3fa + + ldx #0 ; chip address + stx numchips +_check_chips + stx _storex + jsr check_type + bcc ?_next + jsr print + dta c'unrecognized chip: ',0 + lda m_vendor + jsr printhex + lda m_kind + jsr printhex + cpx #$0 + seq + jmp * + jsr print + dta c'ignoring chip ...',0 + jmp menu +?_next inc numchips + lda numchips + clc + adc #$30 + sta chipno + + jsr print + dta c'chip ' +chipno + dta c'0' + dta c' vend/prod: ',0 + lda m_vendor + jsr printhex + lda m_kind + jsr printhex + jsr print + dta c' code: ',0 + + ; print memory type + lda M_VECTOR + clc + adc #flash_idstr ; will print flashmem text id + sta ?taddr + lda M_VECTOR+1 + adc #0 + sta ?taddr+1 + ldy #0 +?loop ; write string onscreen till 0 + lda ?taddr:$ffff,y + beq ?exit + sty st_y + jsr outchar + ldy st_y:#0 + iny + bne ?loop +?exit + jsr printnl + ldx _storex + cpx #0 + bne menu + lda m_vendor + sta t_vendor + lda m_kind + sta t_kind + ldx #$40 + jmp _check_chips +menu + jsr printnl + ;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',$9b,0 +?wloop lda 53279 + cmp #7 + beq ?wloop + sta operation + + cmp #select + beq ?wloop + + cmp #option + jeq CHECKONLY + + cmp #start + beq FORMAT + bne ?wloop + + ; start +FORMAT + jsr printformatting + jsr print + dta c'1...',0 + ldx #0 + jsr flashformatchip + bcs formatfailed + jsr flashend ; restores display etc. + .if .def TWOCHIPS + jsr printdone + jsr printformatting + jsr print + dta c'2...',0 + ldx #$40 + jsr flashformatchip + bcs formatfailed + jsr flashend ; restores display etc. + .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 + +t_vendor .byte 0 +t_kind .byte 0 +numchips .byte 0 +_storex .byte 0 + +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 + jsr flashend + 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 'flashwritelib.asx' + icl 'crc16_v2.asm' + icl 'print2.asx' + + org $2e2 + dta a(STARTFLASHWRITE) +; --------------------------------------- +; blocks for every 8kb bank +.rept BANKS, # + .print "A :1" + .local block:1 +;------------ + org BankNum + dta b(:1) + dta b(1) ; Counter +;------------ + org _SOURCE + BANKS_FILE(:1) +;------------ + org $2e2 + dta a(MAIN_PROCESS) +;------------ + .endl + .endr +;------------ + .if .def CUSTOM_CART_LAYOUT + CUSTOM_CART_LAYOUT + .endif + org $2e2 + dta a(FINISH_PROCESS)