| |
oziphantom
Registered: Oct 2014 Posts: 478 |
EF 3 hardware crash
So I have this Easy flash cart that I'm flashing to the EF3 in the normal way. Nothing special.
In VICE it works perfectly fine, no issues.
However on hardware it crashes.
The structure is a little odd.
the lo bank is mirrored across all lower banks, i.e bank 0 8000-9FFF = 1 8000-9FFF = 2 8000-9FFF etc the upper 8K is unique, kind of the reverse of a NES mapper I guess.
When the code changes the bank, there is a routine that takes A and does
and #$3f
sta $DE01
rts
on hardware this kills it, as far as I can tell a BRK occurs. It should be fine because that routine is in every lower bank in the same spot. That fact that it works in VICE tells me this is true.
But is there a case where on hardware ( I'm running it on a Commodore 128, it has also been shown to fail on a 1541U11+ with identical behavior ) the read of the RTS can fail? It gets garbage data for the next clock, the latch hasn't settled in time or something?
Or any other ideas? |
|
... 17 posts hidden. Click here to view all posts.... |
| |
Martin Piper
Registered: Nov 2007 Posts: 634 |
Have to agree, bank switching code in RAM is the way to go. |
| |
oziphantom
Registered: Oct 2014 Posts: 478 |
Yup it crashes here is the complete code and pre-built ef cart https://www.dropbox.com/s/qh5bt265xcx2dpt/ef_crashtest.zip?dl=0 it has a batch file, but it is trivial to convert to anything else. assembles with 64tass
but for those that just want to snoop the code
; upper bank
.logical $a000
* = $bfd8
coldStart
sei
ldx #$ff
txs
cld
lda #8
sta $d016
_coldStart_wait_for_ram:
sta $0100, x
dex
bne _coldStart_wait_for_ram
ldx #$40
_coldStart_l1:
lda _startUpCode+$4000, x
sta $0100, x
dex
bpl _coldStart_l1
jmp $0100
*= $BF98
_startUpCode
lda #$87
sta $de02
lda #$7f
sta $dc00
ldx #$ff
stx $dc02
inx
stx $dc03
lda $dc01
stx $dc02
stx $dc00
and #$e0
cmp #$e0
bne _startUpCode_kill
ldx #0
stx $d016
jsr $ff84
jsr $ff87
jsr $ff8a
jsr $ff81
jmp $8000
_startUpCode_kill:
lda #4
sta $de02
jmp ($fffc)
_startUpCode_end:
*= $BFFA
.word $FFFE
.word coldStart+$4000
.word $4040
.here
;lowerBank00.asm
.logical $8000
start
lda #1
sta $0400
jsr changeBanks
lda #2
sta $0400
- inc $d020
jmp -
changeBanks
and #$3f
sta $de01
rts
.here
;makeBin.asm
*=$0000
Bank0Lo .binclude "lowerBank00.asm"
*=$2000
Bank0Hi .binclude "upperBank.asm"
*=$4000
Bank1Lo .binclude "lowerBank00.asm"
*=$6000
.fill $2000,$EA
|
| |
chatGPZ
Registered: Dec 2001 Posts: 11108 |
despite its a bit irritating that the ROMH bank base address is set to $a000 and not $e000 as it should be, this should work just fine. will test on the real thing later :) |
| |
JackAsser
Registered: Jun 2002 Posts: 1989 |
Worked fine on my C128D using my custom EotB-carts. They are a direct clone of the logic in an EF1-cart but implemented using a CPLD. A 'B' is shown and the border is inc'd, like the code. Also works fine on the 1541U2+ EF-emulation (firmware 3.3(112)), again running on the same C128D. Will test with a plain C128 tonight. |
| |
chatGPZ
Registered: Dec 2001 Posts: 11108 |
One thing that comes to mind - did you try setting the irq vector to something valid? Perhaps you are getting a spurious interrupt for some reason. |
| |
sailor
Registered: Jan 2002 Posts: 90 |
start
sei ; reset/init
ldx #$ff
txs
cld
lda #$2f
sta $00
lda #$e7
sta $01
lda #$00 ;fd50. memclr+test
tay
Ifd53 STA $0002,Y
STA $0200,Y
STA $0300,Y
INY
BNE IFD53
ldx #<($8000)
ldy #>($8000)
jsr $FD8D
jsr $e3bf ;reset basic vectors
jsr $e453 ;reset 0300-030b
jsr $ff81
jsr $ff84
jsr $ff8a ;reset 0314-0330
This is what I have for booting an EF, for C64 atleast. I remember that $00/$01 had to be set or it could/would crash, worked flawlessly in emu tho. |
| |
chatGPZ
Registered: Dec 2001 Posts: 11108 |
Quote:I remember that $00/$01 had to be set or it could/would crash
that should not be the case (unless broken hardware/PLA/pullups) as long as regular ROMs are being accessed. |
| |
tlr
Registered: Sep 2003 Posts: 1714 |
Quoting sailor
start
sei ; reset/init
ldx #$ff
txs
cld
lda #$2f
sta $00
lda #$e7
sta $01
This is what I have for booting an EF, for C64 atleast. I remember that $00/$01 had to be set or it could/would crash, worked flawlessly in emu tho.
Isn't that $00/$01 ordering risky? You set the DDR before setting the actual value in $01. IIRC $00 is cleared on reset effectively making all bits output 1's which is a safe state. You'd want the $01 value to be correct before changing that or else your ROM might go away below your feet. |
| |
oziphantom
Registered: Oct 2014 Posts: 478 |
the JSR $FF84 in the "$100" code sets $00 and $01 explicitly.
If I put the inc border in infinite loop the line before the "change cart" bank then it works. And thus the code is easily making it past, past the move to $100, swiching the cart to 16K from ultimax mode and thus remove the $40,$40 from being the IRQ vector. |
| |
sailor
Registered: Jan 2002 Posts: 90 |
Right!
That is wrong,
this is the correct order
start
sei ; reset/init
ldx #$ff
txs
cld
lda #$e7
sta $01
lda #$2f
sta $00
|
Previous - 1 | 2 | 3 - Next |