User Tools

Site Tools


base:signed_8bit_16bit_addition

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
base:signed_8bit_16bit_addition [2017-10-26 07:30] white_flamebase:signed_8bit_16bit_addition [2018-09-28 04:10] white_flame
Line 1: Line 1:
-To add a signed 8-bit delta to a 16-bit value, we need to sign-extend the delta to a full 16 bits.  We hold the high byte of the delta in .X and set it to $00 or $ff based on its sign:+To add a signed 8-bit delta to a 16-bit value, we need to sign-extend the delta to a full 16 bits.  The low byte can be added as normal, but the upper byte needs to be $00 or $ff based on the sign of the low byte.
  
-<code asm+Using only the accumulator: 
- ldx #$00  ; implied high byte of delta+<code 6502tasm
 + ; Standard low byte addition 
 + clc 
 + lda delta 
 + adc value 
 + sta value 
 + 
 + ; Sign extend the high byte 
 + lda delta 
 + and #$80    ; Extract the sign bit 
 + beq :+      ; If zero, add #$00 (+ carry) 
 +  lda #$ff   Else, add $ff (+ carry) 
 +:adc value+1 
 + sta value+1 
 +</code> 
 + 
 +The following version is 2 bytes shorter & 1 cycle faster, using .X: 
 + 
 +<code 6502tasm> 
 + ; Precalculate the sign-extended high byte in .X 
 + ldx #$00
  lda delta  lda delta
  bpl :+  bpl :+
-  dex      ; high byte becomes $ff to reflect negative delta +  dex        decrement high byte to $ff for a negative delta 
-:clc +
- adc value normal 16-bit addition+ 
 + Normal 16-bit addition 
 + clc 
 + adc value   ; .A still holds delta
  sta value  sta value
- txa+ txa         ; .X is the high byte
  adc value+1  adc value+1
  sta value+1  sta value+1
 </code> </code>
 +
  
  
 ---- ----
 White Flame White Flame
base/signed_8bit_16bit_addition.txt · Last modified: 2018-09-28 05:20 by white_flame