; 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. preserves all .if .def TWOCHIPS jsr printdone jsr printformatting jsr print dta c'2...',0 ldx #$40 jsr flashformatchip bcs formatfailed jsr flashend ; restores display etc. preserves all .endif printdone jsr print dta c'done:)',$9b,0 rts printformatting jsr print dta c'Formatting cart chip ',0 rts formatfailed jsr flashend 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 _byte_ok lda _csrc ldx _csrc+1 jsr BADCOMPARE _byte_ok inw _csrc inw _cdst lda _csrc+1 cmp #>_SOURCE+$20 bne checkloop cpw #0 badcompare_counter beq _all_bytes_ok ; several differences found... ; cart off sta $d580 lda $d013 sta $3fa cli ; print status jsr print dta 253,c'non-match byte#:',0 lda badcompare_counter+1 jsr printhex lda badcompare_counter jsr printhex jsr print dta c' (START-cont)',0 lda #7 cmp CONSOL ; wait for consol req jsr printnl sec rts _all_bytes_ok 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)