Re: A novel 6502 Protocol Decoder for Sigrok
Posted: Wed Nov 08, 2017 6:51 pm
BigEd wrote:
Ah, yes, very good point: it does collapse down the number of things to handle. (I think BIT is the only one. It's also true that TXS doesn't set the flags, unlike the other Txx operations.)
I've had a quick go at this, and it's looking promising.
Here's a snapshot of the current code:
https://github.com/hoglet67/libsigrokde ... /tables.py
It's currently outputting all state at the end of each instruction.
Here's an example:
Code: Select all
????: xxx A=?? X=?? Y=?? SP=?? N=? V=? D=? I=? Z=? C=?
????: BBR7 7F,pc-1 A=?? X=?? Y=?? SP=?? N=? V=? D=? I=? Z=? C=?
????: BRK #00 A=?? X=?? Y=?? SP=?? N=? V=? D=0 I=1 Z=? C=?
D9CD: LDA #40 A=40 X=?? Y=?? SP=?? N=0 V=? D=0 I=1 Z=0 C=?
D9CF: STA 0D00 A=40 X=?? Y=?? SP=?? N=0 V=? D=0 I=1 Z=0 C=?
D9D2: SEI A=40 X=?? Y=?? SP=?? N=0 V=? D=0 I=1 Z=0 C=?
D9D3: CLD A=40 X=?? Y=?? SP=?? N=0 V=? D=0 I=1 Z=0 C=?
D9D4: LDX #FF A=40 X=FF Y=?? SP=?? N=1 V=? D=0 I=1 Z=0 C=?
D9D6: TXS A=40 X=FF Y=?? SP=FF N=1 V=? D=0 I=1 Z=0 C=?
D9D7: LDA FE4E A=80 X=FF Y=?? SP=FF N=1 V=? D=0 I=1 Z=0 C=?
D9DA: ASL A A=00 X=FF Y=?? SP=FF N=0 V=? D=0 I=1 Z=1 C=1
D9DB: PHA A=00 X=FF Y=?? SP=FE N=0 V=? D=0 I=1 Z=1 C=1
D9DC: BEQ D9E7 A=00 X=FF Y=?? SP=FE N=0 V=? D=0 I=1 Z=1 C=1
D9E7: LDX #04 A=00 X=04 Y=?? SP=FE N=0 V=? D=0 I=1 Z=0 C=1
D9E9: STX 01 A=00 X=04 Y=?? SP=FE N=0 V=? D=0 I=1 Z=0 C=1
D9EB: STA 00 A=00 X=04 Y=?? SP=FE N=0 V=? D=0 I=1 Z=0 C=1
D9ED: TAY A=00 X=04 Y=00 SP=FE N=0 V=? D=0 I=1 Z=1 C=1
D9EE: STA (00),Y A=00 X=04 Y=00 SP=FE N=0 V=? D=0 I=1 Z=1 C=1
D9F0: CMP 01 A=00 X=04 Y=00 SP=FE N=1 V=? D=0 I=1 Z=0 C=0
D9F2: BEQ D9FD A=00 X=04 Y=00 SP=FE N=1 V=? D=0 I=1 Z=0 C=0
D9F4: INY A=00 X=04 Y=01 SP=FE N=0 V=? D=0 I=1 Z=0 C=0
D9F5: BNE D9EE A=00 X=04 Y=01 SP=FE N=0 V=? D=0 I=1 Z=0 C=0
D9EE: STA (00),Y A=00 X=04 Y=01 SP=FE N=0 V=? D=0 I=1 Z=0 C=0
D9F0: CMP 01 A=00 X=04 Y=01 SP=FE N=1 V=? D=0 I=1 Z=0 C=0
D9F2: BEQ D9FD A=00 X=04 Y=01 SP=FE N=1 V=? D=0 I=1 Z=0 C=0
D9F4: INY A=00 X=04 Y=02 SP=FE N=0 V=? D=0 I=1 Z=0 C=0
D9F5: BNE D9EE A=00 X=04 Y=02 SP=FE N=0 V=? D=0 I=1 Z=0 C=0
D9EE: STA (00),Y A=00 X=04 Y=02 SP=FE N=0 V=? D=0 I=1 Z=0 C=0
D9F0: CMP 01 A=00 X=04 Y=02 SP=FE N=1 V=? D=0 I=1 Z=0 C=0
D9F2: BEQ D9FD A=00 X=04 Y=02 SP=FE N=1 V=? D=0 I=1 Z=0 C=0
D9F4: INY A=00 X=04 Y=03 SP=FE N=0 V=? D=0 I=1 Z=0 C=0
D9F5: BNE D9EE A=00 X=04 Y=03 SP=FE N=0 V=? D=0 I=1 Z=0 C=0
D9EE: STA (00),Y A=00 X=04 Y=03 SP=FE N=0 V=? D=0 I=1 Z=0 C=0
D9F0: CMP 01 A=00 X=04 Y=03 SP=FE N=1 V=? D=0 I=1 Z=0 C=0
D9F2: BEQ D9FD A=00 X=04 Y=03 SP=FE N=1 V=? D=0 I=1 Z=0 C=0
D9F4: INY A=00 X=04 Y=04 SP=FE N=0 V=? D=0 I=1 Z=0 C=0
D9F5: BNE D9EE A=00 X=04 Y=04 SP=FE N=0 V=? D=0 I=1 Z=0 C=0
D9EE: STA (00),Y A=00 X=04 Y=04 SP=FE N=0 V=? D=0 I=1 Z=0 C=0
D9F0: CMP 01 A=00 X=04 Y=04 SP=FE N=1 V=? D=0 I=1 Z=0 C=0
D9F2: BEQ D9FD A=00 X=04 Y=04 SP=FE N=1 V=? D=0 I=1 Z=0 C=0
D9F4: INY A=00 X=04 Y=05 SP=FE N=0 V=? D=0 I=1 Z=0 C=0
D9F5: BNE D9EE A=00 X=04 Y=05 SP=FE N=0 V=? D=0 I=1 Z=0 C=0
D9EE: STA (00),Y A=00 X=04 Y=05 SP=FE N=0 V=? D=0 I=1 Z=0 C=0
D9F0: CMP 01 A=00 X=04 Y=05 SP=FE N=1 V=? D=0 I=1 Z=0 C=0
D9F2: BEQ D9FD A=00 X=04 Y=05 SP=FE N=1 V=? D=0 I=1 Z=0 C=0
D9F4: INY A=00 X=04 Y=06 SP=FE N=0 V=? D=0 I=1 Z=0 C=0
D9F5: BNE D9EE A=00 X=04 Y=06 SP=FE N=0 V=? D=0 I=1 Z=0 C=0
D9EE: STA (00),Y A=00 X=04 Y=06 SP=FE N=0 V=? D=0 I=1 Z=0 C=0
D9F0: CMP 01 A=00 X=04 Y=06 SP=FE N=1 V=? D=0 I=1 Z=0 C=0
D9F2: BEQ D9FD A=00 X=04 Y=06 SP=FE N=1 V=? D=0 I=1 Z=0 C=0
D9F4: INY A=00 X=04 Y=07 SP=FE N=0 V=? D=0 I=1 Z=0 C=0
I think it would be possible to add sanity checking like we did with the PC. For example, on STA the current value of A is visible on the bus, and can be checked against the predicted value.
Here's the current TODO list:
Code: Select all
# Emulation TODO list
# - Seperate 6502/65C02 modes
# - Decimal mode
# - Overflow flag in ADC/SBC
# - Reduce uncertainty where possible (e.g. where just one of A and C is undefined)
# - implement RTI
# - check push/pull behaviour
# - sanity checking (e.g. on STA, STX, STY, PHA, PHX, PHY, PHP, etc)