diff --git a/z80_unpacker/example/example.sna b/z80_unpacker/example/example.sna index 515f5d6..f9d8ac6 100644 Binary files a/z80_unpacker/example/example.sna and b/z80_unpacker/example/example.sna differ diff --git a/z80_unpacker/unpack.asm b/z80_unpacker/unpack.asm index 26e47b7..cb458e4 100644 --- a/z80_unpacker/unpack.asm +++ b/z80_unpacker/unpack.asm @@ -259,16 +259,16 @@ decode_bit: ; so 7*128 > 250 and thus edge case `ADD hl=(7*128+0),de=(-250)` => CF=1 .bit_is_0_2: ; *** adjust probs[context_index] - ld e,a ; preserve prob rra ; + (bit<<4) ; part of -prob_offset, needs another -16 and $FC ; clear/keep correct bits to get desired (prob>>4) + extras, CF=0 rra rra rra ; A = (bit<<4) + (prob>>4), CF=(prob & 8) adc a,-16 ; A = (bit<<4) - 16 + ((prob + 8)>>4) ; -prob_offset = (bit<<4) - 16 - sub e ; A = (bit<<4) - 16 + ((prob + 8)>>4) - prob ; = ((prob + 8)>>4) - prob_offset - prob - neg ; A = prob_offset + prob - ((prob + 8)>>4) + ld e,a pop bc + ld a,(bc) ; A = prob (cheaper + shorter to re-read again from memory) + sub e ; A = 16 - (bit<<4) + prob - ((prob + 8)>>4) ; = prob_offset + prob - ((prob + 8)>>4) ld (bc),a ; probs[context_index] = prob_offset + prob - ((prob + 8) >> 4); add a,d ; restore CF = bit (D = bit ? $FF : $00 && A > 0) pop de