Enhanced Decimal on 65xx
Posted: Sun Jan 06, 2008 1:26 am
Do you expect to ask the manufacturer to improve decimal mode on 65xx? The decimal mode allows to support Negative flag and Overflow flag 100% accurate.
Unfortunately, binary coded decimal in ADC and SBC instruction may set negative flag and overflow flag incorrectly when you want to use negative on the range of 5 through 9 and positive on the range of 0 through 4.
It is ideal to move negative from 7th bit to 8th bit. The byte size would look like 9 bit instead of 8 bit.
You put value into the register. The register checks the range of 5 through 9 on the value before it sets negative on 8th bit.
You may prefer to test BCD values to determine if negative flag or overflow flag is set so branch can be taken.
It is too complex logic and BCD is incompatible to some 65xx instructions which they only support 8-bit byte size, but not 9-bit byte size.
It would be nice to write small BCD routine on 65xx to overcome the limitation when you wish to test BCD's negative flag and overflow flag so branch can be taken.
Please let me know what you think and it is appropriate to do it.
Here is an example of my sample data below. I did post it previous thread, but this sample data looks clearer. Use this example below if you can write BCD routine with 9-bit byte size. It allows to expand from 4-bit nibble size to 8-bit byte size and 16-bit word size with one extra bit for negative.
0 + 0 = 0 N: 0 V: 0 Z: 1 C: 0
0 + 1 = 1 N: 0 V: 0 Z: 0 C: 0
0 + 2 = 2 N: 0 V: 0 Z: 0 C: 0
0 + 3 = 3 N: 0 V: 0 Z: 0 C: 0
0 + 4 = 4 N: 0 V: 0 Z: 0 C: 0
0 + 5 = 5 N: 1 V: 0 Z: 0 C: 0
0 + 6 = 6 N: 1 V: 0 Z: 0 C: 0
0 + 7 = 7 N: 1 V: 0 Z: 0 C: 0
0 + 8 = 8 N: 1 V: 0 Z: 0 C: 0
0 + 9 = 9 N: 1 V: 0 Z: 0 C: 0
1 + 0 = 1 N: 0 V: 0 Z: 0 C: 0
1 + 1 = 2 N: 0 V: 0 Z: 0 C: 0
1 + 2 = 3 N: 0 V: 0 Z: 0 C: 0
1 + 3 = 4 N: 0 V: 0 Z: 0 C: 0
1 + 4 = 5 N: 1 V: 1 Z: 0 C: 0
1 + 5 = 6 N: 1 V: 0 Z: 0 C: 0
1 + 6 = 7 N: 1 V: 0 Z: 0 C: 0
1 + 7 = 8 N: 1 V: 0 Z: 0 C: 0
1 + 8 = 9 N: 1 V: 0 Z: 0 C: 0
1 + 9 = 0 N: 0 V: 0 Z: 1 C: 1
2 + 0 = 2 N: 0 V: 0 Z: 0 C: 0
2 + 1 = 3 N: 0 V: 0 Z: 0 C: 0
2 + 2 = 4 N: 0 V: 0 Z: 0 C: 0
2 + 3 = 5 N: 1 V: 1 Z: 0 C: 0
2 + 4 = 6 N: 1 V: 1 Z: 0 C: 0
2 + 5 = 7 N: 1 V: 0 Z: 0 C: 0
2 + 6 = 8 N: 1 V: 0 Z: 0 C: 0
2 + 7 = 9 N: 1 V: 0 Z: 0 C: 0
2 + 8 = 0 N: 0 V: 0 Z: 1 C: 1
2 + 9 = 1 N: 0 V: 0 Z: 0 C: 1
3 + 0 = 3 N: 0 V: 0 Z: 0 C: 0
3 + 1 = 4 N: 0 V: 0 Z: 0 C: 0
3 + 2 = 5 N: 1 V: 1 Z: 0 C: 0
3 + 3 = 6 N: 1 V: 1 Z: 0 C: 0
3 + 4 = 7 N: 1 V: 1 Z: 0 C: 0
3 + 5 = 8 N: 1 V: 0 Z: 0 C: 0
3 + 6 = 9 N: 1 V: 0 Z: 0 C: 0
3 + 7 = 0 N: 0 V: 0 Z: 1 C: 1
3 + 8 = 1 N: 0 V: 0 Z: 0 C: 1
3 + 9 = 2 N: 0 V: 0 Z: 0 C: 1
4 + 0 = 4 N: 0 V: 0 Z: 0 C: 0
4 + 1 = 5 N: 1 V: 1 Z: 0 C: 0
4 + 2 = 6 N: 1 V: 1 Z: 0 C: 0
4 + 3 = 7 N: 1 V: 1 Z: 0 C: 0
4 + 4 = 8 N: 1 V: 1 Z: 0 C: 0
4 + 5 = 9 N: 1 V: 0 Z: 0 C: 0
4 + 6 = 0 N: 0 V: 0 Z: 1 C: 1
4 + 7 = 1 N: 0 V: 0 Z: 0 C: 1
4 + 8 = 2 N: 0 V: 0 Z: 0 C: 1
4 + 9 = 3 N: 0 V: 0 Z: 0 C: 1
5 + 0 = 5 N: 1 V: 0 Z: 0 C: 0
5 + 1 = 6 N: 1 V: 0 Z: 0 C: 0
5 + 2 = 7 N: 1 V: 0 Z: 0 C: 0
5 + 3 = 8 N: 1 V: 0 Z: 0 C: 0
5 + 4 = 9 N: 1 V: 0 Z: 0 C: 0
5 + 5 = 0 N: 0 V: 1 Z: 1 C: 1
5 + 6 = 1 N: 0 V: 1 Z: 0 C: 1
5 + 7 = 2 N: 0 V: 1 Z: 0 C: 1
5 + 8 = 3 N: 0 V: 1 Z: 0 C: 1
5 + 9 = 4 N: 0 V: 1 Z: 0 C: 1
6 + 0 = 6 N: 1 V: 0 Z: 0 C: 0
6 + 1 = 7 N: 1 V: 0 Z: 0 C: 0
6 + 2 = 8 N: 1 V: 0 Z: 0 C: 0
6 + 3 = 9 N: 1 V: 0 Z: 0 C: 0
6 + 4 = 0 N: 0 V: 0 Z: 1 C: 1
6 + 5 = 1 N: 0 V: 1 Z: 0 C: 1
6 + 6 = 2 N: 0 V: 1 Z: 0 C: 1
6 + 7 = 3 N: 0 V: 1 Z: 0 C: 1
6 + 8 = 4 N: 0 V: 1 Z: 0 C: 1
6 + 9 = 5 N: 1 V: 0 Z: 0 C: 1
7 + 0 = 7 N: 1 V: 0 Z: 0 C: 0
7 + 1 = 8 N: 1 V: 0 Z: 0 C: 0
7 + 2 = 9 N: 1 V: 0 Z: 0 C: 0
7 + 3 = 0 N: 0 V: 0 Z: 1 C: 1
7 + 4 = 1 N: 0 V: 0 Z: 0 C: 1
7 + 5 = 2 N: 0 V: 1 Z: 0 C: 1
7 + 6 = 3 N: 0 V: 1 Z: 0 C: 1
7 + 7 = 4 N: 0 V: 1 Z: 0 C: 1
7 + 8 = 5 N: 1 V: 0 Z: 0 C: 1
7 + 9 = 6 N: 1 V: 0 Z: 0 C: 1
8 + 0 = 8 N: 1 V: 0 Z: 0 C: 0
8 + 1 = 9 N: 1 V: 0 Z: 0 C: 0
8 + 2 = 0 N: 0 V: 0 Z: 1 C: 1
8 + 3 = 1 N: 0 V: 0 Z: 0 C: 1
8 + 4 = 2 N: 0 V: 0 Z: 0 C: 1
8 + 5 = 3 N: 0 V: 1 Z: 0 C: 1
8 + 6 = 4 N: 0 V: 1 Z: 0 C: 1
8 + 7 = 5 N: 1 V: 0 Z: 0 C: 1
8 + 8 = 6 N: 1 V: 0 Z: 0 C: 1
8 + 9 = 7 N: 1 V: 0 Z: 0 C: 1
9 + 0 = 9 N: 1 V: 0 Z: 0 C: 0
9 + 1 = 0 N: 0 V: 0 Z: 1 C: 1
9 + 2 = 1 N: 0 V: 0 Z: 0 C: 1
9 + 3 = 2 N: 0 V: 0 Z: 0 C: 1
9 + 4 = 3 N: 0 V: 0 Z: 0 C: 1
9 + 5 = 4 N: 0 V: 1 Z: 0 C: 1
9 + 6 = 5 N: 1 V: 0 Z: 0 C: 1
9 + 7 = 6 N: 1 V: 0 Z: 0 C: 1
9 + 8 = 7 N: 1 V: 0 Z: 0 C: 1
9 + 9 = 8 N: 1 V: 0 Z: 0 C: 1
Unfortunately, binary coded decimal in ADC and SBC instruction may set negative flag and overflow flag incorrectly when you want to use negative on the range of 5 through 9 and positive on the range of 0 through 4.
It is ideal to move negative from 7th bit to 8th bit. The byte size would look like 9 bit instead of 8 bit.
You put value into the register. The register checks the range of 5 through 9 on the value before it sets negative on 8th bit.
You may prefer to test BCD values to determine if negative flag or overflow flag is set so branch can be taken.
It is too complex logic and BCD is incompatible to some 65xx instructions which they only support 8-bit byte size, but not 9-bit byte size.
It would be nice to write small BCD routine on 65xx to overcome the limitation when you wish to test BCD's negative flag and overflow flag so branch can be taken.
Please let me know what you think and it is appropriate to do it.
Here is an example of my sample data below. I did post it previous thread, but this sample data looks clearer. Use this example below if you can write BCD routine with 9-bit byte size. It allows to expand from 4-bit nibble size to 8-bit byte size and 16-bit word size with one extra bit for negative.
0 + 0 = 0 N: 0 V: 0 Z: 1 C: 0
0 + 1 = 1 N: 0 V: 0 Z: 0 C: 0
0 + 2 = 2 N: 0 V: 0 Z: 0 C: 0
0 + 3 = 3 N: 0 V: 0 Z: 0 C: 0
0 + 4 = 4 N: 0 V: 0 Z: 0 C: 0
0 + 5 = 5 N: 1 V: 0 Z: 0 C: 0
0 + 6 = 6 N: 1 V: 0 Z: 0 C: 0
0 + 7 = 7 N: 1 V: 0 Z: 0 C: 0
0 + 8 = 8 N: 1 V: 0 Z: 0 C: 0
0 + 9 = 9 N: 1 V: 0 Z: 0 C: 0
1 + 0 = 1 N: 0 V: 0 Z: 0 C: 0
1 + 1 = 2 N: 0 V: 0 Z: 0 C: 0
1 + 2 = 3 N: 0 V: 0 Z: 0 C: 0
1 + 3 = 4 N: 0 V: 0 Z: 0 C: 0
1 + 4 = 5 N: 1 V: 1 Z: 0 C: 0
1 + 5 = 6 N: 1 V: 0 Z: 0 C: 0
1 + 6 = 7 N: 1 V: 0 Z: 0 C: 0
1 + 7 = 8 N: 1 V: 0 Z: 0 C: 0
1 + 8 = 9 N: 1 V: 0 Z: 0 C: 0
1 + 9 = 0 N: 0 V: 0 Z: 1 C: 1
2 + 0 = 2 N: 0 V: 0 Z: 0 C: 0
2 + 1 = 3 N: 0 V: 0 Z: 0 C: 0
2 + 2 = 4 N: 0 V: 0 Z: 0 C: 0
2 + 3 = 5 N: 1 V: 1 Z: 0 C: 0
2 + 4 = 6 N: 1 V: 1 Z: 0 C: 0
2 + 5 = 7 N: 1 V: 0 Z: 0 C: 0
2 + 6 = 8 N: 1 V: 0 Z: 0 C: 0
2 + 7 = 9 N: 1 V: 0 Z: 0 C: 0
2 + 8 = 0 N: 0 V: 0 Z: 1 C: 1
2 + 9 = 1 N: 0 V: 0 Z: 0 C: 1
3 + 0 = 3 N: 0 V: 0 Z: 0 C: 0
3 + 1 = 4 N: 0 V: 0 Z: 0 C: 0
3 + 2 = 5 N: 1 V: 1 Z: 0 C: 0
3 + 3 = 6 N: 1 V: 1 Z: 0 C: 0
3 + 4 = 7 N: 1 V: 1 Z: 0 C: 0
3 + 5 = 8 N: 1 V: 0 Z: 0 C: 0
3 + 6 = 9 N: 1 V: 0 Z: 0 C: 0
3 + 7 = 0 N: 0 V: 0 Z: 1 C: 1
3 + 8 = 1 N: 0 V: 0 Z: 0 C: 1
3 + 9 = 2 N: 0 V: 0 Z: 0 C: 1
4 + 0 = 4 N: 0 V: 0 Z: 0 C: 0
4 + 1 = 5 N: 1 V: 1 Z: 0 C: 0
4 + 2 = 6 N: 1 V: 1 Z: 0 C: 0
4 + 3 = 7 N: 1 V: 1 Z: 0 C: 0
4 + 4 = 8 N: 1 V: 1 Z: 0 C: 0
4 + 5 = 9 N: 1 V: 0 Z: 0 C: 0
4 + 6 = 0 N: 0 V: 0 Z: 1 C: 1
4 + 7 = 1 N: 0 V: 0 Z: 0 C: 1
4 + 8 = 2 N: 0 V: 0 Z: 0 C: 1
4 + 9 = 3 N: 0 V: 0 Z: 0 C: 1
5 + 0 = 5 N: 1 V: 0 Z: 0 C: 0
5 + 1 = 6 N: 1 V: 0 Z: 0 C: 0
5 + 2 = 7 N: 1 V: 0 Z: 0 C: 0
5 + 3 = 8 N: 1 V: 0 Z: 0 C: 0
5 + 4 = 9 N: 1 V: 0 Z: 0 C: 0
5 + 5 = 0 N: 0 V: 1 Z: 1 C: 1
5 + 6 = 1 N: 0 V: 1 Z: 0 C: 1
5 + 7 = 2 N: 0 V: 1 Z: 0 C: 1
5 + 8 = 3 N: 0 V: 1 Z: 0 C: 1
5 + 9 = 4 N: 0 V: 1 Z: 0 C: 1
6 + 0 = 6 N: 1 V: 0 Z: 0 C: 0
6 + 1 = 7 N: 1 V: 0 Z: 0 C: 0
6 + 2 = 8 N: 1 V: 0 Z: 0 C: 0
6 + 3 = 9 N: 1 V: 0 Z: 0 C: 0
6 + 4 = 0 N: 0 V: 0 Z: 1 C: 1
6 + 5 = 1 N: 0 V: 1 Z: 0 C: 1
6 + 6 = 2 N: 0 V: 1 Z: 0 C: 1
6 + 7 = 3 N: 0 V: 1 Z: 0 C: 1
6 + 8 = 4 N: 0 V: 1 Z: 0 C: 1
6 + 9 = 5 N: 1 V: 0 Z: 0 C: 1
7 + 0 = 7 N: 1 V: 0 Z: 0 C: 0
7 + 1 = 8 N: 1 V: 0 Z: 0 C: 0
7 + 2 = 9 N: 1 V: 0 Z: 0 C: 0
7 + 3 = 0 N: 0 V: 0 Z: 1 C: 1
7 + 4 = 1 N: 0 V: 0 Z: 0 C: 1
7 + 5 = 2 N: 0 V: 1 Z: 0 C: 1
7 + 6 = 3 N: 0 V: 1 Z: 0 C: 1
7 + 7 = 4 N: 0 V: 1 Z: 0 C: 1
7 + 8 = 5 N: 1 V: 0 Z: 0 C: 1
7 + 9 = 6 N: 1 V: 0 Z: 0 C: 1
8 + 0 = 8 N: 1 V: 0 Z: 0 C: 0
8 + 1 = 9 N: 1 V: 0 Z: 0 C: 0
8 + 2 = 0 N: 0 V: 0 Z: 1 C: 1
8 + 3 = 1 N: 0 V: 0 Z: 0 C: 1
8 + 4 = 2 N: 0 V: 0 Z: 0 C: 1
8 + 5 = 3 N: 0 V: 1 Z: 0 C: 1
8 + 6 = 4 N: 0 V: 1 Z: 0 C: 1
8 + 7 = 5 N: 1 V: 0 Z: 0 C: 1
8 + 8 = 6 N: 1 V: 0 Z: 0 C: 1
8 + 9 = 7 N: 1 V: 0 Z: 0 C: 1
9 + 0 = 9 N: 1 V: 0 Z: 0 C: 0
9 + 1 = 0 N: 0 V: 0 Z: 1 C: 1
9 + 2 = 1 N: 0 V: 0 Z: 0 C: 1
9 + 3 = 2 N: 0 V: 0 Z: 0 C: 1
9 + 4 = 3 N: 0 V: 0 Z: 0 C: 1
9 + 5 = 4 N: 0 V: 1 Z: 0 C: 1
9 + 6 = 5 N: 1 V: 0 Z: 0 C: 1
9 + 7 = 6 N: 1 V: 0 Z: 0 C: 1
9 + 8 = 7 N: 1 V: 0 Z: 0 C: 1
9 + 9 = 8 N: 1 V: 0 Z: 0 C: 1