;================================================================================================================ ; FlashUtility for Retro Replay v3.8y ; by Count Zero / CPX / SCS*TRC ; with additional works by Groepaz, DocBacardi and Ninja ;================================================================================================================ ; intended only for use with RR hardware requiring flashing on a FlashROM from Jens Schoenfeld (www.jschoenfeld.com) ;================================================================================================================ ; BE WARNED! ; This source works as is. It represents a snapshot as of around end of 2006. ;================================================================================================================ ; It includes the bugfixes made by Hannenz in the 3.8p version - a very silly ; bug introduced when porting from acme to dreamass - courtesy of Count Zero ; Also included are the tftp ethernet flasher patched by DocBacardi - see the accompanied readme. ;================================================================================================================ ; in flashmode $de01 gives these bankings: ; Bit 2: NoFreeze (1 disables Freeze function) ; Bit 3: bank-address 13 for RAM and ROM (mirror of $de00) ; Bit 4: bank-address 14 for RAM and ROM (mirror of $de00) ; Bit 5: bank-address 16 for ROM (only in flash mode) ; Bit 6: REU compatibility bit. 0=standard memory map ; 1=REU compatible memory map ; Bit 7: bank-address 15 for ROM (mirror of $de00) ;================================================================================================================ ;flashrombank1 - table bank1tab ; bank 0 - %00000000 - $00 ; bank 1 - %00001000 - $08 ; bank 2 - %00010000 - $10 ; bank 3 - %00011000 - $18 ; bank 4 - %10000000 - $80 ; bank 5 - %10001000 - $88 ; bank 6 - %10010000 - $90 ; bank 7 - %10011000 - $98 ;flashrombank2 - table bank2tab ; bank 0 - %00100000 - $20 ; bank 1 - %00101000 - $28 ; bank 2 - %00110000 - $30 ; bank 3 - %00111000 - $38 ; bank 4 - %10100000 - $a0 ; bank 5 - %10101000 - $a8 ; bank 6 - %10110000 - $b0 ; bank 7 - %10111000 - $b8 ;================================================================================================================ ;DEVEL := 1 ; comment OUT to build release version #ifdef DEVEL DEBUG := 1 ; comment OUT to disable debug - for release versions, disable ! #endif ;================================================================================================================ #include "version.inc" #include "screenIO/petscii.inc" ; !initmem $00 *= $0801 .setpet .db $10,$08,$d1,$07,$9e,$20,$32,$30,$36,$34,$00,$00,$00,$00,$00 ; .dw basic_start, 2001 ; .db $9e ; .text " 2064 cpx",0 basic_start: ;================================================================================================================ ; some silversurfer variables ss_cmdmagic = 'a' ss_cmdgetblk = 'b' ss_cmdsndblk = 'c' ss_cmdsetpc = 'd' fifo_rxd = $de08 ; (r) fifo_txd = $de08 ; (w) fifo_dll = $de08 fifo_dlm = $de09 fifo_ier = $de09 fifo_fcr = $de0a ; (w) fifo_iir = $de0a ; (r) fifo_lcr = $de0b fifo_mcr = $de0c fifo_lsr = $de0d fifo_msr = $de0e ; (r) fifo_scratch = $de0f ; (r/w) x0810 ldy #$00 ; basic end, don't change ;================================================================================================================ START sei #ifdef DEVEL lda #endflasher2 sta $0319 #else lda #endflasher sta $0319 #endif sty $d021 ; reset regs sty $d020 sty $d015 lda #$1b sta $d011 lda $ba cmp #$08 bcs blar lda #$08 blar sta drive sta $ba LDX #$18 LDA #$00 ; kill sid KICC STA $D400,X DEX BPL KICC lda #$0f sta $0286 jsr colloopy ; clr colram for old 64s LDA #$80 STA $0291 STA 650 LDA #23 ; small chars STA $D018 LDA #$C8 STA $D016 cli jsr colreset jsr println .dw topheader lda #$00 sta headerend1 jsr println .dw ramchck #if *>=$1000 #error "Ramcheck is above $1000, this will crash in non-flash mode" #endif sei lda #$23 ; WARNING! diff on flash & norm mode - keep below $1000!!! sta $de00 ; enable ram bank 0 lda #$01 sta $8000 ; write ram lda #$0a sta $de00 ; restore to bank 1 lda $8000 cmp #$01 bne skip ; jmp nothing ; nothing check - prints -nocart?- ; done whenever nothing worked skip lda #$2b sta $de00 ldx #$02 stx $8000 lda #$33 sta $de00 inx stx $8000 lda #$3b sta $de00 inx stx $8000 ; fill other ram banks with values lda #$0a sta $de00 inx stx $8000 lda #$23 sta $de00 ldx $8000 lda #$0a sta $de00 cli cpx #$04 beq acht cpx #$01 bne stra jmp zweindreiss ; check for 8 and 32 kb ram ... 32 kb means rr ;------------------------------------- 32kb found, jump stra jsr println .dw strange ; first check passed, but this one didnt ? jmp end ; AR save rom routines acht lda #$08 sta marker+1 jsr println .dw achtxt achtkey jsr $f142 beq *-3 cmp #'d' beq dumptodisc2 cmp #'r' bne xal jmp achtkb xal cmp #'q' beq ex2it cmp #$03 bne achtkey ex2it jmp end dumptodisc2 jsr colreset jsr println .dw topheader ; header lda #$32 sta bank1cont jsr enterfilename cmp #$ff bne open2 jmp end open2 jsr println .dw freshdisk jsr space cmp #$03 bne okopen2 jmp end okopen2 jsr openfile bcc weitaa jmp end weitaa ldx #$00 stx todbank ldy #$04 sty sizer2+1 ; write bytes to disk jsr println .dw saving lda #$00 sta $fe lda #$80 sta $ff ldx #$00 sei lda #$00 sta $fc ldx #$00 aoloop lda #$80 sta $fd stx todcount arloop ldy #$00 sty countme2+1 ayloop sei lda #$02 sta $de00 ldy todbank lda bank1tab,y sta $de00 countme2 ldy #$00 lda ($fc),y pha lda #$0a sta $de00 pla sta byteout2+1 cli inc $d020 byteout2 lda #$00 jsr $ffa8 dec $d020 lda $fe sec sbc #$01 sta $fe lda $ff sbc #$00 sta $ff lda $ff jsr printhex lda $fe jsr fourleft inc countme2+1 ldy countme2+1 bne ayloop inc $fd lda $fd cmp #$a0 bne arloop inc todbank ldx todcount inx sizer2 cpx #$04 bne aoloop jsr $f63f lda #$0d jsr $e716 jsr reinitcart2 jsr status jsr space sei lda #$08 sta $de00 jmp $fce2 ;===================================================== zweindreiss jsr println ; print 32kb text .dw zweintxt achtkb marker ; disables the other checks to do 8kb ram test lda #$00 bne moreram jsr println ; print checkin flash .dw flashromchk ; flashmode jmper set printout lda $de01 ; checks for fmode jumper set and #$01 beq jumpernotset jsr println ; print jumper set .dw jset jmp morecheck jumpernotset jsr println .dw jnotset jsr $f142 cmp #$20 bne *-5 marker2 ; this just stores if the jumper is set or not lda #$00 inc marker2+1 jmp startoff ; back to main menu morecheck lda $de01 ; checks for fmode jumper set and #$01 beq moreram jsr flashmanucheck ; check flash manu id cmp #$01 ; = AMD bne notfoundx jsr println ; flash found .dw flashfound jmp moreram notfoundx cmp #$20 ; = ST beq found2 notfound jsr println .dw flashnotfound jmp end found2 jsr println .dw flash2found jsr println .dw adress jsr addycheck ; checks the separate adresslines cmp #$00 beq notende2 jmp end notende2 jsr println .dw addyok ; adresslines ok moreram lda marker+1 beq normdeep jsr println .dw checknram8 jmp chckit normdeep jsr println .dw checknram ; deepcheckram chckit jsr ramfillcheck ; fills ram with $aa and $55 cmp #$01 bne notende jmp end notende jsr println .dw ramok ;=================== baccy deep ram test modded 06/03/2004 Errors = $57 ;--------------------------------------- ; Init Screen ldx #11 ;print "errors" and "running" ldy #17 clc jsr $fff0 jsr println .dw Ramtest_Text0 ;Init the error counters lda #0 sta Errors ;sta Errors+1 ;init the clock lda #0 sta $dd0f sta $dd0b sta $dd0a sta $dd09 sta $dd08 sei lda marker+1 bne skipdisable lda #%01000101 ;disable freezebutton on RR sta $de01 skipdisable ldy #$ff sty bitwalk iny sty bitstart loopz: inc bitwalk bne no_walk lda #$23 ;Get Write Access to Cart RAM jsr SetBank ;Set $de00 and delay jsr InitErrors lda #$20 jsr SetBank no_walk jsr Test jsr ShowErrors jsr ShowTime sei inc $05df ;it's still alive lda #$7f sta $dc00 lda $dc01 and #$10 bne loopz lda #$20 ;Ultimax off and delay jsr SetBank cli jmp weiterhier ;--------------------------------------- bitmuster .db $01,$02,$04,$08,$10,$20,$40,$80,$40,$20,$10,$08,$04,$02,$01,$00 bitmuster_e .db $01,$02,$04,$08,$10,$20,$40,$80,$40,$20,$10,$08,$04,$02,$01,$00 bitstart .db 0 bitwalk .db 0 InitErrors: ;Fill $8000 - $80ff with $00 - $ff ldx #0 ldy bitstart FillRam: lda bitmuster,y sta $8000,x sta $04a0,x ; remember the val iny cpy #bitmuster_e-bitmuster bne no_end ldy #0 no_end inx bne FillRam inc bitstart ldy bitstart cpy #bitmuster_e-bitmuster bne no_end2 ldy #$00 sty bitstart no_end2 rts Test: ldx #0 ShowRam: ; lda $8000,x ;Read Ram value ; sta $04a0,x ; inx ;Output to screen ; bne ShowRam babe lda $8000,x ; get the correct val eor $04a0,x ;Is it the correct value ; sta $04a0,x beq ShowRam0 ;lda $04a0,x ;No, remember Value at $0500 ; lda #2 ;and mark this position inc $d8a0,x sta $04a0,x ldy Errors iny beq ShowRam0 inc Errors ;inc Errorcounter ; bne ShowRam0 ;inc Errors+1 ShowRam0: inx bne babe rts SetBank: sei sta $de00 ;set $de00 ldx #0 ;and delay SetBank0: nop inx bne SetBank0 rts #if *>=$1000 #error "RamTest is above $1000, this will crash in non-flash mode" #endif ;--------------------------------------- ShowErrors: lda Errors cmp #$ff bne normcrsr ldx #11 ldy #20 clc jsr $fff0 lda #'>' jsr $e716 normcrsr ldx #11 ldy #21 clc jsr $fff0 lda #'$' jsr $e716 lda Errors jmp printhex ;jmp $bdcd ;--------------------------------------- ShowTime: ldy #0 ; lda $dd0b ; and #$1f ; jsr ShowTimeVal ; iny lda $dd0a jsr ShowTimeVal iny lda $dd09 jsr ShowTimeVal lda $dd08 rts ShowTimeVal: pha lsr lsr lsr lsr jsr ShowTimeValNibble pla and #$0f ShowTimeValNibble: ora #$30 sta $05d6,y iny rts ;--------------------------------------- weiterhier lda marker+1 beq contrr ende4ar jsr println .dw endtxt jmp end contrr lda marker2+1 beq okiweita jsr reinitcart2 lda #$00 sta $de00 jmp $fce2 ; ende weil jumper nich gesetzt okiweita jsr colreset jsr println .dw topheader ;Baccy jsr ss_detect ; look for silver surfer scratchpad bcs noSilverSurfer ;/Baccy lda #$00 sta SSRRflag lda #$04 jsr ss_init ; initialize SS at 115200 jsr println .dw ss_txt1 ;Baccy jmp detectionFinished ; silver surfer detected, no more clockports for now noSilverSurfer jsr rrnet_detect ; look for cs8900a id register bcs noRRNetFound lda #$01 sta SSRRflag jsr rrnet_init jsr println .dw rrnetInit_txt ; CZ menu jmp detectionFinished ; rrnet detected, no more clockports for now noRRNetFound jsr println .dw noExtensionFound_txt detectionFinished ;/Baccy jsr println .dw warning jsr println .dw cont ; continue spcloop JSR $f142 cmp #$03 BNE spcloop jmp startoff ; back to main menu jsr println .dw checknram lda #$00 sta $fe lda #$80 sta $ff sei lda #$00 sta $8000 ; init ram lda #$23 sta $de00 ; enable ram bank 0 jmp end nothing jsr println .dw nocart rts end: jsr reinitcart2 ;jmp $e544 ;rts inc $d020 jmp *-3 ;jmp $a831 ; end BASIC ;========================================================= ;checks adresslines addycheck: sei ldy #1 ldx #$00 addloop lda addtable,x cmp #$ff beq endeaddy sta $de00 inx lda addtable,x sta $fc inx lda addtable,x sta $fd tya ldy #$00 sta ($fc),y tay iny inx bne addloop lda #$00 sta $de00 lda #$ff rts endeaddy ldy #1 sty line ldx #$00 addloop2 lda addtable,x cmp #$ff beq endeaddyok sta $de00 inx lda addtable,x sta $fc inx lda addtable,x sta $fd ldy #$00 lda ($fc),y cmp line bne prline inc line inx bne addloop2 endeaddyok lda #$00 sta $de00 rts prline lda #$03 sta $de01 lda #$00 sta $de00 cli lda #13 jsr $e716 lda $de00 jsr printhex dex dex lda addtable,x jsr printhex inx lda addtable,x jsr printhex inx lda addtable,x jsr printhex lda #$00 sta $de00 lda #$ff cli rts line .db $00 addtable .db $23, $00,$80 .db $23, $01,$80 .db $23, $02,$80 .db $23, $04,$80 .db $23, $08,$80 .db $23, $10,$80 .db $23, $20,$80 .db $23, $40,$80 .db $23, $80,$80 .db $2b, $00,$80 .db $2b, $01,$80 .db $2b, $02,$80 .db $2b, $04,$80 .db $2b, $08,$80 .db $2b, $10,$80 .db $2b, $20,$80 .db $2b, $40,$80 .db $2b, $80,$80 .db $33, $00,$80 .db $33, $01,$80 .db $33, $02,$80 .db $33, $04,$80 .db $33, $08,$80 .db $33, $10,$80 .db $33, $20,$80 .db $33, $40,$80 .db $33, $80,$80 .db $3b, $00,$80 .db $3b, $01,$80 .db $3b, $02,$80 .db $3b, $04,$80 .db $3b, $08,$80 .db $3b, $10,$80 .db $3b, $20,$80 .db $3b, $40,$80 .db $3b, $80,$80 .db $ff ;========================================================= ; fill ram and check read back ; deep check ramfillcheck sei ldx #$00 loop stx rambank lda ramvalues,x sta $de00 lda #$00 sta $fc lda #$80 sta $fd ldy #$00 ch1 lda #$55 dec $d020 sta ($fc),y ; write ram lda ($fc),y sta $04a0,y cmp #$55 bne err1 lda #$aa sta ($fc),y lda ($fc),y sta $04a0,y inc $d020 cmp #$aa bne errx iny bne ch1 inc $fd lda $fd cmp #$9f bne ch1 inc rambank ldx rambank cpx #$04 bne loop ldy #$00 sty $de01 sty $de00 lda #$00 cli rts err1 sty $fc lda #$03 sta $de01 cli jsr println .dw fivefiveerr jmp praddy errx sty $fc lda #$03 sta $de01 cli jsr println .dw aaerr praddy lda $fd jsr printhex lda $fc jsr printhex jsr println .dw bank lda rambank jsr printhex lda #$01 rts rambank .db 0 ramvalues .db $23, $2b , $33 , $3b ;======================================================== ; printline routine println: printlow = $02 printhigh = $03 pla CLC ADC #$02 TAX sta printlow pla ADC #$00 sta printhigh PHA TXA PHA LDA printlow BNE skip2 DEC printhigh skip2 DEC printlow ; stackwerte um 2 erhoehen ldy #0 LDA (printlow),Y ; ueber 0 page den pointer holen tax iny lda (printlow),y sta printhigh stx printlow ; und neuen 0 page pointer auf text schreiben dey aga lda (printlow),y ; text lesen und printen beq endlich jsr $e716 inc printlow bne aga inc printhigh bne aga endlich rts ;========================================================= ; filename shit enterfilename: JSR println .dw filename lda #$10 ldx #$00 stx $bb ldy #$02 sty $bc jsr enterline ;cmp #$00 ;bne okende ;lda #$ff cmp #1 sbc #0 okende sta $b7 rts ;========================================================= ; print byte to hex printhex: pha lsr lsr lsr lsr jsr hexa pla and #$0f hexa cmp #$0a bcc hexb adc #$06 hexb adc #$30 jmp $e716 ;========================================================= ; convert 2 chars to hex-byte ; akku low nibble ; x high nibble - unusual, but shorter ... gethex: jsr hexc sta hexflag txa jsr hexc asl asl asl asl ora hexflag rts hexc cmp #$41 sec bmi essbece sbc #$07 essbece sbc #$30 rts ;========================================================= ; menu beginnt hier startoff: jsr clrscr ;--------------------------------------- ruecksprung von menuepunkt backmenu sei lda #$01 sta $de00 cli LDA #23 ; small chars STA $D018 jsr $fda3 jsr colreset jsr println .dw header jsr println .dw menutext jsr printdrive1 keychck jsr $f142 beq *-3 ldx #keyend-key-1 keyloop cmp key,x beq okey dex bpl keyloop jmp keychck okey txa asl tax lda ktab,x sta go+1 lda ktab+1,x sta go+2 go jmp $4c4c ;--------------------------------------- key .db $85 ; docs .db $86 ; dumptodisc .db $87 ; clear .db $88 ; flash .db $8c ; dir .db $44 ; device .db $53 ; serial flash #ifdef DEVEL .db $d3 ; xpert serial flash #endif .db $45 ; edit Prgflasher keyend ktab .dw docs .dw dumptodisc .dw clrflashrom .dw flashrom .dw showdirectory .dw device .dw ssflash #ifdef DEVEL .dw xpertssflash #endif .dw prgeditor ;--------------------------------------- ; docprinter ;--------------------------------------- docs jsr println .dw doctxt dockey jsr $f142 cmp #$20 bne dockey jmp startoff ; back to main menu ;=============================================================== ; clearscreen routine ;=============================================================== clrscr: lda #$c0 cmp $d012 bne *-3 colreset: lda #$0f sta $d021 sta $0286 ldx #$00 stx $d020 jsr $e544 lda $0286 jsr colloopy inc $d021 rts ;=============================================================== ; dump flashrom to disc&ram ;=============================================================== ente2 jsr reinitcart jsr status jsr $f142 beq *-3 jmp startoff ; back to main menu dumptodisc jsr colreset jsr println .dw topheader ; header jsr println .dw warning ; jumper warning jsr detcontent ; find contents jmp skipisempty isempty jsr $e716 jsr println .dw emptybank skipisempty jsr println .dw whichbank okeyd jsr $f142 beq okeyd cmp #$31 beq dbank1 cmp #$32 beq dbank2 cmp #$03 bne okeyd jmp startoff ; back to main menu dbank2 sta todbank ldx bank2cont beq isempty bne dumpon dbank1 sta todbank ldx bank1cont beq isempty dumpon jsr $e716 jsr enterfilename cmp #$ff bne open jmp startoff ; abort, back to main menu open jsr println .dw freshdisk jsr space cmp #$03 bne okopen jmp startoff ; back to main menu okopen jsr openfile lda $90 bne ente2 lda todbank sec sbc #$30 cmp #$01 bne sbla ldx #$00 .db $2c sbla ldx #$08 stx todbank tax dex lda bank1cont,x ; lda #$32 ; REMOVE ! cmp #$32 bne gross ldy #$04 .db $2c gross ldy #$08 sty sizer+1 ; write bytes to disk jsr println .dw saving lda #$00 sta $fe lda sizer+1 cmp #$04 beq displarge lda #$00 .db $2c displarge lda #$80 sta $ff ldx #$00 sei lda #$00 sta $fc ldx #$00 oloop lda #$80 sta $fd stx todcount rloop ldy #$00 sty countme+1 yloop sei lda #$03 sta $de00 ldy todbank lda bank1tab,y sta $de01 countme ldy #$00 lda ($fc),y pha lda #$02 sta $de00 pla sta byteout+1 cli inc $d020 byteout lda #$00 jsr $ffa8 dec $d020 cld lda $fe sec sbc #$01 sta $fe lda $ff sbc #$00 sta $ff lda $ff jsr printhex lda $fe jsr fourleft inc countme+1 ldy countme+1 bne yloop inc $fd lda $fd cmp #$a0 bne rloop inc todbank ldx todcount inx sizer cpx #$04 bne oloop jsr $f63f lda #$0d jsr $e716 jsr reinitcart jsr status jsr space xout jmp startoff ; back to main menu todbank .db 0 todcount .db 0 ;======================================================= clrflashrom jsr colreset jsr println .dw topheader jsr println .dw warning jsr println .dw clearing jsr detcontent jmp skipisempty2 isempty2 jsr $e716 jsr println .dw emptyalready skipisempty2 jsr println .dw clrwhichbank okeydo jsr $f142 beq okeydo cmp #$31 beq dbank11 cmp #$32 beq dbank22 cmp #$03 bne okeydo jmp startoff ; back to main menu dbank22 sta todbank ldx bank2cont beq isempty2 bne clron dbank11 sta todbank ldx bank1cont beq isempty2 clron jsr $e716 #ifndef DEVEL jsr println .dw finwarn mkey jsr $f142 beq mkey cmp #$59 beq clrit cmp #$4e beq abortclr cmp #$03 bne mkey abortclr jmp startoff ; back to main menu #endif clrit jsr println .dw clrwork lda todbank jsr $e716 lda todbank sec sbc #$30 cmp #$01 bne sbla2 ldx #$00 .db $2c sbla2 ldx #$08 stx todbank ; start clearing sei lda #$03 sta $de00 jsr autoselectseq jsr sectorerase jsr readresetseq cli #ifdef DEBUG jsr detailcont jsr space2 #endif jmp startoff ; back to main menu #ifdef DEVEL detailcont: sei lda #$03 sta $de01 ldx todbank det2c: lda #$0d jsr $e716 txa jsr printhex sei lda bank1tab,x sta $de01 txa pha lda #$00 sta $f8 lda #$80 sta $f9 ldy #$00 nbytech: lda $f9 jsr printhex lda $f8 jsr printhex newbytech lda ($f8),y cmp #$ff bne noemptyies iny bne newbytech inc $f9 lda $f9 cmp #$a0 bne newbytech cli jsr println .dw empty lda #crsrup jsr $e716 jmp inka noemptyies cli jsr printhex jsr println .dw blaehemptay inka pla tax inx cpx #$08 beq quitchck cpx #$10 beq quitchck jmp det2c quitchck lda #$0d jsr $e716 rts #endif ;============================================================= ; bank1/2cont has 0 - empty ; 1 - error ; 32 - 32k rom ; 64 - 64k rom ; 80 - prgflasher detcontent: lda #0 sta garb1 sta garb2 sta bank1cont sta bank2cont jsr println .dw flashbank1 sei lda #$03 ; map flash to $8000 sta $de00 ;----------- ldy #$00 chl1 lda bank1tab,y sta chloop1+1 ; reset chloop1 lda #$01 sta $de01 ; start banking lda #$80 sta mem+2 ldx #$00 mem lda $8000,x cmp #$ff ; check page for $ff bne err ; no $ff - err - check 32 kb content inx bne mem lda #1 sta garb1 inc mem+2 lda mem+2 cmp #$a0 bne mem iny cpy #$08 beq realempty jmp chl1 realempty lda #$03 sta $de01 lda #$00 sta bank1cont cli jsr println .dw empty jmp reallynextbank ; if the start of the ROM has $FF etc, but ; is filled with data later, ; garbled message comes up err lda garb1 beq sizechck1 lda #$01 sta bank1cont jsr println .dw garbledempty jmp reallynextbank ;-------------------------------------- sizechck1 sei lda #$03 ; map flash to $8000 sta $de00 ldx #$00 loop321 lda #$00 sta $fc lda #$80 sta $fd ldy #$00 l321 lda bank1tab,x ; start banking sta $de01 lda ($fc),y pha lda bank1tab+4,x sta $de01 ; select high part of flashrombank pla cmp ($fc),y bne diff1 ; not equal ? must be 64kb then iny bne l321 inc $fd lda $fd cmp #$a0 bne l321 inx cpx #$04 bne loop321 lda #$03 sta $de01 cli lda #$32 sta bank1cont jsr println .dw smallrom jmp nextbank diff1 lda #$03 sta $de01 cli lda #$64 sta bank1cont jsr println .dw largerom nextbank sei lda bank1tab sta $de01 ldx #$05 lda $8080,x ; copy header to $0380 sta $0380,x dex bpl *-7 cli jsr printrevision cmp #$80 bne reallynextbank sta bank1cont ;--------------------------- content check flashbank2 reallynextbank jsr println .dw flashbank2 sei lda #$03 ; map flash to $8000 sta $de00 ldy #$00 chl2 lda bank2tab,y sta chloop2+1 ; reset chloop2 lda #$01 sta $de01 ; start banking lda #$80 sta mem2+2 ldx #$00 mem2 lda $8000,x cmp #$ff ; check page for $ff bne err2 ; no $ff - err - check 32 kb content inx bne mem2 lda #1 sta garb2 inc mem2+2 lda mem2+2 cmp #$a0 bne mem2 iny cpy #$08 beq realempty2 jmp chl2 realempty2 lda #$03 sta $de01 cli lda #$00 sta bank2cont jsr println .dw empty jmp endedetbank2 err2 lda garb2 beq sizechck2 lda #$01 sta bank2cont jsr println .dw garbledempty jmp fertigdet ;-------------------------------------- sizechck2 sei lda #$03 ; map flash to $8000 sta $de00 ldx #$00 loop322 lda #$00 sta $fc lda #$80 sta $fd ldy #$00 l322 lda bank2tab,x ; start banking sta $de01 lda ($fc),y pha lda bank2tab+4,x sta $de01 ; select high part of flashrombank pla cmp ($fc),y bne diff2 ; not equal ? must be 64kb then iny bne l322 inc $fd lda $fd cmp #$a0 bne l322 inx cpx #$04 bne loop322 lda #$03 sta $de01 cli lda #$32 sta bank2cont jsr println .dw smallrom jmp fertigdet diff2 lda #$03 sta $de01 cli lda #$64 sta bank2cont jsr println .dw largerom ;------------------------------------- fertigdet sei lda bank2tab sta $de01 ldx #$05 lda $8080,x ; copy header to $0380 sta $0380,x dex bpl *-7 cli jsr printrevision cmp #$80 bne endedetbank2 sta bank2cont endedetbank2 lda #$03 sta $de01 cli rts printrevision: lda #'r' cmp $0380 bne prgflshchck cmp $0381 bne unknwnrev jsr println .dw headerok revisi lda $0382 jsr $e716 lda #'.' jsr $e716 lda $0383 jsr $e716 lda $0384 jsr $e716 lda #$00 rts unknwnrev: jsr println .dw invrom jsr println .dw novars2 lda #$00 rts prgflshchck: lda $0380 cmp #$50 ; P bne unknwnrev lda $0381 cmp #$46 ; F bne unknwnrev jsr println .dw prgrom jsr revisi lda #$80 rts bank1tab: .db $01,$09,$11,$19,$81,$89,$91,$99 bank2tab: .db $21,$29,$31,$39,$a1,$a9,$b1,$b9 offsitab: .db $00,$00,$40,$40,$80,$80,$c0,$c0 .db $00,$00,$40,$40,$80,$80,$c0,$c0 garb1 .db 0 garb2 .db 0 bank1cont .db 0 bank2cont .db 0 ;============================================================ openfile: LDA #$61 STA $B9 JSR S99C1 LDA $BA JSR $FFB1 LDA $B9 ; ora #$e0 JMP $FF93 ; ldy #0 ;hh lda ($bb),y ; jsr $ffa8 ; iny ; cpy $b7 ; bne hh ; jsr $ffae ; rts ; LDA $C3 ; JSR $FFA8 ; LDA $C4 ; JMP $FFA8 S99C1 JSR $f3d5 ;Send Secondary Address BCS S99CB RTS S99CB lda #$0d jsr $e716 jMP status ;======================================= device .( chdev lda $ba sta $0202 ; remember current drive devloop LDX $BA CPX #$08 BCS devskip LDX #$07 devskip INX cpx $0202 beq sonich CPX #31 BCC noend LDX #$08 noend STX $BA jsr drivetest ; drivetest beq devloop ldx $ba stx drive lda #0 jmp backmenu sonich stx $ba stx drive lda #255 jmp backmenu .) ;========================================================= flashinit sei lda #$03 sta $de00 ; game and exrom to map in rom ; command in x : ; $f0 = Read/Reset Command ; $90 = Autoselect Command ; $a0 = Byte Programm ; $80 = Sector Erase --- read more in the docs lda #$11 sta $de01 ; set bank 2 lda #$aa sta $9555 ; aa nach 555 sollte ok sein ($5555 of the chip) lda #$09 sta $de01 ; set bank 1 lda #$55 sta $8aaa ; aa nach 2aa sollte ok sein ?($2aaa of the chip) lda #$11 sta $de01 ; set bank 2 stx $9555 ; command nach 555 (5555 of the cip) rts ;========================================================= fourleft: jsr printhex fourleft2: lda #crsrleft jsr $e716 jsr $e716 doubleprint: jsr $e716 jmp $e716 ;========================================================= showdirectory lda drive sta $ba LDA #$00 STA $D015 STA $90 sta $c6 JSR clrscr ; setup screen and stuff jsr directory ; included at diskIO/directory.src jsr status jsr space JMP startoff ; back to main menu space: jsr println .dw PRESS space2: RAUS JSR $f142 cmp #$03 beq reaus cmp #$20 BNE RAUS reaus rts ;========================================================= drive .db 8 DOLLAR .text "$" MRK .db $00 ACT2 .db 0 PRESS .db 13,13 .text " - PRESS ANY KEY! -" .db 0 ;========================================================== ; TEST DER FLOPPY 1541/71/81 ;--------------------------------------- drivetest LDY #$00 STY $1F LDA $BA CMP #$08 BCC B8A0A CMP #30 BCS B8A0A LDA #$FE LDY #$FF ;1581 TEST JSR S8A0D BEQ B8A0A ; abort CMP #$03 BEQ B8A08 LDA #$01 ;$1801 M-R LDY #$18 ;1571 TEST JSR S8A0D TAY BEQ B8A03 AND #$DF STA $1E INY BEQ B8A03 TYA AND #$78 CMP #$38 BEQ B8A06 B8A03 SEC ROR $1F ; 80 B8A06 ROR $1F ; 40 B8A08 ROR $1F ; 20 B8A0A LDA $1F RTS ; 1581 - $80 ; 1541 - $20 ; no drive - 0 ;--------------------------------------- ; M-R 1 BYTE ;--------------------------------------- S8A0D PHA JSR S88C6 ;M-R PLA BCC B8A19 PLA PLA LDA #$00 RTS B8A19 JSR $FFA8 TYA LDX #$01 JSR S88D7 JSR $FFAE JSR S829E PHA JSR $FFAB PLA B88C2 RTS ;--------------------------------------- ; M-W/M-R/M-E SENDEN ;--------------------------------------- S88C3 LDX #$45 ; E .db $2C S88C6 LDX #$52 ; R .db $2C S88C9 LDX #$57 ; W JSR S80C9 ;LISTEN BCS B88C2 LDA #$4D ; M JSR $FFA8 LDA #$2D ; - S88D7 JSR $FFA8 TXA JMP $FFA8 ;--------------------------------------- ; LISTEN SENDEN, 3 VERSUCHE ;--------------------------------------- S80C9 LDA #$6F S80CB STA $9E STX $9F LDX #$03 B80D1 LDA #$00 STA $90 LDA $BA JSR $FFB1 LDA $9E JSR $FF93 LDA $90 asl BCC B80EB JSR $FFAE DEX BNE B80D1 SEC B80EB LDX $9F rtswait RTS S829E LDA #$6F S82A0 PHA LDA $BA JSR $FFB4 ; talk PLA JSR $FF96 ; sec nach talk JMP $FFA5 ; ee13 ;--------------------------------------- ; FLOPPYMELDUNG AM BILDSCHIRM AUSGEBEN ;--------------------------------------- status lda #$0d jsr $e716 ; output to screen jsr $e716 ; output to screen J82AD JSR S80C9 ; listen BCS J82DE ; dev not present JSR S829E ; talk JSR $E716 ; output to screen asl asl asl asl LDX $AB STA $AB JSR $FFA5 PHA JSR $E716 ; output to screen B82C7 JSR $FFA5 JSR $E716 ; output to screen CMP #$0D BNE B82C7 JSR $FFAB PLA AND #$0F ORA $AB STX $AB CMP #$02 RTS J82DE jsr println .dw notpres JMP $F707 notpres .text "device not present" .db $0D,$00 ;======================================= printdrive1: ldy #16 ldx #15 clc jsr $fff0 printdrive2 lda drive cmp #$0a bcs skipzero lda #$30 ; leading zero output jsr $e716 skipzero ldx drive ; print out currently used device number lda #$00 jsr $bdcd ldx drive stx $ba jsr drivetest ; check drive type bmi dreinhalb cmp #$20 beq fuenfviert cmp #$40 bne unknown jsr println .dw seventyone rts unknown jsr println .dw nodrive rts fuenfviert jsr println .dw fourtyone rts dreinhalb jsr println .dw eightyone rts ;=============================================================================== ; Main menu F7 - "Flash the ROM" ;=============================================================================== flashrom jsr discmenu ; takes care of select, setting filename and correct filesize cmp #$ff beq exitflash jsr println .dw flashfile ldy #$00 dispname lda ($bb),y jsr $e716 iny cpy $b7 bne dispname jsr detcontent jmp skipisempty3 isempty3 jsr $e716 jsr println .dw notempty skipisempty3 jsr println .dw whichflashbank okeyd3 jsr $f142 beq okeyd3 cmp #$31 beq dbank13 cmp #$32 beq dbank23 cmp #$03 bne okeyd3 jmp startoff ; back to main menu dbank23 sta todbank ldx bank2cont bne isempty3 beq flashon dbank13 sta todbank ldx bank1cont bne isempty3 flashon jsr $e716 #ifdef DEVEL jmp flashreal #else jsr println .dw areyousure keymas jsr $f142 cmp #$59 bne nope jsr $e716 jmp flashreal nope cmp #$4e beq exitflash cmp #$03 bne keymas #endif exitflash jmp startoff ; back to main menu flashreal jsr println .dw opening lda #$00 sta $fc sta $8a sta k32toggle sta flasharea ; $fc/$fd - bytes expected lda todbank sec sbc #$31 tax cmp #$00 beq setoffbank cmp #$01 beq setoff2 jmp endeflash setoff2 lda #$08 setoffbank sta offsetbank lda toflash cmp #$64 beq largeromtoflash cmp #$32 beq flash32k lda #$20 ; for 8k .db $2c flash32k lda #$80 ; for 32k .db $2c largeromtoflash lda #$00 ; for 64k sta $fd ; $8a/8b - pointer on load buffer ; start loading here ! lda #$08 ; $b8 ldx drive ; $ba ldy #$08 ; $b9 sty $90 jsr $ffba lda #$03 sta $de01 lda #$03 sta $de00 cli jsr $ffc0 ldx #$08 jsr $ffc6 jmp nxchunk2 nextchunk jsr println .dw loadleft nxchunk2 lda #$03 sta $de01 cli lda #$40 sta $8b nextbyte dec $d020 jsr $ee13 inc $d020 ldy #$00 sta ($8a),y inc $8a bne ne1 inc $8b ne1 lda $fc sec sbc #$01 sta $fc lda $fd sbc #$00 sta $fd lda $fd ; print bytes expected jsr printhex lda $fc jsr fourleft ;lda $90 ;and #%01000000 ;cmp #%01000000 ;beq endload BIT $90 BVC weiterso jmp endload weiterso lda $8b cmp #$80 bne nextbyte jmp flashtherom endload lda #$08 jsr $ffc3 ; close jsr $ffe7 ;================================================== flashtherom lda toflash cmp #$08 ; 8k beq flash8 cmp #$32 ; 32k beq flash32 cmp #$64 ; 64k beq flash64 jmp startoff ; back to main menu flash32 jmp flash32real flash64 jmp flash64real ;------------------------------------------------------------------------------- ; flasher for 8k roms (1 sector) ; FIXME: there is not enough space to copy the entire routine below, we ; should make all this stuff much more modular flash8 .( lda #$00 sta $f8 sta $fa lda #$40 sta $f9 lda #$80 sta $fb jsr println .dw flsh8k ldx offsetbank lda #$00 jsr $bdcd jsr println .dw sectext jsr flashinnerloop bcc noerror1 jmp verifyerror noerror1: jmp endeflash .) ;------------------------------------------------------------------------------- ; flasher for 32k roms (4 sectors) flash32real jsr editordefaults lda #$00 sta $f8 sta $fa lda #$40 sta $f9 lda #$80 sta $fb nextsectorx ; entrypoint from elsewhere jsr println .dw flsh32k ldx offsetbank lda #$00 jsr $bdcd jsr println .dw sectext nextbyter ; entrypoint from elsewhere jsr flashinnerloop bcc noerror jmp verifyerror noerror: lda #$80 sta $fb cmp $f9 beq devil jmp nextsectorx devil lda k32toggle bne skip2ndflash inc k32toggle inc offsetbank inc offsetbank jmp flash32 verifyerror ; entrypoint from elsewhere jsr reinitcart cli jsr println .dw verifyerrorx lda offsetbank jsr printhex lda $fb jsr printhex lda $fa jsr printhex lda #$08 jsr $ffc3 ; close jsr $ffe7 jsr status jsr space jmp flushabort skip2ndflash dec k32toggle dec offsetbank dec offsetbank dec offsetbank dec offsetbank verok lda offsetbank cmp #$04 beq verify cmp #$08+4 beq verify lda #$03 sta $de01 cli noload1 jmp nextchunk ; this jmp addr (!!!) is modified from elsewhere verify lda $fc bne umm lda $fd beq endeflash umm lda #$08 jsr $ffc3 ; close jsr $ffe7 jsr println .dw fileshort lda $fd jsr printhex lda $fc jsr printhex lda #$2c jsr $e716 lda offsetbank jsr printhex lda #$2c jsr $e716 lda toflash jsr printhex lda #$2c jsr $e716 lda $fb jsr printhex lda $fa jsr printhex endeflash lda #$08 jsr $ffc3 ; close jsr $ffe7 lda #$00 sta $c6 jsr reinitcart jsr status jsr space jmp flushabort ;------------------------------------------------------------------------------- ; flasher for 64k roms (8 sectors) flash64real .( jsr editordefaults lda #$00 sta $f8 sta $fa lda #$40 sta $f9 lda #$80 sta $fb nextsectorxy jsr println .dw flsh64k ldx offsetbank lda #$00 jsr $bdcd jsr println .dw sectext ;nextbytery jsr flashinnerloop bcc noerror2 jmp verifyerror noerror2: lda #$80 sta $fb cmp $f9 beq devil2 jmp nextsectorxy devil2 lda $fd ; check for file done bne normalcheck lda $fc bne normalcheck jmp raushier ; faked the checks, finish flash normalcheck lda offsetbank cmp #$08 beq raushier cmp #$10 beq raushier .) noload2 weitea jmp nextchunk ; this jmp addr (!!!) is modified from elsewhere raushier jmp verify ;------------------------------------------------------------------------------- ; inner loop that is common for all flashers flashinnerloop: .( ;nextbytery sei lda #$03 sta $de01 nextbyte2y ldx offsetbank ; -------------------- lda bank1tab,x tax ldy #$00 lda ($f8),y tay jsr byteprogram ldy #$00 ldx offsetbank lda bank1tab,x sta $de01 lda #$10 sta $ae ldx #$80 retryit lda ($fa),y cmp ($f8),y beq noverif dex bne retryit dec $ae bne retryit ; verify error sec rts noverif inc $f8 ; addy to get from bne nx1y inc $f9 nx1y inc $fa ; addy to write to bne nx2y inc $fb nx2y jsr readresetseq lda #$03 sta $de01 cli lda $fa bne speeda1 ; print current hex jsr fourleft2 lda $fb jsr printhex lda $fa jsr printhex speeda1 lda $fb cmp #$a0 bne nextbyte2y ; fertig mit hier inc offsetbank clc rts .) ;------------------------------------------------------------------------------- offsetbank .db 0 k32toggle .db $00 toflash .db $00 ; gets size of rom flasharea .db $00 flexsizer .db $00 maxsize .dw $fafe maxblox .db 255 noyes = $5000 ; yes / no flags namelength = $5100 ; length of filenames fileblk = $5200 ; length of files low fileblk2 = $5300 ; length of files high names = $5500 ; names endnames = $6000 ; jump in here for flexible sizes ... ; X = low - Y = high --- of maximum filesize ; for program flasher the absolute maxsize would be $faff (better: $fafe or so) prgflashfiler: inc flexsizer stx maxsize sty maxsize+1 ldx #$00 stx maxblox stx $fe stx $ff bloxloop: inc maxblox lda #$fe ; bytes per sector clc adc $fe sta $fe lda $ff adc #$00 sta $ff cmp maxsize+1 bne bloxloop lda $fe cmp maxsize bcs skipincblox inc maxblox skipincblox: jsr colreset jsr println ; print header .dw topheader jsr println .dw crtex ldx #$7 ldy #$00 clc jsr $fff0 jsr println .dw prgflashtxt lda maxblox ldy #$07 ldx #27 jsr printdez jsr linien ; file select dec flexsizer rts ;=============================================================================== ; disk menu / file selector ;=============================================================================== ; we jump in here to get files with 33 (8k), 130 (32k) and 259 (64k) blox discmenu: jsr colreset jsr println .dw topheader jsr println .dw crtex linien: lda #$0f sta $0286 jsr colloopy ldx #$27 i0961 lda #$40 sta $05e0,x sta $07c0,x lda #$2d sta $06d0,x lda #$0c sta $dad0,x lda #$06 sta $d9e0,x sta $dbc0,x dex bpl i0961 ldx #$00 stx $d020 stx $d021 copy lda #$00 copier sta noyes,x inx bne copier inc copier+2 ; von $3000 bis lda copier+2 ; $4000 mit $00 cmp #>endnames ; fuellen bne copy lda #>noyes sta copier+2 ldx #$00 copy1 lda #$a0 copier1 sta names,x inx bne copier1 inc copier1+2 ;$3500-$4000 mit lda copier1+2 ; $a0 fuellen cmp #>endnames bne copy1 lda #>names sta copier1+2 honey i09cb lda #$00 ; initvalues sta a108f sta nooffiles sta a108e sta $fa lda #>names sta $fb ldy #$0b-6 ldx #$04 clc jsr $fff0 ; set cursor lda #$9b jsr $e716 ; output to screen lda #$06 ldx #dirname jsr $ffbd ; set filename ldx drive ; device nr lda #2 ; file nr ldy #$00 ; secondary addr jsr $ffba ; set file params jsr $ffc0 ; open bcs diskerror ldx drive stx $ba ldx #2 ; file nr jsr $ffc6 ; set input lda $90 beq tada diskerror: lda #2 ; file nr JSR $FFC3 ; call CLOSE JSR $FFCC ; call CLRCHN lda #$ff rts tada ; skip first 6 bytes ldx #$06 i1342 jsr $ffb7 ; get status bne diskerror ; EOF or error jsr $ffcf ; charin dex bne i1342 i1348 jsr $ee13 ;diskname jsr $e716 ; output to screen bne i1348 lda #$0d jsr $e716 ; output to screen ; files einlesen i1355 jsr $ee13 jsr $ee13 ; ldy nooffiles jsr $ee13 ; get lowbyte size sta fileblk,y getfile jsr $ee13 sta fileblk2,y i1367 jsr $ee13 cmp #$20 beq i1367 ldy #$00 i1370 jsr $ee13 cmp #$22 beq i1381 sta ($fa),y iny cpy #$11 bcs i13bf jmp i1370 i1381 tya ldy nooffiles sta namelength,y i1388 jsr $ee13 bne i1388 inc nooffiles lda #$9b jsr $e716 ; output to screen ldx #$26 ldy #$04 lda nooffiles jsr i0f0c lda $fa clc adc #$10 sta $fa lda $fb adc #$00 sta $fb lda $fb cmp #>endnames ; noch weniger als bcs i13bf jmp i1355 i13bf jsr $f32f ; abort all files jsr $f642 ; close ??? lda #2 ; file nr jsr $ffc3 ; close jsr $ffe7 ; close all channels and files i0a7e jsr i0ce4 i0a81 jsr $f142 beq i0a7e cmp #$03 ; R/S bne i0a8b lda #$ff rts i0a8b cmp #$91 ;crsr up bne i0a9a ldx a108f beq i0a81 dec a108f jmp i0a7e i0a9a cmp #$11 bne i0aad ldx a108f inx cpx nooffiles beq i0a81 stx a108f jmp i0a7e i0aad cmp #$0d ; return beq returner cmp #$59 ; "Y" beq yessir cmp #$4e ; "N" beq nosir jmp i0ae1 returner: jmp i0afe nosir: ldx a108f lda noyes,x beq aaaaa dec a108e lda #$00 sta noyes,x jmp aaaaa ;----------------------- varsize: lda maxblox cmp fileblk,x bcc aaaaa lda fileblk2,x beq okfile bne aaaaa yessir: ; yes ldx a108f lda a108e bne aaaaa lda flexsizer bne varsize ;sizecheck lda fileblk2,x beq checkmsb0 cmp #$01 ; >259 bne i0ace ; msb is 1 lda fileblk,x cmp #$03 ; <259 beq okfile bne i0ace checkmsb0 ; msb is 0 lda fileblk,x cmp #$82 ; <130 beq okfile cmp #33 ; <33 bne i0ace okfile lda noyes,x bne aaaaa ; iss schon lda #1 sta noyes,x inc a108e aaaaa inx cpx nooffiles beq i0ace stx a108f i0ace jmp i0a7e ; home i0ae1 cmp #$13 bne i0aed lda #$00 sta a108f jmp i0a7e ; clr i0aed cmp #$93 bne i0afb ldx nooffiles dex stx a108f jmp i0a7e i0afb jmp i0a81 i0afe lda a108e ; return bne i0b06 jmp i0a81 ;--------------------------------------- i0b06 jsr colreset jsr println .dw topheader ldy #$00 lda #names sta $bc fileloop lda noyes,y bne foundfile lda $bb clc adc #$10 sta $bb lda $bc adc #$00 sta $bc iny bne fileloop lda #$ff ; err abort rts foundfile lda namelength,y sta $b7 lda fileblk,y cmp #$82 ;<130 beq rom32k cmp #33 ;<33 bne large lda #$8 ;8k .db $2c rom32k lda #$32 ;32k .db $2c large lda #$64 ;64k sta toflash rts ;--------------------------------------- i0ce4 lda #$08 sta $c1 lda #$06 sta $c2 lda #$03 sta $0286 fini lda #$fb sta a1090 i0d0d clc lda a108f adc a1090 cmp #200 bcc i0dfe i0d16 ldy #$27 lda #$20 i0d1a sta ($c1),y dey bpl i0d1a clc lda $c1 adc #$28 sta $c1 lda $c2 adc #$00 sta $c2 jmp i0d98 i0dfe cmp nooffiles bcs i0d16 sta $ae tax clc lda a1090 adc #$12 tay lda fileblk2,x ; umbaun beq ordblox tya tax ldy #$05 clc jsr $fff0 ldy $ae okido lda fileblk,y tax lda fileblk2,y jsr $bdcd jmp skipblox ordblox lda fileblk,x ldx #$06 jsr i0f0c skipblox ldy $ae ldx #$00 lda noyes,y bne i0d57 ldx #$03 i0d57 ldy #$1e i0d59 lda yesno,x sta ($c1),y inx iny cpy #$21 bne i0d59 clc lda a1090 adc #$12 tay ; ldx $ae ; lda noyes,x ; ldx #$24 ; jsr i0f0c lda #$00 ldx #$04 i0d68 asl $ae rol dex bne i0d68 clc adc #>names;hi-byte fuer namen sta $af clc lda $c1 adc #$0c sta $c1 lda $c2 adc #$00 sta $c2 ldy #$0f i0d82 lda ($ae),y and #$7f sta ($c1),y dey bpl i0d82 clc lda $c1 adc #$1c sta $c1 lda $c2 adc #$00 sta $c2 i0d98 inc a1090 lda a1090 cmp #$06 beq i0da5 jmp i0d0d i0da5 rts ;--------------------------------------- ; dezi ausgabe ;--------------------------------------- printdez: i0f0c pha txa pha tya tax pla tay clc jsr $fff0 ; set cursor pla hi ldy #$00 jsr style sty z1+1 stx z2+1 sta z3+1 lda #$9d jsr $e716 ; output to screen z1 lda #$00 jsr $e716 ; output to screen z2 lda #$00 jsr $e716 ; output to screen z3 lda #$00 jmp $e716 ; output to screen hi2 ldy #$00 jsr style sty z1+1 stx z2+1 sta z3+1 jmp z1 style sta $5f sty $60 ldx #$10 lda #$00 tay sta $5d sty $5e sed i1aa2 asl $5f rol $60 adc $5d sta $5d pha tya adc $5e sta $5e tay pla dex bne i1aa2 cld tya ora #$30 tay lda $5d lsr lsr lsr lsr ora #$30 tax lda $5d and #$0f ora #$30 rts reinitcart: sei jsr readresetseq reinitcart2: sei lda #$01 sta $de01 lda #$0a sta $de00 jsr $fda3 ; init i/o cli rts ;=============================================================================== xpertssflash: inc $d020 lda #$1 sta xpertssmode ssflash jsr colreset jsr println .dw topheader jsr detcontent jmp skipisempty3x isempty3x jsr $e716 jsr println .dw notempty ; ask for bank to flash skipisempty3x jsr println .dw whichflashbank okeyd3x jsr $f142 beq okeyd3x cmp #$31 ; "1" beq dbank13x cmp #$32 ; "2" beq dbank23x cmp #$03 ; run/stop bne okeyd3x jmp startoff ; back to main menu dbank23x sta todbank ldx bank2cont bne isempty3x beq flashonx dbank13x sta todbank ldx bank1cont bne isempty3x flashonx jsr $e716 #ifndef DEVEL jsr println .dw areyousure keymasx jsr $f142 cmp #$59 beq flashrealx nopex cmp #$4e beq exitflashx cmp #$03 bne keymasx exitflashx jmp startoff ; back to main menu flashrealx jsr $e716 #endif flashrealxx jsr println .dw flashrec ; start xfer jmp flashMir ; start flashing from rr-net keymasxx lda #$04 jsr ss_init ldx #$00 ; delay dex bne *-1 regetser jsr ss_getchr2 bcc movit2 jsr $f142 cmp #$03 bne regetser jmp startoff ; back to main menu jsr ss_getchr movit2 cmp #ss_cmdmagic bne regetser ; check for magic byte (a) jsr ss_getchr cmp #ss_cmdgetblk ; check for (b) bne regetser jsr ss_getchr sta $fc jsr ss_getchr sta $fd tax jsr ss_getchr ; 2 bytes kacke wegwerfen ? jsr ss_getchr lda xpertssmode bne forcelarge cpx #$80 bne largepar ldx #$32 jmp sgaga largepar cpx #$00 bne neenee forcelarge ldx #$64 sgaga stx toflash lda #$00 sta $8a sta k32toggle sta flasharea ; $fc/$fd - bytes expected lda todbank ; flashbank 1 oder 2 sec sbc #$31 tax cmp #$00 beq setoffbankx cmp #$01 beq setoff2x neenee jmp flushabort setoff2x lda #$08 setoffbankx sta offsetbank jmp morebytes ; jump in here for next chunk parchunk jsr println .dw loadleft2 morebytes lda #$03 sta $de01 cli lda #$00 ; set low byte of buffer sta $8c lda #$40 ; set high byte of buffer sta $8b lda xpertssmode ; only on 'illegal sizes' beq nextbytex lda #$ff ; fill buffer with $ff ldy #$00 filloop sta ($8a),y iny bne filloop inc $8b lda $8b cmp #$80 bne filloop-2 lda #$40 ; set high byte of buffer sta $8b ;loop gets in here again nextbytex sei dec $d020 jsr ss_getchr ; getbyte inc $d020 ; cld ldy #$00 sta ($8a),y inc $8a bne ne1x inc $8b ne1x lda $fc ; bytes expected - decrease sec sbc #$01 sta $fc lda $fd sbc #$00 sta $fd ;--------- lda $fc bne skipprint lda $fd ; print bytes expected jsr printhex lda $fc jsr fourleft ;--------- skipprint lda xpertssmode beq normalss lda $fd ; wenn file zu ende, dann extra umgehung von errors bne normalss lda $fc ; durch check auf null und los zum flashen bne normalss beq forceflash normalss lda $8b cmp #$80 bne nextbytex forceflash lda #3 sta $de01 lda #parchunk sta noload1+2 sta noload2+2 jmp flashtherom ;---------------------------------- flushabort lda #nextchunk sta noload1+2 sta noload2+2 jsr $fda3 jmp startoff ; back to main menu ;--------------------------------------- nooffiles .db 0 ; # of files a108e .db 0 ; selected files a108f .db 0 ; actual pos a1090 .db 0 xpertssmode .db 0 ;========================================== nodrive .text " - unknown" .db 0 fourtyone .text " - 1541 " .db 0 eightyone .text " - 1581 " .db 0 seventyone .text " - 1571 " .db 0 ;========================================================= ; ; AMD 29F010 Plain and version A AND B (!) compatible Flash Routines ; ;========================================================= ; checks the manufacturer ID ; returns $09 when the flash is not found ; returns $01 when AMD flashrom is found ;========================================================= ; todbank has offset 0 for bank1tab ; 8 for bank2tab sectorerase: ldx todbank nexteraser: LDA #$11 STA $de01 ;set bank LDA #$aa STA $9555 ;this is a write to $5555 of the chip - cycle one LDA #$09 STA $de01 ;set bank LDA #$55 STA $8aaa ;this is a write to $2aaa of the chip - cycle two LDA #$11 STA $de01 ;set bank LDA #$80 STA $9555 ;write $80 to $5555 - cycle four LDA #$11 STA $de01 ;set bank LDA #$aa STA $9555 ;this is a write to $5555 of the chip - cycle five LDA #$09 STA $de01 ;set bank LDA #$55 STA $8aaa ;this is a write to $2aaa of the chip - cyclce six ; - unlock sequence complete ;-------------------- each of the sector erases need to happen within ;-------------------- 50 microseconds after the last erase command nextsector lda bank1tab,x STA $de01 ;set sector you wish to erase LDA #$30 STA $8000 ;erase the sector SA/30 inx ; erase 2nd sector cpx #$08 beq exithere cpx #$10 beq exithere jsr exithere jmp nexteraser ;----------------------------------------- timeout exithere lda #$90 exitthere sta $ff lda #$00 sta $fe framwait lda $d012 cmp $d012 beq *-3 dec $d020 inc $d020 inc $fe bne framwait inc $ff beq exitfin exit2 jmp framwait exitfin rts ;-------------------------------------------------- ; erase single sector ... X MUST have the bankvalue! ssectorerase: LDA #$11 STA $de01 ;set bank LDA #$aa STA $9555 ;this is a write to $5555 of the chip - cycle one LDA #$09 STA $de01 ;set bank LDA #$55 STA $8aaa ;this is a write to $2aaa of the chip - cycle two LDA #$11 STA $de01 ;set bank LDA #$80 STA $9555 ;write $80 to $5555 - cycle four LDA #$11 STA $de01 ;set bank LDA #$aa STA $9555 ;this is a write to $5555 of the chip - cycle five LDA #$09 STA $de01 ;set bank LDA #$55 STA $8aaa ;this is a write to $2aaa of the chip - cyclce six ; - unlock sequence complete ;-------------------- each of the sector erases need to happen within ;-------------------- 50 microseconds after the last erase command STX $de01 ;set sector you wish to erase LDA #$30 STA $8000 ;erase the sector SA/30 txa jmp exithere ;========================================================= ; X has bank - y has data - $fa/$fb have address byteprogram: LDA #$11 STA $de01 ;set bank LDA #$aa STA $9555 ;this is a write to $5555 of the chip LDA #$09 STA $de01 ;set bank LDA #$55 STA $8aaa ;this is a write to $2aaa of the chip LDA #$11 STA $de01 ;set bank LDA #$a0 STA $9555 ;write $a0 to $5555 STX $de01 ;set bank you desire tya ldy #$00 STA ($fa),y ;write to address you wish to write ; jsr printhex ; lda $fa ; jsr printhex ; lda $fb ; jsr printhex flshwait dec $d020 ; flashwait waitfl ldy #$20 dey bne *-1 inc $d020 ; flashwait rts ;################################################# ;# include time ;################################################# ; the dir routine #include "diskIO/directory.src" ; groepaz serial routines #include "silversurfer/silversurfer.src" ;========================================================== editordefaults ;----------------------------------------------------------------------------------------------- *= $4080 ; on the cart-roms, this table starts at $8080 ; on the buffer it will be $4080 tassoffset := * startset .text "rr" ; mirrored to RR-RAM $9580 cartversion .db hversion,mversion,lversion ; $9582 kiddiestring .text "-count zero/cpx-" ; $9585 ; playing with the kiddiestring needs to prove it's printed ok. ; kiddiestring is used on ; - FLI/ILFI ripper ; - INFO basic command ; - flasher editor ;0123456789012345 fillvalue1 .db $bd ; $9595 fillvalue2 .db $00 ; $9596 fillkey1 .db $42 ; $9597 fillkey2 .db $30 ; $9598 initialfastload .db 1 ; $9599 - 1 to DISABLE serialspeed .db 0,0 ;----------------------------------------------------------------------------------------------- *= tassoffset + $80 ta_header .text "ta" ;----------------------------------------------------------------------------------------------- *= editordefaults lda offsetbank beq doedit cmp #$08 beq doedit rts doedit lda #'r' cmp startset beq invskip jmp invalid invskip cmp startset+1 beq invskip2 jmp invalid invskip2 jsr clrscr jsr println .dw headerok lda cartversion jsr $e716 lda #'.' jsr $e716 lda cartversion+1 jsr $e716 lda cartversion+2 jsr $e716 jsr println .dw owner ldx #0 printown lda kiddiestring,x jsr $e716 inx cpx #16 bne printown ldx #0 lda #crsrleft moveback jsr $e716 inx ; move crsr to start of string cpx #16 bne moveback lda #16 ; length ldx #kiddiestring ; high jsr enterline ;bne editmainfill ;inc $d020 ;jmp *-3 ; endeditor ; ######################## editmainfill jsr println ; print text for fillvalue1 .dw val1 lda fillvalue1 jsr printhex lda #crsrleft jsr doubleprint lda #$82 ; edit fillvalue1 - 2 chars - hex only ldx #$00 ldy #$02 jsr enterline lda $0201 ldx $0200 jsr gethex sta fillvalue1 ; store fillvalue1 jsr println .dw key1 lda fillkey1 jsr $e716 lda #crsrleft jsr $e716 lda #$01 ; 1 char only ldx #$00 ldy #$02 jsr enterline lda $0200 sta fillkey1 ; ######################## jsr println ; print text for fillvalue2 .dw val2 lda fillvalue2 jsr printhex lda #crsrleft jsr doubleprint lda #$82 ; edit fillvalue2 - 2 chars - hex only ldx #$00 ldy #$02 jsr enterline lda $0201 ldx $0200 jsr gethex sta fillvalue2 ; store fillvalue2 jsr println .dw key2 lda fillkey2 jsr $e716 lda #crsrleft jsr $e716 lda #$01 ; 1 char only ldx #$00 ldy #$02 jsr enterline lda $0200 sta fillkey2 ; ######################## ; initialload jsr println .dw fastloadonoff lda #$01 ldx #$00 ldy #$02 jsr enterline lda $0200 cmp #$4e bne yesfl lda #$00 .db $2c yesfl lda #$01 sta initialfastload lda #'t' cmp ta_header bne notass lda #'a' cmp ta_header+1 bne notass jsr println .dw ta_found jmp endeditor notass jsr println .dw ta_notfound jmp endeditor ;--------------------------- invalid lda #$0d jsr $e716 jsr $e716 jsr println .dw invrom jsr println .dw novars endeditor jsr $f142 beq *-3 rts ; exit subrout ;========================================================== colloopy ldx #$00 sta $d800,x sta $d900,x sta $da00,x sta $dae8,x inx bne colloopy+2 sta $0286 rts ;------------------------------------------------------------------ ; the editor and menu for the program flasher flashermenu: .binclude "prgflasher.bin",2 flashermenuend: prgeditor jsr clrscr jsr println .dw header jsr detcontent ; print content jsr println .dw prgmenu lda bank1cont bmi okeditfl lda bank2cont bpl keyflprg okeditfl: jsr println .dw editprgfl keyflprg: jsr $f142 cmp #'c' bne nocreateprg jmp createprg nocreateprg ldx bank1cont bmi chckedit ldx bank2cont bpl rstop chckedit: cmp #'e' beq editprg rstop: cmp #$03 bne keyflprg jmp startoff ; back to main menu ;--------------- edit prgflasher rom editprg lda #$80 cmp bank1cont beq editbank1rom cmp bank2cont beq editbank2rom editbank1rom cmp bank2cont bne editbank1real jsr println .dw editwhichbank keyll2 jsr $f142 cmp #$31 beq editbank1real cmp #$32 beq editbank2rom cmp #$03 bne keyll2 jmp startoff ; back to main menu editbank2rom ldx #$08 .db $2c editbank1real ldx #$00 stx todbank ; todobank gets 0 for bank 0, 1 for 1 jsr println .dw editing lda todbank beq onebank lda #$32 .db $2c onebank lda #$31 jsr $e716 ;---------- copy menu from bank to buffer sei lda #$03 sta $de00 ldy todbank lda bank1tab,y sta $de01 ldx #$00 copmen: lda #$36 sta $01 lda $8000,x sta $a000,x lda $8100,x sta $a100,x lda $8200,x sta $a200,x lda $8300,x sta $a300,x lda $8400,x sta $a400,x inx bne copmen lda #$37 sta $01 jmp editflashbuffer ;--------------- create prgflasher rom isempty23: jsr println .dw notemptybank createprg: jsr println .dw creatbank keyloppy: jsr $f142 ; ask for bank 1 or 2 cmp #$31 beq dbanky1 cmp #$32 beq dbanky2 cmp #$03 bne keyloppy jmp startoff ; back to main menu dbanky2: lda #$08 sta todbank ; todobank ldx bank2cont bne isempty23 beq createon dbanky1: lda #$00 sta todbank ; todobank ldx bank1cont bne isempty23 createon: lda #$36 sta $01 ; ; copy menu to $a000 (buffer) ldy #$00 sty menubuffer+1 lda #$a0 sta menubuffer+2 lda #flashermenu sta $ff ldy #$00 lda ($fe),y menubuffer: sta $a000,y iny bne menubuffer-2 inc $ff inc menubuffer+2 lda menubuffer+2 cmp #$a5 bne menubuffer-4 lda #$37 sta $01 ; ab hier wird editiert, neu geflashed, ge-added, etc. ; einsprung fuer editflash --- todbank hat, welche bank aufm flash bearbeitet wird. MENUPOSITION = $0400+$78+$50 LOW = $FC HIGH = $FD editflashbuffer: contedit23: LDA #21 ; big chars STA $D018 jsr clrscr ; lda #$01 ; sta $de01 LDA CRSRCOLOR ; Setup Screen sta $0286 jsr colloopy LDA BORDERCOLOR STA $D020 LDA BACKGROUNDCOLOR STA $D021 ; DISPLAY MENU jsr println .dw noofprogs lda NUMBEROFPROG jsr printhex ;----------------------------- ldx #39 CRLOOP LDA CRMESSAGE,X STA $0478,X DEX BPL CRLOOP LDA #MENUPOSITION STA HIGH LDX #0 MENULOOP lda FILENAMES,X cmp #$ff beq menukeys LDY #$0B ; y offset on line MENUL ; loop point TXA LSR LSR LSR LSR CLC ADC #$31 STA (LOW),Y ; write number INY INY MENUL2 LDA FILENAMES,X STA (LOW),Y INX INY CPY #$1D BNE MENUL2 ; otherwise print the filename LDA LOW CLC ADC #$28 STA LOW BCC *+4 INC HIGH ; inc screen pos CPX #9*16 BNE MENULOOP ; last menuoption printed ? menukeys: ldy #$00 ldx #14 clc jsr $fff0 jsr println .dw deladdmenu prgkeyer: jsr $f142 beq *-3 cmp #$85 ; F1 - inc col - ok beq inborcol cmp #$86 ; F3 - inc col - ok beq inbgcol cmp #$87 ; F5 - inc col - ok beq incrsrcol #ifdef DEVEL cmp #$88 ; F7 - edit header - ok beq edithead #endif cmp #'a' ; add prg -nok beq addprg cmp #'d' ; del prg -nok beq delprg cmp #'x' beq writtmen ; write menu - test cmp #'s' beq seraddprg jmp prgkeyer ;-------------------------------------------- inborcol: inc $d020 inc BORDERCOLOR jmp contkeyer inbgcol: inc $d021 inc BACKGROUNDCOLOR jmp contkeyer incrsrcol: inc CRSRCOLOR lda CRSRCOLOR jsr colloopy jmp contkeyer edithead: ldy #$00 ldx #$03 clc jsr $fff0 lda #$28 ldy #$03 ldx #$40 jsr enterline ldx #39 loopmsg: lda $0478,x sta CRMESSAGE,x dex bpl loopmsg contkeyer: jsr CHANGER jmp prgkeyer ;-------------------------------------------- ; write menu seraddprg: lda #$07 sta seradd jmp addprg writtmen: jmp writemenu delprg: jmp deleteprg ;------------------------------------ addprg: lda NUMBEROFPROG cmp #$09 bne addthem jsr println .dw slotsfull jsr space2 jmp editflashbuffer addthem: lda NUMBEROFPROG asl tax lda ROMADRES,x ; get startadress on rom sta TSTART sta $8a ; der counter fr sp�er ; ab hier wird das prg gestored lda ROMADRES+1,x ; get highbyte sta TSTART+1 LSR LSR LSR LSR LSR ; take down to 0-7 clc adc todbank ; add offset for FlashBank 0,1 TAX STX OFFSICOUNT lda TSTART+1 ; get highbyte again sec sbc offsitab,x ; substract bankoffset from startadress on rom clc adc #$40 sta $8b ; der counter fr sp�er ;------------ ; calc space left on rom ; and get the filename lda #$ff sec sbc TSTART sta SPCLFT tax lda #$ff sbc TSTART+1 sta SPCLFT+1 lda SPCLFT cmp #$40 bcs weitadden lda SPCLFT+1 bne weitadden jsr colreset jsr println .dw topheader jsr println .dw toofull jsr space2 jmp editflashbuffer weitadden ;------------------------------------------------- ; checkin for serial stuff lda seradd beq fileload1 ; branch file/serial lda #$04 jsr ss_init ; init ldx #$00 ; delay dex bne *-1 ldy #$16 ; clear out filename lda #$20 sta $03e0,y dey bpl *-4 ldy #$00 sty $b7 jmp skiponemore fileload1: ldx SPCLFT ldy SPCLFT+1 jsr prgflashfiler cmp #$ff bne okloadfile jmp editflashbuffer ;------------------------------------------- okloadfile ldy $b7 ; copy filename to $03e0 lda ($bb),y sta $03e0,y dey bpl *-6 skiponemore: lda #$e0 sta $bb lda #$03 sta $bc lda #$00 ; copy the last used bank to buffer at $4000 sta $fc sta $fe lda #$40 sta $fd sei lda OFFSICOUNT and #$fe ; clear bit 0 tax gloop lda bank1tab,x sta $de01 ; turn on bank lda #$80 sta $ff ldy #$00 coplop lda ($fe),y sta ($fc),y iny bne coplop inc $ff inc $fd lda $ff cmp #$a0 bne coplop inx lda $fd cmp #$80 bne gloop ;----------------------- lda #$03 sta $de01 sta $de00 jsr colreset jsr println .dw topheader jsr println ; print filename .dw settinup lda seradd ; serial text beq noseroutput jsr println .dw serinup lda SPCLFT sec sbc #$10 tax lda SPCLFT+1 sbc #$00 jsr printhex txa jsr printhex lda #$0d jsr $e716 jsr $e716 regetser2 jsr ss_getchr2 bcc movit jsr $f142 cmp #$03 bne regetser2 jmp editflashbuffer jsr ss_getchr movit cmp #ss_cmdmagic bne regetser2 jsr ss_getchr cmp #ss_cmdgetblk bne regetser2 jsr ss_getchr sta serlength ; serial length jsr ss_getchr sta serlength+1 ; serial length high jsr ss_getchr ; discard 2 nullbytes jsr ss_getchr jsr ss_getchr ; low byte start sta TADRES jsr ss_getchr sta TADRES+1 lda serlength ; calc real length sec sbc TADRES sta serlength lda serlength+1 sbc TADRES+1 sta serlength+1 jmp weitaso ;-------------------- noseroutput ldy #$00 dispname2 lda ($bb),y sta NAMEBUFFER,y jsr $e716 iny cpy $b7 bne dispname2 LDA #$00 STA $90 lda #$08 ; $b8 ldx drive ; $ba ldy #$08 ; $b9 jsr $ffba cli jsr $ffc0 ldx #$08 jsr $ffc6 cli jsr $ee13 ; buffer startadress sta TADRES jsr $ee13 sta TADRES+1 bit $90 beq weitaso lda #$08 jsr $ffc3 ; close jsr $ffe7 jsr status jsr space jmp editflashbuffer weitaso ; ------- edit the startaddy of program lda serlength+1 jsr printhex lda serlength jsr printhex jsr println .dw LOADADDY lda TADRES+1 jsr printhex lda TADRES jsr fourleft lda #$84 ldx #$00 ldy #$02 jsr enterline lda $0201 ldx $0200 jsr gethex pha lda NUMBEROFPROG asl tax pla sta LOADADRESS+1,x lda $0203 ldx $0202 jsr gethex pha lda NUMBEROFPROG asl tax pla sta LOADADRESS,x cmp #$01 bne norun lda LOADADRESS+1,x cmp #$08 bne norun ;-------- ask for RUN jsr println .dw STARTRUN runkey jsr $f142 cmp #$4e beq norun cmp #$59 bne runkey ;--------- set run-start lda NUMBEROFPROG asl tax lda #$FF ; set the run marker sta STARTADRESS,x sta STARTADRESS+1,x ldx NUMBEROFPROG lda #$58 ; set CLI for basic sta CLISEI,x lda #$37 ; set $01 value sta INITONE,x jmp namedit ; set no run-start norun: jsr println .dw STARTADDY ; ask for start-jump lda TADRES+1 jsr printhex lda TADRES jsr fourleft ; give load adress as default lda #$84 ldx #$00 ldy #$02 jsr enterline lda $0201 ldx $0200 jsr gethex pha lda NUMBEROFPROG asl tax pla sta STARTADRESS+1,x lda $0203 ldx $0202 jsr gethex pha lda NUMBEROFPROG asl tax pla sta STARTADRESS,x jsr println .dw IRQFLAG flagcheck jsr $f142 cmp #'c' beq clear cmp #'s' bne flagcheck lda #$78 .db $2c clear lda #$58 ldx NUMBEROFPROG sta CLISEI,x ;-------------- ask for $01 value jsr println .dw ZERONE lda #$82 ldx #$00 ldy #$02 jsr enterline lda $0201 ldx $0200 jsr gethex ldx NUMBEROFPROG sta INITONE,x ;--------------- we have it all ... namedit: jsr println .dw MENUNAME lda seradd bne skipdispname ; print the original name ldy #$00 dispname3 lda NAMEBUFFER,y jsr $e716 iny cpy $b7 bne dispname3 skipdispname lda #$0d jsr $e716 lda #crsrup jsr $e716 lda #16 ldx #$00 ldy #$02 jsr enterline pha ; laenge retten lda #>FILENAMES sta $ff lda #FILENAMES sta $ff lda # RUN - addy -> SYS FILENAMES = $c0be ; $ce, $de, $ee, $fe, $0e, $1e, $2e, $3e ok BORDERCOLOR = $c14f BACKGROUNDCOLOR = $c150 CRSRCOLOR = $c151 CRMESSAGE = $c152 INITONE = $c17a ; $7a, $7b, $7c, $7d, $7e, $7f, $80 CLISEI = $c182 ; $82, $83, $84, $85, $86, $87, $88 LOADADDY: .db 13,13 .text "LOAD-Adress of PRG: $" .db 0 STARTRUN: .db 13,13 .text "A LOAD-Adress of $0801 often" .db 13 .text "assumes an executable file." .db 13 .text "So, start the PRG with RUN ? (Y/N)" .db 0 STARTADDY: .db 13,13 .text "Startadress ($ffff = RUN): $" .db 0 IRQFLAG: .db 13,13 .text "SEI or CLI ? (S/C)" .db 0 ZERONE: .db 13,13 .text "$01 Value: $37" .db crsrleft,crsrleft,0 MENUNAME: .db 13,13 .text "Name the menu option (16 SMALL chars)" .db 13,0 ROMCOUNT: .db 13,13 .text "Loading to ROM adress: $" .db 0 FLASHWORK: .db 13,13 .text "Working on FlashROM " FLWORK2: .text "..." .db 0 nochange: .db 13,13 .text "No changes done. Space." .db 0 serlength .dw $0000 seradd .db 0 CHANGED .db 0 OFFSICOUNT .db 0 OFFSI .db 0 ; the bank where we start flashing the program SPCLFT .dw $FAFF ; spc left on rom TADRES .dw $FFFF ; buffer for startaddy of file TSTART .dw $FFFF ; here we store the ROMADRES (addy in RR ROM) SSRRflag .db 0 ; 0 for SS - 1 for RR-net .text "+end+" ;------------------------------------------------------------------ endegelaende ;------------------------------------------------------------------ * = $c000 jsr rrnet_init jmp flashMir ; baccys rrnet routines #include "rrnet/rrnet.src" ; IP/MAC entry stolen from rrnet mk3 tool ; #include "enteripmac.src" ;--------------------------------------- flashMir: ; jsr enteripandmac ; jsr rrnet_init .( lda #'1' sta tftpName+2 lda #tftpName_len ldx #tftpName jsr $ffbd jsr rrnet_open jsr rrnet_get sta $fc sta $0400 lda #0 rol sta $0428 jsr rrnet_get sta $fd sta $0401 lda #0 rol sta $0429 lda #3 sta $d021 ldx #$32 cmp #$80 beq sizeOk_rrnet cmp #$00 bne sizeError_rrnet ldx #$64 sizeOk_rrnet: stx toflash lda #$00 sta $8a sta k32toggle sta flasharea ; $fc/$fd - bytes expected lda todbank ; flashbank 1 oder 2 sec sbc #$31 tax cmp #$00 beq setoffbankx_rrnet cmp #$01 beq setoff2x_rrnet sizeError_rrnet: jmp flushabort setoff2x_rrnet: lda #$08 setoffbankx_rrnet: sta offsetbank jmp morebytes ; jump in here for next chunk parchunk_rrnet inc tftpName+2 lda #tftpName_len ldx #tftpName jsr $ffbd jsr rrnet_open jsr println .dw loadleft2 morebytes_rrnet: lda #$03 sta $de01 lda #$00 ; set low byte of buffer sta $8c lda #$40 ; set high byte of buffer sta $8b nextbytex_rrnet: dec $d020 jsr rrnet_get ; getbyte inc $d020 ldy #$00 sta ($8a),y inc $8a bne ne1x_rrnet inc $8b ne1x_rrnet: lda $fc ; bytes expected - decrease sec sbc #$01 sta $fc lda $fd sbc #$00 sta $fd ;--------- lda $fc bne skipprint_rrnet lda $fd ; print bytes expected jsr printhex lda $fc jsr fourleft ;--------- skipprint_rrnet: lda $8b cmp #$80 bne nextbytex_rrnet forceflash_rrnet lda #3 sta $de01 lda #parchunk sta noload1+2 sta noload2+2 jmp flashtherom tftpName: .pet "rr0" tftpName_len = *-tftpName .) ;------------------------------------------------------------------ #if *>=$ca00 #error "code exceeds $ca00 (start of packet buffer)" #endif