Hoe test ik alleen de upper nibble op overflow?
Ik heb dit bijv. als data staan.

0xFD

subi	m16u1, -0x10			; -> inc upper nibble

Zo increment ik die upper nibble.

Nogmaals: vergeet nibbles. Bekijk het als bytes
Je hebt dus byte 0xFD en je telt er byte 0x10 bij op.
En dat is makkelijk te testen op overflow

ps: waarom ben je dit allemaal in assembler aan het implementeren. Is C geen optie? Ik denk dat met je huidige kennis van assembler je nogal gefrustreerd gaat worden als de bugs naar boven komen...

Op 25 oktober 2007 19:00:01 schreef MagicBox:
Ook gewoon de carry flag :)

Dus zoiets?

subi	m16u1, -0x10
brcc    noOvf

noOvf:

Nogmaals: vergeet nibbles. Bekijk het als bytes
Je hebt dus byte 0xFD en je telt er byte 0x10 bij op.
En dat is makkelijk te testen op overflow.

Dus 0xFD kan overflowen, hoeft niet persee 0xFF te gaan worden? Dus dan is toch de nibble van belang?
Had altijd met bytes gewerkt, nog amper met nibbles, dus kom je allerlei nieuwigheden tegen.

ps: waarom ben je dit allemaal in assembler aan het implementeren. Is C geen optie? Ik denk dat met je huidige kennis van assembler je nogal gefrustreerd gaat worden als de bugs naar boven komen...

Moet zo snel mogelijk gaan worden.

Op 25 oktober 2007 19:10:37 schreef RES:
Dus 0xFD kan overflowen, hoeft niet persee 0xFF te gaan worden? Dus dan is toch de nibble van belang?
Had altijd met bytes gewerkt, nog amper met nibbles, dus kom je allerlei nieuwigheden tegen.

Laat het me zo eens proberen uit te leggen: Als de hoogste nibble overflowed, overflowed de volledige byte! En om de volledige byte te checken op overflow is simpel.

PS: Je voorgestelde oplossing zal niet werken. Dit wel:


subi xx,-10
brcs noOvf

noOvf:

Omdat je subi 'misbruikt' om op te tellen, moet je het gedrag van de carry bit inverteren. Dat is even een mindswap maar de carry bit is gezet als er geen overflow is , en vice versa

Voor het upper-nibble het lower nibble als "don't care" beschouwen, dus gewoon als byte zoals tin al zei.

Voor het lower nibble ipv de carry flag, de H flag (half-carry) gebruiken. Hierbij het upper nibble als don't-care beschouwen.

Omdat je subi 'misbruikt' om op te tellen, moet je het gedrag van de carry bit inverteren. Dat is even een mindswap maar de carry bit is gezet als er geen overflow is , en vice versa

Ja klopt ik 'misbruik' subi omdat er geen addi is.
Dat wist ik niet van die carry. Ja het blijft de subi instructie.

Op 25 oktober 2007 19:10:37 schreef RES:
... waarom assembly? ...
Moet zo snel mogelijk gaan worden.

Dan moet je niet in assembler gaan programmeren.

Eerst in alemene lijnen in C programmeren wat het moet doen, dan uitzoeken WAT de bottleneck is, en DAT dan versnellen:
- Kijken of je onnodige dingen doet in de "te langzame" routine.
- dan kijken of je het handiger in C kan opschrijven zodat de compiler er snellere code van kan maken.

Als dat onvoldoende effect heeft, kan je overwegen om die routine in assemlby te schrijven.

Als je direct begint met assemlby, is de kans groot dat je uiteindelijk de boel langzamer maakt dan dat het in C kan, omdat je in C makkelijk betere datastructuren en algorithmes kan gebruiken dan dat je in de eerste instantie in assemlber kunt.

Verder loont het de moeite om eens te kijken wat gcc-avr van je code maakt. Leer je een hoop van.